![使用 Tikz 在节点周围制作带状](https://linux22.com/image/477549/%E4%BD%BF%E7%94%A8%20Tikz%20%E5%9C%A8%E8%8A%82%E7%82%B9%E5%91%A8%E5%9B%B4%E5%88%B6%E4%BD%9C%E5%B8%A6%E7%8A%B6.png)
梅威瑟:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit}
\begin{document}
\tikzstyle{block} = [rectangle, draw,
text width=5em, text centered, rounded corners, minimum height=2em]
\tikzstyle{entity} = [rectangle, draw, text centered]
\centering
\begin{tikzpicture}
\begin{scope}
\matrix [row sep= 2em, column sep= 2em] {
& \node [block] (a) {A}; & \\
\node [block] (b) {B}; & & \node [block] (c) {C};\\
& \node [block] (d) {D}; & \\
\node [block] (e) {E}; & & \\
};
\end{scope}
\node [entity, fit= (a)] {};
\node [entity, fit= (b) (c)] {};
\node [entity, fit= (d)] {};
\node [entity, fit= (e)] {};
\end{tikzpicture}
\end{document}
假设每个节点都是一个不同的步骤。它们都是更大阶段的一部分,通过用 s 包围它们来表示entity
。我如何确保每个节点entity
都是:
- 这宽度完全相同
- 彼此为中心
- 它们之间没有分离吗?
因为我稍后会给它们上色,所以entity
s 将是[on background layer]
。
答案1
一个可能的解决方案是使用matrix
节点上的某些锚点在背景层上定义方便的矩形。
首先,我已将 deprecated 改为tikzstyle
。tikzset
您可以在应该使用 \tikzset 还是 \tikzstyle 来定义 TikZ 样式?
已matrix
更改为matrix of nodes
(您需要matrix
库)并调整了矩阵inner sep=1em
。这样,所有层将在内部节点周围呈现类似的空间。
\matrix (M) [matrix of nodes, inner sep=1em, row sep= 2em, column sep= 2em, nodes={block}]
我已经用语法保留了原始节点名称|(A)| A
,如果您不需要它,只需将其写A
为节点内容。
|(B)| B & &|(C)| C\\
由于inner
节点和matrix
锚点没有直接关系,因此定义了两个辅助锚点:
\path (M.north) -- coordinate[pos=.25] (aux1) coordinate[pos=.75] (aux2) (M.south);
最后,使用这些锚点在background
图层上绘制并填充四个带。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, backgrounds}
\begin{document}
\centering
\begin{tikzpicture}[%
block/.style={draw, text width=5em, text centered, rounded corners, minimum height=2em},
entity/.style={draw, text centerd}
]
\begin{scope}
\matrix (A) [matrix of nodes, inner sep=1em, row sep= 2em, column sep= 2em, nodes={block}] {
& A & \\
B & & C\\
& D & \\
E & & \\
};
\end{scope}
\path (A.north) -- coordinate[pos=.25] (aux1) coordinate[pos=.75] (aux2) (A.south);
\begin{scope}[on background layer]
\draw[fill=green!30] (A.north west) rectangle (aux1-|A.east);
\draw[fill=red!30] (A.west|-aux1) rectangle (A.east);
\draw[fill=blue!30] (A.west) rectangle (aux2-|A.east);
\draw[fill=orange!30] (A.west|-aux2) rectangle (A.south east);
\end{scope}
\end{tikzpicture}
\end{document}