In this post we’re going to show you how to create mind maps using TikZ. To create this post we’ve adapted and simplified an example found in chapter six of the TikZ documentation, so if you want to go into greater detail on this topic, make sure you check out the extensive documentation.

To get started, we load up a the TikZ package and the ‘mindmap’ TikZ library. Next we open a ‘tikzpicture’ environment.

\usepackage{tikz}
\usetikzlibrary{mindmap}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}

\end{tikzpicture}
\end{document}


For our example we’ll make a mind map to display the different video series’ we’ve made. We’ll start by making a tree diagram and then we’ll format it into a real mind map. We start the tree with the title or central concept. This is added in using a node.

\node{ShareLaTeX Tutorial Videos}


We can then give this node children, which are themselves nodes which can also have their own children and so on. Let’s add in four child nodes for the series titles. A child is inserted using the ‘child’ keyword and then we specify a node in curly brackets. We close the original node statement with a semi colon just before the \end command. If we compile the code we can see our code has produced a sightly muddled tree diagram.

\begin{tikzpicture}

\node{ShareLaTeX Tutorial Videos}
child { node {Beginners Series}}
child { node {Thesis Series}}
child { node {Beamer Series}}
child { node {TikZ Series}}
;
\end{tikzpicture}


Let’s add in the next layer of nodes and then we’ll start formatting it to look more like a mind map.

\node{ShareLaTeX Tutorial Videos}
child { node {Beginners Series}
child { node {First Document}}
child { node {Sections and Paragraphs}}
child { node {Mathematics}}
child { node {Images}}
child { node {bibliography}}
child { node {Tables and Matrices}}
child { node {Longer Documents}}
}
child { node {Thesis Series}
child { node {Basic Structure}}
child { node {Page Layout}}
child { node {Figures, Subfigures and Tables}}
child { node {Biblatex}}
child { node {Title Page}}
}
child { node {Beamer Series}
child { node {Getting Started}}
child { node {Text, Pictures and Tables}}
child { node {Blocks, Code and Hyperlinks}}
child { node {Overlay Specifications}}
child { node {Themes and Handouts}}
}
child { node {TikZ Series}
child { node {Basic Drawing}}
child { node {Geogebra}}
child { node {Flow Charts}}
child { node {Circuit Diagrams}}
child { node {Mind Maps}}
};


To make the branches of our tree surround the central node we add the ‘grow cyclic’ option into square brackets at the end of the begin command. We can also specify a text width and add the ‘flush center’ alignment option in to tidy up our text.

\begin{tikzpicture}[grow cyclic, text width=2.7cm, align=flush center]


Next we’ll specify styles for the different tree levels. Level 1 is defined as everything coming out of the main parent node while level 2 is everything coming out of the first generation of child nodes. So in our example, level 1 is everything coming out of the ‘ShareLaTeX tutorial videos’ title and level 2 is everything coming out of our series titles. To specify the styles for these levels we write the name of the level followed by a forward slash and full stop, then the keyword ‘style’, an equals sign and then the formatting options for the level in curly brackets. In the curly brackets we need to specify a level distance and a sibling angle.

\begin{tikzpicture}[grow cyclic, text width=2.7cm, align=flush center,
level 1/.style={level distance=5cm,sibling angle=90},
level 2/.style={level distance=3cm,sibling angle=45}]


The level distance is the distance between the centres of the child nodes and the centre of the node connected above it. We’ve set the level distances to 5cm in level one and 3cm in level two. This means that the distance between the mind map title and the series titles is 5cm and the distance between the the series titles and the individual videos is 3cm. The sibling angle is the angle between the branches. As we only have four branches at the top of level 1 we’ve given level 1 a sibling angle of 90 degrees. As we have many more branches coming out of the first generation nodes we’ve given level 2 a sibling angle of 45 degrees.

Our tree is now looking pretty good but to turn our tree into a proper mind map we need to make use of the ‘mindmap’ tikz library. To do this we add the keyword ‘mindmap’ into the formatting options. We also need to add the concept option to every node using this code: every node/.style=concept. Then we can set a default colour for all the nodes using ‘concept color=’ followed by a colour. We’ll choose an orange. Finally we also need to add the key word ‘append’ in after the full stop in our level style specifications.

\begin{tikzpicture}[mindmap, grow cyclic, every node/.style=concept, concept color=orange!40,
level 1/.append style={level distance=5cm,sibling angle=90},
level 2/.append style={level distance=3cm,sibling angle=45},]


Now if we compile the code we’ll see TikZ has generated some nice bubble shapes and links to turn our tree into an aesthetically pleasing mind map.

