使用 \directlua 修复拉丁音译中尖音西里尔元音的问题

使用 \directlua 修复拉丁音译中尖音西里尔元音的问题

讨论了一种使用 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")}

将其重新打开(您不需要每次都输入带有大映射的文件)

相关内容