这两个等效的宏定义应该优先选择哪一个?

这两个等效的宏定义应该优先选择哪一个?

考虑以下两个宏定义:

\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 时出现的问题。

相关内容