Overfull / Underfull \hbox

Overfull \hbox ist eine Warnung, kein Fehler. Der LaTeX-Lauf kommt bis zum Ende, das PDF existiert – nur ragt eine seiner Zeilen über den rechten Rand hinaus. Der erste Schritt besteht deshalb nicht darin, ins Log zu starren, sondern das PDF zu öffnen und sich diese Zeile anzusehen. Von dort aus behandelt diese Seite der Reihe nach: was die Zahl in (71.93637pt too wide) misst, worin sich in paragraph at lines 4--9 und detected at line 3 unterscheiden, an welchem der Parameter \hbadness, \tolerance und \emergencystretch sich zu drehen lohnt, und warum das Beheben einer überfüllten Box und das Stummschalten der Warnung zwei völlig verschiedene Eingriffe sind. Das Spiegelbild Underfull \hbox und die senkrechte Variante Overfull \vbox gehören ebenfalls hierher.

Was die Zahl in (71.93637pt too wide) misst

Um wie viel diese Zeile \hsize, also die Spaltenbreite, überschritten hat, gemessen in Punkt. Ein Punkt entspricht etwa 0,35 mm; ein halber Punkt ist mit bloßem Auge unsichtbar, siebzig Punkt sind eine Daumenbreite, die über das Papier hinausragt. Diese eine Zahl bestimmt die Dringlichkeit – ein paar Punkt bemerkt niemand, weshalb LaTeX unterhalb von 0,1 pt von Haus aus schweigt (\hfuzz=0.1pt). TeX setzt in Kästen, und der Kasten, der die Zeichen einer Zeile nebeneinander hält, ist ein waagerechter Kasten, eine \hbox. Overfull \hbox bedeutet: Beim Umbruch des Absatzes wurde der Inhalt eines Kastens breiter als die Spalte und ließ sich nicht weiter zusammendrücken. Der Grund ist fast immer derselbe – in dieser Zeile gab es keine Stelle zum Umbrechen.

Der zweite Teil der Warnung – etwa in paragraph at lines 4--9 – nennt den Ort des Geschehens. Es gibt vier solcher Formulierungen, und welche erscheint, entscheidet darüber, wo zu suchen ist; die folgende Tabelle hilft beim Einordnen. Jede wurde hier mit einer minimalen Datei unter pdfLaTeX aus TeX Live 2024 nachgestellt. Am unangenehmsten ist has occurred while \output is active, also „während die Seite zusammengebaut wurde“: Das schuldige Material muss zu keiner selbst geschriebenen Zeile gehören. Es gibt auch die umgekehrte Falle: Ein bloßes \mbox{...} oder \makebox[2cm]{...} gibt überhaupt keine Warnung aus, gleich wie weit sein Inhalt hinausragt. Das \hss, mit dem sie auffüllen, lässt sich unbegrenzt zusammenziehen; für TeX passt der Kasten also stets genau, und Zeichen laufen über den Rand, ohne im Log eine Spur zu hinterlassen.

FormulierungBedeutungWo zu suchen ist
in paragraph at lines A--Bbeim Umbruch eines gewöhnlichen Absatzes aufgetretender Absatz von Zeile A bis B – der häufigste Fall
detected at line Nin einem expliziten Kasten fester Breite aufgetreten, nicht in einem Absatzein \hbox to, ein \makebox[…][s], ein von einem Paket gebauter Kasten – in Zeile N
in alignment at lines A--Bin einer Tabellenausrichtung aufgetreteneine breitenbeschränkte Tabelle wie tabular* oder tabularx
while \output is activewährend des Seitenaufbaus aufgetretenKopf-, Fußzeilen, Fußnoten, Gleitobjekte – die Zeilennummer trügt

Das Log zeigt die schuldige Zeile – samt Trennstellen

Direkt unter der Warnung druckt TeX den Inhalt der überstehenden Zeile – mit einem - an jeder gefundenen Trennstelle. Das ist der Kern der Diagnose. Unten steht ein echtes Log aus englischem Text in einer 4 cm breiten Spalte. Wis-senschaft-skol-leg trägt Trennstellen, electroencephalography- dagegen keine einzige: TeX nimmt ein Wort mit explizitem Bindestrich von der automatischen Trennung aus (die Suche endet am expliziten Bindestrich). Diese Zeile hat also wirklich keine Umbruchstelle, und ein noch so hohes \tolerance hilft nicht. Die Trennstellen im Log zeigen auf einen Blick, ob überhaupt getrennt wird oder ob TeX aufgegeben hat – fehlen sie durchgehend, liegt der Verdacht auf einer falschen Spracheinstellung nahe.

