使用两个 \IfStrEq 来实现“或”的更简单的方法?

使用两个 \IfStrEq 来实现“或”的更简单的方法?

考虑伪代码

 IF mystring = "this" OR mystring = "that"
    THEN \dosomething
 ENDIF

有没有比下面更简单的方法来实现这一点(在命令内部\CheckString)?换句话说,一种更简单地说\IfStrEq*{\mystring}{this} or \IfStrEq*{\mystring}{that}而不必嵌套条件的方法?

\documentclass{article}
\usepackage{xstring}

\newcommand{\mystring}{other}
\newcommand{\dosomething}{At least one string matches}

\newcommand{\CheckString}{%...
  \IfStrEq*{\mystring}{this} 
    {\dosomething}
    % else
    {\IfStrEq*{\mystring}{that}
      \dosomething
    }
}

\begin{document}
\CheckString
\end{document}

在实践中,\dosomething实际上是一组几个命令,因此我展示的 LaTeX 代码似乎不必要地重复。

当然,我可以定义一个由这几个命令组成的单独的新命令,但我正在尝试这样做没有定义一个新命令。

答案1

它本质上是一行代码expl3

\documentclass{article}
\usepackage{xparse}

\newcommand{\dosomething}{At least one string matches}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\CheckString}{}
 {
  \bool_lazy_or:nnT
   { \str_if_eq_p:ee { \mystring } {this} }
   { \str_if_eq_p:ee { \mystring } {that} }
   { \dosomething }
 }
\ExplSyntaxOff

\begin{document}

\newcommand{\mystring}{other}
X\CheckString X

\renewcommand{\mystring}{this}
X\CheckString X

\renewcommand{\mystring}{that}
X\CheckString X

\end{document}

在此处输入图片描述

您甚至可以进行两次以上的检查,使用\bool_lazy_any:nT

\documentclass{article}
\usepackage{xparse}

\newcommand{\dosomething}{At least one string matches}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\CheckString}{}
 {
  \bool_lazy_any:nT
   {
    { \str_if_eq_p:ee { \mystring } {this} }
    { \str_if_eq_p:ee { \mystring } {that} }
    { \str_if_eq_p:ee { \mystring } {hey!} }
   }
   { \dosomething }
 }
\ExplSyntaxOff

\begin{document}

\newcommand{\mystring}{other}
X\CheckString X

\renewcommand{\mystring}{this}
X\CheckString X

\renewcommand{\mystring}{that}
X\CheckString X

\renewcommand{\mystring}{hey!}
X\CheckString X

\end{document}

相关内容