Presque tous les outils de réglage fin des mathématiques en LaTeX procèdent d'une même idée : séparer l'apparence des dimensions qu'un élément occupe — sa hauteur, sa profondeur et sa largeur. \smash fait compter une chose haute pour une hauteur nulle, \vphantom réserve de la hauteur sans rien imprimer, et \rlap imprime un caractère de largeur nulle. C'est pourquoi des symptômes comme « la seule ligne contenant un radical a un interligne plus grand », « deux \sqrt voisins ne s'alignent pas en haut » ou « une condition sous une somme élargit la formule » relèvent tous de la même façon de penser. Cette page est organisée par symptôme et présente \smash, \phantom, \mathstrut, \rlap, \raisebox ainsi que la différence entre \mathrm et \operatorname, mesures à l'appui.
Trouver l'outil par le symptôme
Voici d'abord l'index. Tous ces éléments sont des outils pour ajuster le résultat imprimé en dernier lieu, et aucun ne change le sens d'une formule. Le bon ordre de travail est donc d'écrire d'abord les mathématiques simplement, puis de n'appliquer ceci que là où un défaut visible apparaît réellement. Semer \smash et \phantom par précaution se retourne contre vous dès que la fonte ou la largeur du texte change. La commande de la première colonne est aussi le terme de recherche : partez du symptôme et lisez en travers.
| Commande | Symptôme corrigé | Provenance |
|---|---|---|
\smash | un élément haut écarte cette seule ligne de ses voisines | noyau LaTeX ([t] / [b] d'amsmath) |
\vphantom | des radicaux ou des lignes voisins n'atteignent pas la même hauteur | plain TeX, utilisable tel quel en LaTeX |
\mathstrut | la même chose sans argument : réserve la hauteur d'une parenthèse | plain TeX ; sa définition est littéralement \vphantom( |
\phantom | on veut aligner des colonnes entre lignes mais les parties gauches diffèrent | plain TeX ; pour la largeur seule, \hphantom |
\mathclap | une longue condition sous une somme ou un produit élargit toute la formule | mathtools (\mathllap / \mathrlap en font partie) |
\rlap | imprimer quelque chose sans que cela compte dans la largeur | plain TeX ; \llap déborde vers la gauche |
\overset | placer un symbole quelconque juste au-dessus d'un = | amsmath (\underset pour dessous) |
\operatorname | un opérateur maison de plusieurs lettres n'obtient aucune espace | amsmath ; \operatorname* place les limites dessous |
\raisebox | un seul élément doit monter ou descendre d'une quantité fixe | noyau LaTeX ; peut aussi redéfinir hauteur et profondeur |
\! | les symboles sont trop écartés, comme dans l'intégrale double \int\int | plain TeX ; l'exact inverse de \,, soit −3 mu |
La ligne contenant un radical a un interligne plus grand : \smash
\smash{...} fait traiter son contenu par TeX comme une boîte de hauteur nulle et de profondeur nulle. L'encre s'imprime toujours, mais comme TeX ne voit aucune dimension verticale, il cesse de décider d'élargir l'interligne. Mesuré, $\sqrt{1-x^2}$ fait 9,13329 pt de haut, 1,26668 pt de profondeur et 35,75691 pt de large. Enveloppé dans \smash, il devient 0,0 pt de haut et 0,0 pt de profondeur, la largeur restant à 35,75691 pt. Les chiffres montrent nettement que seule la verticale est annulée et que l'horizontale n'est pas touchée.
% the radical inside the fraction pushes this line away from the one above
$y = \frac{1}{\sqrt{1 - x^2}}$
% zero its vertical size, and the leading returns to normal
$y = \frac{1}{\smash{\sqrt{1 - x^2}}}$Avec amsmath chargé, \smash reçoit un argument optionnel permettant de traiter le haut et le bas séparément. \smash[t]{...} annule la seule hauteur en laissant la profondeur ; \smash[b]{...} annule la seule profondeur en laissant la hauteur. Mesuré, \smash[t]{\sqrt{1-x^2}} donne 0,0 pt de haut et 1,26668 pt de profondeur, et \smash[b]{\sqrt{1-x^2}} donne 9,13329 pt de haut et 0,0 pt de profondeur — exactement le côté demandé et rien d'autre. Ce [t] / [b] ne figure pas dans le \smash du noyau LaTeX : amsmath réécrit la commande pour l'ajouter (le \smash nu, sans argument, remonte à plain TeX et se trouve aussi dans le noyau LaTeX).
% the descender of y drops the middle radical below the other two
$\sqrt{x} + \sqrt{y} + \sqrt{z}$
% smash away only the depth of y, and all three line up
$\sqrt{x} + \sqrt{\smash[b]{y}} + \sqrt{z}$L'exemple que donne amsmath lui-même montre la différence avec netteté. Dans \sqrt{x} + \sqrt{y} + \sqrt{z}, le jambage descendant du y fait pendre le radical du milieu un peu plus bas que les autres. En chiffres, $\sqrt{y}$ fait 7,0305 pt de haut et 3,36946 pt de profondeur, tandis que $\sqrt{x}$ fait 8,00272 pt de haut et 2,39725 pt de profondeur. Mais mesurez $\sqrt{\smash[b]{y}}$ et vous obtenez 8,00272 pt de haut et 2,39725 pt de profondeur — identique à $\sqrt{x}$ jusqu'à la dernière décimale. Supprimer la seule profondeur a ramené le radical exactement aux dimensions qu'il a au-dessus d'un x.
Deux mises en garde. D'abord, seules les dimensions disparaissent — l'encre reste —, si bien qu'un élément écrasé peut heurter la ligne du dessus. Dans un texte courant à interligne serré, regardez toujours le résultat. Ensuite, d'anciens exposés conseillent de faire précéder \smash d'un \leavevmode en début de paragraphe ; ce n'est plus nécessaire dans le noyau LaTeX actuel. \finsm@sh dans latex.ltx se termine par \leavevmode@ifvmode\box\z@ et gère lui-même le mode vertical. Employer \smash en tête de paragraphe n'a produit aucune erreur.
Des radicaux voisins ne s'alignent pas en haut : \vphantom et \mathstrut
Si \smash fait descendre ce qui est haut, \vphantom est l'opération inverse : il fait monter ce qui est bas. \vphantom{...} crée une boîte de même hauteur et même profondeur que son argument, mais de largeur nulle et sans rien imprimer. Mesuré, $\vphantom{a^2}$ fait 8,14003 pt de haut et 0,0 pt de large. Son pendant $\hphantom{a^2}$ fait 0,0 pt de haut et 9,77202 pt de large, et $\phantom{a^2}$, qui possède les deux, fait 8,14003 pt de haut et 9,77202 pt de large. Le jeu est ainsi complet : vertical seul, horizontal seul, les deux. Placez dans l'élément le plus bas un \vphantom du contenu le plus haut, et les hauteurs coïncident sans que rien ne paraisse.
% level the tops of several radicals with one strut each
$\sqrt{\mathstrut a}\;\sqrt{\mathstrut a^2}\;\sqrt{\mathstrut b}$
% or match a specific height by passing the taller content
$\sqrt{a} \;\sqrt{\vphantom{a^2}\,a}$Quand écrire à chaque fois le contenu de référence devient fastidieux, il existe un raccourci sans argument, \mathstrut. Sa définition dans plain TeX est : \def\mathstrut{\vphantom(}. Ce n'est rien d'autre qu'une parenthèse ouvrante invisible. En mathématiques, une parenthèse est commodément haute et suit la taille de la fonte, ce qui en fait un bon étalon pour égaliser des hauteurs. Les mesures concordent. $($ fait 7,5 pt de haut et 2,5 pt de profondeur. $a$ fait 4,30554 pt de haut et 0,0 pt de profondeur, mais $\mathstrut a$ devient 7,5 pt de haut et 2,5 pt de profondeur — exactement les dimensions de la parenthèse — tandis que la largeur reste à 5,28589 pt. Placez-en un en tête de chaque élément et tous s'alignent sur la hauteur d'une parenthèse.
Aligner les = dans align : \phantom et \MoveEqLeft
Passez à \phantom l'expression même sur laquelle vous alignez. Quand on déroule une suite de transformations, on veut, dès la deuxième ligne, omettre le membre de gauche et commencer au = ; mais pousser avec des espaces ordinaires casse dès que la fonte ou la formule change. Écrivez \phantom{f(x)} et vous obtenez un blanc exactement aussi large qu'un f(x) réellement composé, si bien que les = s'alignent d'eux-mêmes. Contrairement à une série de \quad comptée à la main, la largeur du blanc change avec son contenu.
\begin{align*}
f(x) &= x^2 + 2x + 1 \\
\phantom{f(x)} &= (x + 1)^2
\end{align*}
% mathtools: when the first line is too long to keep on one row
\begin{align*}
\MoveEqLeft f(x, y, z) = a + b \\
&= c + d
\end{align*}À l'inverse, quand le membre gauche de la première ligne est trop long pour tenir avant le =, le \MoveEqLeft de mathtools aide. Il pousse la première ligne à gauche du point d'alignement et prépare la colonne pour que les lignes suivantes tombent naturellement dessous. Placé en tête de ligne, il évite de compter soi-même les &. La mécanique générale de \phantom et \hphantom, ainsi que les espacements mathématiques dans leur ensemble, sont traités en détail sur la page « Indices et espacements ».
Poser sans occuper de largeur : \rlap, \llap, \mathclap
Ce groupe est le pendant horizontal de \smash. \rlap{...} imprime son contenu tout en donnant à la boîte une largeur nulle, si bien que la matière déborde vers la droite. La définition dans plain TeX tient en une ligne — \def\rlap#1{\hbox to\z@{#1\hss}} —, soit « fabriquer une boîte de largeur nulle et laisser une colle infiniment extensible pousser le surplus vers la droite », rien de plus. Mesuré, \rlap{XX} fait 0,0 pt de large alors qu'un XX nu fait 15,00003 pt. \llap, qui déborde à gauche, place simplement le \hss en premier. On les emploie pour des annotations qui sortent d'une colonne de tableau et pour repousser des numéros de ligne hors du cadre.
Pour faire de même à l'intérieur des mathématiques, on emploie \mathclap (débord symétrique), \mathllap (vers la gauche) et \mathrlap (vers la droite) de mathtools. Le cas classique est une longue condition sous une somme : enveloppée en \sum_{\mathclap{1 \le i \le j \le n}} a_{ij}, la largeur de la formule revient à celle de l'opérateur. Ce groupe, ainsi que \smashoperator et le \clap du mode texte, est traité en détail sur la page mathtools. Et lorsqu'on préfère empiler les conditions sur plusieurs lignes plutôt que les comprimer horizontalement, le \substack{...} d'amsmath est la bonne réponse : \sum_{\substack{0<i<m \\ 0<j<n}} compose les deux conditions, séparées par \\, en deux lignes sous le signe somme.
Des mots dans les mathématiques : \text, \mathrm et \operatorname
Les trois diffèrent sur exactement deux points : l'héritage ou non de la fonte environnante, et l'ajout ou non d'une espace d'opérateur. La fonte d'abord. \text (défini par amstext, que charge amsmath) hérite de la fonte du texte environnant, tandis que \mathrm impose toujours un romain droit. Les mesures le rendent net. Dans \textit{...}, \text{ab} mesure 14,24867 pt alors que \mathrm{ab} mesure 14,61809 pt. Dans \textbf{...}, \text{ab} mesure 15,64928 pt alors que \mathrm{ab} mesure de nouveau 14,61809 pt — \mathrm est ressorti identique à la dernière décimale quel que soit le contexte. Employez \text pour des mots à lire sur le même ton que la prose environnante, et \mathrm pour les unités et les étiquettes d'indice qui doivent toujours rester droites.
Le second point, l'espacement, sépare \mathrm de \operatorname. \operatorname (défini par amsopn, que charge amsmath) traite son contenu comme un opérateur, un \mathop, si bien qu'une respiration apparaît automatiquement de part et d'autre. Mesuré, $\mathrm{max} x$ fait 24,32645 pt et $\operatorname{max} x$ fait 25,99307 pt — un écart de 1,66662 pt, exactement une espace fine de 3 mu. Avec un opérande de chaque côté, $a \mathrm{mod} b$ et $a \operatorname{mod} b$ donnent 28,74428 pt contre 32,07753 pt, un écart de 3,33325 pt, soit 6 mu (3 mu de chaque côté). Curieusement, lorsqu'une ( suit, $\mathrm{max}(x)$ et $\operatorname{max}(x)$ mesurent tous deux 32,10425 pt, exactement la même chose — car les règles de TeX n'insèrent aucune espace entre un opérateur et une parenthèse ouvrante. Conclure « c'est pareil » à partir du seul exemple parenthésé serait donc prématuré. Pour placer la limite sous le symbole, employez le \operatorname*{max}_{x} étoilé (mesuré 18,61118 pt, contre 23,6459 pt pour la forme non étoilée, qui pose l'indice à côté).
\[
x_{\text{total}} \quad x_{\mathrm{total}}
\qquad
a \operatorname{mod} b \quad a \mathrm{mod} b
\]
% define it once in the preamble instead of repeating \operatorname
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator*{\argmax}{arg\,max}Si le même opérateur revient souvent, le définir une fois dans le préambule est plus sûr que de taper \operatorname à chaque occurrence. Le \DeclareMathOperator{\rank}{rank} d'amsmath crée \rank comme opérateur, et le \DeclareMathOperator*{\argmax}{arg\,max} étoilé crée la version qui place les limites dessous. Le nom et son orthographe étant réunis en un seul endroit, changer la notation plus tard tient en une ligne.
Déplacer verticalement et resserrer : \raisebox et \!
\raisebox{quantité}{contenu} soulève son contenu de la quantité indiquée (une valeur négative l'abaisse). Mesuré, X fait 6,83331 pt de haut et \raisebox{2pt}{X} fait 8,83331 pt — exactement 2 pt de plus. Avec deux arguments optionnels supplémentaires, \raisebox{quantité}[hauteur][profondeur]{contenu}, on peut en outre redéfinir la hauteur et la profondeur déclarées à l'entourage. \raisebox{2pt}[0pt][0pt]{X} mesurait 0,0 pt de haut et 0,0 pt de profondeur : déplacé, puis ramené à la même « taille nulle » que \smash, d'un seul geste. Utile quand la position d'un symbole demande la plus légère correction, ou qu'un changement de fonte a décalé quelque chose verticalement.
Enfin, le cas où les symboles sont trop écartés. L'espace fine négative \! est définie dans plain TeX par \def\!{\mskip-\thinmuskip}, ce qui en fait l'exact inverse de \, (3 mu), soit −3 mu. Mesuré, $ab$ fait 9,57755 pt, $a\,b$ fait 11,24417 pt (+1,66662 pt) et $a\!b$ fait 7,91092 pt (−1,66663 pt) — parfaitement symétrique. L'occasion classique est l'intégrale multiple : $\int\int$ mesure 14,99997 pt, si ouvert qu'on y lit deux intégrales distinctes. Glissez-y deux \! et $\int\!\!\int$ mesure 11,66672 pt. Or le $\iint$ dédié d'amsmath mesure lui aussi 11,66672 pt — identique à la dernière décimale. Le vieux \int\!\!\int produit donc un résultat indiscernable de la commande spécialisée. Cela dit, là où \iint et \iiint existent, ils énoncent l'intention plus clairement et se lisent mieux ; voyez \! comme l'outil des situations sans commande toute faite.
\[
\int\int f \, dA
\qquad
\int\!\!\int f \, dA
\qquad
\iint f \, dA
\]
% an arbitrary symbol set squarely above another
\[
a \overset{!}{=} b, \qquad x \overset{?}{=} y,
\qquad A \overset{f}{\longrightarrow} B
\]Un dernier point : poser un symbole juste au-dessus d'un =. Les indices écrits avec ^ et _ s'accrochent en haut à droite et en bas à droite d'un symbole, jamais directement dessus ou dessous. \overset{dessus}{base} et \underset{dessous}{base} d'amsmath assument ce rôle, et \overset{!}{=} est la façon usuelle d'écrire « cela doit être égal », \overset{?}{=} « est-ce égal ? ». Le second argument est la base, le premier ce qu'on ajoute. Les usages plus poussés — appliqués aux flèches, imbriqués — sont traités sur la page « Décorations au-dessus et au-dessous ».