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

相关内容