![为什么我们不总是使用 \long\def 而要使用 \def?](https://linux22.com/image/244139/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E4%B8%8D%E6%80%BB%E6%98%AF%E4%BD%BF%E7%94%A8%20%5Clong%5Cdef%20%E8%80%8C%E8%A6%81%E4%BD%BF%E7%94%A8%20%5Cdef%EF%BC%9F.png)
为什么我们不总是使用\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
创建一个具有较短第一个参数和较长第二个参数的宏。