Overfull / Underfull \hbox

Overfull \hbox est un avertissement, pas une erreur. La compilation LaTeX va jusqu’au bout, le PDF existe : simplement, l’une de ses lignes dépasse la marge droite. La première chose à faire n’est donc pas de scruter le log mais d’ouvrir le PDF et de regarder cette ligne. À partir de là, cette page examine ce que mesure le nombre de (71.93637pt too wide), en quoi in paragraph at lines 4--9 diffère de detected at line 3, lequel de \hbadness, \tolerance et \emergencystretch mérite d’être touché, et pourquoi corriger une boîte trop pleine et faire taire l’avertissement sont deux opérations entièrement distinctes. Son image inversée, Underfull \hbox, ainsi que le Overfull \vbox vertical relèvent aussi de cette page.

Ce que mesure le nombre de (71.93637pt too wide)

De combien cette ligne a dépassé \hsize, la largeur de colonne, mesurée en points. Un point vaut environ 0,35 mm : un demi-point est invisible à l’œil nu, soixante-dix points font une largeur de pouce débordant de la page. Ce seul nombre fixe la priorité — quelques points et personne ne s’en aperçoit, raison pour laquelle LaTeX se tait en dessous de 0,1 pt par défaut (\hfuzz=0.1pt). TeX compose en boîtes, et la boîte qui contient les caractères d’une ligne côte à côte est une boîte horizontale, une \hbox. Overfull \hbox signifie qu’au moment de couper le paragraphe en lignes, le contenu d’une boîte s’est révélé plus large que la colonne sans pouvoir être comprimé davantage. La raison en est presque toujours la même : il n’y avait nulle part où couper dans cette ligne.

La seconde moitié de l’avertissement — par exemple in paragraph at lines 4--9 — indique où cela s’est produit. Il existe quatre formulations, et celle que vous obtenez change l’endroit où chercher ; le tableau ci-dessous permet de situer la vôtre. Chacune a été reproduite ici avec un fichier minimal sous pdfLaTeX de TeX Live 2024. La plus pénible est has occurred while \output is active, c’est-à-dire « pendant l’assemblage de la page » : la matière fautive peut ne correspondre à aucune ligne que vous ayez écrite. Le piège inverse existe aussi : un simple \mbox{...} ou \makebox[2cm]{...} n’émet aucun avertissement, si loin que son contenu dépasse. Le \hss dont ils se rembourrent peut se contracter sans limite ; pour TeX, la boîte tient donc toujours exactement, et des caractères franchissent la marge sans laisser la moindre trace dans le log.

FormulationSignificationOù regarder
in paragraph at lines A--Bsurvenu lors de la coupure d’un paragraphe ordinairele paragraphe des lignes A à B — de loin le plus fréquent
detected at line Nsurvenu dans une boîte explicite de largeur fixe, pas dans un paragrapheun \hbox to, un \makebox[…][s], une boîte construite par un package — à la ligne N
in alignment at lines A--Bsurvenu dans un alignement de tableauun tableau à largeur imposée comme tabular* ou tabularx
while \output is activesurvenu pendant l’assemblage de la pageen-têtes, pieds de page, notes, flottants — le numéro de ligne est peu fiable

Le log vous montre la ligne fautive, points de césure compris

Juste sous l’avertissement, TeX imprime le contenu de la ligne qui dépasse, avec un - à chaque point de césure trouvé. C’est le cœur du diagnostic. Voici un log réel obtenu en versant du texte anglais dans une colonne de 4 cm : Wis-senschaft-skol-leg porte des césures, electroencephalography- aucune. TeX exclut de la césure automatique tout mot contenant un trait d’union explicite (l’exploration s’arrête au trait d’union). Cette ligne n’a donc réellement aucun point de coupure, et augmenter \tolerance n’y changera rien. Lire les césures du log dit d’un coup d’œil si la césure est tentée ou si elle a été abandonnée — et une ligne sans la moindre césure fait fortement soupçonner un réglage de langue erroné.

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-
 []

Pour voir l’endroit fautif sur la page, ajoutez l’option de classe draft. article.cls contient \DeclareOption{draft}{\setlength\overfullrule{5pt}}, qui place un filet noir de 5 pt dans la marge à côté de chaque ligne trop longue. Si ces barres n’apparaissent pas d’ordinaire, c’est que latex.ltx exécute en fin de course \overfullrule 0pt, annulant la valeur INITEX de 5 pt. Les barres sont donc simplement éteintes et peuvent être rallumées à tout moment : si vous préférez ne pas toucher aux options de classe, \overfullrule=5pt dans le préambule fait la même chose — pensez à le retirer avant l’envoi.

Pourquoi les colonnes étroites, les tableaux et le code produisent le plus d’overfull

