I am using Pandoc to export from Markdown to Markdown to convert inline links to reference links. In this process Pandoc additionally adds many \ backslash characters before special characters.
Is there a way I could prevent this additional behaviour of new \?
Example: The price is $100. becomes The price is \$100. after running Pandoc once, and it keeeps on adding \, next time it becomes The price is \\$100. and then The price is \\\$100.
Command Used:
PandocExtension="-f markdown-auto_identifiers-all_symbols_escapable -t markdown-all_symbols_escapable-auto_identifiers+table_captions-multiline_tables-simple_tables-grid_tables+pipe_tables-fenced_code_blocks-fenced_code_attributes+backtick_code_blocks"
PandocOption="-s --wrap=none --columns 10000 --atx-headers --reference-links --tab-stop 2"
pandoc ${PandocOption} ${PandocExtension} "${Source}" -o "${Output}"
Related
Here's how I do my citations in latex
\documentclass[11pt]{article}
\usepackage[
backend=biber, style=apa,
giveninits=true, uniquename=init,
citestyle=authoryear]{biblatex}
\bibliography{references.bib}
\begin{document}
... catastrophic population declines (\cite{McIntyre__2015}).
\end{document}
I'm using pandoc to convert this to docx or odt so I can get track changes from colleagues.
pandoc ./main.tex -f latex -t odt --bibliography=./references.bib --csl ../apa.csl -o output.odt
However... in the resulting document, pandoc automatically surrounds every \cite call with an extra set of parenthesis.
...catastrophic population declines ((McIntyre et al. 2015)).
I really like doing parentheses manually... is there a way for me to get pandoc to stop adding these extra citation parentheses?
I have the impression that this can be done with lua filters in pandoc... I was hoping someone could give me some pointers in the right direction on how to address this.
A Lua filter could be used to change the citation mode such that the parens are omitted:
function Cite(cite)
for _, c in ipairs(cite.citations) do
c.mode = pandoc.AuthorInText
end
return cite
end
Make sure that the filter runs before citeproc, i.e., it must occur first in the call to pandoc:
pandoc --lua-filter=modify-citations.lua --citeproc ...
The alternative would be to change \cite into \citet.
The answer from tarleb didn't solve the question, but it did lead me to the right documentation.
I now understand that pandoc relies on CSL for the actual formatting of citations, while lua filters can modify what kind of citation is used (author in text, vs author in parenthesis).
<citation et-al-min="3" et-al-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" collapse="year" givenname-disambiguation-rule="primary-name-with-initials">
<layout prefix="" suffix="" delimiter="; ">
</layout>
</citation>
In my CSL doc, I just removed the parentheses from the prefix and suffix attributes of the <citation> <layout> node.
Now only my manually placed parentheses appear in the compiled doc.
...catastrophic population declines (McIntyre et al., 2015).
I am using pandoc to generate a beamer slideshow. I activated the generation of a TOC and specified a TOC headline. But there is an extra number added to this title as if the TOC would span several slides, but it does not.
My source file
---
toc: true
toc-title: the overview
...
# my section
and I compile with pandoc -t beamer -o x.pdf < x.md. The title of the TOC has this extra roman I which beamer normally adds if a slide is split into two (or more).
How can I get rid of this number?
Edit
In the end I put it in the yaml preamble of the pandoc file as raw latex code:
header-includes: |
```{=latex}
\setbeamertemplate{frametitle continuation}[from second]
% more stuff
```
You can disable the continuation count for frames that consist only of a single one by using this command:
\setbeamertemplate{frametitle continuation}[from second]
In the response from #samcarter_is_at_topanswers.xyz, I had to delimit the command with backticks and indicate as latex code:
`\setbeamertemplate{frametitle continuation}[from second]`{=latex}
I would like to have code and an image side-by-side in a Beamer slide.
In LaTeX I would do this with columns. I would like to use markdown within the column structure.
\begin{columns}
\column{.5\textwidth}
~~~~~~~~Python
>>> some python code
~~~~~~~
\column{.5\textwidth}
![](A_generated_image.pdf)
\end{columns}
Unfortunately Pandoc doesn't process the markdown within the \begin{columns} and \end{columns} statements. Is there a way around this?
Is there a way to use markdown within inlined LaTeX?
Is there a pure markdown solution?
Current versions of pandoc (i.e., pandoc 2.0 and later) supports fenced divs. Specially named divs are transformed into columns when targeting a slides format:
# This slide has columns
::: columns
:::: column
left
::::
:::: column
right
::::
:::
Pandoc translates this into the following LaTeX beamer code:
\begin{frame}{This slide has columns}
\protect\hypertarget{this-slide-has-columns}{}
\begin{columns}[T]
\begin{column}{0.48\textwidth}
left
\end{column}
\begin{column}{0.48\textwidth}
right
\end{column}
\end{columns}
\end{frame}
This is simple and has the additional advantage of giving similar results when targeting other presentational formats like reveal.js.
More than two columns work out of the box for Beamer output. Powerpoint, however, only supports two columns. For reveal.js, the widths of three or more columns must be given explicitly:
::: columns
:::: {.column width=30%}
left
::::
:::: {.column width=30%}
middle
::::
:::: {.column width=30%}
right
::::
:::
The problem is that pandoc ignores markdown if it finds a \begin{}. An alternative is to edit the beamer template and add the following:
\newcommand{\columnsbegin}{\begin{columns}}
\newcommand{\columnsend}{\end{columns}}
And write it like this:
\columnsbegin
\column{.5\textwidth}
~~~~~~~~Python
>>> some python code
~~~~~~~
\column{.5\textwidth}
![](A_generated_image.pdf)
\columnsend
I hope still valuable. I made a Pandoc filter in Python to put columns easily, so you can write your presentations in this way:
# Hello World
[columns]
[column=0.5]
~~~python
if __name__ == "__main__":
print "Hello World"
~~~
[column=0.5]
This is how a "Hello World" looks like in Python
[/columns]
that the filter will convert each markup to \begin{columns} and \column{.5\textwidth}, so, the document above will turn in
\begin{frame}[fragile]{Hello}
\begin{columns}
\column{0.5\textwidth}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{some python code}
\end{Highlighting}
\end{Shaded}
\column{0.5\textwidth}
Hello World
\end{columns}
\end{frame}
The code filter is here
import pandocfilters as pf
def latex(s):
return pf.RawBlock('latex', s)
def mk_columns(k, v, f, m):
if k == "Para":
value = pf.stringify(v)
if value.startswith('[') and value.endswith(']'):
content = value[1:-1]
if content == "columns":
return latex(r'\begin{columns}')
elif content == "/columns":
return latex(r'\end{columns}')
elif content.startswith("column="):
return latex(r'\column{%s\textwidth}' % content[7:])
if __name__ == "__main__":
pf.toJSONFilter(mk_columns)
If you never use a pandoc filter, just save the filter to the same document location as columnfilter.py (or other name you want) and run
pandoc -t beamer --filter columnfilter.py yourDocument.mkd
And enjoy!
Beamer Specific Answer. I ran across a solution when attempting to add multiple columns for Pandoc in a regular document. It works here as well, though it does constrain you to Beamer; though that is your use case.
In the slide deck, insert once:
---
header-includes:
- \newcommand{\hideFromPandoc}[1]{#1}
- \hideFromPandoc{
\let\Begin\begin
\let\End\end
}
---
Then add content thus:
\Begin{columns}
\Begin{column}{0.3\textwidth}
Res ipsum loquiter, sed in inferno decit?
\End{column}
\Begin{column}{0.3\textwidth}
Res ipsum loquiter, sed in inferno decit?
\End{column}
\Begin{column}{0.3\textwidth}
Res ipsum loquiter, sed in inferno decit?
\End{column}
\End{columns}
Creating the "hideFromPandoc" command lets you insert begin/end statements throughout without depriving you of markdown in the block.
Fenced Div Answer. There's an answer above that refers to fenced divs. I commented that the answer only works with two columns. It breaks down with more. Here is how that answer works with multiple divs:
::: {.columns}
:::: {.column width=0.3}
Test
::::
:::: {.column width=0.3}
Test
::::
:::: {.column width=0.3}
Test
::::
:::
To get this answer, I had to look at the commit that added the column feature specifically.
You could use FletcherPenney MultiMarkdown which can process markdown to LaTeX/Beamer. Compared to Pandoc, MultiMarkdown has not so many features. However, especially when working with LaTeX it has the advantage that you can embed LaTeX code directly into the Markdown in HTML comments.
Your code would look like this:
<!-- \begin{columns} -->
<!-- \column{.5\textwidth} -->
>>> some python code
<!-- \column{.5\textwidth} -->
![](A_generated_image.pdf)
<!-- \end{columns} -->
For me this solution works fine. With a good editor (e.g. Scrivener, Sublime Text) you can write the latex code without all the comments and find/replace them after editing. In addition, the Metadata support in Multimarkdown is much more flexible, so that it is easier to customize presentations.
In the meantime, I hope that the Pandoc team provides a solution to this problem. I think there are some users who would like to embed small LaTex code particles throughout their markdown documents without having them converted/escaped.
You can use MultiMarkDown comments ( "<!-- Your LaTeX Code inside -->" ) with Pandoc when you enclose the Pandoc command in which you transform your markdown to LaTeX with two sed commands.
In the first sed run, you change the MultiMarkDown comments to "\verb+AAAAAAALaTeX-StuffZZZZZZ+". Then you transform to LaTeX with Pandoc as usual, everything inside "\verb+AAAAAAALaTeX-StuffZZZZZZZ+" is left alone. Then you run sed on the TeX-File and delete the "\verb+AAAAAAA" and "ZZZZZZ+" unfolding your LaTeX code.
The first sed command line before the Pandoc transformation could look like this:
sed -E -e "s/<\\!--(.+)--\\>/\\\\verb\+AAAAAAA\1ZZZZZZZ\+/g " \
source.md > source.i.md
Then use Pandoc on source.i.md as usual to create source.tex. Second sed run like this:
sed -E -e "s/\\\\verb\+AAAAAAA(.+)ZZZZZZZ\+/\1/g" -i "" source.tex
I automated everything in a Makefile so that I can make more changes e.g. to table definitions in one step. On first glance this approach works fine (tested it on column definitions with the beamer class).
With this little sed scripts, you can use all the nice things from Pandoc. You need only to mmd-comment those TeX and LaTeX commands which become either escaped or enclose larger parts of your Markdown.
I want to use latex-style citations \cite{key} in my markdown so that I can create tex and pdf documents nicely using pandoc. However, when I cite something, it shows the keyword in brackets instead of the citation style, such as author name or citation number. In other words, I want it to show up in the PDF as "This is my citation [1]" but instead it is appearing as "This is my citation [mykey]". Also, my references list isn't showing up after I add my # References header. What is going on here?
Below is my sample command for producing this along with the sample files and my current incorrect output file (test.pdf).
pandoc test.md --biblatex --biblio test.bib --csl chicago-author-date.csl -o test.pdf
test.md
% My test pandoc-ument
I want to reference this: \cite{Gepasi1993}
# References
test.bib
#ARTICLE{Gepasi1993,
Author = {P. Mendes},
Journal = {Comput. Applic. Biosci.},
Pages = {563--571},
Title = {GEPASI: A software package for modelling the dynamics, steady states and control of biochemical and other systems.},
Volume = {9},
Year = {1993}
}
test.pdf
I want to reference this: [Gepasi1993]
The --biblatex option is not for writing biblatex directly in markdown.
What it does is convert native pandoc markdown citations, like
[#Gepasil1993, p. 5]
to biblatex citations in LaTeX output.
If you use pandoc markdown citations instead of the LaTeX ones, you'll
find that the citations work. Use this command:
pandoc test.md --biblio test.bib --csl chicago-author-date.csl -o test.pdf
with this input:
I want to reference this: [#Gepasi1993]
Pandoc's citation format is documented in the Pandoc User's Guide.
If you really want to use raw biblatex citations in your markdown input,
you can, but then you need to take care of the bibliography stuff
yourself. You'd do it this way:
pandoc test.md --parse-raw -t latex -s > test.tex
pdflatex test
biber test
pdflatex test
pdfltatex test
I want to prepare a text for the use in a LaTeX document.
I wrote a SQL Function which does a lot of REPLACE. For example _ -> \_ and so on.
But there are so many special chars and sometimes I get errors. Does anyone know a SQL-function or a Java package for escaping text to LaTeX?
There are only 10 special chars: \ { } _ ^ # & $ % ~.
Use a verbatim environment or the listings package, then you can enter source code without escaping.