Skip to content

Instantly share code, notes, and snippets.

@jepio
Last active September 18, 2023 13:58
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save jepio/3ecaa6bba2a53ff74f2e to your computer and use it in GitHub Desktop.
Save jepio/3ecaa6bba2a53ff74f2e to your computer and use it in GitHub Desktop.
Pandoc filter to use minted for syntax highlighting
#!/usr/bin/env python3
'''
Filter to wrap Pandoc's CodeBlocks into minted blocks when using latex.
Pandoc's `fence_code_attributes` can be used to provide:
- the language (first class)
- minted's argumentless options (following classes)
- minted's options with arguments (attributes)
'''
from pandocfilters import toJSONFilter, RawBlock
TEMPLATE = r'''
\begin{{minted}}[{options}]{{{lang}}}
{cont}
\end{{minted}}
'''.strip()
def latex(x):
return RawBlock('latex', x)
def join_options(opts):
return ',\n'.join(opts)
def process_atts(kws):
'''Preprocess the attributes provided by pandoc - they come as a list of
2-lists, convert to a list of strings'''
return ['%s=%s' % (l, r) for l, r in kws]
def mintedify(key, value, format_, meta):
if key == 'CodeBlock':
(ident, classes, attributes), contents = value
if format_ == 'latex' and classes:
language, *pos = classes
atts = process_atts(attributes)
return [latex(TEMPLATE.format(lang=language,
options=join_options(pos+atts),
cont=contents))]
if __name__ == '__main__':
toJSONFilter(mintedify)
@jepio
Copy link
Author

jepio commented Oct 7, 2015

@FilterKaapi found it! You have to set the executable bit on the script, otherwise it's run using the default python.

chmod +x minted.py

@iphilgood
Copy link

Hi @jepio

I'm currently trying to use your script in my thesis. I've installed Python v3. I've also installed pandocfilters via pip.

pandoc --no-highlight --filter ./minted.py "$(INPUTDIR)"/*.md \
  -o "$(OUTPUTDIR)/thesis.pdf" \
  -H "$(STYLEDIR)/preamble.tex" \
  --template="$(STYLEDIR)/template.tex" \
  --bibliography="$(BIBFILE)" 2>pandoc.log \
  --csl="$(STYLEDIR)/ref_format.csl" \
  -V fontsize=12pt \
  -V papersize=a4paper \
  -V documentclass:report \
  -N \
  --latex-engine-opt='-shell-escape' \
  --latex-engine=xelatex \
  --verbose

I'm always getting the following error:

! Package minted Error: Missing Pygments output; \inputminted was
probably given a file that does not exist--otherwise, you may need
the outputdir package option, or may be using an incompatible build tool,
or may be using frozencache with a missing file.

In addition to the error message above I have the following in my log file of pandoc:

Error: cannot read infile: [Errno 2] No such file or directory: 'input.pyg'
system returned with code 256

Do you have any idea why this is happening?

Thanks for your help
Phil

@stephenjbarr
Copy link

Having the same issue as @iphilgood. Any ideas?

@cheshirekow
Copy link

cheshirekow commented Mar 14, 2019

I had to change:

        if format_ == 'latex' and classes:
            language, *pos = classes

to

    if format_ == 'latex' and classes:
      _, language, *pos = classes

with pandocfilters==1.4.2. The first element appears to be the string "sourceCode".

@Naereen
Copy link

Naereen commented Apr 1, 2023

This simple filter works perfectly fine for me, thanks a lot @jepio!

@jepio
Copy link
Author

jepio commented Apr 1, 2023

Glad to hear that. I last used this in 2016 for my master thesis.

@alexfanqi
Copy link

alexfanqi commented Jul 26, 2023

To handle beamer output(I thought beamer is latex. 🤔 ), use

format_ in ['latex', 'beamer']

And add {.fragile} following section title

# section 1 {.fragile}

I wonder if there is way to automatically add it

@alexfanqi
Copy link

alexfanqi commented Jul 26, 2023

@iphilgood I figured out it is mint weirdness. If your output directory (contains .aux files) is not the same as where tex src is, you need to explicitly tell minted by,

\usepackage[outputdir=OUTDIR]{minted}

Now, I need to figure out how to pass the outdir from Makefile.

@alexfanqi
Copy link

I wonder if there is way to automatically add it

I made a hacked filter for doing this here https://github.com/alexfanqi/pandoc_beamer_solarized/blob/master/fragile.py

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment