Alphabets mathématiques (\mathbf, \mathbb, \mathcal)

Le mode mathématique de LaTeX ne connaît pas le « changement de fonte » du texte courant. Ce qu’il connaît, ce sont les alphabets mathématiques\mathbf, \mathbb, \mathcal et compagnie — qui réaffectent chaque caractère englobé à une autre fonte. Le hic : les places sont comptées. Sur les moteurs classiques, une formule ne peut en utiliser que seize au plus. Ce plafond a été fixé en 1978 et tient toujours ; il surgit sans prévenir sous la forme ! LaTeX Error: Too many math alphabets used in version normal. Cette page va des sept commandes qui ne demandent aucun paquet au \mathbb en gras tableau (qui exige amssymb) et au \mathscr (qui exige mathrsfs), puis au gras mathématique \bm et aux commandes \sym… d’unicode-math, autour d’une seule question : comment dépenser ces seize places ?

Un alphabet mathématique est une famille, pas une fonte

Une lettre en mode mathématique est prise pour une variable et composée en italique mathématique : c’est l’alphabet mathématique par défaut. L’envelopper dans une commande comme \mathbf{v} déplace ce seul fragment vers une autre famille — TeX dit \fam. C’est là que les alphabets mathématiques se séparent des commandes de fonte du mode texte. TeX enregistre chaque caractère d’une formule sous la forme « numéro de famille, numéro de case » ; une fonte n’est donc pas un flux continu comme dans le texte courant, mais une étiquette collée sur chaque symbole. Voilà pourquoi \mathbf{fit} n’est pas le mot « fit » mais le produit de trois symboles gras f, i et t, séparés par l’espace entre variables. Pour un vrai mot droit dans une formule, on emploie \text{…} d’amsmath.

LaTeX standard fournit sept commandes d’alphabet mathématique. Toutes ont la forme \math…, nommées en parallèle des commandes de texte \textbf, \textsf et consorts. La paire à ne pas confondre est \mathnormal et \mathit : \mathnormal (par défaut) compose chaque lettre comme une variable, avec l’espacement plus large entre variables, tandis que \mathit est l’italique de texte et convient à un mot de plusieurs lettres pris comme une unité inclinée, comme \mathit{diff}. \mathrm et \mathbf sont des romains droits, le second gras. \mathsf sert aux noms de tenseurs et de catégories, \mathtt quand un jeton de type code doit figurer dans une formule.

CommandeAspectNotes
\mathnormalItalique mathématique par défautIntégré ; aspect par défaut d’une variable, espacement entre variables
\mathrmRomain droitIntégré ; constantes, opérateurs et abréviations droits
\mathbfGras droitIntégré ; droit, donc peu adapté aux variables, et sans effet sur le grec
\mathsfSans empattementIntégré ; tenseurs, noms de catégories, etc.
\mathttChasse fixe (machine à écrire)Intégré ; jetons de type code dans une formule
\mathitItalique de texteIntégré ; mot de plusieurs lettres en une unité inclinée, comme \mathit{diff}
\mathcalCalligraphique ; majuscules seulementIntégré ; familles d’ensembles, catégories, transformées. Les glyphes viennent du cmsy de Computer Modern

Quel paquet exigent \mathbb, \mathscr et \mathfrak

Le gras tableau \mathbb et la Fraktur \mathfrak exigent amssymb (ou le plus léger amsfonts) ; le script \mathscr exige mathrsfs. Seul \mathcal est intégré. \mathbb est un gras aux traits doublés — il imite l’habitude du tableau noir consistant à repasser un trait pour signifier le gras — et son usage est quasiment fixé aux ensembles de nombres : réels ℝ, complexes ℂ, entiers ℤ, rationnels ℚ, naturels ℕ. Il couvre les majuscules A–Z et rien d’autre : ni minuscules, ni chiffres.

Choisir entre \mathcal et \mathscr devient bien plus simple quand on connaît leur origine. La fonte de \mathscr est rsfs, abréviation de Ralph Smith’s Formal Script, publiée en octobre 1991. Son auteur explique dans le README qu’il s’agit d’une écriture formelle fondée sur les mains spencériennes ou copperplate du XVIIIe siècle, calquée sur un caractère du dessinateur R. Hunter Middleton et proche de ce qu’employaient les compositeurs de Springer Verlag. \mathcal, au contraire, est la capitale ornée plus informelle logée dans la fonte de symboles cmsy de Computer Modern. ℒ et 𝓛 opposent donc une main formelle à une fioriture décontractée, sans que l’une soit plus juste que l’autre. C’est précisément cette formalité qui fait préférer rsfs pour le domaine 𝒟 en analyse fonctionnelle et le lagrangien ℒ en théorie des champs.

