diff options
Diffstat (limited to 'graphics/pgf/base/doc/pgfmanual-en-library-trees.tex')
-rw-r--r-- | graphics/pgf/base/doc/pgfmanual-en-library-trees.tex | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/graphics/pgf/base/doc/pgfmanual-en-library-trees.tex b/graphics/pgf/base/doc/pgfmanual-en-library-trees.tex new file mode 100644 index 0000000000..ccb5eb53dc --- /dev/null +++ b/graphics/pgf/base/doc/pgfmanual-en-library-trees.tex @@ -0,0 +1,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: |