我决定使用所选答案中的 XeLaTeX 代码来调查安装在我电脑上的字体的 OpenType 特性如何获取当前字体支持的所有字体功能的列表。然而,我开始后不久就遇到了一些问题。
Calibri
在(Windows 字体)上运行上述代码会显示 4 种风格集(以及其他功能),其中只有风格集 #4 似乎会影响拉丁字符:它将g
直立字符的默认两层替换为单层替代,而斜体字母则相反。但是,维基百科上关于Calibri
(https://en.wikipedia.org/wiki/Calibri) 特别提到了风格集 #4 和 #5。这令人费解,因为前面提到的 XeLaTeX 代码没有找到风格集 #5。然而,选择所说的幽灵风格集 #5 确实产生了 Wikipedia 宣传的效果:它f
以斜体形式显示了替代方案。看来 XeLaTeX 代码没有找到字体中可用的功能。
另一方面,情况正好相反Andika New Basic
(http://software.sil.org/andika/andika-new-basic-5-500/)。XeLaTeX 代码发现可选择的功能实际上并不存在于字体中:cv01-
。SIL 声称此功能对应于另一个1
图形(http://software.sil.org/wp-content/uploads/sites/19/2015/12/AndikaNewBasic-features5.5.pdf),但选择它对CharacterVariant=1:1
结果完全没有影响。
那么,这里出了什么问题?这是 XeTeX 检测 OpenType 特性的能力的一个错误吗?还是特性编码到字体的方式有问题?还是字体正在向那些查询其 OpenType 特性的程序进行“虚假广告”?
这是我正在运行的 XeLaTeX 代码。
对于检测特征的部分,我复制了上面提到的上一个问答中的代码 --- 特征的顺序略有变化。对于案例Andika New Basic
(Calibri 的类似代码):
\documentclass{article}
\usepackage{fontspec,etoolbox,expl3}
\setmainfont{Andika New Basic}
\def\fontfeatures{abvf, abvm, abvs, aalt, akhn, nalt, halt, afrc, valt, vhal, blwf, blwm, blws, case, cpsp, smcp, c2pc, c2sc, unic, cpct, cjct, cfar, clig, cswh, curs, frac, numr, dnom, ordn, sups, subs, sinf, dist, expt, falt, fwid, haln, half, hwid, hngl, hkna, hojo, init, isol, ital, jp04, jp78, jp83, jp90, jalt, tnum, lnum, onum, pnum, ljmo, lfbd, ltra, ltrm, locl, mset, mgrk, medi, med2, nlck, nukt, opbd, size, ornm, pcap, pref, pres, psts, pstf, palt, vpal, pkna, pwid, qwid, rand, rkrf, rphf, rlig, rtbd, rtla, rtlm, ruby, smpl, liga, dlig, hlig, zero, cv01-, cv99, hist, salt, ss01, ss02, ss03, ss04, ss05, ss06, ss07, ss08, ss09, ss10, ss11, ss12, ss13, ss14, ss15, ss16, ss17, ss18, ss19, ss20, swsh, fina, fin2, fin3, twid, titl, trad, tnam, tjmo, vatu, vert, vrt2, vkna, vkrn, vjmo, ccmp, kern, mark, mkmk, calt}
% see http://en.wikipedia.org/wiki/OpenType_feature_tag_list#OpenType_Typographic_Features for their list
\ExplSyntaxOn
\newcommand\listfontfeatures{%
\renewcommand*{\do}[1]{
\fontspec_if_feature:nTF {##1}{##1,\ }{}
}
\expandafter\docsvlist\expandafter{\fontfeatures}
}
\ExplSyntaxOff
\begin{document}
\listfontfeatures
\end{document}
现在来看看代码的测试部分。对于Andika New Basic
MINIMAL 代码:
\documentclass{article}
\usepackage{fontspec}
\defaultfontfeatures[\rmfamily]{Scale=1}
\defaultfontfeatures+{Scale=MatchLowercase}
\defaultfontfeatures+{Ligatures=TeX}
\setmainfont{Andika New Basic}
\newcommand{\txt}{páck my bóx with fíve dozéñ liqüor júgs, \ae, \oe, \ss.}
\newcommand{\txtital}{{\itshape\txt}}
\newcommand{\numb}{¡ j i I l L | 1234567890 O o}
\newcommand{\CharVar}[2]{{\addfontfeature{CharacterVariant=#1}}#2 {\tiny(CharacterVariant = #1)}}
\newcommand{\StylSet}[2]{{\addfontfeature{StylisticSet=#1}#2 {\tiny(Stylistic Set = #1)}}}
\newcommand{\grup}[1]{%
\noindent#1\\%
\CharVar{1:0}{#1}\\%
\CharVar{1:1}{#1}\\%
}
\begin{document}
\pagestyle{empty}
\grup{\txt}
\grup{\numb}
\end{document}
我没有得到1
我应该得到的变体,如下面的屏幕截图所示:
代码Calibri
完全相同,除了(1)我将字体行更改为读取\setmainfont{Calibri}
和(2)我替换命令的定义\grup
(对于这个最小示例),如下所示:
\newcommand{\grup}[1]{%
\noindent#1\\%
\StylSet{4}{#1}\\%
\StylSet{5}{#1}\\%
}
并进行如下测试:
\begin{document}
\pagestyle{empty}
\grup{\txt}
\grup{\txtital}
\end{document}
Variant=5 (ss05) is not available
当我运行代码时,控制台中确实出现了一条错误消息,警告我Calibri
。尽管如此,我还是得到了斜体f
替换,如以下屏幕截图所示:
希望人们能够重现我所得到的令人费解的结果。
答案1
我可以重现此问题,不仅在 XeTeX 中,而且在其他应用程序中也是如此。(剧透:没有错误。)
最小示例
首先,我把你的文件缩减为真实的最小示例:
\documentclass{article}
\usepackage{fontspec}
\newcommand{\txtital}{{\itshape f g}}
\newcommand{\numb}{1}
\newcommand{\CharVar}[2]{{\addfontfeature{CharacterVariant=#1}}#2 {\tiny(CharacterVariant = #1)}}
\newcommand{\StylSet}[2]{{\addfontfeature{StylisticSet=#1}#2 {\tiny(Stylistic Set = #1)}}}
\begin{document}
\setmainfont{Andika New Basic}
\numb
\CharVar{1:0}{\numb}
\CharVar{1:1}{\numb}
\setmainfont{Calibri}
\txtital
\StylSet{4}{\txtital}
\StylSet{5}{\txtital}
\end{document}
其结果为:
您的问题似乎已完全重现。您很快就会明白为什么从实际最小示例开始很有用。
第 1 期(共 2 期)(Andika New Basic)
首先忽略你得到的连字符cv01-
;它只是你复制的答案中的宏中的一个错误;我已经离开了一条评论那里。
无论如何,让我们看看为什么它似乎没有效果......
仔细观察就会发现,你的\CharVar{1:0}{\numb}
扩展为:
{{\addfontfeature{CharacterVariant=1:0}}\numb {\tiny(CharacterVariant = 1:0)}}
您的测试文本\numb
位于{\addfontfeature{CharacterVariant=1:0}}
组外。因此\addfontfeature
对文本没有影响。您可以通过将文本编写为以下内容来修复宏中的此错误
{\addfontfeature{CharacterVariant=1:0}\numb {\tiny(CharacterVariant = 1:0)}}
(最好从最愚蠢和最明确的代码开始),测试它是否有效,然后修复你的宏,比如说:
\newcommand{\CharVar}[2]{{\addfontfeature{CharacterVariant=#1}#2 {\tiny(CharacterVariant = #1)}}}
其工作原理:产生
所以这里没有错误:字体功能(cv01
或“无基数的 Digit One”)是记录、可检测、可选择且有效。
第 2 期(共 2 期)(Calibri)
有了 Calibri,事情就变得更有趣了。如您所见,XeTeX 没有检测到ss05
字体功能。但这不仅仅是 XeTeX:以下是otfinfo
:
% otfinfo -f /Library/Fonts/Microsoft/Calibri.ttf
c2sc Small Capitals From Capitals
calt Contextual Alternates
case Case-Sensitive Forms
ccmp Glyph Composition/Decomposition
cpsp Capital Spacing
dlig Discretionary Ligatures
dnom Denominators
frac Fractions
kern Kerning
liga Standard Ligatures
lnum Lining Figures
mark Mark Positioning
mkmk Mark to Mark Positioning
numr Numerators
onum Oldstyle Figures
ordn Ordinals
pnum Proportional Figures
salt Stylistic Alternates
sinf Scientific Inferiors
smcp Small Capitals
ss01 Stylistic Set 1
ss02 Stylistic Set 2
ss03 Stylistic Set 3
ss04 Stylistic Set 4
subs Subscript
sups Superscript
tnum Tabular Figures
这与 XeTeX 检测到的一组特征相同。
更详细地讲,可以安装字体工具并在字体上运行ttx
以获取人类可读的 XML 格式:
% ttx -o Calibri.ttx /Library/Fonts/Microsoft/Calibri.ttf
Dumping "/Library/Fonts/Microsoft/Calibri.ttf" to "Calibri.ttx"...
并转储所有表格。如果您Calibri.ttx
在文本编辑器中打开该文件,您会发现它包含ss01
通过的提及ss04
,但没有ss05
。
还有另一个来源:如果你加载Calibri.ttf
到opentype.js,结果相似。
但是常规系统应用程序 TextEdit(在 macOS 上)似乎做了一些有趣的事情:如果你fgfg
在其中输入内容,选择 Calibri 作为字体,将最后两个字符变为斜体,选择它们,然后转到显示字体 → [齿轮符号] → 排版 → 备选风格集,有一个风格集 5,选择哪个会改变形状f
(就像 XeTeX 所做的那样):
这是什么魔法?TextEdit(和 XeTeX)如何能够选择字体中明显不存在的风格集,这一点已得到众多不同来源的证实?
好吧,稍微思考一下你就会找到答案:-)
% otfinfo -f /Library/Fonts/Microsoft/Calibri\ Italic.ttf
c2sc Small Capitals From Capitals
calt Contextual Alternates
case Case-Sensitive Forms
ccmp Glyph Composition/Decomposition
cpsp Capital Spacing
dlig Discretionary Ligatures
dnom Denominators
frac Fractions
kern Kerning
liga Standard Ligatures
lnum Lining Figures
mark Mark Positioning
mkmk Mark to Mark Positioning
numr Numerators
onum Oldstyle Figures
ordn Ordinals
pnum Proportional Figures
salt Stylistic Alternates
sinf Scientific Inferiors
smcp Small Capitals
ss01 Stylistic Set 1
ss02 Stylistic Set 2
ss03 Stylistic Set 3
ss04 Stylistic Set 4
ss05 Stylistic Set 5
subs Subscript
sups Superscript
tnum Tabular Figures
ttx
和XeTeX 的结果类似opentype.js
:
\documentclass{article}
\usepackage{fontspec,etoolbox,expl3}
\setmainfont{Calibri Italic}
\def\somefontfeatures{ss01, ss02, ss03, ss04, ss05, ss06, ss07, ss08, ss09, ss10}
\ExplSyntaxOn
\newcommand\listsomefontfeatures{%
\renewcommand*{\do}[1]{
\fontspec_if_feature:nTF {##1}{##1,\ }{}
}
\expandafter\docsvlist\expandafter{\somefontfeatures}
}
\ExplSyntaxOff
\begin{document}
\listsomefontfeatures
\end{document}
这就是谜题的全部内容:字体ss05
中存在样式变体Calibri Italic
,但字体本身却没有Calibri
。这与你在问题中看到的所有内容一致,而且,XeTeX 在检测或选择字体特征时没有出现任何错误。