% 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:
