在 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
无济于事。即使你强制 Ti钾Z 重新制作图片/tikz/external/remake next
并编译一千次,它仍然什么也不显示。
真正的问题是,当将外部化的图片包含回原始文档时,\includegraphics
pdfTeX 将根据其边界框进行裁剪。\pgfimage
由于图片的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
,其大小大约与页面相同。- 如果在 Ti钾Z,
\pgfresetboundingbox
或[overlay]
使用默认值[0 0 144 144]
。这里144
表示 2 英寸。这个数字毫无根据。 - 如果边界明确设置为,那么
\path(-1in,-1in)(2in,2in);
它就是[0 0 216 216]
。这里216
指的是 3 英寸。
- 如果在 Ti钾Z,
虽然 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
条目。这是毫无希望的。
另一种可能性是重写 Ti钾Z 外部化库,以便它将使用其原生边界框生成外部图像。但保留用户指定的边界框信息并在图像被包含回来时使用它。
(这可能真的很难。例如,如果\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}