Quellcode liest sich oft schwer. Eine Syntaxhervorhebung macht klar, worauf es ankommt.
In Vorträgen, Kursen oder bei der Dokumentation kommen viele Hilfsmittel zum Darstellen von Quellcode zum Einsatz, fast immer mit einer Syntaxhervorhebung. Seien es Screenshots von Editoren, eingescannte Ausdrucke von Code-Schnipseln, in denen der Autor per Textmarker die wesentlichen Teile hervorgehoben hat, oder sogar handkolorierte Meisterwerke aus der Office-Umgebung: Sie alle verursachen viel Arbeit und bereitet dem Leser aufgrund uneinheitlicher Darstellung gleicher Schlüsselwörter oft Mühe.
Ausweg Enscript
Aus diesem Dilemma gibt es einen einfachen Ausweg: Mittels Enscript [1] erzeugen Sie aus kompletten Quelltexten entsprechende Ausgaben für den Druck oder Bildschirm.
Damit das Programm allerdings zufriedenstellende Ergebnisse auswirft, gilt es auf den Zeichensatz der Eingabedatei zu achten. Files mit der heute weit verbreiteten Kodierung UTF-8 verarbeitet das Programm nicht richtig. Am besten konvertieren Sie diese nach ISO-8859-15 (Westeuropa, mit Eurozeichen). Gut ausgestattete Editoren wie Kate (Abbildung 1) ermöglichen dies ebenso wie die Kommandozeilentools Recode [2] und Iconv.
Den Konverter Recode benötigen Sie vor allem beim automatisierten Verarbeiten. Wenn Sie erfahren wollen, welche Zeichensätze das Programm bearbeiten kann, geben Sie in einem Terminal den Befehl recode --list ein.
Selbst uralte COBOL-Listings aus den Zeiten der BS-1000-Großrechner bereiten Sie damit auf, unter anderem für Enscript. Legen Sie eine Kopie der Quelltextdatei an, da das Tool die Datei selbst ändert. Für das Konvertieren geben Sie bei Recode die Ausgangs- und Zielkodierung an, getrennt durch zwei Punkte (..):
$ recode UTF-8..ISO-8859-15 p3.sh
Wissen Sie nicht, mit welchem Zeichensatz die Ausgangsdatei kodiert ist, fragen Sie das auf der Shell mit dem Kommando file ab. Sie benötigen die Option -i, da Sie sonst nicht alle Informationen erhalten (Listing 1).
Listing 1
$ file -i *.sh p1.sh: text/x-shellscript; charset=utf-8 p2.sh: text/x-shellscript; charset=ISO-8859-1 p3.sh: text/x-shellscript; charset=ISO-8859-15
Im Einsatz
Die Datei mit dem richtigen Zeichensatz verarbeiten Sie nun mit Enscript. Für die Ausgabe haben Sie dabei die Wahl zwischen Postscript, HTML oder RTF; alternativ steuern Sie direkt einen Drucker an. Möchten Sie einen kompletten Quelltext für Dokumentationszwecke in das PDF-Format verwandeln, benötigen Sie hierfür noch geeignetes Werkzeug im Nachlauf.
Dazu eignet sich unter anderem Ps2pdf14, das bei vielen Distributionen zum Paket ghostscript gehört. Es stellt einen PDF-Pseudodrucker bereit. Das folgende Kommando wandelt die Ausgabe in PDF um:
$ ps2pdf14 Postscript-Datei
Die Tabelle “Enscript-Optionen” zeigt die wichtigsten allgemeinen Optionen. Die wichtigsten Programmier- und Skriptsprachen und deren Kürzel finden Sie in Tabelle “Auswahl Sprachen”.
Enscript-Optionen
| Option | Aktion | Hinweis |
|---|---|---|
-EKürzel |
Angabe der Programmier- oder Skriptsprache | alternativ: --highlight=Kürzel |
--help-pretty-print |
Anzeige aller unterstützten Programmier- und Skriptsprachen | alternativ: --help-highlight |
-wFormat |
Angabe des Ausgabeformates, falls von Postscript abweichend | mögliche Werte: html, rtf |
--color |
Syntax zusätzlich durch Farben hervorheben | – |
--mark-wrapped-lines=Stil |
Kennzeichnung automatisch umbrochener Zeilen | mögliche Werte: plus, box, arrow (nur bei PS-Ausgabe) |
-C |
Zeilennummern verwenden | – |
-fFontname |
Font und Ausgabegröße angeben | Beispiel: -fCourier8 (nur bei PS-Ausgabe) |
-Hn |
nur jede n+1te Zeile ausgeben |
Beispiel: -H1 für jede zweite Zeile (nur bei PS-Ausgabe) |
--highlight-bar-gray=Wert |
Angabe zur Farbstärke | 0.9 (schwach) bis 0.1 (fast schwarz) |
-bZeilenanweisung |
eigene Kopfzeile verwenden | Beispiel: -b'$n| %W | Seite $% von $=' |
-B |
Kopfzeile ausblenden | – |
-u'Text' |
Wasserzeichen einblenden | – |
-oDateiname |
Name der Ausgabedatei | – |
-PDrucker |
Drucker für die direkte Ausgabe definieren | – |
-r |
Ausgabe im Querformat | nur bei PS-Ausgabe |
-R |
Ausgabe im Hochformat | nur bei PS-Ausgabe |
Auswahl Sprachen
| Sprache | Kürzel |
|---|---|
| Assembler | asm |
| AWK-Skripte | awk |
| Bash-Shell | bash |
| C | c |
| C++ | cpp |
| Delphi | delphi |
| HTML | html |
| Java | java |
| Javascript | javascript |
| Lua | lua |
| M4 | m4 |
mail |
|
| Makefiles | makefile |
| Matlab | matlab |
| Pascal | pascal |
| Perl | perl |
| Python | python |
| RFCs | rfc |
| Ruby | ruby |
| Shell | sh |
| SQL | sql |
| Visual Basic | vba |
| Z-Shell | zsh |
Die zentrale Konfigurationsdatei von enscript.cfg finden Sie im Verzeichnis /etc. Darüber hinaus besteht die Möglichkeit, eine Kopie davon zu bearbeiten und im Home-Verzeichnis als .enscriptrc abzulegen. Unter /usr/share/enscript finden Sie weitere Ressourcen, wie die Muster der Kopfzeilen oder das Verzeichnis (hl) mit den Stilen für die jeweilige Syntax.
Um eine eigene Stil-Datei anzulegen, kopieren Sie eine bestehende Datei mit dem Suffix st und ändern diese für Ihre Zwecke ab. Mit enscript.st steht Ihnen ein Muster mit kleiner Anleitung bereit. Vergeben Sie für Ihre Stildatei einen Namen, der noch nicht in Gebrauch ist.
Haben Sie für /usr/share/enscript kein Schreibrecht, speichern Sie Ihre Datei anschließend im Verzeichnis .enscript im Home-Verzeichnis. Hier liegen alle von Ihnen selbst erstellten zusätzlichen Ressourcen. Diese stehen aber nur für Sie selbst bereit.
Listing 2 zeigt einige beispielhafte Aufrufe für Enscript. Dabei kommen einfache Optionen für die Kopfzeile oder komplexe Anweisungen zum Ausdruck der Datei zum Einsatz.
Listing 2
enscript -Ebash -C -o script1.ps script.sh enscript -b'$n| %W | Seite $% von $=' --highlight=sh -fCourier12 -u"ENTWURF" -C --mark-wrapped-lines=arrow -o script2.ps script2.sh enscript --highlight-bar-gray=.8 --highlight=sh -fCourier10 -C -H1 -o script1.ps script.sh enscript --highlight=sh -C -wrtf --color -o script1.rtf script.sh enscript --highlight=sh -C -whtml --color -o script1.html script.sh
Das Kommando aus Zeile 1 erzeugt eine Postscript-Ausgabe in schwarzweiß mit Zeilennummern und einer Standard-Kopfzeile, wobei Enscript nach Schlüsselworten der Bash fahndet (Abbildung 2).

