No l3basics
módulo existem dois métodos fornecidos para cada função de geração de comando. Um exige que a assinatura da função seja fornecida, enquanto o segundo não.
Como o segundo é mais conciso, há alguma vantagem em usar um em vez do outro? (Exceto, é claro, no caso óbvio em que é necessário remover completamente um token, como um \removefirstoftwo
caso hipotético, etc., e o segundo método não pode ser aplicado).
Eu forneço um MWE ilustrando as duas abordagens.
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn \exampleone:nn #1 #2 {#1 #2}
\cs_new:Nn \exampletwo:nn{#1 #2}
\exampleone:nn {one~}{two~}
\exampletwo:nn {three~}{four}
\ExplSyntaxOff
\end{document}
Responder1
Os dois métodos são perfeitamente equivalentes, quando uma assinatura é adicionada à função que está sendo definida.
O \cs_new:Nn
método é menos eficiente, pois precisa construir o texto do parâmetro.
Se eu acrescentar algo ao seu exemplo, a identidade fica mais clara:
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn \exampleone:nn #1 #2 {#1 #2}
\cs_new:Nn \exampletwo:nn{#1 #2}
\texttt{\cs_meaning:N \exampleone:nn}\par
\texttt{\cs_meaning:N \exampletwo:nn}\par
\ExplSyntaxOff
\end{document}
A concisão do último método pode fazer com que alguém o prefira, mas é essencialmente uma questão de preferência pessoal.
Geralmente prefiro ver o texto explícito do parâmetro, mas sou eu.
Por que ambos são oferecidos? Provavelmente porque o :Nn
método é semelhante ao tradicional \newcommand
, onde o texto do parâmetro é construído a partir do argumento opcional, aqui substituído pela assinatura da macro que está sendo definida.
Embargo.Pode-se definir uma função sem assinatura, mas neste caso o :Npn
método é obrigatório. O mesmo se a assinatura não for “padrão”, ou seja, apenas com especificadores N
, n
, T
ou . F
Uma função com um w
especificadordeveusar :Npn
.