3

I am new to Tikz I just started working with it today and I came across with some difficulties that I can not find solution to them. I am producing a block diagram based on the example from Example: Control system principles. I tried to modified based on my needs where I add text above of the blocks for example \node [above of=controller, node distance=1.2cm] (MP:1) {$MP_1$};. I do not know if this is the correct way to do it. My ideal scenario is to connect this text with arrows left and right to the pinstyles tin and tout/tin. Since tin and tout/tin I can not give them a name I can not use the command \draw [draw,->] (tin) -- node [name=line] {} (MP:1); it will not work. I tried by inserting \draw [->, right of=MP:1, node distance=1.5cm] {}; but the output is not again correct. I was looking over the Tikz manual and I found somehow a solution to my problem by using coordinates such as \draw [<-] (20mm,10mm) -- (0mm,10mm);. The result again is not correct.

So my first question is the text that I am inserting is it correct the way in order to provide a name to the text as reference or is there a better way? My second question is, if I am inserting the text correctly is possible to create reference names for the pinstyles, if not how can I draw the lines? Sample of my code is provided below for testing purposes and also a picture of the output.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}

\begin{document}

\tikzstyle{block} = [draw, rectangle, minimum height=2em, minimum width=5em] %fill=blue!20
\tikzstyle{sum} = [draw, circle, node distance=2.0cm, minimum size=6mm]
\tikzstyle{input} = [coordinate] 
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]

