9
2

Im der log-datei sehe ich immer wieder

Underfull \hbox (badness ...)

oder

Overfull \hbox (...pt too wide) in paragraph

Was bedeuten die Warnungen? Soll ich was dagegen unternehmen? Und wenn ja: was?

gefragt 10 Jun '13, 06:33

Clemens's gravatar image

Clemens
15.5k112859
Akzeptiert: 73%

bearbeitet 25 Sep '13, 12:57

saputello's gravatar image

saputello
15.4k11645


Diese Antwort besteht aus einem mehr oder weniger wörtlichen Zitat aus dem LaTeX Begleiter.

Was bedeuten die Warnungen?

Overfull \hbox (<number>pt too wide) <somewhere>

TeX wurde gezwungen, eine horizontale Box in einer bestimmten Breite zu erzeugen (z.B. für eine Zeile in einem Absatz oder einem \makebox-Befehl). Dabei war es nicht möglich, das vorhandene Material auf die vorgegebene Breite zu reduzieren, selbst nachdem der gesamte verfügbare Freiraum so weit wie möglich gestaucht worden war. Daher wird das betreffende Material rechts in den Rand hineinragen. Meistens ist das recht auffällig, auch wenn es sich nur um einen geringen Überlauf handelt. Dieses Problem muss manuell behoben werden, da TeX es nicht lösen konnte. [...]

Underfull \hbox (badness <number>) <somewhere>

TeX war gezwungen, eine horizontale Box (z.B. für eine Absatzzeile oder einen \makebox-Befehl) mit einer bestimmten Breite zu erzeugen. Dabei musste der Weißraum in dieser Box über das vorgegebene Maß hinaus gedehnt werden. Das heißt, die Dehnung betrug an den erweiterbaren Abständen mehr als 100% der verfügbaren plus-Zugaben. Intern wird das durch einen Badness-Grad ausgedrückt. Ein Grad von 800 bedeutet, dass der Weißraum auf mehr als das Doppelte des erlaubten Wertes gedehnt werden musstre, um die erforderliche Breite zu erreichen. (Die genaue Formel lautet min(100r²,10000), wobei r das Verhältnis von „verwendeter Dehnung“ zu „verfügbarer Dehnung“ ist. Wenn [...] unbegrenzt dehnbarer Abstand vorhanden ist [...], beträgt der Badness-Grad 0.)

Ob eine solche unzureichend gefüllte Box tatsächlich ein merkliches Problem darstellt, muss man gegebenenfalls im erzeugten Dokument visuell prüfen. Bei einem Badness-Grad von 10000 kann die Box beliebig hässlich aussehen. Da der TeX-Wert für unendlich mit 10000 recht niedrig liegt, kann es vorkommen, dass eine einzelne extrem leere Zeile in Kauf genommen wurde, obwohl auch mehrere nicht gut gefüllte, aber doch noch akzeptable Zeilen möglich gewesen wären. In einem solchen Fall kann sich der Längenparameter \emergencystrech als hilfreich erweisen.

Ab welchem Badness-Grad eine solche Warnung erfolgt, wird mithilfe des ganzzahligen Parameters \hbadness gesteuert. In LaTeX ist der Wert 1000 voreingestellt, so dass nur vor wirklich unschönen Boxen gewarnt wird. Bei einem wichtigen Dokument kann man durchaus einen anspruchsvolleren Wert wie etwa \hbadness=10 testen, um zu sehen, wie viele Zeilen TeX wirklich als unausgewogen erachtet.

Da die Warnung direkt von TeX erzeugt wird, meldet sie übrigens immer eine \hbox, egal welcher Boxbefehl tatsächlich im Dokument verwendet wurde. Der Ort, an dem das Problem aufgetreten ist, wird mit <somewhere> angegeben und kann eine der folgenden vier Möglichkeiten sein:

  • detected at line <line number>: Das Problem ist eine explizit konstruierte Box (sie endet im Quelltext in Zeile <line number>). es kann sich beispielsweise um einen \makebox-befehl mit einem expliziten Argument für die Breite handeln oder um einen anderen LaTeX-Befehl, der Boxen erzeugt.
  • has occurred while \output is active: TeX war gerade damit beschäftigt, eine Seite aufzubauen, und stieß beim Hinzufügen lebender Kolumnentitel und ähnlichem auf das Problem. Da dieser Prozess asynchron verläuft, wird keine Zeilennummer genannt. Ein Blick auf die Seite, die am nächsten lag, als die Warnung ausgegeben wurde, zeigt, ob hier manuell korrigiert werden muss.
  • in alignment at lines <line numbers>: Die Box gehört zu einer tabular- oder einer ausgerichteten Formelumgebung. Die <line numbers> geben die Position der gesamten ausgerichteten Struktur im Quelldokument an, da TeX zu dem Zeitpunkt, an dem es auf das Problem stößt, bereits keine Möglichkeit mehr hat, dessen Ursprungsort genauer festzustellen.
  • in paragraph at lines <line numbers>: Die „Underfull Box“ ist eine unausgewogene Zeile im genannten Absatz (bei den angegebenen <line numbers> im Quelldokument). Die zusätzliche symbolische Anzeige der fraglichen Zeile sollte dabei helfen, den genauen Ursprung des Problems ausfindig zu machen.

