\StrMid 和 \MakeUppercase 问题

\StrMid 和 \MakeUppercase 问题

这有什么问题:

\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}

正如我所指出的,我不确定相对于字符串提取,您希望大小写更改以什么顺序发生。

相关内容