考虑伪代码
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}