Abbildung 2: Schon mit wenigen Optionen erzeugen Sie dank Enscript eine Ausgabe, die den Blick auf die wichtigen Schlüsselwörter lenkt und das Navigieren im Text durch automatische Zeilennummern erleichtert.
In Zeile 2 kommt ein wesentlich komplexerer Befehl zum Einsatz. Das Pipe-Zeichen bei der Kopf-Option teilt die Zeile in eine linke, mittlere und rechte Spalte ein. Die Option -f gibt hier neben dem Font zusätzlich dessen Größe an. Ein Wasserzeichen Entwurf prangt quer über die Seite. Beachten Sie, dass das Programm den Umbruch der überlangen Zeile mit einem Pfeil markiert hat (Abbildung 3).

Abbildung 3: Wasserzeichen und individuelle Kopfzeilen ermöglichen es, Ausgaben ohne große zusätzliche Kommentare zu versenden.
Mit einer wechselweisen Unterlegung der Zeilen heben Sie die Abfolge des Quellcodes noch besser hervor. Zeile 3 in Listing 2 zeigt, wie Sie das bewerkstelligen, Abbildung 4 veranschaulicht das Ergebnis.

Abbildung 4: Das Listing erinnert an alte Computerausdrucke, stammt aber von einem modernen Linux-PC mit Enscript.
Zeile 4 erzeugt eine farbige Ausgabe im RTF-Format. Vergessen Sie nicht, beim Weiterverarbeiten mit einem Office-Paket eine dicktengleiche Schrift zu verwenden, wie etwa Courier. Proportionalschriften, wie die beliebte Times, führen dazu, dass der Quellcode unübersichtlich erscheint. Die gedachten Spalten im Text liegen nicht mehr unbedingt übereinander.