Parce que plus la colonne est étroite, plus la longueur relative d’un mot insécable devient fatale. Dans une colonne de 10 cm, un mot de 3 cm occupe un tiers de la ligne ; dans une colonne de 4 cm, il est plus long que la ligne et aucun choix de coupure ne le fera rentrer. Quand le même manuscrit passe de quelques avertissements à des dizaines dès qu’on met deux colonnes, ce n’est pas que la prose s’est dégradée : la justification a été divisée par deux. Les endroits ci-dessous concentrent les boîtes trop pleines ; si l’un vous parle, commencez par là. Reconnaître la colonne comme cause change le remède : revoir la largeur d’une colonne p{} va souvent plus vite que semer des \sloppy dans les paragraphes.

  • Mises en pages à deux colonnes (\documentclass[twocolumn], multicol). La justification est à peu près divisée par deux, et des mots sans problème sur une colonne débordent tous d’un coup.
  • Colonnes de tableau p{}, m{}, b{} et tabularx. Les largeurs de colonne sont des nombres choisis par l’auteur, souvent trop justes pour leur contenu.
  • Environnements littéraux (verbatim, \verb, listings). Espaces et fins de ligne sont reproduits tels quels : TeX n’a aucune liberté de coupure.
  • URL, DOI, chemins de fichiers, références, noms chimiques, noms de gènes. Une longue chaîne sans espace compte pour un seul mot.
  • Formules en ligne. Par défaut, une formule ne peut se couper qu’après un opérateur binaire ou une relation, et pas du tout à l’intérieur de constructions comme \frac.
  • Notes de bas de page et légendes de flottants. Elles sont parfois composées sur une justification plus étroite que le texte et se signalent volontiers sous la forme \output is active.

Supprimer une overfull hbox, en commençant par la meilleure solution

Reformuler un membre de phrase est la meilleure correction. La réponse manque de panache, mais c’est la seule qu’aucun logiciel ne peut fournir à votre place, et elle prend d’ordinaire cinq secondes : remplacer un mot long par un synonyme court, réordonner une proposition, renvoyer une référence interminable en note — et la boîte rentre. Ce rang n’est pas arbitraire : TeX coupe les lignes en considérant le paragraphe entier d’un seul tenant, selon l’algorithme publié par Knuth et Michael Plass en 1981 dans Breaking Paragraphs into Lines. Changer le dernier mot d’un paragraphe peut donc modifier la coupure de la première ligne. Inversement, un seul mot déplacé par l’auteur élargit énormément la marge de manœuvre du composeur. Les remèdes ci-dessous sont classés selon le rapport entre effet et effet secondaire.

  • Reformuler. Un mot suffit le plus souvent, sans le moindre effet secondaire. Les références et noms de produits interminables ont leur place en note ou dans un tableau.
  • Vérifier la langue. Un texte allemand ou français auquel on applique les motifs de césure anglais ne trouve nulle part où couper. Avec babel : \usepackage[ngerman]{babel} ; sous XeLaTeX ou LuaLaTeX : \setmainlanguage{german} de polyglossia.
  • Rendre ce mot-là sécable. \- à l’intérieur d’un mot pose une césure discrétionnaire ; \hyphenation{Wis-sen-schafts-kol-leg} enregistre une exception dans le préambule. Pour un composé contenant déjà un trait d’union explicite, un \hspace{0pt} après le trait d’union rouvre une possibilité de coupure.
  • \sloppy ou l’environnement sloppypar. Desserre l’espacement du paragraphe. sloppypar est la variante la plus sûre puisqu’elle se referme à \end.
  • Augmenter \emergencystretch. Mesuré ici, \emergencystretch=3em à lui seul a fait passer cinq boîtes trop pleines à zéro — au prix de sept boîtes trop lâches. L’effet secondaire, un espacement relâché, est bien moins visible que du texte débordant de la page.
  • Charger microtype. Sa protrusion discrète et son expansion de fonte ont ramené le dépassement de 13,4 pt à 8,9 pt et de 80,3 pt à 74,9 pt dans le même test. Il réduit donc, il ne supprime pas.
  • En dernier recours, \linebreak ou \mbox. La coupure à la main. Toute retouche ultérieure de la phrase déplace le point de coupure ; à réserver à l’ultime relecture avant l’envoi.

Le rôle respectif de \tolerance, \emergencystretch, \hbadness et \hfuzz

