![fontspec 将 newfontfamily 名称存储在哪里?](https://linux22.com/image/342210/fontspec%20%E5%B0%86%20newfontfamily%20%E5%90%8D%E7%A7%B0%E5%AD%98%E5%82%A8%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%9F.png)
我在 Ubuntu 上使用 LuaTeX 和 TeXlive 2016。使用 fontspec 创建新的字体系列。MWE:
% !TeX program = LuaLaTeX
% !TeX encoding = UTF-8
\documentclass{minimal}
\usepackage{fontspec}
\newfontfamily\MyPrivate{Latin Modern Roman} % or some other font
\begin{document}
Your private font is % \whatisMyPrivate
\end{document}
我寻找\whatisMyPrivate
,以便我可以取消注释该行并让文档打印出字体的名称(在本例中为 Latin Modern Roman)。我看到该\newfontfamily
命令是在文件中定义的fontspec-luatex.sty
,但遗憾的是我无法破译它将信息存储在何处以供后续读回。
我希望在不实际设置私有字体中的任何文本的情况下做到这一点。但如果做到这一点的唯一方法是使用字体设置一些文本,然后从该文本中读回,那么就可以了。
答案1
例如,您可以将字体应用到组中,并提取\f@family
包含字体名称的更改定义。我将其包装到更高级别的宏中。
\documentclass{article}
\usepackage{fontspec}
\newfontfamily\MyPrivate{Latin Modern Roman} % or some other font
\def\getfontname#1{%
{#1\expandafter\xdef\csname private_font_name\endcsname{\csname f@family\endcsname}}%
\csname private_font_name\endcsname
}
\begin{document}
Your private font is \getfontname\MyPrivate
\end{document}
答案2
单纯通过扩展就可以获得姓氏。
诀窍在于知道分配的家族名称存储在内部变量中\g__fontspec_MyPrivate_family
:
\documentclass{article}
\usepackage{fontspec}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\getfamilyname}{m}
{
\use:c { g__fontspec_ \cs_to_str:N #1 _family }
}
\ExplSyntaxOff
\newfontfamily\MyPrivate{Latin Modern Roman} % or some other font
\begin{document}
Your private font is \getfamilyname\MyPrivate
% emulate a \write operation
\edef\test{\getfamilyname\MyPrivate}
\texttt{\meaning\test}
\end{document}
最后一个例子表明如果你这样做
\write\baz{\getfamilyname\MyPrivate}
(其中\baz
是输出流),将写入所请求的姓氏。
但是,fontspec
它不提供用于访问字体系列数据的公共接口,因此此方法可能会在未来版本中失效。实际上,记录分配给字体系列的特定内部名称根本没有用。如果需要明确的名称,手册将解释如何(以及为什么)分配名称:请参阅第 5.2 节。
\newfontfamily\MyPrivate{Latin Modern Roman}[
NFSSFamily=foo,
% <other options>
]
分配的姓氏将是foo
。