我想知道如何定义自定义 TikZ 节点类mynode
以允许我使用以下语法:
\node [mynode,fill=yellow!40] {component}
\child{
\node [mynode,fill=yellow!40] {subcomponent}
};
并给出以下结果:
答案1
这可能也可以通过树来实现(child
),但我首先想到的是rectangle split
节点。
左节点模仿了我试图实现的目标,甚至不太好,因为内部节点用于计算边界框(这是我必须border=8pt
为该类设置的原因standalone
)。
因此,要拥有一个节点节点<Outer Name>
,<Inner Name>
您只需编写通常的代码:
<path> node[subcomponent=<Inner Name>] {Outer Name} <path>;
或者
\node[subcomponent=<Inner Name>] {Outer Name};
内部节点增加了一个额外内容,如果使用fill=none
该密钥则可以看到其结果。opacity
如果右上角也出现这样的小图标,您应该提供代码或示例,因为它可能需要一点努力\tikzlastnode
。
代码
\usetikzlibrary{shapes.multipart}
\tikzset{
mycomponent/.style={
draw,
fill=yellow!40,
rectangle split,
rectangle split parts=2,
rectangle split allocate boxes=2,
rectangle split empty part height=4ex,
rectangle split empty part width=0ex,
},
subcomponent/.style={
mycomponent,
measure me={#1},
rectangle split every empty part={},% resets empty-part macro
% see http://tex.stackexchange.com/a/88700
rectangle split empty part height={max(4ex,\qrrInnerNodeHeight)},
rectangle split empty part width=\qrrInnerNodeWidth,
append after command={
node[mycomponent,fill=none,anchor=south west] at (\tikzlastnode.two) {#1}
}
},
measure me/.code={%
\global\sbox0{\tikz[baseline=0pt]\node[mycomponent,anchor=south]{#1};}%
\edef\qrrInnerNodeWidth{\the\wd0}%
\edef\qrrInnerNodeHeight{\the\ht0}%
},
}
\begin{document}
\begin{tikzpicture}
\node [mycomponent] {%
Component
\nodepart{two}
\tikz{\node[mycomponent] {Subcomponent};}
};
\node [xshift=3cm,subcomponent=Subcomponent] (t) {Component};
\end{tikzpicture}
\end{document}