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 N
respecto a \SayHello
, p
--- a #1
y 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:Nn
solo 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:Npn
usted no tiene esta restricción, porque debe escribir explícitamente el texto del parámetro (que es lo que p
significa en la firma).
Por ejemplo, \cs_new:Nn
espera un argumento de token único ( N
) y un argumento entre llaves ( n
). Por el contrario, \cs_new:Npn
espera 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:Nn
pueden 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:Npn
o \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, xparse
se recomienda utilizar la interfaz.
no puedes hacer
\cs_new:Nn \Show:n { \int_eval:n { #1+#1 } }
y luego usarlo \Show
en el documento, porque nunca lo has definido \Show
.
Tenga en cuenta que debe utilizar \cs_new_protected:Npn
o \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:n
es totalmente ampliable.