为什么我们不总是使用 \long\def 而要使用 \def?

为什么我们不总是使用 \long\def 而要使用 \def?

为什么我们不总是使用\long\def而不是\def? 看起来\long\def比 更完整\def
顺便说一句,我知道这两个命令之间的区别。

答案1

我们这样做。 默认情况下\newcommand\long;如果您想要不长的宏,您必须使用\newcommand*


一个更哲学的答案:\long是 Knuth 为 TeX 构建的几种错误捕获机制之一。或者更确切地说,不是使用\long允许 TeX 捕获缺失括号错误,其中宏的参数似乎跨越多个段落;这就是“失控参数”错误的来源。因此,\long默认情况下使用意味着您可能会在发现错误之前用尽 TeX 的内存。

这与我的回答类似这个问题\outer,其目的与阻止失控代码类似。我在那里得出的结论是,这\outer反映了对计算机资源与人力资源的过时优先考虑,我相信在\long这里我会做出同样的判断。看来在这两种情况下,LaTeX 的作者也持这种立场。

答案2

让我在 Joseph 之前戴上我的 LaTeX3 帽子。[但是 Joseph,请随意编辑。]

目前 LaTeX3 的计划是让几乎所有的宏都变长。第一个方面是在定义宏的层面上:默认情况下,宏是\long,你需要输入额外的内容_nopar来使它们不长“no- \par”。例如,

\cs_set:Npn                  = \long \def
\cs_set_nopar:Npn            =       \def
\cs_gset_protected:Npx       = \long \protected \xdef
\cs_gset_protected_nopar:Npx =       \protected \xdef

第二个方面是我们最近(即,也许还没有在 CTAN 上?)在内核中强制执行的关于哪些宏是长的,哪些不是长的惯例。显然,你永远不想这样做\newcount\par(在 LaTeX3 编码惯例中,\int_new:N\par),所以直到最近我们才将其定义\int_new:N为短的。但是,在这种情况下你得到的错误无论如何都不是很有启发性,而其他情况也不是那么明确。因此,我们决定每个带参数的宏都应该是\long,而无参数的宏应该是_nopar

第三个方面是用户界面,目前由 涵盖xparse。只有在那里尝试捕捉缺失的括号和其他“失控”参数才有意义。在这个级别,我们保留\long和非\long参数,在规范中的参数+之前添加\long:例如,

\NewDocumentCommand{\foo}{ m +m }
  { \section{#1} {\bfseries #2} }

\foo创建一个具有较短第一个参数和较长第二个参数的宏。

相关内容