1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
% Copyright 2019 by Till Tantau
%
% 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{Tree Library}
\label{section-tree-library}
\begin{tikzlibrary}{trees}
This packages defines styles to be used when drawing trees.
\end{tikzlibrary}
\subsection{Growth Functions}
The package |trees| defines two new growth functions. They are installed using
the following options:
\begin{key}{/tikz/grow via three points=\texttt{one child at (}\meta{x}
\texttt{) and two children at (}\meta{y}\texttt{) and (}\meta{z}|)|%
}
This option installs a growth function that works as follows: If a parent
node has just one child, this child is placed at \meta{x}. If the parent
node has two children, these are placed at \meta{y} and \meta{z}. If the
parent node has more than two children, the children are placed at points
that are linearly extrapolated from the three points \meta{x}, \meta{y},
and \meta{z}. In detail, the position is $x + \frac{n-1}{2}(y-x) +
(c-1)(z-y)$, where $n$ is the number of children and $c$ is the number of
the current child (starting with~$1$).
The net effect of all this is that if you have a certain ``linear
arrangement'' in mind and use this option to specify the placement of a
single child and of two children, then any number of children will be
placed correctly.
Here are some arrangements based on this growth function. We start with a
simple ``above'' arrangement:
%
\begin{codeexample}[preamble={\usetikzlibrary{trees}}]
\begin{tikzpicture}[grow via three points={%
one child at (0,1) and two children at (-.5,1) and (.5,1)}]
\node at (0,0) {one} child;
\node at (0,-1.5) {two} child child;
\node at (0,-3) {three} child child child;
\node at (0,-4.5) {four} child child child child;
\end{tikzpicture}
\end{codeexample}
The next arrangement places children above, but ``grows only to the
right''.
%
\begin{codeexample}[preamble={\usetikzlibrary{trees}}]
\begin{tikzpicture}[grow via three points={%
one child at (0,1) and two children at (0,1) and (1,1)}]
\node at (0,0) {one} child;
\node at (0,-1.5) {two} child child;
\node at (0,-3) {three} child child child;
\node at (0,-4.5) {four} child child child child;
\end{tikzpicture}
\end{codeexample}
In the final arrangement, the children are placed along a line going down
and right.
\begin{codeexample}[preamble={\usetikzlibrary{trees}}]
\begin{tikzpicture}[grow via three points={%
one child at (-1,-.5) and two children at (-1,-.5) and (0,-.75)}]
\node at (0,0) {one} child;
\node at (0,-1.5) {two} child child;
\node at (0,-3) {three} child child child;
\node at (0,-4.5) {four} child child child child;
\end{tikzpicture}
\end{codeexample}
These examples should make it clear how you can create new styles to
arrange your children along a line.
\end{key}
\begin{key}{/tikz/grow cyclic}
This style causes the children to be arranged ``on a circle''. For this,
the children are placed at distance |\tikzleveldistance| from the parent
node, but not on a straight line, but on points on a circle. Instead of a
sibling distance, there is a |sibling angle| that denotes the angle between
two given children.
%
\begin{key}{/tikz/sibling angle=\meta{angle}}
Sets the angle between siblings in the |grow cyclic| style.
\end{key}
%
Note that this function will rotate the coordinate system of the children
to ensure that the grandchildren will grow in the right direction.
%
\begin{codeexample}[preamble={\usetikzlibrary{trees}}]
\begin{tikzpicture}
[grow cyclic,
level 1/.style={level distance=8mm,sibling angle=60},
level 2/.style={level distance=4mm,sibling angle=45},
level 3/.style={level distance=2mm,sibling angle=30}]
\coordinate [rotate=-90] % going down
child foreach \x in {1,2,3}
{child foreach \x in {1,2,3}
{child foreach \x in {1,2,3}}};
\end{tikzpicture}
\end{codeexample}
%
\end{key}
\begin{key}{/tikz/clockwise from=\meta{angle}}
This option also causes children to be arranged on a circle. However, the
rule for placing children is simpler than with the |grow cyclic| style: The
first child is placed at \meta{angle} at a distance of
|\tikzleveldistance|. The second child is placed at the same distance from
the parent, but at angle \meta{angle}${}-{}$|\tikzsiblingangle|. The third
child is displaced by another |\tikzsiblingangle| in a clockwise fashion,
and so on.
Note that this function will not rotate the coordinate system.
%
\begin{codeexample}[preamble={\usetikzlibrary{trees}}]
\begin{tikzpicture}
\node {root}
[clockwise from=30,sibling angle=30]
child {node {$30$}}
child {node {$0$}}
child {node {$-30$}}
child {node {$-60$}};
\end{tikzpicture}
\end{codeexample}
%
\end{key}
\begin{key}{/tikz/counterclockwise from=\meta{angle}}
Works the same way as |clockwise from|, but sibling angles are added
instead of subtracted.
\end{key}
\subsection{Edges From Parent}
The following styles can be used to modify how the edges from parents are
drawn:
\begin{stylekey}{/tikz/edge from parent fork down}
This style will draw a line from the parent downwards (for half the level
distance) and then on to the child using only horizontal and vertical
lines.
%
\begin{codeexample}[preamble={\usetikzlibrary{trees}}]
\begin{tikzpicture}
\node {root}
[edge from parent fork down]
child {node {left}}
child {node {right}
child[child anchor=north east] {node {child}}
child {node {child}}
};
\end{tikzpicture}
\end{codeexample}
%
\end{stylekey}
\begin{stylekey}{/tikz/edge from parent fork right}
This style behaves similarly, only it will first draw its edge to the
right.
%
\begin{codeexample}[preamble={\usetikzlibrary{trees}}]
\begin{tikzpicture}
\node {root}
[edge from parent fork right,grow=right]
child {node {left}}
child {node {right}
child {node {child}}
child {node {child}}
};
\end{tikzpicture}
\end{codeexample}
%
\end{stylekey}
\begin{stylekey}{/tikz/edge from parent fork left}
Behaves similarly to the previous styles.
\end{stylekey}
\begin{stylekey}{/tikz/edge from parent fork up}
Behaves similarly to the previous styles.
\end{stylekey}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "pgfmanual-pdftex-version"
%%% End:
|