数学字体

你把正文字体换成 Times 或 Palatino,但只有公式仍是 Computer Modern,这种不协调很明显。避免这种冲突正是本页的主题。在 LaTeX 中,文本字体和数学字体是分开选择的,因此必须有意识地为 整个文档选择数学字体,并让它与正文协调。这里同时介绍 pdfLaTeX 时代的传统包,如 mathptmxmathpazonewtxmath,以及 XeLaTeX 和 LuaLaTeX 上的现代做法:unicode-math 配合 \setmathfont,并附带可运行示例。像 \mathbb\mathcal 这样的 逐符号数学字母表命令 属于另一个页面(数学区域的“Math fonts”),这里不重复。

正文和数学字体是分开选择的

先把原则说清楚。在 LaTeX 中,正文(普通文本)的字体和数学模式的字体由 两个独立系统 管理。替换正文字体并不会自动带动数学符号和英文字母,所以会出现这样的不一致:“我用 \usepackage{...} 把正文设成 Times,但公式中的 x\sum 仍是旧字体。” 好的排版需要有意识地对齐两者,让公式中的变量和符号与周围正文具有相同的字重和气质。

默认数学字体是 Computer Modern math,也就是 Knuth 与 TeX 一起设计的字体。在 pdfLaTeX 中不做任何字体指定时,正文和数学都用 Computer Modern;由于它们本来就是一整套设计,自然协调。载入 lmodern 包会把正文换成轮廓更平滑的 Latin Modern,并配套使用 Latin Modern Math 作为数学字体(后者主要通过 unicode-math 使用)。换句话说,“什么也不做”本身已经是正文和数学匹配的起点。

从这里开始,只要你想换成其他正文字体,选择就分成两条路。pdfLaTeX 中是传统方式:为每种数学字体载入专用包;XeLaTeX 和 LuaLaTeX 中是现代方式:通过 unicode-math 指定一个 OpenType 数学字体。下面几节依次说明。

传统方式(pdfLaTeX / Type1)

在 pdfLaTeX 中,切换整个文档的数学字体要使用 数学字体包。多数包都设计成与某个正文字体 成对,因此与文本侧的包一起载入时,正文和数学会统一到同一字体家族。下表汇总常见选择。

