是否有一个包可以将西里尔字母的默认字体编码设置为 T2A?

是否有一个包可以将西里尔字母的默认字体编码设置为 T2A?

考虑一下希腊语

\documentclass{article}

\usepackage[LGR,T1]{fontenc}
\usepackage{textalpha}
\begin{document}
φύσις
\end{document

由于默认字体支持 LGR 编码,因此它可以正确呈现:

在此处输入图片描述

我正在寻找偶尔出现的西里尔字母的类似效果。

\documentclass{article}

\usepackage[T2A,T1]{fontenc}
% ? \usepackage
\begin{document}
До свидания!
\end{document}

目前这失败了

LaTeX Error: Command \CYRD unavailable in encoding T1.

我必须手动添加

\documentclass{article}

\usepackage[T2A,T1]{fontenc}
\DeclareTextSymbolDefault{\CYRD}{T2A}
\begin{document}
До свидания!
\end{document}

然后它在下一封信时失败:

LaTeX Error: Command \cyro unavailable in encoding T1.

所以

\documentclass{article}

\usepackage[T2A,T1]{fontenc}
\DeclareTextSymbolDefault{\CYRD}{T2A}
\DeclareTextSymbolDefault{\cyro}{T2A}
\DeclareTextSymbolDefault{\cyrs}{T2A}
\DeclareTextSymbolDefault{\cyrv}{T2A}
\DeclareTextSymbolDefault{\cyri}{T2A}
\DeclareTextSymbolDefault{\cyrd}{T2A}
\DeclareTextSymbolDefault{\cyra}{T2A}
\DeclareTextSymbolDefault{\cyrn}{T2A}
\DeclareTextSymbolDefault{\cyrya}{T2A}
\begin{document}
До свидания!
\end{document}

在此处输入图片描述

我需要一些这样的自动字体编码替换,并且不需要额外的标记。

我试过

\documentclass{article}

\usepackage[T2A,T1]{fontenc}
\usepackage[russian,main=english]{babel}

\begin{document}
До свидания!
\end{document}

但这仍然失败。

这只是pdflatex个问题。不允许在类型主体中添加额外标记\textcyrillic。如上所述,我知道该怎么做,但这有点挑剔,我不知道如何处理重音符号(这是可选的;仅要求基本的西里尔字母支持。不需要连字符)。


(从评论中移出)

T1,T2A替代的建议T2A,T1存在一个问题,即拉丁重音字母将使用重音宏呈现,并且无法从 PDF 中复制粘贴。以下是 的示例é

....\kern -0.27771 (for accent)
....\T2A/cmr/m/n/10 ^^A
....\kern -4.72107 (for accent)
....\T2A/cmr/m/n/10 e

我确实需要支持欧洲语言。通常,文档将使用babel拉丁语作为主要语言,目标是支持偶尔出现的西里尔字母或单词(无需考虑正确的连字符),同时将开销降至最低,并且正文中无需添加额外标记。

答案1

您自己的答案的变体:

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

\makeatletter
\@tfor\next:=%
  {А}{а}{Б}{б}{В}{в}{Г}{г}{Д}{д}{Е}{е}
  {Ё}{ё}{Ж}{ж}{З}{з}{И}{и}{Й}{й}{К}{к}
  {Л}{л}{М}{м}{Н}{н}{О}{о}{П}{п}{Р}{р}
  {С}{с}{Т}{т}{У}{у}{Ф}{ф}{Х}{х}{Ц}{ц}
  {Ч}{ч}{Ш}{ш}{Щ}{щ}{Ъ}{ъ}{Ы}{ы}{Ь}{ь}
  {Э}{э}{Ю}{ю}{Я}{я}%
\do{%
  \begingroup\def\IeC{\protect\DeclareTextSymbolDefault}%
  \protected@edef\@temp{\endgroup\csname u8:\next\endcsname{X2}}\@temp}
\makeatother

\begin{document}

До свидания! See you soon!

\end{document}

添加您需要的其他西里尔字符。请记住,如果您运行的是旧版 LaTeX(2018-04-01 之前),您还需要\usepackage[utf8]{inputenc}

在此处输入图片描述

使用 X2 编码,它涵盖了 T2A、T2B 和 T2C 编码中的大量字符:

\documentclass{article}
\usepackage[X2,T1]{fontenc}
\makeatletter
\@tfor\next:=
{Ё} {Ђ} {Є} {Ѕ} {І} {Ј} {Љ} {Њ} {Ћ} {Ў} {Џ} {А} {Б} {В} {Г} {Д}
{Е} {Ж} {З} {И} {Й} {К} {Л} {М} {Н} {О} {П} {Р} {С} {Т} {У} {Ф}
{Х} {Ц} {Ч} {Ш} {Щ} {Ъ} {Ы} {Ь} {Э} {Ю} {Я} {а} {б} {в} {г} {д}
{е} {ж} {з} {и} {й} {к} {л} {м} {н} {о} {п} {р} {с} {т} {у} {ф}
{х} {ц} {ч} {ш} {щ} {ъ} {ы} {ь} {э} {ю} {я} {ё} {ђ} {є} {ѕ} {і}
{ј} {љ} {њ} {ћ} {ў} {џ} {Ѣ} {ѣ} {Ѫ} {ѫ} {Ѵ} {ѵ} {Ґ} {ґ} {Ғ} {ғ}
{Ҕ} {ҕ} {Җ} {җ} {Ҙ} {ҙ} {Қ} {қ} {Ҝ} {ҝ} {Ҟ} {ҟ} {Ҡ} {ҡ} {Ң} {ң}
{Ҥ} {ҥ} {Ҧ} {ҧ} {Ҩ} {ҩ} {Ҫ} {ҫ} {Ҭ} {ҭ} {Ү} {ү} {Ұ} {ұ} {Ҳ} {ҳ}
{Ҵ} {ҵ} {Ҷ} {ҷ} {Ҹ} {ҹ} {Һ} {һ} {Ҽ} {ҽ} {Ҿ} {ҿ} {Ӏ} {Ӄ} {ӄ} {Ӆ}
{ӆ} {Ӈ} {ӈ} {Ӌ} {ӌ} {Ӎ} {ӎ} {Ӕ} {ӕ} {Ә} {ә} {Ӡ} {ӡ} {Ө} {ө}
\do{%
  \begingroup\def\IeC{\protect\DeclareTextSymbolDefault}%
  \protected@edef\@temp{\endgroup\csname u8:\next\endcsname{X2}}\@temp}
\makeatother

\begin{document}

Ё Ђ Є Ѕ І Ј Љ Њ Ћ Ў Џ А Б В Г Д
Е Ж З И Й К Л М Н О П Р С Т У Ф
Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д
е ж з и й к л м н о п р с т у ф
х ц ч ш щ ъ ы ь э ю я ё ђ є ѕ і
ј љ њ ћ ў џ Ѣ ѣ Ѫ ѫ Ѵ ѵ Ґ ґ Ғ ғ
Ҕ ҕ Җ җ Ҙ ҙ Қ қ Ҝ ҝ Ҟ ҟ Ҡ ҡ Ң ң
Ҥ ҥ Ҧ ҧ Ҩ ҩ Ҫ ҫ Ҭ ҭ Ү ү Ұ ұ Ҳ ҳ
Ҵ ҵ Ҷ ҷ Ҹ ҹ Һ һ Ҽ ҽ Ҿ ҿ Ӏ Ӄ ӄ Ӆ
ӆ Ӈ ӈ Ӌ ӌ Ӎ ӎ Ӕ ӕ Ә ә Ӡ ӡ Ө ө


\end{document}

在此处输入图片描述

令你高兴的是,实现如下expl3

\documentclass{article}
\usepackage[X2,T1]{fontenc}
\usepackage{expl3}

\ExplSyntaxOn
\cs_new_protected:Nn \__recode:N
 {% #1 is \u8:<bytes> which expands to \IeC{<LICR>}
  \exp_last_unbraced:No \__recode_aux:nn #1
 }
\cs_new_protected:Nn \__recode_aux:nn { \DeclareTextSymbolDefault#2{X2} }
\cs_generate_variant:Nn \__recode:N { c }
\tl_map_inline:nn
 {
  {Ё} {Ђ} {Є} {Ѕ} {І} {Ј} {Љ} {Њ} {Ћ} {Ў} {Џ} {А} {Б} {В} {Г} {Д}
  {Е} {Ж} {З} {И} {Й} {К} {Л} {М} {Н} {О} {П} {Р} {С} {Т} {У} {Ф}
  {Х} {Ц} {Ч} {Ш} {Щ} {Ъ} {Ы} {Ь} {Э} {Ю} {Я} {а} {б} {в} {г} {д}
  {е} {ж} {з} {и} {й} {к} {л} {м} {н} {о} {п} {р} {с} {т} {у} {ф}
  {х} {ц} {ч} {ш} {щ} {ъ} {ы} {ь} {э} {ю} {я} {ё} {ђ} {є} {ѕ} {і}
  {ј} {љ} {њ} {ћ} {ў} {џ} {Ѣ} {ѣ} {Ѫ} {ѫ} {Ѵ} {ѵ} {Ґ} {ґ} {Ғ} {ғ}
  {Ҕ} {ҕ} {Җ} {җ} {Ҙ} {ҙ} {Қ} {қ} {Ҝ} {ҝ} {Ҟ} {ҟ} {Ҡ} {ҡ} {Ң} {ң}
  {Ҥ} {ҥ} {Ҧ} {ҧ} {Ҩ} {ҩ} {Ҫ} {ҫ} {Ҭ} {ҭ} {Ү} {ү} {Ұ} {ұ} {Ҳ} {ҳ}
  {Ҵ} {ҵ} {Ҷ} {ҷ} {Ҹ} {ҹ} {Һ} {һ} {Ҽ} {ҽ} {Ҿ} {ҿ} {Ӏ} {Ӄ} {ӄ} {Ӆ}
  {ӆ} {Ӈ} {ӈ} {Ӌ} {ӌ} {Ӎ} {ӎ} {Ӕ} {ӕ} {Ә} {ә} {Ӡ} {ӡ} {Ө} {ө}
 }
 {
  \__recode:c { u8: \tl_to_str:n { #1 } }
 }
\ExplSyntaxOff

\begin{document}

Ё Ђ Є Ѕ І Ј Љ Њ Ћ Ў Џ А Б В Г Д
Е Ж З И Й К Л М Н О П Р С Т У Ф
Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д
е ж з и й к л м н о п р с т у ф
х ц ч ш щ ъ ы ь э ю я ё ђ є ѕ і
ј љ њ ћ ў џ Ѣ ѣ Ѫ ѫ Ѵ ѵ Ґ ґ Ғ ғ
Ҕ ҕ Җ җ Ҙ ҙ Қ қ Ҝ ҝ Ҟ ҟ Ҡ ҡ Ң ң
Ҥ ҥ Ҧ ҧ Ҩ ҩ Ҫ ҫ Ҭ ҭ Ү ү Ұ ұ Ҳ ҳ
Ҵ ҵ Ҷ ҷ Ҹ ҹ Һ һ Ҽ ҽ Ҿ ҿ Ӏ Ӄ ӄ Ӆ
ӆ Ӈ ӈ Ӌ ӌ Ӎ ӎ Ӕ ӕ Ә ә Ӡ ӡ Ө ө

\end{document}

答案2

如果不存在包,我可能会做这样的事情:

\documentclass{article}
\usepackage[T2A,T1]{fontenc}
\makeatletter
\@tfor\@tempa:=%
{ae}{a}{b}{chrdsc}{chvcrs}{ch}{c}{dje}{dze}{dzhe}{d}{erev}{ery}{e}%
{f}{ghcrs}{gup}{g}{hdsc}{hrdsn}{h}{ie}{ii}{ishrt}{i}{je}%
{kbeak}{kdsc}{kvcrs}{k}{lje}{l}{m}{ndsc}{ng}{nje}{n}{otld}{o}{p}{r}%
{schwa}{sdsc}{sftsn}{shch}{shha}{sh}{s}{tshe}{t}{ushrt}{u}{v}%
{ya}{yhcrs}{yi}{yo}{yu}{y}{zdsc}{zhdsc}{zh}{z}\do{%
    \expandafter\DeclareTextSymbolDefault\expandafter
               {\csname cyr\@tempa\endcsname}{T2A}%
    \expandafter\uppercase\expandafter{\expandafter
                 \def\expandafter\@tempa\expandafter{\@tempa}}%
    \expandafter\DeclareTextSymbolDefault\expandafter
      {\csname CYR\@tempa\endcsname}{T2A}%
}%
\makeatother
\DeclareTextSymbolDefault{\CYRpalochka}{T2A}

%\listfiles
\begin{document}
До свидания!

%\makeatletter
%\show\@uclclist
\end{document}

这是基于的正则表达式操作t2aenc.dfu(我将t2aenc.def其与也具有\cyrq、进行了比较\cyrw,但对 Unicode 西里尔字母块的检查似乎表明它们仅代表拉丁语qw,因此如果文档中没有明确的字体编码更改,它们就无法通过 T2A 编码的 TeX 字体呈现,这是我所希望的“无标记”方法的另一个问题,除了破坏字距调整和不设置连字符之外)。

包含\@uclclist更多\cyr...,大概来自utf8enc.dfu(在文件列表中看不到它,但我猜是因为它是在 TL2018 之后的格式中加载的),因此使用它意味着T2A错误地为某些字母分配默认字体编码替换。如果文档不包含这样的字母,那就不是问题了……

达斯维达尼亚

答案3

以下代码非常 hacky,但它仍然不会让您明确列出所有西里尔命令。这个想法是将列表带到某个地方,并且有一个包含所有命令的大写-小写转换列表。因此,我们可以\cyr*循环调用所有西里尔宏(列表中还有一些其他宏,例如,,但为它们声明默认编码似乎是无害的)。@uclclist\DeclareTextSymbolDefault\OE\AE

\documentclass{article}

\usepackage[T2A,T1]{fontenc}

\makeatletter
\def\myloop#1{%
\ifx\relax#1
  \let\next\relax
\else
  \let\next\myloop
  \DeclareTextSymbolDefault{#1}{T2A}
\fi
\next}
\expandafter\myloop\@uclclist\relax
\makeatother

\begin{document}
До свидания! é, è, ç, \OE, \ae
\end{document}

相关内容