Zeilenumbrüche feinsteuern

Die erste Zeile von hyphen.tex, die mit TeX Live 2024 ausgeliefert wird, ist ein Ausruf: The Plain TeX hyphenation tables [NOT TO BE CHANGED IN ANY WAY!]. Die Datei enthält die 4447 Muster, die LaTeX bei jedem Zeilenumbruch befragt, und am Ende steht eine handgeschriebene Ausnahmeliste von gerade einmal vierzehn Wörtern. Zwei davon — present und project — tragen überhaupt keine Trennstellen, weil jedes je nach Aussprache ein anderes Wort ist und TeX nicht wissen kann, welches gemeint war. Zeilenumbrüche abzustimmen heißt, genau dieses Urteil im eigenen Manuskript noch einmal zu fällen. Diese Seite behandelt \\, \newline, \linebreak[n], \nolinebreak[n], den bedingten Trennstrich \-, \hyphenation{...}, das Paket hyphenat und die sprachabhängigen Trennmuster von babel — mit gemessenen statt nachgeplapperten Zahlen.

Zuerst eine Abgrenzung. Einen neuen Absatz zu beginnen (mit einer Leerzeile oder \par) ist das eine; zu verschieben, wo innerhalb eines Absatzes die Zeilen umbrechen, das andere. Das erste bringt Einzug und Absatzabstand mit sich, das zweite verschiebt nur die Zeilenenden innerhalb eines einzigen Absatzes. Darüber liegt eine dritte Ebene — die Gestaltung des Seitenrhythmus, die Welt von \widowpenalty und \raggedbottom —, und die gehört auf die Seite zum Seitenumbruch. Auch \looseness, die Bitte um einen Absatz mit einer Zeile weniger oder mehr, ist dort samt Messung untergebracht. Diese Seite behandelt ausschließlich die Ebene der Zeilen.

\\ und \newline: dasselbe Makro, andere Tür

\newline ist als \@normalcr\relax definiert, und \\ ist dasselbe Makro ohne dieses \relax (latex.ltx). Dieses eine Token ist der ganze Unterschied. \\ sucht anschließend nach einem folgenden * oder [Länge]; \newline wird vom \relax gestoppt und sucht gar nicht erst. Setzt man Alpha\newline[2ex] Beta, erscheint auf der Seite tatsächlich ein wörtliches [2ex]. \\[2ex] dagegen fügt nach der Zeile 2ex vertikalen Abstand ein, und \\* verbietet dort einen Seitenumbruch. Praktisch heißt das: \\, wenn die Optionen gebraucht werden, \newline, wenn die Absicht im Quelltext lesbar bleiben soll.

Gemeinsam ist beiden, dass sie die Zeile beenden, ohne sie zu dehnen. Der Rumpf lautet \unskip … \nobreak \hfil \break: Rechts wird ein unendlich dehnbares \hfil gesetzt, und erst danach wird umgebrochen. Dieses \hfil schluckt den gesamten Spielraum, die Zeile bleibt also auf ihrer natürlichen Länge stehen und damit kurz. Genau deshalb eignen sie sich für Adressen und Verse, bei denen jede Zeile dort enden soll, wo man es will. Eine Nebenwirkung gibt es. Ein \\ ganz am Absatzende erzeugt eine leere Schlusszeile und meldet Underfull \hbox (badness 10000) in paragraph at lines 6--7. Ein Absatz braucht kein abschließendes \\ — und die Zeile direkt nach einer Überschrift ebenso wenig. An einer Stelle, an der es gar keine Zeile zu beenden gibt (etwa am Absatzanfang), erscheint stattdessen ! LaTeX Error: There's no line here to end.

latex
% \\ and \newline end the line short; \linebreak justifies it to the margin.
First road is steep\\
second road is gentle.

% \\ takes an optional length and a star; \newline takes neither.
Alpha\\[2ex] Beta        % 2ex of vertical space after the line
Alpha\\*    Gamma        % no page break allowed here
Alpha\newline[2ex] Delta % prints a literal [2ex] on the page

