Unveränderte Ausgabe

Manchmal soll Text auf der Seite genau so erscheinen, wie er eingegeben wurde: Befehle, Kommentare und Sonderzeichen werden ausgeschaltet und in einer monospaced Schreibmaschinenschrift gesetzt. Dieser Mechanismus heißt verbatim. Diese Seite führt durch das inline verwendete \verb, die blockweise verbatim-Umgebung, \verbatiminput für ganze Dateien, die wichtige Einschränkung, dass all dies nicht in einem anderen Befehlsargument stehen darf, samt Auswegen, die Variante alltt, die einige Befehle aktiv lässt, und schließlich fancyvrb für Zeilennummern und Rahmen.

Die verbatim-Umgebung und \verb

Die Grundlage wörtlicher Ausgabe ist die von Anfang an in LaTeX eingebaute verbatim-Umgebung. Alles zwischen \begin{verbatim} und \end{verbatim} wird so gedruckt, wie es eingegeben wurde: Ein Backslash startet keinen Befehl mehr, sondern erscheint als \; % beginnt keinen Kommentar; Leerzeichen und Zeilenumbrüche bleiben wörtlich erhalten; der ganze Block wird in Schreibmaschinenschrift (\tt) gesetzt. Das ist ideal für Programmcode oder Zeichenketten voller $ und &.

latex
\begin{verbatim}
for i in range(3):
    print("100% & $5")   # nothing here is interpreted
\end{verbatim}

Eine Regel ist zwingend: Die Zeichenkette \end{verbatim} darf nicht innerhalb der Umgebung erscheinen, denn LaTeX betrachtet sie sofort als Ende der Umgebung. Wenn Sie den Text \end{verbatim} selbst anzeigen müssen, ändern Sie den Abschluss mit fancyvrb weiter unten oder setzen Sie dieses Stück mit \verb.

Um ein kleines Stück Verbatim mitten in einer Zeile einzufügen, verwenden Sie die Inline-Form \verb. Direkt nach \verb steht ein Begrenzungszeichen, dann der wörtliche Text und dann dasselbe Zeichen erneut. Als Begrenzung kann jedes Nicht-Buchstaben-Zeichen dienen, das im Text nicht vorkommt. Häufig ist \verb|...|; kommt | im Inhalt vor, wählen Sie etwa \verb!...! oder \verb+...+. Zwischen \verb und dem Begrenzungszeichen darf kein Leerzeichen stehen.

latex
The macro \verb|\textbf{...}| sets bold text, and
the pipe itself is shown with \verb!a|b! instead.

Die Sternform \verb* druckt Leerzeichen im Inhalt als sichtbares Leerzeichen (␣). Das ist nützlich in Codebeispielen, in denen die genaue Zahl der Leerzeichen zählt. Entsprechend zeigt die Umgebung verbatim* Leerzeichen im Block als ␣.

Wenn es Ihnen jedoch nur um eine Zeichenkette geht, die häufig ~, #, % oder _ enthält, etwa eine URL, ist \url{...} aus dem Paket url oder hyperref oft einfacher, weil es auch an sinnvollen Stellen umbrechen kann.

Eine ganze Datei setzen (\verbatiminput)

Um den Inhalt einer externen Datei unverändert einzufügen, bietet das Paket verbatim aus den LaTeX required tools \verbatiminput{filename}. Laden Sie \usepackage{verbatim} in der Präambel und schreiben Sie im Text etwa \verbatiminput{program.py}; dann wird jede Zeile dieser Datei wörtlich gesetzt. Anders als beim Kopieren in das Manuskript folgt die Ausgabe automatisch, wenn die Quelldatei geändert wird. Code und Dokument müssen nicht von Hand synchron gehalten werden.

document.tex
\usepackage{verbatim}
% ...
\verbatiminput{hello.py}

Dasselbe Paket verbatim fügt außerdem eine comment-Umgebung hinzu, die alles zwischen \begin{comment} und \end{comment} überspringt. Das dient nicht der wörtlichen Ausgabe, sondern dem *gar nicht Ausgeben*, etwa um einen Entwurf vorübergehend beiseitezulegen.

Nicht innerhalb eines Befehlsarguments

Das ist die häufigste Stolperstelle bei Verbatim. \verb und die verbatim-Umgebung dürfen nicht innerhalb des Arguments eines anderen Befehls stehen, etwa in \section{\verb|code|}, einer \footnote{...}, einer Tabellenzelle oder einer \caption{...}. Der Grund sind Category Codes, catcodes, also die Rolle jedes Zeichens. \verb schaltet die catcodes erst kurz vor dem Lesen seines Arguments um, aber das Argument eines Befehls wurde beim Aufruf bereits unter den normalen catcodes in eine Tokenliste umgewandelt. Die Interpretation ist also vorbei, bevor \verb etwas ändern kann. So geschrieben endet es meist mit einem Fehler.

