我正在开发一个 LuaLaTeX 包,有一次我必须将三个基本字体系列(roman、sans、mono)的全名传递给另一个工具。我发现并检查过我可以正确地为目前活跃字体,但这并不是我真正需要的:
fonts.hashes.identifiers[font.current()].fullname
正确生成,例如“Linux Libertine O”,如果这是当前用于排版的内容。(我不知道这是不是实现该目标的正确或最简单的方法,所以我很高兴能简化。
\setmainfont
但是,正如所说,我还需要用、\setsansfont
和定义的字体名称\setmonofont
。从文档来看,这似乎font.id()
是我最好的选择,但到目前为止我没有任何运气。
[编辑:]当我说“字体名称”时,我指的是命令的强制参数中定义的三种字体的“家族名称” \setXXXXfont
,忽略可以在可选参数中完成的任何规范。
答案1
经过更长的时间讨论在 luaTeX 邮件列表上,fontspec
我和开发人员找到了一个可行的解决方案(尽管我觉得有点尴尬)。这个想法是依次激活三个字体系列,将它们捕获为“当前”,然后将所有内容包装在一个组中。诀窍是使用\edef
。
\begingroup
\rmfamily \edef\rmfamilyid{\fontid\font}%
\ssfamily \edef\ssfamilyid{\fontid\font}%
\ttfamily \edef\ttfamilyid{\fontid\font}%
\directlua{
myfonts = { }
myfonts.rm =
fonts.hashes.identifiers[\rmfamilyid].shared.rawdata.metadata['familyname']
myfonts.sf =
fonts.hashes.identifiers[\ssfamilyid].shared.rawdata.metadata['familyname']
myfonts.tt =
fonts.hashes.identifiers[\ttfamilyid].shared.rawdata.metadata['familyname']
}%
\endgroup
此后,这三个家族名称即可在myfonts
Lua 表中使用。