Я хочу создать блок-схему с помощью tikz, которая выглядит следующим образом:
-------------------------------
| wide node |
-------------------------------
|
-------------------------------
| wide node |
-------------------------------
|
-------------------------
| | |
------ ------ ------
|sub1| |sub2| |sub3|
------ ------ ------
| | |
-----------------------
|
-------------------------------
| wide node |
-------------------------------
Похоже на довольно простую блок-схему. Я перепробовал много всего, чтобы соединить стрелки и сделать подузлы такими же широкими, как и другие узлы, но мне это не удалось, мой текущий код выглядит так:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,arrows,decorations.pathmorphing,backgrounds,fit,positioning,
shapes.symbols,chains}
\begin{document}
\tikzstyle{block} = [rectangle, draw=black, thick, fill=white, text width=8em,
text centered, minimum height=4em]
\tikzstyle{dummyblock} = [rectangle]
\tikzstyle{line} = [draw, -latex']
\begin{center}
\begin{tikzpicture}[node distance=3.5cm]
\node [block] (A) {A};
\node [block,below of= A] (B) {B};
\node [dummyblock,below of=B] (BB) {};
\node [block, below of = BB] (D) {D};
\node [block, left of=D] (C) {C};
\node [block, right of=D] (E) {E};
\node [block, below of=D] (F) {F};
\path [line] (A.south) -| (B.north);
\path [line] (B.south) -| (BB.north);
\path [line] (BB.south) -| (C);
\path [line] (BB.south) -| (D);
\path [line] (BB.south) -| (E);
\path [line] (C.south) -| (F.north);
\path [line] (D.south) -| (F.north);
\path [line] (E.south) -| (F.north);
\end{tikzpicture}\end{center}
\end{document}
Есть ли у кого-нибудь идеи, как это исправить? Любая помощь будет высоко оценена!
решение1
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,arrows,decorations.pathmorphing,backgrounds,
fit,positioning,shapes.symbols,chains}
\tikzstyle{block} = [rectangle, draw=black, thick, fill=white, text width=8em,
text centered, minimum height=4em]
\tikzstyle{dummyblock} = [rectangle]
\tikzstyle{line} = [draw, -latex']
\begin{document}
\begin{tikzpicture}[node distance=3.5cm]
\node [block] (A) {A};
\node [block,below =of A] (B) {B};
\coordinate [below = of B] (BB) {};
\node [block, below = of BB] (D) {D};
\node [block, left = of D] (C) {C};
\node [block, right = of D] (E) {E};
\coordinate[below = of D] (fn);
\node [block, below = of fn] (F) {F};
\path [line] (A) -- (B);
\draw (B) -- (BB);
\path [line] (BB) -| (C);
\path [line] (BB) -- (D);
\path [line] (BB) -| (E);
\draw (C) |- (fn);
\draw (D) |- (fn);
\draw (E) |- (fn);
\path[line] (fn) -- (F);
\end{tikzpicture}
\end{document}
решение2
Percusse, спасибо большое за всю твою помощь! Я объединил все вышеперечисленное в окончательном решении:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{arrows,positioning,fit}
\tikzstyle{block} = [rectangle, draw=black, thick, fill=white, text width=8em,
text centered, minimum height=4em]
\tikzstyle{line} = [draw, -latex']
\begin{document}
\begin{tikzpicture}[node distance=0.5cm]
\node [block] (D) {D};
\node [block, left = of D] (C) {C};
\node [block, right = of D] (E) {E};
\coordinate[below = of D] (FF);
\node [ block, fit={(C) (D) (E)},label=center:F, below = of FF] (F) {};
\coordinate [above = of D] (BB) {};
\node [ block, fit={(C) (D) (E)},label=center:B, above = of BB] (B) {};
\node [ block, fit={(C) (D) (E)},label=center:A, above = of B] (A) {};
\path [line] (A) -- (B);
\draw (B) -- (BB);
\path [line] (BB) -| (C);
\path [line] (BB) -- (D);
\path [line] (BB) -| (E);
\draw (C) |- (FF);
\draw (D) |- (FF);
\draw (E) |- (FF);
\path[line] (FF) -- (F);
\end{tikzpicture}
\end{document}
Кстати, по какой-то причине мой дистрибутив texlive latex для Linux выдает ошибки (мой дистрибутив miktex для Windows не выдает ошибки):
\node [ block, fit={(C) (D) (E)},label=center:A, above = of B] (A) {};
это можно решить, заменив эту строку на
\node [ block, fit={(C) (D) (E)}, above = of B] (A) {A};
решение3
Это почти работает, если объединить все вышеперечисленные предложения:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,arrows}
\tikzstyle{line} = [draw, -latex']
\begin{document}
\begin{tikzpicture}[node distance=0.2cm,mynode/.style={outer sep=0pt, draw}]
\node[mynode] (foo) {foo};
\node[mynode] (bar) [right=of foo] {bar};
\node[mynode] (bar2) [right=of bar] {bar2};
\coordinate[below = of bar] (cbar);
\node [ mynode,
inner sep=0pt,
yshift=-1cm,
fit={(foo) (bar) (bar2)},label=center:foobar
] (foobar) {};
\draw (foo.south) |- (cbar);
\draw (bar.south) |- (cbar);
\draw (bar2.south) |- (cbar);
\path[line] (cbar) -- (foobar.north);
\end{tikzpicture}
\end{document}
Только по какой-то причине стрелки не рисуются прямо из координат ниже трех узлов к более широкому узлу... кто-нибудь знает, как это исправить?