fontspec 将 newfontfamily 名称存储在哪里?

fontspec 将 newfontfamily 名称存储在哪里?

我在 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

相关内容