为什么两个不同的 TikZ 图片报告页面中心的不同坐标?

为什么两个不同的 TikZ 图片报告页面中心的不同坐标?

我将以下 LaTeX 代码保存在 中~/Test.tex

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\tikz[remember picture, overlay]
    \draw let \p1=(current page.center) in
       node[circle,fill=red,label=above:(\p1)] at (\p1) {};
\tikz[remember picture, overlay]
    \draw let \p1=(current page.center) in
       node[circle,fill=blue,label=below:(\p1)] at (\p1) {};
\end{document}

代码通过\tikz命令在页面中心绘制一个实心红色圆圈,并从上方用页面中心的坐标标记圆圈。然后,它通过新\tikz命令重复相同的操作,但这次圆圈的颜色为蓝色,标签放在圆圈的底部。

然后我在终端中执行了以下命令。

> cd ~
> pdflatex Test
> pdflatex Test

命令成功完成,没有出现任何警告~/Test.log(特别是没有重新运行的指示)。文件~/Test.pdf现已创建。在 PDF 查看器中打开时,显示如下。

两个 Tikz 命令在页面中心绘制一个圆圈

可以看出,页面中心出现了一个实心圆。它的颜色是蓝色。这表明两个\tikz命令绘制的圆完全重叠。这意味着这两个\tikz命令计算出的坐标与页面中心相同。

然而,如果我们现在放大蓝色圆圈附近,我们会注意到两个标签显示不同的坐标,它们的第一个组成部分有所不同。

两个标签的坐标的第一个分量不同

如果我们编辑代码\tikz,在两个命令之间添加单词“Hello, world!”,那么在生成的 PDF 文件上看到的坐标第一个部分之间的差异就更加明显了:157.8775pt(顶部)vs. 94.5163pt(底部)。


问题

  1. 为什么两个标签显示不同的坐标?
  2. 有没有一种方法可以通过 TikZ 获取页面上任意点的文字坐标,该坐标可以在不同的 TikZ 图片中按原样用于定位相同的点,并且可以由人类使用笔和尺子在打印的 PDF 文件上定位该点?
  3. 相反,如果我用笔和尺子在物理 A4 页面上找到一个点,我想围绕该点画一个圆圈,我该如何使用 TikZ 来绘制该圆圈?

答案1

总结:每个都tikzpicture使用相对于它的位置在页面上,而不是绝对坐标。在问题中,两张图片位于页面上的不同位置,因此报告页面中心的不同相对位置向量。


Atikzpicture旨在成为一个独立的绘图,由 TikZ/PGF 组合在一起,然后作为盒子交给 TeX,让 TeX 按照其正常的放置程序将其放在页面上。因此,当 TikZ/PGF 组合在一起时,它不知道绘图最终会出现在页面上的哪个位置。因此,即使这是一个合理的设计选择,TikZ/PGF 也不能使用绝对坐标系。

TikZ 的预期用途还在于它主要用作创建自包含绘图的方式,在这种情况下绝对坐标系是无用的。因此,在构建图片时,TikZ 将坐标解释为相对于任意原点,该原点可能在图片的边界框内,也可能不在。

因此,当您要求 TikZ 显示某个点的坐标时,它将始终报告相对于当前图片原点的坐标。

现在,如果不灵活,TikZ 就什么都不是了,虽然人们期望它的图片是自包含的,但事实并非如此力量这对用户来说很重要,并且确实提供了引用其他图片中点的方法。其实现这一点的机制是记录所涉及图片的原点在页面上的位置(这就是它的作用remember picture)。这样它就可以将相对于另一个原点的坐标转换为相对于此原点的坐标。

伪节点,例如current page节点,在不同的 tikzpictures 中实际上是不同的,因为它们是相对于当前图片的原点定义的。

因此,您的两张图片报告页面中心坐标不同的原因是它们的位置略有不同,因此它们的原点在页面上的位置也略有不同。您可以通过在每张图片的原点添加一个节点来查看这一点:

\documentclass{article}
%\url{https://tex.stackexchange.com/q/668889/86}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\tikz[remember picture, overlay]
    \draw (0,0) node[circle,fill=red] {} let \p1=(current page.center) in
       node[circle,fill=red,label=above:(\p1)] at (\p1) {};
\tikz[remember picture, overlay]
    \draw (0,0) node[circle,fill=blue] {} let \p1=(current page.center) in
       node[circle,fill=blue,label=below:(\p1)] at (\p1) {};
\end{document}

图片来源处的圆圈

原因有点微妙。即使 tikzpictures 是使用该overlay选项创建的,它们仍然会创建一个框。虽然该框的尺寸为零,但它仍然算作一个框。因此,当 TeX 查看您所写的内容时,它会看到box space box。由于存在该初始框,因此不会忽略空格(因为它位于一行的开头)。删除该空格意味着两个框彼此重叠,因此会报告页面中心的相同坐标:

\documentclass{article}
%\url{https://tex.stackexchange.com/q/668889/86}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\tikz[remember picture, overlay]
    \draw (0,0) node[circle,fill=red] {} let \p1=(current page.center) in
       node[circle,fill=red,label=above:(\p1)] at (\p1) {};% <--- get rid of the space
\tikz[remember picture, overlay]
    \draw (0,0) node[circle,fill=blue] {} let \p1=(current page.center) in
       node[circle,fill=blue,label=below:(\p1)] at (\p1) {};
\end{document}

没有空间,所以图片放在同一个位置

答案2

经过一个多小时的思考,我认为也许每个 TikZ 图片都为页面设置了不同的坐标系。这些坐标系对于每个 TikZ 图片都是本地的,它们的原点可能映射到物理页面上的不同点。(也可能它们的单位长度不同。)

但无论坐标系如何,所有 TikZ 图片都会将current page伪节点的锚点配置为指向页面上的同一物理点。因此,即使这个物理点在两个不同的 TikZ 图片中可能具有不同的坐标,只要每个坐标在其各自的 TikZ 图片内使用,它们仍将解析为同一个物理点,而不是两个不同的物理点。

这个故事的寓意是,为了在 TikZ 图片中指定物理页面上某个点的坐标,必须指定该坐标相对的到伪节点的一个锚点current page

相反,如果你想通过 TikZ 找出物理页面上某个点的绝对坐标,你需要获取相对的该点相对于伪节点的一个锚点的坐标current page,以及使用哪个锚点作为参考点的信息,然后您可以使用这两条信息来定位物理点。

我仍然不明白为什么不同的 TikZ 图片设置了不同的坐标系,但这对所有实际目的来说都无关紧要。了解这一点仍然很有趣。

相关内容