如何使用 LuaTeX 中的 OTF 特征文件将一个字形序列替换为另一个字形序列?

如何使用 LuaTeX 中的 OTF 特征文件将一个字形序列替换为另一个字形序列?

我正在尝试进行一些序列对序列的字形替换。据我从 Adob​​e 规范中了解到,"sub ... by ..." 规则的 LHS 和 RHS 不能同时包含多个字形;无论如何,如果我尝试,luatex 0.70.2-2012091206(来自 TeXLive 2012)就会出现段错误。

因此我尝试了以下方法:

languagesystem DFLT dflt;
languagesystem latn dflt;

lookup A_TO_O {
    sub a by o;
} A_TO_O;

lookup U_TO_O {
    sub u by o;
} U_TO_O;

feature test {
    sub [t]' e by s;
    sub [a]' lookup A_TO_O [u]' lookup U_TO_O;
} test;

以及以下 LaTeX 输入:

\documentclass{scrbook}
\usepackage{fontspec}
\setmainfont[FeatureFile=test.fea,RawFeature=+test;]{Times New Roman}
\begin{document}
A test and baud boud bastard.
\end{document}

我在这里尝试在第一条规则中将“te”替换为“se”,在第二条规则中将“au”替换为“oo”。

这不起作用;事实上,它什么也没做(第一条规则没有触发)。这似乎意味着 LuaTeX 不喜欢它(如果我引入了明确的语法错误,它也会做同样的事情),但我找不到任何错误消息。

如果我注释掉第二条规则,则第一条规则被触发,并且在输出中我得到的是“sest”而不是“test”。

答案1

我自己也是 OT 功能编程的新手,所以我的提示可能并不是那么有用,但是既然你从未得到任何答案……

也许合并查找没有帮助,但至少使代码更具可读性:

lookup AU_TO_OO {
  sub a by o;
  sub u by o;
} AU_TO_OO;
feature test {
  sub t' e by s;
  sub a' lookup AU_TO_OO u' lookup AU_TO_OO;
} test;

第二条规则中的标记'并非真正必要,但它们也不会造成伤害。不过,值得一试:

  sub a lookup AU_TO_OO u lookup AU_TO_OO;

我不确定组合输入字形序列是否可行:

  sub a' u' lookup AU_TO_OO;

我认为甚至可以缩短lookup,因为它被调用两次:

lookup AU_TO_OO {
  sub [a u] by o;
} AU_TO_OO;

在每种情况下,输入字形序列中的任何字形都只有一条规则lookup匹配,因此应该可以正常工作。

更新: 我上面写的大部分内容,事实证明,不起作用,尽管根据Adobe 的功能文件语法文档。 A评论@KhaledHosny 暗示了造成这种情况的原因:LuaTeX 使用FontForge 代码处理功能文件,但不是最新版本。Adobe 在 2008 年末 (v1.8) 更改了格式,添加了lookup我们代码所依赖的内容。因此需要遵循规范版本 1.7直到 LuaTeX 某天更新。要跟踪更新,请参阅错误报告

相关内容