我想实现这个效果(给node添加像DFT part这样的header),网上的资料如下。但是我运行错误。

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{shapes.geometric,backgrounds,
positioning-plus,node-families,calc}
\tikzset{
basic box/.style = {
shape = rectangle,
align = center,
draw = #1,
fill = #1!25,
rounded corners},
header node/.style = {
Minimum Width = header nodes,
font = \strut\Large\ttfamily,
text depth = +0pt,
fill = white,
draw},
header/.style = {%
inner ysep = +1.5em,
append after command = {
\pgfextra{\let\TikZlastnode\tikzlastnode}
node [header node] (header-\TikZlastnode) at (\TikZlastnode.north) {#1}
node [span = (\TikZlastnode)(header-\TikZlastnode)]
at (fit bounding box) (h-\TikZlastnode) {}
}
},
hv/.style = {to path = {-|(\tikztotarget)\tikztonodes}},
vh/.style = {to path = {|-(\tikztotarget)\tikztonodes}},
fat blue line/.style = {ultra thick, blue}
}
\begin{document}
\begin{tikzpicture}[node distance = 1.2cm, thick, nodes = {align = center},
>=latex]
\node[Minimum Width = loop, shape = ellipse, fill = red] (imp-sol)
{ellipsoid box};
\node[Minimum Width = loop, fill = yellow, below = of imp-sol] (rec-box)
{rectangular box, and very wiiiiiiiiiiiiiiide\\2nd line};
\node[shift = (left:.5*x_node_dist)] at
($(imp-sol.west|-imp-sol.south)!.5!(rec-box.north west)$) (for-1)
{formula 1};
\node[shift = (right:.5*x_node_dist)] at
($(imp-sol.east|-imp-sol.south)!.5!(rec-box.north east)$) (for-2)
{formula 2};
\begin{scope}[on background layer]
\node[fit = (for-1)(for-2)(imp-sol)(rec-box), basic box = blue,
header = DMFT loop] (dmft-l) {};
\end{scope}
\path[very thick, blue, hv] (rec-box) edge[->] (for-1) edge[<-] (for-2)
(imp-sol) edge[->] (for-2) edge[<-] (for-1);
\node[east above = of dmft-l, basic box = green, header = DMFT prelude]
(dmft-p) {Math and text math and text math and text\\
math and text math and text math and text};
\node[north left = of dmft-l, basic box = green, header = $\rho$ update,
shift = (down:y_node_dist)] (rho)
{Much more text much more text\\much more text much more text};
\node[basic box = blue, header = DFT part, anchor = north] at
(dmft-p.north-|rho) (dft) {So much text so much text so much text\\
I think I need \texttt{tikz-lipsum}\\or something like that.};
\node[basic box = green, anchor = north] at
($(dft.north east)!.5!(dmft-p.north west)$) (upd) {update\\$math$};
\path[fat blue line, <-, dashed, vh] (rho) edge
({$(rho.south)!.5!(dmft-l.south)$}-|dmft-l.south west);
\path[fat blue line, ->]
({$(upd.south)!.5!(dmft-p.south)$}-|dmft-p.south west)
coordinate (@) edge[<-, solid] coordinate[pos=.15] (@s)
coordinate[pos=.9] (@e) (@-|dft.east)
{[every edge/.append style=dashed, vh] (@s) edge[<-] (upd) (@e) edge (upd)}
(h-rho) edge[dashed] (dft)
($(dmft-p.south)!.5!(dmft-p.south east)$)
coordinate (@) edge (@|-dmft-l.north);
\end{tikzpicture}
\end{document}
OP的这个样式真的要用tcolorbox吗?感觉这是一个更偏tikz的问题...
是因为这是 十二年前 的代码,两个第三方的包现在进入了
tikz-ext宏包 中,需要综合参考这个链接和这个链接,同时巧合的是,在三周前恰有人遇到相同的问题:Edit
对比了十几年来的版本差异,差不多有:
positioning-plus统一为ext.positioning-plus;将node-families和shapes.geometric统一为ext.node-families.shapes.geometricMinimum Width = header nodes修改为使用ext/前缀的ext/node family/width=header nodesnode [span = (\TikZlastnode)(header-\TikZlastnode)] at (fit bounding box) (h-\TikZlastnode) {}修改为node [ext/span=(\TikZlastnode)(header-\TikZlastnode)] at (ext_fit bounding box) (h-\TikZlastnode) {},更新了pgf-tree层级和框的命名ext/ortho/install shortcutsMinimum Width = loop修改为ext/node family/width=loop\node[shift = (left:.5*x_node_dist)] at ...修改为\node[shift = (left:.5*ext_x_node_dist)] at ...positioning选项新增了ext/前缀感觉要逐一啃下来还是挺有难度的... Happy Tikz-Ext!