免责声明

免责声明

我希望使用 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}

A B C D

然后你可以用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和 ,并在它们周围放置一个高度最小的框。为了使右侧框与左侧框正确对齐,我必须在 顶部插入一个“不可见”的菱形:fcfite

\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} 

在此处输入图片描述

相关内容