1

I need to draw an "easy" flowchart. I would do that, using the child statement. I've used (as example) an example found here. I've modified it and this is the code:

    \documentclass{article}
\usepackage{tikz}
\usetikzlibrary{trees}

\usepackage[active,tightpage]{preview}% just for showing image
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
%-------definisce stile dei nodi---------------
\tikzstyle{startstop} = [rectangle, rounded corners, minimum width=5cm, minimum height=1cm,text centered, draw=black, fill=red!50]

\tikzstyle{io} = [trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=blue!30]

\tikzstyle{process} = [rectangle, minimum width=3cm, minimum height=1cm, text centered, text width=3cm, draw=black, fill=orange!30]

\tikzstyle{decision} = [diamond, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=green!30]

\tikzstyle{arrow} = [thick,->,>=stealth]
%--------------------------------------

    \begin{document}
\begin{tikzpicture}[
thick,
every node/.style = {
      text width = 5em,
      top color = blue!60,
      bottom color = blue!60,
      rectangle,
      font = \sffamily,
      text=white
                    },
sibling distance = 7em,
edge from parent fork down                  
  ]
\node[text width=10em] (T0) {test0}
    child {node (T1) {test1}
    %child {node[ellipse,draw] (right node) {right}};
        child {node[diamond, red] (T4) {test4}
            child {node (T5) {test5}}
        }}
    child {node (T2) {test2}}
       ;
\end{tikzpicture}
    \end{document}

But the "diamond" icon doesn't work. I've also tried to insert the "decision" style that I've created

 \tikzstyle{decision} = [diamond, minimum width=3cm, minimum
 height=1cm, text centered, draw=black, fill=green!30]

and neither this nor "diamond" works.

How can I draw a "diamond" (because I need to draw a decision Icon)?

1

2 Answers 2

6

As Claudio Fiandrino said, you need to load the shapes (or shapes.geometric) tikzlibrary, too, in order to make diamond work.

When I tried your code, the setting every node./style={...} gave some problems, because it was overriding the decisionstyle (and all the other styles): enter image description here

Since you have defined a style for each node, I'd suggest you to use them:

enter image description here

This is the code:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{trees,shapes.geometric}

\usepackage[active,tightpage]{preview}% just for showing image
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
%-------definisce stile dei nodi---------------
\tikzstyle{startstop} = [rectangle, rounded corners, minimum width=5cm, minimum height=1cm,text centered, draw=black, fill=red!50]

\tikzstyle{io} = [trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=2cm, minimum height=1cm, text centered, draw=black, fill=blue!30]

\tikzstyle{process} = [rectangle, minimum width=2cm, minimum height=1cm, text centered, text width=2cm, draw=black, fill=orange!30]

\tikzstyle{decision} = [diamond, minimum width=2cm, minimum height=1cm, text centered, draw=black, fill=green!30]

\tikzstyle{arrow} = [thick,->,>=stealth]
%--------------------------------------

\begin{document}
\begin{tikzpicture}[
thick,
every node/.style = {
      font = \sffamily,
      text=white
                    },
sibling distance = 7em,
edge from parent fork down                  
  ]
\node[startstop,text width=10em] (T0) {test0}
    child {node[process] (T1) {test1}
    %child {node[ellipse,draw] (right node) {right}};
        child {node[decision,text=red] (T4) {test4}
            child {node[process] (T5) {test5}}
        }}
    child {node[process] (T2) {test2}}
       ;
\end{tikzpicture}
\end{document}

EDIT: some more suggestions, thanks to Claudio Fiandrino's comment:

  • In order to show only the image the standalone class is better, and you won't need this code:

    \usepackage[active,tightpage]{preview}% just for showing image
    \PreviewEnvironment{tikzpicture}
    \setlength\PreviewBorder{5pt}%
    

    but only \documentclass{standalone}.

  • Usually it's better to use \tikset{...} than \tikzstyle{...} to define the style of a node. For more information, you can read the answer linked by Claudio Fiandrino (Should \tikzset or \tikzstyle be used to define TikZ styles?).

The new improved code, that produces the same output, is the following:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{trees,shapes.geometric}

%-------definisce stile dei nodi---------------
\tikzset{%
        startstop/.style={rectangle, rounded corners, minimum width=5cm, minimum height=1cm,text centered, draw=black, fill=red!50},
        io/.style={trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=blue!30},
        process/.style={rectangle, minimum width=2cm, minimum height=1cm, text centered, text width=2cm, draw=black, fill=orange!30},
        decision/.style={diamond, minimum width=2cm, minimum height=1cm, text centered, draw=black, fill=green!30},
        arrow/.style={thick,->,>=stealth},
        every node/.style={font = \sffamily,text=white}
}

%--------------------------------------

\begin{document}
\begin{tikzpicture}[
    thick,
    sibling distance = 7em,
    edge from parent fork down                  
  ]
\node[startstop,text width=10em] (T0) {test0}
    child {node[process] (T1) {test1}
    %child {node[ellipse,draw] (right node) {right}};
        child {node[decision,text=red] (T4) {test4}
            child {node[process] (T5) {test5}}
        }}
    child {node[process] (T2) {test2}}
       ;
\end{tikzpicture}
\end{document}

EDIT 2: After some trial and error, I obtained this result:

enter image description here