\begin{figure}[!ht]
\begin{center}
\makebox[\textwidth][c]{
\begin{tikzpicture}[auto, node distance=1.5cm,>=latex']
\node [input, name=input] {};
\node [sum, right of=input, pin={[pinstyle]above:$t_{in}$}, node distance=1.5cm] (sum) {MP};
\draw [draw,->] (input) -- node [name=begging] {UE} (sum);
\node [block, right of=sum, node distance=2.0cm] (controller) {Node B};
% Text above of GGSN (MP1)
\node [above of=controller, node distance=1.2cm] (MP:1) {$MP_1$};
\draw [<-] (20mm,10mm) -- (0mm,10mm);
%\draw [->, right of=MP:1, node distance=1.5cm] {};
\draw [->] (sum) -- node {} (controller);
\node [sum, right of=controller, pin={[pinstyle]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_2) {MP};
\draw [->] (controller) -- node [name=u] {} (sum_2);
\node [block, right of=sum_2, node distance=2.0cm] (controller_2) {RNC};
% Text above of GGSN (MP2)
\node [above of=controller_2, node distance=1.2cm] (MP:2) {$MP_2$};
\draw [->] (sum_2) -- node [name=u2] {} (controller_2);
\node [sum, right of=controller_2, pin={[pinstyle]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_3) {MP};
\draw [->] (controller_2) -- node [name=u3] {} (sum_3);
\node [block, right of=sum_3, node distance=2.0cm] (controller_3) {SGSN};
% Text above of GGSN (MP3)
\node [above of=controller_3, node distance=1.2cm] (MP:3) {$MP_3$};
\draw [->] (sum_3) -- node [name=u4] {} (controller_3);
\node [sum, right of=controller_3, pin={[pinstyle]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_4) {MP};
\draw [->] (controller_3) -- node [name=u5] {} (sum_4);
\node [block, right of=sum_4, node distance=2.0cm] (controller_4) {GGSN};
% Text above of GGSN (MP4)
\node [above of=controller_4, node distance=1.2cm] (MP:4) {$MP_4$};
\draw [->] (sum_4) -- node [name=u6] {} (controller_4);
\node [sum, right of=controller_4, pin={[pinstyle]above:$t_{out}$}, node distance=2.0cm] (sum_5) {MP};
\draw [->] (controller_4) -- node [name=u8] {} (sum_5);
\node [output, right of=sum_5] (output) {};
\draw [->] (sum_5) -- node [name=end] {PDN}(output);
\node [block, above of=sum_3, node distance=2.5cm] (pipeline) {Pipeline};
\draw [->] (begging) |- (pipeline);
\draw [->] (pipeline) -| (end);
\end{tikzpicture} } % End of makebox
\caption{Test}
\label{fig:blockdiagram}
\end{center}
\end{figure}

\end{document}

Block Diagram Output

5

Improved version:

  1. I changed the old \tikzsetstyle to the more appropriate \tikzset syntax.

  2. I'd suggest you not to use : in the name of a node, since the : operator has a special meaning when applied to a name of a node.

  3. I loaded the positioning library and change the deprecated of= syntax to the =of syntax (notice the economy in the resulting code).

  4. Instead of pins I used a mytext style for nodes; this gives better results.

  5. Room for improvement: perhaps using chains here will simplify the code. This is left as an exercise.

The code:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning}

\begin{document}

\tikzset{
block/.style={
  draw, 
  rectangle, 
  minimum height=2em, 
  minimum width=5em
  },
sum/.style={
  draw, 
  circle, 
  minimum size=6mm
  },
input/.style={coordinate}, 
output/.style={coordinate},
mytext/.style={
  draw,
  text depth=4pt,
  text height=10pt
  }
}
\begin{figure}[!ht]
\begin{center}
\makebox[\textwidth][c]{%
\begin{tikzpicture}[auto,node distance=1cm and 0.8cm,>=latex']
\node[
  input,
  name=input] {};
\node[
  sum, 
  right = of input
  ] 
  (sum) {MP};
\node[
  mytext,
  above=of sum.center,
  name=tin1
  ] 
  {$t_{in}$};  
\draw[->] 
  (input) -- node [name=begging] {UE} (sum);
\node[
  block, 
  right = of sum
  ] 
  (controller) {Node B};
% Text above of GGSN (MP1)
\node[
  mytext,
  above = of controller.center
  ] 
  (MP1) {$MP_1$};
%\draw [->, right = of MP:1, node distance=1.5cm] {};
\draw[->] 
  (sum) -- node {} (controller);
\node[
  sum,
  right = of controller
  ] 
  (sum_2) {MP};
\node[
  mytext,
  above=of sum_2.center,
  name=toti1
  ] 
  {$t_{out}/t_{in}$};  
\draw[->] 
  (controller) -- node [name=u] {} (sum_2);
\node[
  block, 
  right = of sum_2
  ] 
  (controller_2) {RNC};
% Text above of GGSN (MP2)
\node[
  mytext,
  above = of controller_2.center
  ] 
  (MP2) {$MP_2$};
\draw[->] 
  (sum_2) -- node [name=u2] {} (controller_2);
\node[
  sum, 
  right = of controller_2, 
  ] 
  (sum_3) {MP};
\node[
  mytext,
  above=of sum_3.center,
  name=toti2
  ] 
  {$t_{out}/t_{in}$};
\draw[->] 
  (controller_2) -- node [name=u3] {} (sum_3);
\node[
  block,
  right = of sum_3
  ] 
  (controller_3) {SGSN};
% Text above of GGSN (MP3)
\node[
  mytext,
  above = of controller_3.center
  ] 
  (MP3) {$MP_3$};
\draw[->] 
  (sum_3) -- node [name=u4] {} (controller_3);
\node[
  sum, 
  right = of controller_3, 
  ] 
  (sum_4) {MP};
\node[
  mytext,
  above=of sum_4.center,
  name=  toti3
  ] {$t_{out}/t_{in}$};
\draw[->] 
  (controller_3) -- node [name=u5] {} (sum_4);
\node[
  block, 
  right = of sum_4
  ] 
  (controller_4) {GGSN};
% Text above of GGSN (MP4)
\node[
  mytext,
  above = of controller_4.center
  ] 
  (MP4) {$MP_4$};
\draw[->] 
  (sum_4) -- node [name=u6] {} (controller_4);
\node[
  sum, 
  right = of controller_4
  ] 
  (sum_5) {MP};
\node[
  mytext,
  above=of sum_5.center,
  name=tout1
  ]
  {$t_{out}$}; 
\draw[->] 
  (controller_4) -- node [name=u8] {} (sum_5);
\node[
  output, 
  right = of sum_5
  ] 
  (output) {};
\draw[->] 
  (sum_5) -- node [name=end] {PDN}(output);
\node[
  block,
  above = 2cm of sum_3
  ] 
  (pipeline) {Pipeline};
\draw[->] 
  (begging) |- (pipeline);
\draw[->] 
  (pipeline) -| (end);

\draw[->]
  (tin1) -- (sum);
\draw[->]
  (toti1) -- (sum_2);
\draw[->]
  (toti2) -- (sum_3);
\draw[->]
  (toti3) -- (sum_4);
\draw[->]
  (tout1) -- (sum_5);

\draw[<->] 
  (tin1) -- (MP1);
\draw[<->] 
  (MP1.east) -- (toti1.west|-MP1.east);
\draw[<->] 
  (toti1.east) -- (MP2.west|-toti1.east);
\draw[<->] 
  (MP2.east) -- (toti2.west|-MP2.east);
\draw[<->] 
  (toti2.east) -- (MP3.west|-toti2.east);
\draw[<->] 
  (MP3.east) -- (toti3.west|-MP3.east);
\draw[<->] 
  (toti3.east) -- (MP4.west|-toti3.east);
\draw[<->] 
  (MP4.east) -- (tout1.west|-MP4.east);
\end{tikzpicture}} % End of makebox
\caption{Test}
\label{fig:blockdiagram}
\end{center}
\end{figure}

\end{document}

enter image description here

Delete the draw option from the mytext style.

Initial version:

A pin is just a special node, so you can use name=<string> to give them a name to be used to connect them:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

\begin{document}

\tikzset{
block/.style={
  draw, 
  rectangle, 
  minimum height=2em, 
  minimum width=5em
  },
sum/.style={
  draw, 
  circle, 
  node distance=2.0cm, 
  minimum size=6mm
  },
input/.style={coordinate}, 
output/.style={coordinate},
pinstyle/.style={
  pin edge={to-,thin,black}
  }
}
\begin{figure}[!ht]
\begin{center}
\makebox[\textwidth][c]{
\begin{tikzpicture}[auto, node distance=1.5cm,>=latex']
\node [input, name=input] {};
\node [sum, right of=input, pin={[pinstyle,name={tin1}]above:$t_{in}$}, node distance=1.5cm] (sum) {MP};
\draw [draw,->] (input) -- node [name=begging] {UE} (sum);
\node [block, right of=sum, node distance=2.0cm] (controller) {Node B};
% Text above of GGSN (MP1)
\node [above of=controller, node distance=1.2cm] (MP1) {$MP_1$};
\draw [<-] (20mm,10mm) -- (0mm,10mm);
%\draw [->, right of=MP:1, node distance=1.5cm] {};
\draw [->] (sum) -- node {} (controller);
\node [sum, right of=controller, pin={[pinstyle,name=toti1]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_2) {MP};
\draw [->] (controller) -- node [name=u] {} (sum_2);
\node [block, right of=sum_2, node distance=2.0cm] (controller_2) {RNC};
% Text above of GGSN (MP2)
\node [above of=controller_2, node distance=1.2cm] (MP2) {$MP_2$};
\draw [->] (sum_2) -- node [name=u2] {} (controller_2);
\node [sum, right of=controller_2, pin={[pinstyle,name=toti2]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_3) {MP};
\draw [->] (controller_2) -- node [name=u3] {} (sum_3);
\node [block, right of=sum_3, node distance=2.0cm] (controller_3) {SGSN};
% Text above of GGSN (MP3)
\node [above of=controller_3, node distance=1.2cm] (MP3) {$MP_3$};
\draw [->] (sum_3) -- node [name=u4] {} (controller_3);
\node [sum, right of=controller_3, pin={[pinstyle,name=toti3]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_4) {MP};
\draw [->] (controller_3) -- node [name=u5] {} (sum_4);
\node [block, right of=sum_4, node distance=2.0cm] (controller_4) {GGSN};
% Text above of GGSN (MP4)
\node [above of=controller_4, node distance=1.2cm] (MP4) {$MP_4$};
\draw [->] (sum_4) -- node [name=u6] {} (controller_4);
\node [sum, right of=controller_4, pin={[pinstyle,name=tout1]above:$t_{out}$}, node distance=2.0cm] (sum_5) {MP};
\draw [->] (controller_4) -- node [name=u8] {} (sum_5);
\node [output, right of=sum_5] (output) {};
\draw [->] (sum_5) -- node [name=end] {PDN}(output);
\node [block, above of=sum_3, node distance=2.5cm] (pipeline) {Pipeline};
\draw [->] (begging) |- (pipeline);
\draw [->] (pipeline) -| (end);

\draw[<->] (tin1.east) -- (MP1.west|-tin1.east);
\draw[<->] (MP1.east) -- (toti1.west|-MP1.east);
\draw[<->] (toti1.east) -- (MP2.west|-toti1.east);
\draw[<->] (MP2.east) -- (toti2.west|-MP2.east);
\draw[<->] (toti2.east) -- (MP3.west|-toti2.east);
\draw[<->] (MP3.east) -- (toti3.west|-MP3.east);
\draw[<->] (toti3.east) -- (MP4.west|-toti3.east);
\draw[<->] (MP4.east) -- (tout1.west|-MP4.east);
\end{tikzpicture} } % End of makebox
\caption{Test}
\label{fig:blockdiagram}
\end{center}
\end{figure}

\end{document}

enter image description here

I changed the old \tikzsetstyle to the more appropriate \tikzset syntax. Also, I'd suggest you not to use : in the name of a node, since the : operator has a special meaning when applied to a name of a node.

I would also suggest you to load the positioning library and change the deprecated of= syntax to the =of syntax.

  • Wow impressive answer! Thanks a lot for the help, I understand a lot based on your modifications. I followed all of your advices and the result looks perfect as expected. Thanks a lot for your time and effort and makes a big difference to people like me that we get stack for hours with problems like this ones when I can not find solutions. – Thanos Mar 14 '14 at 11:16
2

Gonzalo already provided a very good answer, but for such regular schemes matrix nodes are a good option. You don't need to manually position every node and with matrix of nodes option (you need to load matrix library) you can save a lot of typing.

\documentclass{article}
\usepackage{tikz}
\usepackage{adjustbox}
\usetikzlibrary{shapes,matrix,arrows}

\begin{document}

\tikzset{
block/.style={
  draw, 
  rectangle, 
  minimum height=2em, 
  minimum width=5em
  },
sum/.style={
  draw, 
  circle, 
  minimum size=6mm
  },
input/.style={coordinate}, 
output/.style={coordinate},
mytext/.style={
  text depth=4pt,
  text height=10pt
  }
}

\begin{figure}[!ht]
\centering
\adjustbox{width=\linewidth}{
\begin{tikzpicture}[>=latex']

\matrix (D) [matrix of nodes, 
                column sep=1cm, 
                row sep=0.8cm,
                row 1/.style={nodes={block,anchor=center}},
                row 3/.style={nodes={block,anchor=center}},
                row 2/.append style={nodes={mytext,anchor=center}},
                ]
{
& & & & & Pipeline \\
& $t_in$ & $MP_1$ & $t_{out}/t_{in}$ & $MP_2$ & $t_{out}/t_{in}$ & $MP_3$ & $t_{out}/t_{in}$ & $MP_4$ & $t_{out}$ & \\
|[input]| &|[sum]| MP & Node B &|[sum]| MP & RNC &|[sum]| MP & SGSN &|[sum]| MP & GGSN &|[sum]| MP & |[input]|\\
};

\foreach \i [remember=\i as \lasti (initially 1)] in {2,...,11}
\draw[->] (D-3-\lasti)--(D-3-\i);

\foreach \i [remember=\i as \lasti (initially 2)] in {3,...,10}
\draw[<->] (D-2-\lasti)--(D-2-\i);

\foreach \i in {2,4,6,8,10}
\draw[->] (D-2-\i)--(D-3-\i);

\path (D-3-1)--(D-3-2) node [above,midway] (UE) {UE};
\path (D-3-10)--(D-3-11) node [above,midway] (PDN) {PDN};
\draw[->] (UE) |- (D-1-6);
\draw[<-] (PDN) |- (D-1-6);

\end{tikzpicture}}
\caption{Test}
\label{fig:blockdiagram}
\end{figure}

\end{document}

enter image description here

  • Wow that looks really simple, and you do not need to worry about the spaces and lengths. Thanks for the reply and for time that you spend in order to make. More information more possible ideas to come up with a new question soon. – Thanos Mar 14 '14 at 20:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.