如何获取当前字体支持的所有字体功能的列表

如何获取当前字体支持的所有字体功能的列表

使用 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 代码。

相关内容