嵌套的 TikZ 节点

嵌套的 TikZ 节点

这不是第一次有人问这个问题但其他解决方案对我来说不起作用。

考虑以下图片:

截屏

它是使用以下代码创建的:

\begin{tikzpicture}[
  node distance=7mm,
  title/.style={font=\fontsize{6}{6}\color{black!50}\ttfamily},
  typetag/.style={rectangle, draw=black!50, font=\scriptsize\ttfamily}
]
  \node (decomp) [title] { Decomposition };
  \draw [draw=black!50] (decomp.north west) rectangle +(2.8cm, -2.7cm);

  \node (di) [typetag, below=of decomp.west, anchor=west, xshift=2mm] { Independent };
  \node (dr) [typetag, below=of di.west, anchor=west] { Reduction };
  \node (dnc) [typetag, below=of dr.west, anchor=west] { DivideAndConquer };

  \node (dep) at (3cm, 0) [title] { Dependency };
  \draw [draw=black!50] (dep.north west) rectangle ($(dep.north east) - (0, 2cm)$);

  \node (da) [typetag, below=of dep.west, anchor=west, xshift=2mm] { Atomic };
  \node (dr) [typetag, below=of da.west, anchor=west] { Range };
\end{tikzpicture}

不用说,这个代码非常复杂并且没有自动化(例如,边框的宽度不是自动计算以适合所有元素,而是通过艰苦的反复试验手工输入的)。

那里必须是实现这一目标的更简单的方法。

我特别有两个问题:

  1. 我如何自动绘制边框+标题(灰色文本),以便边框足够大以容纳typetag其后的所有元素(以及如何指定它们?)
  2. 我怎样才能typetag更巧妙地安排这些元素?(每次都要写,below=of Element.west, anchor=west极其很烦人,但我无法将其放入,typetag/.style因为 TikZ“忘记”了这些信息(我也尝试过添加ever node/.style={anchor=west}选项tikzpicture,但无济于事)。

不过,问题 1 才是重点。问题 2 更像是一个反复出现的一般性问题……

答案1

对于第一点,您可以使用fit图书馆。

对于第二个:根据手册,设置below也会设置anchor=north。因此,添加anchor=west到然后typetag设置即可解决问题。typetagbelow

\documentclass{minimal}

\usepackage{tikz}
\usetikzlibrary{positioning,fit,calc}
\begin{document}

\begin{tikzpicture}[
  node distance=7mm,
  title/.style={font=\fontsize{6}{6}\color{black!50}\ttfamily},
  typetag/.style={rectangle, draw=black!50, font=\scriptsize\ttfamily, anchor=west}
]
  \node (decomp) [title] { Decomposition };

  \node (di) [below=of decomp.west, typetag, xshift=2mm] { Independent };
  \node (dr) [below=of di.west, typetag] { Reduction };
  \node (dnc) [below=of dr.west, typetag] { DivideAndConquer };

  \node [draw=black!50, fit={(decomp) (di) (dr) (dnc)}] {};

  \node (dep) at (3cm, 0) [title] { Dependency };

  \node (da) [below=of dep.west, typetag, xshift=2mm] { Atomic };
  \node (dr) [below=of da.west, typetag] { Range };

  \node [draw=black!50, fit={(dep) (dr) (da)}] {};
\end{tikzpicture}
\end{document}

inner sep,可能需要稍微调整一下)

答案2

这里有意义吗matrix?例如:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{matrix, positioning, fit}
\begin{document}
\begin{tikzpicture}[font=\ttfamily,
  mymatrix/.style={matrix of nodes, nodes=typetag, row sep=1em},
  mycontainer/.style={draw=gray, inner sep=1ex},
  typetag/.style={draw=gray, inner sep=1ex, anchor=west},
  title/.style={draw=none, color=gray, inner sep=0pt}
  ]
  \matrix[mymatrix] (mx1) {
    |[title]|Decomposition \\
    Independent \\
    Reduction \\
    DivideAndConquer \\
  };
  \matrix[mymatrix, right=of mx1.north east, matrix anchor=north west] (mx2) {
    |[title]|Dependency \\
    Atomic \\
    Range \\
  };
  \node[mycontainer, fit=(mx1)] {};
  \node[mycontainer, fit=(mx2)] {};

\end{tikzpicture}
\end{document}

示例的输出

答案3

这里与仅相同,\fbox并且框大小的自动计算也可以在 tikz 内部使用。如果需要连接,可以设置框内容的单个节点。

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{tgheros}
\usepackage{varwidth}
\usepackage{setspace}
\usepackage{xcolor}
\usepackage{tikz}
  
\begin{document}

\fboxsep=10pt\sffamily\setstretch{2}
\fbox{\begin{varwidth}[t]{\linewidth}
\tikzset{node distance=7mm,
  title/.style={font=\color{black!50}\ttfamily},
  typetag/.style={rectangle, draw=black!50, font=\large\ttfamily}}

\fboxsep=10pt\sffamily\setstretch{2}
\fbox{\begin{varwidth}[t]{\linewidth}
\tikz\node (decomp) [title] { Decomposition };

\tikz\node (di) [typetag]{ Independent };

\tikz\node (dr) [typetag]{ Reduction\vphantom{g} };

\tikz\node (dnc) [typetag]{ DivideAndConquer};

\end{varwidth}}\qquad
\fbox{\begin{varwidth}[t]{\linewidth}
\tikz\node (dep) [title] { Dependency };

\fbox{\bfseries Atomic}

\fbox{\bfseries Range}
\end{varwidth}}}

\end{document}

答案4

这里您还有另一个矩阵选项。您可以“绘制”矩阵节点,因此不需要使用合适的节点。我无法使用标签声明标题(可能有人知道如何做),但可以使用另一个锚定到矩阵的节点。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, positioning, fit}

\usepackage[active,tightpage,pdftex]{preview}
\PreviewEnvironment{tikzpicture}

\begin{document}
\begin{tikzpicture}[font=\ttfamily,
  mymatrix/.style={matrix of nodes, nodes=typetag, row sep=1em},
  mycontainer/.style={draw=gray, inner sep=1ex},
  typetag/.style={draw=gray, inner sep=1ex, anchor=west},
  title/.style={draw=none, color=gray, inner sep=0pt,font=\ttfamily\footnotesize}
  ]
  \matrix[mymatrix,draw] (mx1) {
    |[title]|\phantom{aaaaaaaaaaa} \\
    Independent \\
    Reduction \\
    DivideAndConquer \\
  };
  \matrix[mymatrix, right=of mx1.north east, matrix anchor=north west,draw] (mx2) {
    |[title]|\phantom{aaaaaaaaa} \\
    Atomic \\
    Range \\
  };
  \node[title,anchor=north west,outer sep=2pt] () at (mx1.north west) {Decomposition};
  \node[title,anchor=north west,outer sep=2pt] () at (mx2.north west) {Dependency};

\end{tikzpicture}
\end{document}

结果如下:

替代文本

相关内容