这不是第一次有人问这个问题但其他解决方案对我来说不起作用。
考虑以下图片:
它是使用以下代码创建的:
\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}
不用说,这个代码非常复杂并且没有自动化(例如,边框的宽度不是自动计算以适合所有元素,而是通过艰苦的反复试验手工输入的)。
那里必须是实现这一目标的更简单的方法。
我特别有两个问题:
- 我如何自动绘制边框+标题(灰色文本),以便边框足够大以容纳
typetag
其后的所有元素(以及如何指定它们?) - 我怎样才能
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
设置即可解决问题。typetag
below
\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}
结果如下: