这可能是一个新手问题,但我想知道 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 段落。