我尝试将参数转换为小写,删除空格,然后在列表中搜索结果字符串。到目前为止,我还没有成功。
以下是我本能地期望能够工作的代码:
\newcommand{\mylist}{one,two,three}
\newcommand{\checkInList}[1]{
\StrDel{#1}{ }[\temp]
\IfSubStr{\mylist}{\lowercase{\temp}}
{yes}
{no}
}
\checkinlist{one}
我希望它能打印出来yes
,但是没有。
我发现了许多与此主题相关的问题,但到目前为止,没有一个解决方案对我有用。我最接近的解决方案是\uppercase 不能与 \IfSubStr 一起使用?,但尝试将该解决方案更改为我的代码只会导致yes
和no
都被打印出来。我也取得了一些进展将宏(带参数)作为另一个宏的参数传递,但最终也还是失败了。
如果有更好的方法来删除空格、强制大小写和检查列表,我完全愿意尝试完全不同的方法。我没有真正的理由坚持使用我目前使用的任何命令。
答案1
原语\lowercase
是不可扩展的;您必须先将参数改为小写,然后使用小写的字符串:
\documentclass{article}
\usepackage{xstring}
\newcommand{\mylist}{one,two,three}
\newcommand{\checkinlist}[1]{%
\lowercase{\def\temp{#1}}%
\StrDel{\temp}{ }[\temp]%
\IfSubStr{\mylist}{\temp}{yes}{no}%
}
\begin{document}
\checkinlist{one}
\checkinlist{One}
\checkinlist{o N e}
\checkinlist{o N f}
\end{document}
答案2
这是一个expl3
版本
\documentclass{article}
\usepackage{xparse}
\newcommand{\mylist}{one,two,three, egreg was faster}
\ExplSyntaxOn
\newcommand{\CheckInList}[2]{%
\tl_set:Nx \l_tmpa_tl {\text_lowercase:n {#1}} %transform the list lowercase
\clist_set:Nx \l_tmpa_clist {\l_tmpa_tl} % make a real list
\tl_set:Nx \l_tmpb_tl {\text_lowercase:n {#2}} % lower case second arg
\clist_if_in:NVTF \l_tmpa_clist {\l_tmpb_tl} {Yes!} {No!} % Check if #2 is in the list
}
\ExplSyntaxOff
\begin{document}
\CheckInList{\mylist}{One}
\CheckInList{\mylist}{two}
\CheckInList{\mylist}{Egreg was faster}
\CheckInList{\mylist}{Should egreg get the tick?}
\end{document}