如何在 LaTeX 中将旧的 OT2 文件重新编码为 T2A?

如何在 LaTeX 中将旧的 OT2 文件重新编码为 T2A?

我有一些用 OT2 编码和华盛顿西里尔字母准备的旧文件,即使用美式键盘将 TeX 文件排版为拉丁字母,而输出为西里尔字母。现在,我想在新文件中使用这些旧文件的部分内容,但使用另一种在 LaTeX(不是 XeTeX)环境中编码的 T2A 字体。换句话说,我将获得一个文件,其中一部分以 OT2 排版,另一部分以 T2A 编码排版,并且两者都应以相同的 T2A 字体打印输出。

通过更改输入编码inputenc.sty不起作用,因为它基于激活字符 >127,并且激活 ASCII 字符 AZ、az 将严重损害所有 TeX 命令。我通过实用程序生成新的 TFM 文件解决了这个问题afm2tfm,但我认为这个解决方案非常不合适。有人知道如何在 LaTeX 遇到 G 时强制输出西里尔字母 Г 吗?也许可以提出同样的问题来处理其他脚本。

答案在使用 LuaTeX 和 XeTeX 的塞尔维亚西里尔语如果有人使用 XeTeX,但我对 LaTeX 解决方案感兴趣。

答案1

这将是一项艰巨的工作。您需要构建虚拟字体,使用 OT2 对应关系将每个拉丁字符映射到其 T2A 对应字符,并将连字符指向正确的字符。

可以自动创建此过程,因为方案是固定的,所以应该为您计划使用的每种字体进行此过程。我可以很容易地预测这需要花费数小时的繁琐劳动。

TeX 解决方案可以是成对检查字符。如果它们组成一个连字符,则打印相应的字符并继续检查接下来的两个字符;否则,打印第一个字符并重新开始检查接下来的两个字符。

这是概念证明;空格存在问题,因此这个简单的宏在其他命令的参数中不起作用。在这种情况下,应该使用较慢的例程,或者使用 LaTeX3 函数采用不同的方法。

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

\makeatletter
\newcommand{\cyrtext}{%
  \begingroup\fontencoding{T2A}\selectfont
  \catcode`\ =12 \@cyrtext}

\def\@cyrtext#1{%
  \@@cyrtext#1\@empty\@empty
  \endgroup
}

\def\@@cyrtext#1#2{%
  \ifx#2\@empty
    \csname @cyr@#1\endcsname
    \expandafter\@gobble
  \else
    \expandafter\@firstofone
  \fi
  {\@@cyr#1#2}%
}
\def\@@cyr#1#2{%
  \ifcsname @cyr@#1#2\endcsname
    \csname @cyr@#1#2\endcsname
    \expandafter\@firstoftwo
  \else
    \csname @cyr@#1\endcsname
    \expandafter\@secondoftwo
  \fi
  {\@@cyrtext}%
  {\@@cyrtext#2}%
}
\def\@cyr@R{\CYRR}
\def\@cyr@u{\cyru}
\def\@cyr@s{\cyrs}
\def\@cyr@k{\cyrk}
\def\@cyr@i{\cyri}
\@namedef{@cyr@i0}{\cyrishrt}
\@namedef{@cyr@ }{ }
\def\@cyr@ya{\cyrya}
\def\@cyr@z{\cyrz}
\def\@cyr@y{\cyrery}
%%% supplement all other needed macros
\makeatother

\begin{document}
\cyrtext{Russkii0 yazyk}
\end{document}

在此处输入图片描述

这是使用 LaTeX3 的可能实现,允许将其\cyrtext作为参数包含在其他命令中。该字符|不应出现在参数中。根据当前定义,也不应出现任何宏。

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

\ExplSyntaxOn
\NewDocumentCommand{\cyrtext}{m}
 {
  \group_begin:
  \fontencoding{T2A}\selectfont
  \djk_cyrtext:n { #1 }
  \group_end:
 }

\tl_new:N \l_djk_cyrtext_tl
\prop_new:N \g_djk_cyrletters_prop
\cs_generate_variant:Nn \prop_get:Nn { Nx }

\cs_new_protected:Npn \djk_cyrtext:n #1
 {
  \tl_set:Nn \l_djk_cyrtext_tl { #1 \prg_do_nothing: \prg_do_nothing: }
  \tl_replace_all:Nnn \l_djk_cyrtext_tl { ~ } { | }
  \exp_after:wN \__djk_cyrtext:NN \l_djk_cyrtext_tl
 }

\cs_new_protected:Npn \__djk_cyrtext:NN #1 #2
 {
  \token_if_eq_meaning:NNTF \prg_do_nothing: #2 
  { \prop_get:Nx \g_djk_cyrletters_prop { #1 } }
  { \__djk_cyrtext_aux:NN #1 #2 }
 }

\cs_new_protected:Npn \__djk_cyrtext_aux:NN #1 #2
 {
  \prop_if_in:NnTF \g_djk_cyrletters_prop { #1 #2 }
   { \prop_get:Nn \g_djk_cyrletters_prop { #1 #2 } \__djk_cyrtext:NN }
   { \prop_get:Nn \g_djk_cyrletters_prop { #1 } \__djk_cyrtext:NN #2 }
 }

\prop_gput:Nnn \g_djk_cyrletters_prop { } { } % empty property
\prop_gput:Nnn \g_djk_cyrletters_prop { | } { ~ } % | is a space
\prop_gput:Nnn \g_djk_cyrletters_prop { R } { \CYRR }
\prop_gput:Nnn \g_djk_cyrletters_prop { u } { \cyru }
\prop_gput:Nnn \g_djk_cyrletters_prop { s } { \cyrs }
\prop_gput:Nnn \g_djk_cyrletters_prop { k } { \cyrk }
\prop_gput:Nnn \g_djk_cyrletters_prop { i } { \cyri }
\prop_gput:Nnn \g_djk_cyrletters_prop { i0 }{ \cyrishrt }
\prop_gput:Nnn \g_djk_cyrletters_prop { ya }{ \cyrya }
\prop_gput:Nnn \g_djk_cyrletters_prop { z } { \cyrz }
\prop_gput:Nnn \g_djk_cyrletters_prop { y } { \cyrery }
%%% add all the other combinations
\ExplSyntaxOff

\begin{document}
\cyrtext{Russkii0 yazyk}

\textbf{\cyrtext{Russkii0}}
\end{document}

在此处输入图片描述

相关内容