equivalente em látex3 csname endcsname

equivalente em látex3 csname endcsname

Gostaria de saber como criar macros nomeadas dinâmicas (em loop) em Latex3. Está tudo bem no LaTeX2e.

Procuro algo equivalente a esse código com expl3

\stepcounter{N}
\expandafter\def\csname toto@num\Alph{N}\endcsname{#1}

Procurei no documento expl3, eles apontam \cs:w \cs_end, mas não consigo descobrir como fazer funcionar.

desde já, obrigado

Responder1

Um dos principais pontos do expl3 é livrá-lo de \expandafterconstruções complicadas \csname. Em substituição disso, ele oferece modificadores de argumento que manipulam os argumentos antes que eles sejam passados ​​para a função base. Como @egreg disse, o modificador para construção de csname é c. Se você usar isso em seu código (em vez de N) sempre que desejar que seu csname construído seja usado.

Por exemplo, na 2e você faria algo como

% 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

ou pior)

%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

enquanto em expl3 isso se resume a

% 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} } 

Portanto, a configuração no 2e talvez seja um pouco mais curta, mas o uso é complicado e difícil de ler, enquanto no expl3 o uso é claro e simples.

Os comandos \cs:we \cs_endsão os comandos TeX de baixo nível que fazem tudo isso acontecer (ou seja, \csname... \endcnsameem 2e), então junto com \exp_after:wNvocê poderia usá-los para programar 1-2-1 no modo 2e, mas o ponto de expl3 é realmente que você não precisam mais fazer isso, então eles estão lá apenas para configurar o mecanismo internamente.

Responder2

Você pode usar a cvariante:

\cs_new_protected:cpn { toto_num_ \Alph{N} } { <whatever> }

informação relacionada