I defined three diffent styles for the edge between the diamond and its childs:

\tikzset{%
        MyEdgeA/.style={edge from parent path={(\tikzparentnode.west) -| (\tikzchildnode.north)}},
        MyEdgeB/.style={edge from parent path={(\tikzparentnode.south) -| (\tikzchildnode.north)}},
        MyEdgeC/.style={edge from parent path={(\tikzparentnode.east) -| (\tikzchildnode.north)}}
}

You can set the type of edge you want giving it as a child option:

child[MyEdgeA]{...}

Moreover, I changed the distance between the diamond and the subsequent nodes with:

level 3/.style={level distance=5em}

The complete code is:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{trees,shapes.geometric}

%-------definisce stile dei nodi---------------
\tikzset{%
        startstop/.style={rectangle, rounded corners, minimum width=5cm, minimum height=1cm,text centered, draw=black, fill=red!50},
        io/.style={trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=blue!30},
        process/.style={rectangle, minimum width=2cm, minimum height=1cm, text centered, text width=2cm, draw=black, fill=orange!30},
        decision/.style={diamond, minimum width=2cm, minimum height=1cm, text centered, draw=black, fill=green!30},
        arrow/.style={thick,->,>=stealth},
        every node/.style={font=\sffamily,text=white}
}

\tikzset{%
        MyEdgeA/.style={edge from parent path={(\tikzparentnode.west) -| (\tikzchildnode.north)}},
        MyEdgeB/.style={edge from parent path={(\tikzparentnode.south) -| (\tikzchildnode.north)}},
        MyEdgeC/.style={edge from parent path={(\tikzparentnode.east) -| (\tikzchildnode.north)}}
}
%--------------------------------------

\begin{document}
\begin{tikzpicture}[
    thick,
    sibling distance = 7em,
    edge from parent fork down,
    level 3/.style={level distance=5em}
  ]
\node[startstop,text width=10em] (T0) {test0}
    child {node[process] (T1) {test1}
    %child {node[ellipse,draw] (right node) {right}};
        child {node[decision,text=red] (T4) {test4}
            child[MyEdgeA] {node[process] (T5) {test5}
                edge from parent
                node[pos=0.5,above,text=black] {No}}
            child[MyEdgeB] {node[process] (T6) {test6}
                edge from parent
                node[pos=0.7,right,text=black] {bla bla..}}
            child[MyEdgeC] {node[process] (T7) {test7}
                edge from parent
                node[pos=0.5,above,text=black] {Yes}}
        }}
    child {node[process] (T2) {test2}}
       ;
\end{tikzpicture}
\end{document}
6
  • Does the diamond have the same line width?
    – Sigur
    Commented Aug 27, 2015 at 11:00
  • 1
    @Sigur Actually, I changed only the width of the process blocks to make them fit in the block diagram; probably it is better to change the diamond, too. Thanks, I'll edit my answer.
    – MarcoG
    Commented Aug 27, 2015 at 11:05
  • Small tips: I believe today using standalone gives more flexibility and \tikzset should be preferred to \tikzstyle (see Should \tikzset or \tikzstyle be used to define TikZ styles?. Commented Aug 27, 2015 at 13:00
  • @ClaudioFiandrino I knew that, but since I'm not an expert in defining node styles, I didn't try it :-)! However, this time I was able to do it! Thanks for the suggestions!
    – MarcoG
    Commented Aug 27, 2015 at 13:55
  • As last thing... I need three arrow from diamond (one west, second east, last below) with the label: "yes", "no", "bla bla bla...". Is it possible? Renato
    – RenatoP
    Commented Aug 27, 2015 at 14:01
5

To draw diamonds, you have to include the shapes tikz library (and for arrows the arrows tikz library) in the preamble:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{trees}

\usepackage[active,tightpage]{preview}% just for showing image
\PreviewEnvironment{tikzpicture}
\usetikzlibrary{shapes,arrows}
\setlength\PreviewBorder{5pt}%
%-------definisce stile dei nodi---------------

\tikzstyle{decision} = [diamond, draw=brown, fill=green!30!yellow, inner sep=0em]

%--------------------------------------
\begin{document}
\begin{tikzpicture}[
thick,
every node/.style = {
      text width = 5em,
      fill=blue!60,
      rectangle,
      font = \sffamily,
      text=white,
      text centered,
                    },
sibling distance = 7em]%,
%edge from parent fork down                  
%  ]
%\begin{tikzpicture}
\node[text width=10em] (T0) {test0}
    child {node (T1) {test1}
    %child {node[ellipse,draw] (right node) {right}};
        child {node[decision] (T4) {test4}
            child {node (T5) {test5}}
        }}
    child {node (T2) {test2}}
       ;
\end{tikzpicture}
    \end{document}

enter image description here

I've furthermore applied some other minor changes to improve your code and result. The default background color for all nodes is set to fill=blue!60, rather than the bottom and top colors (because this is used for gradient fills, and it overwrites the standard fill). I've removed defined styles that were not used; I've kept and adjusted the decision style to which I refer (rather than diamond) from the tikzpicture. The inner sep=0em in the definition of the style decision is used to shrink the (imho) oversized diamond.

EDIT: If you want to use the edge from parent fork down you would have to shrink the diamond even more, or redefine other dimensions to prevent connecting elements and blocks from crossing each other.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .