我正在寻找一种方法来在多部分形状周围绘制一条细线。对于普通形状,一种简单的方法是使用在preaction
现有形状周围绘制一条更粗的线。不幸的是,不知何故,预处理似乎发生在多部分形状中绘制节点部分之后,从而产生了一条不必要的内线。
下面是一个最小的工作示例。您可以看到,右侧的常规框外面只有一条细细的橙色线。但是,左侧的多部分“内容框”有第二个内部橙色框。我的问题是如何摆脱这个内部框。如果有更好的方法来绘制这些框,我不一定非要使用多部分节点,但我希望它们是一个节点,这样我就可以向它们绘制箭头。(顺便说一句,我知道对于常规框,我可以在没有预先操作的情况下做到这一点,我只是用了一个来说明我试图对多部分节点做什么。)
\documentclass[convert]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\begin{document}
\begin{tikzpicture}[
contents box/.style={
rounded corners,
rectangle split, rectangle split parts=2,
rectangle split draw splits=false,
rectangle split part fill={orange!50, white},
every one node part/.style={
font=\sffamily\bfseries\small,
},
draw=orange!50, very thick,
preaction={draw=orange, ultra thick},
},
regular box/.style={
font=\sffamily\bfseries\small,
rounded corners,
fill=orange!50,
very thick, draw=orange!50,
preaction={draw=orange, ultra thick},
}
]
\node[contents box] {
\nodepart{one} box
\nodepart{two} contents
};
\node[regular box] at (2,0) { box };
\end{tikzpicture}
\end{document}
答案1
如果所有多部分框都像示例中的那样,那么也可以使用来tcolorbox
绘制它们。
可以将它们用作node contents
,tikzpicture
但也可以将它们包含到任何文本中,并使用remember
或 的remember as
帮助绘制指向它们的箭头(请参阅如何在颜色框之间画箭头)。
\documentclass[tikz,border=2mm]{standalone}
\usepackage[most]{tcolorbox}
\newtcbox{\mybox}[1]{
colbacktitle=orange!50,
colback=white,
colframe=orange!50,
halign title=center,
fonttitle=\bfseries\sffamily\small,
fontupper=\small,
coltitle=black,
title=#1,
boxrule=1.6pt,
enhanced,borderline={1.2pt}{-1.2pt}{orange},
enlarge bottom by=1.2pt,
enlarge top by=1.2pt,
enlarge right by=1.2pt,
enlarge left by=1.2pt,}
\begin{document}
\begin{tikzpicture}
\node[inner sep=0pt] (A) at (0,0) {\mybox{box}{contents}};
\node[inner sep=0pt] (B) at (3,1) {\mybox{box}{contents}};
\draw[orange,ultra thick] (A.north) to[out=85,in=180](B.west);
\end{tikzpicture}
\end{document}
答案2
这是一个基于@Alenanno 使用\tikzlastnode
inside的关键思想的解决方案append after command
。剩下的棘手部分是,您必须设置多部分节点的外部 sep,并且知道稍后它将被一条超粗线跟踪,然后还要补偿该外部 sep 值。超粗线为 1.6pt,因此一半(适当的外部 sep)为 0.8pt。
\documentclass[convert]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\begin{document}
\begin{tikzpicture}[
contents box/.style={
rounded corners,
rectangle split, rectangle split parts=2,
rectangle split draw splits=true,
rectangle split part fill={orange!50, white},
every one node part/.style={ font=\sffamily\bfseries\small },
draw=orange!50, very thick,
outer sep=0.8pt, % 1/2 ultra-thick line width
append after command={
\pgfextra{
\draw[orange, ultra thick, rounded corners]
([shift={(0.8pt,0.8pt)}] \tikzlastnode.south west)
rectangle
([shift={(-0.8pt,-0.8pt)}] \tikzlastnode.north east)
;}
}},
regular box/.style={
font=\sffamily\bfseries\small,
rounded corners,
fill=orange!50,
very thick, draw=orange!50,
preaction={draw=orange, ultra thick},
}
]
\node[contents box] {
\nodepart{one} box
\nodepart{two} contents
};
\node[regular box] at (2,0) { box };
\end{tikzpicture}
\end{document}
答案3
您也可以事后再绘制它。例如,如果节点名为b
,则:
\path [draw=orange, thin, rounded corners] (b.south west) rectangle (b.north east);
将绘制一条适当的路径:
没有任何明显的方法可以将其作为节点本身规范的一部分来实现。
但是,您可以通过定义pic
一个来一步完成所有操作,使事情变得更方便:
contents pic/.pic={
\node (a) [contents box] {#1};
\path [draw=orange, thin, rounded corners] (a.south west) rectangle (a.north east);
},
然后你可以写,例如:
\pic at (1.75,0) { contents pic={
\nodepart{one} box
\nodepart{two} contents
}
};
绘制先前节点 + 路径的克隆。为了进行比较:
\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{shapes.multipart}
\begin{document}
\begin{tikzpicture}[
contents box/.style={
rounded corners,
rectangle split,
rectangle split parts=2,
rectangle split draw splits=false,
rectangle split part fill={orange!50, white},
every one node part/.style={
font=\sffamily\bfseries\small,
},
draw=orange!50,
very thick,
},
regular box/.style={
font=\sffamily\bfseries\small,
rounded corners,
fill=orange!50,
very thick,
draw=orange!50,
preaction={draw=orange, ultra thick},
},
contents pic/.pic={
\node (a) [contents box] {#1};
\path [draw=orange, thin, rounded corners] (a.south west) rectangle (a.north east);
},
]
\node (b) [contents box] {
\nodepart{one} box
\nodepart{two} contents
};
\path [draw=orange, thin, rounded corners] (b.south west) rectangle (b.north east);
\pic at (1.75,0) { contents pic={
\nodepart{one} box
\nodepart{two} contents
}
};
\node[regular box] at (3.25,0) { box };
\end{tikzpicture}
\end{document}