将 xecyr 西里尔字母转换为大写

将 xecyr 西里尔字母转换为大写

如何将 xecyr 中定义的西里尔字母(例如\cyra\cyrb)转换为 XeLaTeX 中的大写字母?我尝试过\uppercase\MakeUppercase\MakeTextUppercase但都没有用,文本仍然是小写。

\documentclass{article}
\usepackage{textcase}
\usepackage{xecyr}
\usepackage{polyglossia}
\setmainlanguage[spelling=modern]{russian}
\newfontfamily{\cyrillicfont}{cmunrm.otf}[
      BoldFont = cmunbx.otf,
      ItalicFont = cmunti.otf,
  BoldItalicFont = cmunbi.otf]

\begin{document}
\uppercase{\cyra\cyrb}

\MakeUppercase{\cyra\cyrb}

\MakeTextUppercase{\cyra\cyrb}
\end{document}

\cyra定义为\DeclareUTFcharacter[\UTFencname]{x0430}{\cyra},其他字母定义类似。

答案1

您必须将命令添加到使用的列表中\MakeUppercase

\documentclass{article}
\usepackage{textcase}
\usepackage{xecyr}
\usepackage{polyglossia}
\setmainlanguage[spelling=modern]{russian}
\newfontfamily{\cyrillicfont}{cmunrm.otf}[
      BoldFont = cmunbx.otf,
      ItalicFont = cmunti.otf,
  BoldItalicFont = cmunbi.otf]

\usepackage{etoolbox}
\makeatletter
\appto\@uclclist{\cyra\CYRA\cyrb\CYRB}
\makeatother
\begin{document}

\MakeUppercase{\cyra\cyrb}
\MakeTextUppercase{\cyra\cyrb}

\end{document}

在此处输入图片描述

正如评论中所要求的那样,这里有一种方法可以将 \cyra 重新定义为一个更简单的命令,该命令可以在 中工作\MakeUppercase。但如果可能有副作用,请谨慎使用。为了避免它更改 xunicode 定义的所有命令,直接加载 xunicode:

\documentclass{article}
\usepackage{textcase}

\usepackage{polyglossia}
\setmainlanguage[spelling=modern]{russian}
\newfontfamily{\cyrillicfont}{cmunrm.otf}[
      BoldFont = cmunbx.otf,
      ItalicFont = cmunti.otf,
  BoldItalicFont = cmunbi.otf]

