使用 CONTEXT MkIV,是否可以向数学模式中使用的字体添加自定义/虚拟 OTF 功能?以下是我想要执行的操作的简化版本。我想将1.2
数学模式中的所有 更改为1/2
,也就是说,当句点出现在数字 1 和 2 之间时,句点应更改为正斜杠。(我的最终目标是将夹在任意两个数字之间的句点 U+2E 更改为 U+66B。)
以下是我尝试实现这一目标的方法。
\startluacode
digits = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 }
replacements = { [0x2E] = { 0x2F } }
fonts.handlers.otf.addfeature {
name = "mpf",
type = "chainsubstitution",
lookups = { {
type = "multiple",
data = replacements,
} },
data = {
rules = {
{
current = { { 0x2E } },
after = { digits },
before = { digits },
lookups = { 1 },
}
}
}
}
\stopluacode
\definefontfeature[mathperiod][mpf=yes]
\starttypescript[math][xits][name]
\definefontsynonym[MathRoman][file:xits-math.otf][features=mathperiod,goodies=xits-math]
\stoptypescript
\setupbodyfont[xits]
\starttext
\startformula
1.2. %% does not work here
\stopformula
\addff{mathperiod}
1.2. %% but works here
\stoptext
这在数学模式下不起作用。但是,相同的字体功能在文本模式下有效。
如果我mps=yes
用替换ss08=yes
,我会得到直立的积分,表明功能列表确实应用于数学字体,并表明问题在于在数学模式下的mps
序列不会触发。1.2
数学字体使用扩展编码,但是,我的调查显示,普通数字仍然占据 0x30-0x39 范围,而句点的代码为 0x2E(更准确地说\Umathchar"0"0"002E
)。对吗?
我猜想 OpenType 特性只适用于mode=node
。将其添加到字体特性定义中不仅不能解决问题,而且还会使直立积分特性无效。(目前我不太关心直立积分,但另一个问题是如何让mode=base
和mode=node
特性协同工作。)