
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 \expandafter
construçõ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:w
e \cs_end
são os comandos TeX de baixo nível que fazem tudo isso acontecer (ou seja, \csname
... \endcnsame
em 2e), então junto com \exp_after:wN
você 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 c
variante:
\cs_new_protected:cpn { toto_num_ \Alph{N} } { <whatever> }