我有一个自动生成的文档(使用 Doxygen),其中包含多种语言的许多不同 Unicode 字符:希伯来语、日语、希腊语、阿拉伯语等等。
部分文本使用等宽字体显示。
我尝试使用 DejaVu Sans 字体,它包含大多数字形,但我仍然缺少一些日文字符和等宽字体中的一些字符。
如果字体缺少字形,有什么方法可以告诉 XeLaTeX 自动进行替换?
因此,例如,它会使用一种字体作为主要字体,如果缺少某种字体,则会恢复为另一种字体,或者至少恢复为具有正确字形的非等宽字体?
答案1
正如 Andrey 指出的那样,关键在于“字符间标记”的概念。假设您有一些 CJK 字符未出现在常规字体中,并且您想为它们使用另一种字体;假设这些字符是 U+4E01 和 U+4E02。
然后执行以下操作即可:
\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{<a font>}
\newfontfamily{\JapSubstFont}{<another font with the missing chars>}
\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\JapSubst
\XeTeXcharclass"4E01=\JapSubst
\XeTeXcharclass"4E02=\JapSubst
\XeTeXinterchartoks 0 \JapSubst = {\begingroup\JapSubstFont}
\XeTeXinterchartoks 255 \JapSubst = {\begingroup\JapSubstFont}
\XeTeXinterchartoks \JapSubst 0 = {\endgroup}
\XeTeXinterchartoks \JapSubst 255 = {\endgroup}
每当\JapSubst
charclass 中的字符位于“单词”的开头或结尾或者位于“普通”字符之前或之后时,它将被排版在 中\JapSubstFont
。
还可以指定一个范围:
\count255="4E01
\loop\ifnum\count255<"5000
\XeTeXcharclass\count255=\JapSubst
\advance\count255 by 1
\repeat