Diagnose

Für den Fall, dass TeX Zeilenumbrüche in einem Absatz nicht in geeigneter Weise anordnen kann, lässt das Programm als letztes Mittel ein oder mehrere „überlaufende“ zeilen zu. Jede dieser Zeilen erzeugt eine Warnung wie die folgende [...]:

Open in writeLaTeX
Overfull \hbox (6.762pt too wide) in paragraph at lines 4267--4285
/hlhr8t@8.50006pt/Hier wer-den die Text-zei-le und die
Zei-len-num-mern des Ab-sat-zes, der sie enthält,

Hier werden die Textzeile und die Zeilennummern des Absatzes, der sie enthält symbolisch dargestellt. Durch einen Blick auf die symbolische Darstellung findet man leicht heraus, dass sich das Problem ergibt, weil TeX das Wort „enthält“ nicht trennen kann [Anm: Im Begleiter wird dies übervolle Box, die diese Warnung erzeugte, direkt ausgegeben und erwähnt, dass die Autoren TeX explizit daran hinderten, „enthält“ zu trennen. Es wäre dazu sonst durchaus in der Lage]. Damit solche Zeilen im Dokument extra gekennzeichnet werden, muss man den Parameter \overfullrule auf einen positiven Wert setzen. [...] dadurch erzeugt er den schwarzen Tintenklecks, der die überlaufende Zeile deutlich hervorhebt. In den Standarddokumentenklassen lässt sich dieses Verhalten durch die Option draft aktivieren. Andererseits kann es sein, dass man nur gering überlaufende Zeilen nicht als störend ansieht. in diesem Fall kann man den auf 0.1pt voreingestellten Parameter \hfuzz ändern; es werden nur Zeilen gemeldet, die um mehr als den Wert dieses Parameters in den Rand hineinragen.

Lösungsansätze

Die Wortzwischenräume in bündig formatierten Absätzen (die Leerräume zwischen den einzelnen Wörtern) werden durch verschiedene Parameter gesteuert. Die wichtigsten davon sind \tolerance und \emergencystretch. Wenn diese Parameter richtig eingestellt sind, kann man alle oder zumindest fast alle „Overfull box“-Warnungen vermeiden, ohne dass die Zeilen manuell umbrochen werden müssen. Der Parameter \tolerance gibt an, wie stark Wortzwischenräume in einem Absatz von ihrer optimalen Größe abweichen dürfen. (Die optimale Größe ist Font-abhängig.) Dieser Befehl ist ein TeX-Zähler (kein LaTeX-Zähler) und hat daher eine etwas ungewöhnliche Syntax für die Wertzuweisung, z.B. \tolerance=500. Niedrigere Werte führen dazu, dass TeX nur Lösungen in der Nähe des Optimums akzeptiert, höhere Werte erlauben größere Abweichungen beim Setzen. Voreingestellt ist häufig ein Wert von 200. Wenn TeX nicht innerhalb der vorgegebenen Toleranz bleiben kann, erhält man in der Ausgabe überlaufende Zeilen [...]. Wenn der Wert für \tolerance erhöht wird, zieht TeX auch ungünstigere Zeilenumbrüche in Betracht [...].

Hier kann angemerkt werden, dass es diese ungünstigeren Zeilenumbrüche nicht nur dann in Betracht zieht, wenn es keine besseren findet, sondern bereits dann, wenn es für den Absatzumbruch zu Trennungen greifen muss. Ein höherer Wert für \tolerance kann also auch dann eine Verschlechterung des Umbruchs mit sich bringen, wenn dies gar nicht notwendig wäre.

Wenn man wirklich vollautomatische Zeilenumbrüche benötigt [...], ist es besser, den Längenparameter \emergencystretch auf einen positiven Wert zu setzen. Wenn TeX (aufgrund der Einstellungen für \tolerance) einen Absatz nicht umbrechen kann, ohne dabei Zeilenüberläufe zu produzieren, und \emergencystretch positiv ist, fügt es diese Länge als dehnbaren Leerraum jeder Zeile hinzu. Dadurch werden Zeilenumbrüche akzeptabel, die vorher verworfen wurden. Das kann zu einigen „underfull box“-Warnungen [...] führen, da nun alle Zeilen nach einem lockereren Maßstab gesetzt werden. Das Ergebnis sieht aber immer noch besser aus, als eine einzelne, hässliche Zeile inmitten eines ansonsten perfekt gesetzten Absatzes.

