Um novo problema de definição de macro/função do LaTeX3

Um novo problema de definição de macro/função do LaTeX3

Eu sou novato em LaTeX3 e tento entender essa linguagem. Enquanto eu liaaqui pode-se definir uma nova macro usando\cs_new:

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

onde Nrespeito a \SayHello, p --- para #1e n--- para{...}

Ok, tento criar minha função para mostrar o quadrado de algum número:

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

Macro \Show{number}funciona bem. Mas se eu tentar definir macro \Show, o que deverá me mostrar algum número inteiro:

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

Eu recebo um LaTeX error: "kernel/missing-colon".

Ok, então adiciono dois pontos:

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

e eu sempre recebo um erro, mas agora é só ! Undefined control sequence.

Esse comportamento não está claro para mim.Onde estou quebrando as regras?

MWE abaixo.

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

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

Responder1

Com \cs_new:Nnvocê só é permitido definir uma função (macro) que tenha umassinatura, essa é uma lista dos tipos de argumentos após dois pontos.

Com \cs_new:Npnvocê não tem essa restrição, pois é necessário digitar explicitamente o texto do parâmetro (que é o que psignifica na assinatura).

Por exemplo, \cs_new:Nnespera um argumento de token único ( N) e um argumento entre chaves ( n). Por outro lado, \cs_new:Npnespera um argumento de token único, um “argumento de parâmetro” (veja a discussão detexto do parâmetrono TeXbook ou TeX por tópico) seguido por um argumento entre chaves.

Os códigos

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

e

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

são completamente equivalentes, pois \cs_new:Nnpodem construir um texto de parâmetro adequado a partir da assinatura.

Se o comando que você deseja definir não tiver assinatura, vocêdevedefina-o com \cs_new:Npnou \cs_new_protected:Npn.

Alternativamente, você pode fazer

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

No entanto, para comandos de espaço do usuário, xparseé recomendado usar a interface.

Você não pode fazer

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

e depois use \Showno documento, porque você nunca definiu \Show.

Esteja ciente de que você deve usar \cs_new_protected:Npnou \cs_new_protected:Nn(as mesmas regras se aplicam) sempre que o código contiver funções não expansíveis (aquelas sem uma estrela vermelha cheia ou vazia no manual). Não é o caso aqui, porque \int_eval:né totalmente expansível.

informação relacionada