TeX 如何显示 RTL 语言中的单词?

TeX 如何显示 RTL 语言中的单词?

这可能是一个新手问题,但我想知道 TeX 如何自动理解 RTL 语言。

这是我的测试程序:

\documentclass{article}
\usepackage{fontspec}
\newfontfamily{\arabicfont}[Language=Default,Script=Arabic]{Cairo}
\begin{document}
\arabicfont العربية \par
\arabicfont ا ل ع ر ب ي ة \par
\end{document}

输出:

在此处输入图片描述

我没有使用诸如 之类的包bidi,也没有在代码中的任何地方提到 RTL 之类的东西,但字母放在一起时已经按正确的顺序显示了。是字体还是 TeX 引擎在这里发挥了魔力?(段落中多个单词的顺序是错误的,但一个单词内的字母顺序是正确的。)

(我认为网页在代码显示方面也有一些魔力。源代码中的字母按从左到右的顺序书写,与输出中的第二行相同。)

答案1

您没有提到您正在使用哪个引擎,但我猜您正在使用XeTeX

XeTeX适用Unicode BiDi 算法,但仅限于每个单词(或更大的文本块,如果\XeTeXinterwordspaceshaping为正数)使用现代字体时(参见最后一条评论这个答案)。

考虑以下代码(使用 进行编译XeTeX,而不是XeLaTeX,请注意 需要\TeXXeTstate为正数才能使用\beginR\endR原语,它们决定文本方向):

\TeXXeTstate1

\beginR Hello World\endR

\bye

输出结果不出所料

在此处输入图片描述

但是,请记住,纯 TeX 默认加载 cmr10,这不是现代字体。通过加载 OpenType 版本的 Latin Modern,我们将得到

\font\test="Latin Modern Roman 10 Regular" at 10pt

\TeXXeTstate1

\beginR Hello World\endR

\bye

在此处输入图片描述

如您所见,文本按从左到右的方式呈现,但仅按单词呈现,因为拉丁字母被 unicode BiDi 算法视为强 LTR。

通过增加,\XeTeXinterwordspaceshaping您还可以将 unicode BiDi 算法应用于整个句子

\font\test="Latin Modern Roman 10 Regular" at 10pt\test
\XeTeXinterwordspaceshaping=2
\TeXXeTstate=1

\beginR Hello World\endR

\bye

在此处输入图片描述

更有趣的例子是混合了英语和此处的文本(抱歉,我不懂阿拉伯语),无需任何方向节点即可正确呈现

\font\test="David CLM Medium" at 10pt\test
\XeTeXinterwordspaceshaping=2
\TeXXeTstate=1

Hello World שלום עולם, Just some text סתם קצת טקסט

\bye

在此处输入图片描述

但我认为,如果不使用方向性原语,就无法写出 RTL 段落。

相关内容