在 Babel 中为 RTL 语言着色

在 Babel 中为 RTL 语言着色

似乎我无法在 babel 中为 RTL 语言着色。下面的 (xelatex) 代码将第一行颜色设为黑色,而不是红色:

\documentclass{article}
\setlength{\parindent}{0pt}
\usepackage{xcolor}
\usepackage[bidi=default]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}{FreeSerif}
\begin{document}

\begingroup
\color{red}English and $math$   % black
\endgroup

\color{red}English and $math$   % red

\end{document}

唯一的区别就是一个群体。我不明白群体有什么重要性。

相关问题可能是为 RTL 模式 (pdflatex 和 xelatex) 创建适合的 \color 宏但是没有用babel,好像也没有解决。

答案1

xetex 的从右到左机制,称为 TeX--XeT,本质上是作为生成的 dvi 文件的后处理器。(该算法的原始版本 TeX-XeT 是一个后处理器,TeX--XeT 本质上是相同的,但内置于 etex 和 xetex 引擎中。)

这意味着几乎所有的处理都是从左到右进行的,然后在最后阶段,每一行都或多或少地以相反的顺序单独写入 dvi 文件。

与 luatex(源自 Omega)中的方向支持相比,这有几个缺点。值得注意的是:

  • 您不能在段落之间指定从右到左(在垂直模式下)。(这就是为什么在 xetex 中很难有从右到左的长表列。)

  • 如果颜色开始和颜色结束等成对\special出现在同一行,则会以错误的顺序写出。

这就是为什么在您的示例中段落在组之前结束(或没有组)会使颜色起作用:颜色开始在一行上,颜色结束在后面的一行,因此即使每行都被反转,开始也在结束之前。

如果颜色命令知道颜色将在同一行结束,并且它是一个 rtl 区域,它可能会以错误的顺序写出特殊内容,因此 TeX--XeT 会反转它们使它们正确,但是一般来说如果它以错误的顺序写入它们但是有一个换行符,颜色结束将再次出现在颜色开始之前的 dvi 中。


这是一个标记为社区维基的非答案,如果有人有更连贯的内容要添加,请随时编辑......


来自蝉:

正如代码所示,该文档的主要语言定义为阿拉伯语,因此即使是英文文本(或任何其他文本)也会按照 RTL 顺序显示。

在 RTL 环境中,将\color命令令牌放在最前面(=在正确的),所以它排在第一位。

但更好的是,为什么不使用 babel 的\selectlanguage{}命令来切换语言?

巴别语言

平均能量损失

\documentclass{article}
\setlength{\parindent}{0pt}
\usepackage{xcolor}
\usepackage[bidi=default]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}{FreeSerif}
\begin{document}

\begingroup
English and $math$ -- this is blue\color{blue}   % black
\endgroup

\color{red}English and $math$ -- this is red   % red

هذا أحمر أم أزرق؟


\selectlanguage{english}

hadha 'ahmar 'am 'azaraq?

\begingroup
\color{blue}  English and $math$ -- this is blue (in front, in English)% black
\endgroup

\color{red}English and $math$ -- this is red   % red
\end{document}

答案2

你可以随时使用彩色用于 bidi 文本。它与 [bidi] 是由同一个开发人员开发的,解决了 TeX--XeT 中的颜色问题(它基本上将颜色作为字体功能而不是特殊功能来处理)。

\documentclass{article}
\setlength{\parindent}{0pt}
\usepackage{xcolor}
\usepackage[bidi=default]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}{FreeSerif}
\begin{document}

\begingroup
\xecolor{red}English and $math$   % black
\endgroup

\xecolor{red}English and $math$   % red

\end{document}

相关内容