我很好奇如何通过名称测试宏。我需要做一些与以下内容逻辑等效的事情:
\def\doit#1{%
\if#1==\foo I got a foo\fi
\if#1==\bar I got a bar\fi
}
现在,我当然知道\if
这样做不行。符号 == 实际上不是一个东西,而且\if
扩展宏这一事实对我来说是不可取的,因为我可能甚至想\doit\foo
在没有\foo
定义的情况下这样做。不过,我希望上面的伪代码能够说明我的问题。
我知道有比作为控制序列更好的方法将命名的“标志”传递给宏,但由于一些原因,我在这里不会详述,我确实受限于宏名称,而且我确实需要能够检查给定两个宏标记,它们的名称是否都相同。
请注意,我正在使用 Plain TeX,并且正在寻找仅使用 TeX 原语和/或 Plain TeX 宏的解决方案。
答案1
如果您不需要可扩展测试,这里有一个可能性。我假设您有一组有限的标志。
% set the flags
\begingroup\escapechar=-1
\xdef\fooname{\string\foo}
\xdef\barname{\string\bar}
\endgroup
\def\nameequal#1#2{%
TT\fi
\begingroup
\escapechar=-1
\edef\nameequaltemp{\string#1}%
\expandafter\endgroup
\ifx\nameequaltemp#2}
\def\doit#1{%
\if\nameequal#1\fooname
I saw foo%
\else
\if\nameequal#1\barname
I saw bar%
\else
I saw rubbish%
\fi
\fi
}
\doit\foo
\doit\bar
\doit\foobar
\bye