2

How can I group C and D together horizontally instead of vertically as shown in the diagram below while still maintaining the center alignment of the container?

\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}
3
  • Welcome! Do C and D have the same width?
    – cfr
    Feb 7, 2016 at 1:04
  • 1
    Yes, C and D have the same width.
    – user97713
    Feb 7, 2016 at 1:15
  • Very handy! You could do it otherwise, but you'd have to measure everything, I think. Or arrange things in a box and then place them or draw things in a different order. Or... lots of possibilities, but less simple.
    – cfr
    Feb 7, 2016 at 1:18

2 Answers 2

1

If C and D have the same width and height, you could just do this:

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

adjusted alignment

Note that \tikzstyle is deprecated so I've updated the syntax. arrows is also deprecated, but I've not changed that as updating to arrows.meta may give you a slightly different result.

0

A matrix node could be an alternative to fit, it doesn't matter the relation between inner nodes size and you don't have to worry about manual positioning.

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

enter image description here

You must log in to answer this question.