我正在使用包\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}