我正在尝试将西里尔字符串的首字母大写:
\StrLeft{абырвалг}{3}[\firstletters]
\firstletters
\MakeUppercase{\firstletters}
结果为小写“абыабы”。
在拉丁字符串下同样的操作正确:
\StrLeft{abcdef}{3}[\firstletters]
\MakeUppercase{\firstletters}
返回“ABC”
如果参数是字符串而不是宏,则 MakeUppercase 宏可以正常工作:
\MakeUppercase{абы}
返回“АБЫ”
出了什么问题?
答案1
西里尔字符不是单个字节,\StrLeft
并且它的完全扩展将使事情变得非常困难,很可能会产生奇怪的错误。
\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{xstring}
\makeatletter
\newcommand{\uc}[2][1]{%
\begingroup
\let\IeC\@firstofone
\protected@edef\dmitry@temp{#2}%
\noexpandarg
\expandafter\StrLeft\expandafter{\dmitry@temp}{#1}[\dmitry@temp]%
\MakeUppercase{\dmitry@temp}%
\endgroup
}
\makeatother
\begin{document}
\uc{абырвалг}
\uc[3]{абырвалг}
\end{document}
我首先获取输入字符串的 LICR 表示,然后使用\StrLeft
进行一级扩展,以避免错误。在第二个示例中,我们将得到\cyra\cyrb\cyryery
,它\MakeUppercase
能够使用。