log
Overfull \hbox (13.35585pt too wide) in paragraph at lines 4--9
\OT1/cmr/m/n/10 The Wis-senschaft-skol-leg pub-
 []

Overfull \hbox (80.27266pt too wide) in paragraph at lines 4--9
\OT1/cmr/m/n/10 li-ca-tion de-scribes an electroencephalography-
 []

Wer die Stelle im PDF sehen möchte, ergänzt die Klassenoption draft. In article.cls steht \DeclareOption{draft}{\setlength\overfullrule{5pt}}, was neben jeder überstehenden Zeile eine 5 pt breite schwarze Linie in den Rand setzt. Dass diese Balken sonst fehlen, liegt daran, dass latex.ltx zum Schluss \overfullrule 0pt ausführt und damit den INITEX-Standardwert von 5 pt aufhebt. Die Balken sind also nur abgeschaltet und jederzeit wieder einschaltbar: Wer die Klassenoptionen nicht anrühren will, schreibt \overfullrule=5pt direkt in die Präambel – und entfernt es vor der Abgabe wieder.

Warum schmale Spalten, Tabellen und Code die meisten überfüllten Boxen erzeugen

Weil die relative Länge eines untrennbaren Wortes umso verhängnisvoller wird, je schmaler die Spalte ist. In einer 10 cm breiten Spalte belegt ein 3 cm langes Wort ein Drittel der Zeile; in einer 4 cm breiten Spalte ist es länger als die Zeile, und keine Umbruchwahl hält es im Satzspiegel. Springt dasselbe Manuskript beim Wechsel auf zwei Spalten von einer Handvoll Warnungen auf Dutzende, ist nicht der Text schlechter geworden – das Maß hat sich halbiert. An den folgenden Stellen häufen sich überfüllte Kästen; kommt eine davon bekannt vor, dort beginnen. Die Spalte als Ursache zu erkennen ändert das Mittel: Die Breite einer p{}-Spalte zu überdenken geht oft schneller, als \sloppy über Absätze zu streuen.

  • Zweispaltiger Satz (\documentclass[twocolumn], multicol). Das Maß halbiert sich ungefähr, und Wörter, die einspaltig unauffällig waren, laufen alle zugleich über.
  • p{}-, m{}- und b{}-Tabellenspalten sowie tabularx. Die Spaltenbreiten sind selbst gewählte Zahlen und oft zu knapp für ihren Inhalt.
  • Wörtliche Umgebungen (verbatim, \verb, listings). Leerzeichen und Zeilenenden bleiben genau erhalten, TeX hat keinerlei Umbruchfreiheit.
  • URLs, DOIs, Dateipfade, Typennummern, chemische Namen, Gennamen. Eine lange Zeichenkette ohne Leerzeichen zählt als ein einziges Wort.
  • Formeln im Fließtext. Standardmäßig darf eine Formel nur hinter einem binären Operator oder einer Relation umbrechen, innerhalb von \frac und Ähnlichem gar nicht.
  • Fußnoten und Gleitobjekt-Bildunterschriften. Sie werden mitunter schmaler als der Text gesetzt und erscheinen bevorzugt in der Form \output is active.

Eine überfüllte hbox beseitigen – die beste Lösung zuerst

Eine Formulierung umzuschreiben ist die beste Lösung. Das klingt unspektakulär, ist aber die einzige Abhilfe, die keine Software liefern kann, und sie dauert meist fünf Sekunden: ein langes Wort durch ein kürzeres Synonym ersetzen, einen Satzteil umstellen, eine lange Typennummer in eine Fußnote verschieben – schon passt der Kasten. Dass dies an erster Stelle steht, hat einen Grund: TeX bricht Zeilen um, indem es den ganzen Absatz auf einmal betrachtet, nach einem Algorithmus, den Knuth und Michael Plass 1981 in Breaking Paragraphs into Lines veröffentlicht haben. Das letzte Wort eines Absatzes zu ändern kann daher den Umbruch der ersten Zeile verändern. Umgekehrt erweitert ein einziges vom Autor verschobenes Wort den Spielraum des Satzes erheblich. Die folgenden Mittel sind nach Wirkung gegen Nebenwirkung geordnet.

  • Umformulieren. Meist genügt ein Wort, und es gibt keinerlei Nebenwirkungen. Lange Typennummern und Produktnamen gehören in eine Fußnote oder Tabelle.
  • Die Sprache prüfen. Deutscher oder französischer Fließtext mit englischen Trennmustern findet keine Umbruchstelle. Mit babel: \usepackage[ngerman]{babel}; unter XeLaTeX oder LuaLaTeX: \setmainlanguage{german} aus polyglossia.
  • Genau dieses Wort trennbar machen. \- im Wort setzt einen bedingten Trennstrich, \hyphenation{Wis-sen-schafts-kol-leg} trägt in der Präambel eine Ausnahme ein. Bei einem Kompositum mit explizitem Bindestrich schafft ein \hspace{0pt} hinter dem Bindestrich wieder eine Umbruchmöglichkeit.
  • \sloppy oder die Umgebung sloppypar. Lockert die Wortabstände des Absatzes. sloppypar ist die sicherere Variante, weil sie bei \end wieder endet.
  • \emergencystretch erhöhen. Im Test hier machte allein \emergencystretch=3em aus fünf überfüllten Kästen null – um den Preis von sieben unterfüllten. Die Nebenwirkung sind lockere Wortabstände, weit weniger auffällig als Text, der über die Seite hinausragt.
  • microtype laden. Dezentes Hervortreten und Font-Expansion senkten den Überstand im selben Test von 13,4 pt auf 8,9 pt und von 80,3 pt auf 74,9 pt. Es verringert also, es beseitigt nicht.
  • Als letztes Mittel \linebreak oder \mbox. Umbruch von Hand. Jede spätere Änderung am Satz verschiebt die Stelle, daher nur für den letzten Durchgang vor der Abgabe.

Die Aufgabenteilung von \tolerance, \emergencystretch, \hbadness und \hfuzz

Die ersten beiden ändern den Satz, die letzten beiden nur die Meldungen. Wer das verwechselt, „behebt“ ein Problem, das er bloß versteckt hat: Ein größeres \hfuzz lässt die Überfüllt-Meldungen verschwinden, aber kein einziges Zeichen bewegt sich auf der Seite. TeX bricht einen Absatz in bis zu drei Durchgängen um – zuerst innerhalb von \pretolerance und ohne Trennung, dann innerhalb von \tolerance mit Trennung, und falls das misslingt, in einem dritten Durchgang, bei dem jeder Zeile \emergencystretch an zusätzlicher Dehnbarkeit zugestanden wird. Genau dort wirkt \emergencystretch: als letzte Karte, wenn nichts anderes half. Die LaTeX-Voreinstellungen stehen in latex.ltx als \tolerance=200, \hbadness=1000 und \hfuzz=0.1pt. Das viel benutzte \sloppy steht in derselben Datei und besteht aus nur vier Zuweisungen: \tolerance 9999, \emergencystretch 3em, \hfuzz .5pt, \vfuzz\hfuzz. \sloppy heißt also nicht bloß „Toleranz hoch“ – es setzt auch \emergencystretch, und im Test oben lieferte \emergencystretch=3em allein dasselbe Ergebnis wie \sloppy.

ParameterLaTeX-VorgabeWirkung
\tolerance200die höchste zulässige Schlechtigkeit einer Zeile; Erhöhen ändert den Satz
\emergencystretch0ptzusätzliche Dehnbarkeit, nur im dritten Durchgang; ändert den Satz
\hbadness1000nur schlechtere Zeilen werden als underfull gemeldet. Ausgabe unverändert
\hfuzz0.1ptein Überstand bis zu diesem Maß wird nicht gemeldet. Ausgabe unverändert
\overfullrule0ptBreite der schwarzen Linie neben einer überfüllten Zeile; draft setzt 5pt
preamble
% changes the typesetting -- use these to actually fix boxes
\emergencystretch=3em     % last-resort stretch on the third pass
\usepackage{microtype}    % protrusion and font expansion

