答案1
像这样?您需要先确保\word
and/or\butnot
得到扩展。这也可以通过一些 s 来实现,\expandafter
但由于我不确定需要多少个 s,所以我使用了一种更平凡但在我看来也更易于理解的语法。当然,有很多工具可以帮助您做同样的事情(但在写这篇文章的时候,我正在努力解决和之间的冲突\tikzexternalize
,xparse
所以我觉得这个解决方案可能对一些有类似冲突的人有用)。
\documentclass{article}
\makeatletter
\newcommand*{\IfStringInList}[2]{%
\in@{,#1,}{,#2,}%
\ifin@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
\newcommand{\IfStringInListExpandedDo}[4]{%
\edef\tmp{\noexpand\IfStringInList{#1}{#2}{\noexpand\edef\noexpand\tst{1}}{\noexpand\edef\noexpand\tst{0}}}%
\tmp%
\ifnum\tst=1\relax%
#3%
\else%
#4%
\fi}
\begin{document}
\newcommand{\word}{Paul}
\newcommand{\butnot}{Joe}
\IfStringInListExpandedDo{\word}{George,John,Paul,Ringo}{abc \textbf{Beat it}}{cde \textit{Roll it}}
\IfStringInListExpandedDo{\butnot}{George,John,Paul,Ringo}{abc\textbf{Beat it}}{cde \textit{Roll it}}
\end{document}
答案2
本质上一行代码expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\IfStringInList}{mmmm}
{
\clist_if_in:neTF {#2} {#1} {#3} {#4}
}
\prg_generate_conditional_variant:Nnn \clist_if_in:nn {ne} {T,F,TF}
\ExplSyntaxOff
\begin{document}
\newcommand{\word}{Paul}
\newcommand{\butnot}{Joe}
\IfStringInList{\word}{George,John,Paul,Ringo}{Beat it}{Roll it}
\IfStringInList{\butnot}{George,John,Paul,Ringo}{Beat it}{Roll it}
\end{document}
我们e
强制全面扩展第一个参数。
顺便一提,e
扩展是 TeX Live 2019 的一大成就,适用于所有 TeX 引擎。既然你谈到了字符串,我假设搜索字符串中的材料完全可以扩展为字符。