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