使用 LuaTeX,如何获取打印当前使用字体支持的 OTF 功能列表?
例如,使用 otfinfo,我可以通过 获取 OTF 功能列表otfinfo -f font_file_name
。我可以用 LuaTeX 做类似的事情吗?
目标是为我测试的每种字体生成这样一个列表。例如,我想要这样一个宏,
\def\listfontfeatures{
\directlua{... some lua code to list font features to a string, say ff ...}
\directlua{tex.print(ff)}
}
并按如下方式使用它,
Times Ten LT Std: \fontspec{Times Ten LT Std} \listfontfeatures \par
Palatino LT Std: \fontspec{Palatino LT Std} \listfontfeatures \par
Minion Pro: \fontspec{Minion Pro} \listfontfeatures \par
更新日期:2017 年 12 月 1 日
这只是对 michal.h21 的答案的一个小改进,以防有人感兴趣。
fontspec_if_feature
实际测试当前选定的字体特性字体系列而不是当前选定的字体。通常这没什么区别,我最近才注意到这一点。对于某些字体,不同的形状具有不同的特征。例如,斜体可能有花饰,而罗马字体则没有。
下面是我现在用于字体功能测试的几个宏。它仅适用于 LuaTeX。FontName
需要对宏进行一些修改才能使其适用于 XeTeX。
\ExplSyntaxOff % remove the necessity to use ~ for space
\NewDocumentCommand\FontName{}{%
\directlua{
local i = font.current()
local f = font.getfont(i)
local n = f.fullname
tex.sprint(n)
}%
}
\ExplSyntaxOn
% Setup a new font family whose "n/m" shape is the current font.
% Limitations: The contents of the true/false clauses will be
% set in current fonts without any features selected by default,
% and it will be set in a group. For myself, this was intentionally.
\NewDocumentCommand\FontFeatureTF{m +m +m}{
\group_begin:
\fontspec_set_family:Nnn\thisfont:{}{\FontName}
\fontfamily\thisfont:\selectfont
\fontspec_if_feature:nTF{#1}{#2}{#3}
\group_end:
}
\NewDocumentCommand\FontFeatureT{m +m}{
\FontFeatureTF{#1}{#2}{\prg_do_nothing:}
}
\NewDocumentCommand\FontFeatureF{m +m}{
\FontFeatureTF{#1}{\prg_do_nothing:}{#2}
}
答案1
您可以使用fontspec
函数\fontspec_if_feature:nTF
。它在 xelatex 和 lualatex 中都可以工作
\documentclass{article}
\usepackage{fontspec,etoolbox,expl3}
\setmainfont{Cambria}
\def\fontfeatures{abvf, abvm, abvs, aalt, akhn, nalt, halt, afrc, valt, vhal, blwf, blwm, blws, cpsp, c2pc, c2sc, case, cpct, cv01, cv02, cv03, cv04, cv05, cv06, cv07, cv08, cv09, cv10, cv11, cv12, cv13, cv14, cv15, cv16, cv17, cv18, cv19, cv20, cv21, cv22, cv23, cv24, cv25, cv26, cv27, cv28, cv29, cv30, cv31, cv32, cv33, cv34, cv35, cv36, cv37, cv38, cv39, cv40, cv41, cv42, cv43, cv44, cv45, cv46, cv47, cv48, cv49, cv50, cv51, cv52, cv53, cv54, cv55, cv56, cv57, cv58, cv59, cv60, cv61, cv62, cv63, cv64, cv65, cv66, cv67, cv68, cv69, cv70, cv71, cv72, cv73, cv74, cv75, cv76, cv77, cv78, cv79, cv80, cv81, cv82, cv83, cv84, cv85, cv86, cv87, cv88, cv89, cv90, cv91, cv92, cv93, cv94, cv95, cv96, cv97, cv98, cv99, cjct, cfar, calt, clig, cswh, curs, dnom, dlig, dist, expt, falt, frac, fwid, ccmp, haln, half, hwid, hngl, hist, hlig, hkna, hojo, init, isol, ital, jp04, jp78, jp83, jp90, jalt, kern, lnum, ljmo, lfbd, ltra, ltrm, locl, mark, mset, mkmk, mgrk, medi, med2, nlck, nukt, numr, onum, opbd, size, ordn, ornm, pcap, pref, pres, psts, pstf, palt, vpal, pnum, pkna, pwid, qwid, rand, rkrf, rphf, rlig, rtbd, rtla, rtlm, ruby, sinf, smpl, zero, smcp, liga, salt, ss01, ss02, ss03, ss04, ss05, ss06, ss07, ss08, ss09, ss10, ss11, ss12, ss13, ss14, ss15, ss16, ss17, ss18, ss19, ss20, subs, sups, swsh, tnum, fina, fin2, fin3, twid, titl, trad, tnam, tjmo, unic, vatu, vert, vrt2, vkna, vkrn, vjmo}
% 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}
答案2
这应该列出当前字体的所有功能,甚至可以扩展为列出每个功能支持的脚本和语言:
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newcommand\listfontfeatures{%
\directlua{
local id = font.current()
local font = fonts.identifiers[id]
local data = font.shared.otfdata
if data then
local features = data.luatex.features
for i,_ in next, features do
for f,_ in next, features[i] do
%print(f, table.serialize(features[i][f]))
tex.sprint(-1, f.." ")
end
end
end
}}
\fontspec{TeX Gyre Pagella} \listfontfeatures
\end{document}
答案3
在 Linux 上这很简单,我想 Windows 也有类似的命令
voss@shania:~/.fonts/Junicode> otfinfo -f Junicode.ttf
c2sc Small Capitals From Capitals
calt Contextual Alternates
case Case-Sensitive Forms
ccmp Glyph Composition/Decomposition
dlig Discretionary Ligatures
fina Terminal Forms
frac Fractions
hist Historical Forms
hlig Historical Ligatures
kern Kerning
liga Standard Ligatures
mark Mark Positioning
mgrk Mathematical Greek
mkmk Mark to Mark Positioning
onum Oldstyle Figures
rtlm <unknown feature>
salt Stylistic Alternates
smcp Small Capitals
ss01 Stylistic Set 1
ss02 Stylistic Set 2
ss04 Stylistic Set 4
ss05 Stylistic Set 5
ss06 Stylistic Set 6
ss07 Stylistic Set 7
ss08 Stylistic Set 8
ss09 Stylistic Set 9
ss14 Stylistic Set 14
ss15 Stylistic Set 15
ss18 Stylistic Set 18
ss19 Stylistic Set 19
ss20 Stylistic Set 20
subs Subscript
sups Superscript
swsh Swash
答案4
您可以使用 ConTeXt 脚本mtxrun
获取此信息:
$mtxrun --script fonts --info --list --name --pattern="*Cambria*" mtx-字体 | mtx-字体 | 映射:cambriaitalic mtx-字体 | 字体名称:cambriaitalic mtx-fonts | 全名:cambriaitalic mtx-fonts | 文件名:cambriai.ttf mtx-字体 | 系列:cambria mtx-字体 | 粗细:正常 mtx-字体 | 样式:斜体 mtx-字体 | 宽度:正常 mtx-fonts | 变体:正常 mtx-字体 | 子字体: mtx-fonts | fweight:冲突:书籍 mtx-字体 | mtx-fonts | gpos 功能: mtx-字体 | mtx-fonts | 特色脚本语言 mtx-字体 | mtx 字体 | kern cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | mtx-fonts | gsub 功能: mtx-字体 | mtx-fonts | 特色脚本语言 mtx-字体 | mtx-字体 | c2sc cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | calt cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | 大小写 cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx 字体 | ccmp cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | dnom cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | frac cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 |拉丁足球甲级联赛 mtx-字体 | lnum cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | locl cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn rom mtx-字体 | numr cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | onum cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 |拉丁文 dflt rom trk mtx-字体 | pnum cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | 盐 cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | sinf cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | smcp cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | sups cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk mtx-字体 | tnum cyrl dflt srb mtx-字体 | 希腊语 dflt mtx-字体 | latn dflt rom trk
请参阅$TEXMF/scripts/context/lua/mtx-fonts.lua
实现此功能的 lua 代码。