Set the language of a listings environment in pandoc - latex

I am struggling to convince pandoc to set the language for a listing automatically when converting from extended markdown (pandoc) to latex with the --listings argument. This is the file foo.txt:
A listing follows.
~~~{.prolog}
% fooing around
foo :-
format("bar~n").
~~~~
When I use pandoc -s foo.txt -o foo.html, the code is highlighted.
When I use pandoc -s foo.txt -o foo.latex, the code is highlighted, using the custom commands inserted by pandoc in the LaTeX preamble.
When I use pandoc -s foo.txt --listings foo.latex, the code is not highlighted, as the language option to the listings environment is not set. I can work around this:
~~~{.prolog language=Prolog}
but this defeats the purpose. Am I missing something or is this functionality not supported? If it omitted on purpose, what is the reason?

Related

How can I strip figures and table during a pandoc LaTeX to Word conversion?

I am trying to use pandoc to convert a thesis from latex to docx. In general, this works well with the following command:
pandoc input.tex -f latex -t docx -s -o output.docx --bibliography references.bib --csl=mystyle.csl
However, I have an additional requirement that I am unable to fulfill. I want the output to be stripped from any figures and tables that are included in the source files. Reading the pandoc documentation and related stackoverflow question has not helped me so far.
Do you have suggestions on what could do the trick?
This is a poster use-case for pandoc filters. The following Lua filter will delete all tables and images:
function Image () return {} end
function Table () return {} end
Save it to a file, say remove-tables-images.lua, and pass the file to pandoc via the --lua-filter parameter:
pandoc input.tex -s -o output.docx \
--bibliography references.bib --csl=mystyle.csl \
--lua-filter remove-tables-images.lua

enable shell escape with pandoc

I'm trying to use the latex graphvis package in a pandoc markdown document. However it seems to require the -shell-escape flag be passed to latex. How can I enable -shell-escape on pandoc?
\digraph[scale=0.5]{MyGraph}{
Business -- Job;
Job -- Task;
Job -- User;
Job -- PayRate;
Task -- WorkSession;
User -- WorkSession;
PayRate -- WorkSession;
}
http://mark.aufflick.com/blog/2007/03/25/embedding-graphviz-in-latex-documents
pandoc can now pass arguments directly to the LaTeX engine via the --latex-engine-opt flag. As an example, in order to pass the -shell-escape flag to xelatex you could do:
pandoc myfile.md -s -o myfile.pdf --latex-engine=xelatex --latex-engine-opt=-shell-escape
You can tell pandoc to generate LaTeX, and then do whatever you want on the output.
pandoc -o mydocument.tex mydocument.md
pdflatex -shell-escape mydocument.tex
Pandoc has a --latex-engine option to tell it to run LaTeX differently, but this can only be a path to a program called pdflatex, lualatex or xelatex. If for some reason you want to be able to generate PDF from Markdown by calling pandoc directly, you can use a wrapper script.
pandoc --latex-engine=/path/to/pdflatex -o mydocument.pdf mydocument.md
where /path/to/pdflatex is executable and contains (assuming a Unix-like system)
#!/bin/sh
exec pdflatex -shell-escape "$#"

How to set the font size for code blocks in pandoc markdown?

