\lowercase 与 \IfSubStr 和 \StrDel

\lowercase 与 \IfSubStr 和 \StrDel

我尝试将参数转换为小写,删除空格,然后在列表中搜索结果字符串。到目前为止,我还没有成功。

以下是我本能地期望能够工作的代码:

\newcommand{\mylist}{one,two,three}

\newcommand{\checkInList}[1]{ 
\StrDel{#1}{ }[\temp]
\IfSubStr{\mylist}{\lowercase{\temp}}
{yes}
{no}
}

\checkinlist{one}

我希望它能打印出来yes,但是没有。

我发现了许多与此主题相关的问题,但到目前为止,没有一个解决方案对我有用。我最接近的解决方案是\uppercase 不能与 \IfSubStr 一起使用?,但尝试将该解决方案更改为我的代码只会导致yesno都被打印出来。我也取得了一些进展将宏(带参数)作为另一个宏的参数传递,但最终也还是失败了。

如果有更好的方法来删除空格、强制大小写和检查列表,我完全愿意尝试完全不同的方法。我没有真正的理由坚持使用我目前使用的任何命令。

答案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}

在此处输入图片描述

相关内容