一个更有趣的例子

一个更有趣的例子

在 TikZ 中设计标题页时,我注意到一个不太理想的行为。当我使用 externalize 和选项时,overlay输出tikzpicture为空。

梅威瑟:

\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz/]

\begin{document}
\begin{tikzpicture}[remember picture,overlay]
    \node at (1,1) {test2};
\end{tikzpicture}
\end{document}

删除这两行\usetikzlibrary{external}tikzexternalize[prefix=tikz/]即可得到想要的行为。这并不重要,因为我可以指定不应将这个特定图像(标题页)外部化,但我认为这在某种程度上是不想要的,至少不是预期的。有适当的解决方法吗?

答案1

这个问题与你需要编译多少次无关。删除也remember picture无济于事。即使你强制 TiZ 重新制作图片/tikz/external/remake next 并编译一千次,它仍然什么也不显示。

真正的问题是,当将外部化的图片包含回原始文档时,\includegraphics \pgfimagepdfTeX 将根据其边界框进行裁剪。

由于图片的overlay边界框大小为零,一切将被剪辑(见下节)

为了证明这一点,请考虑以下示例:

\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize

\begin{document}
\tikz{
    \draw circle(5);
    \pgfresetboundingbox
    \path(-4,-4)(4,4);
}

%\includegraphics{\jobname-figure0.pdf}

\end{document}

\jobname-figure0.pdf它将为您提供剪切的圆圈,这与您在任何 pdf 阅读器中打开的完全相同。

一个更有趣的例子

删除\path(-4,-4)(4,4);,你会得到

这似乎与我的理论相矛盾:没有(-4,-4)(4,4)边界框的大小应该是零。但你猜怎么着:如果你打开,\jobname-figure0.pdf你会看到完全相同的弧线。

深入研究 PDF

  • \jobname-figure0.pdf在生成时,它有一个条目/MediaBox,其大小大约与页面相同。
    • 如果在 TiZ,\pgfresetboundingbox[overlay]使用默认值[0 0 144 144]。这里144表示 2 英寸。这个数字毫无根据。
    • 如果边界明确设置为,那么\path(-1in,-1in)(2in,2in);它就是[0 0 216 216]。这里216指的是 3 英寸。
  • 虽然 pdfTeX 在主文件中包含了外部图像,但它

    如果可用,则从其 pdf 文件中获取 BoundingBox /CropBox,否则从其 中获取/MediaBox

    • 对于\pgfresetboundingbox[overlay]/BBox条目是[0 0 144 144]
    • 对于\path(-1in,-1in)(2in,2in);:该/BBox条目是[0 0 216 216]
  • 当 PDF 渲染器渲染文件时,它

    根据字典的形式剪辑/BBox

    • 对于\pgfresetboundingbox[overlay]外面的一切 (0,0) rectangle (2in,-2in)将被剪裁。由于 PDF 中的 y 轴向下,因此存在负数。
      • \node at (1,1) {test2};为了证明这一点,请尝试用±1代替。
    • 对于\path(-1in,-1in)(2in,2in);:它是根据该矩形进行剪裁的。

可能的解决方法?

可能有办法告诉 pdfTeX 不要设置该/Bbox条目。这是毫无希望的。

另一种可能性是重写 TiZ 外部化库,以便它将使用其原生边界框生成外部图像。但保留用户指定的边界框信息并在图像被包含回来时使用它。

(这可能真的很难。例如,如果\tikzmark使用,原始边界框应该是什么?)

目前,一个简单的解决方法是不导出图像

\documentclass{article}
    \usepackage{tikz}
        \usetikzlibrary{external}\tikzexternalize
\begin{document}
    \tikzset{external/export next=false}
    \tikz[remember picture,overlay]\draw(0,0)--(current page.center);
\end{document}

相关内容