En l3basics
el módulo se proporcionan dos métodos para cada función de generación de comandos. Uno requiere que se proporcione la firma de la función, mientras que el segundo no.
Dado que el segundo es más conciso, ¿hay alguna ventaja en utilizar uno sobre el otro? (Excepto, por supuesto, en el caso obvio en el que es necesario eliminar un token por completo, como en un \removefirstoftwo
caso hipotético, etc., y el segundo método no se puede aplicar).
Proporciono un MWE que ilustra los dos enfoques.
\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}
Respuesta1
Los dos métodos son perfectamente equivalentes cuando se agrega una firma a la función que se define.
El \cs_new:Nn
método es menos eficiente, ya que tiene que construir el texto del parámetro.
Si agrego algo a tu ejemplo, la identidad es más 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}
La concisión de este último método puede hacer que uno lo prefiera, pero es esencialmente una cuestión de preferencia personal.
Generalmente prefiero ver el texto explícito del parámetro, pero ese soy yo.
¿Por qué se ofrecen ambos? Probablemente porque el :Nn
método es similar al tradicional \newcommand
, donde el texto del parámetro se construye a partir del argumento opcional, aquí sustituido por la firma de la macro que se está definiendo.
Advertencia.Se puede definir una función sin firma, pero en este caso el :Npn
método es obligatorio. Lo mismo si la firma no es “estándar”, es decir solo con especificadores N
, n
, T
o . F
Una función con un w
especificador.debeusar :Npn
.