La fonte derrière \mathfrak a elle aussi un nom. amssymb écrit \DeclareMathAlphabet{\mathfrak}{U}{euf}{m}{n}, et euf désigne Euler Fraktur : le README d’AMSFonts précise que les fontes Euler ont été dessinées par Hermann Zapf et publiées à l’origine dans les années 1990. Le même README note qu’Euler 3.0, où Zapf a redessiné de nombreux glyphes, a été offert à Donald Knuth le 10 janvier 2008, jour de son anniversaire. La fonte anguleuse des algèbres de Lie 𝔤 et des idéaux 𝔭 vient donc d’un des grands typographes du XXe siècle — et, contrairement à \mathbb et \mathcal, elle couvre majuscules et minuscules. L’Euler Script (eus) fourni par le paquet euscript appartient à la même famille.

document.tex
\usepackage{amssymb}   % \mathbb and \mathfrak
\usepackage{mathrsfs}  % \mathscr (Ralph Smith's Formal Script)
% ...
\[
  \mathbb{R} \subset \mathbb{C}, \qquad
  \mathcal{F}(f) = \hat{f}, \qquad
  \mathscr{L}(f) = F, \qquad
  \mathfrak{g} = \operatorname{Lie}(G).
\]
CommandePaquet nécessaireCouverture et usage typique
\mathbbamssymb (ou amsfonts)Majuscules A–Z seulement ; ensembles ℝ ℂ ℤ ℚ ℕ
\mathcalIntégré (aucun)Majuscules seulement ; familles, catégories, transformées. Glyphes de cmsy
\mathscrmathrsfs (ou euscript)Majuscules seulement ; le script plus formel. Glyphes de rsfs10
\mathfrakamssymb / amsfonts (euf)Majuscules et minuscules ; algèbres de Lie, idéaux. Euler Fraktur

\mathbb{2} ne provoque pas d’erreur : il compose un autre symbole

Vouloir un un ou un deux en gras tableau avec \mathbb{1} ou \mathbb{2} donne un tout autre symbole, sans avertissement ni erreur. En composant $\mathbb{2}$ avec amssymb sous TeX Live 2024 puis en extrayant le caractère du PDF, on récupère U+22AD (⊭, « not true »). La cause tient au mécanisme même : \mathbb va simplement chercher la même case dans la fonte msbm, donc ce qui occupe la case 2 de msbm10 — c’est-à-dire ⊭ — sort tel quel. Rien ne vérifie que le caractère existe. Pour la fonction indicatrice 𝟙, utilisez \mathds{1} de dsfont (la fonte Type 1 dsrom10), ou remplacez tout l’alphabet tableau avec le paquet mathalpha. \mathbbm{1} de bbm est également connu, mais la version livrée avec TeX Live n’a pas de contours Type 1 et atterrit dans le PDF en bitmap Type 3 (visible avec pdffonts) : à éviter là où les consignes de soumission rejettent les fontes bitmap.

document.tex
% A blackboard-bold digit is NOT available from amssymb:
%   $\mathbb{2}$  ->  U+22AD, silently. Use one of these instead.
\usepackage{dsfont}                              % \mathds{1}, Type 1 outlines
\usepackage[bb=dsserif,scr=rsfs]{mathalpha}      % replace the whole \mathbb alphabet
% ...
\[ \mathds{1}_{A}(x), \qquad \mathbb{1}_{A}(x) \]

Seize alphabets au maximum : Too many math alphabets

À force d’ajouter des alphabets, on finit par rencontrer ! LaTeX Error: Too many math alphabets used in version normal. Le plafond est de seize. Les codes de caractères mathématiques de TeX ne consacrent que quatre bits au numéro de famille : il ne peut donc jamais exister que les familles 0 à 15. latex.ltx l’écrit noir sur blanc avec \chardef\e@mathgroup@top=16, et porte la valeur à 256 sur les moteurs dotés de \Umathcode (XeTeX et LuaTeX). Un article nu occupe déjà quatre familles au démarrage — operators, letters, symbols, largesymbols — et amssymb plus mathrsfs en portent le total à sept. Restent environ neuf places, où viennent se ranger tour à tour \mathbf, \mathsf, \mathtt, \mathit, \mathcal, \mathbb, \mathfrak et \mathscr. Ce budget est plutôt par document que par formule : les places se remplissent dans l’ordre de première utilisation et ne sont pas rendues.

Un second gardien surveille ces mêmes seize places. \DeclareSymbolFont, qui enregistre une fonte de symboles, est protégé dans latex.ltx par le test codé en dur \ifnum\count18<15 ; au-delà survient ! LaTeX Error: Too many symbol fonts declared. C’est là le piège important : le nombre 15 s’applique quel que soit le moteur, si bien que LuaLaTeX autorise 256 alphabets mais plafonne toujours les fontes de symboles à seize. Écrire un dix-septième \DeclareSymbolFont déclenche la même erreur sous pdfLaTeX comme sous LuaLaTeX. Ce n’est qu’en appelant soi-même le \newfam de bas niveau et en dépassant le maximum qu’apparaît le message propre à TeX, ! No room for a new \mathgroup.\mathgroup et non \fam, car LaTeX2e fait de \newfam un alias de \new@mathgroup.

Il existe aussi une soupape. Les noyaux LaTeX récents réservent les deux dernières des seize places au recyclage (\c@localmathalphabets vaut 2 par défaut). Lorsqu’un quinzième ou seizième alphabet devient nécessaire dans le corps du document, le noyau prête la place à cette formule-là et la reprend ensuite. Tant qu’aucune formule ne réclame plus de deux alphabets supplémentaires, un document dépasse donc quatorze sans encombre : lors d’un essai, le compteur s’est simplement figé à 14, sans erreur. Revers de la médaille : entassez trois nouveaux alphabets ou plus dans une seule formule et c’est là que ça casse. Quand l’erreur ne frappe qu’une formule, c’est le premier soupçon. La documentation d’isomath indique explicitement qu’elle rend son propre \mathsfit optionnel à cause de cette limite de seize alphabets. Pour ne plus compter du tout, passer à XeLaTeX ou LuaLaTeX avec unicode-math est la vraie solution.

Ajouter son propre alphabet avec \DeclareMathAlphabet

Un nouvel alphabet mathématique tient en une ligne : \DeclareMathAlphabet{commande}{codage}{famille}{série}{forme}. Réservé au préambule. Besoin d’un sans empattement incliné pour les tenseurs ? \DeclareMathAlphabet{\mathsfsl}{OT1}{cmss}{m}{sl} et c’est fait. Pour qu’il s’épaississe aussi en maths grasses (le \mathversion{bold} plus bas), ajoutez \SetMathAlphabet{\mathsfsl}{bold}{OT1}{cmss}{bx}{sl}. Si vous voulez seulement un autre nom pour une fonte déjà enregistrée comme fonte de symboles, \DeclareSymbolFontAlphabet s’en charge sans consommer de place : mathrsfs.sty se réduit pour l’essentiel à ces deux lignes. Autre point utile : \DeclareMathAlphabet ne prend pas de place au moment de la déclaration, mais à la première utilisation réelle. Un paquet simplement chargé ne peut donc pas dévorer votre budget, ce qui simplifie beaucoup le diagnostic.

document.tex
% preamble only
\DeclareMathAlphabet{\mathsfsl}{OT1}{cmss}{m}{sl}
\SetMathAlphabet{\mathsfsl}{bold}{OT1}{cmss}{bx}{sl}

% costs no slot: just another name for a symbol font already declared
\DeclareSymbolFont{rsfs}{U}{rsfs}{m}{n}
\DeclareSymbolFontAlphabet{\mathscr}{rsfs}
% ...
\[ \mathsfsl{T}_{ij} \]

Maths en gras : \mathbf, \boldsymbol et \bm

\mathbf est un gras droit : il ne convient donc ni aux variables ni aux vecteurs qui doivent être inclinés, et il n’a strictement aucun effet sur les lettres grecques. Une mesure le rend concret : un document ne contenant que $\mathbf{\alpha}$, compilé avec pdfLaTeX puis passé à pdffonts, embarque exactement une fonte : CMMI10. L’α sort donc en italique mathématique ordinaire et non dans le gras CMMIB10. C’est voulu : \mathbf change de famille, et α occupe une case dont la forme ne change pas avec ce basculement. Comme il n’y a ni erreur ni avertissement, c’est typiquement le genre de défaut qui part à la soumission sans être vu.

Pour mettre en gras sans perdre l’inclinaison, le premier candidat est \boldsymbol d’amsmath (son amsbsy), et le plus robuste en pratique est \bm du paquet bm. Comme bm fait partie du bundle obligatoire latex-tools, toute distribution TeX standard le fournit : rien à installer. \bm{…} est conçu pour n’ajouter que du poids, en conservant l’inclinaison, le reste de la forme et les espaces alentour ; variables, grec et symboles — même les entrées compliquées — passent au gras de façon quasi transparente. bm redéfinit aussi \boldsymbol en alias de \bm. Mais \bm n’est pas gratuit : bm.sty possède une limite nommée \bmmax (4 par défaut) qui borne le nombre de familles réclamées pour la version grasse. Les alphabets mathématiques gras se prélèvent sur les mêmes seize places : ils entrent donc dans le budget de la section précédente. En cas de pénurie, \chardef\bmmax=6 relève la limite, au détriment des alphabets ordinaires.

Quand une formule entière doit passer en gras — dans un titre, dans une légende de figure —, on change de version mathématique plutôt que de chercher une commande. C’est le rôle de \boldmath et \mathversion{bold} ; LaTeX standard fournit deux versions, normal et bold. On peut en créer une troisième : déclarer \DeclareMathVersion{heavy}, inscrire les alphabets avec \SetMathAlphabet{…}{heavy}{…}, et \mathversion{heavy} bascule le tout. Le \hm de bm (alias \heavysymbol) est la commande de cette version heavy, \hmmax valant 3 par défaut. Attention toutefois : tant qu’aucune version heavy n’a été définie, \hm n’est que \bmécrire \hm ne donne donc rien de plus gras en soi.

document.tex
\usepackage{amsmath}   % \boldsymbol
\usepackage{bm}        % \bm -- recommended
% \chardef\bmmax=6     % raise bm's family budget if it runs out
% ...
\[
  \mathbf{v} \neq \bm{v}, \qquad
  \bm{\beta} = (\beta_1, \dots, \beta_n), \qquad
  \nabla \bm{F} = \bm{0}.
\]
\section{\boldmath A whole heading in bold maths: $E = mc^2$}
  • \mathbf — gras droit ; intégré, mais peu adapté aux variables qui doivent être inclinées, et sans effet sur le grec (mesuré ci-dessus).
  • \boldsymbol — fourni par amsmath (amsbsy) ; garde l’inclinaison et peut mettre le grec et les symboles en gras.
  • \bm — fourni par le paquet bm ; recommandé. N’ajoute que du poids, en préservant la forme et les espaces alentour. Sa consommation de familles est bornée par \bmmax (4 par défaut).
  • \boldmath / \mathversion{bold} — bascule toute la version mathématique plutôt qu’un fragment ; pour les titres et les légendes de figures.

Les commandes \sym… : des alphabets qui pointent vers Unicode

Sous XeLaTeX ou LuaLaTeX, charger unicode-math remplace les commandes d’alphabet par la famille \sym… : \symbf (gras), \symbb (gras tableau), \symcal (calligraphique), \symscr (script), \symfrak (Fraktur), \symup (droit), \symit (italique), \symsf (sans empattement). Les anciens noms subsistent, mais \mathbb est en réalité redéfini comme alias de \symbb, et \mathcal comme alias de \symcal. La différence décisive : \sym… n’est pas un changement de famille mais une projection sur les Mathematical Alphanumeric Symbols d’Unicode. Composez $\symbb{2}\ \symbb{r}\ \symcal{L}$ avec STIX Two Math sous LuaLaTeX puis ressortez les caractères du PDF : vous obtenez U+1D7DA (𝟚), U+1D563 (𝕣) et U+2112 (ℒ). Le \mathbb{2} qui donnait ⊭ à la section précédente est ici un véritable deux en gras tableau, minuscules comprises. C’est aussi grâce à cette projection qu’un caractère copié depuis le PDF conserve son sens.

Cette projection a une conséquence sur laquelle on trébuche à coup sûr sans mise en garde : \symcal et \symscr pointent vers les mêmes caractères Unicode. Les Mathematical Alphanumeric Symbols ne contiennent qu’un seul alphabet script, si bien que \symcal{L} et \symscr{L} valent tous deux U+2112. Pour les distinguer visuellement, on passe par les jeux stylistiques OpenType de la fonte, via range=. Avec STIX Two Math, faites suivre le \setmathfont principal de \setmathfont{STIX Two Math}[range=\symscr,StylisticSet=1] ; à la mesure, cette seule ligne donne 6,99 pt de large à \symcal{L} contre 8,63 pt à \symscr{L} — les chiffres confirment qu’un autre glyphe a été retenu. Ce que l’ancienne voie réglait en dépensant deux places d’alphabet, unicode-math le règle en nommant une fonctionnalité de fonte.

document.tex
% compile with xelatex or lualatex
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
\setmathfont{STIX Two Math}[range=\symscr,StylisticSet=1]  % a second script shape
% ...
\[
  \symbb{R} \subset \symbb{C}, \qquad \symbb{2}, \qquad
  \symcal{F} \neq \symscr{F}, \qquad \symfrak{g}, \qquad
  \symbfit{v} = \symbf{0}.
\]

Une dernière mise en garde sur \symbf avec unicode-math. Dans la configuration par défaut (bold-style=TeX), \symbf{v} est un gras *droit*. À la mesure, \symbf{v} donne U+1D42F (v romain gras) et \symbfit{v} donne U+1D497 (v italique gras). Si votre usage veut les vecteurs en gras italique, employez \symbfit ou fixez bold-style=ISO. Le choix de la police mathématique pour l’ensemble du document — que passer à \setmathfont, comment l’accorder à la fonte du texte — fait l’objet d’une page distincte.