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]
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)!
This can be typeset using the following command:
(But minted also works with
latex
andpdflatex
…)minted.sty
works similar totexments.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.
This is a package which converts source code to TeX and LaTeX with syntax highlighting. It is possible to add custom programming language definitions easily.
Highlight supports 100 programming languages and includes 50 colour themes. It features code reformatting and indenting.
I haven't used it to know how WELL it works, but someone else I know said it worked pretty well. If I get a chance to, I'll try it out myself and see.
TeX is (famously) Turing-complete, but I'm pretty sure you're going to have to write this extension yourself. The documentation makes it clear that the original author of
listings
orphaned it in 2004, and that it has not been updated since 2006. The package wasn't designed to override the formatting of numeric literals, but you might be able to modify it by changing the definition of\lst@ProcessDigit
. If that doesn't work, you'll have to understand in detail how the "identifier style" options work, and you'll have to duplicate that machinery for your numeric literals.I don't quite understand why you're so reluctant to introduce an external tool into your toolchain, but because you are, you'll have to do extra work. After a look at the source code, I expect that modifying
listings
should be possible, but I personally would choose to preprocess my LaTeX instead.