A Mild Introduction to Tikz
Or another path to enlightenment
--
I still remember the day I decided to deep dive into the mysteries of tikz. From the very first day I started learning LaTeX I had an almost innate fear of it. Actually, I was so unwilling to learn tikz that I often added a “…no tikz” suffix to all my LaTeX-related google searches. Most of the times, this fear was due to the vast and exhaustive documentation that tikz and pgf share — which, by the way, after so many pages and figures drawn with tikz, has turned out to be one of the most helpful documents on the internet. But, as with most things, learning tikz becomes easier when you have some concrete reason to learn it.
So, let us start with two simple examples.
Lines and Nodes
Have a look at the following Figure:
In case you have any doubts, this is nothing more but the plot of the following function:
The code to generate the above plot is as follows:
Let‘s explain the above snippet line by line:
- At first, as a shorthand, we include tikz within the optional parameters of our
documentclass
. Also, through the parametermargin = 5mm
we ask LaTeX to insert a5mm
margin around our figure. One may however regularly include tikz through\usepackage{tikz}
as with any other package. - With
\begin{document}
and\begin{tikzpicture}
commands we enter the document and tikz environments, respectively. - The first important line of code is line 5. There, we draw a dashed grid starting from point
(-2.99,-2.99)
and extending (as a rectangle) up to point(2.99,2.99)
. By default, grids are considered to be rectangular and the two points provided correspond to the bottom left and top right corners of the rectangle, respectively. - The next two lines of code draw the two axes. Namely, we draw two
thick
lines that end with and arrowhead (->
) starting from and ending to certain points. - At the end of each line we add a node to indicate the name of each axis. This is done through the
node
keyword, which we position using two parameters. The first one,pos=1
, indicates that the node should be placed at the end (100%) of the line while the second one (below
orleft
) determines node’s location relative to the endpoint of the line. At last, any code in curly braces,{…}
, corresponds to the node’s text — which should always be provided, even if empty. - In lines 8 and 9 we draw two straight lines — those that correspond to the plot of our function.
- In lines 10 and 11 we draw the two points appearing on our Figure, using two nodes. We can determine the drawing color of a node using the
draw
parameter, while if we would like to change a node’s fill color — which isnone
by default, so all nodes are internally transparent — we can use thefill
parameter. Also, while tikz nodes are considered rectangles by default, using thecircle
keyword we can change their shape to, well, circles. At last, theinner sep
keyword determines the gap between the node’s text — here, empty — and the node’s border — in this case, it acts as the node’s “radius”. - Outside the rectangle braces, we provide the name of each node within parentheses, then determine its location in absolute coordinates using the
at
keyword and, at last, provide their text using{…}
.
There are two key takeaways from the above. To begin with, the abstract syntax of \draw
is as follows:
\draw[options] (...) <shape> (...);
Within the options part, enclosed in rectangle brackets, […]
, we can pass several parameters, mostly concerning the styling of the drawn line. Then, using parentheses, we determine, usually through points, the starting and ending points of the corresponding line (in some relevant sense), while the shape
parameter determines the lines shape. In our example, we have used rectangle
, grid
and --
as shape types, which correspond to rectangles, grids and straight lines.
The other important command we have learned about is \node
which places a node on the plot. In general — but not strictly speaking — nodes serve as points, adhering to the following abstract syntax:
\node[options] (name) at (position) {text};
Again, anything regarding style goes to the options part. A node’s name is any string — including alphanumerical characters and spaces — that is used as a unique internal identifier for each node. The position of a node is usually given in Cartesian coordinates in the form (x,y)
while a node’s text might be empty or contain some text / math content.
As an important disclaimer, observe that all drawing commands should end with a semicolon, ;
!
What Αbout Labels?
What if we wanted to draw some shape like the following one, where we have included lots of labels?
You can figure out whose function’s plot that is, for sure, but can you write the code to generate it? If not, let us have a look at it:
As you see, there are some parts you can already recognize from our previous plot. However, we have introduced some new stuff as well.
To begin with, one might determine a grid’s step by providing the step
parameter within the options of the \draw
command, as seen above — by default, any values are interpreted as centimeters.
We have also provided some node labels through the label={}:{}
option. But, why did we use that one instead of merely adding some text / math into the node’s “native” label, i.e., text? Well, the reason is that, by default, a node’s text is anchored to its center and moves around with it. However, in our case, what we wanted to achieve was to add some text next to each point to indicate its position on the plane. For this purpose, one might utilize the label={}:{}
keyword, whose general syntax is as follows:
label = {parameters} : {text / math}
Parameters might be anything concerning relative positioning, anchors and many more that we will explore in subsequent tutorials. As for now, we have utilized left
and right
to position our labels left and right of their corresponding nodes — as you may suspect, there are also their vertical counterparts, above
and below
.
Note that we have also made use of the xfrac
package to typeset inline fractions in a more elegant way — at least, in this case. This is achieved through the \sfrac{}{}
command, which is used exactly as the regular \frac{}{}
command for fractions.
What else?
Just lines and nodes. That’s all we have at the moment. But, well, it seems we can already do plenty of things using just them. There are several other things that tikz offers us, however. For instance, the tools we have presented so far do not suffice for drawing a more complex plot — e.g., that of a cosine. But, don’t be impatient, we shall cover all this stuff sooner or later.
So, till next time, keep drawing!