Textausrichtung (zentriert / Flattersatz / Blocksatz)

Warum wirken Absätze aus LaTeX ruhiger als die eines Textverarbeitungsprogramms? Die Antwort liegt eine Ebene unter der Textausrichtung: Eine Textverarbeitung füllt Zeile für Zeile, LaTeX dagegen wägt den ganzen Absatz ab, bevor überhaupt eine Zeile endet. Voreingestellt ist Blocksatz, und davon weg führen zwei Wege – Deklarationen wie \centering und Umgebungen wie center, die dieselbe Ausrichtung erzeugen, aber nicht denselben vertikalen Abstand. Diese Seite verfolgt einen Faden: warum Blocksatz die Voreinstellung ist, wie zwischen \centering und center zu wählen ist, warum \raggedright die Silbentrennung stillschweigend abstellt und was ragged2e daran ändert, und wie auf eine Warnung Overfull \hbox zu reagieren ist.

Warum Blocksatz die Voreinstellung ist: Zeilenumbruch über den ganzen Absatz

Ohne weitere Angabe setzt LaTeX Absätze im Blocksatz, bündig an beiden Rändern. Diese Voreinstellung ist keine bloße Gewohnheit. TeX füllt Zeilen nicht von oben nach unten, sondern wählt jene Kombination von Umbruchstellen, die den gesamten Absatz die wenigsten Demerits kostet. Beschrieben ist der Algorithmus in der Arbeit „Breaking Paragraphs into Lines“ von Donald Knuth und Michael Plass (Software: Practice and Experience, Band 11, 1981, S. 1119–1184). Ein gieriges, zeilenweises Füllen streicht seine Gewinne früh ein und schiebt die Folgen auf die letzte Zeile; TeX kann umgekehrt eine frühe Zeile absichtlich etwas schlechter setzen, damit weiter unten nichts zusammenbricht. Spielraum für diese Optimierung entsteht nur, wenn die Wortzwischenräume gedehnt und gestaucht werden dürfen – genau das erlaubt der Blocksatz. Deshalb steht er am Anfang.

Der Mechanismus ist greifbar. Für jede Zeile rechnet TeX das Maß an Dehnung oder Stauchung in eine Badness um und den Strafwert an der Umbruchstelle in p; mit l für \linepenalty und b für die Badness ergeben sich die Demerits der Zeile als d = (l+b)^2 + p^2. Die Demerits eines Absatzes sind deren Summe zuzüglich Aufschlägen für optisch unpassende Nachbarzeilen (\adjdemerits) und für zwei aufeinanderfolgende Zeilen mit Trennstrich (\doublehyphendemerits). Knuth und Plass selbst nennen die Formeln „quite arbitrary“ – und sie funktionieren trotzdem. Ebenso nützlich zu wissen: Der Zeilenumbruch läuft in bis zu drei Durchgängen. Der erste versucht den Absatz ganz ohne Silbentrennung und akzeptiert ihn nur, wenn jede Zeile innerhalb von \pretolerance bleibt; erst der zweite zieht die Trennmuster und die großzügigere \tolerance heran. Ein bequem gesetzter Absatz wird also gar nicht erst getrennt. Scheitert auch das, folgt ein dritter Durchgang mit \emergencystretch.

\centering und die Umgebung center im Vergleich

Kurz gesagt: Die Ausrichtung ist exakt dieselbe, verschieden ist allein der vertikale Abstand darüber und darunter. In latex.ltx ist center als \trivlist \centering\item\relax definiert – die Umgebung ist nichts weiter als \centering in einer unsichtbaren Liste, und als Liste steuert sie \topsep an Abstand zum umgebenden Text bei. flushleft umhüllt auf dieselbe Weise \raggedright, flushright entsprechend \raggedleft. In einer article-Klasse mit 10pt gemessen, fügt die Umgebung center oben und unten je rund 8pt hinzu; die Deklaration fügt gar nichts hinzu.

DeklarationUmgebungBündige SeiteVertikaler Abstand
\centeringcenterkeine Seite bündig, die Zeilen stehen mittignull bei der Deklaration, \topsep bei der Umgebung
\raggedrightflushleftlinke Kante bündig, rechte Kante flattertwie oben
\raggedleftflushrightrechte Kante bündig, linke Kante flattertwie oben
\justifyingjustifybeide Kanten bündig – Blocksatzerfordert ragged2e; die Deklaration fügt nichts hinzu
latex
\begin{figure}[htbp]
  \centering                 % declaration: adds no vertical space
  \includegraphics[width=0.6\textwidth]{plot}
  \caption{Measured values against the model}
  \label{fig:plot}
\end{figure}

Genau deshalb gehört in eine figure das \centering und nicht \begin{center}. Das Gleitobjekt bringt oben und unten bereits eigenen Abstand mit; kommt der \topsep der Umgebung center hinzu, wirken Bild und Beschriftung auseinandergezogen. Dasselbe gilt für eine tabular-Zelle, eine \parbox, eine minipage und den Inhalt von \caption – dort wird mit der Deklaration ausgerichtet. Umgekehrt ist die Umgebung center der kürzere Weg, wenn eine einzelne herausgestellte Zeile in den laufenden Text gesetzt wird und der Abstand ringsum ausdrücklich mitgewünscht ist.

