bidi、RTL 和 \write

bidi、RTL 和 \write

为了解决 RTL 中 reledmac 的一个问题,我对 \write 和 bidi 做了一些测试。

在以下 MWE 中,只有第一个\write有效。如果我删除\RTL,则所有\write工作都有效。

\documentclass{article}
\usepackage{bidi}
\begin{document}
\RTL
\newwrite\toto
\openout\toto=\jobname.sty
\write\toto{1}ssss
\write\toto{2}ssss
\write\toto{3}ssss
\closeout\toto

s
\end{document}

那又怎么样?

答案1

你很幸运,1 得到了输出,如果你使用

\documentclass{article}
\usepackage{bidi}
\begin{document}
\showoutput
\RTL
\leavevmode\newwrite\toto
\openout\toto=\jobname.sty
\write\toto{1}ssss
\write\toto{2}ssss
\write\toto{3}ssss
\closeout\toto

s
\end{document}

那么就不会向文件写入任何内容,

问题在于 xetex 从 etex 继承的 tex--xet 双向模型。从右到左的方向性并没有像在从 omega 继承的 luatex 模型中那样在低级别内置到系统中,它本质上是一个简单的传递,可以在水平框中反转节点(仅)。

因此,在垂直模式下(文件打开,并且\write示例中的第一个文件是可以的,但是段落的行与后面的写入和文件关闭相比,节点是反转的,因此文件关闭首先发生,这意味着正在\write写入已关闭的文件,因此只会出现在终端和日志上。

一个可能的方案是

\documentclass{article}
\usepackage{bidi}
\def\foo#1{\ifvmode#1\else\vadjust{#1}\fi}
\begin{document}
\showoutput
\RTL
\foo{\newwrite\toto}
\openout\toto=\jobname.sty
\foo{\write\toto{1}}ssss
\foo{\write\toto{2}}ssss
\foo{\write\toto{3}}ssss
\foo{\closeout\toto}

s
\end{document}

相关内容