如何为特定字体文件设置字体特征文件而不是整个字体形状

如何为特定字体文件设置字体特征文件而不是整个字体形状

我希望使用特定的连字符设置我的文档,例如将“s”替换为“longs”,将“s t”替换为“longs_t”等,并使用 Linux Libertine G 字体。

为此,我通常用“s”编写文本,并将字体功能文件与 fontspec 包一起使用,并使用 Lualatex 进行编译。

这可以正常工作。以下是字体功能文件:

#font.fea
languagesystem DFLT dflt ;
languagesystem latn dflt ;

feature oplt {
    @notf = [a b c d e g j k m n o p q r u v w x y z];
    sub s' @notf by longs;
    sub longs longs' by s; # words don't end with longs
    sub f longs' by s;     # end with fs, not f_longs
} oplt;

feature oooo {
    sub s s by longs_s;
    sub s s by germandbls.alt;
    sub s t by longs_t;
    sub s h by longs_h;
    sub s i by longs_i;
    sub s l by longs_l;
    sub s s i by longs_longs_i;
} oooo;

下面是用 Lualatex 编译的一段代码:

\documentclass{article}
\usepackage{fontspec}
\setmainfont[FeatureFile=font.fea, RawFeature=+oplt,RawFeature=+oooo]{Linux Libertine G Regular}
\begin{document}
  ssi
  \textit{ssi}
\end{document}

我的问题是,这会失败。Lualatex 的结尾是

 !LuaTeX error (file C:/Windows/Fonts/linlibertineg_it.ttf): Invalid glyph index
  (gid 2335)

我的理解是字体功能文件应用于整个字体形状(斜体、粗体等),但问题是我放入功能文件中的某些字形存在于常规文件中,而不存在于斜体/粗体形状中。

longs_longs_i 连字符就是这种情况,它在 Linux Libertine Graphite 的常规形状中定义,而不是在 Italic 形状中定义。我没有清楚地找到使用 fontspec 为常规形状而不是其他形状设置特征文件的方法。

除了在字体文件中嵌入功能外,还有其他解决方法吗?

答案1

我没有 Linux Libertine Graphite,但我使用 Linux Libertine O 的方法可能会有效:

\documentclass{article}
\usepackage{filecontents,fontspec}
\begin{filecontents*}{font.fea}
languagesystem DFLT dflt ;
languagesystem latn dflt ;

feature oplt {
    @notf = [a b c d e g j k m n o p q r u v w x y z];
    sub s' @notf by longs;
    sub longs longs' by s; # words don't end with longs
    sub f longs' by s;     # end with fs, not f_longs
} oplt;

feature oooo {
    sub s s by longs_s;
    sub s s by germandbls.alt;
    sub s t by longs_t;
    sub s h by longs_h;
    sub s i by longs_i;
    sub s l by longs_l;
} oooo;

feature zzzz {
    sub s s i by longs_longs_i;
} zzzz;
\end{filecontents*}
\setmainfont[FeatureFile=font.fea,RawFeature=+oplt,RawFeature=+oooo,UprightFeatures={RawFeature=+zzzz}]{Linux Libertine O}
\begin{document}
  ssi
  \textit{ssi}
\end{document}

有关解释请参阅 fontspec 手册的第 7.4 节。

相关内容