Hier kann außerdem angemerkt werden, dass \emergencystretch wirklich nur dann angewendet wird, wenn der Versuch, den Absatz mit Trennungen korrekt zu umbrechen, gescheitert ist und TeX deshalb einen dritten Anlauf zum Absatzumbruch nimmt. Der Umbruch verschlechtert sich also nur, wenn ohne Anwendung von \emergencystretch weder ein Umbruch ohne Trennung (und ohne \tolerance) noch ein Umbruch mit Trennung (und mit \tolerance) möglich war.

Die oben beschriebenen Parameter werden in LaTeX durch zwei vordefinierte Befehle beeinflusst: durch den voreingestellten Befehl \fussy und den Befehl \sloppy, der relativ ungünstige Zeilenumbrüche zulässt. Der Befehl \sloppy wird von LaTeX automatisch immer dann verwendet, wenn perfekte Zeilenumbrüche aufgrund des engen Zeilenmaßes unwahrscheinlich sind (z.B. beim Formatieren von \marginpar-Befehlen oder von p-Spalten in der Umgebung tabular).

Da \sloppy also \tolerance auf den recht großzügigen Wert von 9999 setzt, führt auch dessen Verwendung dazu, dass Absätze mit Trennung ggf. schlechter umbrochen werden können als dies unbedingt notwendig ist. Man sollte es daher eher nicht global einsetzen. Für einzelne Absätze steht dazu beispielsweise die Umgebung sloppypar zur Verfügung.

Bevor man sich an die Änderung der genannten Parameter macht, sollte man übrigens sicherstellen, dass TeX in seinem zweiten Umbruchversuch auch wirklich maximal gut arbeiten kann. Dazu ist es notwendig, dass die richtigen Trennmuster aktiv sind, man also mit Hilfe von babel oder polyglossia auch die richtige Sprache eingestellt hat. Außerdem ist zu beachten, dass Wörter, die zusammengesetzte Zeichen enthalten, vom Trennalgorithmus, also im zweiten Umbruchversuch von TeX, nicht korrekt erkannt und behandelt werden können. Daher ist es sinnvoll entweder LuaLaTeX oder XeTeX zu verwenden oder mit pdfLaTeX ein Fontencoding zu verwenden, das zur Sprache passt, beispielsweise mit \usepackage[T1]{fontenc} für Deutsch (und alle westlichen Sprachen). Mit dem bei pdfLaTeX voreinstellten OT1 sind sonst bereits die Umlaute zusammengesetzte Zeichen. Man vergleiche beispielsweise die erkannten Trennstellen für das Wort »möglich« bei OT1:

