我有一堆具有默认值的令牌。我需要测试每一个,并打印一条消息,以防它们仍然是默认值。我可以手动执行此操作,如下所示。现在,当我尝试为此编写宏时,我遇到了问题。我希望能够报告未设置的令牌的名称,因此尝试传入令牌的名称并使用它\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
“看到”正确的输入。