在查看源代码时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