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 N
respeito a \SayHello
, p
--- para #1
e 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:Nn
você só é permitido definir uma função (macro) que tenha umassinatura, essa é uma lista dos tipos de argumentos após dois pontos.
Com \cs_new:Npn
você não tem essa restrição, pois é necessário digitar explicitamente o texto do parâmetro (que é o que p
significa na assinatura).
Por exemplo, \cs_new:Nn
espera um argumento de token único ( N
) e um argumento entre chaves ( n
). Por outro lado, \cs_new:Npn
espera 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:Nn
podem 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:Npn
ou \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 \Show
no documento, porque você nunca definiu \Show
.
Esteja ciente de que você deve usar \cs_new_protected:Npn
ou \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.