使用 XeLaTeX/LuaLaTeX 定义 MakeUppercase 列表

使用 XeLaTeX/LuaLaTeX 定义 MakeUppercase 列表

我为 8 位 TeX 的 Georgian 自定义了大写/小写列表,效果很好,但如何为 XeLaTeX/LuaLaTeX 定义它呢?这里有一个类似的问题在数学模式下将 MakeUppercase 应用于非英文字符

这是例子。它适用于俄语和英语

\documentclass{article}
\usepackage{fontspec}
\usepackage[russian,georgian]{babel}
 \makeatletter
 \def\update@uclc@with@georgian{%
  \expandafter\def\expandafter\@uclclist\expandafter
   {\@uclclist
   \ა\Ⴀ\ბ\Ⴁ\გ\Ⴂ\დ\Ⴃ\ე\Ⴄ\ვ\Ⴅ\ზ\Ⴆ\თ\Ⴇ\ი\Ⴈ\კ\Ⴉ\ლ\Ⴊ\მ\Ⴋ\ნ\Ⴌ\ო\Ⴍ\პ\Ⴎ\ჟ\Ⴏ\რ\Ⴐ\ს\Ⴑ\ტ\Ⴒ\უ\Ⴓ\ფ\Ⴔ\ქ\Ⴕ\ღ\Ⴖ\ყ\Ⴗ\შ\Ⴘ\ჩ\Ⴙ\ც\Ⴚ\ძ\Ⴛ\წ\Ⴜ\ჭ\Ⴝ\ხ\Ⴞ\ჯ\Ⴟ\ჰ\Ⴠ}%
   \let\update@uclc@with@georgian\relax %
  }
    \makeatother
  \setmainfont{Dejavu Serif}
\begin{document}

\MakeUppercase{abc აბგ фип}

\end{document}

答案1

你需要告诉 TeX 映射角色本身彼此之间:这里不涉及控制序列。(这在 8 位引擎中有所不同,因为您需要的代码点不是单个字节。)您还需要确保在选择格鲁吉亚语时激活此代码。例如

\documentclass{article}
\usepackage{fontspec}
\usepackage[russian,georgian]{babel}
\makeatletter
\g@addto@macro\extrasgeorgian{%
  \def\update@uccode@georgian#1#2{%
    \ifx\relax#2\relax
    \else
      \uccode`#1=`#2 %
      \expandafter\update@uccode@georgian
    \fi
  }%
  \update@uccode@georgian
   \ა\Ⴀ\ბ\Ⴁ\გ\Ⴂ\დ\Ⴃ\ე\Ⴄ\ვ\Ⴅ\ზ\Ⴆ\თ\Ⴇ\ი\Ⴈ\კ\Ⴉ\ლ\Ⴊ\მ\Ⴋ\ნ\Ⴌ\ო\Ⴍ\პ\Ⴎ\ჟ\Ⴏ\რ\Ⴐ\ს\Ⴑ\ტ\Ⴒ\უ\Ⴓ\ფ\Ⴔ\ქ\Ⴕ\ღ\Ⴖ\ყ\Ⴗ\შ\Ⴘ\ჩ\Ⴙ\ც\Ⴚ\ძ\Ⴛ\წ\Ⴜ\ჭ\Ⴝ\ხ\Ⴞ\ჯ\Ⴟ\ჰ\Ⴠ
   \relax\relax
}
\makeatother
\setmainfont{Dejavu Serif}
\begin{document}

\MakeUppercase{abc აბგ фип}

\end{document}

可以。(我保留了你的转义字符列表,只是为了避免编辑它们!)


虽然没有直接关系,但至少从“为什么没有标准大小写变化?”这个问题的角度来看,值得注意的是您输入的性质。例如,代码点 U+10D0 被列为

10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;

请注意,这是一个无壳没有上下映射的字母。另一方面,(U+10A0)是一个大小写字母

10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00;

但映射到 U+2D00。如果我们查看那里,我们会发现

2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0

这确实意味着存在大写/小写字母对。但是,U+2D00 的外观似乎与 U+10D0 不同!

(我并不是说 Unicode 在这里是‘正确的’,只是 Unicode TeX 引擎中用于大小写转换的数据是从 Unicode 联盟获取的标准数据,所以我们可以看到为什么存在问题。)

相关内容