使用 csdef 中定义的宏

使用 csdef 中定义的宏

我使用以下代码定义了新的字体大小开关。

\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\foo3.583\dimexpr\f@size pt\relax3.583\dimexpr\f@baselineskip\relax

相关内容