讨论了一种使用 XeLaTeX 将西里尔字母转写为拉丁字母的良好方法使用 XeTeX 自动转写西里尔字母
实际上我正在使用 LuaLaTeX。音译可以通过使用\directlua
@DavidCarlisle 在这篇文章中所建议的方式完成,在 LuaLaTeX 中创建从西里尔字母到拉丁字母的音译映射,这实际上是这个问题的根源。
本问题讨论了@DavidCarlisle 在这篇文章中提出的方法的问题,在 LuaLaTeX 中创建从西里尔字母到拉丁字母的音译映射,它使用\directlua
。
一般问题是由于 Unicode 系统不提供尖锐重音元音,而尖锐重音元音是使用“组合尖锐重音”字符 ( \char"0301
) 形成的。
1. 一般重音问题
由于我使用的字体 (Linux Libertine O) 中存在错误,XeTeX 和 LuaTeX 都以错误的方式打印非音译的尖音重音大写西里尔字母。此问题可能已修复,如本回答中所述:西里尔文文本中的错误重音符号,但它强制手动修改文本替换,例如,将 Е́ 替换为 '{E}。
2. 重音符号 Э́ 的音译
“结合尖锐重音”和Ė的组合似乎很难实现!
3. 真正的问题:预定义文本字符串的音译
音译似乎\directlua
不适用于序言中定义的文本。
所有这些问题都显示在以下代码中:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\setlength{\parindent}{0pt}
\def\textsample{Здравствуй, Мир}
\begin{document}
\textsample \par
Здравствуй, Мир \par
Э э Э́ э́ \par \vspace{\baselineskip}
\directlua{require("cyrtr2")}
Transliteration by \verb\directlua\ \vspace{\baselineskip}
\textsample \par
Здравствуй, Мир \par
Э э Э́ э́ \\ %problems if transliterated with 'Ė ė'
\end{document}
答案1
大写字母上的重音问题显然是 libertine 字体的问题,正如您在另一个问题中提到的那样。
如果你这样做,音译将适用于序言
\directlua{require("cyrtr2")}
更早。
也许你正在寻找
\directlua{luatexbase.remove_from_callback(
"process_input_buffer",
"cyrillic transliteration")
将其关闭
\directlua{
luatexbase.add_to_callback(
"process_input_buffer",
cyrtr,
"cyrillic transliteration")}
将其重新打开(您不需要每次都输入带有大映射的文件)