将“tikzpicture”嵌套在“tikzpicture”元素内 - 好做法还是坏做法?

将“tikzpicture”嵌套在“tikzpicture”元素内 - 好做法还是坏做法?

我经常将 嵌套tikzpicturetikzpicture元素(例如节点)中,以将子部分视为一个整体,然后将其相对于图片的其他部分放置。但是,我想知道嵌套tikzpictures 是好习惯还是坏习惯。我也想知道嵌套 s 的缺点(如果有的话)tikzpicture

例如,在我的最新图中,我使用嵌套来实现以下效果:

在此处输入图片描述

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{positioning}

\colorlet{shade1}{black! 10}
\colorlet{shade2}{black! 20}
\colorlet{shade3}{black! 35}

\begin{document}
\begin{tikzpicture}[%
    function/.style={%
      draw,
      circle,
      minimum size=0pt,
      inner sep=2pt,
      outer sep=0pt,
      node distance=0pt,
    },
    function argument/.style={%
      function,
      fill=shade3,
    },
    gpgpu kernel/.style={%
      function,
      fill=shade2,
    },
    invoker/.style={%
      function,
      fill=shade1,
    },
    label/.style={%
      rectangle,
      inner sep=0pt,
      outer sep=0pt,
      node distance=6pt,
    },
  ]

  % Functions
  \node [invoker, inner sep=-2pt] {%
    \begin{tikzpicture}
      \node [gpgpu kernel] (gpgpu_kernel) {%
        \begin{tikzpicture}
          \node [function argument] (func_arg) {%
            \begin{tabular}{@{}c@{}}
              C \\
              function
            \end{tabular}
          };
          \node [label, below=of func_arg] {GPGPU kernel};
        \end{tikzpicture}
      };
      \node [label, below=of gpgpu_kernel] {Invoker};
    \end{tikzpicture}
  };
\end{tikzpicture}
\end{document}

答案1

我认为节点嵌套不是必需的(并且由于链接问题中的原因,不建议这样做),除非是非常复杂的情况,在这些情况下您无法以简单的方式复制节点的内容。但是,在这种特定情况下,它肯定是可行的,甚至不需要太多的劳动。您甚至可以考虑使用 fit 库进行更复杂的嵌套等。我选择使用不透明度设置,当我们将一个节点放在另一个节点上时,阴影会自动累积。

\documentclass{article} 
\usepackage{tikz} 
\usetikzlibrary{positioning}
\tikzset{somestyle/.style={draw,circle,fill,fill opacity=0.1}}
\begin{document}
\begin{tikzpicture}
\node[somestyle,
        inner sep=1.7cm,
        label={[below = -0.9 cm,name=invtext]south:Invoker}] (invcirc) at (6,0) {};
\node[somestyle,
        inner sep=1.2cm,
        label={[below = -1cm,name=gptext]south:GPGU kernel},
        above= 0.1cm of invtext,
        anchor=south] (gpcirc) {};
\node[somestyle,
        above= 0.1cm of gptext,
        anchor=south,
        align=center,
        fill opacity=0.15, % For that extra 5 percent in shade3
        text opacity=1 % To recover the text color
     ] (Cfun) {C\\function};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容