TikZ offers an easy way of adding so-called nodes to your pictures. In the simplest case, a node is just some text
that is placed at some coordinate. However, a node can also have a border drawn around it or have a more complex
background and foreground. Indeed, some nodes do not have a text at all, but consist solely of the background. You
can name nodes so that you can reference their coordinates later in the picture. However, nodes cannot be referencedacross different pictures.
There are no special TEX commands for adding a node to a picture; rather, there is path operation called node
for this. Nodes are created whenever TikZ encounters node or coordinate at a point on a path where it would
expect a normal path operation (like -- (1,1) or sin (1,1)). It is also possible to give node specifications inside
certain path operations as explained later.
The node operation is typically followed by some options, which apply only to the node. Then, you can
optionally name the node by providing a name in round braces. Lastly, for the node operation you must provide
some label text for the node in curly braces, while for the coordinate operation you may not. The node is placed at
the current position of the path after the path has been drawn. Thus, all nodes are drawn “on top” of the path and
retained until the path is complete. If there are several nodes on a path, they are drawn on top of the path in the
order they are encountered.
The effect of at is to place the node at the coordinate given after at and not, as would normally be the
case, at the last position. The at syntax is not available when a node is given inside a path operation
(it would not make any sense, there).
The (<name>) is a name for later reference and it is optional. You may also add the option name=<name>
to the <option> list; it has the same effect.
name=<node name> assigns a name to the node for later reference. Since this is a “high-level” name
(drivers never know of it), you can use spaces, number, letters, or whatever you like when naming
a node. Thus, you can name a node just 1 or perhaps start of chart or even y_1. Your node
name should not contain any punctuation like a dot, a comma, or a colon since these are used to
detect what kind of coordinate you mean when you reference a node.
The <options> is an optional list of options that apply only to the node and have no effect outside. The other
way round, most “outside” options also apply to the node, but not all. For example, the “outside” rotation
does not apply to nodes (unless some special options are used, sigh). Also, the outside path action, like draw
or fill, never applies to the node and must be given in the node (unless some special other options are used,
deep sigh).
As mentioned before, we can add a border and even a background to a node:
The “border” is actually just a special case of a much more general mechanism. Each node has a certain shape
which, by default, is a rectangle. However, we can also ask TikZ to use a circle shape instead or an ellipse
shape (you have to include pgflibraryshapes for the latter shape):
In the future, there might be much more complicated shapes available such as, say, a shape for a
resistor or a shape for a state of a finite automaton or a shape for a UML class. Unfortunately,
creating new shapes is a bit tricky and makes it necessary to use the basic layer directly. Life is
hard.
To select the shape of a node, the following option is used:
shape=<shape name> select the shape either of the current node or, when this option is not given
inside a node but somewhere outside, the shape of all nodes in the current scope.
Since this option is used often, you can leave out the shape=. When TikZ encounters an option
like circle that it does not know, it will, after everything else has failed, check whether this
option is the name of some shape. If so, that shape is selected as if you had said shape=<shapename>.
By default, the following shapes are available: rectangle, circle, coordinate, and, when the
package pgflibraryshapes is loaded, also ellipse. Details of these shapes, like their anchors
and size options, are discussed in Section 11.8.
The following styles influences how nodes are rendered:
style=every node This style is installed at the beginning of every node.
style=every <shape> node These styles are installed at the beginning of a node of a given <shape>. For
example, every rectangle node is used for rectangle nodes, and so on.
Most nodes just have a single simple text label. However, nodes of a more complicated shapes might be made up
from several node parts. For example, in automata theory a so-called Moore state has a state name, drawn in the
upper part of the state circle, and an output text, drawn in the lower part of the state circle. These two parts are
quite independent. Similarly, a UML class shape would have a name part, a method part, and an attributes part.
Different molecule shape might use parts for the different atoms to be drawn at the different positions, and so
on.
Both PGF and TikZ support such multipart nodes. On the lower level, PGF provides a system for specifying
that a shape consists of several parts. On the TikZ level, you specify the different node parts by using the following
command:
\nodepart{<part name>}
This command can only be used inside the <text> argument of a node path operation. It works a little
bit like a \part command in LATEX. It will stop the typesetting of whatever node part was typeset
until now and then start putting all following text into the node part named <part name>--until another
\partname is encountered or until the node <text> ends.
\begin{tikzpicture} \node [state with output,draw,double,fill=red!20] { % No \nodepart has been used, yet. So, the following is put in the % ``text'' node part by default. $q_1$ \nodepart{output}% Ok, end ``text'' part, start ``output'' part $00$ };% output part ended. \end{tikzpicture}
You will have to lookup which parts are defined by a shape.
The following styles influences node parts:
style=every <part name> node part This style is installed at the beginning of every node part named
<part name>.
The simplest option for the text in nodes is its color. Normally, this color is just the last color installed using
color=, possibly inherited from another scope. However, it is possible to specificly set the color used for text using
the following option:
text=<color> Sets the color to be used for text labels. A color= option will immediately override this
option.
\tikzstyle{every text node part}=[font=\itshape] \tikzstyle{every output node part}=[font=\footnotesize] \tikzstyle{every state with output node}=[draw] \tikz \node [state with output] {state \nodepart{output} output};
Normally, when a node is typeset, all the text you give in the braces is but in one long line (in an \hbox, to be
precise) and the node will become as wide as necessary.
You can change this behaviour using the following options. They allow you to limit the width of a node
(naturally, at the expense of its height).
text width=<dimension> This option will put the text of a node in a box of the given width (more
precisely, in a {minipage} of this width; for plain TEX a rudimentary “minipage emulation” is used).
If the node text is not as wide as <dimension>, it will nevertheless be put in a box of this width. If it
is larger, line breaking will be done.
By default, when this option is given, a ragged right border will be used. This is sensible since, typically, these
boxes are narrow and justifying the text looks ugly.
\tikz \draw (0,0) node[fill=examplefill,text width=3cm] {This is a demonstration text for showing how line breaking works.};
text justified causes the text to be justified instead of (right)ragged. Use this only with pretty broad
nodes.
\tikz \draw (0,0) node[fill=examplefill,text width=3cm,text justified] {This is a demonstration text for showing how line breaking works.};
In the above example, TEX complains (rightfully) about three very badly typeset lines. (For this
manual I asked TEX to stop complaining by using \hbadness=10000, but this is a foul deed,
indeed.)
text ragged causes the text to be typeset with a ragged right. This uses the original plain TEX definition of
a ragged right border, in which TEX will try to balance the right border as well as possible. This is the
default.
\tikz \draw (0,0) node[fill=examplefill,text width=3cm,text ragged] {This is a demonstration text for showing how line breaking works.};
text badly ragged causes the right border to be ragged in the LATEX-style, in which no balancing
occurs. This looks ugly, but it may be useful for very narrow boxes and when you wish to avoid
hyphenations.
\tikz \draw (0,0) node[fill=examplefill,text width=3cm,text badly ragged] {This is a demonstration text for showing how line breaking works.};
text centered centers the text, but tries to balance the lines.
\tikz \draw (0,0) node[fill=examplefill,text width=3cm,text centered] {This is a demonstration text for showing how line breaking works.};
text badly centered centers the text, without balancing the lines.
\tikz \draw (0,0) node[fill=examplefill,text width=3cm,text badly centered] {This is a demonstration text for showing how line breaking works.};
11.4 Placing Nodes Using Anchors
When you place a node at some coordinate, the node is centered on this coordinate by default. This is often
undesirable and it would be better to have the node to the right or above the actual coordinate.
PGF uses a so-called anchoring mechanism to give you a very fine control over the placement. The idea is simple:
Imaging a node of rectangular shape of a certain size. PGF defines numerous anchor positions in the shape. For
example to upper right corner is called, well, not “upper right anchor,” but the north east anchor of the shape.
The center of the shape has an anchor called center on top of it, and so on. Here are some examples (a complete
list is given in Section 11.8).
Now, when you place a node at a certain coordinate, you can ask TikZ to place the node shifted around in such
a way that a certain anchor is at the coordinate. In the following example, we ask TikZ to shift the first node such
that its north east anchor is at coordinate (0,0) and that the west anchor of the second node is at coordinate
(1,1).
Since the default anchor is center, the default behaviour is to shift the node in such a way that it is centered on
the current position.
anchor=<anchor name> causes the node to be shifted such that it’s anchor <anchor name> lies on the
current coordinate.
The only anchor that is present in all shapes is center. However, most shapes will at least define
anchors in all “compass directions.” Furthermore, the standard shapes also define a base anchor, as
well as base west and base east, for placing things on the baseline of the text.
The standard shapes also define a mid anchor (and mid west and mid east). This anchor is half the height of
the character “x” above the base line. This anchor is useful for vertically centering multiple nodes that have
different heights and depth. Here is an example:
\begin{tikzpicture}[scale=3,transform shape] % First, center alignment -> wobbles \draw[anchor=center] (0,1) node{x} -- (0.5,1) node{y} -- (1,1) node{t}; % Second, base alignment -> no wobble, but too high \draw[anchor=base] (0,.5) node{x} -- (0.5,.5) node{y} -- (1,.5) node{t}; % Third, mid alignment \draw[anchor=mid] (0,0) node{x} -- (0.5,0) node{y} -- (1,0) node{t}; \end{tikzpicture}
Unfortunately, while perfectly logical, it is often rather counter-intuitive that in order to place a node above a
given point, you need to specify the south anchor. For this reason, there are some useful options that allow you to
select the standard anchors more intuitively:
above=<offset> does the same as anchor=south. If the <offset> is specified, the node is additionally shifted
upwards by the given <offset>.
\tikz \fill (0,0) circle (2pt) node[above] {above};
\tikz \fill (0,0) circle (2pt) node[above=2pt] {above};
above left=<offset> does the same as anchor=south east. If the <offset> is specified, the node is additionally
shifted upwards and right by <offset>.
\tikz \fill (0,0) circle (2pt) node[above left] {above left};
\tikz \fill (0,0) circle (2pt) node[above left=2pt] {above left};
above right=<offset> does the same as anchor=south west.
\tikz \fill (0,0) circle (2pt) node[above right] {above right};
left=<offset> does the same as anchor=east.
\tikz \fill (0,0) circle (2pt) node[left] {left};
right=<offset> does the same as anchor=west.
below=<offset> does the same as anchor=north.
below left=<offset> does the same as anchor=north east.
below right=<offset> does the same as anchor=north west.
11.5 Transformations
It is possible to transform nodes, but, by default, transformations do not apply to nodes. The reason is that you
usually do not want your text to be scaled or rotated even if the main graphic is transformed. Scaling text is evil,
rotating slightly less so.
However, sometimes you do wish to transform a node, for example, it certainly sometimes makes sense to rotate
a node by 90 degrees. There are two ways in which you can achieve this:
You can use the following option:
transform shape causes the current “external” transformation matrix to be applied to the shape.
For example, if you said \tikz[scale=3] and then say node[transform shape] {X}, you will
get a “huge” X in your graphic.
You can give transformation option inside the option list of the node. These transformations always apply to
the node.
Until now, we always placed node on a coordinate that is mentioned in the path. Often, however, we wish to place
nodes on “the middle” of a line and we do not wish to compute these coordinates “by hand.” To facilitate such
placements, TikZ allows you to specify that a certain node should be somewhere “on” a line. There are two ways of
specifying this: Either explicitly by using the pos option or implicitly by placing the node “inside” a path operation.
These two ways are described in the following.
11.6.1 Explicit Use of the Position Option
pos=<fraction> When this option is given, the node is not anchored on the last coordinate. Rather, it is
anchored on some point on the line from the previous coordinate to the current point. The <fraction>
dictates how “far” on the line the point should be. A <fraction> or 0 is the previous coordinate, 1 is
the current one, everything else is in between. In particular, 0.5 is the middle.
Now, what is “the previous line”? This depends on the previous path construction operation.
In the simplest case, the previous path operation was a “line-to” operation, that is, a --<coordinate>
operation:
The next case is the curve-to operation (the .. operation). In this case, the “middle” of the
curve, that is, the position 0.5 is not necessarily the point at the exact half distance on the line.
Rather, it is some point at “time” 0.5 of a point traveling from the start of the curve, where it
is at time 0, to the end of the curve, which it reaches at time 0.5. The “speed” of the point
depends on the length of the support vectors (the vectors that connect the start and end points to
the control points). The exact math is a bit complicated (depending on your point of view, of
course); you may wish to consult a good book on computer graphics and Bézier curves if you are
intrigued.
\tikz \draw (0,0) .. controls +(right:3.5cm) and +(right:3.5cm) .. (0,3) \foreach \p in {0,0.125,...,1} {node[pos=\p]{\p}};
Another interesting case are the horizontal/vertical line-to operations |- and -|. For them, the position (or
time) 0.5 is exactly the corner point.
For all other path construction operations, the position placement does not work, currently. This will hopefully
change in the future (especially for the arc operation).
sloped This option causes the node to be rotated such that a horizontal line becomes a tangent to the curve.
The rotation will always be done in such a way that text is never “upside down.” If you really need upside
down text, use [rotate=180].
\tikz \draw (0,0) .. controls +(up:2cm) and +(left:2cm) .. (1,3) \foreach \p in {0,0.25,...,1} {node[sloped,above,pos=\p]{\p}};
There exist styles for specifying positions a bit less “technically”:
style=midway is set to pos=0.5.
\tikz \draw (0,0) .. controls +(up:2cm) and +(left:3cm) .. (1,5) node[at end] {|at end|} node[very near end] {|very near end|} node[near end] {|near end|} node[midway] {|midway|} node[near start] {|near start|} node[very near start] {|very near start|} node[at start] {|at start|};
style=near start is set to pos=0.25.
style=near end is set to pos=0.75.
style=very near start is set to pos=0.125.
style=very near end is set to pos=0.875.
style=at start is set to pos=0.
style=at end is set to pos=1.
11.6.2 Implicit Use of the Position Option
When you wish to place a node on the line (0,0) -- (1,1), it is natural to specify the node not following the
(1,1), but “somewhere in the middle.” This is, indeed, possible and you can write (0,0) -- node{a} (1,1) to
place a node midway between (0,0) and (1,1).
What happens is the following: The syntax of the line-to path operation is actually --node<nodespecification><coordinate>. (It is even possible to give multiple nodes in this way.) When the optional node is
encountered, that is, when the -- is directly followed by node, then the specification(s) are read and “stored away.”
Then, after the <coordinate> has finally been reached, they are inserted again, but with the pos option
set.
There are two things to note about this: When a node specification is “stored,” its catcodes become fixed.
This means that you cannot use overly complicated verbatim text in them. If you really need, say, a
verbatim text, you will have to put it in a normal node following the coordinate and add the pos
option.
Second, which pos is chosen for the node? The position is inherited from the surrounding scope. However, this
holds only for nodes specified in this implicit way. Thus, if you add the option [near end] to a scope, this does not
mean that all nodes given in this scope will be put on near the end of lines. Only the nodes for which an implicit
pos is added will be placed near the end. Typically, this is what you want. Here are some examples that should
make this clearer:
Like the line-to operation, the curve-to operation .. also allows you to specify nodes “inside” the
operation. After both the first .. and also after the second .. you can place node specifications. Like for
the -- operation, these will be collected and then reinserted after the operation with the pos option
set.
11.7 Connecting Nodes
Once you have defined a node and given it a name, you can use this name to reference it. This can be done in two
ways, see also Section 8.5. Suppose you have said \path(0,0) node(x) {Hello World!}; in order to define a node
named x.
Once the node x has been defined, you can use (x.<anchor>) wherever you would normally use a
normal coordinate. This will yield the position at which the given <anchor> is in the picture. Note that
transformations do not apply to this coordinate, that is, (x.north) will be the northern anchor of x
even if you have said scale=3 or xshift=4cm. This is usually what you would expect.
You can also just use (x) as a coordinate. In most cases, this gives the same coordinate as (x.center).
Indeed, if the shape of x is coordinate, then (x) and (x.center) have exactly the same effect.
However, for most other shapes, some path construction operations like -- try to be “clever” when
this they are asked to draw a line from such a coordinate or to such a coordinate. When you say
(x)--(1,1), the -- path operation will not draw a line from the center of x, but from the border of x
in the direction going towards (1,1). Likewise, (1,1)--(x) will also have the line end on the border
in the direction coming from (1,1).
In addition to --, the curve-to path operation .. and the path operations -| and |- will also handle nodes
without anchors correctly. Here is an example, see also Section 8.5:
\begin{tikzpicture} \path (0,0) node (x) {Hello World!} (3,1) node[circle,draw](y) {$\int_1^2 x \mathrm d x$};
By loading library packages, you can define more shapes. Currently, the package pgflibraryshapes defines
ellipse.
The exact behaviour of these shapes differs, shapes defined for more special purposes (like a, say, transistor
shape) will have even more custom behaviors. However, there are some options that apply to most
shapes:
inner sep=<dimension> An additional (invisible) separation space of <dimension> will be added inside
the shape, between the text and the shape’s background path. The effect is as if you had added
appropriate horizontal and vertical skips at the beginning and end of the text to make it a bit “larger.”
The default inner sep is the size of a normal space.
inner xsep=<dimension> Specifies the inner separation in the x-direction, only.
inner ysep=<dimension> Specifies the inner separation in the y-direction, only.
outer sep=<dimension> This option adds an additional (invisible) separation space of <dimension> outside the
background path. The main effect of this option is that all anchors will move a little “to the
outside.”
The default for this option is half the line width. When the default is used and when the background path is
draw, the anchors will lie exactly on the “outside border” of the path (not on the path itself). When the shape
is filled, but not drawn, this may not be desirable. In this case, the outer sep should be set to zero
point.
outer xsep=<dimension> Specifies the outer separation in the x-direction, only.
outer ysep=<dimension> Specifies the outer separation in the y-direction, only.
minimum height=<dimension> This option ensures that the height of the shape (including the inner, but
ignoring the outer separation) will be at least <dimension>. Thus, if the text plus the inner separation is not at
least as large as <dimension>, the shape will be enlarged appropriately. However, if the text is already larger
than <dimension>, the shape will not be shrunk.
The coordinate shape is handled in a special way by TikZ. When a node x whose shape is coordinate is used
as a coordinate (x), this has the same effect as if you had said (x.center). None of the special “line
shortening rules” apply in this case. This can be useful since, normally, the line shortening causes
paths to be segmented and they cannot be used for filling. Here is an example that demonstrates the
difference: