测试字符串是否在带有变量的列表中

测试字符串是否在带有变量的列表中

基于这个问题,我想要以下内容

\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}

返回Beat itRoll it

原则上已经回答了这个问题这里但只能借助 2 个包。不过,使用解决方案在这里,只是我不知道如何扩展宏?(即使在此引用:/ )

答案1

像这样?您需要先确保\wordand/or\butnot得到扩展。这也可以通过一些 s 来实现,\expandafter但由于我不确定需要多少个 s,所以我使用了一种更平凡但在我看来也更易于理解的语法。当然,有很多工具可以帮助您做同样的事情(但在写这篇文章的时候,我正在努力解决和之间的冲突\tikzexternalizexparse所以我觉得这个解决方案可能对一些有类似冲突的人有用)。

\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 引擎。既然你谈到了字符串,我假设搜索字符串中的材料完全可以扩展为字符。

相关内容