Abbildung 5: Achten Sie beim Weiterverarbeiten der RTF-Ausgabe im Office-Paket der Wahl darauf, dass Sie für den Text eine dicktengleiche Schrift wie Courier auswählen.
Falls Sie das Quellcode-Fragment in eine Website integrieren möchten, bietet sich die direkte Ausgabe in HTML an. Das umfasst auch den Einsatz von Farben (Abbildung 6).
LaTeX-Dokumente
Mit dem Paket listings haben Sie die Möglichkeit, Quelltexte in einem LaTeX-Dokument zu verschönern [3]. Dabei bietet Ihnen diese Erweiterung viel Freiheit beim Gestalten, bei Bedarf sogar durch eigene Vorgaben für die Syntax. Zumindest dazu benötigen Sie jedoch Grundkenntnisse im Umgang mit LaTeX. Um das Paket zu integrieren, fügen Sie zunächst in der Präambel des LaTeX-Dokumentes die Zeilen aus Listing 3 ein.
Listing 3
%Diese Pakete werden zusätzlich benötigt
\usepackage{listings}
\usepackage{color}
An der entsprechenden Stelle legen Sie die Eigenschaften des Listings wie Farbe, Sprache, Zeilennummern und weitere Angaben fest. Die Tabelle “Wichtige Einstellungen” zeigt eine Auswahl von Möglichkeiten beim Konfigurieren.
Wichtige Einstellungen
| Einstellung | Variable | Hinweis |
|---|---|---|
| Schriftfamilie | basicstyle=\Schrift |
– |
| Programmiersprache | language=Sprache |
– |
| Hintergrundfarbe | backgroundcolor=\Farbe |
– |
| Weißraum (Leerschritt, Tabulator) innerhalb von Strings | showstringspaces=true |
– |
| Hervorhebungen | ||
| Schlüsselwörter | keywordstyle=\Farbe\Schrift\Auszeichnung |
– |
| Kommentare | commentstyle=\Farbe\Schrift\Auszeichnung |
– |
| Strings | stringstyle=\Farbe\Schrift\Auszeichnung |
– |
| Zeilennummerierung | ||
| Position auf der Seite | numbers=Position |
links: left, rechts: right |
| Stil | numberstyle=\stil |
hier ist \tiny gebräuchlich |
| Schrittweite | stepnumber=Schrittweite |
1 für jede Zeile |
| Leere Zeilen | numberblanklines=true |
false für Leerzeilen ohne Nummerierung |
| Beginn Nummerierung | firstnumber=Anweisung |
auto: gleichnamige Listings zusammenhängend nummerieren, Zahl: Zählung beginnt ab genanntem Wert, last: Zählung vom vorhergehenden Listing fortführen |
| Abstand | numbersep=Abstand |
Angabe des Abstandes in pt, mm, cm. Die Einheit ist obligatorisch. |
Die Einstellungen tragen Sie in der Form \lstset{Einstellung, Einstellung} ins Dokument ein. Dabei trennen Sie die Einstellungen durch Kommas voneinander. Das Listing selbst kapseln Sie zwischen die Anweisungen \begin{lstlisting} und \end{lstlisting}. Optional ergänzen Sie die Anweisung \begin um einen Namen für das Listing:
\begin{lstlisting}[name=Listingname]
Je nach Einsatzgebiet kommen zum Auszeichnen des Quelltextes Grauabstufungen oder Farbwerte in Frage. Im ersten Beispiel markieren zwei verschiedene Graustufen die Kommentare und Strings, wohingegen die Schlüsselwörter zwar schwarz erscheinen, aber zum besseren Erkennen unterstrichen sind. Diese Variante macht zudem den Weißraum in Strings deutlich und nummeriert die Zeilen. Zur besseren Erkennung unterstreichen wir Schlüsselwörter zusätzlich zum Fettdruck (Listing 4).
Listing 4
%Hier werden die Farben definiert
\definecolor{grau}{gray}{0.50}
\definecolor{grau2}{gray}{0.30}
\definecolor{weis}{gray}{1.0}
...
\lstset{
basicstyle=\ttfamily,
language=bash,
keywordstyle=\color{black}\bfseries\underbar,
commentstyle=\color{grau},
stringstyle=\color{grau2}\ttfamily,
showstringspaces=true,
numbers=left,
numberstyle=\tiny,
stepnumber=1,
numberblanklines= true,
numbersep=5pt}
\begin{lstlisting}
#! /bin/sh
echo -n "Ihre Eingabe: ";read a
if [ -z $a ];
then
echo "Variable leer"
else
echo "Variableninhalt: $a"
fi
\end{lstlisting}

