我希望使用特定的连字符设置我的文档,例如将“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 节。