目前,我使用大量 TikZ 元素和子元素绘制 TikZ 图片。为此,我使用 TikZ图片。有时,我需要在绘制图片之前知道图片的大小,以便正确定位。此信息来自其本地边界框。但为了获取此信息,我必须使用以下方法绘制它:不透明度 = 0。
有没有选择模拟绘制 pic 元素(或任何 TikZ 元素),而不必通过不透明度 = 0?
谢谢。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\tikzset{
subtikz/.pic={
\draw (0, 0) -- (1, 0);
}
}
% Simulate pic to get its local bounding box.
\pic [local bounding box = Subtikz, opacity = 0] {subtikz};
% Calculate position depending on other input.
\path let \p1 = (Subtikz.north east), \p2 = (1, 2), \p3 = (3, 4) in coordinate (NorthEast) at ({max(\x1, \x2, \x3)}, \y1);
% Draw pic taking into account other input.
\pic at (NorthEast) {subtikz};
\end{tikzpicture}
\end{document}
答案1
discard
您可以使用以下方式设置特殊图层:
\pgfdeclarelayer{discard}
当它被声明为要使用的图层时pgfonlayer
,内容将被放置在该图层上,但由于您没有使用
\pgfsetlayers{discard, main}
它不会显示在图片中。(只有discard
这样才有效,其他所有名称都需要在 中指定\pgfsetlayers
。)
通过该设置你就可以
\begin{pgfonlayer}{discard}
\pic [local bounding box = Subtikz] {subtikz};
\end{pgfonlayer}
如果你想将图片用作应该显示的另一条路径的一部分,这显然行不通,但是可以安排以及(特别是如果你的图片中没有使用任何前景或背景代码)。
我添加了一个\pgfshowdiscardlayeranyway
使用该层的简单命令,这可能对于调试目的有用。
由于该层未设置,因此\pgfsetlayers
它会累积并且不会在下一张图片开始时被清空,我将在下面的代码中展示该图片,因为我只是\pgfshowdiscardlayeranyway
在第二张 TikZ 图片中使用,该图片包含您的原始图片。
这有好处,但可能并不理想,为此我将添加一个discard discard layer
键,可用作 a tikzpicture
(或 a scope
)的选项,以全局清空该层。可能值得这样做
\tikzset{every picture/.append style={discard discard layer}}
不要在整个文档中拖动该图层。
另外需要注意的是,按照现在的设置方式,你丢弃的图片仍然会对原始图片的边界框有所贡献,但是不是如果您在另一张图片中使用\pgfshowdiscardlayeranyway
。(在下面的示例中,这一点并不明显,因为我添加了网格以更好地显示位置。)
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\pgfdeclarelayer{discard} % ← declare discard layer
\makeatletter
\tikzset{
discard discard layer/.style={
execute at end scope=%
\global\let\pgf@layerbox@discard\pgfutil@voidb@x}}
\newcommand*\pgfshowdiscardlayeranyway{\box\pgf@layerbox@discard}
\makeatother
\begin{document}
\begin{tikzpicture}[
% discard discard layer,
subtikz/.pic={\draw (0, 0) -- (1, 0);}]
\draw[help lines] (-.5,-.5) grid (4.5,.5);
\begin{pgfonlayer}{discard} % ← place on discard layer
\pic [local bounding box = Subtikz] {subtikz};
\end{pgfonlayer}
% Calculate position depending on other input.
\path let \p1 = (Subtikz.north east),
\p2 = (1, 2), \p3 = (3, 4) in
coordinate (NorthEast) at ({max(\x1, \x2, \x3)}, \y1);
% Draw pic taking into account other input.
\pic at (NorthEast) {subtikz};
%\pgfshowdiscardlayeranyway % ← show layer anyway
\end{tikzpicture}
\begin{tikzpicture}
\draw[help lines] (-.5,-.5) grid (4.5,.5);
\pgfshowdiscardlayeranyway
\end{tikzpicture}
\end{document}
输出
答案2
如果仅出于计算目的需要插入内容,请将其放置在\savebox
不实际使用它的位置:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\tikzset{
subtikz/.pic={
\draw (0, 0) -- (1, 0);
}
}
% Simulate pic to get its local bounding box.
\savebox{0}{\pic [local bounding box = Subtikz, opacity = 1] {subtikz};}
% Calculate position depending on other input.
\path let \p1 = (Subtikz.north east), \p2 = (1, 2), \p3 = (3, 4) in coordinate (NorthEast) at ({max(\x1, \x2, \x3)}, \y1);
% Draw pic taking into account other input.
\pic at (NorthEast) {subtikz};
\usebox{0} % use it anyway (placing it at its original position)
\end{tikzpicture}
\end{document}