views:

2525

answers:

5

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:

Required result

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:

LaTeX listings example: Sideways addition [“Sideways addition” modified from Bit Twiddling Hacks]

A: 

Do you have to use LaTeX? I migrated from it to Emacs org-mode a while ago and find the inline code editing capability much more convenient than listings (although I wasn't really a power user of the latter). Also, I'm not sure if the line numbers and other facilities you mentioned are readily available but actual highlighting is as flexible as a general mode in Emacs.

Noufal Ibrahim
What’s an alternative to LaTeX? I need a DTP. At the moment I’m using Apple’s Pages but this is burdensome (e.g. I’m doing the syntax highlighting by hand, not to mention applying all the other styles in the text) and doesn’t work well with source control. All in all, I don’t think that WYSIWYG can compete with LaTeX in any way, and I definitely need a DTP system – in particular, HTML or RTF isn’t enough.
Konrad Rudolph
If you need a non WYSIWYG DTP app., I think LaTeX is pretty much the only way to go. There are other lightweight markups that can export to PDF but their customisability is limited compared to LaTeX. If WYSIWYG is also okay, you can check out scribus(http://www.scribus.net/)
Noufal Ibrahim
+1  A: 

http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=highlight

This is a program 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.

homerj
`highlight` shares all the problems of Pygments, though. In particular, it is *not a LaTeX package*, despite what its description says. It is simply a stand-alone program. The problem, just as with Pygments, is how to use it meaningfully from within LaTeX and provide all the nice things that `listings` has.
Konrad Rudolph
+3  A: 

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.

Norman Ramsey
I’m not at all reluctant to introduce external tools – in fact, I think that using Pygments is probably the best solution. The question is *how* to do this in a smart way so that I can still have escapes to LaTeX and `\label`s inside the code.
Konrad Rudolph
As for changing `listings`, I have already had a look at its source – and unfortunately, I don’t understand it at all. My TeX skills are nowhere near that level. Until now, I’ve only ever used the LaTeX subset of TeX anyway.
Konrad Rudolph
+32  A: 

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.

fancy LaTeX example

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

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

Konrad Rudolph
After hours of searching on how to use pygments with LaTeX, and more hours of trying to hack together my own solution, this is the best I've found. Better yet, it actually works. Thanks for this.
sykora
here just to appreciate the work you've done in a becoming manner ;)!
kRON
It took me ages to get everything set up, but it was worth it in the end. Installing it via MiKTeX didn't work (seamlessly) for me; I had to install several packages separately. Also Python's `easy_install` didn't grab a working Pygments EGG, so I downloaded it separately and installed it via `easy_install.exe pygments*.egg`. Finally, don't forget to run `latex` or `pdflatex` with the `--shell-escape` switch... and cross your fingers!
Paul Lammertsma
@Paul: It’s true that the whole thing is quite messy on Windows. :-( Hopefully, the next version of Pygments will alleviate this somewhat, but for people who don’t often work with Python (and hence `easy_install`) the process will never be very smooth.
Konrad Rudolph
A: 

I am just trying minted to find out if it can help me.

Is it possible to format a piece of source code inline? Much like \verb and \lstinline. The code is used in the middle of a paragraph, for instance, in the running line. Without emitting a new line.

Romildo