是否有一个选项可以模拟 TikZ 图片的绘制而无需真正绘制它?

是否有一个选项可以模拟 TikZ 图片的绘制而无需真正绘制它?

目前,我使用大量 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}

相关内容