Pourquoi les paragraphes composés par LaTeX paraissent-ils plus reposants que ceux d'un traitement de texte ? La réponse se trouve un cran sous l'alignement du texte : un traitement de texte remplit ligne après ligne, tandis que LaTeX pèse le paragraphe entier avant de décider où la moindre ligne s'arrête. Le réglage par défaut est le texte justifié, et deux chemins permettent de s'en écarter — les déclarations comme \centering et les environnements comme center, qui donnent exactement le même alignement mais pas le même espace vertical. Cette page suit un seul fil : pourquoi la justification est le réglage par défaut, comment choisir entre \centering et center, pourquoi \raggedright cesse discrètement de couper les mots et ce que ragged2e y change, et comment répondre à un avertissement Overfull \hbox.
Pourquoi le texte justifié est le réglage par défaut : une coupure de lignes sur tout le paragraphe
Sans indication contraire, LaTeX compose les paragraphes en texte justifié, au ras des deux marges. Ce réglage par défaut n'est pas une simple habitude. TeX ne remplit pas les lignes de haut en bas : il retient la combinaison de coupures qui coûte le moins de démérites au paragraphe entier. L'algorithme a été publié par Donald Knuth et Michael Plass sous le titre « Breaking Paragraphs into Lines » (Software: Practice and Experience, vol. 11, 1981, p. 1119–1184). Un remplissage glouton, ligne après ligne, encaisse ses gains tôt et laisse la note à la dernière ligne ; TeX peut faire l'inverse et dégrader volontairement une ligne du début pour éviter un effondrement plus loin. Cette optimisation n'a de marge de manœuvre que si les espaces entre les mots peuvent s'étirer et se resserrer — précisément ce que permet la justification. D'où ce point de départ.
Le mécanisme est concret. Pour chaque ligne, TeX convertit l'étirement ou le resserrement en une badness et la pénalité au point de coupure en p ; avec l pour \linepenalty et b pour la badness, les démérites de la ligne valent d = (l+b)^2 + p^2. Les démérites d'un paragraphe sont leur somme, augmentée de suppléments pour deux lignes voisines visuellement discordantes (\adjdemerits) et pour deux lignes consécutives terminées par un tiret (\doublehyphendemerits). Knuth et Plass qualifient eux-mêmes ces formules de « quite arbitrary » — elles fonctionnent pourtant. Autre chose utile à savoir : la coupure se fait en trois passes au plus. La première tente le paragraphe sans aucune césure et ne l'accepte que si chaque ligne reste dans \pretolerance ; la deuxième seulement fait appel aux motifs de césure et à la \tolerance, plus large. Autrement dit, un paragraphe qui tient à l'aise n'est jamais coupé. Si cela échoue encore, une troisième passe intervient avec \emergencystretch.
\centering et l'environnement center : la différence
En bref : l'alignement est rigoureusement identique, et la seule différence tient à l'espace vertical ajouté au-dessus et au-dessous. Dans latex.ltx, center est défini comme \trivlist \centering\item\relax : l'environnement n'est rien d'autre que \centering enveloppé dans une liste invisible, et en tant que liste il apporte un \topsep de séparation avec le texte alentour. flushleft enveloppe de même \raggedright, et flushright enveloppe \raggedleft. Mesuré dans une classe article en 10pt, l'environnement center ajoute environ 8pt au-dessus et au-dessous ; la déclaration n'ajoute rien.
| Déclaration | Environnement | Bord aligné | Espace vertical |
|---|---|---|---|
\centering | center | aucun bord aligné, les lignes sont centrées | nul pour la déclaration, \topsep pour l'environnement |
\raggedright | flushleft | bord gauche aligné, bord droit en drapeau | comme ci-dessus |
\raggedleft | flushright | bord droit aligné, bord gauche en drapeau | comme ci-dessus |
\justifying | justify | les deux bords alignés — texte justifié | nécessite ragged2e ; la déclaration n'ajoute rien |
\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}C'est pour cette raison qu'une figure doit employer \centering et non \begin{center}. Le flottant porte déjà son propre espace au-dessus et au-dessous ; y superposer le \topsep de l'environnement center fait paraître l'image et sa légende distendues. Le même raisonnement vaut pour une cellule tabular, une \parbox, une minipage et le contenu d'un \caption : l'alignement s'y fait par la déclaration. À l'inverse, pour poser une ligne en exergue au milieu du texte courant en voulant aussi l'espace alentour, l'environnement center est la formulation la plus courte.
Les déclarations ont une autre propriété sur laquelle on trébuche volontiers : une déclaration n'ouvre pas de nouveau paragraphe. L'alignement se fixe à l'instant où le paragraphe se referme — à la lecture de \par (une ligne vide) — et ce qui est en vigueur à ce moment-là s'applique au paragraphe tout entier. D'où le comportement contre-intuitif de la ligne suivante.
ww {\centering xx \\ yy} zz
% result: the line "ww xx" comes out centred, "yy zz" does notÀ la composition, ww xx sort centré tandis que yy zz commence à la marge de gauche. Deux choses se produisent. D'abord, \centering redéfinit discrètement \\ en \@centercr, qui n'est pas une coupure de ligne mais un \par, c'est-à-dire la fin d'un paragraphe. xx referme donc son paragraphe alors que \centering agit encore, et ce paragraphe est centré. yy ouvre ensuite un nouveau paragraphe, mais l'accolade fermante rétablit \rightskip et ses voisins avant que ce paragraphe ne s'achève : il sort justifié. D'où l'unique règle des déclarations : la fin du paragraphe à aligner — une ligne vide, ou le \end d'un environnement — doit tomber à l'intérieur du groupe.
Pourquoi \raggedright cesse de couper les mots, et ce que fait ragged2e
La cause tient en une ligne de code. \raggedright fixe \rightskip — le ressort qui comble la fin de ligne — à 0pt plus 1fil, c'est-à-dire à un espace infiniment extensible. Avec quelque chose d'infiniment extensible au bout de chaque ligne, la badness de toute ligne vaut zéro. Du point de vue de TeX, couper un mot et poser un tiret ne peut plus alors qu'augmenter les démérites sans rien rapporter. Il cesse donc complètement de couper, et le bord droit devient très irrégulier. La même phrase composée sur 4cm : avec \raggedright, aucune césure n'apparaît, sauf là où un mot seul ne tient pas sur une ligne, et les longueurs de ligne varient énormément.
Le package ragged2e corrige exactement ce point. Il remplace l'extensibilité infinie par un 0pt plus 2em fini, si bien qu'une ligne trop courte porte de nouveau une vraie badness et que TeX se remet à peser la césure. Il fournit les commandes à initiale majuscule \RaggedRight, \RaggedLeft et \Centering, les environnements FlushLeft, FlushRight et Center, ainsi que \justifying et l'environnement justify pour revenir au texte justifié. Pour composer tout un document ferré à gauche sans perdre la césure, on charge \usepackage[document]{ragged2e} : \RaggedRight est exécuté à \begin{document} et le même réglage s'étend aux \parbox et aux colonnes p de tabular. Le package est de Martin Schröder et il est aujourd'hui maintenu par Marei Peischl.
\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 textQuand la composition en drapeau est-elle donc réellement le bon choix ? C'est la longueur de ligne qui tranche. Dans une mise en pages à plusieurs colonnes, dans les notes marginales, dans les colonnes p étroites d'un tabular, les lignes deviennent courtes et leur imposer la justification écarte fortement les espaces entre mots. Ces espaces dilatés s'alignent d'une ligne à l'autre et creusent des couloirs clairs dans la page — les typographes parlent de lézardes, rivers en anglais — qui gênent la lecture au lieu de l'aider. Plus la ligne est courte, plus le risque est grand : une colonne étroite se lit réellement mieux ferrée à gauche. Un compromis courant dans un article à deux colonnes consiste à laisser le corps justifié et à réserver \RaggedRight aux légendes et aux notes de bas de page. Sur une seule colonne, avec une justification confortable, mieux vaut ne rien changer.
Corriger un avertissement Overfull \hbox : \sloppy et \emergencystretch
Une ligne de journal telle que Overfull \hbox (84.8932pt too wide) in paragraph at lines 10--10 signale que TeX n'a trouvé aucun jeu de coupures maintenant le paragraphe dans la tolérance ; il renonce et laisse une ligne déborder dans la marge. Le coupable habituel est quelque chose de long et d'insécable : une URL, un identifiant composé, un mot long dans \texttt, ou tout simplement une colonne étroite. C'est ce mot-là qu'il faut soupçonner avant l'alignement.
Les remèdes ont un ordre. Traiter d'abord le mot fautif : indiquer ses points de coupure avec \hyphenation{...}, insérer un \-, ou confier une URL à \url de url ou de hyperref. C'est la vraie correction. Si l'avertissement persiste, vient \sloppy, qui desserre \tolerance à 9999, \emergencystretch à 3em et \hfuzz à 0.5pt : l'échange consiste à accepter des espaces entre mots plus lâches pour supprimer le débordement. Appliqué au document entier, il relâche l'aspect général du texte ; il est plus doux de n'entourer que le paragraphe concerné par l'environnement sloppypar, ou de poser seulement \emergencystretch=3em. \fussy rétablit les valeurs strictes (\tolerance 200, \emergencystretch 0). Et si ces avertissements se multiplient dans une colonne étroite, c'est aussi le signe qu'il faut y passer au drapeau.
% 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=3emPourquoi \\ est la mauvaise façon de terminer un paragraphe
\\ ne fait que couper une ligne ; il ne termine pas un paragraphe. C'est une ligne vide — \par — qui le termine. La distinction compte ici, car l'alignement se décide, comme on l'a vu, à l'instant où le paragraphe se referme. Séparer deux blocs de texte par \\ et le second n'est pas considéré comme un nouveau paragraphe : ni alinéa, ni \parskip, juste une coupure au milieu d'un même paragraphe. Pire : un \\ en fin de paragraphe suivi d'une ligne vide remplit le journal de Underfull \hbox (badness 10000) in paragraph at lines 3--4, car une ligne vide supplémentaire a été créée puis étirée sur toute la justification.
Où \\ a-t-il donc sa place ? Partout où l'on veut exactement une coupure de ligne. Séparer des lignes dans center ou flushright, terminer une rangée de tabular, découper des vers dans verse, replier une longue \caption : ce sont des frontières de ligne, pas de paragraphe. Au passage, un \\ après la dernière ligne d'un bloc center ne coûte rien — ni espace supplémentaire ni avertissement — car \@centercr l'annule par \addvspace{-\parskip}. Ligne vide pour les paragraphes, \\ pour les lignes : tenir cette frontière élimine une bonne part des anomalies d'alignement apparemment inexplicables.
Quel alignement pour quel usage
Le point de départ n'est pas le goût mais la nature du matériau. Les paragraphes de texte courant restent justifiés ; les objets courts — un titre, une légende, une ligne de signature, une cellule de tableau — sont alignés localement. Et le choix entre déclaration et environnement se ramène à une seule question : veut-on l'espace vertical alentour, oui ou non ? Prise dans cet ordre, la décision se pose rarement deux fois.
- Dans les figures, les cellules de tableau,
\parboxetminipage, l'alignement se fait par une déclaration comme\centering; un environnement empilerait son\topsepsur un espace déjà présent. - Pour une ligne en exergue au fil du texte, l'environnement
centerest le choix naturel : l'espace alentour fait partie de ce que l'on veut. - Pour du texte occidental ferré à gauche ou à droite, préférer
\RaggedRightet\RaggedLeftderagged2eaux commandes standard, afin de conserver la césure. - Dans une colonne étroite (composition multicolonne, notes marginales, colonnes p de
tabular), inutile de s'accrocher à la justification : plus la ligne est courte, plus le drapeau l'emporte. - Avec une déclaration, la fin du paragraphe doit se trouver dans le groupe. Sans ligne vide ni
\endà l'intérieur, l'alignement soit ne prend pas, soit déborde sur du texte non visé. - Ligne vide pour finir un paragraphe,
\\pour finir une ligne. Confondre les deux amène d'un coupUnderfull \hboxet la disparition des alinéas.