使用 Tikz 在节点周围制作带状

使用 Tikz 在节点周围制作带状

梅威瑟:

\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都是:

  • 宽度完全相同
  • 彼此为中心
  • 它们之间没有分离吗?

因为我稍后会给它们上色,所以entitys 将是[on background layer]

答案1

一个可能的解决方案是使用matrix节点上的某些锚点在背景层上定义方便的矩形。

首先,我已将 deprecated 改为tikzstyletikzset您可以在应该使用 \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}

在此处输入图片描述

相关内容