處理簡單檔案時:
\documentclass{report}
\begin{document}
1234567890
$1234567890$
\end{document}
一個pdflatex
人得到的 PDF 僅具有一種字體 (CMR10),但在使用任一字體xelatex
或lualatex
生成的 PDF 進行處理時,在數學模式外部使用拉丁現代羅馬 10,在內部使用 CMR10。
這背後的原因是什麼?
答案1
自 TeX Live 2018 起,LaTeX 現在預設為 UTF-8,因為「Unicode 革命」已經完成1。這使得\usepackage[utf8]{inputenc}
使用 pdfLaTeX 時添加變得多餘。
然而,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 編碼中不可用(並且永遠不會),因此會加載其最接近的拉丁現代羅馬 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 字體,它也不會與文字字體相同,而是例如拉丁現代數學。