我想知道如何在 Latex3 中创建动态命名宏(在循环中)。在 LaTeX2e 中一切正常。
我使用 expl3 来寻找与该代码等效的东西
\stepcounter{N}
\expandafter\def\csname toto@num\Alph{N}\endcsname{#1}
我查看了 expl3 文档,他们指出了这一点\cs:w \cs_end
,但我不知道如何使其发挥作用。
提前致谢
答案1
expl3 的主要特点之一是让您免于复杂的\expandafter
或\csname
构造。作为替代,它为您提供了参数修饰符,用于在将参数传递给基函数之前对其进行操作。正如 @egreg 所说,csname 构造的修饰符是c
。如果您在代码中使用它(而不是N
),那么每当您想要使用构造的 csname 时。
例如,在 2e 中你可以这样做
% setup
\def\foo#1{ <do something with #1> }
\expandafter\def\csname toto@num\Alph{N}\endcsname{ <whatever> }
% usage
\expandafter \foo \csname toto@num\Alph{N}\endcsname
或者(更糟)
%setup
\def\foobar#1#2{ <do something with #1 and #2> }
\expandafter\def\csname toto@num\Alph{N}\endcsname{ <whatever> }
\expandafter\def\csname toto@num\Roman{N}\endcsname{ <whatever else>}
%usage
\expandafter \foobar \csname toto@num\Alph{N}\expandafter\endcsname
\csname toto@num\Roman{N}\endcsname
而在 expl3 中可以归结为
% base defs
\cs_new_protected:cpn { toto_num_ \Alph{N} } { <whatever> }
\cs_new_protected:cpn { toto_num_ \Roman{N} } { <whatever else> }
\cs_new:Npn \foo:N #1 { <do something with #1> }
\cs_new:Npn \foobar:N #1#2 { <do something with #1 + #2> }
% command variants as needed ..
\cs_generate_variant:Nn \foo:N { c }
\cs_generate_variant:Nn \foobar:NN { cc }
% application ...
\foo:c { toto_num_ \Alph{N} }
\foobar:cc { toto_num_ \Alph{N} } { toto_num_ \Roman{N} }
因此,2e 中的设置可能稍微短一些,但用法复杂且难以阅读,而在 expl3 中的用法清晰简单。
命令\cs:w
和\cs_end
是使所有这些事情发生的低级 TeX 命令(即\csname
...\endcnsame
在 2e 中),因此您可以将它们一起\exp_after:wN
使用以 2e 方式编程 1-2-1,但 expl3 的重点实际上是您不再需要这样做,所以它们只是在内部设置机制。
答案2
您可以使用以下c
变体:
\cs_new_protected:cpn { toto_num_ \Alph{N} } { <whatever> }