Source code highlighting in LaTeX

latex, pygments, syntax-highlighting

Solution

Taking Norman’s advice to heart, I’ve hacked together a solution that used (a patched) Pygments for highlighting and pushed in as many features as possible without bursting ;-)

I’ve also created a LateX package, once my Pygments patch was released in version 1.2 …

Presenting minted

minted is a package that uses Pygments to provide top-notch syntax highlighting in LaTeX. For example, it allows the following output.

Here’s a minimal file to reproduce the above code (notice that including Unicode characters might require XeTeX)!

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{minted}

\setsansfont{Calibri}
\setmonofont{Consolas}

\begin{document}
\renewcommand{\theFancyVerbLine}{
  \sffamily\textcolor[rgb]{0.5,0.5,0.5}{\scriptsize\arabic{FancyVerbLine}}}

\begin{minted}[mathescape,
               linenos,
               numbersep=5pt,
               gobble=2,
               frame=lines,
               framesep=2mm]{csharp}
  string title = "This is a Unicode π in the sky"
  /*
  Defined as $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\end{minted}
\end{document}

This can be typeset using the following command:

xelatex -shell-escape test.tex

(But minted also works with `latex` and `pdflatex` …)

`minted.sty` works similar to `texments.sty` but allows additional features.

How to get it

minted is listed on CTAN (package info)

documentation is of course included.

minted is now maintained by Geoffrey Poore. The development version, including the latest `.sty` file, is available at github.com/gpoore/minted, and can be cloned from there.

Once again, thanks to Norman for motivating me to produce this package.

Problem

I need to highlight source code in LaTeX. The package `listings` seems to be the best choice for most use-cases and for me it was, until now. However, now I need more flexibility. Generally, what I’m looking for is a real lexer. In particular, I need (for an own language definition) to define (and highlight!) own number styles. `listings` does not allow highlighting numbers in code. However, I need to produce something like this: `listings` also cannot cope with arbitrary delimiters for strings. Consider the following valid Ruby code: ``` s = %q!this is a string.! ``` Here, `!` can be replaced by almost any delimiter. (That `listings` cannot handle Unicode is also quite vexing, but that’s another issue.) Ideally, I am looking for an extension of `listings` that allows me to provide more complex lexing rules. But barring that, I am also searching for viable alternatives. Other threads have suggested using Pygments which can produce LaTeX output. There’s even a package – `texments` – to ease the transition. However, this sorely lacks features. In particular, I am interested in `listings`-style line numbering, source code line references, and the possibility of embedding LaTeX in source code (options `texcl` and `mathescape` in `listings`). As an example, here’s a source code typeset with `listings` which shows some of the things that a replacement should also provide: [“Sideways addition” modified from Bit Twiddling Hacks]

Original source

Related problems