Un nuevo problema de definición de macro/función de LaTeX3

Un nuevo problema de definición de macro/función de LaTeX3

Soy novato en LaTeX3 y trato de entender este idioma. mientras leoaquí se puede definir una nueva macro usando\cs_new:

\cs_new:Npn \SayHello #1
 { \prg_replicate:nn {#1} { Hello~World!~ } }

donde Nrespecto a \SayHello, p --- a #1y n--- a{...}

Ok, intento crear mi función para mostrar el cuadrado de algún número:

\cs_new:Npn \Show #1 
{
\int_eval:n {#1*#1}
}

Las macros \Show{number}funcionan bien. Pero si intento definir una macro \Show, debería mostrarme algún número entero:

\cs_new:Nn \Show 
{
\int_eval:n {2+2}
}

Yo tengo un LaTeX error: "kernel/missing-colon".

Ok, entonces agrego dos puntos:

\cs_new:Nn \Show:n 
{
\int_eval:n {2+2}
}

y nuevamente recibo un error, pero ahora simplemente ! Undefined control sequence.

Este comportamiento no me queda claro.¿Dónde estoy rompiendo las reglas?

MWE a continuación.

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Nn \Show:n 
{
\int_eval:n {2+2}
}
\ExplSyntaxOff

\begin{document}
\Show{}
\end{document}

Respuesta1

Con \cs_new:Nnsolo puedes definir una función (macro) que tenga unfirma, esa es una lista de los tipos de argumentos después de dos puntos.

Con \cs_new:Npnusted no tiene esta restricción, porque debe escribir explícitamente el texto del parámetro (que es lo que psignifica en la firma).

Por ejemplo, \cs_new:Nnespera un argumento de token único ( N) y un argumento entre llaves ( n). Por el contrario, \cs_new:Npnespera un argumento simbólico único, un "argumento de parámetro" (consulte la discusión sobretexto del parámetroen el TeXbook o TeX por tema) seguido de un argumento entre llaves.

los codigos

\cs_new:Nn \sergio_show:n { \int_eval:n { #1+#1 } }

y

\cs_new:Npn \sergio_show:n #1 { \int_eval:n { #1+#1 } }

son completamente equivalentes, porque \cs_new:Nnpueden construir un texto de parámetro adecuado a partir de la firma.

Si el comando que desea definir no tiene firma, debedebedefinirlo con \cs_new:Npno \cs_new_protected:Npn.

Alternativamente, puedes hacer

\cs_new:Nn \sergio_show:n { \int_eval:n { #1+#1 } }
\cs_set_eq:NN \Show \sergio_show:n

Sin embargo, para los comandos del espacio de usuario, xparsese recomienda utilizar la interfaz.

no puedes hacer

\cs_new:Nn \Show:n { \int_eval:n { #1+#1 } }

y luego usarlo \Showen el documento, porque nunca lo has definido \Show.

Tenga en cuenta que debe utilizar \cs_new_protected:Npno \cs_new_protected:Nn(se aplican las mismas reglas) siempre que el código contenga funciones no ampliables (aquellas que no tienen una estrella roja completa o hueca en el manual). Este no es el caso porque \int_eval:nes totalmente ampliable.

información relacionada