Écrivez « laisse 2cm ici » et LaTeX laisse bien 2cm. Mais dès que ce même \vspace{2cm} se retrouve en haut d’une page, la longueur disparaît sans laisser de trace. Ce n’est pas un bogue. En LaTeX, l’espace n’est pas une cote figée mais du ressort (glue) : quelque chose qui s’étire, se comprime et se jette dès qu’il ne sert plus. Cette page parcourt les unités de longueur (pt, bp, em, ex), les commandes qui produisent réellement de l’espace (\hspace, \vspace et leurs formes étoilées) et les longueurs élastiques, en suivant un seul fil : pourquoi pt et bp diffèrent de 0,375 %, pourquoi em change d’une police à l’autre à taille nominale égale, et ce que protège l’étoile de \hspace*.
pt ou bp : les unités de longueur de LaTeX
Une longueur s’écrit toujours un nombre suivi d’une unité. Décimales et valeurs négatives sont admises — 12pt, 2.5cm, -3mm — mais si l’unité manque, la compilation s’arrête sur ! Illegal unit of measure (pt inserted)., le message que produisent \hspace{2} ou \setlength{\mylen}{5} et l’une des erreurs les plus fréquentes de tout LaTeX. Les unités se répartissent en deux familles : les unités absolues, dont la valeur est fixe quelle que soit la police active (pt, bp, in, cm, mm, pc), et les unités relatives à la police, qui lisent leur valeur dans la police en cours (em, ex).
La référence des unités absolues est pt, le point TeX. Knuth a repris tel quel le point typographique anglo-américain : 1 inch = 72.27pt. À côté de lui, TeX transporte un second point, bp (big point), défini comme exactement 1/72 de pouce — le chiffre rond dont PostScript, puis PDF, ont fait leur standard. Les deux ne sont pas égaux : 1bp = 1.00375pt exactement, soit 0,375 % de plus, et 100bp valent 100.375pt. Comme la grille de coordonnées de PDF compte elle-même en 1/72 de pouce, tous les nombres d’une BoundingBox EPS ou PDF sont des bp ; réécrire \includegraphics[width=100pt] en [width=100bp] modifie donc la taille de l’image de ces 0,375 % exactement. Donner les dimensions d’une figure en millimètres est plus sûr, tout simplement parce que la confusion n’y est pas possible.
| Unité | Nature / conversion | Usage |
|---|---|---|
pt | Point TeX. 1in = 72.27pt | Référence de toutes les longueurs, tailles de police comprises |
bp | Big point. 1bp = 1.00375pt (72bp = 1in) | Point PostScript/PDF ; unité de la BoundingBox |
in | Pouce. 1in = 72.27pt | Formats de papier américains |
cm | Centimètre. 1cm = 28.45274pt | Le choix courant pour marges et figures |
mm | Millimètre. 1mm = 2.84526pt | Dimensions fines |
pc | Pica. 1pc = 12pt | Unité typographique traditionnelle, largeurs de colonne |
dd | Point Didot. 1157dd = 1238pt (≈ 1,07pt) | Tradition typographique continentale |
cc | Cicéro. 1cc = 12dd = 12.8401pt | L’équivalent du pica dans le système Didot |
sp | Scaled point. 1pt = 65536sp | Le pas interne de TeX pour toute longueur ; jamais écrit à la main |
px | Pixel. Par défaut 1px = 1bp = 1.00375pt | pdfTeX et apparentés seulement ; réglé par \pdfpxdimen |
em | Le cadratin déclaré par la police courante (\fontdimen6) | Relatif à la police ; retraits et espaces horizontaux |
ex | Hauteur d’x de la police courante (\fontdimen5) | Relatif à la police ; retouches verticales calées sur les bas de casse |
mu | Unité mathématique. 18mu = 1em | Mode mathématique uniquement ; \, vaut 3mu, \; vaut 5mu |
Vers le bas du tableau figure sp, le scaled point : le plus petit pas dans lequel TeX conserve les longueurs, avec 1pt = 65536sp. On ne l’écrit pratiquement jamais, mais ce pas fixe à la fois la précision de TeX et son plafond. Un sp mesure environ 5,4 nanomètres, bien plus fin que la longueur d’onde de la lumière visible (400–700 nm) ; à l’autre extrémité, la plus grande dimension que TeX puisse retenir, \maxdimen, vaut 16383.99998pt, soit à peine 5,76 mètres. Les deux chiffres découlent d’une seule et même contrainte : une longueur est un nombre entier de sp et doit rester sous 2^30. Les unités de l’imprimerie continentale dd (point Didot, 1157dd = 1238pt) et cc (cicéro, 1cc = 12dd) fonctionnent toujours, mais apparaissent rarement dans un document moderne.
em et ex changent avec la police
em n’est pas « la taille de la police ». C’est le cadratin (quad) que la police active déclare elle-même, la valeur que TeX appelle \fontdimen6. Une même taille nominale de 10pt donne donc des réponses différentes : en Computer Modern Roman à 10pt, 1em vaut exactement 10.00002pt, mais dans la machine à écrire Computer Modern Typewriter, à 10pt également, 1em passe à 10.4999pt, et l’italique donne 10.22217pt. L’explication courante selon laquelle « em est la largeur d’un M majuscule » ne résiste pas non plus à la mesure : dans cmr10, un M fait 9.16669pt, soit moins qu’1em. Le nom est un héritage du plomb, où le cadratin formait un carré du corps ; le chiffre réel, lui, appartient à la police.
ex fonctionne de la même manière et contient la hauteur d’x déclarée par la police (\fontdimen5). Computer Modern Roman à 10pt annonce 4.30554pt ; la linéale Computer Modern Sans, à 10pt également, annonce 4.44444pt. Choisir entre les deux n’est pas une question de direction — « em à l’horizontale, ex à la verticale » — mais de ce sur quoi l’espace doit se caler. Un blanc qui doit suivre la chasse du texte prend em ; un ajustement qui doit suivre la hauteur des bas de casse prend ex. Le mode mathématique ajoute une troisième unité, mu (math unit), avec 18mu = 1em. \quad est littéralement \hskip1em et \qquad le double, 2em ; l’espace fine \, vaut 3mu en formule et un crénage de 0.16667em (un sixième de cadratin) dans le texte. La large \; vaut 5mu, et la moyenne \: — 4mu — n’est disponible qu’après avoir chargé amsmath.
% absolute units: the same length whatever font is active
\hspace{12pt} \hspace{2.5cm} \hspace{-3mm} \hspace{100bp}
% font-relative units: the font decides the value
\hspace{1em} \vspace{2ex}
% proof that em follows the font, not the point size
\rmfamily \the\dimexpr 1em\relax % 10.00002pt at 10pt
\ttfamily \the\dimexpr 1em\relax % 10.4999pt at 10ptLongueurs élastiques : ce que font vraiment plus et minus
plus accorde une marge d’étirement, minus une marge de compression. Une longueur immobile comme 12pt est une longueur rigide ; une longueur avec du jeu, comme 1cm plus 2mm minus 1mm, est une longueur élastique, et se lit « 1cm normalement, jusqu’à 1,2cm si nécessaire, jusqu’à 0,9cm si l’on serre ». Pour TeX, ce n’est pas une fonctionnalité à part : dans une ligne, un paragraphe ou une page, tout le blanc ou presque est du ressort extensible. Si les lignes atteignent exactement les deux marges, c’est uniquement parce que les espaces entre mots sont élastiques. Inversement, aligner des \vspace{12pt} rigides revient à retirer à TeX la marge de manœuvre dont il a besoin.
% rigid: exactly 1cm, always
\vspace{1cm}
% rubber: 1cm normally, up to 1.2cm, down to 0.9cm
\vspace{1cm plus 2mm minus 1mm}
% infinite stretch: 0pt at rest, grows without limit
\vspace{\fill}Le \fill de LaTeX est un registre de ressort contenant 0pt plus 1fill : nul au repos, infiniment extensible. Comme l’étirement infini l’emporte toujours sur l’étirement fini, un seul \fill dans une ligne ou une colonne empêche tout le ressort fini alentour de s’étirer. TeX gradue l’infini en trois degrés, fil < fill < filll : \hfil porte plus 1fil et \hfill porte plus 1fill, si bien que lorsque les deux figurent sur une ligne, \hfill récupère la totalité du surplus. Pour répartir selon un rapport, on emploie \stretch{n}, c’est-à-dire 0pt plus n fill : \hspace{\stretch{2}} face à \hspace{\stretch{1}} partage le reste en 2:1, tandis que deux \fill de même force le partagent également.
Cette élasticité agit-elle vraiment à la verticale ? Parfois. Sous \flushbottom, qui aligne toutes les pages sur la même profondeur, TeX étire le ressort souple déjà présent sur la page — le \parskip entre paragraphes (0pt plus 1pt par défaut), les blancs autour des titres, un \bigskip par-ci par-là — jusqu’à ce que la colonne atteigne exactement la hauteur de la zone de texte. Sous \raggedbottom, rien de tel, et la raison tient en une seule ligne du noyau LaTeX : \raggedbottom ajoute un unique ressort au pied du texte, \vskip 0pt plus.0001fil. Ce filet d’étirement infini l’emporte sur tous les plus finis de la page et absorbe la totalité du surplus ; le ressort du texte conserve sa longueur naturelle et le reliquat s’accumule en bas. Les classes standard tranchent ensuite pour vous : article, report et book appellent \raggedbottom pour un document recto seul et \flushbottom pour twoside et twocolumn. Comme article a oneside par défaut, les plus et minus écrits sur un \vspace n’y sont presque jamais sollicités pour l’ajustement de page : déclarez \flushbottom si vous voulez qu’ils comptent.
\hspace ou \hspace*, et aussi \hfill et \dotfill
\hspace{longueur} insère de l’espace horizontal dans une ligne : \hspace{2cm} donne bien 2cm — à condition que cet espace ne tombe pas au bord d’une ligne. Chaque fois que TeX découpe un paragraphe en lignes, il supprime le ressort adjacent à chaque coupure, pour qu’aucun blanc ne pende au-delà de la marge de droite et qu’aucune ligne ne commence inexplicablement en retrait. La forme étoilée \hspace*{longueur} contourne cela. Sa définition se réduit à placer une \vrule de largeur nulle et un \nobreak devant le ressort : un filet est une boîte, pas du ressort, il ne peut donc pas être supprimé, et l’espace qui le suit n’est plus voisin du point de coupure. C’est exactement ce qu’il faut lorsqu’une première ligne doit porter un retrait forcé.
\hfill est identique à \hspace{\fill} : il écarte ce qui l’entoure autant que la ligne le permet — la méthode classique pour placer un mot au fer à gauche et un autre au fer à droite. C’est aussi du ressort, donc supprimé en bord de ligne ; écrivez \hspace*{\fill} s’il doit subsister. Quand l’écart doit être rempli plutôt que blanc, \hrulefill y trace un filet et \dotfill y aligne des points ; tous deux sont un \hfill que TeX garnit par le mécanisme des leaders (\leaders et \cleaders). La conduite entre une entrée de table des matières et son numéro de page, c’est cela ; le trait sous un champ à remplir aussi. Pour les petits écarts fixes, les \quad (1em), \qquad (2em) et \, relatifs à la police conservent leur équilibre visuel quand le corps change — un 6pt écrit en dur, non.
Name:\hspace{2cm}Date:\par
\noindent Chapter 1\quad Introduction\dotfill 1\par
\noindent left\hfill centre\hfill right\par
\noindent Signature:\hrulefill\par
% 2:1 split of the leftover space
\noindent A\hspace{\stretch{2}}B\hspace{\stretch{1}}C\par
% survives even at the start of a line
\noindent\hspace*{2cm}forced indentPourquoi \vspace disparaît à un saut de page
Parce que la même règle s’applique à la verticale. TeX supprime le ressort voisin d’une coupure où qu’elle tombe : un \vspace{3cm} qui atterrit en haut d’une page disparaît donc intégralement. À la mesure, un \vspace{3cm} placé juste après un \newpage n’apporte exactement rien — c’est en général l’explication de « l’espace marche partout sauf ici ». L’intention rejoint celle de \hspace : pas de bande blanche inexplicable en tête de page. La forme étoilée \vspace*{longueur} l’esquive par le même procédé, une \hrule de hauteur nulle et un \nobreak juste avant le ressort. On emploie \vspace* chaque fois que l’espace doit subsister quel que soit l’endroit de la coupure, par exemple pour le blanc fixe au-dessus d’une ouverture de chapitre.
Pour les blancs verticaux courants, trois tailles sont prêtes à l’emploi : \smallskip, \medskip et \bigskip, dont les valeurs standard sont 3pt plus 1pt minus 1pt, 6pt plus 2pt minus 2pt et 12pt plus 4pt minus 4pt. Dans un document en 10pt, \baselineskip vaut 12pt : un \bigskip représente donc à peu près une ligne. Toutes trois sont des longueurs élastiques et cèdent un peu selon la page. Et c’est ici que le paragraphe précédent frappe : chacune est définie comme un \vspace sans étoile (\vspace\smallskipamount, etc.) et se trouve donc supprimée à une limite de page aussi impitoyablement que n’importe quel autre ressort. Voilà pourquoi le blanc placé au-dessus d’un titre s’évapore dès que ce titre passe en tête de page ; s’il doit rester, écrivez \vspace*{\bigskipamount}. Le \fill vertical s’appelle \vfill (\vspace{\fill}) et sert à centrer verticalement une page d’une seule ligne ou à repousser un bloc de signature jusqu’au pied.
| Commande | Espace inséré | Supprimé à une coupure ? |
|---|---|---|
\hspace{len} | Ressort horizontal de la largeur donnée | Oui, en bord de ligne |
\hspace*{len} | La même largeur, précédée d’une \vrule de largeur nulle | Non |
\hfill | Identique à \hspace{\fill} : 0pt plus 1fill | Oui |
\hfil | 0pt plus 1fil ; un degré plus faible que \hfill | Oui |
\stretch{n} | 0pt plus n fill ; répartit l’espace selon un rapport | Oui |
\hrulefill | Un \hfill qui comble l’écart par un filet | Oui |
\dotfill | Un \hfill qui comble l’écart par des points ; conduites de table | Oui |
\quad | \hskip1em ; espace fixe calé sur la police | Oui |
\qquad | \hskip2em ; le double de \quad | Oui |
\, | Espace fine : 3mu en formule, 0.16667em dans le texte | Non, c’est un crénage dans le texte |
\vspace{len} | Ressort vertical de la hauteur donnée | Oui, à un saut de page |
\vspace*{len} | La même hauteur, précédée d’une \hrule de hauteur nulle | Non |
\vfill | Identique à \vspace{\fill} ; écarte verticalement le reste | Oui |
\smallskip | Un \vspace de 3pt plus 1pt minus 1pt | Oui |
\medskip | Un \vspace de 6pt plus 2pt minus 2pt | Oui |
\bigskip | Un \vspace de 12pt plus 4pt minus 4pt ; environ une ligne en 10pt | Oui |
\newlength, \setlength, \addtolength : des longueurs comme variables
Si la même longueur revient partout dans un document, déclarer un seul registre de longueur et s’y référer par son nom est bien plus facile à maintenir. \newlength{\mylen} déclare une nouvelle longueur, \setlength{\mylen}{2em} lui donne une valeur et \addtolength{\mylen}{-1pt} l’ajuste ; une modification à un seul endroit se propage à tous les usages. La déclaration n’a lieu qu’une fois : relancer \newlength sur le même nom produit ! LaTeX Error: Command \mylen already defined. Pour mesurer ce qui a réellement été composé, \settowidth{\mylen}{Total:} (avec \settoheight et \settodepth) enregistre la largeur qu’occupe effectivement ce texte. Et \the\mylen imprime la valeur courante dans le PDF quand on veut la vérifier.
Les longueurs existantes s’emploient directement dans les calculs : \textwidth (largeur du bloc de texte), \linewidth (largeur de la ligne en cours de composition — plus étroite que \textwidth dans une minipage ou une liste), \baselineskip (interligne), \parindent (retrait) et \parskip (blanc entre paragraphes, 0pt plus 1pt par défaut). Un facteur placé devant les met à l’échelle — 0.8\textwidth — et cela fonctionne sans aucun package. Mais voici un piège d’autant plus vicieux qu’il ne provoque aucune erreur. Sans le package calc, \setlength{\mylen}{\textwidth - 2em} ne déclenche absolument aucune protestation. Or il ne s’agit pas d’une soustraction : \mylen reçoit \textwidth tel quel (345.0pt dans un article par défaut) et le reste, - 2em, est composé dans le document comme du texte. On s’en aperçoit quand la chaîne « - 2em » apparaît dans le PDF. Avec \usepackage{calc}, la même ligne donne correctement 324.99997pt, et les expressions parenthésées comme (\textwidth - 2em)/2 deviennent possibles.
\usepackage{calc} % needed for + - * / inside \setlength
% ...
\newlength{\gutter}
\setlength{\gutter}{2em}
\addtolength{\gutter}{-1pt}
\newlength{\halfcol}
\setlength{\halfcol}{(\textwidth - \gutter) / 2}
\newlength{\labelw}
\settowidth{\labelw}{Total:} % width of that text once typeset
\the\halfcol % prints the value, e.g. 162.49998pt
\noindent\hspace*{0.8\textwidth}right-aligned headingEn pratique, trois habitudes suffisent. Les valeurs codées en dur sont le dernier recours : dès qu’on écrit 8cm, la proportion se rompt au moindre changement de format de papier ou de marges, alors qu’une expression appuyée sur une longueur existante — 0.8\textwidth, 2\baselineskip — y survit. Préférer les \smallskip, \medskip et \bigskip prêts à l’emploi à un \vspace{12pt} brut, et tout le document respire de façon homogène. Enfin, n’étoiler que l’espace qui doit vraiment survivre à une coupure, car un espace laissé sans étoile est un espace que TeX a le droit de jeter. Ces trois règles suffisent à faire disparaître presque entièrement le mystérieux « il n’y a qu’ici que le blanc manque ».