我目前正在编写的 LaTeX 包利用了 LuaLaTeX 的部分功能,而且肯定需要 LuaLaTeX 的部分功能。我希望让包的用户界面(尤其是需要加载的选项)尽可能简单,方法是让包自行确定哪些“字体功能”已通过包提供的命令(例如、、\fontspec
和)激活。\setmainfont
\defaultfontfeatures
\addfontfeatures
fontspec
我最感兴趣的字体特性是连字,特别是那些称为“常用”(由 激活+liga
)、“必需”(+rlig
)、“上下文”(+clig
)、“历史”(+hlig
)和“自由选择”/“罕见”(+dlig
)的连字。
手册的用户指南第 25.3 节(名为“程序员界面”)中提到了我正在寻找的某些功能fontspec
。但是,没有提供具体示例来演示本节中列出的宏在实践中的使用方法。此外,我必须承认,我根本不熟悉该软件包使用的 LaTeX 方言 LaTeX3 fontspec
。因此,我无法自己构建这种类型的用户宏。
我的问题是:如何编写布尔测试(可能基于使用手册第 25.3 节中提到的接口的宏fontspec
)来查询是否已通过包提供的方法之一激活“历史”连字符fontspec
?
答案1
首先:可能有更好的方法可以做到这一点。或者至少有其他推荐的方法……
似乎会fontspec
使用激活的原始特征更新其所谓的“sclist”。sclist 是一个用分号分隔的列表,这意味着它基本上是一个标记列表。现在的想法是查看给定的原始特征是否存储在该标记列表中。包含原始特征的列表似乎是\l_fontspec_rawfeatures_sclist
。现在可以使用测试给\tl_if_in:NnTF <tokenlistmacro> { tokens } { true } { false }
定特征是否处于活动状态。
\cs_new:Npn
基本上是 的包装器\long\def
,\cs_new_eq:NN
基本上是\let
。参数规范nTF
表示该宏有三个参数,n
是括号中给出的一组标记。T
和F
也是括号中给出的参数,并且分别在测试为真或假时展开。
\ExplSyntaxOn
% test if active font has feature:
\cs_new_eq:NN \IfFontFeatureExists \fontspec_if_feature:nTF
% test if feature is active:
\cs_new:Npn \mico_fontfeature_if_active:nTF #1
{ \tl_if_in:NnTF \l_fontspec_rawfeatures_sclist { #1 } }
\cs_new_eq:NN \IfFontFeatureActive \mico_fontfeature_if_active:nTF
\ExplSyntaxOff
整个 MWE 现在看起来如下:
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Numbers=OldStyle]{LinLibertineO}
\ExplSyntaxOn
\cs_new_eq:NN \IfFontFeatureExists \fontspec_if_feature:nTF
\cs_new:Npn \mico_fontfeature_if_active:nTF #1
{ \tl_if_in:NnTF \l_fontspec_rawfeatures_sclist { #1 } }
\cs_new_eq:NN \IfFontFeatureActive \mico_fontfeature_if_active:nTF
\ExplSyntaxOff
\begin{document}
liga \IfFontFeatureExists{liga}{exists}{does not exist},
clig \IfFontFeatureExists{clig}{exists}{does not exist},
rlig \IfFontFeatureExists{rlig}{exists}{does not exist},
hlig \IfFontFeatureExists{hlig}{exists}{does not exist},
dlig \IfFontFeatureExists{dlig}{exists}{does not exist}
liga is \IfFontFeatureActive{liga}{}{not} active,
hlig is \IfFontFeatureActive{hlig}{}{not} active,
dlig is \IfFontFeatureActive{dlig}{}{not} active
\addfontfeatures{Ligatures={Common,Historic}}
liga is \IfFontFeatureActive{liga}{}{not} active,
hlig is \IfFontFeatureActive{hlig}{}{not} active,
dlig is \IfFontFeatureActive{dlig}{}{not} active
\end{document}