LaTeX3函數產生方法的差異

LaTeX3函數產生方法的差異

模組中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方法是強制性的。如果簽名不是“標準”,即僅包含Nn或說明符,T則情況相同F。帶有w說明符的函數必須使用:Npn

相關內容