模組中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
。