
Как можно сгруппировать C и D по горизонтали, а не по вертикали, как показано на схеме ниже, сохранив при этом выравнивание по центру контейнера?
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,fit}
\begin{document}
\pagestyle{empty}
% Define block styles
\tikzstyle{block} = [rectangle, draw, fill=yellow,
text width=5em, text centered, rounded corners, minimum height=2em]
\tikzstyle{line} = [draw, -latex']
\begin{tikzpicture}[node distance = 1cm, auto]
% Place nodes
\node [cylinder, draw, shape aspect=.5, shape border rotate=90, minimum height=1cm] (A) {A};
\node [block, below =of A] (B) {B};
\node [block, below =of B] (C) {C};
\node [block, below =of C] (D) {D};
\node [draw, fit= (C) (D)] (G) {};
\node [block, below =of D] (E) {E};
\node [text centered, below =of E] (F) {F};
% Draw edges
\path [line] (A) -- (B);
\path [line] (B) -- (G);
\path [line] (G) -- (E);
\path [line] (E) -- (F);
\end{tikzpicture}
\end{document}
решение1
Если C и D имеют одинаковую ширину и высоту, вы можете просто сделать это:
\documentclass[tikz, border=10pt, multi]{standalone}
\usetikzlibrary{shapes.geometric,arrows,positioning,fit}
\begin{document}
% Define block styles
\tikzset{%
block/.style = {rectangle, draw, fill=yellow, text width=5em, text centered, rounded corners, minimum height=2em},
line/.style = {draw, -latex'},
}
\begin{tikzpicture}[node distance = 1cm, auto]
% Place nodes
\node [cylinder, draw, shape aspect=.5, shape border rotate=90, minimum height=1cm] (A) {A};
\node [block, below=of A] (B) {B};
\node [block, below=of B, anchor=north east, xshift=-2.5mm] (C) {C};
\node [block, below=of B, anchor=north west, xshift=2.5mm] (D) {D};
\node [draw, fit= (C) (D)] (G) {};
\node [block, below=of G] (E) {E};
\node [text centered, below =of E] (F) {F};
% Draw edges
\path [line] (A) -- (B);
\path [line] (B) -- (G);
\path [line] (G) -- (E);
\path [line] (E) -- (F);
\end{tikzpicture}
\end{document}
Обратите внимание, что \tikzstyle
устарело, поэтому я обновил синтаксис. arrows
также устарело, но я не стал его менять, так как обновление до arrows.meta
может дать вам немного другой результат.
решение2
Узел matrix
может быть альтернативой fit
, при этом не имеет значения соотношение между размерами внутренних узлов, и вам не нужно беспокоиться о ручном позиционировании.
\documentclass[tikz, border=10pt, multi]{standalone}
\usetikzlibrary{shapes.geometric,arrows,positioning}
\begin{document}
% Define block styles
\tikzset{%
block/.style = {rectangle, draw, fill=yellow, text width=5em, text centered, rounded corners, minimum height=2em},
line/.style = {draw, -latex'},
}
\begin{tikzpicture}[node distance = 1cm, auto]
% Place nodes
\node [cylinder, draw, shape aspect=.5, shape border rotate=90, minimum height=1cm] (A) {A};
\node [block, below=of A] (B) {B};
\matrix (CD) [draw, below=of B, column sep=2mm]{
\node [block] (C) {C}; &
\node [block] (D) {D}; \\
};
\node [block, below=of CD] (E) {E};
\matrix (CD2) [draw, below=of E, column sep=2mm]{
\node [block, minimum width=3cm, minimum height=1cm, anchor=center] (C) {C}; &
\node [block, minimum size=2cm, anchor=center] (D) {D}; \\
};
\node [text centered, below =of CD2] (F) {F};
% Draw edges
\path [line] (A) -- (B);
\path [line] (B) -- (CD);
\path [line] (CD) -- (E);
\path [line] (E) -- (CD2);
\path [line] (CD2) -- (F);
\end{tikzpicture}
\end{document}