通过名称测试宏

通过名称测试宏

我很好奇如何通过名称测试宏。我需要做一些与以下内容逻辑等效的事情:

\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

在此处输入图片描述

相关内容