Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I made a quick sketchup of what I want:

enter image description here

What would be a good way to generate a blockdiagram like this?

share|improve this question
4  
adapting one of those: texample.net/tikz/examples/tag/diagrams –  pluton Jul 6 '13 at 0:57

2 Answers 2

up vote 5 down vote accepted

This can be done very easily with TikZ and the matrix library.

Even though the PGF/TikZ manual as well as How to insert a linebreak in a TikZ matrix node? say that it is possible to use a \\ linebreak inside a matrix of nodes as long it is enclosed in { } it did not work for me, instead I used a simple \node (with the \twoRows macro). Any options and settings are inherited by this manual node, too.

\foreach loops help to connect the nodes of the matrix without repeating the same code for many rows and/or columns.

Code

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{matrix}
\newcommand*{\twoRows}[2]{\node {$#1$\\$\scriptstyle #2$};}
\tikzset{
  -|/.style={to path={-| (\tikztotarget) \tikztonodes}},
  |-/.style={to path={|- (\tikztotarget) \tikztonodes}},
  % auxiliary styles
  set row cells to/.style n args={3}{% #1 = row, #2 = columns, #3 = style
    @set row cells to/.style={row #1 column ##1/.append style={nodes={#3}}},
    @set row cells to/.list={#2}
  },
  set rows to/.style 2 args={% #1 = rows, #2 = style
    @set rows to/.style={row ##1/.append style={#2}},
    @set rows to/.list={#1}
  }
}
\begin{document}
\begin{tikzpicture}[
  >=latex,
  shorten >=2\pgflinewidth,
  thick,
  rect/.style={
    shape=rectangle,
    draw,
    minimum width=5em,
    align=center,
  },
  sqplus/.style={
    shape=circle,
    draw,
    minimum size=1.5em,
    inner sep=+0pt,
    path picture={% the plus
      \draw[shorten >=+0pt]
            (path picture bounding box.west) -- (path picture bounding box.east)
            (path picture bounding box.north) -- (path picture bounding box.south);
    }
  }
]
\matrix[
  column sep=.5cm,
  row sep=.5cm,
  every node/.append style={anchor=center,text depth=+2pt},
  column 1/.style={nodes=rect},
  set row cells to={1}{2,...,5}{sqplus},
  set row cells to={4}{2,...,5,7}{sqplus},
  set rows to={2,3,5,6,7}{nodes=rect},
  row 4 column 6/.style={nodes=rect},
  row 6 column 5/.style={nodes=sqplus},
  matrix of nodes,
  ] (m) {
    0000\ldots 0 & {}    & {}    &[1cm] {} & {}                                \\
                 & \twoRows{E_{k,N}}{1000\ldots0} 
                         & \twoRows{E_{k,N}}{1000\ldots1}
                                 & \twoRows{E_{k,N}}{1000\ldots a-1} 
                                             & \twoRows{E_{k,N}}{1000\ldots a}   \\
                 & $A_1$ & $A_2$ & $A_{a-1}$ & $A_a$                             \\
    0000\ldots 0 & {}    & {}    & {}        & {}    & \twoRows{E_{k,N}}{m} & {} \\
                 & $M_1$ & $M_2$ & $M_{m-1}$ & $M_m$                             \\
                 & \twoRows{E_{k,N}}{0} 
                         & \twoRows{E_{k,N}}{1}
                                 & \twoRows{E_{k,N}}{m-2}
                                             & {}    & \twoRows{E_{k,N}}{m}      \\
                 & $C_1$ & $C_2$ & $C_{m-1}$ & $C_m$ &                      & $T$\\
  };

  \foreach \Row in {2,6}
    \path (m-\Row-3) -- node {$\cdots$} (m-\Row-4);

  \foreach \Row in {1,4}
    \foreach \cellStart[evaluate={\cellEnd={int(\cellStart+1)}}] in {1,...,4}
      \path[->] (m-\Row-\cellStart) edge (m-\Row-\cellEnd);

  \foreach \Column in {2,...,5} 
    \path[->] (m-3-\Column) edge (m-2-\Column)
              (m-2-\Column) edge (m-1-\Column)
              (m-5-\Column) edge (m-4-\Column) edge (m-6-\Column)
              (m-6-\Column) edge (m-7-\Column)
              ;
  \path[->] (m-4-5) edge     (m-4-6)
            (m-4-6) edge     (m-4-7)
            (m-4-7) edge[|-] (m-6-6) edge (m-7-7)
            (m-6-6) edge     (m-6-5)
            (m-1-5) edge[-|] (m-4-7)
            ;
\end{tikzpicture}
\end{document}

Output

enter image description here

share|improve this answer
    
Astonishing! Thanks a lot, +1 and accepted. –  nightcracker Jul 6 '13 at 9:33

Have you tried to draw this diagram using, for instance, Libreoffice draw and then exporting it to eps or pdf? You can easily insert PDF or EPS graphics in LaTeX. This is more of like a practical answer, rather than a technical one.

I tell you this because a lot of time to produce a diagram like this is required, especially when you don't know Tikz or Pstricks very well.

share|improve this answer
    
Could you please point out how exactly you draw the the cross on the circles? –  Charlie Jul 7 '13 at 19:41

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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