RTL 文本中的 LTR 序列——繁琐标记的替代品?

RTL 文本中的 LTR 序列——繁琐标记的替代品?

我正在用波斯语写一本书,但拉丁文字散布在整本书中。

我必须用 xetex 包装每个拉丁文字,以\lt{}引导 xetex 从左到右对齐单词。确实很麻烦。

如果我不使用 \lr{},则的输出One Two Three将为Three Two One波斯语文档,而的输出یک دو سه将为سه دو یک‍‍英语文档。

这是一个非常基本的要求,我想知道为什么 xetex 不能在没有额外标记的情况下做到这一点。有没有办法不使用 \lr{}

答案1

首先,这并不像您声称的那样简单。您可以使用\XeTeXinterchartoksXeTeX 的原始功能来完成此操作。例如:

以下是 Jonathan Kew (XeTeX 的作者) 不久前给我的回复,我只是修改了他的示例以使其适用于 XePersian:

\documentclass{article}
\usepackage{xepersian}
\makeatletter
% classes 1-3 are used in unicode-letters.tex, so we'll put the Latin  letters in 4
\newcount\xp@n
\xp@n=`\A \loop \XeTeXcharclass \xp@n=4 \ifnum\xp@n<`\Z \advance\xp@n by 1 \repeat
\xp@n=`\a \loop \XeTeXcharclass \xp@n=4 \ifnum\xp@n<`\z \advance\xp@n by 1 \repeat
% when we encounter class 4, we'll do \startlatin
\XeTeXinterchartoks 0 4 {\startlatin}
\XeTeXinterchartoks 255 4 {\startlatin}
% and when we encounter class 0, we'll do \finishlatin
\XeTeXinterchartoks 255 0 {\finishlatin}
\XeTeXinterchartoks 4 0 {\finishlatin}
\newcommand{\startlatin}{\if@Latin\else\bgroup\beginL\latinfont\@Latintrue\fi}
\newcommand{\finishlatin}{\if@Latin\unskip\endL\egroup{ }\fi}
\makeatother
\XeTeXinterchartokenstate=1
\begin{document}
این یک آزمایش است
One Two Three
و ادامه آن
\end{document}

请注意,它同时改变字体(变为拉丁字体)和方向(变为 LTR)。

但是,我怀疑您实际上无法大规模地做到这一点,因为处理
方向变化时的标点符号和空格等问题将非常困难。在单向文本中,“语言切换”发生在空格(或标点符号)之前还是之后可能并不重要,但对于双向文本来说,这很重要。我认为,如果您想 可靠地混合 LR 和 RL 脚本,
最终您仍然需要标记。

此外,LR 和 RL 脚本共享一些字符。例如,您如何判断 ) 或 ( 是 RL 字符还是 LR 字符?

或者,您可以实现一个预处理器(用 C 或任何其他语言编写),将 test.tex 转换为 test1.tex,并将所有 LR 单词放在 \lr 中。实际上BiDiTeX存在,因此您可以获取其源代码并对其进行一些修改,以与 bidi/XePersian 包一起使用。

相关内容