有普通\uppercase
宏以及\MakeUppercase
latex3。最后一个宏可以完美地处理两位 utf-8 字符,只要你明确地用括号括住参数
\MakeUppercase{здравей}
现在我想将单词的首字母大写。当然,您可以直接将其大写,\MakeUppercase{з}дравей
这样也可以,但是在实际用例中,单词是变量,存储在宏中:
\def\footext{здравей}
\expandafter\MakeUppercase\footext
问题就在这里大卫·卡莱尔这篇文章中有详细的解释:latex3 — 西里尔字母问题。
基本上,如果没有明确指定参数,则没有命令可以抓取首字母:
\def\foo#1{#1}
\foo здарвей % error, the argument is only the first bit of 'з'
有没有一种巧妙而又简单的方法,可以在文本之外获得所需的结果?这样它就应该同时支持一位和两位字符(甚至混合)。
与此同时,我尝试创建一个批量解决方法,基于乌尔丽克·菲舍尔取消保护 utf-8 字符的解决方案。
\documentclass{article}
\usepackage[T2A]{fontenc}
\makeatletter
\def\expandutfvii{%
\count@"C2
\@tempcnta"F5
\def\UTFviii@tmp{\expandafter\def\expandafter~\expandafter{~}}%
\UTFviii@loop
}
\makeatother
\begin{document}
\ExplSyntaxOn
\expandutfvii
\tl_set:Nn \l_tmpa_tl {здравей}
\exp_last_unbraced:Nx \str_uppercase:n \l_tmpa_tl
\ExplSyntaxOff
\end{document}
答案1
答案2
您的问题是您正在使用旧的 8 位 TeX 引擎,2022 年没有 Unicode 引擎。我们拥有 20 多年的 Unicode 标准,并且有大量字体支持它。
例如,当我们使用OpTeX(基于LuaTeX引擎,支持Unicode)时就没有问题:
\fontfam[newcm]
\def\uppercasefirst#1{\uppercase{#1}}
\uppercasefirst здравей.
\bye