% A trailing \\ at the end of a paragraph produces
%   Underfull \hbox (badness 10000) in paragraph at lines 6--7
This paragraph does not need one.

In Tabellen trennen sich die beiden Rollen sauber. In einer absatzbildenden Zelle wie einer p{...}-Spalte von tabular bricht \newline nur innerhalb dieser Zelle um, während \\ die ganze Zeile beendet. Eine Adresse zweizeilig in einer Zelle? Das ist \newline. Gemessen: Line one\newline Line two in einer p{3cm}-Zelle stapelt zwei Zeilen innerhalb derselben Tabellenzeile, und die Zelle rechts daneben bleibt, wo sie ist. Auch in der array-Umgebung trennt \\ die Zeilen. Wird \newline dagegen in einer nicht absatzbildenden Spalte wie l oder c verwendet, gibt es keine Zeile zu beenden — es erscheint der obige Fehler.

Welche Zahl hinter dem n von \linebreak[n] und \nolinebreak[n] steckt

n läuft von 0 bis 4 und übersetzt sich in die Penalties 0, 51, 151, 301 und 10000. \@getpen in latex.ltx liefert 0 / \@lowpenalty / \@medpenalty / \@highpenalty / \@M, und in den Standardklassen sind diese drei in article.cls in den Zeilen 118–120 auf 51, 151 und 301 gesetzt. \linebreak[n] trägt den Wert negativ ein — hier zu brechen wird belohnt —, \nolinebreak[n] positiv — hier zu brechen kostet. Ohne Argument gilt bei beiden 4, also ∓10000, die Unendlichkeit von TeX. Mit den Zahlen vor Augen ist die Wahl klar: die 51 hinter [1] ist ein Flüstern, das die Badness gewöhnlichen Fließtextes mühelos überstimmt, [3] mit 301 widerspricht zum ersten Mal, und nur [4] ist ein Befehl.

Argumentlinebreak setztnolinebreak setztTatsächliche Stärke
[0]00nur eine erlaubte Umbruchstelle, ohne Kosten
[1]-5151ein Flüstern; die Badness des Fließtexts gewinnt
[2]-151151etwa das Gewicht des voreingestellten \widowpenalty
[3]-301301der erste Wert, der widerspricht
[4]-1000010000Voreinstellung; unendlich, also ein Befehl

\linebreak und \\ erzeugen denselben Umbruch, aber gegenteilige Ergebnisse. \linebreak setzt nur eine Penalty, die Zeile wird also wie üblich im Blocksatz bis zum rechten Rand gedehnt — daher die klaffenden Wortabstände. \\ schluckt den Spielraum mit jenem \hfil und bleibt kurz. Die Merkregel: \\ für kurz umbrechen, \linebreak für Blocksatz bis zum Rand. Im Detail entfernt \@no@lnbk die vorangehende Glue mit \unskip, setzt die Penalty und stellt danach eine Glue derselben Breite wieder her — word\linebreak word bekommt also keinen doppelten Zwischenraum.

Hier nicht umbrechen: das Band ~ und was \mbox kostet

Geht es nur darum, ein einzelnes Leerzeichen zu schützen, ist die Tilde ~ die erste Wahl. Sie ist so breit wie ein gewöhnlicher Wortzwischenraum; der einzige Unterschied ist, dass dort keine Zeile umbrechen darf. Zu verwenden überall dort, wo ein Wort nicht von einer Zahl oder einem Zeichen getrennt werden darf: Fig.~3, Dr.~Smith, Chapter~12, equation~\ref{eq:1}. Entscheidend ist, dass ~ die Silbentrennung der umgebenden Wörter nicht verhindert. Es läuft auf \nobreak plus Leerzeichen hinaus — eine unendliche Penalty (\nobreak ist \penalty10000) an genau dieser Stelle —, die Wörter selbst bleiben also frei trennbar. Für abgestufte Stärke gibt es \nolinebreak[n], für ein glattes Verbot das systemnahe \nobreak.

\mbox{...} ist etwas anderes. Es packt seinen Inhalt in eine einzige Box, das Material kann also weder über Zeilen umbrechen noch getrennt werden. Für eine kurze, nicht zu teilende Wendung wie T-34 ist das richtig, aber es hat seinen Preis. Gemessen: In einer 4,2 cm breiten minipage passt dichlorodiphenyltrichloroethane von allein hinein; in \mbox{...} gesetzt meldet es Overfull \hbox (18.8814pt too wide) und ragt 18,88 pt über den rechten Rand hinaus. Lange URLs oder Chemikaliennamen in \mbox einzufrieren ist eine Medizin, die schlimmer ist als die Krankheit. Der trennstellenlose Eintrag in \hyphenation{...} und \nohyphens{...} aus hyphenat — beide unten — schalten die Trennung ab, ohne eine Box zu bauen.

Trennstellen mit \- hinzufügen: nicht „auch hier“, sondern „nur hier“

Fügt man auch nur ein einziges \- in ein Wort ein, trennt LaTeX es ausschließlich an den markierten Stellen und nie an denen, die es selbst gefunden hätte. Alle aus den Mustern abgeleiteten Kandidaten verschwinden. \showhyphens zeigt das unmissverständlich: Unangetastet bricht supercalifragilistic an fünf Stellen, su-per-cal-ifrag-ilis-tic; schreibt man super\-califragilistic, bleibt allein super-califragilistic übrig. Ebenso wird aus hy-phen-ation schlicht hyphen-ation, sobald hyphen\-ation im Quelltext steht. \- ersetzt die Kandidatenliste also, statt sie zu ergänzen — jede gewünschte Trennstelle muss ausgeschrieben werden. Und \- erzwingt keinen Umbruch; es sagt nur: „wenn getrennt wird, dann an einer von diesen Stellen“.

latex
% Ask TeX where it would break, and read the answer in the .log:
%   [] \T1/cmr/m/n/10 su-per-cal-ifrag-ilis-tic
\showhyphens{supercalifragilistic}
%   [] \T1/cmr/m/n/10 super-califragilistic   <- one \- killed the other four
\showhyphens{super\-califragilistic}

% So spell out every break point you actually want:
super\-cali\-fragi\-listic

Warum die zweite Hälfte von long-standing nicht bricht: \hyp aus hyphenat

Weil dieselbe Regel für einen gewöhnlichen, selbst getippten Bindestrich gilt. Mit \showhyphens nachgeprüft: longstanding zerfällt dreifach in long-stand-ing; schreibt man long-standing, bleibt nur noch long-standing — allein der getippte Bindestrich überlebt, stand-ing ist weg. Jedes Kompositum verhält sich so: well-known, X-ray, state-of-the-art. Diese Regel ist der Grund, warum der Satz plötzlich schwierig wird, sobald ein langes Kompositum ans Zeilenende gerät. Abhilfe schafft \hyp aus dem Paket hyphenat. Schreibt man long\hyp standing, ergibt die Messung wieder long-stand-ing: Der Bindestrich sieht unverändert aus, die aus den Mustern gewonnenen Kandidaten leben jedoch wieder auf.

hyphenat bringt außerdem einen Ersatz für \mbox mit. \nohyphens{...} ist eine einzeilige Definition, die innerhalb der Gruppe schlicht \language auf eine Sprache ohne Muster umstellt. Gemessen liefert \nohyphens{supercalifragilistic} null Kandidaten. Da keine Box entsteht, darf vor und nach dem Wort weiterhin umgebrochen werden — kein Überstand von 18 pt wie bei \mbox. Im selben Geist verwandeln \bshyp, \fshyp, \dothyp und \colonhyp die Zeichen \, /, . und : in URLs und Pfaden in umbruchfähige Zeichen, und die Paketoption [none] stellt die Silbentrennung dokumentweit mit nur zwei Zuweisungen ab: \hyphenpenalty=10000\exhyphenpenalty=10000.

latex
\usepackage{hyphenat}

