我经常将 嵌套tikzpicture
在tikzpicture
元素(例如节点)中,以将子部分视为一个整体,然后将其相对于图片的其他部分放置。但是,我想知道嵌套tikzpicture
s 是好习惯还是坏习惯。我也想知道嵌套 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}