在这个帖子,给出了定义一个命令来测试两个字符串是否相等的问题的解决方案,该命令足够强大(与相比\ifthenelse
),可以接受复杂的参数(例如包含命令或环境)。但现在,我想对其进行调整,以“IF arg= a OR arg=b THEN ... ELSE ...”的形式对 1 个参数执行测试,其中“a”和“b”或固定。我的尝试是:
\makeatletter
\newcommand{\testOR}[1]{%
\ifnum\pdfstrcmp{\unexpanded{#1}}{a}=\z@
\expandafter\@secondoftwo
\else
\ifnum\pdfstrcmp{\unexpanded{#1}}{b}=\z@
\expandafter\@secondoftwo%
\else%
\expandafter\@firstoftwo%
\fi%
\fi
}
\makeatother
\begin{document}
\testIfNotTrivial{a}{true}{false} -
\testIfNotTrivial{b}{true}{false} -
\testIfNotTrivial{coucou}{true}{false}
\end{document}
但它没有我所期望的行为:false - False - true
答案1
没有 MWE 这是未经测试的,但在你的第二个分支中,\expandafter
只有摆脱一个\fi
你仍然有左边的,\fi
所以看起来你会想要
\ifnum\pdfstrcmp{\unexpanded{#1}}{b}=\z@
\expandafter\expandafter\expandafter\@secondoftwo
\else
\expandafter\expandafter\expandafter\@firstoftwo
\fi
%
(命令名后不需要)
答案2
你真的如果您有许多这样的测试,应该尝试一下 LaTeX3:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\testOR}{m}
{
\bool_if:nTF
{
\str_if_eq_p:nn { #1 } { a } || \str_if_eq_p:nn { #1 } { b }
}
}
\ExplSyntaxOff
\begin{document}
\testOR{a}{true}{false} --
\testOR{b}{true}{false} --
\testOR{coucou}{true}{false} --
\testOR{\textbf{coucou}}{true}{false}
\end{document}
这给出
真 – 真 – 假 – 假