从rectangle split
可以shapes.multipart
产生紧密堆叠的矩形。
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.multipart}
\begin{document}
\begin{tikzpicture}
\node[
draw, fill=lightgray,
rounded corners,
rectangle split, rectangle split parts=3
] {
first part
\nodepart{two}second part
\nodepart{three}\ldots
};
\end{tikzpicture}
\end{document}
但我希望各部分之间有这样的间隙。为了强调,添加了圆角。
它们都应该与最宽的一样宽,文本不应该固定。它们应该能够包含复杂的内容,例如列表。多部分形状是正确的方法吗?定义自定义形状是否合适?
矩形节点如何堆叠?
答案1
我认为这个代码使用tcolorbox
和eqparbox
应该会有所帮助。Eqparbox 定义标签盒子,以便所有具有相同标签的盒子最终都具有其中最宽的宽度(需要两次编译):
\documentclass{article}
\usepackage{tcolorbox}
\usepackage{eqparbox}
\begin{document}
\begin{center}
\tcbox{\eqmakebox[P]{First Part}}
\tcbox{\eqmakebox[P]{Second Part}}
\tcbox{\eqmakebox[P]{$ \dots $}}
\end{center}
\end{document}
答案2
该解决方案定义了一个pic
元素,它接受任意以逗号分隔的文本列表并将它们垂直地一个接一个地放置,同时为每个“子节点”定义名称:
\documentclass[tikz,margin=5pt]{standalone}
\usetikzlibrary{positioning,fit}
\tikzset{
my split/.pic = {
\coordinate (aux) at (0,0);
\foreach \text [count=\i] in {#1} {
\node[below=of aux, draw, fill] (-\i) {\text};
\coordinate (aux) at (-\i.south);
}
}
}
它可以从这样的 tikz 图片中使用:
\draw pic[options] (NAME) at (coordinates) {my split={Text,for each,subnode}};
您options
可以指定填充颜色、圆角、节点之间的距离以及每个节点的宽度等方面(如果没有指定,每个节点将有自己的“自然宽度”)。
一旦绘制了图片,您就会得到每个子节点的节点名:(NAME-1)
、、(NAME-2)
等等,这些节点名可用于将它们与 tikz 图形的其他部分连接起来。
例如:
\begin{document}
\tikzset{
my style/.style={rounded corners, text width=3cm, node distance=1mm, fill=black!20}
}
\begin{tikzpicture}
\draw pic[my style] (A) at (0,0)
{my split={A First text, A Second Text, A Third Text}};
\draw pic[my style, fill=orange!20] (B) at (4, 0.5)
{my split={B First line, B second line, $\dots$}};
\draw[-latex] (A-2.east) -- (B-1.west);
\end{tikzpicture}
\end{document}
生成:
答案3
另一个解决方案。这个解决方案结合了eqmakebox
和TiKZ matrix
。
\documentclass[tikz,border=2mm]{standalone}
\usepackage{eqparbox}
\usetikzlibrary{matrix, positioning}
\begin{document}
\begin{tikzpicture}
\matrix (A) [matrix of nodes, nodes={draw, rounded corners, fill=gray!30}, row sep=1mm]
{\eqmakebox[P]{First Part}\\
\eqmakebox[P]{Second Part}\\
\eqmakebox[P]{$ \dots $}\\
};
\matrix (B) [matrix of nodes, nodes={draw, rounded corners, fill=green!30}, row sep=1mm, above right= 3mm and 5mm of A.east]
{\eqmakebox[P]{First Part}\\
\eqmakebox[P]{Second Part}\\
\eqmakebox[P]{$ \dots $}\\
};
\draw (A-1-1) to[out=0, in=180] (B-1-1);
\draw (A-2-1) to[out=0, in=180] (B-2-1);
\end{tikzpicture}
\end{document}