使用西里尔字母参数将 StrLeft 的结果变为大写

使用西里尔字母参数将 StrLeft 的结果变为大写

我正在尝试将西里尔字符串的首字母大写:

\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能够使用。

相关内容