Une espace tapée dans une source LaTeX n'est pas un caractère mais une mesure. En Computer Modern 10 points, l'espace entre deux mots vaut exactement 3,33252 pt — et, mesure faite, ~ et \ (barre oblique inverse suivie d'une espace) valent la même chose. Ailleurs, en revanche, aucune des espaces tapées ne survit : c'est pourquoi \LaTeX is sort en « LaTeXis ». Cette page traite des largeurs mesurées des espaces que LaTeX insère tout seul, des commandes qui rendent une espace disparue, et du choix entre ~, \hspace et \quad quand on en place une à la main.
Combien mesure une espace LaTeX, en points ?
Mesuré dans un article à 10 points avec le Computer Modern T1, l'espace inter-mots vaut 3,33252 pt, avec 1,66626 pt d'étirement et 1,11084 pt de compression. Ces trois nombres appartiennent à la fonte elle-même ; TeX les nomme \fontdimen2, \fontdimen3 et \fontdimen4. Une espace LaTeX n'est donc pas une largeur mais une largeur élastique — ce que TeX appelle du glue. Les lignes justifiées tombent juste précisément parce que cette élasticité est répartie ligne par ligne, ce qui serait impossible si l'espace était un caractère.
Les espaces que l'on place soi-même comprennent en revanche plusieurs qui ne s'étirent pas du tout. \, (une espace fine) vaut 1,6663 pt, \enspace 4,99878 pt, \quad 9,99756 pt et \qquad 19,99512 pt. Toutes quatre sont définies en em : \quad vaut exactement 1 em, \qquad 2 em, \, un sixième d'em et \enspace un demi-em. Comme l'em suit le corps, le même \quad passe à 11,74713 pt dans \large, alors que \hspace{10pt} reste 10 pt où qu'il soit écrit. Des mesures en em quand l'espace doit suivre le texte ; des longueurs absolues quand il doit s'aligner sur une figure ou un filet — tout le choix tient là.
| Commande | Mesuré à 10pt | Définition et comportement |
|---|---|---|
(ordinary blank) | 3,33252 pt | \fontdimen2 ; du glue, avec 1,66626 pt d'étirement et 1,11084 pt de compression |
\ | 3,33252 pt | espace de contrôle ; largeur inter-mots, mais insensible à la règle de fin de phrase |
~ | 3,33252 pt | \ précédé de \nobreak : même largeur, mais aucun saut de ligne |
\, | 1,6663 pt | espace fine d'un sixième d'em ; identique à \thinspace ; rigide |
\negthinspace | −1,66631 pt | l'inverse de \, ; sert à resserrer |
\enspace | 4,99878 pt | un demi-em ; commode autour des étiquettes de liste |
\quad | 9,99756 pt | exactement 1 em ; passe à 11,74713 pt dans \large |
\qquad | 19,99512 pt | 2 em ; pour séparer formules ou exemples |
\hspace | comme indiqué | \hspace{10pt} vaut toujours 10 pt — mais est supprimé en début de ligne |
\hspace* | comme indiqué | la version qui subsiste en début de ligne ; pas de coupure non plus |
\LaTeX\ is et \LaTeX{} is n'ont pas la même largeur
Une espace tapée juste après une commande faite uniquement de lettres est consommée comme signal de fin du nom de la commande ; pas un point n'en atteint la page. À la mesure, \LaTeX is fait 32,37791 pt de large et \LaTeX\ is 35,71043 pt — une différence d'exactement 3,33252 pt, soit une espace inter-mots. C'est le premier symptôme que rencontrent ceux qui cherchent « LaTeX espace disparaît », et pdftotext extrait bel et bien du PDF un LaTeXis collé. Taper plusieurs espaces, ou replier la source sur la ligne suivante, n'y change rien.
Il existe trois corrections, et \LaTeX\ is, \LaTeX{} is et {\LaTeX} is mesurent toutes 35,71043 pt. Mais « les trois sont équivalentes » n'est vrai que sous condition. Après un point, elles divergent : etc.\ Next mesure 39,99023 pt tandis que etc.{} Next mesure 41,10107 pt, soit 1,11084 pt d'écart — exactement le supplément ajouté en fin de phrase (\fontdimen7). Car \ est une espace qui ne reçoit jamais ce supplément, alors qu'un blanc ordinaire tapé après {} est élargi en espace de fin de phrase. \ ne se contente donc pas de rendre une espace perdue, il annule aussi le traitement de fin de phrase — d'où son emploi pour les abréviations comme Fig.\ 5. L'heuristique de l'espace de fin de phrase elle-même — \sfcode, \@, \frenchspacing — est traitée sur la page consacrée à la ponctuation.
% widths measured with \sbox0{...}\typeout{\the\wd0}
% pdfLaTeX, TeX Live 2024, 10pt article, T1 Computer Modern
\LaTeX is % 32.37791pt -> "LaTeXis" (the blank is eaten)
\LaTeX\ is % 35.71043pt
\LaTeX{} is % 35.71043pt
{\LaTeX} is % 35.71043pt
% ...but after a period the two fixes are NOT the same:
etc.\ Next % 39.99023pt (control space: no sentence space)
etc.{} Next % 41.10107pt (+1.11084pt = \fontdimen7)Pourquoi xspace est autant un piège qu'un remède
Le package xspace permet de terminer ses propres commandes par \xspace afin qu'une espace soit ajoutée « sauf si le caractère suivant est une ponctuation », ce qui évite de taper \LaTeX{} chaque fois. Mais le test n'est rien de plus qu'une comparaison à une liste d'exceptions. Celle de xspace.sty livré avec TeX Live 2024 (maintenu par le LaTeX Project, dans le bundle tools) contient la virgule, le point, l'apostrophe, la barre oblique, le point d'interrogation, le point-virgule, les deux-points, le point d'exclamation, le tilde, le trait d'union et la parenthèse fermante, plus \ , \/, les accolades, \space, \footnote et \footnotemark. Devant tout ce qui n'y figure pas, \xspace insère une espace.
Le crochet fermant ] ne figure pas sur la liste. Si donc on définit \newcommand{\eg}{e.g.\xspace} et qu'on écrit [\eg], la sortie est [e.g. ] — une espace juste avant le crochet. Pire : comme le caractère précédent est un point, l'espace insérée est de largeur de fin de phrase ; mesurée 22,2168 pt contre 17,77344 pt sans \xspace, soit 4,44336 pt d'écart. Même chose devant \eg\% (qui donne e.g. %), devant \eg\@. et devant un guillemet droit. Et l'échec joue aussi en sens inverse : écrire \eg{} par prudence fait coïncider l'accolade avec une exception, aucune espace n'est ajoutée et \eg{}x sort en e.g.x.
\usepackage{xspace}
\newcommand{\eg}{e.g.\xspace}
\eg foo % "e.g. foo" correct
\eg, foo % "e.g., foo" correct (comma is an exception)
[\eg] % "[e.g. ]" WRONG -- ] is not an exception
\eg\% % "e.g. %" WRONG
\eg{}x % "e.g.x" WRONG -- the brace matches an exception
% You can patch the list, but every new case needs another patch:
\xspaceaddexceptions{]}On peut étendre la liste avec \xspaceaddexceptions{]}, mais chaque ajout laisse à compter ce qu'on a oublié ensuite. C'est pourquoi les auteurs aguerris évitent souvent \xspace : ils définissent simplement \newcommand{\eg}{e.g.} et écrivent \eg{} foo à l'appel, ou renoncent à la macro d'abréviation et tapent directement e.g.. \xspace ne se rentabilise vraiment que là où la macro est appelée souvent et où l'on peut garantir que seuls des mots ordinaires suivent — le nom d'un produit ou d'un projet, par exemple.
Où le tilde ~ est obligatoire : l'espace qui ne coupe jamais
~ est une espace de la largeur d'une espace inter-mots où la ligne ne peut pas se couper. Il n'y a derrière aucune espèce particulière de blanc : la définition dans latex.ltx est \DeclareRobustCommand{\nobreakspace}{\leavevmode\nobreak\ } — un simple \ précédé de \nobreak. Mesuré, x~y donne donc le même écart de 3,33252 pt que x\ y, et comme \ il refuse le supplément de fin de phrase (x.~y fait 16,6626 pt contre 17,77344 pt pour un x. y ordinaire). Tout ce que l'on cherche sous « LaTeX tilde saut de ligne » se ramène à ce seul \nobreak.
L'effet se voit le mieux dans une colonne étroite. Composez « We show in Figure 5 that it holds. » dans une parbox de 3 cm : la ligne s'arrête sur Figure et 5 ouvre la suivante. Écrivez Figure~5 et TeX préfère couper Fig-ure plutôt que de séparer les deux. ~ n'interdit donc pas seulement une coupure : il fait chercher à TeX un autre jeu de coupures. Les endroits où il est vraiment obligatoire sont ceux où un nombre, un symbole ou une abréviation isolés en début de ligne cessent d'être lisibles — Figure~5, Section~2, Eq.~(3), Chapter~12, Dr.~Smith, Knuth~(1984), des initiales comme D.~E. Knuth, une valeur et son unité comme 10~kg. Pour les renvois et les citations, le tilde se place devant \ref et \cite : Figure~\ref{fig:main}, see~\cite{knuth1984}.
% in a 3cm column, the plain space breaks the reference in half:
We show in Figure 5 that it holds. % -> "...in Figure / 5 that..."
We show in Figure~5 that it holds. % -> "...in Fig-/ure 5 that..."
See Section~\ref{sec:method} and Figure~\ref{fig:main}.
As shown by Knuth~\cite{texbook}, a mass of 10~kg suffices.
D.~E. Knuth, Dr.~Smith, Eq.~(3), Chapter~12.Deux mises en garde. D'abord, ~ refuse seulement la coupure de ligne ; il n'empêche pas la césure. C'est exactement ce qui s'est passé ci-dessus quand Fig-ure s'est coupé ; pour garder le mot entier, il faut \mbox{...}. Ensuite, LaTeX fait de ~ un caractère actif : hors de verbatim, on ne peut pas le taper tel quel pour obtenir un tilde dans une URL ou un chemin de fichier. Pour imprimer le caractère tilde dans le texte courant, on utilise \textasciitilde.
La différence entre \hspace et \hspace*
Au milieu d'une ligne, les deux se comportent de la même façon. La différence apparaît quand la ligne se coupe précisément à cet écart. TeX supprime le glue qui suit immédiatement une coupure, si bien que \hspace{1.5cm} disparaît entièrement si la coupure tombe là. Mesuré : composez alpha beta gamma\hspace{1.5cm}epsilon zeta dans une colonne de 3 cm et TeX coupe à l'écart, les 1,5 cm n'apparaissent nulle part. Passez à \hspace*{1.5cm} et la coupure ne s'y produit plus — c'est epsilon qui est coupé et l'écart de 1,5 cm subsiste sur la page.
En pratique, choisissez la forme étoilée quand l'écart fait partie de la mise en page : un champ de signature sur une page de titre, un pas fixe avant ou après un titre, ou une ligne où \hspace s'associe à \hfill pour repousser les éléments vers les marges opposées. Si vous ne voulez qu'un peu d'air pour la lisibilité, la forme sans étoile convient, et sa disparition en fin de ligne est un avantage plutôt qu'un défaut. Les valeurs négatives fonctionnent aussi : \hspace{-1em} ramène le texte d'exactement un cadratin, mesure à l'appui.
\ignorespaces et \unskip : supprimer l'espace qu'une environnement laisse fuir
\ignorespaces saute toutes les espaces qui le suivent, tandis que \unskip retire un élément de glue déjà posé devant lui. Le premier mange de l'entrée, le second rogne de la sortie — retenu ainsi, on ne les confond jamais. Mesuré : a b fait 13,8855 pt et a \unskip b 10,55298 pt, soit exactement une espace inter-mots de moins. a\ignorespaces b, avec deux blancs, donne aussi 10,55298 pt.
Leur utilité se manifeste surtout autour des environnements que l'on définit soi-même. Définissez \newenvironment{note}{\textbf{Note:}}{\textbf{.}} et écrivez \begin{note} yes \end{note} tail : les blancs après \begin{note} et avant \end{note} atteignent tous deux la page, l'ensemble mesure 70,92018 pt. Ajoutez \ignorespaces à la fin du code d'ouverture et \unskip au début du code de fermeture : on tombe à 63,1443 pt — pas un scaled point d'écart avec un \textbf{Note:}yes\textbf{.} tail écrit à la main. Le texte extrait du PDF passe de Note: yes . tail à Note:yes. tail. Ces deux mots dans une définition d'environnement rapportent surtout dans les manuscrits collectifs : que l'un revienne à la ligne après \begin et l'autre non, la sortie ne bouge plus.
% leaks a space on both sides -- measured 70.92018pt
\newenvironment{naive}{\textbf{Note:}}{\textbf{.}}
% tight on both sides -- measured 63.1443pt, identical to hand-set text
\newenvironment{tidy}{\textbf{Note:}\ignorespaces}{\unskip\textbf{.}}
\begin{tidy} yes \end{tidy} tail
% \ignorespacesafterend also swallows the blank AFTER \end{...};
% use it only when the environment must butt against what follows.- Placez les tildes d'emblée. Écrivez
Figure~\ref{...},Section~2,10~kgetDr.~Smithavec le tilde dès la frappe ; les traquer plus tard coûte cher. - Retenez que
\fait deux choses : il rend une espace perdue et annule le traitement de fin de phrase. C'est la seconde qui fait marcherFig.\ 5. - Évitez
\xspacepar défaut. Si vous l'employez, vérifiez au moins un crochet fermant, un\%et un guillemet avant de livrer. \hspace*pour les écarts qui appartiennent à la mise en page,\hspacepour ceux qui n'aident qu'à lire. Seule la forme étoilée subsiste en début de ligne.- Intégrez
\ignorespaceset\unskipdès le premier jour dans vos environnements. Posés au moment de la définition, aucun blanc parasite n'apparaît quand le manuscrit grossit.