![使用 csdef 中定义的宏](https://linux22.com/image/471044/%E4%BD%BF%E7%94%A8%20csdef%20%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84%E5%AE%8F.png)
我使用以下代码定义了新的字体大小开关。
\makeatletter
\newcommand{\vi@mult}{2.986}
\newcommand{\HUGE}{\normalsize%
\@setfontsize\HUGE{\vi@mult\dimexpr\f@size pt\relax}{\vi@mult\dimexpr\f@baselineskip\relax}%
}
\makeatother
是否可以重写这个定义,以便我可以\foo
使用如下宏定义新的字体大小开关?
\newcommand{\newfontsize}[2]{%
\csdef{#1}{%
\normalfont%
\@setfontsize\csname #1\endcsname{#2\dimexpr\f@size pt\relax}{#2\dimexpr\f@baselineskip\relax}% This line produces an error.
}%
}
\newfontsize{foo}{3.583}
答案1
\@setfontsize
定义在 中latex.ltx
采用三个不分隔的参数。在您的第一个示例中,它是:
\@setfontsize\HUGE{\vi@mult\dimexpr\f@size pt\relax}{\vi@mult\dimexpr\f@baselineskip\relax}
第一个参数是\HUGE
,第二个\vi@mult\dimexpr\f@size pt\relax
和第三个参数是vi@mult\dimexpr\f@baselineskip\relax
。但是在第二个例子中
\@setfontsize\csname foo\endcsname{#2\dimexpr\f@size pt\relax}{#2\dimexpr\f@baselineskip\relax}
中的第一个参数\csname
,第二个f
和第三个o
。这不是你想要的。使用\expandafter
:
\expandafter\@setfontsize\csname foo\endcsname{#2\dimexpr\f@size pt\relax}{#2\dimexpr\f@baselineskip\relax}
运行并创建。然后有参数:,和。也许\expanafter
,这就是你想要的。\csname foo\endcsname
\foo
\@setfontsize
\foo
3.583\dimexpr\f@size pt\relax
3.583\dimexpr\f@baselineskip\relax