Deklarationen haben eine weitere Eigenschaft, über die man leicht stolpert: Eine Deklaration beginnt keinen neuen Absatz. Die Ausrichtung entscheidet sich in dem Moment, in dem der Absatz schließt – wenn \par (eine Leerzeile) gelesen wird –, und was dann gilt, gilt für den gesamten Absatz. Deshalb verhält sich die folgende Zeile anders, als die meisten erwarten.

latex
ww {\centering xx \\ yy} zz
% result: the line "ww xx" comes out centred, "yy zz" does not

Gesetzt ergibt das ein zentriertes ww xx, während yy zz am linken Rand beginnt. Zweierlei geschieht hier. Erstens definiert \centering klammheimlich \\ um, nämlich zu \@centercr, und das ist kein Zeilenumbruch, sondern ein \par – das Ende eines Absatzes. xx schließt seinen Absatz also, während \centering noch wirkt, und dieser Absatz wird zentriert. yy eröffnet daraufhin einen neuen Absatz, doch die schließende } stellt \rightskip und Verwandte wieder her, bevor dieser Absatz endet – er erscheint im Blocksatz. Daraus folgt die einzige Regel für Deklarationen: Das Ende des auszurichtenden Absatzes – eine Leerzeile oder das \end einer Umgebung – muss innerhalb der Gruppe liegen.

Warum \raggedright die Silbentrennung aussetzt – und was ragged2e daran ändert

Die Ursache ist eine einzige Codezeile. \raggedright setzt \rightskip – den Leim, der das Zeilenende auffüllt – auf 0pt plus 1fil, also auf unendlich dehnbaren Raum. Steht am Ende jeder Zeile etwas unendlich Dehnbares, ist die Badness jeder Zeile null. Aus Sicht von TeX kann das Trennen eines Wortes dann nur noch die Demerits erhöhen und bringt nichts ein. Also wird überhaupt nicht mehr getrennt, und der rechte Rand franst heftig aus. Derselbe Satz auf 4cm Zeilenbreite gesetzt: Mit \raggedright fällt kein einziger Trennstrich, außer wo ein Wort allein nicht in eine Zeile passt – die Zeilenlängen schwanken entsprechend stark.

Genau das behebt das Paket ragged2e. Es ersetzt die unendliche Dehnbarkeit durch ein endliches 0pt plus 2em, sodass eine zu kurze Zeile wieder echte Badness trägt und TeX die Silbentrennung erneut abwägt. Bereitgestellt werden die großgeschriebenen Befehle \RaggedRight, \RaggedLeft und \Centering, die Umgebungen FlushLeft, FlushRight und Center sowie \justifying und die Umgebung justify für den Rückweg zum Blocksatz. Um ein ganzes Dokument linksbündig zu setzen und die Trennung dabei zu behalten, dient \usepackage[document]{ragged2e}: Damit läuft \RaggedRight bei \begin{document}, und dieselbe Einstellung greift auch in \parbox und in p-Spalten von tabular. Das Paket stammt von Martin Schröder und wird inzwischen von Marei Peischl gepflegt.

latex
\usepackage[document]{ragged2e}   % whole document flush left, hyphenation kept

% or locally, only where it is needed:
\begin{FlushLeft}
  A paragraph set flush left with hyphenation still available,
  so the right edge stays gently ragged instead of jagged.
\end{FlushLeft}

\justifying                        % back to justified text

Wann also ist Flattersatz wirklich die bessere Wahl? Entscheidend ist die Zeilenlänge. In mehrspaltigen Layouts, in Marginalien und in schmalen p-Spalten einer tabular werden die Zeilen kurz, und erzwungener Blocksatz treibt die Wortzwischenräume dann weit auseinander. Diese gedehnten Zwischenräume reihen sich über mehrere Zeilen hinweg und öffnen blasse Kanäle im Satzbild – im Fachjargon Gießbäche, englisch rivers –, die das Lesen eher behindern. Je kürzer die Zeile, desto größer die Gefahr; eine schmale Spalte liest sich im Flattersatz tatsächlich besser. Ein verbreiteter Kompromiss in zweispaltigen Arbeiten: Der Fließtext bleibt im Blocksatz, nur Bildunterschriften und Fußnoten erhalten \RaggedRight. Bei einspaltigem Satz mit bequemer Zeilenlänge bleibt der Blocksatz besser unangetastet.

Die Warnung Overfull \hbox beheben: \sloppy und \emergencystretch

Eine Logzeile wie Overfull \hbox (84.8932pt too wide) in paragraph at lines 10--10 meldet, dass keine Kombination von Umbruchstellen gefunden wurde, die den Absatz innerhalb der Toleranz hält; TeX gibt auf und lässt eine Zeile in den Rand ragen. Schuld ist meist etwas Langes und Untrennbares: eine URL, ein zusammengesetzter Bezeichner, ein langes Wort in \texttt oder schlicht eine schmale Spalte. Zuerst gehört dieses eine Wort unter Verdacht, nicht die Ausrichtung.

