处理简单文件时:
\documentclass{report}
\begin{document}
1234567890
$1234567890$
\end{document}
使用pdflatex
其中一个会得到仅具有一种字体(CMR10)的 PDF,但是当使用其中一个xelatex
或lualatex
其中一个处理时,生成的 PDF 在数学模式之外使用拉丁现代罗马字体 10,而在数学模式之内使用 CMR10。
这背后的原因是什么?
答案1
自 TeX Live 2018 起,LaTeX 默认使用 UTF-8,因为“Unicode 革命”已经完成1\usepackage[utf8]{inputenc}
。这使得在使用 pdfLaTeX 时添加 UTF-8 变得多余。
然而,pdfLaTeX 中的 UTF-8 支持是假的,当您将任意 UTF-8 字符粘贴到输入中时,您不能期望获得有意义的输出,因为底层 pdfTeX 引擎本质上仅限于 8 位编码。
这与 Xe/LuaTeX 截然不同。这些引擎默认支持 UTF-8 2。传统 TeX 字体提供的字形非常有限3。这肯定不足以描述 UTF-8,因此字体还必须覆盖整个 UTF-8 范围4。为此,引入了 TU 编码。
默认情况下,LaTeX 会加载 Computer Modern (CM) 系列字体。CMR10 字体在 TU 编码中不可用(并且永远不会可用),因此会加载其最接近的 Latin Modern Roman 10 字体。
现在的问题是,为什么拉丁现代体不用于数学模式?这是因为在数学模式下事情会更棘手一些。传统的设置是使用不同的家族和命令,如\mathbf
、\mathcal
等,切换到不同的家族。这在 Unicode 中不再可能,因为所有符号都来自一种字体。因此,家族切换方法不再有效,必须由一个更复杂的系统来代替,该系统来回交换数学代码。这是在包中实现的unicode-math
。您还会注意到为什么这是有问题的,因为使用这个unicode-math
包,TeX 突然慢了很多,因为必须一直重新分配数千个数学代码。这就是保留当前标准 OML/OMS 编码的原因。
1如今,每个人都以 UTF-8 存储文件,大多数软件都能识别 UTF-8。想想表情符号(它们无处不在)。它们是 UTF-8 的一部分,因此所有可以显示表情符号的东西都必须支持 UTF-8。2
事实上,如果您的文件不是 UTF-8,LuaTeX 会拒绝它
3 T1 编码只能编码 256 个字形
4字体是否具有所需的字形是另一个问题
答案2
在 TeX 中,文本和数学的字体设置在任务上是完全不同的——文本字体需要关注重音字符和连字符等内容,而数学字体则需要关注大量符号以及上标和下标的正确位置。
您的示例仅使用了几个字形,这些字形在 pdftex 中可以从相同的字体中获取。但是,如果您添加例如减号 (-) 或字符 (abc),则在数学内部和外部使用的字体将有所不同。并且,如果您切换到推荐的文本 T1 编码,则\usepackage[T1]{fontenc}
数字甚至会有所不同。
对于 unicode 引擎来说,即使在默认设置下也存在差异,因为使用 unicode 字体作为文本字体或多或少是强制的,才能正确显示重音字符和连字符(例如https://tex.stackexchange.com/a/470987/2388)。因此在 2017 年初,LaTeX 内核更改了此引擎的默认设置,以便用户不再被迫加载 fontspec。
在数学中,连字符和重音字符实际上并不相关,因此旧式数学设置在 unicode 引擎中有效。但即使数学设置更改为使用 unicode 字体,它也不会与文本字体相同,例如拉丁现代数学。