LaTeXの数式フォント選び(newtxmath・unicode-math)

本文を Times に替えたのに数式だけ Computer Modern のまま——LaTeX の 数式フォント で誰もが最初にぶつかる問題です。ところが本当に厄介なのはその先にあります。mathptmx を読み込んで「これで Times にそろった」と思った PDF を pdffonts にかけると、CMEX10 がまだ埋め込まれている。総和記号と積分記号だけは、いまもクヌースの書体のままなのです。このページでは、pdfLaTeX の数式フォントパッケージ(newtxmathmathpazofourierkpfonts など)と、XeLaTeX・LuaLaTeX の unicode-math\setmathfont を、実際に何が PDF に入ったかを数えながら 比べます。数式アルファベット(\mathbb\bm)の話は別ページ、ここで扱うのは「文書全体の数式書体をどう決めるか」です。

本文フォントを替えても数式は替わらない

LaTeX では本文のフォントと数式モードのフォントが 完全に別系統 で管理されています。だから \usepackage{...} で本文書体を差し替えても、変数も演算子も添字も、指定しないかぎり Computer Modern のままです。これは手抜きではなく設計です。数式フォントには、本文フォントが持っていない情報——記号の高さと軸の位置、根号や括弧を伸ばすための「継ぎ足しパーツ」、添字の下げ幅、分数線の太さといった数十個の寸法——が必要で、本文書体をそのまま流用しても数式は組めません。だから数式書体の変更は、専用に作られた数式フォントを持ってくる 作業になります。

何が本当に埋め込まれたか — pdffonts で数える

数式フォントパッケージが本当に Computer Modern を置き換えたかどうかは、PDF に埋め込まれたフォントを数えれば一発で分かります。Poppler の pdffonts(多くの環境で poppler-utils に入っています)に PDF を渡すだけです。同じ短い文書——本文一行と、積分・総和・ギリシャ文字・大文字ギリシャを含む一つの別行立て数式——を TeX Live 2024 の pdfLaTeX で組んで比べると、結果はきれいに三つに分かれました。完全に置き換えるものnewtxnewpxfourierkpfontsmathdesign)、Computer Modern を残すものmathptmxmathpazoeulervm)、そして何もしなければ当然すべて Computer Modern、です。

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
読み込むものpdffonts が示した数式側のフォントCM は残るか
(none)CMR10 CMMI10 CMSY7 CMEX10 CMMI7 CMR7すべて CM。既定の Computer Modern math
mathptmxNimbusRomNo9L StandardSymL CMR10 CMSY10 CMMI10 CMEX10残る。+= は CMR10、\sum \int は CMEX10
mathpazoURWPalladioL PazoMath CMR10 CMSY10 CMEX10残る。大型作用素は CMEX10 のまま
newtxmathNewTXMI txsys txmiaX txexs NewTXMI7残らない。本文側は TeXGyreTermesX-Regular
newpxmathNewPXMI pxsys pxmiaX txexs残らない。拡張フォントは newtx と同じ txexs(同一のサブセットが埋め込まれる)
fourierFourier-Math-Symbols / -Extension / -Letters残らない。本文は Utopia。一行で完結する
kpfontsKp-Regular Kp-Italic Kp-Ex Kp-Sy残らない。本文も数式も Kp 一族だけ
eulervmEURM10 EUFM10 EUEX10 + CMR10 CMR7残る。英字・記号・大型作用素は Euler、operators 族(数字など)だけ本文書体のまま
mathdesignMathDesign-CH-Regular ほか一式残らない。[charter] なら本文は CharterBT

在来方式 — pdfLaTeX で本文と数式を対にする

pdfLaTeX で数式書体を替える標準的な作法は、本文用と数式用のパッケージを対で読み込む ことです。今日いちばん勧めやすいのは newtx 系で、\usepackage{newtxtext}\usepackage{newtxmath} を並べれば Times 系の本文と数式がそろいます。ただし名前に反して、newtxtext が埋め込むのは Times そのものではなく TeX Gyre Termes の拡張版pdffonts には TeXGyreTermesX-Regular と出ます)。Palatino なら mathpazo、あるいは newpxtextnewpxmath です。Charter を使いたい場合、xcharter-math.sty というファイルは 存在しません——pdfLaTeX では \usepackage[xcharter]{newtxmath} のように newtxmath のオプションとして呼び、OpenType 版の XCharter-Math.otf は次節の \setmathfont から使います。同じ形で libertinelibertinuscochinealerewhonstix2noto など多数の本文書体に合わせられるのが newtxmath の強みです。

一行で本文と数式を丸ごと替えたいなら、fourier(Utopia 本文+Fourier 数式)と kpfonts(Kepler 一族)が確実です。どちらも実測で Computer Modern を一つも残しませんでした。逆に注意が要るのは、本文だけを替えるパッケージ を数式パッケージだと思い込むことです。たとえば libertinus を pdfLaTeX で読み込んでも数式は CM のままで、PDF には LibertinusSerif-Regular と並んで CMMI10CMR10CMEX10 が同居します。この組み合わせの実測は西欧フォントのページに載っています。もう一つの事故は、対でない本文と数式を混ぜる ことです。newtxtext(Times 系)に newpxmath(Palatino 系)を合わせると、どちらのフォントも正しく動くのに、紙の上では字幅も色(黒み)も揃わないちぐはぐな見た目になります。

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}

現代方式 — unicode-math\setmathfont