Les deux premiers modifient la composition, les deux derniers seulement les messages. Les confondre revient à « corriger » un problème qu’on a simplement caché : augmentez \hfuzz et les signalements de dépassement disparaissent, mais pas un caractère ne bouge sur la page. TeX coupe un paragraphe en trois passes au plus : d’abord dans les limites de \pretolerance et sans césure, puis dans celles de \tolerance avec césure, et si cela échoue encore, une troisième passe où chaque ligne reçoit \emergencystretch d’élasticité supplémentaire. C’est là, et là seulement, qu’agit \emergencystretch : la dernière carte, jouée quand rien d’autre n’a marché. Les valeurs par défaut de LaTeX figurent dans latex.ltx : \tolerance=200, \hbadness=1000, \hfuzz=0.1pt. Le très employé \sloppy se trouve dans le même fichier et se réduit à quatre affectations : \tolerance 9999, \emergencystretch 3em, \hfuzz .5pt, \vfuzz\hfuzz. \sloppy ne se contente donc pas de « relever la tolérance » : il règle aussi \emergencystretch, et dans le test ci-dessus, \emergencystretch=3em seul donnait exactement le même résultat que \sloppy.

ParamètreValeur LaTeX par défautEffet
\tolerance200la pire médiocrité admise pour une ligne ; l’augmenter change la composition
\emergencystretch0ptélasticité supplémentaire, ajoutée seulement à la troisième passe ; change la composition
\hbadness1000seules les lignes pires que cela sont signalées underfull. Sortie inchangée
\hfuzz0.1ptun dépassement jusqu’à cette valeur n’est pas signalé. Sortie inchangée
\overfullrule0ptlargeur du filet noir tracé à côté d’une ligne trop longue ; draft le met à 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

Quand une longue URL ou une chaîne de code refuse de se couper

L’envelopper dans \url{} ne suffit souvent pas. Mesuré dans une colonne de 5 cm, une longue URL en texte brut débordait de 79,0 pt ; placée dans le \url{} du package url, il restait encore deux boîtes, de 42,4 pt et 10,8 pt. \url{} ne coupe qu’après des caractères comme / et ., et ne peut donc pas couper à l’intérieur d’un nom d’hôte ou d’un long segment de chemin. Deux choses fonctionnent. Ajouter \sloppy a ramené le nombre de boîtes trop pleines à zéro, au profit de boîtes trop lâches — l’espacement relâché qui accompagne toujours \sloppy en est le prix. Mieux encore : \usepackage{xurl} a donné zéro boîte trop pleine et zéro trop lâche, car xurl autorise une coupure n’importe où dans une URL. hyperref charge url en interne et se comporte donc de la même façon ; son option breaklinks est ce qui permet de couper le lien lui-même. Pour les listings de code, l’équivalent est breaklines=true dans listings.

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) est le symptôme inverse

Une ligne est sortie trop courte et TeX a étiré les espaces entre les mots pour la remplir : voilà Underfull \hbox. C’est le moins urgent des deux cas, et la valeur de badness en dit la gravité. La badness va de 0 (parfait) à 10000 (le plafond : « on ne peut faire pire »). Des valeurs intermédiaires comme 1590, 2050 ou 7667 apparaissent couramment, mais une série de badness 10000 signifie des blancs visiblement béants : allez voir le PDF. La cause habituelle est un effet secondaire de la chasse aux boîtes trop pleines : \sloppy ou \emergencystretch transforme l’overfull en underfull (cinq boîtes ramenées à zéro dans le test ci-dessus, sept underfull apparues à la place). L’autre cause est une ligne courte forcée en plein paragraphe par \linebreak ou \\. \linebreak signifie « couper ici mais remplir tout de même la justification », d’où l’étirement ; \newline et \\ signifient « la ligne s’arrête ici » et n’étirent rien. Pour une ligne volontairement courte, utilisez donc \\. Si vous voulez seulement faire taire le message, \hbadness=10000 y suffit — sans rien changer à la page.

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

La même histoire se joue verticalement, la hauteur remplaçant la largeur. Overfull \vbox (56.90552pt too high) signifie que le contenu n’est pas entré dans une boîte verticale de hauteur fixée. Au test, une boîte explicite comme \vbox to 1cm{\hrule height 3cm} le signale sous la forme detected at line 3. Celle qu’on rencontre dans les vrais documents vient de l’assemblage de la page : une figure ou un \rule plus haut que \textheight a produit Overfull \vbox (85.35828pt too high) has occurred while \output is active. Devant cette forme, le premier suspect est une illustration trop grande pour tenir sur une page. Underfull \vbox (badness 10000) est l’inverse : le ressort vertical a été étiré pour remplir la hauteur. Sous \flushbottom, valeur par défaut de la classe book, le bas de chaque page est aligné en étirant les espaces verticaux, si bien que les pages peu remplies le déclenchent aisément. Si cela vous est égal, passez à \raggedbottom, ou relevez les seuils de signalement avec \vbadness et \vfuzz — là encore, relever un seuil ne change rien à la page. Quand une figure ne rentre décidément pas, \enlargethispage peut allonger la surface de texte pour cette seule page.