% A plain "-" kills the rest of the word:  long-standing
% \hyp prints the same hyphen and keeps the patterns: long-stand-ing
long\hyp standing, well\hyp known, state\hyp of\hyp the\hyp art

% No hyphens in this word, but the line may still break around it.
% Unlike \mbox this cannot overflow the margin.
\nohyphens{supercalifragilistic}

% Breakable punctuation for URLs and paths:
https:\fshyp\fshyp example\dothyp com\fshyp very\fshyp long\fshyp path

Wenn \hyphenation{...} nichts bewirkt: Akzente, Flexionsformen, Großbuchstaben

Kehrt dasselbe Wort immer wieder, registriert man die Ausnahme einmal in der Präambel, statt den Text zu verschmutzen. Die Syntax ist genau die, die Knuth am Ende von hyphen.tex verwendet: Wörter mit durch Bindestriche markierten Trennstellen in \hyphenation{...} auflisten. Der Mechanismus hat eine Verwendung, die die Syntax nicht verrät: Trägt man ein Wort ganz ohne Bindestriche ein, wird es nie wieder getrennt. Gemessen: Nach \hyphenation{fortran} meldet \showhyphens{fortran} null Kandidaten. Genau deshalb stehen present und project ohne eine einzige Trennstelle in Knuths Ausnahmeliste. Anders als \mbox entsteht dabei keine Box, es kann also nichts über den Rand hinauslaufen.

Drei Gründe für das Scheitern, alle gemessen. Erstens Akzente. Unter OT1 — der voreingestellten Fontkodierung — bricht \hyphenation{r\'e-sum\'e} mit ! Improper \hyphenation will be flushed. ab, denn ein akzentuiertes Zeichen wird in OT1 mit \accent zusammengesetzt und ist kein Buchstabe. Mit \usepackage[T1]{fontenc} wird daraus eine einzelne Glyphe, und dieselbe Zeile läuft kommentarlos durch. Zweitens exakte Übereinstimmung. Nach \hyphenation{hyphena-tion} trennt hyphenation brav als hyphena-tion, der Plural hyphenations verfehlt die Ausnahme jedoch vollständig und fällt auf die Muster zurück: hy-phen-ations. Flexionsformen brauchen eigene Einträge. Drittens: Groß- und Kleinschreibung spielt keine Rolle. TeX setzt vor dem Abgleich über \lccode alles auf Kleinbuchstaben, der einzige Eintrag For-tran ließ daher FORTRAN, Fortran und fortran gleichermaßen als FOR-TRAN, For-tran und for-tran trennen.

latex
\usepackage[T1]{fontenc}   % without this, an accent in \hyphenation errors:
                           % ! Improper \hyphenation will be flushed.

\hyphenation{% one entry per inflected form; case does not matter
  hyphena-tion  hyphena-tions
  r\'e-sum\'e
  fortran                 % no hyphens = never break this word
}

Sprachabhängige Trennmuster in babel: Wissenschaft bricht auf zwei Arten

Trennmuster gelten je Sprache, und ein Wechsel von \language lässt dasselbe Wort an anderer Stelle brechen. Die Messung sagt alles. Nach \usepackage[english,ngerman]{babel} steht \language auf 36 (ngerman); \showhyphens{Wissenschaft Wahrscheinlichkeit} liefert dann korrekt Wis-sen-schaft Wahr-schein-lich-keit. Wechselt man zu \selectlanguage{english} (\language 0), erscheinen dieselben Wörter als Wis-senschaft Wahrschein-lichkeit — für das Deutsche falsch. Umgekehrt ebenso: Englisch unter deutschen Mustern gesetzt, wird aus typesetting ein ty-pe-set-ting. Eine ohne babel geschriebene deutsche Arbeit wirkt meist genau deshalb auf subtile Weise unsauber.

Daraus folgt unmittelbar: Auch die Ausnahmeliste von \hyphenation{...} wird je \language geführt und gilt daher nur für die Sprache, die bei der Deklaration aktiv war. Gemessen: Nach \usepackage[english,ngerman]{babel} sorgt ein \hyphenation{Wiss-en-schaft} in der Präambel dafür, dass das Wort im ngerman-Text wie angegeben als Wiss-en-schaft bricht — direkt nach \selectlanguage{english} ist die Ausnahme jedoch unsichtbar, und die englischen Muster liefern wieder Wis-senschaft. In mehrsprachigen Dokumenten gilt daher ausnahmslos: Ausnahmen erst deklarieren, nachdem die zugehörige Sprache ausgewählt wurde. Japanisch kennt Silbentrennung in diesem Sinne nicht; \- und \hyphenation sind Werkzeuge für die westsprachigen Teile eines Dokuments.

latex
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}

