Umgebungen

TeX selbst kennt keinen Befehl \begin. Knuths plain TeX definiert nur \beginsection; die Form \begin{...}\end{...} wurde von LaTeX hinzugefügt. Wozu also? Die Antwort ist ein einziges Versprechen: In dem Moment, in dem \end überschritten wird, ist alles, was drinnen verändert wurde, wieder im ursprünglichen Zustand. Dieser Mechanismus – die Umgebung – hat Listen, abgesetzte Gleichungen, Abbildungen, Zitate und sogar den Dokumentkörper selbst in dieselbe Form gebracht. Diese Seite zeigt, was eine LaTeX-Umgebung garantiert, wie Umgebungen verschachtelt werden und wie die Meldung \begin{...} ended by \end{...} zu lesen ist, wenn die beiden Namen nicht zusammenpassen.

Was \begin und \end garantieren

Was eine Umgebung garantiert, ist eine Gruppe. \begin{name} öffnet eine TeX-Gruppe, noch bevor überhaupt feststeht, was die Umgebung tun soll, und \end{name} schließt sie wieder. Was drinnen also verändert wird – Schrift, Ränder, was auch immer –, überlebt die Zeile nach \end nicht. Eine center-Umgebung zentriert ihren Inhalt, itemize macht daraus eine Aufzählung, quote verbreitert beide Ränder, und jede dieser Wirkungen endet innerhalb ihres eigenen Bereichs. Umgekehrt gesagt: Eine Umgebung liefert keine Verzierung, sondern eine Garantie des Aufräumens – und genau darum lautet die Faustregel, zuerst zur Umgebung zu greifen.

Die Namen in \begin{name} und \end{name} müssen exakt übereinstimmen: \begin{center} lässt sich nicht mit \end{flushleft} schließen. Im Hintergrund verrichtet LaTeX die unscheinbare Arbeit, sich den Namen der gerade offenen Umgebung zu merken – deshalb kann die Fehlermeldung beide Namen und die Zeilennummer der Öffnung nennen. Auch das Dokument ist keine Ausnahme: \begin{document}\end{document} ist eine echte Umgebung, und die Grundregel, dass der Haupttext dorthin gehört, ist nur die schlichte Feststellung, dass er in der äußersten Umgebung steht.

latex
\begin{center}
This paragraph is centred; the line after \end is not.
\end{center}

\begin{quote}
  {\itshape Everything inside is a group,}
  so this italic never escapes the environment.
\end{quote}

Verschachteln: in umgekehrter Reihenfolge schließen

Umgebungen lassen sich verschachteln, doch geschlossen wird in genau der umgekehrten Reihenfolge des Öffnens: Wird \begin{b} innerhalb von \begin{a} geöffnet, folgt zuerst \end{b}, dann \end{a}. Die Bereiche dürfen sich nicht überlappen, etwa als \begin{a}\begin{b}...\end{a}\end{b}. Der Grund ist die Garantie aus dem vorigen Abschnitt: Da eine Umgebung eine Gruppe ist und Gruppen nur wie Schachteln ineinanderstecken können, gibt es die halb überlappende Form gar nicht. Eine Liste in einem Zitat, eine Tabelle in einer Abbildung, eine Gleichung in einem Satz – jede in der Praxis vorkommende Kombination schreibt sich zwanglos als solche Verschachtelung.

latex
\begin{quote}
  A bulleted list inside a quotation:
  \begin{itemize}
    \item first
    \item second
  \end{itemize}
\end{quote}

Nur eine Gewohnheit lohnt hier: Beim Öffnen einer Umgebung zuerst die schließende Zeile schreiben und erst dann den Inhalt. Rückt man das Innere um zwei oder vier Leerzeichen ein, werden die Paare – ein tabular in einem figure, ein itemize in einem quote – an der Form der Quelle sichtbar. Je tiefer die Verschachtelung, desto leichter gerät beim späteren Austausch des Inhalts ein \end durcheinander, und wie der nächste Abschnitt zeigt, tritt genau dieser Unfall nicht dort zutage, wo er passiert ist.

Die Umgebungen, denen man zuerst begegnet – nach Zweck geordnet

