测试字符串是否在列表中的包

测试字符串是否在列表中的包

是否有一个包提供用于测试字符串是否在列表中的命令?我看到几个答案定义了自己的命令来执行此任务或类似任务,但我更喜欢“自我进化”且有据可查的解决方案来完成此类任务。更准确地说,命令应该是这样的

\IfStringInList{string}{list}{DoThisIfTrue}{DoThisIfFalse}

例如

\IfStringInList{Paul}{George,John,Paul,Ringo}{Beat it}{Roll it}

编辑:我并不反对定义命令。我期望这种自然功能存在于一个现成的包中,可以以非常简单的方式访问。

答案1

xtring包提供了这样的命令:

\documentclass{article}
\usepackage{xstring}
\newcommand\IfStringInList[2]{\IfSubStr{,#2,}{,#1,}}
\begin{document}
\IfStringInList{Paul}{George,John,Paul,Ringo}{True}{False}

\IfStringInList{Joe}{George,John,Paul,Ringo}{True}{False}

\IfStringInList{ul,Ri}{George,John,Paul,Ringo}{True}{False}
\end{document}

答案2

使用内核命令的简单 LaTeX \in@

\documentclass{article}

\makeatletter
\newcommand*{\IfStringInList}[2]{%
  \in@{,#1,}{,#2,}%
  \ifin@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
\makeatother

\begin{document}
\IfStringInList{Paul}{George,John,Paul,Ringo}{Beat it}{Roll it}
\end{document}

无需定义命令且无需手动解决\makeatletter

根据要求评论. 我看不出有什么意义,不定义宏。

\csname in@\endcsname{,Paul,}{,George,John,Paul,Ringo,}%
\expandafter\ifx\csname ifin@\expandafter\endcsname\csname iftrue\endcsname
  Beat it%
\else
  Roll it%
\fi

}

\ifin@当此构造位于另一个\if分支内时,需要进行冗长的替换。

答案3

expl3 已准备好使用\clist_if_in:nnTF {<clist>} {<item>} {<true>} {<false>}::

\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand \IfStringInList {mmmm}
  { \clist_if_in:nnTF {#2} {#1} {#3} {#4} }
\ExplSyntaxOff
\begin{document}
\IfStringInList{Paul}{George,John,Paul,Ringo}{Beat it}{Roll it}% Beat it

\IfStringInList{ul,Ri}{George,John,Paul,Ringo}{Beat it}{Roll it}% Roll it
\end{document}

答案4

另一种方法...编辑以允许空白字段(A,,B)

\documentclass{article}
\usepackage{ifthen}
\newcommand\IfStringInList[4]{\stringsearch#1:#2,\relax\relax%
  \if T\found#3\else#4\fi}
\def\stringsearch#1:#2,#3\relax{\ifthenelse{\equal{#1}{#2}}{\def\found{T}}{%
  \if\relax#3\relax\def\found{F}\else\stringsearch #1:#3\relax\fi}}
\begin{document}
\IfStringInList{Paul}{George,John,Paul,Ringo}{Beat it}{Roll it}

\IfStringInList{Paul}{George,,John,Paul,Ringo}{Beat it}{Roll it}

\IfStringInList{Yanni}{George,John,Paul,Ringo}{Beat it}{Roll it}
\end{document}

相关内容