% Exceptions belong to the language that is current when they are declared.
% Select the language first, then declare.
\selectlanguage{ngerman}
\hyphenation{Wiss-en-schaft}
\selectlanguage{english}
\hyphenation{hyphena-tion hyphena-tions}

% Check the result rather than guessing:
%   ngerman -> Wis-sen-schaft   english -> Wis-senschaft
\showhyphens{Wissenschaft}
BefehlRolleDehnt die Zeile?
\\ , \newlineZeilenumbruch erzwingen (kein Absatzumbruch); nur \\ nimmt [Länge] und *Nein – \hfil schluckt den Spielraum, die Zeile bleibt kurz
\linebreak[n]Setzt Penalty −(0/51/151/301/10000); Voreinstellung n=4Ja – die Zeile wird bis zum rechten Rand ausgeglichen
\nolinebreak[n]Setzt Penalty +(0/51/151/301/10000); n=4 verbietet vollständig
~Geschütztes Wortzwischenraum; Silbentrennung bleibt erlaubt
\mbox{...}Eine Box; kein Umbruch, keine Trennung – häufige Ursache überfüllter Boxen
\-Bedingter Trennstrich; das Wort bricht dann nur an den Markierungen
\hyphyphenat; druckt den Bindestrich und lässt das übrige Wort trennbar
\nohyphens{...}hyphenat; unterdrückt nur die Trennung – keine Box, kein Überstand
\hyphenation{...}Ausnahmeliste in der Präambel; exakter Abgleich, ohne Groß-/Kleinschreibung, je \language
\showhyphens{...}Diagnose: schreibt die aktuellen Trennstellen des Worts ins .log

Reihenfolge beim Beheben von Umbruchwarnungen: Gewalt zuletzt

Die schlechteste aller Korrekturen ist, dort ein \\ einzusetzen, wo die Warnung erschien. TeX optimiert den Zeilenumbruch über den gesamten Absatz; wer eine Zeile festnagelt, verändert die Verteilung des Restes und zerlegt eine andere. Die Reihenfolge lautet: Text umformulieren, dann Trennmöglichkeiten ergänzen, dann mit ~ oder \nolinebreak lokal verbieten und erst zuletzt die Toleranz des Absatzes lockern. Diese letzte Stufe — \tolerance, \emergencystretch, \sloppy (mit \fussy als Rückkehr zur Voreinstellung) und das Lesen eines Overfull \hbox — gehört zur Seite über überfüllte Boxen, wo \sloppy als nicht mehr als vier Zuweisungen nachgemessen ist. Auch das minimale Dehnen der Glyphen durch microtype findet sich dort.

  • Zuerst die langen Wörter, URLs und Chemikaliennamen zusammensuchen. Durch \showhyphens{...} schicken und prüfen, ob sie überhaupt Trennstellen besitzen.
  • Fachbegriffen einen Eintrag in \hyphenation{...} geben. Je Flexionsform einen, in mehrsprachigen Dokumenten nach \selectlanguage notiert.
  • \- für das eine verbleibende Wort aufheben. Ein einziges löscht alle anderen Kandidaten dieses Wortes.
  • Namen, Nummern und Einheiten mit ~ binden. \mbox bleibt kurzen Wendungen vorbehalten, die wirklich nicht geteilt werden dürfen.
  • In mehrsprachigen Dokumenten immer babel laden. Ohne Sprachumschaltung bricht eine der Sprachen dauerhaft an den falschen Stellen.