Fractions, racines et exposants

Le crochet du signe radical √ et la barre qui le surmonte sont nés à 112 ans d’intervalle. Le crochet seul paraît en 1525 dans Die Coss de Christoff Rudolff ; c’est Descartes qui, en 1637, le relie au trait supérieur (le vinculum) pour former le symbole employé aujourd’hui. La barre de fraction est plus ancienne encore : on l’attribue au mathématicien maghrébin al-Hassar, au XIIe siècle, et Fibonacci l’introduit en Europe. LaTeX assemble toujours séparément ces pièces nées séparément. Cette page aborde fractions, racines et exposants à partir d’un seul fait : \frac, c’est \over sous le capot. Elle traite la répartition des rôles entre \dfrac, \tfrac, \cfrac, \binom et \genfrac, le choix entre \nicefrac et \sfrac, ainsi que les symptômes réels : une fraction qui sort trop petite, un indice de racine mal placé.

\frac, c’est \over avec des accolades autour

\frac appartient au noyau de LaTeX ; amsmath n’est pas nécessaire. La définition est visible telle quelle à la ligne 12700 de latex.ltx : \DeclareRobustCommand\frac[2]{{\begingroup#1\endgroup\over#2}}. Traduite en mots : on enferme le tout dans { }, on scelle le numérateur dans \begingroup … \endgroup, et on place entre les deux la primitive de TeX \over. Ainsi \frac{a+b}{c} et {a+b \over c} donnent la même sortie. Mesuré sous TeX Live 2024 en 10pt et Computer Modern, les deux boîtes font exactement 24,19968pt de large, 13,70952pt de haut et 6,85951pt de profondeur.

Pourquoi répète-t-on alors « utilisez \frac, pas \over » ? La différence tient aux accolades. \over est une primitive et avale comme numérateur tout ce qui se trouve à sa gauche dans le groupe courant. C’est pourquoi {x + y \over 2} ne donne pas « x plus y sur 2 » mais (x+y)/2, alors que x + \frac{y}{2}, écrit avec la même intention, donne bien x + y/2. \frac empêche structurellement cet accident, en recevant le numérateur comme argument explicite. Et si deux \over figurent dans un même groupe, TeX ne peut trancher l’ordre et s’arrête sur ! Ambiguous; you need another { and }.

latex
% same shape in the source, two different formulas
\[
  {x + y \over 2} \qquad x + \frac{y}{2}
\]

% error: Ambiguous; you need another { and }.
% \[ 1 \over 2 \over 3 \]

Charger amsmath grave cette politique dans le code. amsmath.sty met d’abord la primitive de côté avec \@saveprimitive\over\@@over, puis remplace \over, \atop et \above (ainsi que leurs formes …withdelims) de sorte que leur emploi déclenche Package amsmath Warning: Foreign command \over; \frac or \genfrac should be used instead. Il redéfinit ensuite \frac lui-même, ligne 234, en {{\begingroup#1\endgroup\@@over#2}} — afin d’appeler le vrai \over qu’il a mis de côté. Effet de bord : l’ancien {n \choose k} déclenche le même avertissement via \atopwithdelims. C’est un avertissement et non une erreur, la sortie est donc produite, mais le bon correctif est \binom.

Pourquoi la fraction sort trop petite : \dfrac et \tfrac

Parce que \frac choisit sa taille tout seul selon le style où il tombe. Dans $ … $ au fil du texte (style texte), il est composé petit pour ne pas casser la hauteur de ligne ; dans \[ … \] (style affiché), il est composé grand et aéré. En mesurant le même \frac{a+b}{c}, la version affichée fait 24,19968pt de large et 13,70952pt de haut, la version en ligne 16,39322pt et 8,79842pt — environ moitié plus. Pour couper cette décision automatique, on emploie \dfrac (toujours en taille affichée) et \tfrac (toujours en taille texte) d’amsmath, qui ne sont que des alias de \genfrac : ils sont définis comme \genfrac{}{}{}0 et \genfrac{}{}{}1. La mesure le confirme : un \tfrac dans une formule affichée sort identique à un \frac dans le texte, au cent-millième de point près.

latex
% preamble: \usepackage{amsmath}
Small in running text: $\frac{a+b}{c}$, forced large: $\dfrac{\partial f}{\partial x}$.

\[
  \frac{a+b}{c} \qquad \tfrac{a+b}{c} \qquad \dfrac{1}{1 + \dfrac{1}{x}}
\]

L’imbrication rend la question plus pressante. TeX ne connaît que quatre styles — display, texte, script, scriptscript — et le numérateur comme le dénominateur d’une fraction sont toujours composés un cran plus bas. Empiler des \frac fait donc rétrécir display → texte → script → scriptscript, et le plancher est atteint au quatrième niveau. La mesure le confirme : \frac{1}{2} fait 7,40001pt de large en style affiché, 6,38612pt en style texte, 5,80283pt en style script — et 5,80283pt aussi en scriptscript. Les troisième et quatrième niveaux sont de même taille ; on ne peut pas descendre plus bas. À ce stade, de toute façon, plus rien n’est lisible. Pour garder tous les niveaux à la même taille, empilez \dfrac ou utilisez \cfrac, à la section suivante.

  • \frac — le choix par défaut. Quand la taille naturelle doit suivre le contexte. Aucun package requis.
  • \dfrac — quand une fraction dans le texte doit rester en pleine taille plutôt que comprimée, ou quand tous les niveaux d’une imbrication doivent rester égaux. Elle écarte la hauteur de ligne ; une page entière fait sauter l’interlignage.
  • \tfrac — quand une seule fraction dans une formule affichée doit rester compacte. Convient aux fractions dans les coefficients et près des indices.
  • \cfrac — réservé aux fractions continues. La taille ne change pas, quel que soit le nombre de niveaux.

Fractions continues : \cfrac et son argument [l] / [r]

Pour les fractions continues, on emploie \cfrac d’amsmath. Les \frac imbriqués rétrécissent niveau après niveau, comme l’a montré la section précédente ; \cfrac compose chaque niveau en taille affichée, de sorte que le corps ne change pas quelle que soit la profondeur. La définition de la ligne 913 d’amsmath.sty livre tout le mécanisme : \DeclareRobustCommand{\cfrac}[3][c]{{\displaystyle\frac{\strut\ifx r#1\hfill\fi#2\ifx l#1\hfill\fi}{#3}}\kern-\nulldelimiterspace}. Elle impose \displaystyle explicitement, égalise la hauteur de chaque niveau par un \strut, et annule par le \kern-\nulldelimiterspace final l’espace résiduel à droite de la barre.

Comme l’indique le [3][c] de cette définition, \cfrac prend d’abord un argument optionnel d’alignement, valant c (centré) par défaut. \cfrac[l] cale le numérateur à gauche, \cfrac[r] à droite. Le procédé est simple : pour r, un \hfill est glissé avant le numérateur ; pour l, après. Dans une fraction continue, le dénominateur s’allonge vers le bas et la barre change donc de largeur d’un niveau à l’autre ; c’est [l] qui aligne les numérateurs sur le bord gauche.

latex
% preamble: \usepackage{amsmath}
\[
  x = 1 + \cfrac{1}{2 + \cfrac{1}{2 + \cfrac{1}{2 + \cdots}}}
  \qquad
  \cfrac[l]{1}{2 + \cfrac[l]{1}{2 + \cfrac[l]{1}{2}}}
\]

Coefficients binomiaux : \binom, une fraction à barre de 0pt

\binom{n}{k} (amsmath) compose le coefficient binomial « k parmi n » en pile verticale sans barre, entre parenthèses. Si aucune barre n’apparaît, ce n’est pas par traitement particulier, mais parce qu’il s’agit d’une fraction dont l’épaisseur de filet vaut 0pt. La ligne 240 d’amsmath.sty porte \DeclareRobustCommand{\binom}{\genfrac()\z@{}} : un \genfrac avec ( et ) pour délimiteurs, \z@ (soit 0pt) pour épaisseur, et un style vide qui suit le contexte. Pour figer la taille, il existe \dbinom (toujours affiché) et \tbinom (toujours texte), qui ne sont eux non plus que \genfrac(){0pt}0 et \genfrac(){0pt}1.

\genfrac est la commande générale sur laquelle reposent toutes les précédentes, et elle prend six arguments : \genfrac{délimiteur gauche}{délimiteur droit}{épaisseur du filet}{style}{numérateur}{dénominateur}. Le quatrième, le style, est un entier 03 désignant dans l’ordre \displaystyle, \textstyle, \scriptstyle et \scriptscriptstyle ; laissé vide, il suit le contexte. Ainsi \genfrac[]{1pt}{0}{a}{b} donne une fraction entre crochets, filet épais de 1pt, toujours en taille affichée. C’est l’issue de secours quand les commandes standard ne produisent pas l’aspect voulu. L’ancienne graphie {n \choose k} déclenche l’avertissement amsmath montré plus haut : remplacez-la par \binom.

latex
% preamble: \usepackage{amsmath}
\[
  \binom{n}{k} = \frac{n!}{k!\,(n-k)!}
  \qquad \dbinom{n}{k} \qquad \tbinom{n}{k}
  \qquad \genfrac[]{1pt}{0}{a}{b}
\]

\sqrt et racines n-ièmes : l’indice chevauche \root … \of

\sqrt{contenu} est une commande du noyau de LaTeX ; amsmath n’est pas requis. Le radical et le trait qui monte à sa droite (le vinculum) s’étirent automatiquement à la hauteur et à la largeur du contenu. Pour une racine n-ième, on passe l’indice en argument optionnel entre crochets : \sqrt[3]{x+y}. Ce sont deux implémentations distinctes. La ligne 12701 de latex.ltx porte \DeclareRobustCommand\sqrt{\@ifnextchar[\@sqrt\sqrtsign} — si un [ suit, on passe à \@sqrt, sinon au glyphe nu \sqrtsign — et la ligne 12702, \def\@sqrt[#1]{\root #1\of}, aiguille le cas indicé vers \root … \of. L’indice est composé en \scriptscriptstyle, précédé d’un espace de \mkern5mu, et relevé de 0,6 fois la hauteur du signe. Le crochet de Rudolff et la barre de Descartes sont nés séparément, et l’implémentation le montre encore.

Une fois le mécanisme compris, la plainte classique s’explique : avec un radicande haut, l’indice atterrit à un endroit incongru. Il est relevé proportionnellement à la hauteur du signe radical ; plus le contenu est haut, plus il dérive loin à gauche du signe. amsmath fournit \leftroot{n} et \uproot{n} pour l’ajuster, écrits juste avant l’indice, comme dans \sqrt[\leftroot{2}\uproot{3}\beta]{x}. L’unité est le mu (unité mathématique, 1/18 d’em). À la mesure, la boîte de \sqrt[3]{x} fait 8,00272pt de haut ; avec \uproot{10}, elle s’étire à 12,14214pt. \leftroot, en revanche, ne modifie jamais la largeur : \r@@t, dans amsmath.sty, insère \mkern-\leftroot@ mu et \mkern\leftroot@ mu en paire qui s’annule, de sorte que la chasse reste identique et que seul l’indice glisse latéralement. N’y touchez que si le rendu est vraiment fautif ; le placement par défaut suffit presque toujours.

latex
% \sqrt is core LaTeX; \leftroot and \uproot need amsmath
\[
  \sqrt{x^2 + y^2} \qquad \sqrt[3]{x+y} \qquad \sqrt[n]{a}
  \qquad \sqrt[\leftroot{2}\uproot{3}\beta]{\frac{a}{b}}
\]

Exposants et ! Double superscript

Les exposants s’écrivent avec l’accent circonflexe ^ : x^2 se lit « x au carré ». C’est une fonction du noyau, aucun package n’est requis. Le piège tient aux exposants de plus d’un caractère, car ^ ne prend que le seul token qui le suit. x^10 est composé comme « x à la puissance un » suivi d’un 0 égaré, et comme aucune erreur n’est signalée, cela passe facilement inaperçu. Mettez toujours des accolades : x^{10}. En revanche, deux exposants sur la même base, comme x^2^3, arrêtent la compilation sur ! Double superscript. — et TeX propose obligeamment sa propre lecture : I treat x^1^2 essentially like x^1{}^2. Pour un vrai exposant double, imbriquez : x^{2^3}. Mettre indice et exposant sur la même lettre, ainsi que les unités d’espacement mathématique, relèvent de la page distincte « Exposants, indices et espacement ».

latex
% braces decide the scope; x^10 is x-to-the-first followed by 0
\[
  x^{10} \qquad x^{2^3} \qquad
  x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
\]

Fractions obliques : \nicefrac et \sfrac dans le texte

Si vous voulez seulement écrire « environ 3/4 d’heure » au fil du texte, une petite fraction oblique perturbe bien moins la ligne qu’une pile verticale. Le vétéran est \nicefrac{a}{b}, du package nicefrac, en usage depuis 1998 au sein du lot units. L’option plus récente est \sfrac{a}{b}, du package xfrac, qui relève des l3packages de LaTeX3 ; la version fournie dans TeX Live 2024 est datée du 2024-02-13. La description de nicefrac sur CTAN indique elle-même que le package xfrac offre les mêmes possibilités de façon plus propre : pour un document neuf, \usepackage{xfrac} avec \sfrac est donc le choix sûr par défaut.

La différence se voit à la mesure. Au fil du texte (mode texte), la boîte de \sfrac{3}{4} fait 9,00314pt de large pour 0,13495pt de profondeur, alors que \nicefrac{3}{4} fait 11,30565pt de large pour 2,5pt. \sfrac fait appel aux véritables chiffres de numérateur et de dénominateur de la fonte : il est donc plus étroit et descend à peine sous la ligne de base — d’où une perturbation moindre de l’interlignage. En mode mathématique ($ … $), en revanche, les deux boîtes sont sorties identiques, 11,30565pt de large sur 2,5pt de profondeur : l’avantage de \sfrac est un avantage en mode texte. Le partage est simple : \frac ou \dfrac pour les fractions à empiler, \sfrac pour celles qui doivent rester petites dans une phrase (\nicefrac si un document existant l’emploie déjà).

latex
% \usepackage{nicefrac}  (the older one)
It takes about \nicefrac{3}{4} of an hour.

% \usepackage{xfrac}  (recommended for new documents)
That is roughly \sfrac{1}{2} of the total, or $\sfrac{1}{2}$ in math mode.
CommandePackage requisCe qu’elle produit
\frac{a}{b}aucun (noyau LaTeX)fraction avec barre ; taille suivant le contexte ; \over à l’intérieur
\dfrac{a}{b}amsmathtoujours en taille affichée ; alias de \genfrac{}{}{}0
\tfrac{a}{b}amsmathtoujours en taille texte ; alias de \genfrac{}{}{}1
\cfrac{a}{b}amsmathfraction continue ; niveaux de taille égale ; [l] / [r] alignent le numérateur
\binom{n}{k}amsmathbinomial sans barre entre parenthèses ; aussi \dbinom et \tbinom
\genfracamsmathla forme générale : délimiteurs, épaisseur du filet et style, en six arguments
\overaucun (primitive TeX)prend pour numérateur tout ce qui est à sa gauche dans le groupe ; avertit sous amsmath
\sqrt{x}aucun (noyau LaTeX)racine carrée ; \sqrt[n]{x} pour la racine n-ième ; ajuster l’indice avec \leftroot / \uproot (amsmath)
\nicefrac{a}{b}nicefracpetite fraction oblique a/b ; issue du lot units de 1998
\sfrac{a}{b}xfracpetite fraction oblique ; en mode texte, elle emploie les chiffres propres de la fonte et perturbe à peine la ligne