\uppercase 不能与 \IfSubStr 一起使用?

\uppercase 不能与 \IfSubStr 一起使用?

我正在使用包\IfSubStr的宏xstring来决定用户给出的选项是否包含某些字母,如果包含,我会采取一些行动。

我想要独立于大小写地测试用户选项是否包含该字母,所以我想我会使用\uppercase宏来实现独立于大小写地比较。但它并没有像我预期的那样工作。

以下是最简单的演示:

\usepackage{xstring}
\newcommand{\test}[1]{%
  \IfSubStr{\uppercase{#1}}{K}{%then
    In then%
  }{%else
    In else%
  }
}
\begin{document}
  \test{k}
\end{document}

我期望打印In then,但它打印。为什么会这样?我该如何修复它才能按预期In else打印?In then

答案1

你首先要做的是\uppercase

\documentclass{article}
\usepackage{xstring}
\newcommand{\test}[1]{%
  \uppercase{\IfSubStr{#1}}{K}{%then
    In then%
  }{%else
    In else%
  }
}
\begin{document}
  \test{k}
\end{document}

该原语的\uppercase工作方式相当特殊:它检查作为其参数给出的标记列表,并将所有字符标记更改为大写字母,然后将处理后的标记列表放回到输入流中。

在您的测试中,您将\uppercase{k}与进行比较K,它们是不同的(并且启用扩展不会有帮助,因为\uppercase是不可扩展的。通过首先执行此操作,TeX 最终看到的是所需的

\IfSubStr{K}{K}

我们expl3可以定义一个\ifsubstringnocaseTF宏:

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\ifsubstringnocaseTF}{mmmm}
 {% #1 = full string, #2 = string to check
  \str_if_in:eeTF { \str_foldcase:n { #1 } } { \str_foldcase:n { #2 } } { #3 } { #4 }
 }
\prg_generate_conditional_variant:Nnn \str_if_in:nn { ee } { T, F, TF }

\ExplSyntaxOff

\newcommand{\test}[1]{%
  \ifsubstringnocaseTF{#1}{K}{%then
    In then%
  }{%else
    In else%
  }
}
\begin{document}

\test{k}

\test{K}

\end{document}

在此处输入图片描述

答案2

无需使用\uppercase

\documentclass{article}
\usepackage{xstring}
\newcommand{\test}[1]{%
  \IfSubStr{#1}{K}{In then }{\IfSubStr{#1}{k}{In then }{ In else }}}
\begin{document}
  \test{k} \test{aa} \test{AAKk} \test{aaA}
\end{document}

在此处输入图片描述

相关内容