La première ligne de hyphen.tex, livré avec TeX Live 2024, est un cri : The Plain TeX hyphenation tables [NOT TO BE CHANGED IN ANY WAY!]. Ce fichier contient les 4447 motifs que LaTeX consulte chaque fois qu’il décide où couper une ligne, et il se termine par une liste d’exceptions écrite à la main, forte de quatorze mots seulement. Deux d’entre eux — present et project — ne portent aucun point de coupure, parce que chacun est un mot différent selon la prononciation et que TeX ne peut pas deviner lequel. Régler les sauts de ligne, c’est refaire ce même arbitrage dans son propre manuscrit. Cette page traite \\, \newline, \linebreak[n], \nolinebreak[n], le trait d’union conditionnel \-, \hyphenation{...}, le package hyphenat et les motifs de césure par langue de babel — avec des chiffres mesurés plutôt que recopiés.
Traçons d’abord une frontière. Commencer un nouveau paragraphe (par une ligne vide ou \par) est une chose ; déplacer l’endroit où les lignes se coupent à l’intérieur d’un paragraphe en est une autre. La première entraîne un alinéa et un blanc inter-paragraphe ; la seconde ne fait que décaler les fins de ligne au sein d’un même paragraphe. Au-dessus des deux se trouve une troisième couche — la conception du rythme des pages, le monde de \widowpenalty et de \raggedbottom —, qui relève de la page sur les sauts de page. \looseness, la demande de composer un paragraphe une ligne plus court ou plus long, y est également documenté et mesuré. Cette page ne traite que la couche des lignes.
\\ et \newline : la même macro, une autre porte
\newline est défini comme \@normalcr\relax, et \\ est la même macro sans ce \relax (latex.ltx). Ce seul jeton fait toute la différence. \\ va ensuite chercher un * ou une [longueur] qui suivraient ; \newline, arrêté par le \relax, ne cherche rien. Composez Alpha\newline[2ex] Beta et la page imprime bel et bien un [2ex] littéral. À l’inverse, \\[2ex] ajoute 2ex d’espace vertical après la ligne, et \\* interdit un saut de page à cet endroit. En pratique : \\ quand on a besoin des options, \newline quand on veut que l’intention se lise dans la source.
Ce qu’ils ont en commun : ils terminent la ligne sans l’étirer. Le corps est \unskip … \nobreak \hfil \break : un \hfil infiniment extensible est posé à droite, et la coupure n’intervient qu’ensuite. Ce \hfil absorbe tout le jeu, la ligne s’arrête donc à sa longueur naturelle et reste courte. C’est exactement pourquoi ils conviennent aux adresses et aux vers, où chaque ligne doit finir là où on l’a voulu. Un effet de bord existe. Un \\ tout à la fin d’un paragraphe crée une dernière ligne vide et signale Underfull \hbox (badness 10000) in paragraph at lines 6--7. Un paragraphe n’a pas besoin d’un \\ final — la ligne qui suit un titre non plus. Employé là où il n’y a aucune ligne à terminer (au début d’un paragraphe, par exemple), on obtient plutôt ! LaTeX Error: There's no line here to end.
% \\ 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.Dans un tableau, les deux rôles se séparent nettement. Dans une cellule qui fabrique un paragraphe, comme une colonne p{...} de tabular, \newline ne coupe qu’à l’intérieur de cette cellule tandis que \\ termine la rangée entière. Une adresse sur deux lignes dans une cellule ? C’est \newline. Mesuré : Line one\newline Line two dans une cellule p{3cm} empile deux lignes à l’intérieur de la même rangée, et la cellule voisine ne bouge pas. Dans l’environnement array, \\ sépare également les rangées. À l’inverse, \newline dans une colonne qui ne fabrique pas de paragraphe (l, c) n’a aucune ligne à terminer : c’est l’erreur ci-dessus.
Quel nombre se cache derrière le n de \linebreak[n] et \nolinebreak[n]
n va de 0 à 4 et se traduit par les pénalités 0, 51, 151, 301 et 10000. \@getpen, dans latex.ltx, renvoie 0 / \@lowpenalty / \@medpenalty / \@highpenalty / \@M, et dans les classes standard ces trois valeurs sont fixées à 51, 151 et 301 aux lignes 118–120 d’article.cls. \linebreak[n] insère cette valeur en négatif — couper ici est une récompense — et \nolinebreak[n] en positif — couper ici coûte. Sans argument, les deux valent 4, soit ∓10000, l’infini de TeX. Une fois les chiffres connus, le choix se fait seul : le 51 de [1] est un murmure que la badness d’un texte courant couvre sans peine, le 301 de [3] est le premier à répliquer, et seul [4] est un ordre.
| Argument | linebreak insère | nolinebreak insère | Force réelle |
|---|---|---|---|
[0] | 0 | 0 | simple point de coupure légal, sans coût |
[1] | -51 | 51 | un murmure ; la badness du texte l’emporte |
[2] | -151 | 151 | à peu près le poids du \widowpenalty par défaut |
[3] | -301 | 301 | la première valeur qui réplique |
[4] | -10000 | 10000 | valeur par défaut ; l’infini, c’est-à-dire un ordre |
\linebreak et \\ produisent la même coupure mais des résultats opposés. \linebreak ne pose qu’une pénalité : la ligne est donc justifiée comme d’habitude et étirée jusqu’à la marge droite — d’où les blancs interlettres qui bâillent. \\ absorbe le jeu grâce à ce \hfil et reste courte. Le moyen mnémotechnique : \\ pour couper court, \linebreak pour justifier à la marge. Dans le détail, \@no@lnbk retire le blanc précédent par \unskip, insère la pénalité, puis remet un blanc de même largeur — word\linebreak word ne produit donc pas d’espace double.
Interdire la coupure ici : le lien ~ et ce que coûte \mbox
S’il ne s’agit que de protéger une espace, le tilde ~ est le premier choix. Il a la largeur d’une espace-mot ordinaire ; la seule différence est qu’aucune ligne ne peut y être coupée. À employer partout où un mot ne doit pas être séparé d’un nombre ou d’un symbole : Fig.~3, Dr.~Smith, Chapter~12, equation~\ref{eq:1}. L’essentiel : ~ n’empêche pas les mots voisins d’être coupés. Cela revient à \nobreak suivi d’une espace — une pénalité infinie (\nobreak vaut \penalty10000) en ce seul point —, les mots restent donc librement sécables. Pour une force graduée, \nolinebreak[n] ; pour une interdiction franche, le \nobreak de bas niveau.
\mbox{...} est tout autre chose. Il enferme son contenu dans une boîte unique : la matière ne peut ni se couper entre deux lignes ni se césurer. C’est ce qu’il faut pour une locution courte à ne pas fractionner, comme T-34, mais cela se paie. Mesuré : dans une minipage de 4,2 cm, dichlorodiphenyltrichloroethane tient seul ; enveloppé dans \mbox{...}, il signale Overfull \hbox (18.8814pt too wide) et déborde de 18,88 pt sur la marge droite. Figer de longues URL ou des noms chimiques dans \mbox est un remède pire que le mal. L’entrée sans trait d’union de \hyphenation{...} et le \nohyphens{...} de hyphenat, tous deux ci-dessous, coupent la césure sans fabriquer de boîte.
Ajouter une coupure avec \- : non pas « ici aussi » mais « ici seulement »
Insérez ne serait-ce qu’un \- dans un mot et LaTeX ne le coupera qu’aux endroits marqués, jamais à ceux qu’il aurait trouvés lui-même. Tous les candidats issus des motifs disparaissent. \showhyphens le montre sans ambiguïté : laissé tel quel, supercalifragilistic se coupe en cinq endroits, su-per-cal-ifrag-ilis-tic ; écrivez super\-califragilistic et il ne reste que super-califragilistic. De même, hyphenation passe de hy-phen-ation à hyphen-ation dès qu’on écrit hyphen\-ation. \- remplace donc la liste des candidats au lieu de l’enrichir : il faut expliciter chaque coupure souhaitée. Notez enfin que \- ne force pas la coupure ; il dit seulement « si tu coupes, ce sera l’une de celles-ci ».
% 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\-listicPourquoi la seconde moitié de long-standing ne se coupe pas : \hyp de hyphenat
Parce que la même règle s’applique au trait d’union ordinaire que vous avez tapé vous-même. Vérification avec \showhyphens : longstanding se coupe en trois, long-stand-ing ; mais écrivez long-standing et il ne reste que long-standing — seul le trait d’union tapé survit, stand-ing a disparu. Tous les composés se comportent ainsi : well-known, X-ray, state-of-the-art. C’est cette règle qui rend soudain la composition difficile quand un long composé arrive en fin de ligne. Le remède est \hyp, du package hyphenat. Écrivez long\hyp standing et la mesure redonne long-stand-ing : le trait d’union s’imprime à l’identique, mais les candidats issus des motifs ressuscitent.
hyphenat propose aussi un remplaçant de \mbox. \nohyphens{...} est une définition d’une seule ligne qui bascule simplement \language, à l’intérieur du groupe, vers une langue dépourvue de motifs. Mesuré, \nohyphens{supercalifragilistic} ne donne aucun candidat. Comme aucune boîte n’est fabriquée, les lignes peuvent toujours se couper avant et après le mot — pas de débordement de 18 pt comme avec \mbox. Dans le même esprit, \bshyp, \fshyp, \dothyp et \colonhyp transforment les \, /, . et : des URL et des chemins en caractères sécables, et l’option de package [none] arrête la césure dans tout le document avec deux affectations seulement : \hyphenpenalty=10000\exhyphenpenalty=10000.
\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 pathQuand \hyphenation{...} ne fait rien : accents, formes fléchies, capitales
Quand le même mot revient sans cesse, on enregistre l’exception une fois dans le préambule plutôt que d’encombrer le corps du texte. La syntaxe est exactement celle qu’utilise Knuth à la fin de hyphen.tex : lister les mots avec leurs coupures marquées par des traits d’union dans \hyphenation{...}. Le mécanisme a un usage que la syntaxe n’annonce pas : inscrivez un mot sans aucun trait d’union et il ne sera plus jamais coupé. Mesuré : après \hyphenation{fortran}, \showhyphens{fortran} ne renvoie aucun candidat. C’est précisément pour cela que present et project figurent dans la liste d’exceptions de Knuth sans la moindre coupure. Contrairement à \mbox, aucune boîte n’est créée : rien ne peut déborder de la marge.
Trois raisons d’échec, toutes mesurées. D’abord les accents. Sous OT1 — le codage de fonte par défaut —, \hyphenation{r\'e-sum\'e} s’arrête sur ! Improper \hyphenation will be flushed., car un caractère accentué y est composé avec \accent et n’est pas une lettre. Ajoutez \usepackage[T1]{fontenc} : il devient un glyphe unique et la même ligne passe sans un mot. Ensuite, la correspondance exacte. Après \hyphenation{hyphena-tion}, hyphenation se coupe bien en hyphena-tion, mais le pluriel hyphenations rate complètement l’exception et retombe sur les motifs : hy-phen-ations. Chaque forme fléchie exige sa propre entrée. Enfin, la casse est ignorée. TeX passe en minuscules via \lccode avant de comparer : la seule entrée For-tran a fait couper FORTRAN, Fortran et fortran en FOR-TRAN, For-tran et for-tran.
\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
}Les motifs par langue de babel : Wissenschaft se coupe de deux façons
Les motifs de césure sont propres à chaque langue, et changer \language fait couper le même mot ailleurs. La mesure dit tout. Chargez \usepackage[english,ngerman]{babel} : \language passe à 36 (ngerman) et \showhyphens{Wissenschaft Wahrscheinlichkeit} donne le correct Wis-sen-schaft Wahr-schein-lich-keit. Basculez sur \selectlanguage{english} (\language 0) et ces mêmes mots deviennent Wis-senschaft Wahrschein-lichkeit — fautif en allemand. L’inverse est vrai aussi : composez de l’anglais sous les motifs allemands et typesetting devient ty-pe-set-ting. Un article en allemand rédigé sans babel a généralement cet air légèrement bancal pour cette raison précise.
Une conséquence en découle directement : la liste d’exceptions de \hyphenation{...} est elle aussi tenue par \language et ne vaut donc que pour la langue active au moment de la déclaration. Mesuré : après \usepackage[english,ngerman]{babel}, un \hyphenation{Wiss-en-schaft} dans le préambule fait bien couper le mot en Wiss-en-schaft dans le texte en ngerman — mais juste après \selectlanguage{english}, l’exception est invisible et les motifs anglais redonnent Wis-senschaft. Dans un document multilingue, la règle est absolue : déclarer les exceptions après avoir sélectionné la langue concernée. Le japonais ne connaît pas la césure en ce sens ; \- et \hyphenation servent aux parties en langue occidentale.
\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}| Commande | Rôle | Étire la ligne ? |
|---|---|---|
\\ , \newline | Force un saut de ligne (pas de paragraphe) ; seul \\ accepte [longueur] et * | Non — \hfil absorbe le jeu, la ligne reste courte |
\linebreak[n] | Insère la pénalité −(0/51/151/301/10000) ; défaut n=4 | Oui — la ligne est justifiée jusqu’à la marge droite |
\nolinebreak[n] | Insère la pénalité +(0/51/151/301/10000) ; n=4 interdit totalement | — |
~ | Espace-mot insécable ; la césure reste possible | — |
\mbox{...} | Une seule boîte ; ni coupure ni césure — cause fréquente de boîtes trop pleines | — |
\- | Trait d’union conditionnel ; le mot ne se coupe plus qu’aux marques | — |
\hyp | hyphenat ; imprime le trait d’union et garde le reste du mot sécable | — |
\nohyphens{...} | hyphenat ; supprime la seule césure — pas de boîte, donc pas de débordement | — |
\hyphenation{...} | Liste d’exceptions du préambule ; correspondance exacte, insensible à la casse, par \language | — |
\showhyphens{...} | Diagnostic : écrit dans le .log les coupures actuelles du mot | — |
Ordre de correction des avertissements de coupure : forcer en dernier
La pire des corrections consiste à planter un \\ là où l’avertissement est apparu. TeX optimise la coupure sur tout le paragraphe : figer une ligne redistribue le reste et en casse une autre. L’ordre est le suivant : réécrire le texte, puis ajouter des possibilités de césure, puis interdire localement avec ~ ou \nolinebreak, et seulement ensuite relâcher la tolérance du paragraphe. Ce dernier échelon — \tolerance, \emergencystretch, \sloppy (avec \fussy pour revenir au défaut) et la lecture d’un Overfull \hbox — relève de la page sur les boîtes trop pleines, où \sloppy est mesuré comme n’étant rien de plus que quatre affectations. Le très léger étirement des glyphes par microtype y figure également.
- Repérez d’abord les mots longs, les URL et les noms chimiques. Passez-les à
\showhyphens{...}pour voir s’ils possèdent la moindre coupure. - Donnez aux termes techniques une entrée dans
\hyphenation{...}. Une par forme fléchie, et, en document multilingue, écrite après\selectlanguage. - Gardez
\-pour le mot qui résiste encore. Un seul suffit à effacer tous les autres candidats de ce mot. - Liez noms, numéros et unités avec
~. Réservez\mboxaux locutions courtes qu’il est vraiment interdit de scinder. - Chargez toujours
babeldans un document multilingue. Sans changement de langue, l’une d’elles se coupera systématiquement au mauvais endroit.