Syntax-Highlighting mit Pygments

Einleiten möchte ich diesen Blogpost mit einem Zitat (Übernommen vom Ubuntuusers Wiki):

Pygments ist ein leistungsfähiges, in Python geschriebenes Programm zur Syntax-Hervorhebung. Das heißt, man übergibt Pygments eine Datei (z.B. den Quellcode eine Programms) und erhält als Ergebnis eine Datei, in der die Syntax-Element farbig hervorgehoben sind, was in der Regel die Lesbarkeit erhöht.

Anstelle von Pygments liest man häufig auch Pygmentize. Das rührt daher, dass das Programm zwar Pygments heißt, aber der Befehl der Kommandozeile ist [cce lang=”bash” inline=”true”]pygmentize[/cce]. Somit werden diese Begriffe Synonym verwendet.

Pygments ist sehr mächtig und kann unter anderem für die Generierung von html-Dateien herangezogen werden. Ich möchte mich aber nachstehen allein auf LaTeX beziehen.

Wie bereits erwähnt ist Pygments ein externes Programm und kann somit aus LaTeX heraus nur dann aufgerufen werden, wenn die Sicherheitseinstellungen des Kompiliervorganges das Erlauben. Normalerweise wird dies erreicht, in dem die Option [cce lang=”bash” inline=”true”]–shell-escape[/cce] aktiviert wird.

Um Pygments in LaTeX Dokumenten zu nutzen, gibt es m.E. drei wesentliche Pakete, die dies leisten.

  1. minted von Konrad Rudolph, jetzt Geoffrey Poore
  2. verbments von De­jan Zivković
  3. pythontex von Geoffrey Poore

Die beiden erst genannten Pakete sind wirklich rein als Interface LaTeX-Pygments zu verstehen. Die Unterschiede zwischen diesen Paketen hat Geoffrey Poore in einer Antwort auf TeX.SX zusammengefasst: minted vs. texments vs. verbments. Das Paket pythontex verfolgt das Hauptziel, Pythonkode direkt in LaTeX zu nutzen. Geoffrey Poore hat hierzu einen Vortrag gehalten, der u.a. auf Youtube verfügbar ist: PythonTeX: Fast Access to Python from within LaTeX

Das Programm Pygments gibt basierend auf hinterlegten Regeln, genannt Lexer, eine Datei aus. Der LaTeX-Lexer hat zur Ausgabe in der Datei die Umgebung [cce lang=”latex” inline=”true”]Verbatim[/cce] hinterlegt. Der erfahrene Nutzer wird erkennen, dass auf LaTeX-Seite diese Umgebung durch das Paket fancyvrb bereitgestellt wird. Das führt auch direkt zu einer wichtigen Erkenntnis. Alle genannten Pakete nutzen intern fancyvrb. Basierend darauf ist auch für eventuelle Formatierungen die Dokumentation von fancyvrb heranzuziehen.

Ich denke, dass wir die ersten Grundladen gelegt haben und können nun auf die Nutzung eingehen. Zur Veranschaulichung nutze ich minted, obwohl auch jedes andere Paket genutzt werden kann.
[cce lang=”latex”]
% !TEX program = pdflatex –shell-escape
\documentclass{article}
\usepackage{minted}
\usemintedstyle{autumn}
\begin{document}
\begin{minted}{xml}
<?xml version=”1.0″ encoding=”UTF-8″?>
<text>
<para>hello world</para>
</text>
\end{minted}
\end{document}
[/cce]
Dieses Beispiel führt zur Ausgabe:
minted

Vielleicht noch ein Blick hinter die Kullisen. Die von Pygments erstellte Datei, welche dann wieder von LaTeX eingelesen wird, sieht wie folgt aus:
[cce lang=”latex”]
\begin{Verbatim}[commandchars=\\\{\}, ]
\PY{c+cp}{\PYZlt{}?xml version=\PYZdq{}1.0\PYZdq{} encoding=\PYZdq{}UTF\PYZhy{}8\PYZdq{}?\PYZgt{}}
\PY{n+nt}{\PYZlt{}text\PYZgt{}}
\PY{n+nt}{\PYZlt{}para\PYZgt{}}hello world\PY{n+nt}{\PYZlt{}/para\PYZgt{}}
\PY{n+nt}{\PYZlt{}/text\PYZgt{}}
\end{Verbatim}
[/cce]

Das ist auch schon das gesamte Geheimnis. Natürlich kann man mittels verschiedenster Deklarationen die Ausgabe formatieren, aber der Kern bleibt gleich.

Zum Schluss möchte ich noch ein paar Punkte festhalten, die m.E. sehr wichtig sind:

  1. Die Syntaxhervorhebung wird durch Pygments durchgeführt.
  2. Pygments kann ohne weiteres UTF8-Zeichen verarbeiten.
  3. Die Umgebung Verbatim führt ohne Redefinition keinen automatischen Zeilenumbruch durch. Ich habe hier einen Lösungsvorschlag, der aber noch verfeinert werden muss: TeX.SX: Box around minted environment

03. Juni 2013 von Marco Daniel
Kategorien: LaTeX | Schlagwörter: , , , , , , , | 3 Kommentare

Kommentare (3)

Schreibe einen Kommentar