正文 / 配套书体备注
mathptmxTimesTimes 风格数学(由 Times、Symbol 和 CM 合成);简便但略显陈旧
mathpazoPalatino带 Pazo Math 字母表的 Palatino 数学
newtxmathTimes(与 newtxtext 併用)现代 Times 风格数学;[libertine][utopia] 等选项可匹配其他正文字体
newpxmathPalatino(与 newpxtext 併用)Palatino 风格数学(需要 TeX Gyre Pagella)
fourierUtopia同时设置 Utopia 正文与 Fourier 数学
kpfonts自带正文与数学套装同时提供正文和数学的综合包
mathdesignGaramond / Charter / Utopia匹配所选正文字体的数学(garamond/charter/utopia
eulervm(任意正文字体)Euler 数学字母表;可与没有自带数学的正文字体搭配

典型用法是 同时载入文本侧和数学侧的包。例如 mathpazo 会一次性设置 Palatino 正文和 Pazo 数学。今天最容易推荐的是 newtx 系列:写 \usepackage{newtxtext,newtxmath},正文会是 Times 系,数学也会配成现代 Times 风格。newtxmath 选项丰富,加 [libertine] 可匹配 Libertine(libertinus)正文,加 [utopia](配 Erewhon 字体)可匹配 Utopia 正文。

document.tex
% --- Palatino 本文+数式 / Palatino text & math ---
\usepackage{mathpazo}            % Palatino + Pazo math

% --- Times 本文+数式(おすすめ) / Times text & math (recommended) ---
\usepackage{newtxtext}           % 本文 / text
\usepackage{newtxmath}           % 数式 / math

% --- Libertine 本文に数式を合わせる / match math to Libertine text ---
% \usepackage{libertine}
% \usepackage[libertine]{newtxmath}

需要注意的是,用不同包分别指定正文和数学时,很容易选错组合而造成冲突。把不成对的部分混在一起,例如 newtxtextnewpxmath(Times 正文配 Palatino 数学),正是在制造本页要避免的不协调。载入顺序也有讲究:数学字体包最好放在文本字体包 之后。原则很简单:正文和数学要选择成对的组合

现代方式:unicode-math(XeLaTeX 与 LuaLaTeX)

如果使用 XeLaTeX 或 LuaLaTeX,就可以摆脱传统的包拼接。unicode-math 包只需用 \setmathfont{…} 指定 一个 OpenType 数学字体,就会用它排版整个数学部分。正文用 fontspec 切换到 OpenType 文本字体,数学用 \setmathfont 切换到配套的 OpenType 数学字体;这两行就能让正文和数学对齐。unicode-math在内部载入 fontspec,并且 需要 XeTeX 或 LuaTeX 引擎(pdfLaTeX 不能运行)。它还基于 amsmath 功能,因此应先载入 amsmath

可用的 OpenType 数学字体中有不少优秀的免费选择:Latin Modern Math(Computer Modern 系谱)、STIX Two Math(科学符号覆盖广)、TeX Gyre 系列的各 Math 版本:Termes(Times 风格)、Pagella(Palatino 风格)、Bonum、Schola,Libertinus Math(Libertine / Linux Libertine 的后继),以及 XITS(源自 STIX)、Asana MathFira Math 等。如果到 \begin{document} 之前没有指定数学字体,默认会载入 Latin Modern Math

OpenType 数学字体系谱 / 特征适合搭配的正文字体
Latin Modern MathComputer Modern 系;默认Latin Modern
TeX Gyre Termes MathTimes 风格TeX Gyre Termes / Times
TeX Gyre Pagella MathPalatino 风格TeX Gyre Pagella / Palatino
STIX Two MathTimes 风格,符号覆盖很广STIX Two Text / Times
Libertinus MathLibertine 的后继Libertinus Serif
XITS / Asana / Fira Math基于 STIX / 自成体系 / 无衬线风格按用途选择

下面是最小示例。按 amsmathunicode-math 的顺序载入,然后用 \setmathfont 指定数学字体。不需要像传统方式中的 mathptmxmathpazo 那样使用 逐字体专用包;这一行会接管整个数学部分。若也要匹配正文,就用 fontspec\setmainfont 指定对应文本字体(unicode-math 会载入 fontspec,所以可省略 fontspec 本身的载入)。

document.tex
% コンパイルは xelatex または lualatex / compile with xelatex or lualatex
\documentclass{article}
\usepackage{amsmath}
\usepackage{unicode-math}
\setmainfont{TeX Gyre Termes}       % 本文(fontspec)/ text
\setmathfont{TeX Gyre Termes Math} % 数式(対の OpenType フォント)/ matching math
\begin{document}
\[
  f(x) = \int_{-\infty}^{\infty} \hat f(\xi)\, e^{2\pi i x \xi}\, d\xi.
\]
\end{document}

在这个例子中,正文是 TeX Gyre Termes(Times 风格),数学使用配套的 TeX Gyre Termes Math,因此积分号、下标、变量都与正文具有同样的书体感。若一个数学字体不够用,\setmathfontrange= 选项 可以只从其他字体补充数学字母表的一部分(详见“Math fonts”页面)。总的来说,如果使用 Unicode 引擎,unicode-math + \setmathfont 是今天的标准,配置远比传统包简单。

如何选择:让正文和数学成对

归根结底,关键建议只有一个:把正文字体和数学字体作为“成对组合”来选择。在 pdfLaTeX 中,使用设计上本来就搭配的组合,例如 newtxtext + newtxmath(Times 系)或 mathpazo(Palatino 系)。在 XeLaTeX 或 LuaLaTeX 中,用 \setmainfont{...}\setmathfont{...} 匹配家族,例如 Libertinus 正文 + Libertinus Math、TeX Gyre Pagella 正文 + 对应 Math。

  • 什么都不做: Computer Modern(pdfLaTeX)或 Latin Modern Math(unicode-math 默认)——正文和数学已经匹配。
  • 在 pdfLaTeX 中更换正文: 使用成对包。Times 用 newtxtext+newtxmath,Palatino 用 mathpazo/newpxmath,Utopia 用 fouriermathdesign
  • 在 XeLaTeX/LuaLaTeX 中: 先载入 amsmath,再载入 unicode-math,并用 \setmainfont\setmathfont 指定匹配的 OpenType 正文和数学字体。
  • 不要这样做: 混用不成对的正文和数学(例如 Times 正文配 Palatino 数学)。

另外,像 \mathbb\mathcal\mathfrak 这样 只把公式中的特定字母设为另一种书体的命令,与本页讨论的文档级数学字体选择是不同话题。它们整理在数学区域的“Math fonts”页面。正文字体本身的选择见“Western font families”,Unicode 引擎中的文本字体指定见“fontspec”,NFSS 等底层机制见“Font system”。