自 2016 年起,fontspec
不再支持标准 OTF 功能文件。这些文件使得定义复杂的自定义更改 OpenType 字体处理方式成为可能。该功能文件格式由 Adobe 于 20 年前开发,已经非常成熟,有据可查,并且独立于操作系统和排版应用程序。
该fontspec
手册提供了一个非常小的示例,说明了应该用来代替以前程序的新程序——并且,如果有任何其他问题,请参考的手册luaotfload
,这显然是这些更改的原因。
然而,该手册似乎并没有解决这里的关键问题(暂且不论 Adobe 的格式有什么不好以至于必须放弃的问题):我们如何将以前在该功能文件格式中轻松完成的操作转换为luaotfload
现在似乎需要的格式?
如果我们回到fontspec
手册(与的相反luaotfload
,至少给了我们一个例子),我们会发现新的语法与 Adobe 的语法有很大不同。
而之前,我们会说,例如,一个简单的替换:
substitute k by k.alt;
...我们现在应该说
["k"] = "k.alt",
...如本例所示,基于手册中的例子:
\documentclass{article}
\usepackage{fontspec}
\directlua{
fonts.handlers.otf.addfeature {
name = "kalt",
type = "substitution",
data = {
["k"] = "k.alt",
}
}
}
\setmainfont{Minion Pro}[RawFeature=+kalt]
\begin{document}
okay
\end{document}
但这就是我们能从中得到的全部信息了。我们该如何做我们过去常做的所有其他事情呢?例如,luaotfload
我过去使用 Matthew Carter 的 ›Miller‹ 字体进行上下文替换时,所期望的语法是什么,该字体提供了两个略有不同的大写字母R
s:
substitute R' [a c d e g o q s u adieresis odieresis udieresis C G O Q S U Odieresis Udieresis] by R.salt;
答案1
R
感谢 Ulrike 的提示,我的问题现在得到了解答。下面是使用Miller Text 中的两个 s 的简单上下文子示例。
\documentclass{article}
\usepackage{fontspec}
\directlua{
fonts.handlers.otf.addfeature{
name = "ralt",
type = "chainsubstitution",
lookups = {
{
type = "substitution",
data = {
["R"] = "R.salt",
},
},
},
data = {
rules = {
{
after = { { "a", "c", "e", "o", "u", "adieresis", "odieresis", "udieresis", "C", "G", "O", "Q", "S", "U", "Odieresis", "Udieresis" } },
current = { { "R" } },
lookups = { 1 },
},
},
},
}
fonts.handlers.otf.addfeature{
name = "ralt-it",
type = "chainsubstitution",
lookups = {
{
type = "substitution",
data = {
["R"] = "R.salt",
},
},
},
data = {
rules = {
{
after = { { "a", "c", "e", "i", "o", "u", "adieresis", "odieresis", "udieresis", "C", "G", "O", "Q", "S", "U", "Odieresis", "Udieresis" } },
current = { { "R" } },
lookups = { 1 },
},
},
},
}
}
\setmainfont[%
UprightFeatures={RawFeature=+ralt},
ItalicFeatures={RawFeature=+ralt-it}]{Miller Text}
\begin{document}
Roll Right \emph{Roll Right}
\end{document}