![LuaLatTeX 在从西里尔字母转写尖音元音时效率低下](https://linux22.com/image/325741/LuaLatTeX%20%E5%9C%A8%E4%BB%8E%E8%A5%BF%E9%87%8C%E5%B0%94%E5%AD%97%E6%AF%8D%E8%BD%AC%E5%86%99%E5%B0%96%E9%9F%B3%E5%85%83%E9%9F%B3%E6%97%B6%E6%95%88%E7%8E%87%E4%BD%8E%E4%B8%8B.png)
可以在 LuaLaTeX 中借助以下工具将西里尔字母音译为拉丁字母,如directlua
@DavidCarlisle 所示:在 LuaLaTeX 中创建从西里尔字母到拉丁字母的音译映射
此方法是 LuaLaTeX 的一个替代方案,可替代一种良好的 XeLaTeX 方法,该方法利用了Mapping
,正如 @egreg 在其回答中所示使用 XeTeX 自动转写西里尔字母
它实际上至少有一个错误需要修复,因为使用与我使用的相同的“TeX Gyre Adventor”字体,XeLaTeXMapping
完美地将重音符号西里尔元音“и́”音译为“í”,同时directlua
将重音符号与字母分开。
\documentclass{article}
\usepackage{fontspec}
\usepackage{ifluatex,ifxetex}
%Lua does not load cyrillics of 'TeX Gyre Adventor' if loaded as usual \setmainfont{TeX Gyre Adventor}. So I had to bypass this problem with the declarations below:
\newfontfamily{\LuaMainFont}{texgyreadventor-regular.otf}
\newfontfamily{\XeMainFont}{TeX Gyre Adventor}
\newfontfamily{\TranslitFont}[Mapping=cyrillic-to-latin]{TeX Gyre Adventor}%{Linux Libertine O}%
\setlength{\parindent}{0pt}
\def\Accents{И и И́ и́}
\begin{document}
\ifluatex
\LuaMainFont
This is LuaLaTeX \par \vspace{\baselineskip}
Здравствуй, Мир \par
\Accents\ \vspace{\baselineskip}
Translitteration by \verb\directlua\ \vspace{\baselineskip}
\directlua{require("cyrtr2")}
Здравствуй, Мир \par
И и И́ и́ \\ %problems with the 'i' dot
\else
\XeMainFont
This is XeLaTeX \par \vspace{\baselineskip}
Здравствуй, Мир \par
\Accents \par \vspace{\baselineskip}
Translitteration by \verb\Mapping=cyrillic-to-latin\ \vspace{\baselineskip}
\TranslitFont
Здравствуй, Мир \par
\Accents %no problems with the 'i' dot
\fi
\end{document}
注 1:这个问题与问题西里尔文文本中的错误重音符号,因为如示例中所见,未音译的 И́ 的重音符号显得放错了位置。
注释 2:如果使用文件名“texgyreadventor-regular.otf”加载,LuaLaTeX 会加载 TeX Gyre Adventor 的整套西里尔字体。相反,如果未使用简单标签“TeX Gyre Adventor”加载,XeLaTeX 不会加载 TeX Gyre Adventor 的西里尔字体。这在上面报告的代码中进行了注释。
答案1
您可以用预先组合的 Í 替换后跟重音符的 И 对,只要确保先搜索/替换较长的字符串,然后再搜索/替换较短的字符串即可。
我刚刚在文件中添加了两个 gsub 替换:
function cyrtr (s)
return
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
s,
'А','A'),
'Б','B'),
'В','V'),
'Г','G'),
'Д','D'),
'Е','E'),
'Ж','Ž'),
'З','Z'),
'И́','Í'),
'И','I'),
'К','K'),
'Л','L'),
'М','M'),
'Н','N'),
'О','O'),
'П','P'),
'Р','R'),
'С','S'),
'Т','T'),
'У','U'),
'Ф','F'),
'Ц','C'),
'Ч','Č'),
'Ш','Š'),
'Э','Ė'),
'Ю','Ju'),
'Я','Ja'),
'Ё','Ë'),
'а','a'),
'б','b'),
'в','v'),
'г','g'),
'д','d'),
'е','e'),
'ж','ž'),
'з','z'),
'и́','í'),
'и','i'),
'й','j'),
'к','k'),
'л','l'),
'м','m'),
'н','n'),
'о','o'),
'п','p'),
'р','r'),
'с','s'),
'т','t'),
'у','u'),
'ф','f'),
'ц','c'),
'ч','č'),
'ш','š'),
'э','ė'),
'ю','ju'),
'я','ja'),
'ё','ë'),
'і','i'),
'І','I'),
'є','je'),
'Ѩ','Je'),
'Х','X'),
'х','x'),
'И','I'),
'Щ','Šč'),
'Ы','Y'),
'щ','šč'),
'ы','y')
end
luatexbase.add_to_callback(
"process_input_buffer",
cyrtr,
"cyrillic transliteration")