模块中l3basics
为每个命令生成函数提供了两种方法。第一种方法需要提供函数签名,第二种则不需要。
由于第二种方法更简洁,使用一种方法而不是另一种方法有什么优势吗?(当然,除非在明显的情况下需要完全删除一个标记,例如假设的\removefirstoftwo
情况等,第二种方法无法应用)。
我提供了一个 MWE 来说明这两种方法。
\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}
答案1
当向正在定义的函数添加签名时,这两种方法完全等效。
该\cs_new:Nn
方法效率较低,因为它必须构建参数文本。
如果我在你的例子中添加一些内容,身份就会更加清晰:
\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}
后一种方法的简洁性可能使人们更喜欢它,但这本质上是一个个人喜好的问题。
一般来说,我更喜欢看到明确的参数文本,但这就是我的想法。
为什么两者都提供?可能是因为该:Nn
方法类似于传统的\newcommand
,其中参数文本是由可选参数构建的,这里由定义的宏的签名替换。
警告。可以定义没有签名的函数,但在这种情况下方法:Npn
是强制性的。如果签名不是“标准”的,即只有N
、n
或说明符T
,情况也是如此。带有说明符的F
函数w
必须使用:Npn
。