如何测试 token 的值是否不是特定值

如何测试 token 的值是否不是特定值

我有一堆具有默认值的令牌。我需要测试每一个,并打印一条消息,以防它们仍然是默认值。我可以手动执行此操作,如下所示。现在,当我尝试为此编写宏时,我遇到了问题。我希望能够报告未设置的令牌的名称,因此尝试传入令牌的名称并使用它\the\#1来获取值。我想我缺少一些基本的东西,并尝试了很多方法,但仍然无法让它工作。有什么想法吗?

\documentclass[12pt]{article}
\usepackage{ifthen}

\newtoks{\MyParameter}
\MyParameter={X}         % Set default value

\newcommand{\TestIfGivenValue}[2]{%
\ifthenelse{\equal{\the\#1}{#2}}{%
\warningbox{B: Please set the value of $backslash$#1}%
}{%
    B: Yes, the \textbackslash MyParameter has a non default value. 
}}


\begin{document}

% Manual method: works great
\ifthenelse{\equal{\the\MyParameter}{X}}{%
    A: Please set the value of \textbackslash MyParameter \\%
}{
    A: Yes, the \textbackslash MyParameter has a non default value. 
}

% Now attempt to wrap this in a new command
\TestIfGivenValue{MyParameter}{X}

\end{document}

答案1

TeX 必须将名称视为“标记”:您不能将其放入\#1并期望 TeX 将其转换为控制序列。因此,您应该这样做

\newcommand{\TestIfGivenValue}[2]{%
\ifthenelse{\equal{\the#1}{#2}}{%
\warningbox{B: Please set the value of \noexpand#1}%
}{%
    %B: Yes, #1 has a non default value. 
}}

并将其与控制序列一起使用:\TestIfGivenValue\myvalue{something},或使用构造名称\csname

\newcommand{\TestIfGivenValue}[2]{%
\ifthenelse{\equal{\expandafter\the\csname#1\endcsname}{#2}}{%
\warningbox{B: Please set the value of \expandafter\noexpand\csname#1\endcsname}%
}{%
    %B: Yes, #1 has a non default value. 
}}

其作用为:\TestIfGivenValue{myvalue}{something}

构造\csname ... \endcsname变成myvalue令牌 \myvalue,这是 TeX 需要看到的,以使一切正常工作。我\expandafter在答案的第二个版本中也使用了它,以确保\the“看到”正确的输入。

相关内容