Finally we can edit the colours of the different nodes and their children. To do this we simply add a pair of square brackets after the keyword ‘child’ and use them to specify a concept colour. Note that specifying a concept colour at this point will affect all the nodes down from it. Let’s give each of the four series a separate colour. We’ll also give the ‘Mind Maps’ node a different colour as it is the one we are creating now.

child [concept color=blue!30] { node {Beginners Series}
...
child [concept color=yellow!30] { node {Thesis Series}
...
child [concept color=teal!40] { node {Beamer Series}
...
child [concept color=purple!50] { node {TikZ Series}
...
child [concept color=green!40] { node {Mind Maps}}


Notice that as we have set concept colors rather than just the color, TikZ has made nice transitions between colours on the branches.

This concludes our post on creating mind maps and our series on using TikZ. If you want to play around with the mindmap we created in this post you can access it here. Please do keep in touch with us via Facebook, Twitter & Google+.

###Other posts in this series Basic Drawing Using TikZ

Generating TikZ Code from GeoGebra

Creating Flowcharts with TikZ

Circuit Diagrams Using Circuitikz

Posted by Josh Cassidy on 04 Sep 2013

In this post we’re going to show you how to draw simple electrical circuits in a LaTeX document. To do this we are going to use the circuitikz package which is based on the TikZ package. To get started we load up the circuitikz package.

\usepackage{circuitikz}


We don’t need to load the TikZ package as well because it automatically gets loaded with circuitikz. To draw a diagram we use the circuitikz environment. We then fill the environment with a single \draw command ending in a semicolon.

\begin{circuitikz} \draw

<circuitikz code>

;
\end{circuitikz}


The general format is then a pair of co-ordinates followed by a link and then the next pair of co-ordinates. You can then keep adding further links and co-ordinates like a chain. The link could simply be a line which is achieved using two dashes, or it could be an electrical component. To add a component on a line we use the keyword ‘to’ followed by square brackets containing the name of the component.

For example we’ll start at (0,0) and head towards (0,4) adding a battery in. We’ll then add an ammeter in on the way to (4,4) followed by a simple line to (4,0). We’ll complete the circuit by adding a lamp in on the way back (0,0).

\begin{circuitikz} \draw
(0,0) to[battery] (0,4)
to[ammeter] (4,4) -- (4,0)
to[lamp] (0,0)
;
\end{circuitikz}


This is what the diagram looks like compiled.

Now let’s add a voltmeter in parallel to the lamp. To do this we want to branch off the bottom line part way along, then drop down, insert the meter, and then join back up with the bottom line before its end.

\begin{circuitikz} \draw
(0,0) to[battery] (0,4)
to[ammeter] (4,4) -- (4,0)
to[lamp] (0,0)
(0.5,0) -- (0.5,-2)
to[voltmeter] (3.5,-2) -- (3.5,0)
;
\end{circuitikz}


If we wanted to make the points where the lines join into proper terminals represented by circles, we could add *-* into the square brackets where we added the lamp in. This will add terminals in at the co-ordinates either side of the component. Therefore we need to shorten the lines either side of the lamp so that the terminals appear at our line joins, and then we need to fill in the gaps.

\begin{circuitikz} \draw
(0,0) to[battery] (0,4)
to[ammeter] (4,4) -- (4,0) -- (3.5,0)
to[lamp, *-*] (0.5,0) -- (0,0)
(0.5,0) -- (0.5,-2)
to[voltmeter] (3.5,-2) -- (3.5,0)
;
\end{circuitikz}


Next we’ll add a capacitor in between the lamp and ammeter. We specify a capacitor with a capital C.

\begin{circuitikz} \draw
(0,0) to[battery] (0,4)
to[ammeter] (4,4)
to[C] (4,0) -- (3.5,0)
to[lamp, *-*] (0.5,0) -- (0,0)
(0.5,0) -- (0.5,-2)
to[voltmeter] (3.5,-2) -- (3.5,0)
;
\end{circuitikz}


Often we’ll want to add labels to our diagrams to give the reader more information. To be able to include electrical units in our labels we need to add the ‘siunitx’ option into the \usepackage command.

\usepackage[siunitx]{circuitikz}


We could add a label to the ammeter like this.

to[ammeter, l=2<\ampere>]


The ‘l’ tells LaTeX we are adding a label. Notice that we put the unit commands in pointed brackets. As we’re using SI units we could add an SI prefix in. We could also move the label to below the symbol by adding underscore immediately after the ‘l’.

to[ammeter, l_=2<\milli\ampere>]


As we are displaying current we could place the label next to an arrow on the line by changing the ‘l’ to an ‘i’.

to[ammeter, i_=2<\milli\ampere>]


Let’s add some labels in next to the capacitor and the voltmeter. With the capacitor we can just begin the label with an equals following the capital ‘C’.

\begin{circuitikz} \draw
(0,0) to[battery] (0,4)
to[ammeter, i_=2<\milli\ampere>] (4,4)
to[lamp, *-*] (0.5,0) -- (0,0)
(0.5,0) -- (0.5,-2)
to[voltmeter, l=3<\kilo\volt>] (3.5,-2) -- (3.5,0)
;
\end{circuitikz}


We could also change the colour of a component like this.

to[voltmeter, l=3<\kilo\volt>, color=red]


We can change the size of the diagram by adding a scaling factor in as an option at the end of the \begin command.

\begin{circuitikz}[scale=2] \draw


Notice that the components stay the same size but the spacing between everything changes.

Let’s finish this post by looking at a selection of other components we could use:

\begin{circuitikz}
\draw
(0,0) to[R, o-o] (2,0)
(4,0) to[vR, o-o] (6,0)
(0,2) to[transmission line, o-o] (2,2)
(4,2) to[closing switch, o-o] (6,2)
(0,4) to[european current source, o-o] (2,4)
(4,4) to[european voltage source, o-o] (6,4)
(0,6) to[empty diode, o-o] (2,6)
(4,6) to[full led, o-o] (6,6)
(0,8) to[generic, o-o] (2,8)
(4,8) to[sinusoidal voltage source, o-o] (6,8)
;
\end{circuitikz}


These examples are all bipoles.

From the bottom left we have; a resistor, a variable resistor, a transmission line, a closing switch, a european current source, a european voltage source, an empty diode, a full led, a generic bipole and a sinusoidal voltage source.

Bipoles aren’t the only type of component we can use. We can also add in monopoles, tripoles, double bipoles, logic gates and amplifiers. However we can’t use the ‘to’ keyword to add these in as we’ve done before, because they don’t naturally fit on a single line. Instead we use node notation. For example, this is how we would display an antenna:

(0,0) node[antenna] {}


You can add text to the symbol using the curly brackets, but note that we still need to enter curly brackets even if we don’t want to use them. Here are some more examples:

(4,0) node[pmos] {}
(0,4) node[op amp] {}
(4,4) node[american or port] {}
(0,8) node[transformer] {}
(4,8) node[spdt] {}


To then link them up with other components we would use the predefined node anchors. For more information about all the components available and how you link components using node anchors, take a look at the documentation.

This concludes our post on drawing electrical circuits. In the next post we’ll look at drawing mind maps with TikZ. If you want to play around with the flowchart we created in this post you can access it here. Please do keep in touch with us via Facebook, Twitter & Google+.

###Other posts in this series Basic Drawing Using TikZ

Generating TikZ Code from GeoGebra

Creating Flowcharts with TikZ

Creating Mind Maps Using TikZ

Posted by Josh Cassidy on 02 Sep 2013

In this post we’re going to be looking at creating flowcharts in TikZ. To get started we need to load up the TikZ package, the ‘shapes.geometric’ TikZ library and the ‘arrows’ library.

\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}


##The tikzstyle command Now before we start the document we need to define the basic components of a flow chart. To do this we use the \tikzstyle command. First let’s define the block we’re going to use for start and stop blocks. We’ll name it ‘startstop’ using curly brackets immediately following the command, then we add an equals sign before a set of square brackets. In the square brackets we enter all the formatting information. For this block we’ll specify a rectangle with rounded corners. We’ll give it a minimum width of 3cm and a minimum height of 1cm. We’ll also ensure the text gets centred and we’ll set both a draw and a fill colour. In this example we’ve set the fill colour to a colour that is 30% red mixed with 70% white.

\tikzstyle{startstop} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=black, fill=red!30]


Next we’ll specify an input or output box. This time we want the block to be a parallelogram. To achieve this we ask for a trapezium and then alter the angles. The rest is very similar.

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


Next we’ll add a TikZ style for process blocks using a rectangle and a style for decision blocks using a diamond.

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


Finally we’ll define a style for the arrows. For this we set the line thickness to ‘thick’, add an arrow head and specify the stealth arrow head.

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


##Nodes Now we are ready to start building our flow chart. To do the we use the ‘tikzpicture’ environment. We’ll create our flowchart blocks using nodes and the tikzstyles we defined earlier. Nodes are very powerful as we can easily position them, make them draw a shape, heavily format them and give them some text. In square brackets at the end of the begin command we specify a node distance of 2cm. This is so that the nodes we use to build the blocks are automatically spaced 2cm apart from their centres.

\begin{tikzpicture}[node distance=2cm]

<TikZ code>

\end{tikzpicture}


To add a node we use the \node command. We then add a label for the node in parenthesis. This label is how we refer to the node in the rest of the code. Then in square brackets we add the name of the tikzstyle we want the node to conform to, along with any other formatting options. Then in curly brackets we add the text we want to appear in the block before closing the statement with a semicolon.

\node (start) [startstop] {Start};


If we now compile the code you’ll see our start block has appeared as expected.

Now let’s add an input block in below the start block. This time we need to tell the node where to position itself. To do this we enter ‘below of’ followed by an equals sign and a node label into the square brackets. We could also use ‘above of’, ‘right of’ or ‘left of’ if we wanted the block to appear somewhere else. We’ll tell it to position itself below the start block.

\node (in1) [io, below of=start] {Input};


Now lets add in a process block and a decision block.

\node (pro1) [process, below of=in1] {Process 1};
\node (dec1) [decision, below of=pro1] {Decision 1};


If we compile the code you’ll notice that the gap between the green decision block and the orange process block isn’t as big as the other gaps.

This is because the decision block, being a diamond, is taller than the other blocks. Therefore we can manually adjust its position using the ‘yshift’ variable. If we enter yshift=-0.5cm it will move the decision block vertically down by 0.5cm which should make the gap more regular.

\node (dec1) [decision, below of=pro1, yshift=-0.5cm] {Decision 1};


Now lets add in two process blocks coming out of the decision block, one below it and one to the right of it. Again we’ll need to alter the positioning using ‘yshift’ for the block below and ‘xshift’ for the block to the right. Let’s finish off adding the blocks by adding in an output block and a stop block.

\node (pro2a) [process, below of=dec1, yshift=-0.5cm] {Process 2a};
\node (pro2b) [process, right of=dec1, xshift=2cm] {Process 2b};
\node (out1) [io, below of=pro2a] {Output};
\node (stop) [startstop, below of=out1] {Stop};


##Arrows To finish off our flowchart we need to add the arrows in. To draw an arrow we use the \draw command and then specify the tikzstyle we prepared for arrows using square brackets. We then enter the label of the node we want the arrow to start from, followed by two dashes and then the label corresponding to the node we want the arrow to terminate at. The labels need to be in parenthesis and we need to make sure we close the statement with a semicolon. Lets add arrows in between the start block and the input block, the input and process 1, process 1 and decision 1, decision 1 and process 2a and between decision 1 and process 2b.

\draw [arrow] (start) -- (in1);
\draw [arrow] (in1) -- (pro1);
\draw [arrow] (pro1) -- (dec1);
\draw [arrow] (dec1) -- (pro2a);
\draw [arrow] (dec1) -- (pro2b);


As we have arrows coming out of a decision block we need to add some text to these two arrows. To do this we use more nodes, however this time we don’t need to use the \node command, we just type the word node in after the two dashes and then the text in curly brackets.

\draw [arrow] (dec1) -- node {yes} (pro2a);
\draw [arrow] (dec1) -- node {no} (pro2b);


If we now compile the code you’ll see the text has been added but not in a very helpful place.

To fix this we specify which of the node’s anchors TikZ should use to fix the nodes to the lines. To do this we use square brackets immediately after the keyword ‘node’ and then enter ‘anchor=’ followed by the anchor. For the ‘yes’ node we’ll use the east anchor and for the ‘no’ node we’ll use the south anchor.

\draw [arrow] (dec1) -- node[anchor=east] {yes} (pro2a);
\draw [arrow] (dec1) -- node[anchor=south] {no} (pro2b);


Now let’s draw the final arrows in.

\draw [arrow] (pro2b) -- (pro1);
\draw [arrow] (pro2a) -- (out1);
\draw [arrow] (out1) -- (stop);


You’ll also notice that the arrow from process 2b to process 1 is diagonal and therefore doesn’t look right. To improve this we can swap the first dash for a bar symbol which will make the arrow go in a vertical direction before going in a horizontal direction.

\draw [arrow] (pro2b) |- (pro1);


##Text Width The final thing we should discuss is the text width. At the moment all our text fits nicely inside our shapes. However, if for example, we add some more text to process 2a, you’ll see the shape just extends horizontally until the text fits.

\node (pro2a) [process, below of=dec1, yshift=-0.5cm] {Process 2a text text text text text text text text text text};


This now becomes a bit messy. To improve it we can specify the text width for these nodes by entering text width= followed by a length into our tikzstyles.

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


This concludes our post on creating flow charts with TikZ. If you want to play around with the flowchart we created in this post you can access it here. In the next post we’ll look at drawing electrical circuits. Please do keep in touch with us via Facebook, Twitter & Google+.

###Other posts in this series Basic Drawing Using TikZ

Generating TikZ Code from GeoGebra

Circuit Diagrams Using Circuitikz

Creating Mind Maps Using TikZ

Posted by Josh Cassidy on 29 Aug 2013