这有什么问题:
\documentclass{minimal}
\usepackage{xstring}
\begin{document}
\newcommand{\cim}{c1095}
\StrMid{\MakeUppercase{\cim}}{1}{1}
\StrMid{\cim}{2}{100}
\end{document}
\MakeUppercase{\cim}
能用但\StrMid{\MakeUppercase{\cim}}{1}{1}
不能用。为什么?
答案1
由于您不需要事先将字符串大写,因此可以使用以下方法:
\StrMid{\cim}{1}{1}[\temp]
\expandafter\MakeUppercase\expandafter{\temp}
我们将提取的字符串存储在临时宏中,然后应用于\MakeUppercase
结果。
如果字符串由“安全”字符(可打印的 ASCII 字符)组成,则\uppercase
可以使用更简单的方法:
\StrMid{\cim}{1}{1}[\temp]\uppercase\expandafter{\temp}
答案2
该xstring
包对其参数进行了\edef
(详尽的扩展)。Stefan 提出了一种方法,但根据您想要实现的目标,另一种方法是创建大写命令的可扩展版本。有一个内置的expl3
,需要重命名才能在文档中使用:
\documentclass{article}
\usepackage{xstring,expl3}
\ExplSyntaxOn
\cs_gset_eq:NN \MakeExpandableUppercase \text_uppercase:n
\ExplSyntaxOff
\begin{document}
\newcommand{\cim}{c1095}
\StrMid{\MakeExpandableUppercase{\cim}}{1}{1}\space or
\StrMid{\expandafter\MakeExpandableUppercase\expandafter{\cim}}{1}{1} ?
\StrMid{\cim}{2}{100}
\end{document}
正如我所指出的,我不确定相对于字符串提取,您希望大小写更改以什么顺序发生。