XeLaTeX・LuaLaTeX なら、unicode-math を読み込んで \setmathfont{…} を一行書くだけで、数式全体を 一つの OpenType 数式フォント から組めます。パッケージの寄せ集めが一掃されるわけです。この engine 縛りは本物で、pdfLaTeX で \usepackage{unicode-math} と書くと ! Package unicode-math Error: Cannot be run with pdftex!、続けて (unicode-math) Use XeLaTeX or LuaLaTeX instead. と出て止まります。仕組みの核心は OpenType の MATH テーブル——分数線の太さ、添字の下げ幅、根号の余白、伸縮する括弧の継ぎ足し方など、TeX が数式を組むのに必要な寸法一式がフォントファイルの中に入っている、という規格です。これがあるおかげで、フォントを差し替えるだけで組版パラメータも一緒に入れ替わります。何も指定しなければ Latin Modern Math が既定で読み込まれます。

一つ、読み込み順に地雷があります。unicode-mathamssymb を読み込むと、! LaTeX Error: Command \eth already defined. を先頭に、\smallsetminus\digamma\backepsilon同じ形のエラーが四つ 出ます(TeX Live 2024 で実測)。unicode-math はこれらの記号を Unicode 側から先に定義しており、amssymb が上書きしようとして衝突するためです。順番を逆にして amsmathamssymbunicode-math と並べれば、同じ文書がエラーなしで通ります。unicode-math は常に フォント関係のパッケージより後ろ に置く、と覚えておけば大半の事故は避けられます。

OpenType 数式フォント性格と相方になる本文書体
Latin Modern MathComputer Modern の系譜。既定で読み込まれる。相方は Latin Modern Roman
TeX Gyre Termes MathTimes 風。相方は TeX Gyre Termes。Pagella / Bonum / Schola / DejaVu 版もある
STIX Two Math科学出版向けに収録が広い。相方は STIX Two Text。macOS には同梱されている
Libertinus MathLibertinus Serif の数式版。pdfLaTeX では手に入らない組み合わせ
XCharter-MathCharter 系。pdfLaTeX 側には xcharter-math.sty は無く、OTF を \setmathfont で読む
NewCMMath-RegularNew Computer Modern の数式版。CM の外観のまま Unicode の広い収録を得たいとき
Fira Mathサンセリフの数式フォント。発表スライドやポスターで本文と揃えたいとき
Asana-MathPalatino 寄りの数式フォント。XITS(STIX 系の派生)とともに古参

The font "Latin Modern Math" cannot be found — XeLaTeX と LuaLaTeX の差

同じ \setmathfont{Latin Modern Math} が、LuaLaTeX では通り、XeLaTeX では ! Package fontspec Error: The font "Latin Modern Math" cannot be found. で落ちる——TeX Live 2024 を入れた macOS で実測した結果です。原因はフォント名の探し方にあります。LuaTeX はフォントを TeX の配布ディレクトリ(TDS)の中から名前で探せますが、XeTeX は OS のフォントデータベース に問い合わせるため、TeX Live に同梱されていても OS に登録されていないフォントは「見つからない」ことがあります。同じテストで STIX Two Math だけが XeLaTeX でも通ったのは、macOS がこのフォントを標準で持っているからでした。エンジンごとの名前解決の違いは fontspec のページが詳しいので、ここでは対処だけ挙げます——ファイル名で指定する\setmathfont{latinmodern-math.otf})か、[Path=…] を添えるか、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}

一部だけ別フォントから取る — range=

選んだ数式フォントに欲しい字が入っていないときは、\setmathfontrange= オプション で足りない範囲だけを別のフォントから補えます。range= には Unicode の範囲、range=\int のような単一の記号、range=\symbbrange=bb とも書けます)のような アルファベット様式、さらに range=bfit/{greek,Greek} のように様式と文字種を組み合わせた指定が渡せます。効果は測れます——Latin Modern Math を主フォントにして \setmathfont{STIX Two Math}[range=\symbb] を足した PDF を pdffonts にかけると、LatinModernMath-RegularSTIXTwoMath-Regular の両方 が埋め込まれ、後者は黒板太字の数文字だけを運んでいました。必要な範囲しか読み込まない設計なので、混ぜても PDF が大きく膨らむことはありません。ただし 主となる数式フォントを先に通常どおり指定しておく のが前提です。

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

結局どちらを選ぶか — 本文と数式を「対」にする

助言は一つに集約できます——本文フォントと数式フォントを「対」で選ぶ。エンジンがどちらであれ、これだけが動かない原則です。何もしなければ Computer Modern(pdfLaTeX)または Latin Modern Math(unicode-math の既定)で、それは十分に美しく、投稿規程で書体が指定されていないなら替える理由はありません。pdfLaTeX で替えるなら、対になっているものを選ぶこと——Times は newtxtextnewtxmath、Palatino は mathpazonewpx 系、Utopia は fourier、Kepler は kpfonts。XeLaTeX・LuaLaTeX なら amsmathamssymbunicode-math の順に読み込み、\setmainfont\setmathfont同じ一族の名前 を渡します。そして最後に、必ず pdffonts で確かめてください。思っていたフォントが入っているとはかぎらない ——このページの出発点はまさにそれでした。

  • 何もしないなら Computer Modern(pdfLaTeX)または Latin Modern Math(unicode-math の既定)。指定が無いなら替える必要はない。
  • pdfLaTeX で替えるなら 対のパッケージを。Times は newtxtextnewtxmath、Palatino は mathpazo、一行で済ませたいなら fourierkpfonts
  • XeLaTeX・LuaLaTeX なら amsmathamssymbunicode-math の順に読み込み、\setmainfont\setmathfont を同じ一族で揃える。
  • やってはいけない のは、対でない本文と数式を混ぜること(例: Times 本文に Palatino 数式)。エラーは出ないが紙面で分かる。
  • 最後に必ず pdffonts で埋め込みを確認する。mathptmxmathpazoCMEX10 を残す。