
Me gustaría saber cómo crear macros dinámicas con nombre (en un bucle) en Latex3. Todo está bien en LaTeX2e.
Busco algo equivalente a ese código con expl3
\stepcounter{N}
\expandafter\def\csname toto@num\Alph{N}\endcsname{#1}
Miré en el documento expl3, señalan \cs:w \cs_end
pero no sé cómo hacer que funcione.
gracias de antemano
Respuesta1
Uno de los puntos principales de expl3 es liberarlo de \expandafter
construcciones complicadas \csname
. En reemplazo de esto, le ofrece modificadores de argumentos que manipulan los argumentos antes de pasarlos a la función base. Como dijo @egreg, el modificador para la construcción de csname es c
. Si usa esto en su código (en lugar de N
) siempre que desee que se use su nombre cs construido.
Por ejemplo, en 2e harías 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
o peor)
%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
mientras que en expl3 eso se reduce 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} }
Entonces, la configuración en 2e es quizás un poco más corta, pero el uso es complicado y difícil de leer, mientras que en expl3 el uso es claro y simple.
Los comandos \cs:w
y \cs_end
son los comandos TeX de bajo nivel que hacen que todo esto suceda (es decir \csname
, ... \endcnsame
en 2e), por lo que junto con \exp_after:wN
ellos podrías usarlos para programar 1-2-1 en la forma 2e, pero el punto de expl3 es realmente que Ya no necesitan hacer esto, por lo que solo están ahí para configurar el mecanismo internamente.
Respuesta2
Puedes usar la c
variante:
\cs_new_protected:cpn { toto_num_ \Alph{N} } { <whatever> }