Es gibt zwei Auswege. Der eine ist das Paket cprotect: Setzen Sie \cprotect vor den problematischen Befehl, und Verbatim im Argument funktioniert. Zum Beispiel: \cprotect\section{\verb"foo"}. Für das Schützen des \begin einer Umgebung gibt es außerdem \cprotEnv.

Der andere ist \SaveVerb / \UseVerb aus fancyvrb weiter unten: Man speichert den Verbatim-Text zuerst unter einem Namen und ruft innerhalb des Arguments nur noch diesen Namen auf. Speichern mit \SaveVerb{label}|verbatim text|, Ausgeben mit \UseVerb{label}.

latex
% Workaround 1: cprotect
\usepackage{cprotect}
\cprotect\section{The \verb|\foo| command}

% Workaround 2: fancyvrb SaveVerb / UseVerb
\usepackage{fancyvrb}
\SaveVerb{cmd}|\foo|
\section{The \UseVerb{cmd} command}

Befehle mit alltt aktiv lassen

In gewöhnlichem Verbatim können Sie nur einen Teil eines Codebeispiels nicht hervorheben oder färben, weil Befehle ausgeschaltet sind. Das Paket alltt aus der Standard-LaTeX-Distribution und seine alltt-Umgebung lösen das. alltt setzt Text ähnlich wie verbatim monospaced und wie eingegeben, nur Backslash \ sowie die Klammern { und } behalten ihre normale Bedeutung. So erhalten Sie den Verbatim-Look und können innen trotzdem LaTeX-Befehle ausführen.

latex
\usepackage{alltt}
% ...
\begin{alltt}
def \textbf{greet}(name):
    return "Hi, " + name   \textit{# a comment}
\end{alltt}

In diesem Beispiel wird der Funktionsname greet fett und der Kommentar kursiv, während alles andere exakt wie eingegeben bleibt. Der Preis: Um die drei Zeichen \, {, } wörtlich zu drucken, müssen Sie sie als \textbackslash, \{, \} ausschreiben; verbatim würde sie direkt drucken. Verwenden Sie alltt, wenn Sie von Hand etwas Formatierung hinzufügen möchten, und verbatim, wenn wirklich alles unverändert bleiben soll.

Zeilennummern und Rahmen mit fancyvrb

Das eingebaute Verbatim bietet weder Zeilennummern noch Rahmen. Leistungsfähiger ist das Paket fancyvrb, dessen Kern die Verbatim-Umgebung mit großem V ist, etwas anderes als das kleine verbatim. Optionen setzen Sie pro Umgebung als \begin{Verbatim}[key=value, ...] oder global in der Präambel mit \fvset{key=value, ...}.

Die wichtigsten Optionen: numbers=left oder right fügt Zeilennummern hinzu, frame=single zeichnet einen Rahmen um den ganzen Block, und fontsize=\small setzt die Schriftgröße. Mit commandchars können außerdem einige Befehle innerhalb des sonst wörtlichen Texts aktiv bleiben.

OptionTypische WerteWirkung
numbersnone / left / rightPosition der Zeilennummern (Standard none)
framenone / single / lines / leftline / topline / bottomlineRahmentyp (Standard none)
fontsize\small, \footnotesize usw.Schriftgröße (Standard: wie der Text)
commandcharsz. B. \\\{\}Legt Escape-Zeichen und zwei Gruppierungszeichen fest und aktiviert Befehle

Das folgende Beispiel ist ein Verbatim-Block mit Zeilennummern links, einfachem Rahmen und etwas kleinerer Schrift.

latex
\usepackage{fancyvrb}
% ...
\begin{Verbatim}[numbers=left, frame=single, fontsize=\small]
def greet(name):
    return "Hello, " + name
\end{Verbatim}

Mit commandchars=\\\{\} wirken die Zeichen \, {, } im Verbatim-Text als Escape- und Gruppierungszeichen, sodass Befehle ähnlich wie bei alltt eingebettet werden können. Zum Einlesen ganzer Dateien gibt es außerdem \VerbatimInput[options]{filename}; anders als \verbatiminput akzeptiert es die Optionen oben. Und mit \SaveVerb / \UseVerb von vorhin funktioniert Verbatim sogar in Befehlsargumenten.

Ein letzter Hinweis: Alles hier dient dem unveränderten Ausgeben von Text, nicht dem Syntax-Highlighting wie dem Färben von Schlüsselwörtern. Wenn Programmcode mit Farben und Formatierung erscheinen soll, sind das spezialisierte Paket listings oder minted, das Pygments aus Python nutzt, die richtigen Werkzeuge; behandelt wird das auf der Seite „Code listings“.