定义一个扩展为自身的宏有什么好处?

定义一个扩展为自身的宏有什么好处?

在查看源代码时pgffor,我注意到宏\pgffor@stop定义为

\def\pgffor@stop{\pgffor@stop}

我认为该宏用于停止参数解析。如果是这样,那么以递归方式定义它有什么好处?如果它被(意外)扩展,这不会导致无限循环吗?为什么不将它定义为,{}或者甚至定义为\relax

答案1

\ifx即使存储在另一个宏中,宏也等于其自身

\def\some@store{\pgffor@stop}
\ifx\some@store\pgffor@stop
 % TRUE
\fi

这使得它对于使用宏作为变量的快速测试很有用。

请注意,如果您需要确保唯一的 ID,则不能使用\relax{},至少在使用 进行测试时不能使用\ifx。(使用现代 TeX 系统,您可以执行可扩展的细绳测试,以便您可以检查令牌的名称。

\def\pgffor@stop@bad{}
\def\foo#1{\ifx#1\pgffor@stop@bad ...}
\foo\@empty % Oops

相关内容