为了解决 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}