Die Gegenmittel haben eine Reihenfolge. Zuerst das eine Wort behandeln – mit \hyphenation{...} die Trennstellen mitteilen, ein \- einfügen oder eine URL an \url aus url beziehungsweise hyperref übergeben. Das ist die eigentliche Lösung. Bleibt die Warnung, kommt \sloppy an die Reihe: Es lockert \tolerance auf 9999, \emergencystretch auf 3em und \hfuzz auf 0.5pt und tauscht damit weite Wortzwischenräume gegen fehlenden Überstand. Auf das ganze Dokument angewandt wirkt der Fließtext insgesamt lockerer; schonender ist es, nur den betroffenen Absatz in die Umgebung sloppypar zu setzen oder allein \emergencystretch=3em zu belegen. \fussy stellt die strengen Werte wieder her (\tolerance 200, \emergencystretch 0). Häufen sich solche Warnungen in einer schmalen Spalte, ist das zugleich ein Hinweis darauf, dort besser Flattersatz zu verwenden.

latex
% 1. tell LaTeX where the offending word may be split
\hyphenation{Bib-lio-the-ken-ver-bund}

% 2. relax the line breaker for one paragraph only
\begin{sloppypar}
  A paragraph containing a very long unbreakable token.
\end{sloppypar}

% 3. or globally, without going all the way to \sloppy
\emergencystretch=3em

Warum \\ der falsche Weg ist, einen Absatz zu beenden

\\ bricht nur eine Zeile um; einen Absatz beendet es nicht. Das tut eine Leerzeile, also \par. Dieser Unterschied gehört hierher, denn wie in den vorigen Abschnitten gezeigt, entscheidet sich die Ausrichtung in dem Augenblick, in dem ein Absatz schließt. Werden zwei Textblöcke mit \\ getrennt, gilt der zweite nicht als neuer Absatz: kein Einzug, kein \parskip, nur ein Zeilenumbruch mitten in einem Absatz. Schlimmer noch: Steht \\ am Absatzende und folgt darauf eine Leerzeile, füllt sich das Log mit Underfull \hbox (badness 10000) in paragraph at lines 3--4, weil eine zusätzliche leere Zeile entstanden und auf die volle Breite gedehnt worden ist.

Wo also gehört \\ hin? Überall dort, wo genau ein Zeilenumbruch gewünscht ist. Zeilen innerhalb von center oder flushright trennen, eine Zeile in tabular abschließen, Verse in verse gliedern, eine lange \caption umbrechen – das sind Zeilengrenzen, keine Absatzgrenzen. Nebenbei: Ein \\ hinter der letzten Zeile eines center-Blocks kostet nichts – kein zusätzlicher Abstand, keine Warnung –, weil \@centercr es mit \addvspace{-\parskip} wieder aufhebt. Leerzeile für Absätze, \\ für Zeilen: Wer diese eine Grenze einhält, ist einen Großteil scheinbar unerklärlicher Ausrichtungsfehler los.

Welche Ausrichtung wofür

Ausgangspunkt ist nicht der Geschmack, sondern die Art des Materials. Fließabsätze bleiben im Blocksatz; kurze Objekte – ein Titel, eine Bildunterschrift, eine Unterschriftszeile, eine Tabellenzelle – werden lokal ausgerichtet. Und die Wahl zwischen Deklaration und Umgebung hängt an einer einzigen Frage: Ist der umgebende vertikale Abstand erwünscht oder nicht? In dieser Reihenfolge entschieden, stellt sich die Frage selten zweimal.

  • In Abbildungen, Tabellenzellen, \parbox und minipage wird mit einer Deklaration wie \centering ausgerichtet; eine Umgebung stapelt ihren \topsep auf ohnehin vorhandenen Abstand.
  • Für eine einzelne herausgestellte Zeile im laufenden Text ist die Umgebung center die natürliche Wahl, denn der Abstand ringsum gehört zum Gewünschten.
  • Für linksbündigen oder rechtsbündigen westlichen Text eignen sich \RaggedRight und \RaggedLeft aus ragged2e besser als die Standardbefehle, weil die Silbentrennung erhalten bleibt.
  • In schmalen Spalten (mehrspaltiger Satz, Marginalien, p-Spalten in tabular) lohnt kein Festhalten am Blocksatz – je kürzer die Zeile, desto klarer gewinnt der Flattersatz.
  • Bei einer Deklaration gehört das Absatzende in die Gruppe. Fehlt darin eine Leerzeile oder ein \end, greift die Ausrichtung entweder nicht oder erfasst Text, der gar nicht gemeint war.
  • Die Leerzeile beendet den Absatz, \\ beendet die Zeile. Wer beides verwechselt, bekommt Underfull \hbox und verschwundene Einzüge zugleich.