Latex3 等效 csname endcsname

Latex3 等效 csname endcsname

我想知道如何在 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> }

相关内容