summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-trees.tex
blob: f4e6f591c1c712687c70efd898ec5472d7bb631d (plain)
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
% Copyright 2006 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 |pgflibrarytikztrees| defines two new growth
functions. They are installed using the following options:

\begin{itemize}
  \itemoption{grow via three points}|=one child at (|\meta{x}%
  |) and two children at (|\meta{y}|) 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}[]
\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}[]
\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}[]
\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.

  \itemstyle{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 points on a
  circle. Instead of a sibling distance, there is a |sibling angle|
  that denotes the angle between two given children.
  \begin{itemize}
    \itemoption{sibling angle}|=|\meta{angle}
    Sets the angle between siblings in the |grow cyclic| style.
  \end{itemize}
  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}[]
\begin{tikzpicture}[grow cyclic]
  \tikzstyle{level 1}=[level distance=8mm,sibling angle=60]
  \tikzstyle{level 2}=[level distance=4mm,sibling angle=45]
  \tikzstyle{level 3}=[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}

  \itemoption{clockwise from}|=|\meta{angle}
  This option also cuases children to be arranged on a
  circle. However, the rule for placing children is simpler thatn 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}[]
\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}
  \itemoption{counterclockwise from}|=|\meta{angle}
  Works the same way as |clockwise from|, but sibling angles are added
  instead of subtracted.
\end{itemize}

\subsection{Edges From Parent}

The following styles can be used to modify how the edges from parents
are drawn:

\begin{itemize}
  \itemstyle{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}[]
\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}
  \itemstyle{edge from parent fork right}
  This style behaves similarly, only it will first draw its edge to
  the right.
\begin{codeexample}[]
\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}
  \itemstyle{edge from parent fork left}
  behaves similary. 
  \itemstyle{edge from parent fork up}
  behaves similary. 
\end{itemize}




%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "pgfmanual-pdftex-version"
%%% End: