本文已加入專欄文章目錄,歸入「進階使用」文章系列。

引入

LaTeX 有兩種模式,文本模式(text mode)和數學模式(math mode)。逗號也有兩個「符號」,西文的逗號(U+002C)和中文的逗號(U+FF0C)。兩兩組合,共有四種情況。使用 ctex 文檔類,默認的輸出是這樣的

看默認輸出,似乎只有中西的差異,而沒有文本-數學模式的差異。通過配置其他公式字體、使用 setCJKmathfontxeCJK 宏包提供),可以讓數學模式中的中西逗號使用其他字體,從而與相應的文本模式下的逗號「長得不像」。

對純西文的文檔而言,使用合適的正文、數學字體,能在文本和數學模式下獲得比較一致的逗號。西文排版中,對於文本和數學模式下的逗號「長得不像」,也有較大的寬容。

目前的中文排版,對於「在文本和數學模式下的逗號應該長得一模一樣」有比較強的需求。一種做法是,麻煩作者,在文本模式中也使用「西文逗號 + 空格」的方式來替代中文句子中的逗號,以達到全篇逗號一致的效果。

比較折衷的方案可以是,

  • 對公式內部的逗號(如分隔有序數組的逗號 (r, 	heta)f(x, y, z)、進行列舉的逗號 i = 1, 2, dots, n ),輸入西文逗號,輸出時使用(西文)公式字體;
  • 對於在行文中起到標點作用的逗號(見下例),輸入中文逗號,輸出時使用中文字體;
  • 另有一些不明確的情況,由作者和編輯共同商議決定,並在全文保持一致。第三種情況的例子,比如「 x + 2yx = 1y = 2 時的值為 5」中的逗號。

本文嘗試「讓數學模式下輸入的西文逗號,與文本模式下輸入的中文括弧在外觀上保持一致」。

三種方案

首先是最優雅的方案,使用 unicode-math 宏包提供的 setmathfont 命令的 range 選項。為了凸顯效果,特意為數學模式下的西文逗號使用了思源宋體的最大字重。range 選項以前出現過「實際影響範圍超出指定的字元範圍」 的問題,雖然現在已經修復,使用時仍需注意。

第二種方案,是使用 LaTeX 的 NFSS 機制,讓公式模式裏的西文逗號使用中文字體。使用輔助命令(修改自這個 TeX.SX 回答)可以輸出當前字體在 NFSS 機制下的編碼、字族、字體系列和字形信息,這些信息正是命令 DeclareSymbolFont 所需的。

補例:獲取當前中文字體信息

第三種方案最為自由,是把數學模式下的逗號變成 active character,從而可以定義為宏。如果恰好使用了其他把逗號定義為宏的宏包(例如調整數學標點前後間距的宏包 mathpunctspace),就需要進行特殊的處理。

方案討論

前兩種方案,其實是使用中文字體替代(西文)公式字體,來排版數學模式下的西文逗號。這兩種方案都沒有使用「中文字體提供的中文逗號」,來排版數學模式下輸入的西文逗號。它們之所以有效,是因為中文字體在設計時,通常會保持同一字體內的中西逗號「長得像」,即只在符號寬度方面有差別。

後兩種方案,尤其是第三種方案,因為改動相對底層,使用時務必提高警惕;最好是別用。

本文介紹的方案,都是「讓輸入的西文逗號,在排版結果中長得像中文逗號」。也可以從另一個方向來嘗試滿足「逗號一致性」的需求,即「使用西文字體,排版輸入的中文逗號」。搭配使用 xeCJK 宏包的 Mapping 選項和分區字體設置功能,似乎可以做出一個方案。

稍微脫離現實一些,理想情況是,(至少)有一套「中文 - 西文 - 公式」字體,它們搭配使用十分和諧。


相關源碼 muzimuzhi/latex-examples 裏的文件

  • unicode-math-multiple-math-fonts.*
  • nfss-declare-math-symbol.*
  • add-math-active-character.*

推薦閱讀:

相關文章