Choisir une police mathématique LaTeX (newtxmath, unicode-math)

Vous avez basculé le texte en Times et les mathématiques sont restées en Computer Modern : c’est le premier écueil de quiconque choisit une police mathématique en LaTeX. Le plus fâcheux vient ensuite. Chargez mathptmx, croyez le document uniformément en Times, puis passez le PDF à pdffonts : CMEX10 y est toujours incorporé. Les signes de somme et d’intégrale restent, aujourd’hui encore, ceux de Knuth. Cette page compare les paquets de fontes mathématiques pour pdfLaTeX (newtxmath, mathpazo, fourier, kpfonts et les autres) à unicode-math avec \setmathfont sous XeLaTeX et LuaLaTeX, en comptant à chaque fois ce qui a réellement atterri dans le PDF. Les commandes d’alphabet mathématique (\mathbb, \bm et compagnie) font l’objet d’une autre page ; ici, la question est celle du choix de la fonte mathématique pour tout un document.

Changer la fonte du texte ne change pas les maths

En LaTeX, la fonte du texte et celle du mode mathématique relèvent de systèmes entièrement distincts. Remplacez la fonte du texte par une ligne \usepackage{...} : variables, opérateurs et indices resteront en Computer Modern tant que vous n’aurez pas dit autre chose. C’est un choix de conception, pas une négligence. Une police mathématique doit porter des informations qu’une fonte de texte n’a tout simplement pas — hauteur des symboles et position de l’axe, pièces d’extension qui permettent aux radicaux et aux parenthèses de grandir, abaissement des indices, épaisseur du filet de fraction : des dizaines de dimensions. Impossible de détourner une fonte de texte ordinaire pour composer des maths. Changer de fonte mathématique, c’est donc aller chercher une police faite pour cela.

Ce qui est réellement incorporé : compter avec pdffonts

Savoir si un paquet de fontes mathématiques a vraiment remplacé Computer Modern se tranche d’un coup en comptant les fontes incorporées dans le PDF. Il suffit de passer le fichier au pdffonts de Poppler (fourni par poppler-utils sur la plupart des systèmes). En compilant un même document court — une ligne de texte et une formule hors-texte contenant une intégrale, une somme, une lettre grecque minuscule et une majuscule — avec pdfLaTeX sous TeX Live 2024, les résultats se répartissent nettement en trois groupes : ceux qui remplacent complètement (newtx, newpx, fourier, kpfonts, mathdesign), ceux qui laissent du Computer Modern (mathptmx, mathpazo, eulervm), et, si l’on ne fait rien, du Computer Modern partout.

shell
# the only honest way to check which math font you actually shipped
pdflatex paper.tex
pdffonts paper.pdf

# name                                 type              emb sub uni
# ------------------------------------ ----------------- --- --- ---
# QSPJFW+NimbusRomNo9L-Regu            Type 1            yes yes yes
# CZKGAS+CMR10                         Type 1            yes yes yes   <- still Computer Modern
# UYVLXV+CMEX10                        Type 1            yes yes yes   <- the big operators
Ce que l’on chargeFontes mathématiques signalées par pdffontsReste-t-il du CM ?
(none)CMR10 CMMI10 CMSY7 CMEX10 CMMI7 CMR7Tout ; le Computer Modern math par défaut
mathptmxNimbusRomNo9L StandardSymL CMR10 CMSY10 CMMI10 CMEX10Oui. + et = viennent de CMR10, \sum et \int de CMEX10
mathpazoURWPalladioL PazoMath CMR10 CMSY10 CMEX10Oui ; les grands opérateurs restent en CMEX10
newtxmathNewTXMI txsys txmiaX txexs NewTXMI7Non. Côté texte, on obtient TeXGyreTermesX-Regular
newpxmathNewPXMI pxsys pxmiaX txexsNon ; la fonte d’extension est le même txexs que celui de newtx, et le sous-ensemble incorporé est identique
fourierFourier-Math-Symbols / -Extension / -LettersNon ; le texte est en Utopia. Une vraie ligne unique
kpfontsKp-Regular Kp-Italic Kp-Ex Kp-SyNon ; texte et maths sont entièrement en Kp
eulervmEURM10 EUFM10 EUEX10 plus CMR10 CMR7Oui ; lettres, symboles et grands opérateurs passent en Euler, mais la famille operators (chiffres, romain droit) garde la fonte du texte
mathdesignUn jeu complet MathDesign-CH-RegularNon ; avec [charter], le texte est en CharterBT

La voie classique : apparier texte et maths sous pdfLaTeX