\usepackage{xunicode}
\usepackage{expl3}
\ExplSyntaxOn
\let\OldDeclareUTFcharacter\DeclareUTFcharacter
\renewcommand\DeclareUTFcharacter[3][]{%
 \tl_set:Nx\l_tmpa_tl{\tl_tail:n{#2}}
 \tl_set:Nx #3 {\char_generate:nn{"\l_tmpa_tl}{11}} 
 }
\ExplSyntaxOff 
\usepackage{xecyr} 
\let\DeclareUTFcharacter\OldDeclareUTFcharacter



\begin{document}
\uppercase{\cyra\cyrb}
\MakeUppercase{\cyra\cyrb}
\MakeTextUppercase{\cyra\cyrb}

\end{document}

答案2

XeLaTeX 需要 Unicode 输入,因此polyglossia无需为“旧式” LICR 规范加载大小写对应关系。不过,我知道旧版文档可能会存在一些问题。

一个简单的解决方法是加载 T2A 编码,然后立即覆盖它:

\documentclass{article}

\usepackage[T2A,TU]{fontenc}
\usepackage{textcase}
\usepackage{xecyr}
\usepackage{polyglossia}

\setmainlanguage[spelling=modern]{russian}

\setmainfont{cmun}[
  Extension      = .otf,
  UprightFont    = *rm,
  BoldFont       = *bx,
  ItalicFont     = *ti,
  BoldItalicFont = *bi
]

\begin{document}

\MakeUppercase{\cyra\cyrb}

\MakeTextUppercase{\cyra\cyrb}

\end{document}

您可以重新定义 LICR 来指向一个字符,比如

\def\cyra{^^^^0430}

这可以通过使用中的代码来完成t2aenc.dfu,其中包含如下行

\DeclareUnicodeCharacter{0410}{\CYRA}

使用好的编辑器,可以很容易地将该文件更改为cyrlicr.tex

\newcommand{\RedefineLICR}[2]{\def#2{#1}}

\RedefineLICR{^^^^0401}{\CYRYO}
\RedefineLICR{^^^^0402}{\CYRDJE}
\RedefineLICR{^^^^0404}{\CYRIE}
\RedefineLICR{^^^^0405}{\CYRDZE}
\RedefineLICR{^^^^0406}{\CYRII}
\RedefineLICR{^^^^0407}{\CYRYI}
\RedefineLICR{^^^^0408}{\CYRJE}
\RedefineLICR{^^^^0409}{\CYRLJE}
\RedefineLICR{^^^^040a}{\CYRNJE}
\RedefineLICR{^^^^040b}{\CYRTSHE}
\RedefineLICR{^^^^040e}{\CYRUSHRT}
\RedefineLICR{^^^^040f}{\CYRDZHE}
\RedefineLICR{^^^^0410}{\CYRA}
\RedefineLICR{^^^^0411}{\CYRB}
\RedefineLICR{^^^^0412}{\CYRV}
\RedefineLICR{^^^^0413}{\CYRG}
\RedefineLICR{^^^^0414}{\CYRD}
\RedefineLICR{^^^^0415}{\CYRE}
\RedefineLICR{^^^^0416}{\CYRZH}
\RedefineLICR{^^^^0417}{\CYRZ}
\RedefineLICR{^^^^0418}{\CYRI}
\RedefineLICR{^^^^0419}{\CYRISHRT}
\RedefineLICR{^^^^041a}{\CYRK}
\RedefineLICR{^^^^041b}{\CYRL}
\RedefineLICR{^^^^041c}{\CYRM}
\RedefineLICR{^^^^041d}{\CYRN}
\RedefineLICR{^^^^041e}{\CYRO}
\RedefineLICR{^^^^041f}{\CYRP}
\RedefineLICR{^^^^0420}{\CYRR}
\RedefineLICR{^^^^0421}{\CYRS}
\RedefineLICR{^^^^0422}{\CYRT}
\RedefineLICR{^^^^0423}{\CYRU}
\RedefineLICR{^^^^0424}{\CYRF}
\RedefineLICR{^^^^0425}{\CYRH}
\RedefineLICR{^^^^0426}{\CYRC}
\RedefineLICR{^^^^0427}{\CYRCH}
\RedefineLICR{^^^^0428}{\CYRSH}
\RedefineLICR{^^^^0429}{\CYRSHCH}
\RedefineLICR{^^^^042a}{\CYRHRDSN}
\RedefineLICR{^^^^042b}{\CYRERY}
\RedefineLICR{^^^^042c}{\CYRSFTSN}
\RedefineLICR{^^^^042d}{\CYREREV}
\RedefineLICR{^^^^042e}{\CYRYU}
\RedefineLICR{^^^^042f}{\CYRYA}
\RedefineLICR{^^^^0430}{\cyra}
\RedefineLICR{^^^^0431}{\cyrb}
\RedefineLICR{^^^^0432}{\cyrv}
\RedefineLICR{^^^^0433}{\cyrg}
\RedefineLICR{^^^^0434}{\cyrd}
\RedefineLICR{^^^^0435}{\cyre}
\RedefineLICR{^^^^0436}{\cyrzh}
\RedefineLICR{^^^^0437}{\cyrz}
\RedefineLICR{^^^^0438}{\cyri}
\RedefineLICR{^^^^0439}{\cyrishrt}
\RedefineLICR{^^^^043a}{\cyrk}
\RedefineLICR{^^^^043b}{\cyrl}
\RedefineLICR{^^^^043c}{\cyrm}
\RedefineLICR{^^^^043d}{\cyrn}
\RedefineLICR{^^^^043e}{\cyro}
\RedefineLICR{^^^^043f}{\cyrp}
\RedefineLICR{^^^^0440}{\cyrr}
\RedefineLICR{^^^^0441}{\cyrs}
\RedefineLICR{^^^^0442}{\cyrt}
\RedefineLICR{^^^^0443}{\cyru}
\RedefineLICR{^^^^0444}{\cyrf}
\RedefineLICR{^^^^0445}{\cyrh}
\RedefineLICR{^^^^0446}{\cyrc}
\RedefineLICR{^^^^0447}{\cyrch}
\RedefineLICR{^^^^0448}{\cyrsh}
\RedefineLICR{^^^^0449}{\cyrshch}
\RedefineLICR{^^^^044a}{\cyrhrdsn}
\RedefineLICR{^^^^044b}{\cyrery}
\RedefineLICR{^^^^044c}{\cyrsftsn}
\RedefineLICR{^^^^044d}{\cyrerev}
\RedefineLICR{^^^^044e}{\cyryu}
\RedefineLICR{^^^^044f}{\cyrya}
\RedefineLICR{^^^^0451}{\cyryo}
\RedefineLICR{^^^^0452}{\cyrdje}
\RedefineLICR{^^^^0454}{\cyrie}
\RedefineLICR{^^^^0455}{\cyrdze}
\RedefineLICR{^^^^0456}{\cyrii}
\RedefineLICR{^^^^0457}{\cyryi}
\RedefineLICR{^^^^0458}{\cyrje}
\RedefineLICR{^^^^0459}{\cyrlje}
\RedefineLICR{^^^^045a}{\cyrnje}
\RedefineLICR{^^^^045b}{\cyrtshe}
\RedefineLICR{^^^^045e}{\cyrushrt}
\RedefineLICR{^^^^045f}{\cyrdzhe}
\RedefineLICR{^^^^0490}{\CYRGUP}
\RedefineLICR{^^^^0491}{\cyrgup}
\RedefineLICR{^^^^0492}{\CYRGHCRS}
\RedefineLICR{^^^^0493}{\cyrghcrs}
\RedefineLICR{^^^^0496}{\CYRZHDSC}
\RedefineLICR{^^^^0497}{\cyrzhdsc}
\RedefineLICR{^^^^0498}{\CYRZDSC}
\RedefineLICR{^^^^0499}{\cyrzdsc}
\RedefineLICR{^^^^049a}{\CYRKDSC}
\RedefineLICR{^^^^049b}{\cyrkdsc}
\RedefineLICR{^^^^049c}{\CYRKVCRS}
\RedefineLICR{^^^^049d}{\cyrkvcrs}
\RedefineLICR{^^^^04a0}{\CYRKBEAK}
\RedefineLICR{^^^^04a1}{\cyrkbeak}
\RedefineLICR{^^^^04a2}{\CYRNDSC}
\RedefineLICR{^^^^04a3}{\cyrndsc}
\RedefineLICR{^^^^04a4}{\CYRNG}
\RedefineLICR{^^^^04a5}{\cyrng}
\RedefineLICR{^^^^04aa}{\CYRSDSC}
\RedefineLICR{^^^^04ab}{\cyrsdsc}
\RedefineLICR{^^^^04ae}{\CYRY}
\RedefineLICR{^^^^04af}{\cyry}
\RedefineLICR{^^^^04b0}{\CYRYHCRS}
\RedefineLICR{^^^^04b1}{\cyryhcrs}
\RedefineLICR{^^^^04b2}{\CYRHDSC}
\RedefineLICR{^^^^04b3}{\cyrhdsc}
\RedefineLICR{^^^^04b6}{\CYRCHRDSC}
\RedefineLICR{^^^^04b7}{\cyrchrdsc}
\RedefineLICR{^^^^04b8}{\CYRCHVCRS}
\RedefineLICR{^^^^04b9}{\cyrchvcrs}
\RedefineLICR{^^^^04ba}{\CYRSHHA}
\RedefineLICR{^^^^04bb}{\cyrshha}
\RedefineLICR{^^^^04c0}{\CYRpalochka}
\RedefineLICR{^^^^04d4}{\CYRAE}
\RedefineLICR{^^^^04d5}{\cyrae}
\RedefineLICR{^^^^04d8}{\CYRSCHWA}
\RedefineLICR{^^^^04d9}{\cyrschwa}
\RedefineLICR{^^^^04e8}{\CYROTLD}
\RedefineLICR{^^^^04e9}{\cyrotld}
\endinput

请注意,只能使用“简单”命令(不能使用组合命令),并且第一个参数中的字母(实际上是十六进制数字)必须小写。使用此文件在工作目录中,您可以执行

\documentclass{article}

\usepackage{textcase}
\usepackage{xecyr}
\usepackage{polyglossia}

\setmainlanguage[spelling=modern]{russian}

\setmainfont{cmun}[
  Extension      = .otf,
  UprightFont    = *rm,
  BoldFont       = *bx,
  ItalicFont     = *ti,
  BoldItalicFont = *bi,
]

\input{cyrlicr}

\begin{document}

\MakeUppercase{\cyra\cyrb}

\MakeTextUppercase{\cyra\cyrb}

\end{document}

相关内容