根据 TikZ & PGF 手册 3.0.1a 版(第 1016 页)的“定义新箭头尖类型”一章,每次定义新箭头尖类型时必须指定的参数之一是凸包。
形状的凸包在概念上类似于其边界框(但两者并不完全相同)。为了说明凸包的概念,请考虑以下设计中的箭头尖的图片。箭头尖的凸包是三角形,其顶点为 (1,0)、(-3,2) 和 (-3,-2)。
有人可能会想,既然 PGF 具有计算边界框的内置机制,为什么箭头类型的设计者还需要明确指定凸包。手册对这个问题的回答如下(第 1016 页第 100.2 节的最后一点)。
通常,
PGF
会自动跟踪您绘制的所有内容的边界框。但是,由于箭头尖端绘制得如此频繁,因此PGF
会在内部缓存绘制箭头尖端所需的代码,并且由于此缓存,它无法仅根据用于绘制尖端的绘制命令来确定箭头尖端的大小。相反,必须在定义中明确提供箭头尖端的凸包。
为什么绘制箭头所需代码的缓存会阻止 PGF 在没有用户提示的情况下计算箭头的边界框?
答案1
红色框是官方的边界框。
绿色框是箭头的边界框。
蓝色框是使用绿色框而不是凸包计算的虚构边界框。
播放代码
\documentclass[border=9,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\foreach\i in{1,...,60}{
\tikz[line width=.1cm]{
\draw[rotate=\i*6,line width=1cm,-{>[length=3cm]}](0,0)--(7,0);
\draw[red](current bounding box.south west)rectangle(current bounding box.north east);
\pgfinterruptboundingbox
\draw[line width=1cm,-{>[length=3cm]},transparent](6,0)--(7,0);
\path(current bounding box.south west)coordinate(A)
(current bounding box.south east)coordinate(B)
(current bounding box.north west)coordinate(C)
(current bounding box.north east)coordinate(D);
\draw[green,transform canvas={rotate=\i*6}](A)rectangle(D);
\endpgfinterruptboundingbox
\path([rotate=\i*6]A)([rotate=\i*6]B)([rotate=\i*6]C)([rotate=\i*6]D);
\draw[blue](current bounding box.south west)rectangle(current bounding box.north east);
\path(-10,-10)(10,10);
}
}
\end{document}