字符串测试,使用 OR 连接器

字符串测试,使用 OR 连接器

这个帖子,给出了定义一个命令来测试两个字符串是否相等的问题的解决方案,该命令足够强大(与相比\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}

这给出

真 – 真 – 假 – 假

相关内容