我希望使用 tikz 2.0 绘制一个复杂的工作流程,因为我尝试将 tikz 更新到 2.1,但存在很多问题。工作流程描述如下: 我曾尝试通过使用协调器定位矩形来绘制它,但是很难做到精确,有没有更简单更好的方法?谢谢!我尝试的代码是
\documentclass{minimal}
\usepackage{tikz}
\usepackage{pgf}
\usetikzlibrary{arrows,automata}
\usetikzlibrary{shapes}
\begin{document}
\begin{tikzpicture}
\draw (-4,-4) rectangle (4,4);
\draw (-0.5,0) rectangle (-3,-3);
\draw (0.5,0) rectangle (3,-3);
\draw (-1,0) rectangle (-2,-1);
\end{tikzpicture}
\end{document}
答案1
免责声明
写完整个答案后,我读了 Alain Matthes 的答案,意识到问题是关于 tikz 2.0 的。我忽略了这个要求,所以我的答案可能对 OP 没有用。但我还是决定离开这里,因为它说明了一些对其他读者有用的技巧。
原始答案
您应该使用positioning
库来摆脱绝对坐标,并fit
使用库来在其他节点周围绘制节点。让我们逐步构建您的示例:
首先,节点 a、b、c 和 d 可以按照以下方式相互定位:
\documentclass{standalone}
\usetikzlibrary{positioning,fit,shapes.geometric,calc}
\usepackage{tikz}
\begin{document}
\tikzset{
my box/.style = {draw, minimum width = 3em, minimum height=1.5em},
}
\begin{tikzpicture}[node distance=5mm]
\node[my box] (a) {a};
\node[my box, below=of a] (b) {b};
\draw[->] (a) -- (b);
\node[my box, right=1cm of a] (c) {c};
\node[my box, below=of c] (d) {d};
\draw[->] (c) -- (d);
\end{tikzpicture}
\end{document}
然后你可以用fit
它们来绘制周围的矩形:
\node[draw, fit=(a) (b)] (ab) {};
\node[draw, fit=(c) (d)] (cd) {};
现在,您可以将菱形和连接添加到(ab)
和。为了将菱形正确置于中心,我使用在和之间插入的(cd)
辅助坐标:(aux)
(ab)
(cd)
\coordinate (aux) at ($(ab.north)!.5!(cd.north)$);
\node[draw, diamond, above=of aux] (diamond) {};
\draw[->] (diamond) -| (ab);
\draw[->] (diamond) -| (cd);
现在,fit
再次使用,我们绘制一个围绕所有这些的框。但是有一个问题,因为我假设你想要那个框与包含e
和的框大小相同f
(稍后绘制)。一个解决方法是给它一个minimum height
,并对两个框使用相同的量。这个最小高度是通过反复试验找到的,这就是我不太喜欢这部分的原因……
\node[draw, fit=(diamond) (ab) (cd), minimum height=3.5cm] (left part) {};
最后,再次使用相同的技术,您可以相对于定位节点e
和 ,并在它们周围放置一个高度最小的框。为了使右侧框与左侧框正确对齐,我必须在 顶部插入一个“不可见”的菱形:f
c
fit
e
\node[my box, right=2cm of c, label=90:hl] (e) {e};
\node[my box, below=of e] (f) {f};
\node[diamond, above=of e] (diamond aux) {};
\node[draw, fit=(diamond aux) (f), minimum height=3.5cm] (right part) {};
最后,使用与第一个钻石相同的技术添加最后一颗钻石:
\coordinate (aux) at ($(left part.south)!.5!(right part.south)$);
\node[draw, diamond, below=of aux] (cross diamond) {};
\draw (cross diamond.north) -- (cross diamond.south)
(cross diamond.west) -- (cross diamond.east);
\draw[->, shorten >=1pt] (left part) |- (cross diamond);
\draw[->, shorten >=1pt] (right part) |- (cross diamond);
这样就完成了图表(以及之后的完整代码):
代码
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,shapes.geometric,calc}
\begin{document}
\tikzset{
my box/.style = {draw, minimum width = 3em, minimum height=1.5em},
}
\begin{tikzpicture}[node distance=5mm]
\node[my box] (a) {a};
\node[my box, below=of a] (b) {b};
\draw[->] (a) -- (b);
\node[my box, right=1cm of a] (c) {c};
\node[my box, below=of c] (d) {d};
\draw[->] (c) -- (d);
\node[draw, fit=(a) (b)] (ab) {};
\node[draw, fit=(c) (d)] (cd) {};
\coordinate (aux) at ($(ab.north)!.5!(cd.north)$);
\node[draw, diamond, above=of aux] (diamond) {};
\draw[->] (diamond) -| (ab);
\draw[->] (diamond) -| (cd);
\node[draw, fit=(diamond) (ab) (cd), minimum height=3.5cm] (left part) {};
\node[my box, right=2cm of c, label=90:hl] (e) {e};
\node[my box, below=of e] (f) {f};
\node[diamond, above=of e] (diamond aux) {};
\node[draw, fit=(diamond aux) (f), minimum height=3.5cm] (right part) {};
\coordinate (aux) at ($(left part.south)!.5!(right part.south)$);
\node[draw, diamond, below=of aux] (cross diamond) {};
\draw (cross diamond.north) -- (cross diamond.south)
(cross diamond.west) -- (cross diamond.east);
\draw[->, shorten >=1pt] (left part) |- (cross diamond);
\draw[->, shorten >=1pt] (right part) |- (cross diamond);
\end{tikzpicture}
\end{document}
答案2
使用 pgf 2.0 并不容易,因为我忘记了很多东西。可以使用 pgf 2.00 的 calc 库,但在这里我使用了一种旧方法来构建图片。如果此代码对您有用,您可以在一些帮助下获得更好的代码。
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{arrows,fit,shapes}
\begin{document}
\begin{tikzpicture}
\tikzstyle{rec}=[draw,minimum width = 1cm,minimum height=.75cm,outer sep=6pt]
\node[rec] (a) at (0,0) {a};
\node[rec] (b) at ([yshift=-2cm]a) {b};
\node[rec] (c) at ([xshift=3cm]a) {c};
\node[rec] (d) at ([yshift=-2cm]c) {d};
\coordinate (x) at ([xshift=-0.25cm,yshift=+0.25cm] a.north west);
\coordinate (y) at ([xshift=+0.25cm,yshift=-0.25cm] b.south east);
\coordinate (u) at ([xshift=-0.25cm,yshift=+0.25cm] c.north west);
\coordinate (v) at ([xshift=+0.25cm,yshift=-0.25cm] d.south east);
\coordinate (xx) at ([xshift=-1.25cm,yshift=+2.25cm] a.north west);
\coordinate (yy) at ([xshift=+1.25cm,yshift=-1.25cm] d.south east);
\node [draw,fit=(x)(y)] (rec1){};
\node [draw,fit=(u)(v)] (rec2){};
\node [draw,fit=(xx)(yy)] (rec3){};
\draw[->] (a) -- (b);
\draw[->] (c) -- (d);
\path (rec1.north) -- (rec2.north) node[shape=diamond,minimum size=.75cm,pos=.5,yshift=1cm,draw](dia) {} ;
\draw[<-] (rec1) |- (dia);
\draw[<-] (rec2) |- (dia);
\end{tikzpicture}
\end{document}