% changes only the log -- the page looks exactly the same
\hbadness=10000           % never report Underfull \hbox
\hfuzz=1pt                % ignore overhangs below 1pt

Wenn eine lange URL oder ein Codestring nicht umbrechen will

Es in \url{} zu setzen genügt oft nicht. In einer 5 cm breiten Spalte gemessen, ragte eine lange URL als bloßer Text um 79,0 pt hinaus; in \url{} aus dem Paket url blieben immer noch zwei Kästen von 42,4 pt und 10,8 pt. \url{} bricht nur hinter Zeichen wie / und . um und kann daher nicht innerhalb eines Hostnamens oder eines langen Pfadstücks trennen. Zwei Dinge helfen. Ergänztes \sloppy brachte die Zahl der überfüllten Kästen auf null, dafür traten unterfüllte auf – die lockeren Wortabstände, die \sloppy stets mitbringt, sind der Preis. Noch besser: \usepackage{xurl} ergab null überfüllte und null unterfüllte Kästen, denn xurl erlaubt einen Umbruch an jeder Stelle einer URL. hyperref lädt url intern, verhält sich beim Umbruch also gleich; damit ein Link selbst geteilt werden darf, braucht es die Option breaklinks. Bei Codelistings ist breaklines=true in listings der entsprechende Schalter.

preamble
\usepackage{hyperref}   % loads url internally; add breaklinks for split links
\usepackage{xurl}       % allows a break at any point inside a URL
...
\url{https://example.org/proceedings/vol12/paper-0037.pdf}

Underfull \hbox (badness N) ist das umgekehrte Symptom

Eine Zeile geriet zu kurz, und TeX dehnte die Wortabstände, um sie zu füllen – das ist Underfull \hbox. Es ist der weniger dringende der beiden Fälle, und der badness-Wert sagt, wie schlimm es steht. Badness reicht von 0 (perfekt) bis 10000 (die Obergrenze: „schlimmer geht nicht“). Zwischenwerte wie 1590, 2050 oder 7667 kommen durchaus vor, doch eine Reihe von badness 10000 bedeutet sichtbar klaffende Abstände – dann lohnt der Blick ins PDF. Die übliche Ursache ist eine Nebenwirkung der Jagd auf überfüllte Kästen: \sloppy oder \emergencystretch verwandelt overfull in underfull (im obigen Test fünf auf null, dafür sieben unterfüllte). Die andere Ursache ist eine mitten im Absatz erzwungene kurze Zeile durch \linebreak oder \\. \linebreak heißt „hier umbrechen, aber die Zeilenbreite trotzdem füllen“, weshalb die Abstände wachsen; \newline und \\ heißen „die Zeile endet hier“ und tun das nicht. Für eine bewusst kurze Zeile also \\ verwenden. Wer nur die Meldung loswerden will, schaltet sie mit \hbadness=10000 ab – an der Seite ändert sich dabei nichts.

Overfull \vbox (… too high) und Underfull \vbox

Dieselbe Geschichte gibt es senkrecht, mit Höhe statt Breite. Overfull \vbox (56.90552pt too high) heißt, dass der Inhalt nicht in einen senkrechten Kasten fester Höhe passte. Im Test meldet ein expliziter Kasten wie \vbox to 1cm{\hrule height 3cm} dies als detected at line 3. Die Form, der man in echten Dokumenten begegnet, stammt vom Seitenaufbau: Eine Abbildung oder ein \rule, höher als \textheight, ergab Overfull \vbox (85.35828pt too high) has occurred while \output is active. Der erste Verdacht lautet dann: eine Abbildung, die auf einer Seite nicht Platz findet. Underfull \vbox (badness 10000) ist der umgekehrte Fall – senkrechter Leim wurde gedehnt, um die Höhe zu füllen. Unter \flushbottom, der Vorgabe der Klasse book, wird der Seitenfuß durch Dehnen senkrechter Abstände ausgerichtet, weshalb dünn gefüllte Seiten die Meldung leicht auslösen. Wen das nicht stört, wechselt zu \raggedbottom oder hebt die Meldeschwellen mit \vbadness und \vfuzz – auch hier gilt: eine höhere Schwelle ändert nichts an der Seite. Passt eine Abbildung wirklich nicht, kann \enlargethispage den Satzspiegel für genau diese Seite verlängern.