在从右到左的多幅图像文档中水平定位具有合适框架的 TikZ 图片

在从右到左的多幅图像文档中水平定位具有合适框架的 TikZ 图片

文件中保存了以下 LaTeX 代码~\test.tex

\documentclass{article}
\usepackage{lipsum,tikz}
\usetikzlibrary{fit}

\iffalse
\usepackage{polyglossia}
\setmainlanguage{hebrew}
\setmainfont{Arial}
\fi
\begin{document}
\lipsum[1-1]

\noindent\hspace{0cm}\tikz \node [ draw, fit={(0,0) (12,1)} ] {};

\noindent\hspace{3cm}\tikz \node [ draw, fit={(0,0) (12,1)} ] {};
\end{document}

当在终端中执行以下命令时:

cd ~
pdflatex 测试

在路径 处生成一个 PDF 文件~\test.tex。在 PDF 查看器中打开时,文件显示如下:

无多语

\iffalse如果现在注释掉包含和的两行,并运行\fi命令xelatex test(而不是),则会在路径 处生成一个新的 PDF 文件。这是我在 PDF 查看器中打开文件时期望看到的内容,本质上是上面显示的版本的水平镜像:pdflatex test~/test.pdf

预期结果

但是,在 PDF 查看器中打开时该文件的实际显示内容如下:

多语

为什么下方矩形与右边距的距离不符合指定的 3cm?如何修复?


评论

  1. 我已经向 Polyglossia 项目提交了有关此问题的错误报告。
  2. Polyglossia 项目的 Jürgen Spitzmüller 查看了我的错误报告并回复:

如下例所示,这不是 polyglossia 中的错误,而是 bidi 中的错误。因此,请在 kvafa/bidi/issues 提交工单

    \documentclass{article}
    \usepackage{lipsum,tikz}
    \usetikzlibrary{fit}
    
    \usepackage[RTLdocument]{bidi}
    
    \begin{document}
      \lipsum[1-1]
      
      \noindent\hspace{0cm}\tikz \node [ draw, fit={(0,0) (12,1)} ] {};
      
      \noindent\hspace{3cm}\tikz \node [ draw, fit={(0,0) (12,1)} ] {};
    \end{document}

bidi 包中的一个错误。

因此我向 bidi 项目提交了一份错误报告。

  1. 我收到了 bidi 包开发人员的以下回复。

我研究过这个问题,这似乎是 XeTeX 通过 e-TeX 使用的 TeX-XeT 算法的一个限制。要查看独立于 tikz 的问题,请参阅以下最小示例:

\documentclass{article}
\usepackage[RTLdocument]{bidi}
\begin{document}
\noindent\hbox{This horizontal box should contain enough text so that its width is the same a}

\noindent\hspace{3cm}\hbox{This horizontal box should contain}

\noindent\hspace{3cm}\hbox{This horizontal box should contain enough text so that}

\noindent\hspace{3cm}\hbox{This horizontal box should contain enough text so that its width is the same a}
\end{document}

您应该会看到相同的行为。由于这是引擎错误/限制,恐怕我在这里无能为力。但是,如果您只是想获得相同的输出,那么类似下面的操作应该可以解决问题。

\documentclass{article}
\usepackage{lipsum,tikz}
\usetikzlibrary{fit}

\usepackage[RTLdocument]{bidi}

\begin{document}
\lipsum[1-1]

\noindent\hspace{0cm}\tikz \node [ draw, fit={(0,0) (12,1)} ] {};

\moveleft\dimexpr3cm-\parindent\relax\hbox{\tikz \node [ draw, fit={(0,0) (12,1)} ] {};}
\end{document}

请注意,我当然知道这是一个错误,但由于这是引擎问题,我认为在 bidi 包级别我能做的不多。抱歉!

因此我向 e-TeX 项目提交了一份错误报告。

  1. 在通知软件包的开发人员bidi我已向项目提交了错误报告后e-TeX,按照他们的建议,我收到了他们的进一步沟通,如下所示。

遗憾的是,e-TeX 的原作者几年前就去世了,我认为这个问题不太可能在短期内得到解决。我建议的解决方法还不错,所以我认为它们应该有效。

  1. 我收到了来自 e-TeX 错误跟踪邮件列表的 Laurence Finston 发来的以下消息。

我对此进行了更多测试,发现 \parindent 和 \beginR ... \leftR 不能很好地协同工作。以下示例中,如果您设置 \parindent=1cm,则第二个文本块中会出现一个溢出框。

根据你的需要,将右到左文本放在垂直框中可能是明智的。在第一个块中,最后一行不完整的行排版为左对齐,而不是右对齐。在第二个块中,它为右对齐,这可能是所需的行为。

如果需要缩进,最好在从右到左模式下在段落或行的开头添加明确的粘连,即跳过或调整字距。从右到左模式似乎实际上是为从左到右文本中的短文设计的,而不是为完整段落或多个段落设计的。它可以用于这些事情,但需要一些额外的工作。

\beginR
The quick brown fox jumps over the lazy dog.  The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.  The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.  The quick brown fox jumps over the lazy dog.
\endR

\vskip1cm

\beginR
\vbox{\leavevmode The quick brown fox jumps over the lazy dog.  The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.  The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.  The quick brown fox jumps over the lazy dog.
}
\endR

因此我已提交错误报告与 XeTeX 项目合作。

  1. 我已将芬斯顿先生的评论转达给了 bidi 软件包的开发人员,并收到了以下答复(我对其进行了少许编辑,使其不那么带有个人色彩)。

问题不在于我们不能把 \hbox 放在我们喜欢的任何地方,而是明确地像我上面的代码中演示的那样。当然,我们可以把 \hbox 放在我们想要的任何地方,就像我的另外两个解决方案中所示的那样,但他完全没有抓住重点。我也是 Plain TeX 用户,不使用 LaTeX。所有人要做的就是在 Plain TeX 中从右到左应用我提供的最小示例的内容,然后自己看看问题所在。

话虽如此,几年前我曾与 e-TeX 的原作者 Peter Breitenlohner 联系过,当时他还活着,我们讨论了几个问题,包括这个问题。当时他同意这是 e-TeX 中 TeX-XeT 算法的一个限制,并且它可以成为一个功能,因为 \beginL、\endL、\beginR 和 \endR 都是水平基元。我们同意可以修复这个问题,Peter 说他会努力解决这个问题,但遗憾的是他去世了,事情并没有得到解决。事实上,如果你看看 TeXLive 提交,你可以看到我们讨论的一些历史。

答案1

有趣的是,geometry包的默认设置正在做一些bidi可以控制的事情:

与几何

也就是说,我希望这个错误修复应该很容易实现。

平均能量损失

\documentclass{article}
\usepackage{geometry}

\usepackage{lipsum,tikz}
\usetikzlibrary{fit}

\usepackage[RTLdocument]{bidi}

\begin{document}
    \lipsum[1-1]
    
    \noindent\hspace{0cm}\tikz \node [ draw, fit={(0,0) (12,1)} ] {};
    
    \noindent\hspace{3cm}\tikz \node [ draw, fit={(0,0) (12,1)} ] {};
\end{document}


相关内容