Die Umgebungen des Standard-LaTeX werden übersichtlich, wenn man sie in fünf Familien betrachtet: Textausrichtung, Listen, Mathematik, Gleitobjekte und Tabellensatz. Die Einzelheiten gehören auf die jeweiligen Seiten, doch die Form ist überall dieselbe – mit \begin öffnen, mit \end schließen, innen eine Gruppe. Bei einer neuen Umgebung führt die Frage „Welchen Bereich grenzt sie ab?“ meist schnell zum Ziel.

FamilieUmgebungenAufgabe
textcenter, flushleft, flushright, quote, quotation, verbatimZentriert, links- und rechtsbündig; Zitate; Ausgabe genau wie eingegeben
listsitemize, enumerate, descriptionAufzählungen, nummerierte Listen und Beschreibungslisten
mathequation, align, gatherAbgesetzte Gleichungen, mehrzeilige Ausrichtung, Nummerierung
floatsfigure, tableTragen Beschriftung und Nummer und überlassen die Position dem Satz
tabulartabular, arrayDas Raster aus Zeilen und Spalten selbst – eine andere Aufgabe als figure und table

Drei Paare dieser Liste werden regelmäßig verwechselt. quote gegenüber quotation: Beide rücken Zitate links und rechts ein, doch quotation rückt zusätzlich die erste Zeile jedes Absatzes ein und eignet sich für lange, mehrabsätzige Zitate. figure/table gegenüber tabular: völlig verschiedene Dinge – das erste Paar ist „ein gleitender Behälter mit Beschriftung und Nummer“, das zweite „das Raster selbst“. Braucht eine Tabelle Nummer und Querverweise, kommt das tabular in ein table. Und verbatim gibt seinen Inhalt in Festbreitenschrift genau wie eingegeben aus und deutet nicht einmal \ oder { als Befehl – der Standardweg, um Quellcode zu zeigen.

Manche Umgebungen nehmen Argumente, angegeben in den {...} oder [...], die direkt auf \begin folgen. tabular etwa verlangt eine Spaltenangabe: Das {cc} in \begin{tabular}{cc} legt die Ausrichtung jeder Spalte fest (c zentriert, l links, r rechts); im Inneren trennt & die Spalten, und jede Zeile endet mit \\. Ebenso nimmt figure einen Platzierungswunsch als Option entgegen, etwa \begin{figure}[htbp]. Argumente stehen stets unmittelbar hinter dem Umgebungsnamen; auf der \end-Seite wird nie etwas geschrieben.

latex
\begin{figure}[htbp]
  \centering
  \begin{tabular}{ll}
    input  & output \\
    source & PDF    \\
  \end{tabular}
  \caption{A tabular grid inside a floating table}
  \label{tab:demo}
\end{figure}

align gegenüber align*: Der Stern gehört zum Namen

Ein Name mit einem * am Ende ist die Variante, die nichts nummeriert. align nummeriert jede Zeile, \begin{align*}\end{align*} keine einzige. Bei equation* ist es dasselbe: eine abgesetzte Gleichung ohne Nummer. Reizvoll daran ist, dass der * weder Option noch Argument ist, sondern Teil des Namens selbst. \begin setzt die übergebene Zeichenkette unmittelbar zu einem Befehlsnamen zusammen, sodass tatsächlich ein Befehl namens align* – samt Stern – entsteht. Wie die vorige Seite zeigte, endet der Name eines Kontrollworts beim ersten Nichtbuchstaben; dieser Befehl lässt sich also grundsätzlich nicht als \align* aufrufen, sondern nur über \begin{align*} erreichen.

latex
\begin{align}          % every line gets an equation number
  a &= b + c \\
  d &= e + f
\end{align}

\begin{align*}         % same layout, no numbers at all
  a &= b + c \\
  d &= e + f
\end{align*}

Wenn \begin{...} ended by \end{...} erscheint

Diese Meldung sagt nicht „falsch geschlossen“, sondern „dies war offen“. Passen die Namen nicht zusammen, hält LaTeX mit einer Meldung wie ! LaTeX Error: \begin{center} on input line 5 ended by \end{flushleft}. an und nennt den Namen der geöffneten Umgebung samt ihrer Zeilennummer. Zu lesen ist die erste Hälfte, nicht das \end in der zweiten: Gemeldet wird fast immer die \end-Seite, während die tatsächlich zu korrigierende Stelle die Zeile ist, auf die die erste Hälfte zeigt. Ein vergessenes \end erzeugt dieselbe Form, nur mit \end{document} als Gegenstück: ! LaTeX Error: \begin{itemize} on input line 2 ended by \end{document}. heißt, dass das in Zeile 2 geöffnete itemize nie geschlossen wurde.

Ein Tippfehler im Namen verhält sich etwas anders. Schreibt man einen undefinierten Namen wie \begin{itemzie}, erscheint zuerst ! LaTeX Error: Environment itemzie undefined. und danach ! LaTeX Error: \begin{document} ended by \end{itemzie}. Zwei Fehler treten auf, weil \begin die Gruppe öffnet, bevor überhaupt geprüft wird, ob es die Umgebung gibt. Die Gruppe bleibt offen stehen, und das zugehörige \end findet niemanden mehr. Daraus folgt eine praktische Regel: Fehler von oben nach unten einzeln beheben und neu übersetzen, alles unterhalb des ersten ignorieren. Gerade bei Umgebungen ist der erste Fehler sehr häufig die Ursache des zweiten.

Ein weiteres Indiz trennt die beiden Fälle. Eine nicht geschlossene geschweifte Klammer erzeugt eine Meldung von TeX selbst, nicht von LaTeX. Gegen Ende des Logs steht dann nur (\end occurred inside a group at level 1), ohne Zeilennummer. Offen geblieben ist eine schlichte, namenlose Gruppe, und TeX hat nichts, womit es das „Wo“ beantworten könnte. Umgekehrt gelesen wird daraus eine Diagnose: eine Meldung mit Zeilennummer bedeutet eine Umgebungsverwechslung, diese allein bedeutet eine Klammer. Zum Eingrenzen ist es nach wie vor am schnellsten, die verdächtige Umgebung in eine eigene Datei herauszulösen und einzeln zu übersetzen.

Umgebungen nach Bedeutung wählen, nicht nach Aussehen

Eine Umgebung ist kein optischer Kasten, sondern der Name eines Manuskriptteils. quote, weil es ein Zitat ist; itemize, weil es eine Aufzählung ist; tabular, weil es ein Raster ist; figure oder table, weil Nummer und Querverweise gebraucht werden – so gewählt, ergeben sich Beschriftungen, Nummerierung, Verweise und Verzeichnisse später von selbst. Wählt man dagegen weiter nach dem Aussehen – „center, weil es zentriert sein soll“, „quote, weil ich Rand möchte“ –, lässt sich ein halbes Jahr später nicht mehr sagen, wofür ein Kasten stand, und auch das Layout nicht mehr in einem Zug ändern. Geht es nur um eine optische Änderung, ist der Griff zu einer Deklaration oder einem Abstandsbefehl ehrlicher als der zu einer Umgebung.

  • Der Inhalt ist ein Zitatquote oder quotation verwenden und die Quelle im Text oder in einer Fußnote nennen.
  • Der Inhalt ist eine logische Listeitemize, enumerate oder description verwenden und keine Aufzählung mit \\ vortäuschen.
  • Eine Abbildung oder Tabelle braucht Nummer und Verweise\caption und \label in figure oder table setzen und das Raster tabular überlassen.
  • Dieselbe Kombination wiederholt sich – statt lokale Formatierungsbefehle zu kopieren, mit \newenvironment benennen und die Bedeutung festschreiben.

Wie der letzte Punkt andeutet, werden Umgebungen nicht nur verwendet, sondern auch selbst definiert. \newenvironment erhält den Code für den Anfang und den Code für das Ende; \renewenvironment gestaltet einen bereits vorhandenen Namen um. Die Einzelheiten – wie Argumente übergeben werden, warum die \end-Seite sie nicht nutzen kann und wie die moderne Schnittstelle NewDocumentEnvironment aussieht – stehen gesammelt auf der Seite über eigene Umgebungen. Mitzunehmen ist hier nur eines: Auch eine selbst definierte Umgebung erbt ohne weiteres Zutun genau die in diesem Abschnitt beschriebene Gruppen-Garantie.