我知道有关 XeTeX(或 LuaLaTeX)中字体回退的以下问题和答案:
- XeTeX 中的 Unicode 具有自动字体替换功能吗?
- 使用 XeLaTeX 替换字体
- 为 LuaLaTeX 中的特定 Unicode 字符定义后备字体
- 为某些阿拉伯字体不支持的非阿拉伯字符集设置后备字体
从中我了解到:
- XeTeX 无法自动找到包含给定字符的字体,但可以使用 ucharclasses 将字体分配给特定的 unicode 范围
- XeTex 可以设置为根据字符类(字符间标记)从一种字体转换到下一种字体。
\newunicodechar
可用于为给定字符分配字体。- 多语现象可用于标记各种语言的文本部分。
然而,据我所知,这些都没有涵盖以下问题:
如何告诉 XeTeX 使用特定字体“A”,但当“A”中没有字符时,返回使用另一个字体“B”(以“C”和“D”等为类推)?
换句话说,我确切地知道我想使用哪些字体,以及使用哪种优先顺序;我不需要 XeTeX 在我的系统上查找字体:我可以准确地告诉它要使用哪些字体。但这ucharclasses
行不通,因为我的字体“A”覆盖了许多类别的部分内容,但对于其余类别,我想使用“B”。
从https://tug.org/pipermail/xetex/2011-November/022321.html,我知道可以编写一个宏来检测某个字符是否在字体中。因此,我可以将文档中的每个字符包装在这个宏中,测试该字符是否在字体“A”中,如果不在,则使用字体“B”(以及“C”和“D”,直到我在列表中找到包含该字符的字体)。
答案1
只要 *TeX 中没有实现字体回退,就应该进行一些肮脏的黑客攻击或手动调整。以下是另一种肮脏的黑客攻击:
你可以使用 Font Forge python - 它确实好方法用于自动编辑字体。例如,对于字体回退,您可以使用mergeFonts
方法。可以找到可以改编的良好代码示例这里- 参见merge_fonts
函数定义。感兴趣的部分是:
merged = fontforge.open(destination)
merged.sfnt_names = []
merged.fontname = fontname
merged.familyname = familyname
merged.fullname = fullname
merged.mergeFonts(fallback.path)
merged.generate(destination)
多次使用它将产生新的字体,该字体将按照指定的后备顺序将字符拉入其自身。
PS. 我猜最好将它与 ucharclasses *TeX 包一起使用并手动指定一些 Unicode 块(例如 CJK)。
答案2
从理论上讲,可以这样做:
- 创建字体列表
- 检查字体是否存在
- 浏览所有 unicode 并测试字形在哪些字体中
- 根据测试结果分配字符类
- 设置转换类似于 ucharclasses 中的转换
实际上,在我看来,这有许多缺点。最主要的是,它可能非常慢(即使它可能比对文档中的所有字形进行测试要快)。因此,人们必须增加一些智能,例如忽略文档未使用的某些 unicode 块,或对块中的“典型字形”运行测试(但重音需要特别注意),或直接设置一些您已经知道所需字体的字体,或仅对一组已知有问题的字形运行测试,或将结果存储在某个文件中以便可以重复使用。
我有些怀疑是否值得花时间走这条路。这听起来像是为我从未真正需要的东西做了很多工作。我一直都知道我想要/可以使用哪种字体作为 unicode 块。