this small example:
An example code snippet:
~~~{.cpp}
class A
{
public:
static void f1 () {};
virtual void f2 () = override;
};
~~~
can be used to generate a PDF output with:
pandoc -o block-code.pdf block-code.txt
resulting in
The font sizes of both the code and the text that are equal. How can I change the font size of the code snippets for the pdf (LaTex) pandoc output?
You can simply add \small before the beginning of the code snippet and \normalsize after (to return to normal).
You can also add other similar commands. For instance, if your document is doublespaced, you can add \singlespace before the code snippet and \doublespacing after.
For this to work you need to add in the yaml at the beginning of your document the following:
---
header-includes:
- \usepackage{setspace}
---
I solved this problem for me by writing several LaTeX snippets into extra files I keep around:
cat make-code-footnotesize.tex
\renewenvironment{Shaded} {\begin{snugshade}\footnotesize} {\end{snugshade}}
I have such snippets for all different sizes: huge, LARGE, Large, large, normalsize, small, footnotesize, scriptsize, tiny.
To apply them when running pandoc, just include the respective LaTeX snippet with the -H parameter:
pandoc -o block-code.pdf block-code.txt \
-H make-code-scriptsize.tex --highlight-style=espresso
Result:
Note, this controls the font sizes for all code blocks in the PDF. It does not allow you to vary sizes from block to block. Of course, it also doesn't work for HTML, ODT, EPUB or other output -- only for LaTeX and PDF output.
I've developed a filter for pandoc https://github.com/chdemko/pandoc-latex-fontsize for this purpose:
Install this filter with pip:
$ pip install pandoc-latex-fontsize
add for example
---
pandoc-latex-fontsize:
- classes: [c, listing]
size: footnotesize
---
to your metadata block and specify the listings you want to be of size footnotesize:
~~~{.c .listing}
int main(void) {
return 0;
}
~~~
then run pandoc with
$ pandoc --filter pandoc-latex-fontsize ...
On pandoc 1.16.0.2 I did get the same problem but wasn't solved by previous answers.
When using default code highlighting of this version and exporting it with beamer (-t beamer) I got following generated output (for outputting a jmeter command):
\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{./jmeter.sh} \NormalTok{-q prod.properties -p jmeter.properties -n -t mytest.jmx -l mylog.log}
\end{Highlighting}
\end{Shaded}
By searching directly in the pandoc code with grep -r "Highlighting" * I found following code:
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
And I replaced it with the following to have a tiny font size in my custom pandoc template (see pandoc -D beamer):
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\},fontsize=\tiny}
Now I have a tinier font size by running the following command:
pandoc -t beamer input.md -o output.pdf --template beamer.template
I use pandoc with the --listings option and a custom eisvogel.latex template.
Download the original eisvogel-template to a new file eisvogel_custom.latex
Open the file, find the line basicstyle = \color{listing-text-color}\small\ttfamily{}\linespread{1.15},
Change the \small to \footnotesize, or \tiny
Save the file
Now run pandoc with the following options:
pandoc --pdf-engine=xelatex --template=eisvogel_custom --listings -o block-code.pdf block-code.txt
To disable the line-numbering, add the following lines at the top of block-code.txt
---
listings-disable-line-numbers: true
...
All options can be found here: https://github.com/Wandmalfarbe/pandoc-latex-template#custom-template-variables
Tested with pandoc 2.6 using docker-image dalibo/pandocker:stable

How do I exclude certain latex tags in OpenDetex?

I am trying to spellcheck a LaTeX document (using Word), and use OpenDetex to convert it to plain text. The command line with default parameters:
$ detex foo.tex > foo.txt
Problem: some garbage, especially bibliography ids from \citep{} and \citet{} commands stay in the text.
How can I exclude these specific tags?
The -c option only excludes \cite, but not \citep and \citet.
I tried using the -e option like:
$ detex -e citep foo.tex > foo.txt
to no avail.
The documentation is a bit vague on that:
detex [-e environment-list] [-c] [-l] [-n] [-s] [-t] [-w] [file[.tex] ]
...
-e <env-list> list of LaTeX environments to ignore\n
...
Any ideas how to make it work?
\citep and \citet are not LaTeX environments, they are commands, and as such the -e flag of detex has no effect on it. The flag -e is only for environments.
The new version of detex 2.8.2 that you can obtain here.
as long as the commands (\citep and \citet) do not start at the first character in a line -- that is a bug and will be fixed.

Markdown to PDF using Pandoc since Xetex Deprecation

On my MacBook (OSX Mountain Lion), I used to use this Pandoc command to convert Markdown to PDF:
$ markdown2pdf -N -o pandoc_output.pdf --xetex --toc --template=mytemplate.tex myfile.md
But markdown2pdf no longer works, and --xetex option in markdown2pdf -N -o ../../Desktop/pandoc_output.pdf --xetex --toc --template=mytemplate-headers-garamond_date.tex is deprecated.
If I do this:
$ pandoc -N -o Desktop/pandoc_output.pdf --xetex --toc --template=mytemplate.tex myfile.md
I get this:
pandoc: unrecognized option `--xetex'
But if I take out --xetex and do this:
$ pandoc -N -o Desktop/pandoc_output.pdf --toc --template=mytemplate.tex myfile.md
then I get this:
pandoc: Error producing PDF from TeX source.
! Package hyperref Error: Wrong driver option `xetex',
(hyperref) because XeTeX is not detected.
See the hyperref package documentation for explanation.
Type H <return> for immediate help.
...
l.3925 \ProcessKeyvalOptions{Hyp}
What's the solution?
Try --latex-engine=xelatex instead of --xetex
The prior answers to this question were helpful to me, as I had installed pandoc a couple years ago, but never Tex Live. Consequently I had no idea if I had installed it correctly, so putting in the entire path helped me to see that it was working, as follows:
pandoc --latex-engine=/usr/local/texlive/2012basic/bin/universal-darwin/xelatex
This is the default install location for the BasicTex setup which you download from the Pandoc install page.
I had also forgotten about using pandoc -D Latex >my-latex-template.tex to generate a template. After giving a .tex template instead of my .html one (which caused a 'you don't have BEGIN {' error) , I got .PDF: In other words, the default template worked.
Also, I had inaccurately entered -t pdf (not shown above) to set pdf as an output format, but this was not correct. The output format is Latex, which is then translated to PDF. It is not necessary to specify an output format with the dash -t option.
I hope this record of my minor stumbles saves someone some time.
See the pandoc User's Guide (or man page) for the --latex-engine option.

Resources