使用 fontspec 的 addfontfeature 命令组合功能

使用 fontspec 的 addfontfeature 命令组合功能

假设我有一个字体,它有两个特性,feat1feat2。现在,根据名称,直观地看,它似乎是\addfontfeature 添加特定特征当前配置:

% feat1 & feat2 OFF
{
  \addfontfeature{feat1}
  % feat1 ON, feat2 OFF
  {
    \addfontfeature{feat2}
    % feat1 & feat2 ON
  }
  % feat1 ON, feat2 OFF
}
% feat1 & feat2 OFF

然而,据我所知,这不是会发生什么。相反,该命令的工作方式如下:

% feat1 & feat2 OFF
{
  \addfontfeature{feat1}
  % feat1 ON, feat2 OFF
  {
    \addfontfeature{feat2}
    % feat1 OFF, feat2 ON
  }
  % feat1 ON, feat2 OFF
}
% feat1 & feat2 OFF

实际行为\addfontfeature不方便的是当一个包使用它来添加字体的功能时

答案1

两个\addfontfeature是可加的:

\documentclass{scrartcl}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\begin{document}123
{\addfontfeature{Color=FF0000}blub 
 {\addfontfeature{Numbers=OldStyle}
 123}}


\end{document}

但有些特征可能会互相抵消。

在此处输入图片描述

答案2

不,不是那样的。只有冲突的选项才会相互排斥。参见此示例

\documentclass[10pt]{article}
\usepackage[nofoot]{geometry}
\usepackage{fontspec}

\setmainfont[Ligatures={TeX}, SmallCapsFeatures={%
LetterSpace=7,Letters=SmallCaps},%
Kerning=Uppercase,%
ItalicFeatures={Contextuals=Swash,Kerning=Uppercase,Style=Swash}]{Adobe Caslon Pro}

\begin{document}
\noindent
Test  out 123\\ {\addfontfeature{Ligatures=Rare} test in first ct 123\\ {\addfontfeature{Numbers=OldStyle} test  in second ct st 123} test in first ct} \\ test out 123
\end{document}

得出的结果是:

在此处输入图片描述

这是因为LigatureNumbers是独立的特征:它们不会冲突。

但请看这个例子,我重新定义了这个Numbers功能

\documentclass[10pt]{article}
\usepackage[nofoot]{geometry}
\usepackage{fontspec}

\setmainfont[Ligatures={TeX}, SmallCapsFeatures={%
LetterSpace=7,Letters=SmallCaps},%
Kerning=Uppercase,%
ItalicFeatures={Contextuals=Swash,Kerning=Uppercase,Style=Swash}]{Adobe Caslon Pro}

\begin{document}
\noindent
Test  out 123\\ 
  {
   \addfontfeature{Numbers=OldStyle} test in first ct 123\\ 
     {
       \addfontfeature{Numbers=Lining} test  in second ct st 123
      } \\
      test in first ct 123} \\ 
 test out 123
\end{document}

它的行为正如你所说的那样:

在此处输入图片描述

由于它写得非常好,我建议你看一下fontspec文档。

编辑

我了解您可能没有最新版本/在安装时遇到了一些问题,因为它对我来说运行良好。

自从我想你发布了一个关于颜色的例子,为了完整起见我也做了同样的事情:

\documentclass[10pt]{article}
\usepackage[nofoot]{geometry}
\usepackage{fontspec}

\setmainfont[Ligatures={TeX}, SmallCapsFeatures={%
LetterSpace=7,Letters=SmallCaps},%
Kerning=Uppercase,%
ItalicFeatures={Contextuals=Swash,Kerning=Uppercase,Style=Swash}]{Adobe Caslon Pro}

\begin{document}
\noindent
Test  out 123\\ 
  {
   \addfontfeature{Numbers=OldStyle} test in first ct 123\\ 
     {
       \addfontfeature{Color=FF0000} test  in second ct st 123
      } \\
      test in first ct 123} \\ test out 123
\end{document}

屈服

在此处输入图片描述

答案3

在某些条件下,似乎fontspec表现符合预期。MWE 在 TeXlive 2016 中使用 LuaLaTeX 编译:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\begin{document}
It was a {\addfontfeature{RawFeature=+smcp,RawFeature=+onum}dark 269} and stormy night.
\end{document}

在上文中,单数\addfontfeature正确地应用了小型大写字母和旧式数字。

现在,这可能取决于您使用的功能。根据fontspec文档,某些功能与其他功能相互竞争,因此您选择的功能可能相互冲突。例如,您不能同时添加 OldStyle 和 Lining 数字,因为它们相互冲突;其中一个获胜,具体取决于您如何以及在何处调用代码。无法判断,因为您没有说它们是什么。但是,我不认为您的情况就是这样。

在过去的几个月里,包括最近,发生了许多变化fontspec。我确实知道(因为我问过软件包维护者)在内部使用 plus 和 minus 来打开和关闭某些功能时存在问题。最近已更正(可能尚不可用)。您可能已经遇到了这样的问题。

因此,首先验证我的上述代码是否有效。如果它不适合您,则需要更改安装中的某些内容。如果它对您有用,请回来告诉我们您正在使用哪些特定字体功能以及正在使用哪种特定字体。

相关内容