Open in writeLaTeX
\showhyphens{m"oglich}

Underfull \hbox (badness 10000) detected at line 0
[] \OT1/cmr/m/n/10 m[]oglich

also keine Trennung, im Vergleich zu T1:

Open in writeLaTeX
\showhyphens{m"oglich}

Underfull \hbox (badness 10000) detected at line 0
[] \T1/cmr/m/n/10 mög-lich

also korrekt mit Trennung nach dem »g«.

Permanenter link
Dieser Antwort ist "Community-Wiki" markiert.

beantwortet 10 Jun '13, 11:44

Clemens's gravatar image

Clemens
15.5k112859

bearbeitet 10 Okt '14, 05:16

Ijon%20Tichy's gravatar image

Ijon Tichy
4.4k617

Die Verwendung eines großen Wertes für \tolerance hat übrigens auch Nachteile. TeX versucht zuerst einen Absatzumbruch ohne Trennung und verwendet für diesen \pretolerance. Gelingt dies nicht, werden nicht nur Trennungen erlaubt, sondern gleichzeitig auch \tolerance statt \pretolerance verwendet. Es wird also bereits im 2. Versuch mehr Abstand toleriert als eventuell notwendig. Dagegen wird \emergencystretch erst bei einem 3. Versuch angewendet, falls der 2. daneben ging. \tolerance schaltet auch die underfull-Warnung nicht aus, dafür muss man zusätzlich \hbadness setzen.

(29 Jul '13, 03:14) saputello

@saputello Ist als CW gesetzt. fühle Dich frei, die Auszüge aus dem Begleiter zu ergänzen.

(29 Jul '13, 11:37) Clemens

@Clemens Habe aktuell leider wenig Zeit. Deshalb muss vorerst der Kommentar genügen.

(29 Jul '13, 11:53) saputello

@saputello hat ja keine Eile :) Und Leser des Posts werden auch durch den Kommentar schlauer :)

(30 Jul '13, 03:16) Clemens
1

@Clemens, @saputello: Ich habe mir mal erlaubt die Anmerkungen aus dem Kommentar und einige weitere in den Beitrag einzuarbeiten. Ich hoffe, das ist in eurem Sinne. Wenn nicht, einfach auf die vorherige Version zurückschalten, das wäre für mich kein Problem.

(10 Okt '14, 03:36) Ijon Tichy

LaTeX übernimmt das »Layouting« für uns. Dazu wird Text in Boxen aufgeteilt und mit Hilfe von s.g. »glue«. Dieser Kleber kann, bildlich gesprochen, ausgedehnt werden um die richtige Positionierung zu gewährleisten.

Dabei können jedoch Fehler auftreten. Die Wohl bekanntesten sind wohl underfull hbox und overfull hbox.

Es existieren sogar Mems zu diesem Thema:

alt text

Aber nun zu der Bedeutung:

underfull \hbox

Diese Warnung weist uns darauf hin, dass LaTeX nicht in der Lage ist, die besagte Zeile ordnungsgemäß ausdehnen. Ordnungsgemäß bedeutet in diesem Fall, dass die Abstände größer werden würden als erlaubt.

Lösungsansätze

  • Eine elegante Lösung ist die Nutzung des microtype Pakets. Benutzt man pdfLaTeX mit direktem .pdf Output, kann dieses Paket auch Buchstaben strecken, wodurch bessere Abstände erreicht werden können.
  • Des Weiteren, kann bzw sollte man auf manuelle Zeilenumbrüche (\\) verzichten und LaTeX das »Layouting« überlassen.

overfull \hbox

Dieser Warnung weist daraufhin, dass LaTeX auf ein Ausrichtung- bzw. Worttrennungsproblem gestoßen ist. Dabei ist das letzte Wort der Zeile ausschlaggebend. Bleibt es in der Zeile, ist diese zu lang und entspricht somit nicht der angegebenen Zeilenbreite. Wird das letzte Wort in die nachfolgende Zeile verschoben, ist die Ausgangszeile zu kurz und müsste ausgedehnt werden.

Lösungsansätze

  • Das Einführen von neuen Trennregeln durch \hyphenation{}
  • Manuelle Trennung mit Hilfe des Trennzeichens ( \- ) La\-TeX
Permanenter link

beantwortet 10 Jun '13, 09:01

Rico's gravatar image

Rico
5994713

bearbeitet 29 Jul '13, 03:18

saputello's gravatar image

saputello
15.4k11645

Etwas anschaulicher:

\documentclass[draft,parskip=half]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{showframe}
\begin{document}

Nun kommt eine Zeile mit einer \emph{underfull box}:

\begin{sloppypar}
\fbox{\makebox[0.8\linewidth]{Zu wenig Text in der Zeile}}, 
\fbox{\makebox[0.3\linewidth]{weil diese Box}} nicht mehr in die
vorhergehende Zeile passt.
\end{sloppypar}

Ohne die Umgebung \texttt{sloppypar} wäre es eine \emph{overfull box},
was durch einen Strich an der rechten Seite markiert wird(wegen draft).
Denn jetzt schreibt \TeX\ über den Rand:

\fbox{\makebox[0.8\linewidth]{Zu wenig Text in der Zeile}}, 
\fbox{\makebox[0.3\linewidth]{weil diese Box}} nicht mehr in die
vorhergehende Zeile passt.

Mit dem Vergrößern von \verb|\emergencystretch|  kann man größere
Abstände erlauben (was auch \texttt{sloppypar} entsircht):

\addtolength\emergencystretch{0.2\linewidth}%
\fbox{\makebox[0.8\linewidth]{Zu wenig Text in der Zeile}}, 
\fbox{\makebox[0.3\linewidth]{weil diese Box}} nicht mehr in die
vorhergehende Zeile passt. Das ist dann wieder eine \emph{underfull box}

\end{document}

Ausgabe

Die Ausgabe im Logfile lautet:

Underfull \hbox (badness 10000) in paragraph at lines 10--13
[...]
Overfull \hbox (61.11757pt too wide) in paragraph at lines 19--22
[...]
Underfull \hbox (badness 10000) in paragraph at lines 27--30
[...]
Permanenter link

beantwortet 27 Jun '13, 08:14

Herbert's gravatar image

Herbert
5.0k34

bearbeitet 27 Jun '13, 08:15

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×29
×21
×13
×13
×12

Frage gestellt: 10 Jun '13, 06:33

Frage wurde angeschaut: 54,594 Mal

Zuletzt aktualisiert: 10 Okt '14, 05:16