在 Ubuntu 上使用 TeXlive 2016 和 LuaLaTeX。考虑这个 MWE:
% !TeX program = LuaLaTeX
% !TeX encoding = UTF-8
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Numbers=OldStyle]{Linux Libertine O} % A
% \setmainfont[RawFeature=+smcp]{Linux Libertine O} % B
% \setmainfont[Letters=SmallCaps]{Linux Libertine O} % C
\begin{document}
1: 36{\addfontfeature{Numbers=Lining}36}36\par
2: It was a {\addfontfeature{RawFeature=-smcp}dark} and stormy night.\par
\end{document}
仅当 A 取消注释时,第 1 行默认显示 OldStyle 数字,但在本地请求该功能时显示 Lining 数字。太棒了!
仅取消注释 B 后,第 2 行显示小型大写字母,除非该功能在本地被删除。太棒了!
仅取消注释 C 时,第 2 行显示所有小写字母(本地删除不起作用)。这可以理解,因为语法不同。
我查看了 fontspec 文档,但不清楚这是否是未记录的实验行为。搜索有关该主题的讨论(pipermail 等)表明,至少直到最近,它还是实验性的。
我对第二种情况特别感兴趣,即 B 被取消注释。我自己的代码有一个解决方法,即预处理可选参数\setmainfont
并创建一个隐藏basefont
,其中删除了某些 OT 功能(如果最初要求的话)。如果通过否定 4 个字母的代码来删除功能是可靠的,那么我就可以摆脱我的解决方法。
随意查看了一下 luaotfload 和 fontspec 的代码,我确信通过否定删除是可靠的。但我不太擅长编程。:(