将非拉丁单词的首字母大写(utf-8 两位)

将非拉丁单词的首字母大写(utf-8 两位)

有普通\uppercase宏以及\MakeUppercaselatex3。最后一个宏可以完美地处理两位 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

使用\MakeTitlecase(这需要当前的 LaTeX,底层 expl3 命令\text_titlecase:n也可以在旧系统中使用)。

\documentclass{article}
\usepackage[T2A]{fontenc}

\begin{document}

\MakeUppercase{з}дравей 
   
\MakeTitlecase{здравей}

\end{document}

在此处输入图片描述

答案2

您的问题是您正在使用旧的 8 位 TeX 引擎,2022 年没有 Unicode 引擎。我们拥有 20 多年的 Unicode 标准,并且有大量字体支持它。

例如,当我们使用OpTeX(基于LuaTeX引擎,支持Unicode)时就没有问题:

\fontfam[newcm]
\def\uppercasefirst#1{\uppercase{#1}}

\uppercasefirst здравей.

\bye

相关内容