fontspec/luaotfload:定义不需要 OTF 功能文件支持的自定义功能

fontspec/luaotfload:定义不需要 OTF 功能文件支持的自定义功能

自 2016 年起,fontspec不再支持标准 OTF 功能文件。这些文件使得定义复杂的自定义更改 OpenType 字体处理方式成为可能。该功能文件格式由 Adob​​e 于 20 年前开发,已经非常成熟,有据可查,并且独立于操作系统和排版应用程序。

fontspec手册提供了一个非常小的示例,说明了应该用来代替以前程序的新程序——并且,如果有任何其他问题,请参考的手册luaotfload,这显然是这些更改的原因

然而,该手册似乎并没有解决这里的关键问题(暂且不论 Adob​​e 的格式有什么不好以至于必须放弃的问题):我们如何将以前在该功能文件格式中轻松完成的操作转换为luaotfload现在似乎需要的格式?

如果我们回到fontspec手册(与的相反luaotfload,至少给了我们一个例子),我们会发现新的语法与 Adob​​e 的语法有很大不同。

而之前,我们会说,例如,一个简单的替换:

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‹ 字体进行上下文替换时,所期望的语法是什么,该字体提供了两个略有不同的大写字母Rs:

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}

在此处输入图片描述

相关内容