TikZ 当前页面节点位于意外的位置

TikZ 当前页面节点位于意外的位置

编辑:我原来的问题有一个错误。使用“latex”会出现错误输出,但使用“pdflatex”不会出现错误输出。我将重新表述问题,使其更准确、更简洁。

我正在尝试将某个对象定位在页面上的绝对位置,遵循 TikZ 手册第 17.13.2 节中的示例(“引用当前页面节点 - 绝对定位”)。我正在查看手册的 3.0.1a 版本。以下示例直接来自手册:

\documentclass{article}
\usepackage{tikz}
\begin{document}

This example adds a circle in the middle of the page.

\begin{tikzpicture}[remember picture,overlay]
  \draw [line width=1mm,opacity=.25]
  (current page.center) circle (3cm);
\end{tikzpicture}

\end{document}

当我使用“pdflatex bug.tex”(两次)编译它时,输出符合预期:

pdflatex 的输出

当我用“latex bug.tex”编译同一个文件(两次),然后用“dvips bug.dvi -o”和“pdf2ps bug.ps”将 DVI 文件转换为 PDF 时,输出是错误的。圆圈不在中心。

latex 输出

请注意,只有圆圈移动了,页面的其余部分没有移动。所以问题不在于 dvips 或 pdf2ps。错误已经存在于 DVI 文件中。此外,文件 bug.aux 中存在差异。使用 pdflatex 编译时,文件包含

\relax 
\pgfsyspdfmark {pgfid1}{9782558}{42447667}

使用 latex 编译时,文件包含

\relax 
\pgfsyspdfmark {pgfid1}{9782558}{45729504}

出了什么问题?

答案1

来自 pgf 和 tikz 手册(3.0.1a)如下:

101.3.2 引用不同图片中节点的锚点

在排版图片时,pgf 会跟踪图片内所有节点的位置。pgf 无法记住的是图片本身在页面上的位置。因此,如果您在一张图片中定义一个节点,然后在排版另一张图片时尝试引用此节点,则 pgf 只会知道您尝试在原始图片内排版的节点的位置,但不知道此图片位于何处。缺少的是两张图片的相对定位。为了解决这个问题,您需要告诉 pgf 它应该记住图片在页面上的位置。如果记住了这些位置,那么 pgf 可以计算图片之间的偏移量并使不同图片中的节点可访问。遗憾的是,确定图片在页面上的位置并不容易。因此,pgf 不会自动执行此操作。相反,您必须按以下步骤操作:

  1. 您必须使用支持位置跟踪的后端驱动程序。pdfTEX 就是这样一个驱动程序,dvips 目前不支持
  2. 您必须在每张图片之前或内部的某处说 \pgfrememberpicturepositiononpagetrue ...

结论,到目前为止,您的编译方式不会产生预期的结果!您需要使用 pdfLaTeX 或 XeLatEX 或 LuaLaTeX...

答案2

我无法重现您的问题。在我的 TeXLive 2018 发行版中,无论我使用latex还是进行编译,我总是在文件pdflatex中得到相同的条目aux

\pgfsyspdfmark {pgfid1}{9782558}{42447667}

其结果难以区分。

这就引发了一个问题:您正在使用哪种 LaTeX 发行版。

我也无法理解 Zarko 的讨论,在我看来,他混淆了两件事:pgfpicturestikzpictures。他引用了“引用第 101 节,开头是

本节介绍形状模块。
\usepgfmodule{shapes}。

当然,不排除转换链存在问题tex -> dvi -> ps -> pdf,但至少在我的计算机上我无法重现您的问题。

答案3

经过进一步调查后,我会回答我自己的问题。

我确认 TeXLive 2018 不会发生上述行为;这解释了为什么 marmot 无法重现它。我一直在使用 TeXLive 2017。所以看来这确实是一个错误并且已经修复。

另一条信息是,在 TeXLive 2017 中,可以通过以下方式规避该错误:

 \pdfpageheight=\paperheight

在任何访问“当前页面”节点的代码之前(以及在任何更新 \paperheight 的代码之后,例如使用 geometry 包时)。也许这些信息对仍在使用 TeXLive 2017(例如,随当前版本的 Ubuntu 一起提供)的人有用。

相关内容