Hochqualitatives Code Highlighting in Latex mit Pygments

on under asbach
2 minute read

Out Of Date Warning

This article was published on 04/09/2011, this means the content may be out of date or no longer relevant.
You should verify that the technical information in this article is still up to date before relying upon it for your own purposes.

Beim Erstellen meiner Diplomarbeit bin ich grad am Tüffteln, wie die Code-Beispiele schöner gemacht werden könnten. Die bekannten Listings sind relativ beschränkt und sehen auch nicht so umwerfend aus.

Abhilfe schafft das Python Tool “pygments”, dass ein Syntaxhighlighter darstellt. Unter Ubuntu lässt sich dieser leicht nachinstallieren:

Pygments

{% highlight sh }
sudo apt-get install python-pygments
bash shell
{
endhighlight %}

Nun generiert das Kommando:

{% highlight sh }
pygmentize -O full -f latex -l ruby DATEI.rb
{
endhighlight %}

aus der angegebenen Datei ein Codehighlighting für Ruby (pygments kann fast alles).

Initialisierung der Pygments Makros

Dabei gibt es den ganzen initialen Teil, den wir irgendwo in unserem Latex-Header, einmal einbinden müssen, am besten in einer eigenen Quelltextdatei, z.B. “syntax.tex”:

{% highlight latex }
\usepackage{fancyvrb}
\usepackage{color}
\makeatletter
\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax

\let\PY@ul=\relax \let\PY@tc=\relax%
\let\PY@bc=\relax \let\PY@ff=\relax}
… usw. die ganzen Defs aus dem Pygments Output
{% endhighlight %}

Die Datei dann noch im Header unseres Master-Tex Dokuments einbinden:

{% highlight latex }
\include{syntax}
{
endhighlight %}

Der Teil im “\begin{Verbatim}” ist der eigentliche Code, den wir an die entsprechende Stelle in unserem Textfluss kopieren können.

Finetuning: Zeilennummern, Rahmen, Caption und Eintrag in LoL (List of Listings)

Allerdings lässt sich dieser noch tunen, da er z.B. noch keine Labels hat, und auch keine Einträge im Listings Verzeichnis hinterlässt.

Dies habe ich so gelöst:

{% highlight latex %}
\DefineVerbatimEnvironment{pygments}{Verbatim}{numbers=left,frame=single,stepnumber=1,numbersep=1pt,
commandchars=\\\{\}}

\newenvironment{codeenv}{
\begin{minipage}{\textwidth}
\captionsetup{type=lstlisting}
}{\end{minipage}}
{% endhighlight %}
Nun können wir Codeteile mit Captions und Labels machen:

{% highlight latex }
\begin{codeenv}
\begin{pygments}[label={lib/src/datei\_test.rb}]
\PY{n+nb}{require} \PY{l+s+s1}{’test\PYZus{}helper’}
( hier dann der ganze Kladderadatsch vom Pygements…. )
\end{pygments}
\caption{Listing Test}
\end{codeenv}
{
endhighlight %}

Ich hoffe das erspart dem einen oder anderen ein paar Stunden suchen und probieren :)