![定义一个扩展为自身的宏有什么好处?](https://linux22.com/image/456689/%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E6%89%A9%E5%B1%95%E4%B8%BA%E8%87%AA%E8%BA%AB%E7%9A%84%E5%AE%8F%E6%9C%89%E4%BB%80%E4%B9%88%E5%A5%BD%E5%A4%84%EF%BC%9F.png)
在查看源代码时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