获取 NFSS 字体的 \font 等效项

获取 NFSS 字体的 \font 等效项

如何生成以下形式的命令\font\namefont =something以便它与 NFSS 风格的字体选择相匹配?

我做错了什么,误以为我遇到的问题是由于两个包不匹配。第一个需要 NFSS 样式的命令,格式如下

\def \crdfont {\footnotesize\sffamily\bfseries}

另一个命令需要普通的 TeX 样式字体,例如

\font \namefont = cmssbx8

在我遇到的实际情况下,它\def\namefont{\crdfont}确实工作得很好(错误来自于省略括号),但它让我思考:将 NFSS 样式选择转换为纯 TeX 样式的一般形式是什么?

通常来说\font \namefont =identifier可互换\def\namefont{NFSS commands}

答案1

四种方式:

\documentclass{article}

\usepackage{gtrcrd}
\renewcommand\crdfont{\footnotesize\sffamily\bfseries}

\usepackage{gchords}

% LaTeX savvy way
\begingroup\makeatletter\crdfont\edef\x{\endgroup
  \noexpand\DeclareFixedFont\noexpand\namefont
    {\f@encoding}{\f@family}{\f@series}{\f@shape}{\f@size}}\x

% Hackish way (quite similar to how \DeclareFixedFont works
\begingroup\crdfont
\global\font\namefont=\fontname\font
\endgroup

% More hackish way without \global (which can be useful
% if you want to make this definition of \namefont only
% local)
\begingroup\crdfont\expandafter\endgroup
\expandafter\let\expandafter\namefont\the\font

% Even more hackish way without \global and \expandafter
\begingroup\crdfont\edef\x{\endgroup
  \let\namefont=\the\font}\x % \namefont is already unexpandable

\begin{document}

\A[sus2] Fooo
\chord{t}{x,o,p2,p2,o,o}{Asus2}

\end{document}

在这四种情况下,\show\namefont答案都是

\namefont=select font cmssbx10 at 8.0pt

但最简单的方法似乎就是

\let\namefont\crdfont

或者,如果你想尊重 LaTeX 惯例,

\renewcommand{\namefont}{\crdfont}

最后一种方法是否等同于这种\DeclareFixedFont方法(或简化方法)?并非如此。

如果该gchords软件包所做的\namefont只是使用命令来选择字体,那么应该没有什么区别。但如果\namefont使用低级命令从字体中提取信息,例如

\dimen0=\fontdimen2\namefont

用于存储\dimen0字体的 em 值,那么\renewcommand(或\let) 方法将会彻底失败。

因为除了用 定义的 之外, 中唯一出现gchords.sty的地方是\namefont\font

\put(\xoff,0){\hbox to \truewidth\ascale{\hss\namefont #3\hss}}

(第 159 行),\renewcommand\let方法就足够了。


技术说明。LaTeX 中的任何字体选择最终都会归结为发出\somefont,之后 LaTeX 为 赋予了含义,\somefont并最终归结为

\global\font\somefont=foo

并且foo.tfm存在于系统中。例如,\normalfont最终发出\OT1/cmr/m/n/10(假设我们处于默认情况,在 10pt 文档中)指令

\global\font\OT1/cmr/m/n/10=cmr10

已经提前执行。实际上,命名的命令\OT1/cmr/m/n/10在该上下文中不合法,因此真正的指令是

\global\expandafter\font\csname OT1/cmr/m/n/10\endcsname=cmr10

但这基本无关紧要。LaTeX 字体分配始终是全局的。

有两种方法可以访问已定义的字体;如果我们已经发布了\font\somefont=foo,那么扩展

\the\somefont

是一个控制序列,相当于选择外部字体的命令foo.tfm,在本例中就是如此\somefont。有人可能会问为什么这样做确实毫无用处。但是\the我们可以使用\font,在这种情况下,控制序列名称相当于选择当前的字体将生成。请参阅\命令

例如,如果一个人在 LaTeX 中启动一个交互式会话并发出

\documentclass{article}
\edef\whatsthecurrentfont{\the\font}
\show\whatsthecurrentfont

答案是

> \whatsthecurrentfont=macro:
->\OT1/cmr/m/n/10 .

相似地,

\expandafter\let\expandafter\whateverthecurrentfontis\expandafter=\the\font

将发出\whateverthecurrentfontis命令来设置执行指令时当前的字体。

还有另一个不太为人所知的指令。如果\somefont是如上所述定义的字体标识符\font,则扩展

\fontname\somefont

是对应于所引用的外部字体名称的字符串。与前面一样,后面可以使用\somefont特殊标识符,它再次引用当前字体。\font\fontname

这应该可以解释上述三种黑客方法。

让我们看看 LaTeX 的精明方法。我们可以使用\DeclareFixedFont最终执行类型指令的高级指令\font\somefont=foo,但使用 NFSS 接口。

\selectfont发出时,可能作为命令工作的一部分,例如\bfseries,LaTeX 会更新一些控制序列的含义,即

\f@encoding
\f@family
\f@series
\f@shape
\f@size
\f@baselineskip

因此,如果我们想定义一个控制序列,使其独立于上下文选择当前字体,我们可以使用\DeclareFixedFont这些命令。使用常用\begingroup\edef\x{\endgroup...}\x技巧,我们可以访问这些命令的当前含义,冻结它,因为我们使用它们的扩展。之后\begingroup,对于这种特殊情况,我们发出\makeatletter能够使用\f@...\cdrfont选择所需字体的指令。

答案2

\DeclareFixedFont\namefont{OT1}{cmss}{m}{n}{10}

可能有效

当然,如果您希望声明适应其他设置,您可以替换 say OT1by\encodingdefaultcmssby 。\sfdefault

相关内容