Le geste standard sous pdfLaTeX consiste à charger un paquet de texte et un paquet de maths par paire. La recommandation la plus facile aujourd’hui est la famille newtx : \usepackage{newtxtext} à côté de \usepackage{newtxmath} donne un texte à la Times et des maths assorties. Malgré son nom, newtxtext n’incorpore pourtant pas Times mais un TeX Gyre Termes étendupdffonts affiche TeXGyreTermesX-Regular. Pour Palatino, on prend mathpazo, ou newpxtext avec newpxmath. Pour Charter, sachez qu’il n’existe aucun xcharter-math.sty : sous pdfLaTeX, on l’appelle en option, \usepackage[xcharter]{newtxmath}, et l’XCharter-Math.otf OpenType se rejoint par le \setmathfont de la section suivante. Le même schéma s’accorde à bien d’autres fontes de texte — libertine, libertinus, cochineal, erewhon, stix2, noto — et c’est là la vraie force de newtxmath.

Pour changer texte et maths d’une seule ligne, fourier (texte Utopia et maths Fourier) et kpfonts (la famille Kepler) sont des valeurs sûres : dans les mesures ci-dessus, aucun des deux n’a laissé la moindre fonte Computer Modern. L’erreur à éviter est de prendre un paquet purement textuel pour un paquet mathématique. Chargez par exemple libertinus sous pdfLaTeX et les maths restent en CM : le PDF embarque CMMI10, CMR10 et CMEX10 à côté de LibertinusSerif-Regular. Cette mesure précise figure sur la page des fontes occidentales. L’autre accident classique consiste à mélanger une fonte de texte et une fonte mathématique qui ne vont pas ensemble. Associez newtxtext (à la Times) et newpxmath (à la Palatino) : les deux fontes fonctionnent parfaitement, mais la page sonne faux, chasses et gris typographique ne s’accordant pas.

document.tex
% --- Times-like text and matching math (the easy recommendation) ---
\usepackage{newtxtext}
\usepackage{newtxmath}

% --- Palatino text and math, in one package ---
% \usepackage{mathpazo}

% --- one line for both, with no Computer Modern left behind ---
% \usepackage{fourier}     % Utopia text + Fourier math
% \usepackage{kpfonts}     % the Kepler family

% --- match math to another text face through newtxmath ---
% \usepackage{libertinus}
% \usepackage[libertinus]{newtxmath}

La voie moderne : unicode-math et \setmathfont

Sous XeLaTeX ou LuaLaTeX, charger unicode-math et écrire une seule ligne \setmathfont{…} permet de composer toutes les mathématiques à partir d’une unique police mathématique OpenType, balayant l’empilement de paquets. La contrainte de moteur est réelle : écrivez \usepackage{unicode-math} sous pdfLaTeX et tout s’arrête sur ! Package unicode-math Error: Cannot be run with pdftex!, suivi de (unicode-math) Use XeLaTeX or LuaLaTeX instead. Ce qui rend la chose possible, c’est la table MATH d’OpenType : un bloc normalisé, à l’intérieur du fichier de fonte, qui contient toutes les dimensions dont TeX a besoin pour composer des maths — épaisseur du filet de fraction, abaissement des indices, dégagement au-dessus d’un radical, assemblage d’une parenthèse extensible à partir de pièces. Comme ces valeurs résident dans la fonte, changer de fonte change du même coup les paramètres de composition. Si aucune fonte n’est nommée, Latin Modern Math est chargée par défaut.

Un piège se cache dans l’ordre de chargement. Chargez amssymb après unicode-math et vous récoltez quatre erreurs de même facture, ouvertes par ! LaTeX Error: Command \eth already defined. et poursuivies par \smallsetminus, \digamma et \backepsilon (mesuré sous TeX Live 2024). unicode-math a déjà défini ces symboles du côté Unicode, et amssymb entre en collision en tentant de les redéfinir. Inversez l’ordre — amsmath, puis amssymb, puis unicode-math — et le même document compile sans la moindre erreur. Retenez la règle « unicode-math vient toujours après les paquets liés aux fontes » et vous éviterez l’essentiel des ennuis.

Police mathématique OpenTypeCaractère et fonte de texte assortie
Latin Modern MathDans la lignée de Computer Modern ; chargée par défaut. S’accorde à Latin Modern Roman
TeX Gyre Termes MathÀ la Times ; s’accorde à TeX Gyre Termes. Versions Pagella, Bonum, Schola et DejaVu également
STIX Two MathCouverture très large, pensée pour l’édition scientifique ; s’accorde à STIX Two Text. macOS la fournit
Libertinus MathLe pendant mathématique de Libertinus Serif — un appariement que pdfLaTeX ne peut offrir
XCharter-MathLa lignée Charter. Pas de xcharter-math.sty ; on atteint l’OTF via \setmathfont
NewCMMath-RegularLa fonte mathématique de New Computer Modern ; l’aspect CM avec une couverture Unicode bien plus large
Fira MathUne police mathématique sans empattement ; utile quand diapositives et affiches veulent des maths assorties
Asana-MathUne police mathématique proche de Palatino ; une vétérane aux côtés de XITS, dérivé de STIX

