如何生成以下形式的命令\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 OT1
by\encodingdefault
和cmss
by 。\sfdefault