listings erzeugt, sorgen für mehr Durchblick im Quelltext.” width=”300″ height=”184″ />
Abbildung 7: Schon ein paar sehr dezente Effekte, mit Hilfe des Paketslistings erzeugt, sorgen für mehr Durchblick im Quelltext.In Farbe
Das alternative Beispiel aus Listing 5 zeigt einen hellgelben Hintergrund für den Quellcode. Die Farbe definieren Sie in der Anweisung \definecolor nach dem Farbmodell RGB. Die Zeilennummern zieht sich durchgängig durch die verschiedenen Teile des Quellcodes (Listing 5).
Listing 5
\definecolor{hellgelb}{rgb}{0.96,0.89,0.59}
\lstset{
basicstyle=\ttfamily,
language=bash,
backgroundcolor=\color{hellgelb},
keywordstyle=\color{red}\bfseries,
commentstyle=\color{green}\normalfont,
stringstyle=\color{blue}\ttfamily,
showstringspaces=false,
numbers=left,
numberstyle=\tiny,
stepnumber=1,
numberblanklines= true,
firstnumber=last,
numbersep=5pt}
\begin{lstlisting}
#! /bin/sh
echo -n "Ihre Eingabe: ";read a
if [ -z $a ];
then
echo "Variable leer"
else
echo "Variableninhalt: $a"
fi
\end{lstlisting}
\begin{lstlisting}
#! /bin/sh
for i in `ls -1 *.ps`;
do
ps2pdf14 $i
done
\end{lstlisting}
Für Fortgeschrittene
Wer bei der Auswahl der unterstützen Sprachen nicht das Passende findet, dem steht die Möglichkeit offen, eigene Regeln für die Syntax zu erstellen. Die Definition stellen Sie vor dem Abschnitt \lstset ein. Die eigentliche Definition folgt der Form aus Listing 6.
Listing 6
\lstdefinelanguage{Sprache}{
keywords={Schlüsselwort,Schlüsselwort},
sensitive=true,
comment=[1]{Kommentarzeichen}
}
Bei vielen Programmier- und Skriptsprachen leiten Sie Kommentare aber durch zwei Zeichen ein. Anstelle comment benutzen Sie daher morecomment und geben die entsprechenden Zeichen an. Schlagen Sie zu diesem Thema im Handbuch [4] nach – es gibt einige interessante Varianten. Mit dem Einsatz von sensitive=true achtet LaTeX auf Groß- und Kleinschreibung eines Schlüsselwortes.
Eigene Farben legen Sie mit der Anweisung \definecolor fest. Die Farbwerte erhalten Sie, indem Sie mit einem Bildbearbeitungsprogramm zunächst die Wunschfarbe festlegen (Abbildung 9) und die angegebenen RGB-Werte durch 255 teilen. Die Farbdefinition mit den Werten aus Abbildung 9 lautet damit:
\definecolor{rot1}{rgb}{0.76,0.08,0.08}

Abbildung 9: Die Farbpalette von Gimp verrät Ihnen die Zahlenwerte für die Farben Rot, Grün und Blau.
Falls Sie Ihre Dokumentation oder Präsentation mit einem Office-Programm schreiben, müssen Sie die Postscriptdatei noch konvertieren. Dazu verwenden Sie ps2eps PS-Datei. Verwenden Sie als Ausgangsmaterial eine PDF-Datei, stellen Sie stattdessen mit pdf2svg PDF-DateiSVG-Datei eine Bilddatei zur weiteren Verwendung her.
Fazit
Uneinheitliche Quelltext-Ausgaben oder komplexe Verrenkungen mit einem Office-Paket gehören der Vergangenheit an, wenn Sie die richtigen Tools einsetzen. Sowohl mit Enscript als auch mit LaTeX zaubern Sie optisch ansprechende Ausgaben von Quelltexten und Code-Schnipseln. Einige Schritte lassen sich dabei sogar in Shell-Skripte packen und somit automatisieren.
Infos
[1] Enscript: http://www.markkurossi.com/genscript/
[2] Recode: http://
[3] listings: http://www.ctan.org/pkg/listings
[4] Handbuch zu listings: http://mirror.ctan.org/macros/latex/contrib/listings/listings.pdf








