考虑以下两个宏定义:
\def\setmacro#1{\def\macro{#1}}
\def\setmacro{\def\macro}
尽管 的两种变体\setmacro
具有不同的功能,\meaning
但它们最终的作用是相同的(如果使用正确)。在我看来,前一种定义更容易阅读,而后者更灵活,可能也更高效。那么应该选择哪一个呢?
答案1
第二种形式确实更有效,因为不需要读取、插入和再次读取参数(而第二次读取过程更快),但只有第一种形式才是完全“稳定的”。
请注意,第二种形式仍允许参数文本,例如,\setmacro#1{foo #1 bar}
它将扩展为\def\macro#1{foo #1 bar}
。在大多数情况下,您不希望这样。此外,它后面需要括号:这\setmacro\foo
会导致将\def\macro\foo
所有内容读取到下一个{
参数文本,然后导致错误消息问题,这对最终用户来说很难理解。这种情况适用于第一个定义。
如果您将其定义\setmacro
为类或包的一部分(例如\title
等),我会使用第一个版本。在现代系统上,开销并不大,尤其是当 set-macro 仅使用一两次时,但您可以避免以错误或意外的方式使用 set-macro 时出现的问题。