The font "Latin Modern Math" cannot be found : XeLaTeX contre LuaLaTeX

Le même \setmathfont{Latin Modern Math} réussit sous LuaLaTeX et échoue sous XeLaTeX avec ! Package fontspec Error: The font "Latin Modern Math" cannot be found. — mesuré sur macOS avec TeX Live 2024. La cause tient à la façon dont chaque moteur résout un nom de fonte. LuaTeX peut chercher une fonte par son nom dans l’arborescence propre à TeX (le TDS), tandis que XeTeX interroge la base de fontes du système d’exploitation : une fonte livrée avec TeX Live mais non enregistrée auprès du système peut donc être « introuvable ». Dans le même test, seule STIX Two Math s’est également résolue sous XeLaTeX — parce que macOS fournit cette fonte à l’échelle du système. La résolution des noms moteur par moteur est traitée en détail sur la page fontspec ; voici seulement les remèdes : donner le nom de fichier (\setmathfont{latinmodern-math.otf}), ajouter [Path=…], ou passer à LuaLaTeX.

document.tex
% compile with lualatex (or xelatex, but see the note on name lookup)
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}       % must come BEFORE unicode-math
\usepackage{unicode-math}  % always after the font packages
\setmainfont{TeX Gyre Termes}       % text, via fontspec
\setmathfont{TeX Gyre Termes Math}  % the matching OpenType math font
% \setmathfont{latinmodern-math.otf} % by file name, if lookup by name fails
\begin{document}
\[ f(x) = \int_{-\infty}^{\infty} \hat f(\xi)\, e^{2\pi i x \xi}\, d\xi. \]
\end{document}

Ne prendre qu’une partie dans une autre fonte : range=

Quand la police mathématique choisie ne contient pas un caractère nécessaire, l’option range= de \setmathfont comble la lacune depuis une autre fonte. range= accepte une plage Unicode, un symbole isolé comme range=\int, un style d’alphabet comme range=\symbb (que l’on peut aussi écrire range=bb), et des combinaisons de style et d’écriture comme range=bfit/{greek,Greek}. L’effet se mesure : ajoutez \setmathfont{STIX Two Math}[range=\symbb] par-dessus une fonte principale Latin Modern Math et pdffonts signale les deux, LatinModernMath-Regular et STIXTwoMath-Regular, cette dernière ne portant que la poignée de lettres en gras tableau. Comme seuls les emplacements demandés sont chargés, ce mélange ne fait pas enfler le PDF. Seule condition : une fonte mathématique principale doit avoir été définie au préalable de la manière habituelle.

document.tex
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}                                % the main math font
\setmathfont{STIX Two Math}[range=\symbb]                     % blackboard bold only
\setmathfont{TeX Gyre Termes Math}[range=bfit/{greek,Greek}]  % bold-italic Greek only

Alors, lequel choisir ? Apparier les maths au texte

Le conseil se ramène à une règle : choisir la fonte de texte et la police mathématique par paire. Quel que soit le moteur, ce principe ne bouge pas. Sans rien faire, on obtient Computer Modern (pdfLaTeX) ou Latin Modern Math (le défaut d’unicode-math), qui sont fort convenables ; tant qu’aucune consigne éditoriale ne nomme un caractère, rien n’oblige à changer. Si vous changez sous pdfLaTeX, prenez des ensembles faits l’un pour l’autre — Times avec newtxtext plus newtxmath, Palatino avec mathpazo ou le couple newpx, Utopia avec fourier, Kepler avec kpfonts. Sous XeLaTeX ou LuaLaTeX, chargez amsmath, amssymb, unicode-math dans cet ordre et donnez à \setmainfont et \setmathfont des noms de la même famille. Puis vérifiez avec pdffonts avant d’envoyer le fichier où que ce soit. La fonte que vous croyez avoir livrée n’est peut-être pas celle que vous avez livrée — c’est précisément là que cette page a commencé.

  • Si vous ne faites rien, vous obtenez Computer Modern (pdfLaTeX) ou Latin Modern Math (défaut d’unicode-math). Sans consigne à respecter, inutile de changer.
  • Changer sous pdfLaTeX : utiliser des paquets conçus par paire. Times, c’est newtxtext plus newtxmath ; Palatino, mathpazo ; pour une seule ligne, fourier ou kpfonts.
  • Sous XeLaTeX ou LuaLaTeX : charger amsmath, amssymb, unicode-math dans cet ordre et garder \setmainfont et \setmathfont dans la même famille.
  • À éviter : mélanger une fonte de texte et une fonte mathématique étrangères l’une à l’autre (texte Times, maths Palatino). Rien n’échoue ; la page le montre.
  • Toujours terminer en vérifiant l’incorporation avec pdffonts. mathptmx et mathpazo laissent CMEX10 derrière eux.