diff options
Diffstat (limited to 'graphics/pgf/base/doc/pgfmanual-en-library-shapes.tex')
-rw-r--r-- | graphics/pgf/base/doc/pgfmanual-en-library-shapes.tex | 2295 |
1 files changed, 2295 insertions, 0 deletions
diff --git a/graphics/pgf/base/doc/pgfmanual-en-library-shapes.tex b/graphics/pgf/base/doc/pgfmanual-en-library-shapes.tex new file mode 100644 index 0000000000..26055b271c --- /dev/null +++ b/graphics/pgf/base/doc/pgfmanual-en-library-shapes.tex @@ -0,0 +1,2295 @@ +% Copyright 2019 by Till Tantau and Mark Wibrow +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% +% See the file doc/generic/pgf/licenses/LICENSE for more details. + + +\section{Shape Library} +\label{section-libs-shapes} + +\subsection{Overview} + +In addition to the standard shapes |rectangle|, |circle| and |coordinate|, +there exist a number of additional shapes defined in different shape libraries. +Most of these shapes have been contributed by Mark Wibrow. In the present +section, these shapes are described. Note that the library |shapes| is provided +for compatibility only. Please include sublibraries like |shapes.geometric| or +|shapes.misc| directly. + +The appearance of shapes is influenced by numerous parameters like +|minimum height| or |inner xsep|. These general parameters are documented in +Section~\ref{section-shape-common-options} + +In all of the examples presented in this section, the following |shape example| +style is used: +% +\begin{codeexample}[code only,setup code] +\tikzset{ + shape example/.style= {color = black!30, + draw, + fill = yellow!30, + line width = .5cm, + inner xsep = 2.5cm, + inner ysep = 0.5cm} +} +\end{codeexample} + + +\subsection{Predefined Shapes} +\label{section-predefined-shapes} + +The three shapes |rectangle|, |circle|, and |coordinate| are always defined and +no library needs to be loaded for them. While the |coordinate| shape defines +only the |center| anchor, the other two shapes define a standard set of +anchors. + +\begin{shape}{circle} + This shape draws a tightly fitting circle around the text. The following + figure shows the anchors this shape defines; the anchors |10| and |130| are + example of border anchors. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=circle,shape example] {Circle\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {north west/above left, north/above, north east/above right, + west/left, center/above, east/right, + mid west/right, mid/above, mid east/left, + base west/left, base/below, base east/right, + south west/below left, south/below, south east/below right, + text/left, 10/right, 130/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{rectangle} + This shape, which is the standard, is a rectangle around the text. The + inner and outer separations (see Section~\ref{section-shape-seps}) + influence the white space around the text. The following figure shows the + anchors this shape defines; the anchors |10| and |130| are example of + border anchors. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=rectangle,shape example] {Rectangle\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {north west/above left, north/above, north east/above right, + west/left, center/above, east/right, + mid west/right, mid/above, mid east/left, + base west/left, base/below, base east/right, + south west/below left, south/below, south east/below right, + text/left, 10/right, 130/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + + +\subsection{Geometric Shapes} + +\begin{pgflibrary}{shapes.geometric} + This library defines different shapes that correspond to basic geometric + objects like ellipses or polygons. +\end{pgflibrary} + +\begin{shape}{diamond} + This shape is a diamond tightly fitting the text box. The ratio between + width and height is 1 by default, but can be changed by setting the shape + aspect ratio using the following \pgfname{} key (to use this key in + \tikzname{} simply remove the \declare{|/pgf/|} path). + + \begin{key}{/pgf/aspect=\meta{value} (initially 1.0)} + The aspect is a recommendation for the quotient of the width and the + height of a shape. This key calls the macro |\pgfsetshapeaspect|. + \end{key} + + The following figure shows the anchors this shape defines; the anchors |10| + and |130| are example of border anchors. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=diamond,shape example] {Diamond\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {north west/above left, north/above, north east/above right, + west/left, center/above, east/right, + mid/above, + base/below, + south west/below left, south/below, south east/below right, + text/left, 10/right, 130/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{ellipse} + This shape is an ellipse tightly fitting the text box, if no inner + separation is given. The following figure shows the anchors this shape + defines; the anchors |10| and |130| are example of border anchors. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=ellipse,shape example] {Ellipse\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {north west/above left, north/above, north east/above right, + west/left, center/above, east/right, + mid west/right, mid/above, mid east/left, + base west/left, base/below, base east/right, + south west/below left, south/below, south east/below right, + text/left, 10/right, 130/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{trapezium} + This shape is a trapezium, that is, a quadrilateral with a single pair of + parallel lines (this can sometimes be known as a trapezoid). The trapezium + shape supports the rotation of the shape border, as described in + Section~\ref{section-rotating-shape-borders}. + + The lower internal angles at the lower corners of the trapezium can be + specified independently, and the resulting extensions are in addition to + the natural dimensions of the node contents (which includes any + |inner sep|. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[every node/.style={trapezium, draw}] + \node at (0,2) {A}; + \node[trapezium left angle=75, trapezium right angle=45] + at (0,1) {B}; + \node[trapezium left angle=120, trapezium right angle=60] + at (0,0) {C}; +\end{tikzpicture} +\end{codeexample} + + The \pgfname{} keys to set the lower internal angles of the trapezium are + shown below. To use these keys in \tikzname, simply remove the + \declare{|/pgf/|} path. + + \begin{key}{/pgf/trapezium left angle=\meta{angle} (initially 60)} + Sets the lower internal angle of the left side. + \end{key} + + \begin{key}{/pgf/trapezium right angle=\meta{angle} (initially 60)} + Sets the lower internal angle of the right side. + \end{key} + + \begin{stylekey}{/pgf/trapezium angle=\meta{angle}} + This key stores no value itself, but sets the value of the previous two + keys to \meta{angle}. + \end{stylekey} + + Regardless of the rotation of the shape border, the width and height of the + trapezium are as follows: + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[>=stealth, every node/.style={text=black}, + shape border uses incircle, shape border rotate=60] + \node [trapezium, fill=gray!25, minimum width=2cm] (t) {}; + \draw [red, <->] (t.bottom left corner) -- (t.bottom right corner) + node [midway, below right] {width}; + \draw [red, <->] (t.top side) -- (t.bottom side) + node [at start, above] {height}; +\end{tikzpicture} +\end{codeexample} + + \begin{key}{/pgf/trapezium stretches=\meta{boolean} (default true)} + This key controls whether \pgfname{} allows the width and the height of + the trapezium to be enlarged independently, when considering any + minimum size specification. This is initially |false|, ensuring that + the shape ``looks the same but bigger'' when enlarged. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\tikzset{my node/.style={trapezium, fill=#1!20, draw=#1!75, text=black}} +\begin{tikzpicture} + \draw [help lines] grid (3,2); + \node [my node=red] {A}; + \node [my node=green, minimum height=1.5cm] at (1, 1.25) {B}; + \node [my node=blue, minimum width=1.5cm] at (2, 0) {C}; +\end{tikzpicture} +\end{codeexample} + + By setting \meta{boolean} to |true|, the trapezium can be stretched + horizontally or vertically. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\tikzset{my node/.style={trapezium, fill=#1!20, draw=#1!75, text=black}} +\begin{tikzpicture} +\tikzset{trapezium stretches=true} + \draw [help lines] grid (3,2); + \node [my node=red] {A}; + \node [my node=green, minimum height=1.5cm] at (1, 1.25) {B}; + \node [my node=blue, minimum width=1.5cm] at (2, 0) {C}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/trapezium stretches body=\meta{boolean} (default true)} + This is similar to the |trapezium stretches| key except that when + \meta{boolean} is |true|, \pgfname{} enlarges only the body of the + trapezium when applying minimum width. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\tikzset{my node/.style={trapezium, fill=#1!20, draw=#1!75, text=black}} +\begin{tikzpicture} + \draw [help lines] grid (3,2); + \node [my node=red] at (1.5,.25) {A}; + \node [my node=green, minimum width=3cm, trapezium stretches] + at (1.5,1) {B}; + \node [my node=blue, minimum width=3cm, trapezium stretches body] + at (1.5,1.75) {C}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + The anchors for the trapezium are shown below. The anchor |160| is an + example of a border anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=trapezium, shape example, inner sep=1cm] + {Trapezium\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {bottom left corner/below, top right corner/right, + top left corner/left, bottom right corner/below, + bottom side/below, left side/left, + right side/right, top side/above, + center/above, text/below, mid/right, base/below, + mid west/right, base west/below, mid east/left, base east/below, + west/above, east/above, north/below, south/above, + north west/above, north east/above, + south west/below, south east/below, 160/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{semicircle} + This shape is a semicircle, which tightly fits the node contents. This + shape supports the rotation of the shape border, as described in + Section~\ref{section-rotating-shape-borders}. The anchors for the + |semicircle| shape are shown below. Anchor |30| is an example of a border + anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=semicircle,shape border rotate=0,shape example, inner sep=1cm] + {Semicircle\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {apex/above, arc start/below, arc end/below, chord center/below, + center/above, base/below, mid/right, text/left, + base west/below, base east/below, mid west/left, mid east/right, + north/below, south/above, east/above, west/above, + north west/above left, north east/above right, + south west/below, south east/below, 30/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{regular polygon} + This shape is a regular polygon, which, by default, is drawn so that a side + (rather than a corner) is always at the bottom. This shape supports the + rotation as described in Section~\ref{section-rotating-shape-borders}, but + the border of the polygon is \emph{always} constructed using the incircle, + whose radius is calculated to tightly fit the node contents (including any + |inner sep|). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture} + \foreach \a in {3,...,7}{ + \draw[red, dashed] (\a*2,0) circle(0.5cm); + \node[regular polygon, regular polygon sides=\a, draw, + inner sep=0.3535cm] at (\a*2,0) {}; + } +\end{tikzpicture} +\end{codeexample} + + If the node is enlarged to any specified minimum size, this is interpreted + as the diameter of the circumcircle, that is, the circle that passes + through all the corners of the polygon border. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture} + \foreach \a in {3,...,7}{ + \draw[blue, dashed] (\a*2,0) circle(0.5cm); + \node[regular polygon, regular polygon sides=\a, minimum size=1cm, draw] at (\a*2,0) {}; + } +\end{tikzpicture} +\end{codeexample} + + There is a \pgfname{} key to set the number of sides for the regular + polygon. To use this key in \tikzname, simply remove the \declare{|/pgf/|} + path. + + \begin{key}{/pgf/regular polygon sides=\meta{integer} (initially 5)} + \end{key} + + The anchors for a regular polygon shape are shown below. The anchor |75| is + an example of a border anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=regular polygon, shape example, inner sep=.5cm] + {Regular Polygon\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {corner 1/above, corner 2/above, corner 3/left, corner 4/right, corner 5/above, + side 1/above, side 2/left, side 3/below, side 4/right, side 5/above, + center/above, text/left, mid/right, base/below, 75/above, + west/above, east/above, north/below, south/above, + north east/below, south east/above, north west/below, south west/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{star} + This shape is a star, which by default (minus any transformations) is drawn + with the first point pointing upwards. This shape supports the rotation as + described in Section~\ref{section-rotating-shape-borders}, but the border + of the star is \emph{always} constructed using the incircle. + + A star should be thought of as having a set of ``inner points'' and ``outer + points''. The inner points of the border are based on the radius of the + circle which tightly fits the node contents, and the outer points are based + on the circumcircle, the circle that passes through every outer point. Any + specified minimum size, width or height, is interpreted as the diameter of + the circumcircle. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture} + \draw [help lines] (0,0) grid (2,2); + \draw [blue, dashed] (1,1) circle(1cm); + \draw [red, dashed] (1,1) circle(.5cm); + \node [star, star point height=.5cm, minimum size=2cm, draw] + at (1,1) {S}; +\end{tikzpicture} +\end{codeexample} + + The \pgfname{} keys to set the number of star points, and the height of the + star points, are shown below. To use these keys in \tikzname, simply remove + the \declare{|/pgf/|} path. + + \begin{key}{/pgf/star points=\meta{integer} (initially 5)} + Sets the number of points for the star. + \end{key} + + \begin{key}{/pgf/star point height=\meta{distance} (initially .5cm)} + Sets the height of the star points. This is the distance between the + inner point and outer point radii. If the star is enlarged to some + specified minimum size, the inner radius is increased to maintain the + point height. + \end{key} + + \begin{key}{/pgf/star point ratio=\meta{number} (initially 1.5)} + Sets the ratio between the inner point and outer point radii. If the + star is enlarged to some specified minimum size, the inner radius is + increased to maintain the ratio. + \end{key} + + The inner and outer points form the principal anchors for the star, as + shown below (anchor |75| is an example of a border anchor). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=star, star points=5, star point ratio=1.65, shape example, inner sep=1.5cm] + {Star\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {inner point 1/above, inner point 2/above, inner point 3/below, inner point 4/right, + inner point 5/above, outer point 1/above, outer point 2/above, outer point 3/left, + outer point 4/right, outer point 5/above, + center/above, text/left, mid/right, base/below, 75/above, + west/above, east/above, north/below, south/above, + north east/below, south east/above, north west/below, south west/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{isosceles triangle} + This shape is an isosceles triangle, which supports the rotation of the + shape border, as described in Section~\ref{section-rotating-shape-borders}. + The angle of rotation determines the direction in which the apex of the + triangle points (provided no other transformations are applied). However, + regardless of the rotation of the shape border, the width and height are + always considered as follows: + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[>=stealth, every node/.style={text=black}, + shape border uses incircle, shape border rotate=-30] + \node [isosceles triangle, fill=gray!25, minimum width=1.5cm] (t) {}; + \draw [red, <->] (t.left corner) -- (t.right corner) + node [midway, above left] {width}; + \draw [red, <->] (t.apex) -- (t.lower side) + node [midway, above right] {height}; +\end{tikzpicture} +\end{codeexample} + + There are \pgfname{} keys to customize this shape. To use these keys in + \tikzname, simply remove the \declare{|/pgf/|} path. + + \begin{key}{/pgf/isosceles triangle apex angle=\meta{angle} (initially 30)} + Sets the angle of the apex of the isosceles triangle. + \end{key} + + \begin{key}{/pgf/isosceles triangle stretches=\meta{boolean} (default true)} + By default \meta{boolean} is |false|. This means, that when applying + any minimum width or minimum height requirements, increasing the height + will increase the width (and vice versa), in order to keep the apex + angle the same. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[paint/.style={draw=#1!75, fill=#1!20}] + \tikzset{every node/.style={isosceles triangle, draw, inner sep=0pt, + anchor=left corner, shape border rotate=90}} + \draw[help lines] grid(4,2); + \foreach \a/\c in {1.5/blue, 1/green, 0.5/red}{ + \node[paint=\c, minimum height=\a cm] at (0,0) {}; + \node[paint=\c, minimum width=\a cm] at (2,0) {}; + } +\end{tikzpicture} +\end{codeexample} + + However, by setting \meta{boolean} to |true|, minimum width and height + can be applied independently. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[paint/.style={draw=#1!75, fill=#1!20}] + \tikzset{every node/.style={isosceles triangle, draw, inner sep=0pt, + anchor=south, shape border rotate=90, isosceles triangle stretches}} + \draw[help lines] grid(4,2); + \foreach \a/\c in {1.5/blue, 1/green, 0.5/red}{ + \node[paint=\c, minimum height=\a cm, minimum width=1.5cm] at (0.75,0) {}; + \node[paint=\c, minimum width=\a cm, minimum height=1.5cm] at (3,0) {}; + } +\end{tikzpicture} +\end{codeexample} + \end{key} + + The anchors for the |isosceles triangle| are shown below (anchor |150| is + an example of a border anchor). Note that, somewhat confusingly, the anchor + names such as |left side| and |right corner| are named as if the triangle + is rotated to 90 degrees. Note also that the |center| anchor does not + necessarily correspond to any kind of geometric center. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=isosceles triangle, shape example, inner xsep=1cm] + {Isosceles Triangle\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {apex/above, left corner/right, right corner/right, + left side/above, right side/below, lower side/right, + center/above, text/right, 150/above, + mid/right, mid west/above, mid east/right, + base/below, base west/below, base east/below, + west/above, east/below, north/below, south/above, + north west/below, north east/below, + south west/above, south east/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\par\leavevmode +\begin{shape}{kite} + This shape is a kite, which supports the rotation of the shape border, as + described in Section~\ref{section-rotating-shape-borders}. There are + \pgfname{} keys to specify the upper and lower vertex angles of the kite. + To use these keys in \tikzname, simply remove the \declare{|/pgf/|} path. + + \begin{key}{/pgf/kite upper vertex angle=\meta{angle} (initially 120)} + Sets the upper internal angle of the kite. + \end{key} + + \begin{key}{/pgf/kite lower vertex angle=\meta{angle} (initially 60)} + Sets the lower internal angle of the kite. + \end{key} + + \begin{key}{/pgf/kite vertex angles=\meta{angle specification}} + This key sets the keys for both the upper and lower vertex angles (it + stores no value itself). \meta{angle specification} can be pair of + angles in the form \meta{upper angle} |and| \meta{lower angle}, or a + single angle. In this latter case, both the upper and lower vertex + angles will be the same. + \end{key} + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[every node/.style={kite, draw}] + \node[kite upper vertex angle=135, kite lower vertex angle=70] at (0,0) {A}; + \node[kite vertex angles=90 and 45] at (1,0) {B}; + \node[kite vertex angles=60] at (2,0) {C}; +\end{tikzpicture} +\end{codeexample} + + The anchors for the |kite| are shown below. Anchor |110| is an example of a + border anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=kite, shape example, inner sep=1.5cm] + {Kite\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {upper vertex/above, left vertex/above, lower vertex/below, + right vertex/above, upper left side/above, upper right side/above, + lower left side/below, lower right side/below, + center/above, text/left, mid/right, base/below, + mid west/left, base west/below, mid east/right, base east/below, + west/above, east/above, north/below, south/above, + north west/left, north east/right, + south west/above, south east/above, 110/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{dart} + This shape is a dart (which can also be known as an arrowhead or concave + kite). This shape supports the rotation of the shape border, as described + in Section~\ref{section-rotating-shape-borders}. The angle of the border + rotation determines the direction in which the dart points (unless other + transformations have been applied). + + There are \pgfname{} keys to set the angle for the `tip' of the dart and + the angle between the `tails' of the dart. To use these keys in \tikzname, + simply remove the \declare{|/pgf/|} path. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture} + \node[dart, draw, gray, shape border uses incircle, shape border rotate=45] + (d) {dart}; + \draw [<->] (d.tip)++(202.5:.5cm) arc(202.5:247.5:.5cm); + \node [left=.5cm] at (d.tip) {tip angle}; + \draw [<->] (d.tail center)++(157.5:.5cm) arc(157.5:292.5:.5cm); + \node [right] at (d.tail center) {tail angle}; +\end{tikzpicture} +\end{codeexample} + + \begin{key}{/pgf/dart tip angle=\meta{angle} (initially 45)} + Sets the angle at the tip of the dart. + \end{key} + + \begin{key}{/pgf/dart tail angle=\meta{angle} (initially 135)} + Sets the angle between the tails of the dart. + \end{key} + + The anchors for the |dart| shape are shown below (note that the shape is + rotated 90 degrees anti-clockwise). Anchor |110| is an example of a border + anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=dart, shape border rotate=90, shape example, inner sep=1.25cm] + {Dart\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {tip/above, tail center/below, right tail/below, + left tail/below, right tail/below, left side/left, right side/right, + center/above, text/left, mid/right, base/below, + mid west/left, base west/below, mid east/right, base east/below, + west/above, east/above, north/below, south/above, + north west/left, north east/right, south west/above, south east/above, + 110/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{circular sector} + This shape is a circular sector (which can also be known as a wedge). This + shape supports the rotation of the shape border, as described in + Section~\ref{section-rotating-shape-borders}. The angle of the border + rotation determines the direction in which the `apex' of the sector points + (unless other transformations have been applied). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[ + every node/.style={circular sector, shape border uses incircle, draw}, +] + \node at (0,0) {A}; + \node [shape border rotate=30] at (1.5,0) {A}; +\end{tikzpicture} +\end{codeexample} + + There is a \pgfname{} key to set the central angle of the sector, which is + expected to be less than 180 degrees. To use this key in \tikzname, simply + remove the \declare{|/pgf/|} path. + + \begin{key}{/pgf/circular sector angle=\meta{angle} (initially 60)} + Sets the central angle of the sector. + \end{key} + + The anchors for the circular sector shape are shown below. Anchor |30| is + an example of a border anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=circular sector, style=shape example, inner sep=1cm] + {Circular Sector\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {sector center/above, arc start/below, arc end/below, arc center/below, + center/above, base/below, mid/right, text/below, + north/below, south/above, east/below, west/above, + north west/above left, north east/above right, + south west/below, south east/below, 30/right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{cylinder} + This shape is a 2-dimensional representation of a cylinder, which supports + the rotation of the shape border as described in + Section~\ref{section-rotating-shape-borders}. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture} + \node[cylinder, draw, shape aspect=.5] {ABC}; +\end{tikzpicture} +\end{codeexample} + + Regardless the rotation of the shape border, the height is always the + distance between the curved ends, and the width is always the distance + between the straight sides. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[>=stealth] + \node [cylinder, gray!50, rotate=30, draw, + minimum height=2cm, minimum width=1cm] (c) {Cylinder}; + \draw[red, <->] (c.top) -- (c.bottom) + node [at end, below, black] {height}; + \draw[red, <->] (c.north) -- (c.south) + node [at start, above, black] {width}; +\end{tikzpicture} +\end{codeexample} + + Enlarging the shape to some minimum height will stretch only the body of + the cylinder. By contrast, enlarging the shape to some minimum width will + stretch the curved ends. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[shape aspect=.5] + \tikzset{every node/.style={cylinder, shape border rotate=90, draw}} + \node [minimum height=1.5cm] {A}; + \node [minimum width=1.5cm] at (1.5,0) {B}; +\end{tikzpicture} +\end{codeexample} + + There are various keys to customize this shape (to use \pgfname{} keys in + \tikzname{}, simply remove the \declare{|/pgf/|} path). + + \begin{key}{/pgf/aspect=\meta{value} (initially 1.0)} + The aspect is a recommendation for the quotient of the radii of the + cylinder end. This may be ignored if the shape is enlarged to some + minimum width. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[] + \tikzset{every node/.style={cylinder, shape border rotate=90, draw}} + \node [aspect=1.0] {A}; + \node [aspect=0.5] at (1,0) {B}; + \node [aspect=0.25] at (2,0) {C}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/cylinder uses custom fill=\meta{boolean} (default true)} + This enables the use of a custom fill for the body and the end of the + cylinder. The background path for the shape should not be filled (e.g., + in \tikzname{}, the |fill| option for the node must be implicitly or + explicitly set to |none|). Internally, this key sets the \TeX-if + |\ifpgfcylinderusescustomfill| appropriately. + \end{key} + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\begin{tikzpicture}[aspect=0.5] + \node [cylinder, cylinder uses custom fill, cylinder end fill=red!50, + cylinder body fill=red!25] {Cylinder}; +\end{tikzpicture} +\end{codeexample} + + \begin{key}{/pgf/cylinder end fill=\meta{color} (initially white)} + Sets the color for the end of the cylinder. + \end{key} + + \begin{key}{/pgf/cylinder body fill=\meta{color} (initially white)} + Sets the color for the body of the cylinder. + \end{key} + + The anchors of this shape are shown below (anchor |160| is an example of a + border anchor). Note that the cylinder shape does not distinguish between + |outer xsep| and |outer ysep|. Only the larger of the two values is used + for the shape. Note also the difference between the |center| and + |shape center| anchors: |center| is the center of the cylinder body and + also the center of rotation. The |shape center| is the center of the shape + which includes the 2-dimensional representation of the cylinder top. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.geometric}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=cylinder, shape example, aspect=.5, inner xsep=3cm, + inner ysep=1cm] {Cylinder\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {before top/above, top/above, after top/below, + before bottom/below, bottom/above, after bottom/above, + mid/right, mid west/right, mid east/left, + base/below, base west/below, base east/below, + center/above, text/above, shape center/right, + west/right, east/left, north/above, south/below, + north west/below, north east/above, + south west/above, south east/below, 160/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + + +\subsection{Symbol Shapes} + +\begin{pgflibrary}{shapes.symbols} + This library defines shapes that can be used for drawing symbols like a + forbidden sign or a cloud. +\end{pgflibrary} + +\begin{shape}{correct forbidden sign} + This shape places the node inside a circle with a diagonal from the upper + left to the lower right added. The circle is part of the background, the + diagonal line part of the foreground path; thus, the diagonal line is on + top of the text. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + \node [correct forbidden sign,line width=1ex,draw=red,fill=white] {Smoking}; +\end{tikzpicture} +\end{codeexample} + + The shape inherits all anchors from the |circle| shape. +\end{shape} + +\begin{shape}{forbidden sign} + This shape is like |correct forbidden sign|, only the line goes from the + lower left to the upper right. The strange naming of these shapes is for + historical reasons. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + \node [forbidden sign,line width=1ex,draw=red,fill=white] {Smoking}; +\end{tikzpicture} +\end{codeexample} + + The shape inherits all anchors from the |circle| shape. +\end{shape} + +\begin{shape}{magnifying glass} + This shape places the node inside a circle with a handle attached to the + node. The angle of the handle and its length can be adjusted using two + keys: + + \begin{key}{/pgf/magnifying glass handle angle fill=\meta{degree} (default -45)} + The angle of the handle. + \end{key} + + \begin{key}{/pgf/magnifying glass handle angle aspect=\meta{factor} (default 1.5)} + The length of the handle as a multiple of the circle radius. + \end{key} + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + \node [magnifying glass,line width=1ex,draw] {huge}; +\end{tikzpicture} +\end{codeexample} + % + The shape inherits all anchors from the |circle| shape. +\end{shape} + +\begin{shape}{cloud} + This shape is a cloud, drawn to tightly fit the node contents (strictly + speaking, using an ellipse which tightly fits the node contents -- + including any |inner sep|). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + \node[cloud, draw, fill=gray!20, aspect=2] {ABC}; + \node[cloud, draw, fill=gray!20] at (1.5,0) {D}; +\end{tikzpicture} +\end{codeexample} + + A cloud should be thought of as having a number of ``puffs'', which are the + individual arcs drawn around the border. There are \pgfname{} keys to + specify how the cloud is drawn (to use these keys in \tikzname{}, simply + remove the \declare{|/pgf/|} path). + + \begin{key}{/pgf/cloud puffs=\meta{integer} (initially 10)} + Sets the number of puffs for the cloud. + \end{key} + + \begin{key}{/pgf/cloud puff arc=\meta{angle} (initially 135)} + Sets the length of the puff arc (in degrees). A shorter arc can produce + better looking joins between puffs for larger line widths. + \end{key} + + Like the diamond shape, the cloud shape also uses the \declare{|aspect|} + key to determine the ratio of the width and the height of the cloud. + However, there may be circumstances where it may be undesirable to + continually specify the |aspect| for the cloud. Therefore, the following + key is implemented: + + \begin{key}{/pgf/cloud ignores aspect=\meta{boolean} (default true)} + Instruct \pgfname{} to ignore the |aspect| key. Internally, the \TeX-if + |\ifpgfcloudignoresaspect| is set appropriately. The initial value is + |false|. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture}[aspect=1, every node/.style={cloud, cloud puffs=11, draw}] + \node [fill=gray!20] {rain}; + \node [cloud ignores aspect, fill=white] at (1.5,0) {snow}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + Any minimum size requirements are applied to the ``circum-ellipse'', which + is the ellipse which passes through all the midpoints of the puff arcs. + These requirements are considered \emph{after} any aspect specification is + applied. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + \draw [help lines] grid (3,2); + \draw [blue, dashed] (1.5, 1) ellipse (1.5cm and 1cm); + \node [cloud, cloud puffs=9, draw, minimum width=3cm, minimum height=2cm] + at (1.5, 1) {}; +\end{tikzpicture} +\end{codeexample} + + The anchors for the cloud shape are shown below for a cloud with eleven + puffs. Anchor 70 is an example of a border anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=cloud, style=shape example, cloud puffs=11, aspect=1.5, + cloud puff arc=120,inner ysep=1cm] {Cloud\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {puff 1/above, puff 2/above, puff 3/above, puff 4/below, + puff 5/left, puff 6/below, puff 7/below, puff 8/right, + puff 9/below, puff 10/above, puff 11/above, 70/right, + center/above, base/below, mid/right, text/left, + north/below, south/below, east/above, west/above, + north west/left, north east/right, + south west/below, south east/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{starburst} + This shape is a randomly generated elliptical star, which supports the + rotation of the shape border as described in + Section~\ref{section-rotating-shape-borders}. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + \node[starburst, fill=yellow, draw=red, line width=2pt] {\bf BANG!}; +\end{tikzpicture} +\end{codeexample} + % + Like the |star| shape, the starburst should be thought of as having a set + of inner points and outer points. The inner points lie on the ellipse which + tightly fits the node contents (including any |inner sep|). + + Using a specified `starburst point height' value, the outer points are + generated randomly between this value and one quarter of this value. For a + given starburst shape, the angle between each point is fixed, and is + determined by the number of points specified for the starburst. + + It is important to note that, whilst the maximum possible point height is + used to calculate minimum width or height requirements, the outer points + are randomly generated, so there is (unfortunately) no guarantee that any + such requirements will be fully met. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + \draw[help lines] grid(3,2); + \node[starburst, draw, minimum width=3cm, minimum height=2cm] + at (1.5, 1) {\bf BOOM!}; +\end{tikzpicture} +\end{codeexample} + + There are \pgfname{} keys to control the drawing of the starburst shape. To + use these keys in \tikzname, simply remove the \declare{|/pgf/|} path. + + \begin{key}{/pgf/starburst points=\meta{integer} (initially 17)} + Sets the number of outer points for the starburst. + \end{key} + % + \begin{key}{/pgf/starburst point height=\meta{length} (initially .5cm)} + Sets the \emph{maximum} distance between the inner point radius and the + outer point radius. + \end{key} + + \begin{key}{/pgf/random starburst=\meta{integer} (initially 100)} + Sets the seed for the random number generator for creating the + starburst. The maximum value for \meta{integer} is |16383|. If + \meta{integer}|=0|, the random number generator will not be used, and + the maximum point height will be used for all outer points. If + \meta{integer} is omitted, a seed will be randomly chosen. + \end{key} + + The basic anchors for a nine point |starburst| shape are shown below. + Anchor |80| is an example of a border anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=starburst, starburst points=9, starburst point height=3.5cm, + style=shape example,inner sep=1cm] + {Starburst\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {outer point 1/above, outer point 2/above, outer point 3/right, + outer point 4/above, outer point 5/below, outer point 6/above, + outer point 7/left, outer point 8/above, outer point 9/above, + inner point 1/below, inner point 2/above, inner point 3/left, + inner point 4/above, inner point 5/above, inner point 6/above, + inner point 7/below, inner point 8/above, inner point 9/below, + center/above, text/left, mid/right, base/below, 80/above, + north/below, south/below, east/left, west/right, + north east/below, south west/below, south east/below, north west/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{signal} + This shape is a ``signal'' or sign shape, that is, a rectangle, with + optionally pointed sides. A signal can point ``to'' somewhere, with outward + points in that direction. It can also be ``from'' somewhere, with inward + points from that direction. The resulting points extend the node contents + (which include the |inner sep|). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + [every node/.style={signal, draw, text=white, signal to=nowhere}] + \node[fill=green!65!black, signal to=east] at (0,1) {To East}; + \node[fill=red!65!black, signal from=east] at (0,0) {From East}; +\end{tikzpicture} +\end{codeexample} + + There are \pgfname{} keys for drawing the signal shape (to use these keys + in \tikzname{}, simply remove the \declare{|/pgf/|} path): + + \begin{key}{/pgf/signal pointer angle=\meta{angle} (initially 90)} + Sets the angle for the pointed sides of the shape. This angle is + maintained when enforcing any minimum size requirements, so + any adjustment to the width will affect the height, and vice versa. + \end{key} + + \begin{key}{/pgf/signal from=\meta{direction}\space\opt{and \meta{opposite direction}} (initially nowhere)} + Sets which sides take an inward pointer (i.e., that points towards the + center of the shape). The possible values for \meta{direction} and + \meta{opposite direction} are the compass point directions |north|, + |south|, |east| and |west| (or |above|, |below|, |right| and |left|). + An additional keyword |nowhere| can be used to reset the sides so they + have no pointers. When used with |signal from| key, this only resets + inward pointers; used with the |signal to| key, it only resets outward + pointers. + \end{key} + + \begin{key}{/pgf/signal to=\meta{direction}\space\opt{and \meta{opposite direction}} (initially east)} + Sets which sides take an outward pointer (i.e., that points away from + the shape). + \end{key} + + Note that \pgfname{} will ignore any instruction to use directions that are + not opposites (so using the value |east and north|, will result in only + |north| being assigned a pointer). This is also the case if non-opposite + values are used in the |signal to| and |signal from| keys at the same time. + So, for example, it is not possible for a signal to have an outward point + to the left, and also have an inward point from below. + + The anchors for the signal shape are shown below. Anchor |70| is an example + of a border anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=signal, signal from=west, shape example, inner sep=2cm] + {Signal\vrule width1pt height2cm}; + \foreach \anchor/\placement in + {text/left, center/above, 70/above, + base/below, base east/below, base west/below, + mid/right, mid east/above left, mid west/above left, + north/above, south/below, + east/above, west/above, + north west/above, north east/above, + south west/below, south east/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{tape} + This shape is a rectangle with optional, ``bendy'' top and bottom sides, + which tightly fits the node contents (including the |inner sep|). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture} + \node[tape, draw]{ABCD}; + \node[tape, draw, tape bend top=none] at (1.5, 0) {EFGH}; +\end{tikzpicture} +\end{codeexample} + + There are \pgfname{} keys to specify which sides bend and how high the + bends are (to use these keys in \tikzname{}, simply remove the + \declare{|/pgf/|} path): + + \begin{key}{/pgf/tape bend top=\meta{bend style} (initially in and out)} + Specifies how the top side bends. The \meta{bend style} is either + |in and out|, |out and in| or |none| (i.e., a straight line). The + bending sides are drawn in a clockwise direction, and using the bend + style |in and out| will mean the side will first bend inwards and then + bend outwards. The opposite holds true for |out and in|. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture}[-stealth] + \node[tape, draw, gray, minimum width=2cm](t){Tape}; + \draw [blue]([yshift=5pt] t.north west) -- ([yshift=5pt]t.north east) + node[midway, above, black]{in and out}; + \draw [blue]([yshift=-5pt]t.south east) -- ([yshift=-5pt]t.south west) + node[sloped, allow upside down, midway, above, black]{in and out}; +\end{tikzpicture} +\end{codeexample} + + This might take a bit of getting used to, but just remember that when + you want the bendy sides to be parallel, the sides take the same bend + style. It is possible for the top and bottom sides to take opposite + bend styles, but the author of this shape cannot think of a single use + for such a combination. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture}[every node/.style={tape, draw}] + \node [tape bend top=out and in, tape bend bottom=out and in] {Parallel}; + \node at (2,0) [tape bend bottom=out and in] {Why?}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/tape bend bottom=\meta{bend style} (initially in and out)} + Specifies how the bottom side bends. + \end{key}% + + \begin{key}{/pgf/tape bend height=\meta{length} (initially 5pt)} + Sets the total height for a side with a bend. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture}[>=stealth] + \draw [help lines] grid(3,2); + \node [tape, fill, minimum size=2cm, red!50, tape bend top=none, + tape bend height=1cm] at (1.5,1.5) (t) {}; + \draw [|<->|, blue] (1.5,0) -- (1.5,1) + node [at end, above, black]{tape bend height}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + The anchors for the tape shape are shown below. Anchor |60| is an example + of a border anchor. Note that border anchors will snap to the center of + convex curves (i.e.\ when bending in). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=tape, tape bend height=1cm, shape example, inner xsep=3cm] + {Tape\vrule width1pt height2cm}; + \foreach \anchor/\placement in + {text/left, center/above, 60/above, + base/below, base east/below, base west/below, + mid/right, mid east/left, mid west/right, + north/above, south/below, east/above, west/above, + north west/above, north east/above, + south west/below, south east/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{magnetic tape} + This shape represents a `magnetic tape' or any sequential data store that + is sometimes used in flowcharts. It is essentially a circle with a little + tail: + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\tikz\node [magnetic tape, draw] (A) {A}; +\end{codeexample} + + The following keys can be used to customise the |magnetic tape| shape: + + \begin{key}{/pgf/magnetic tape tail extend=\meta{distance} (initially 0cm)} + This key sets how far the tail extends beyond the radius of the tape. + Negative values will be ignored. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture}[every node/.style={magnetic tape, draw}] + \node [magnetic tape tail extend=0cm] at (0,0) {A}; + \node [magnetic tape tail extend=0.25cm] at (0,1) {B}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/magnetic tape tail=\meta{proportion} (initially 0.15)} + This key sets the thickness of the `tail' to be \meta{proportion} times + the radius of the shape. The \meta{proportion} should be between |0.0| + and |1.0|. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\begin{tikzpicture}[every node/.style={magnetic tape, draw}] + \node [magnetic tape tail=0.5, magnetic tape tail extend=0.5cm] {A}; + \node [magnetic tape tail=0.25] at (0,1) {B}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + The following figure shows the anchors this shape defines; the anchors 10 + and 130 are example of border anchors. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.symbols}}] +\Huge +\begin{tikzpicture} +\node[name=s,shape=magnetic tape,shape example,inner sep=0.75cm, +magnetic tape tail extend=0.5cm] + {Magnetic Tape\vrule width 1pt height 2cm}; +\foreach \anchor/\placement in + {north west/above left, north/above, north east/above right, + west/left, center/above, east/right, + mid west/right, mid/right, mid east/left, + base west/below, base/below, base east/right, + south west/below left, south/below, south east/left, + text/left, 10/right, 130/above, + tail east/right, tail south east/below, tail north east/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + + +\subsection{Arrow Shapes} + +\begin{pgflibrary}{shapes.arrows} + This library defines arrow shapes. Note that an arrow shape is something + quite different from a (normal) arrow tip: It is a shape that just + ``happens'' to ``look like'' an arrow. In particular, you cannot use these + shapes as arrow tips. +\end{pgflibrary} + +\begin{shape}{single arrow} + This shape is an arrow, which tightly fits the node contents (including any + |inner sep|). This shape supports the rotation of the shape border, as + described in Section~\ref{section-rotating-shape-borders}. The angle of + rotation determines in which direction the arrow points (provided no other + rotational transformations are applied). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture}[every node/.style={single arrow, draw}, + rotate border/.style={shape border uses incircle, shape border rotate=#1}] + \node {right}; + \node at (2,0) [shape border rotate=90]{up}; + \node at (1,1) [rotate border=37, inner sep=0pt]{$37^\circ$}; +\end{tikzpicture} +\end{codeexample} + + Regardless of the rotation of the arrow border, the width is measured + between the back ends of the arrow head, and the height is measured from + the arrow tip to the end of the arrow tail. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture}[>=stealth, + rotate border/.style={shape border uses incircle, shape border rotate=#1}] + \node[rotate border=-30, fill=gray!25, minimum height=3cm, single arrow, + single arrow head extend=.5cm, single arrow head indent=.25cm] (arrow) {}; + \draw[red, <->] (arrow.before tip) -- (arrow.after tip) + node [near end, left, black] {width}; + \draw[red, <->] (arrow.tip) -- (arrow.tail) + node [near end, below left, black] {height}; +\end{tikzpicture} +\end{codeexample} + + There are \pgfname{} keys that can be used to customize this shape (to use + these keys in \tikzname{}, simply remove the \declare{|/pgf/|} path). + + \begin{key}{/pgf/single arrow tip angle=\meta{angle} (initially 90)} + Sets the angle for the arrow tip. Enlarging the arrow to some minimum + width may increase the height of the shape to maintain this angle. + \end{key} + + \begin{key}{/pgf/single arrow head extend=\meta{length} (initially .5cm)} + This sets the distance between the tail of the arrow and the outer end + of the arrow head. This may change if the shape is enlarged to some + minimum width. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture} + \node[single arrow, draw, single arrow head extend=.5cm, gray!50, rotate=60] + (a) {Arrow}; + \draw[red, |<->|] (a.before tip) -- (a.before head) + node [midway, below, sloped, black] {head extend}; +\end{tikzpicture} +\end{codeexample} +\end{key} + + \begin{key}{/pgf/single arrow head indent=\meta{length} (initially 0cm)} + This moves the point where the arrow head joins the shaft of the arrow + \emph{towards} the arrow tip, by \meta{length}. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture}[every node/.style={single arrow, draw=none, rotate=60}] + \node [fill=red!50] {arrow 1}; + \node [fill=blue!50, single arrow head indent=1ex] at (1.5,0) {arrow 2}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + The anchors for this shape are shown below (anchor |20| is an example of a + border anchor). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=single arrow, shape example, single arrow head extend=1.5cm] + {Single Arrow\vrule width1pt height2cm}; + \foreach \anchor/\placement in + {text/above, center/above, 20/above, + mid west/left, mid/above, mid east/above left, + base west/below, base/below, base east/below, + tip/above, before tip/above, after tip/below, before head/above, + after head/below, after tail/above, before tail/below, tail/right, + north/above, south/below, east/below, west/above, + north west/above, north east/below, south west/below, south east/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{double arrow} + This shape is a double arrow, which tightly fits the node contents + (including any |inner sep|), and supports the rotation of the shape border, + as described in Section~\ref{section-rotating-shape-borders}. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture}[every node/.style={double arrow, draw}] + \node [double arrow, draw] {Left or Right}; +\end{tikzpicture} +\end{codeexample} + + The double arrow behaves exactly like the single arrow, so you need to + remember that the width is \emph{always} the distance between the back ends + of the arrow heads, and the height is \emph{always} the tip-to-tip + distance. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture}[>=stealth, + rotate border/.style={shape border uses incircle, shape border rotate=#1}] + \node[rotate border=210, fill=gray!25, minimum height=3cm, double arrow, + double arrow head extend=.5cm, double arrow head indent=.25cm] (arrow) {}; + \draw[red, <->] (arrow.before tip 1) -- (arrow.after tip 1) + node [near start, right, black] {width}; + \draw[red, <->] (arrow.tip 1) -- (arrow.tip 2) + node [near end, above left, black] {height}; +\end{tikzpicture} +\end{codeexample} + + The \pgfname{} keys that can be used to customize the double arrow behave + similarly to the keys for the single arrow (to use these keys in + \tikzname{}, simply remove the \declare{|/pgf/|} path). + + \begin{key}{/pgf/double arrow tip angle=\meta{angle} (initially 90)} + Sets the angle for the arrow tip. Enlarging the arrow to some minimum + width may increase the height of the shape to maintain this angle. + \end{key} + + \begin{key}{/pgf/double arrow head extend=\meta{length} (initially .5cm)} + This sets the distance between the shaft of the arrow and the outer end + of the arrow heads. This may change if the shape is enlarged to some + minimum width. + \end{key} + + \begin{key}{/pgf/double arrow head indent=\meta{length} (initially 0cm)} + This moves the point where the arrow heads join the shaft of the arrow + \emph{towards} the arrow tips, by \meta{length}. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture}[every node/.style={double arrow, draw=none, rotate=-60}] + \node [fill=red!50] {arrow 1}; + \node [fill=blue!50, double arrow head indent=1ex] at (1.5,0) {arrow 2}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + The anchors for this shape are shown below (anchor |20| is an example of a + border anchor). + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=double arrow, double arrow head extend=1.5cm, shape example, inner xsep=2cm] + {Double Arrow\vrule width1pt height2cm}; + \foreach \anchor/\placement in + {text/above, center/above, 20/above, + mid west/above right, mid/above, mid east/above left, + base west/below, base/below, base east/below, + before head 1/above, before tip 1/above, tip 1/above, after tip 1/below, after head 1/below, + before head 2/above, before tip 2/below, tip 2/above, after tip 2/above, after head 2/below, + north/above, south/below, east/below, west/below, + north west/below, north east/below, south west/above, south east/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{arrow box} + This shape is a rectangle with optional arrows which extend from the four + sides. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture} + \node[arrow box, draw] {A}; + \node[arrow box, draw, arrow box arrows={north:.5cm, west:0.75cm}] + at (2,0) {B}; +\end{tikzpicture} +\end{codeexample} + + Any minimum size requirements are applied to the main rectangle + \emph{only}. This does not pose too many problems if you wish to + accommodate the length of the arrows, as it is possible to specify the + length of each arrow independently, from either the border of the rectangle + (the default) or the center of the rectangle. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\begin{tikzpicture} + \tikzset{box/.style={arrow box, fill=#1}} + \draw [help lines] grid(3,2); + \node[box=blue!50, arrow box arrows={east:2cm}] at (1,1.5){One}; + \node[box=red!50, arrow box arrows={east:2cm from center}] at (1,0.5){Two}; +\end{tikzpicture} +\end{codeexample} + + There are various \pgfname{} keys for drawing this shape (to use these keys + in \tikzname, simply remove the \declare{/pgf/} path). + +\begin{key}{/pgf/arrow box tip angle=\meta{angle} (initially 90)} + Sets the angle at the arrow tip for all four arrows. +\end{key} + +\begin{key}{/pgf/arrow box head extend=\meta{length} (initially .125cm)} + Sets the distance the arrow head extends away from the shaft of the arrow. + This applies to all arrows. +\end{key} + +\begin{key}{/pgf/arrow box head indent=\meta{length} (initially 0cm)} + Moves the point where the arrow head joins the shaft of the arrow + \emph{towards} the arrow tip. This applies to all arrows. +\end{key} + +\begin{key}{/pgf/arrow box shaft width=\meta{length} (initially .125cm)} + Sets the width of the shaft of all arrows. +\end{key} + +\begin{key}{/pgf/arrow box north arrow=\meta{distance} (initially .5cm)} + Sets the distance the north arrow extends from the node. By default this is + from the border of the shape, but by using the additional keyword + |from center|, the distance will be measured from the center of the shape. + If \meta{distance} is |0pt| or a negative distance, the arrow will not be + drawn. +\end{key} + +\begin{key}{/pgf/arrow box south arrow=\meta{distance} (initially .5cm)} + Sets the distance the south arrow extends from the node. +\end{key} + +\begin{key}{/pgf/arrow box east arrow=\meta{distance} (initially .5cm)} + Sets the distance the east arrow extends from the node. +\end{key} + +\begin{key}{/pgf/arrow box west arrow=\meta{distance} (initially .5cm)} + Sets the distance the west arrow extends from the node. +\end{key} + +\begin{key}{/pgf/arrow box arrows={\ttfamily\char`\{}\meta{list}{\ttfamily\char`\}}} + Sets the distance that all arrows extend from the node. The specification + in \meta{list} consists of the four compass points |north|, |south|, |east| + or |west|, separated by commas (so the list must be contained within + braces). The distances can be specified after each side separated by a + colon (e.g., |north:1cm|, or |west:5cm from center|). If an item specifies + no distance, the most recently specified distance will be used (at the + start of the list this is |0cm|, so the first item in the list should + specify a distance). Any sides not specified will not be drawn with an + arrow. +\end{key} + +The anchors for this shape are shown below (unfortunately, due to its size, +this example must be rotated). Anchor |75| is an example of a border anchor. If +a side is drawn without an arrow, the anchors for that arrow should be +considered unavailable. They are (unavoidably) defined, but default to the +center of the appropriate side. +% +\begin{codeexample}[preamble={\usetikzlibrary{shapes.arrows}}] +\Huge +\begin{tikzpicture} + \node[shape=arrow box, shape example, inner xsep=1cm, inner ysep=1.5cm, arrow box shaft width=2cm, + arrow box arrows={north:3.5cm from border, south, east:5cm from border, west}, + arrow box head extend=0.75cm, rotate=-90](s) {Arrow Box\vrule width1pt height2cm}; + \foreach \anchor/\placement in + {center/above, text/above, mid/right, base/below, 75/above, + mid east/right, mid west/left, base east/right, base west/left, + north/below, south/below, east/below, west/below, + north east/above, south east/above, south west/below, north west/below, + north arrow tip/above,south arrow tip/above, east arrow tip/above, west arrow tip/above, + before north arrow/above, before north arrow head/below left, before north arrow tip/above left, + after north arrow tip/above right, after north arrow head/below right, after north arrow/below, + before south arrow/below, before south arrow head/above right, before south arrow tip/below right, + after south arrow tip/below left, after south arrow head/above left, after south arrow/above, + before east arrow/above, before east arrow head/above right, before east arrow tip/above, + after east arrow tip/below, after east arrow head/below right, after east arrow/below, + before west arrow/below, before west arrow head/below left, before west arrow tip/below, + after west arrow tip/above, after west arrow head/above left, after west arrow/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement, rotate=-90] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} +% +\end{shape} + + +\subsection{Shapes with Multiple Text Parts} + +\begin{pgflibrary}{shapes.multipart} + This library defines general-purpose shapes that are composed of multiple + (text) parts. +\end{pgflibrary} + + +\begin{shape}{circle split} + This shape is a multi-part shape consisting of a circle with a line in the + middle. The upper part is the main part (the |text| part), the lower part + is the |lower| part. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\begin{tikzpicture} + \node [circle split,draw,double,fill=red!20] + { + $q_1$ + \nodepart{lower} + $00$ + }; +\end{tikzpicture} +\end{codeexample} + + The shape inherits all anchors from the |circle| shape and defines the + |lower| anchor in addition. See also the following figure: + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=circle split,shape example] {text\nodepart{lower}lower}; + \foreach \anchor/\placement in + {north west/above left, north/above, north east/above right, + west/left, center/below, east/right, + mid west/right, mid/above, mid east/left, + base west/left, base/below, base east/right, + south west/below left, south/below, south east/below right, + text/left, lower/left, 130/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{circle solidus} + This shape (due to Manuel Lacruz) is similar to the split circle, but the + two text parts are arranged diagonally. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\begin{tikzpicture} + \node [circle solidus,draw,double,fill=red!20] + { + $q_1$ + \nodepart{lower} + $00$ + }; +\end{tikzpicture} +\end{codeexample} + +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=circle solidus,shape example,inner xsep=1cm] {text\nodepart{lower}lower}; + \foreach \anchor/\placement in + {north west/above left, north/above, north east/above right, + west/left, center/below, east/right, + mid west/right, mid/above, mid east/left, + base west/left, base/below, base east/right, + south west/below left, south/below, south east/below right, + text/left, lower/left, 130/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{ellipse split} + This shape is a multi-part shape consisting of an ellipse with a line in + the middle. The upper part is the main part (the |text| part), the lower + part is the |lower| part. The anchors for this shape are shown below. + Anchor |60| is a border anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=ellipse split,shape example] {text\nodepart{lower}lower}; + \foreach \anchor/\placement in + {center/below, text/left, lower/left, 60/above right, + mid/above, mid east/above, mid west/above, + base/right, base east/left, base west/right, + north/above, south/below, east/below, west/below, + north east/above, south east/below, south west/below, north west/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{rectangle split} + This shape is a rectangle which can be split either horizontally or + vertically into several parts. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\begin{tikzpicture}[my shape/.style={ + rectangle split, rectangle split parts=#1, draw, anchor=center}] + \node [my shape=5] at (0,1) + {a\nodepart{two}b\nodepart{three}c\nodepart{four}d\nodepart{five}e}; + \node [my shape=5, rectangle split horizontal] at (2,2) + {1\nodepart{two}2\nodepart{three}3\nodepart{four}4\nodepart{five}5}; + \node [my shape=3] at (3,0.5) + {A\nodepart{two}B\nodepart{three}C}; + \node [my shape=4, rectangle split horizontal] at (1.5,0.5) + {1\nodepart{two}2\nodepart{three}3\nodepart{four}4}; +\end{tikzpicture} +\end{codeexample} + + The shape can be split into a maximum of twenty parts. However, to avoid + allocating a lot of unnecessary boxes, \pgfname{} only allocates four boxes + by default. To use the |rectangle| |split| shape with more than four boxes, + the extra boxes must be allocated manually in advance (perhaps using + |\newbox| or |\let|). The boxes take the form + |\pgfnodepart|\meta{number}|box|, where \meta{number} is from the cardinal + numbers |one|, |two|, |three|, \ldots{} and so on. |\pgfnodepartonebox| is + special in that it is synonymous with |\pgfnodeparttextbox|. For + compatibility with earlier versions of this shape, the boxes + |\pgfnodeparttwobox|, |\pgfnodepartthreebox| and |\pgfnodepartfourbox|, can + be referred to using the ordinal numbers: |\pgfnodepartsecondbox|, + |\pgfnodepartthirdbox| and |\pgfnodepartfourthbox|. In order to facilitate + the allocation of these extra boxes, the following key is provided: + + \begin{key}{/pgf/rectangle split allocate boxes=\meta{number}} + This key checks if \meta{number} boxes have been allocated, and if not, + it allocates the required boxes using |\newbox| (some ``magic'' is + performed to get around the fact that |\newbox| is declared |\outer| in + plain \TeX). + \end{key} + + When split vertically, the rectangle split will meet any |minimum width| + requirements, but any |minimum height| will be ignored. Conversely when + split horizontally, |minimum height| requirements will be met, but any + |minimum width| will be ignored. In addition, |inner sep| is applied to + every part that is used, so it cannot be specified independently for a + particular part. + + There are several \pgfname{} keys to specify how the shape is drawn. To use + these keys in \tikzname, simply remove the \declare{|/pgf/|} path: + + \begin{key}{/pgf/rectangle split parts=\meta{number} (initially 4)} + Split the rectangle into \meta{number} parts, which should be in the + range |1| to |20|. If more than four parts are needed, the boxes should + be allocated in advance as described above. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\begin{tikzpicture}[every text node part/.style={align=center}] + \node[rectangle split, rectangle split parts=3, draw, text width=2.75cm] + {Student + \nodepart{two} + age:int \\ + name:String + \nodepart{three} + getAge():int \\ + getName():String}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/rectangle split horizontal=\opt{\meta{boolean}} (default true)} + This key determines whether the rectangle is split horizontally or + vertically + \end{key} + + \begin{key}{/pgf/rectangle split ignore empty parts=\opt{\meta{boolean}} (default true)} + When \meta{boolean} is true, \pgfname{} will ignore any part that is + empty \emph{except the text part}. This effectively overrides the + |rectangle split parts| key in that, if 3 parts (for example) are + specified, but one is empty, only two will be shown. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\begin{tikzpicture}[every node/.style={draw, anchor=text, rectangle split, + rectangle split parts=3}] + \node {text \nodepart{second} \nodepart{third}third}; + \node [rectangle split ignore empty parts] at (2,0) + {text \nodepart{second} \nodepart{third}third}; +\end{tikzpicture} +\end{codeexample} + \end{key} + % + \begin{key}{/pgf/rectangle split empty part width=\meta{length} (initially 1ex)} + Sets the default width for a node part box if it is empty and empty + parts are not ignored. + \end{key} + + \begin{key}{/pgf/rectangle split empty part height=\meta{length} (initially 1ex)} + Sets the default height for a node part box if it is empty and empty + parts are not ignored. + \end{key} + + \begin{key}{/pgf/rectangle split empty part depth=\meta{length} (initially 0ex)} + Sets the default depth for a node part box if it is empty and empty + parts are not ignored. + \end{key} + + \begin{key}{/pgf/rectangle split part align={\ttfamily\char`\{}\meta{list}{\ttfamily\char`\}} (initially center)} + Sets the alignment of the boxes inside the node parts. Each item in + \meta{list} should be separated by commas (so if there is more than one + item in \meta{list}, it must be surrounded by braces). + + When the rectangle is split vertically, the entries in \meta{list} must + be one of |left|, |right|, or |center|. If \meta{list} has less entries + than node parts then the remaining boxes are aligned according to the + last entry in the list. Note that this only aligns the boxes in each + part and \emph{does not} affect the alignment of the contents of the + boxes. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\def\x{one \nodepart{two} 2 \nodepart{three} three \nodepart{four} 4} +\begin{tikzpicture}[ + every node/.style={rectangle split, rectangle split parts=4, + draw} + ] + \node[rectangle split part align={center, left, right}] at (0,0) {\x}; + \node[rectangle split part align={center, left}] at (1.25,0) {\x}; + \node[rectangle split part align={center}] at (2.5,0) {\x}; +\end{tikzpicture} +\end{codeexample} + + When the rectangle is split horizontally, the entries in \meta{list} + must be one of |top|, |bottom|, |center| or |base|. Note that using the + value |base| will only make sense if all the node part boxes are being + aligned in this way. This is because the |base| value aligns the boxes + in relation to each other, whereas the other values align the boxes in + relation to the part of the shape they occupy. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\def\x{\Large w\nodepart{two}x\nodepart{three}\Huge y\nodepart{four}\tiny z} +\begin{tikzpicture}[ + every node/.style={rectangle split, rectangle split parts=4, + draw, rectangle split horizontal} + ] + \node[rectangle split part align={center, top, bottom}] at (0,0) {\x}; + \node[rectangle split part align={center, top}] at (0,-1.25) {\x}; + \node[rectangle split part align={center}] at (0,-2.5) {\x}; + \node[rectangle split part align=base] at (0,-3.75) {\x}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/rectangle split draw splits=\opt{\meta{boolean}} (default true)} + Sets whether the line or lines between node parts will be drawn. + Internally, this sets the \TeX-if |\ifpgfrectanglesplitdrawsplits| + appropriately. + \end{key} + + \begin{key}{/pgf/rectangle split use custom fill=\opt{\meta{boolean}} (default true)} + This enables the use of a custom fill for each of the node parts + (including the area covered by the |inner sep|). The background path + for the shape should not be filled (e.g., in \tikzname{}, the |fill| + option for the node must be implicitly or explicitly set to |none|). + Internally, this key sets the \TeX-if + |\ifpgfrectanglesplitusecustomfill| appropriately. + \end{key} + + \begin{key}{/pgf/rectangle split part fill={\ttfamily\char`\{}\meta{list}{\ttfamily\char`\}} (initially white)} + Sets the custom fill color for each node part shape. The items in + \meta{list} should be separated by commas (so if there is more than one + item in \meta{list}, it must be surrounded by braces). If \meta{list} + has less entries than node parts, then the remaining node parts use the + color from the last entry in the list. This key will automatically set + |/pgf/rectangle split use custom fill|. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\begin{tikzpicture} + \tikzset{every node/.style={rectangle split, draw, minimum width=.5cm}} + \node[rectangle split part fill={red!50, green!50, blue!50, yellow!50}] {}; + \node[rectangle split part fill={red!50, green!50, blue!50}] at (0.75,0) {}; + \node[rectangle split part fill={red!50, green!50}] at (1.5,0) {}; + \node[rectangle split part fill={red!50}] at (2.25,0) {}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + The anchors for the |rectangle split| shape split vertically into four, are + shown below (anchor |70| is an example of a border angle). When a node part + is missing, the anchors prefixed with the name of that node part should be + considered unavailable. They are (unavoidably) defined, but default to + other anchor positions. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.multipart}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=rectangle split, rectangle split parts=4, shape example, + inner ysep=0.75cm] + {\nodepart{text}text\nodepart{two}two + \nodepart{three}three\nodepart{four}four}; + \foreach \anchor/\placement in + {text/left, text east/above, text west/above, + two/left, two east/above, two west/above, + three/left, three east/below, three west/below, + four/left, four east/below, four west/below, + text split/left, text split east/above, text split west/above, + two split/left, two split east/above, two split west/above, + three split/left, three split east/below, three split west/below, + north/above, south/below, east/below, west/below, + north west/above, north east/above, south west/below, south east/below, + center/above, 70/above, mid/above, base/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + + +\subsection{Callout Shapes} + +\begin{pgflibrary}{shapes.callouts} + Producing basic callouts can be done quite easily in \pgfname{} and + \tikzname{} by creating a node and then subsequently drawing a path from + the border of the node to the required point. This library provides more + fancy, `balloon'-style callouts. +\end{pgflibrary} + +Callouts consist of a main shape and a pointer (which is part of the shape) +which points to something in (or outside) the picture. The position on the +border of the main shape to which the pointer is connected is determined +automatically. However, the pointer is ignored when calculating the minimum +size of the shape, and also when positioning anchors. +% +\begin{codeexample}[preamble={\usetikzlibrary{shapes.callouts}}] +\begin{tikzpicture}[remember picture] + \node[ellipse callout, draw] (hallo) {Hallo!}; +\end{tikzpicture} +\end{codeexample} + +There are two kinds of pointer: the ``relative'' pointer and the ``absolute'' +pointer. The relative pointer calculates the angle of a specified coordinate +relative to the center of the main shape, locates the point on the border to +which this angle corresponds, and then adds the coordinate to this point. This +seemingly over-complex approach means than you do not have to guess the size of +the main shape: the relative pointer will always be outside. The absolute +pointer, on the other hand, is much simpler: it points to the specified +coordinate absolutely (and can even point to named coordinates in different +pictures). +% +\begin{codeexample}[preamble={\usetikzlibrary{shapes.callouts}}] +\begin{tikzpicture}[remember picture, note/.style={rectangle callout, fill=#1}] + \draw [help lines] grid(3,2); + \node [note=red!50, callout relative pointer={(0,1)}] at (3,1) {Relative}; + \node [note=blue!50, callout absolute pointer={(0,1)}] at (1,0) {Absolute}; + \node [note=green!50, opacity=.5, overlay, + callout absolute pointer={(hallo.south)}] at (1,2) {Outside}; +\end{tikzpicture} +\end{codeexample} + +The following keys are common to all callouts. Please remember that the +|callout| |relative| |pointer|, and |callout| |absolute| |pointer| keys take a +different format for their value depending on whether they are being used in +\pgfname{} or \tikzname{}. + +\begin{key}{/pgf/callout relative pointer=\meta{coordinate} (initially {\ttfamily\char`\\pgfpointpolar\char`\{315\char`\}\char`\{.5cm\char`\}})} + Sets the vector of the callout pointer `relative' to the callout shape. +\end{key} + +\begin{key}{/pgf/callout absolute pointer=\meta{coordinate}} + Sets the vector of the callout pointer absolutely within the picture. +\end{key} + +\begin{key}{/tikz/callout relative pointer=\meta{coordinate} (initially {(315:.5cm)})} + The \tikzname{} version of the |callout relative pointer| key. Here, + \meta{coordinate} can be specified using the \tikzname{} format for + coordinates. +\end{key} + +\begin{key}{/tikz/callout absolute pointer=\meta{coordinate}} + The \tikzname{} version of the |callout absolute pointer| key. Here, + \meta{coordinate} can be specified using the \tikzname{} format for + coordinates. +\end{key} + +It is also possible to shorten the pointer by some distance, using the +following key: + +\begin{key}{/pgf/callout pointer shorten=\meta{distance} (initially 0cm)} + Moves the callout pointer towards the center of the callout's main shape by + \meta{distance}. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.callouts}}] +\begin{tikzpicture} + \tikzset{callout/.style={ellipse callout, callout pointer arc=30, + callout absolute pointer={#1}}} + \draw (0,0) grid (3,2); + \node[callout={(3,1.5)}, fill=red!50] at (0,1.5) {A}; + \node[callout={(3,.5)}, fill=green!50, callout pointer shorten=1cm] + at (0,.5) {B}; +\end{tikzpicture} +\end{codeexample} + % +\end{key} + +\begin{shape}{rectangle callout} + This shape is a callout whose main shape is a rectangle, which tightly fits + the node contents (including any |inner sep|). It supports the keys + described above and also the following key: + + \begin{key}{/pgf/callout pointer width=\meta{length} (initially .25cm)} + Sets the width of the pointer at the border of the rectangle. + \end{key} + + The anchors for this shape are shown below (anchor |60| is an example of a + border anchor). The pointer direction is ignored when placing anchors. + Additionally, when using an absolute pointer, the |pointer| anchor should + not to be used to used to position the shape as it is calculated whilst the + shape is being drawn. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.callouts}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=rectangle callout, callout relative pointer={(1.25cm,-1cm)}, + callout pointer width=2cm, shape example, inner xsep=2cm, inner ysep=1cm] + {Rectangle Callout\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {center/above, text/below, 60/above, + mid/right, mid west/left, mid east/right, + base/below, base west/below, base east/below, + north/above, south/below, east/above, west/above, + north west/above, north east/above, + south west/below, south east/below, + pointer/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{ellipse callout} + This shape is a callout whose main shape is an ellipse, which tightly fits + the node contents (including any |inner sep|). It uses the + |absolute callout pointer|, |relative callout pointer| and + |callout pointer shorten| keys, and also the following key: + + \begin{key}{/pgf/callout pointer arc=\meta{angle} (initially 15)} + Sets the width of the pointer at the border of the ellipse according to + an arc of length \meta{angle}. + \end{key} + + The anchors for this shape are shown below (anchor |60| is an example of a + border anchor). The pointer direction is ignored when placing anchors and + the |pointer| anchor can only be used to position the shape when the + relative anchor is specified. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.callouts}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=ellipse callout, callout relative pointer={(1.25cm,-1cm)}, + callout pointer width=2cm, shape example, inner xsep=1cm, inner ysep=.5cm] + {Ellipse Callout\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {center/above, text/below, 60/above, + mid/above, mid west/right, mid east/left, + base/below, base west/below, base east/below, + north/above, south/below, east/above, west/above, + north west/above left, north east/above right, + south west/below left, south east/below right, + pointer/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{cloud callout} + This shape is a callout whose main shape is a cloud which fits the node + contents. The pointer is segmented, consisting of a series of shrinking + ellipses. This callout requires the |shapes.callouts| library (for the cloud + shape). If this library is not loaded an error will result. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.callouts}}] +\begin{tikzpicture} + \node[cloud callout, cloud puffs=15, aspect=2.5, cloud puff arc=120, + shading=ball,text=white] {\bf Imagine...}; +\end{tikzpicture} +\end{codeexample} + + The |cloud callout| supports the |absolute callout pointer|, + |relative callout pointer| and |callout pointer shorten| keys, as described + above. The main shape can be modified using the same keys as the |cloud| + shape. The following keys are also supported: + + \begin{key}{/pgf/callout pointer start size=\meta{value} (initially .2 of callout)} + Sets the size of the first segment in the pointer (i.e., the segment + nearest the main cloud shape). There are three possible forms for + \meta{value}: + % + \begin{itemize} + \item A single dimension (e.g., |5pt|), in which case the first + ellipse will have equal diameters of 5pt. + \item Two dimensions (e.g., |10pt and 2.5pt|), which sets the $x$ + and $y$ diameters of the first ellipse. + \item A decimal fraction (e.g., |.2 of callout|), in which case the + $x$ and $y$ diameters of the first ellipse will be set as + fractions of the width and height of the main shape. The + keyword |of callout| cannot be omitted. + \end{itemize} + \end{key} + + \begin{key}{/pgf/callout pointer end size=\meta{value} (initially .1 of callout)} + Sets the size of the last ellipse in the pointer. + \end{key} + + \begin{key}{/pgf/callout pointer segments=\meta{number} (initially 2)} + Sets the number of segments in the pointer. Note that \pgfname{} will + happily overlap segments if too many are specified. + \end{key} + + The anchors for this shape are shown below (anchor |70| is an example of a + border anchor). The pointer direction is ignored when placing anchors and + the pointer anchor can only be used to position the shape when the relative + anchor is specified. Note that the center of the last segment is drawn at + the |pointer| anchor. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.callouts}}] +\Huge +\begin{tikzpicture} + \node[name=s, shape=cloud callout, style=shape example, cloud puffs=11, aspect=1.5, + cloud puff arc=120,inner xsep=.5cm, callout pointer start size=.25 of callout, + callout pointer end size=.15 of callout, callout relative pointer={(315:4cm)}, + callout pointer segments=2] {Cloud Callout\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {puff 1/above, puff 2/above, puff 3/above, puff 4/below, + puff 5/left, puff 6/below, puff 7/below, puff 8/right, + puff 9/below, puff 10/above, puff 11/above, 70/right, + center/above, base/below, mid/right, text/left, + north/below, south/below, east/above, west/above, + north west/left, north east/right, + south west/below, south east/below,pointer/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + + +\subsection{Miscellaneous Shapes} + +\begin{pgflibrary}{shapes.misc} + This library defines general-purpose shapes that do not fit into the + previous categories. +\end{pgflibrary} + +\begin{shape}{cross out} + This shape ``crosses out'' the node. Its foreground path are simply two + diagonal lines between the corners of the node's bounding box. Here is an + example: + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\begin{tikzpicture} + \draw [help lines] (0,0) grid (3,2); + \node [cross out,draw=red] at (1.5,1) {cross out}; +\end{tikzpicture} +\end{codeexample} + + A useful application is inside text as in the following example: + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +Cross \tikz[baseline] \node [cross out,draw,anchor=text] {me}; out! +\end{codeexample} + + This shape inherits all anchors from the |rectangle| shape, see also the + following figure: + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=cross out,shape example] {cross out\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {north west/above left, north/above, north east/above right, + west/left, center/above, east/right, + mid west/right, mid/above, mid east/left, + base west/left, base/below, base east/right, + south west/below left, south/below, south east/below right, + text/left, 10/right, 130/above} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{strike out} + This shape is identical to the |cross out| shape, only its foreground path + consists of a single line from the lower left to the upper right. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +Strike \tikz[baseline] \node [strike out,draw,anchor=text] {me}; out! +\end{codeexample} + + See the |cross out| shape for the anchors. +\end{shape} + +\begin{shape}{rounded rectangle} + This shape is a rectangle which can have optionally rounded sides. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\begin{tikzpicture} + \node[rounded rectangle, draw, fill=red!20]{Hallo}; +\end{tikzpicture} +\end{codeexample} + + There are keys to specify how the sides are rounded (to use these keys in + \tikzname, simply remove the \declare{|/pgf/|} path). + + \begin{key}{/pgf/rounded rectangle arc length=\meta{angle} (initially 180)} + Sets the length of the arcs for the rounded ends. Recommended values + for \meta{angle} are between |90| and |180|. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\begin{tikzpicture} + \matrix[row sep=5pt, every node/.style={draw, rounded rectangle}]{ + \node[rounded rectangle arc length=180] {180}; \\ + \node[rounded rectangle arc length=120] {120}; \\ + \node[rounded rectangle arc length=90] {90}; \\}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/rounded rectangle west arc=\meta{arc type} (initially convex)} + Sets the style of the rounding for the left side. The permitted values + for \meta{arc type} are |concave|, |convex|, or |none|. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\begin{tikzpicture} + \matrix[row sep=5pt, every node/.style={draw, rounded rectangle}]{ + \node[rounded rectangle west arc=concave] {Concave}; \\ + \node[rounded rectangle west arc=convex] {Convex}; \\ + \node[rounded rectangle left arc=none] {None}; \\}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{stylekey}{/pgf/rounded rectangle left arc=\meta{arc type}} + Alternative key for specifying the west arc. + \end{stylekey} + + \begin{key}{/pgf/rounded rectangle east arc=\meta{arc type} (initially convex)} + Sets the style of the rounding for the east side. + \end{key} + + \begin{stylekey}{/pgf/rounded rectangle right arc=\meta{arc type}} + Alternative key for specifying the east arc. + \end{stylekey} + + The anchors for this shape are shown below (anchor |10| is an example of a + border angle). Note that if only one side is rounded, the |center| anchor + will not be the precise center of the shape. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=rounded rectangle, shape example, inner xsep=1.5cm, inner ysep=1cm] + {Rounded Rectangle\vrule width 1pt height 2cm}; + \foreach \anchor/\placement in + {center/above, text/below, 10/above, + mid/above, mid west/right, mid east/left, + base/below, base west/below, base east/below, + north/above, south/below, east/above, west/above, + north west/above left, north east/above right, + south west/below left, south east/below right} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + +\begin{shape}{chamfered rectangle} + This shape is a rectangle with optionally chamfered corners. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\begin{tikzpicture} + \node[chamfered rectangle, white, fill=red, double=red, draw, very thick] + {\bf STOP!}; +\end{tikzpicture} +\end{codeexample} + + There are \pgfname{} keys to specify how this shape is drawn (to use these + keys in \tikzname{} simply remove the \declare{|/pgf/|} path). + + \begin{key}{/pgf/chamfered rectangle angle=\meta{angle} (initially 45)} + Sets the angle \emph{from the vertical} for the chamfer. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\begin{tikzpicture} + \tikzset{every node/.style={chamfered rectangle, draw}} + \node[chamfered rectangle angle=30] {abc}; + \node[chamfered rectangle angle=60] at (1.5,0) {123}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/chamfered rectangle xsep=\meta{length} (initially .666ex)} + Sets the distance that the chamfer extends horizontally beyond the node + contents (which includes the |inner sep|). If \meta{length} is large, + such that the top and bottom chamfered edges would cross, then + \meta{length} is ignored and the chamfered edges are drawn so that they + meet in the middle. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\begin{tikzpicture} + \tikzset{every node/.style={chamfered rectangle, draw}} + \node[chamfered rectangle xsep=2pt] {def}; + \node[chamfered rectangle xsep=2cm] at (1.5,0) {456}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + \begin{key}{/pgf/chamfered rectangle ysep=\meta{length} (initially .666ex)} + Sets the distance that the chamfer extends vertically beyond the node + contents. If \meta{length} is large, such that the left and right + chamfered edges would cross, then \meta{length} is ignored and the + chamfered edges are drawn so that they meet in the middle. + \end{key} + + \begin{key}{/pgf/chamfered rectangle sep=\meta{length} (initially .666ex)} + Sets both the |xsep| and |ysep| simultaneously. + \end{key} + + \begin{key}{/pgf/chamfered rectangle corners=\meta{list} (initially chamfer all)} + Specifies which corners are chamfered. The corners are identified by + their ``compass point'' directions (i.e.\ |north east|, |north west|, + |south west|, and |south east|), and must be separated by commas (so if + there is more than one corner in the list, it must be surrounded by + braces). Any corners not mentioned in \meta{list} are automatically not + chamfered. Two additional values |chamfer all| and |chamfer none|, are + also permitted. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\begin{tikzpicture} + \tikzset{every node/.style={chamfered rectangle, draw}} + \node[chamfered rectangle corners=north west] {ghi}; + \node[chamfered rectangle corners={north east, south east}] at (1.5,0) {789}; +\end{tikzpicture} +\end{codeexample} + \end{key} + + The anchors for this shape are shown below (anchor |60| is an example of a + border angle. + % +\begin{codeexample}[preamble={\usetikzlibrary{shapes.misc}}] +\Huge +\begin{tikzpicture} + \node[name=s,shape=chamfered rectangle, chamfered rectangle sep=1cm, + shape example, inner ysep=1cm, inner xsep=.75cm] + {Chamfered Rectangle\vrule width1pt height2cm}; + \foreach \anchor/\placement in + {text/right, center/above, 70/above, + base/below, base east/left, base west/right, + mid/right, mid east/above, mid west/above, + north/above, south/below, east/above, west/above, + before north east/above, north east/above, after north east/above, + before north west/above, north west/above, after north west/above, + before south west/below, south west/below, after south west/below, + before south east/below, south east/below, after south east/below} + \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} + node[\placement] {\scriptsize\texttt{(s.\anchor)}}; +\end{tikzpicture} +\end{codeexample} + % +\end{shape} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "pgfmanual-pdftex-version" +%%% End: |