diff options
author | Karl Berry <karl@freefriends.org> | 2011-09-29 23:40:53 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-09-29 23:40:53 +0000 |
commit | 65642b7dd742e23e69a9e34a38fb82421e570795 (patch) | |
tree | 448b0292dd71ec8555883561376281f829c52032 /Master/texmf-dist/doc/generic/pst-tree | |
parent | 5709c8787a2bc07d2516549b59379279c672ef88 (diff) |
pst-tree (29sep11)
git-svn-id: svn://tug.org/texlive/trunk@24142 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/generic/pst-tree')
-rw-r--r-- | Master/texmf-dist/doc/generic/pst-tree/pst-tree-doc-de.pdf | bin | 0 -> 215154 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/generic/pst-tree/pst-tree-doc-de.tex | 910 |
2 files changed, 910 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/pst-tree/pst-tree-doc-de.pdf b/Master/texmf-dist/doc/generic/pst-tree/pst-tree-doc-de.pdf Binary files differnew file mode 100644 index 00000000000..4c153eab3cb --- /dev/null +++ b/Master/texmf-dist/doc/generic/pst-tree/pst-tree-doc-de.pdf diff --git a/Master/texmf-dist/doc/generic/pst-tree/pst-tree-doc-de.tex b/Master/texmf-dist/doc/generic/pst-tree/pst-tree-doc-de.tex new file mode 100644 index 00000000000..2ab69a8451a --- /dev/null +++ b/Master/texmf-dist/doc/generic/pst-tree/pst-tree-doc-de.tex @@ -0,0 +1,910 @@ +%% $Id: pst-tree-doc.tex 133 2009-09-17 05:53:56Z herbert $ +\documentclass[11pt,ngerman,BCOR10mm,DIV12,bibliography=totoc,parskip=false,smallheadings + headexclude,footexclude,oneside]{pst-doc} +\usepackage[T1] {fontenc} +\usepackage[latin1]{inputenc} +\usepackage{babel} +\usepackage{pst-tree} +\let\pstTreeFV\fileversion +\lstset{pos=t,language=PSTricks, + morekeywords={psGammaDist,psChiIIDist,psTDist,psFDist,psBetaDist,psPlotImpl}, + basicstyle=\footnotesize\ttfamily} + +\usepackage{makeidx} +\makeindex +% +\begin{document} + +\title{\texttt{pst-tree}} +\subtitle{Knoten und Bäume; v.\pstTreeFV} +\author{Timothy Van Zandt\\Herbert Vo\ss} +\docauthor{Herbert Vo\ss \\ +\textnormal{Übersetzung aus dem Englischen:} \\ +%Christine Römer (xcr@uni-jena.de),\\ +Alexander Mischke von der FSU Jena (alex.mischke@web.de)} +\date{\today} +\maketitle + +\tableofcontents + +\clearpage% + +\begin{abstract} +Knoten und Knotenverbindungen sind perfekte Werkzeuge für die Erstellung von Bäumen, +allerdings wäre die +Positionierung der Knoten mittels \Lcs{rput} ungleich aufwendiger.\footnote{% +Wenn man nicht ein Programm hat, das die Koordinaten erzeugt.} Die Datei +\nxLPack{pst-tree.tex}/\nxLPack{pstree.sty} +enthält eine fortgeschrittene Schnittstelle für die Baumerstellung. + +Es sollte angemerkt werden, dass ein korrektes Ergebnis nicht unter jedem \Lprog{dvips}-Treiber +garantiert werden kann. Dieses Paket wurde für das +\Lprog{dvips}-Programm von Rokicki\index{Rokicki} geschrieben, welches praktisch Bestandteil +jeder \TeX-Distribution ist. +%\vfill +%Thanks to: Lars Kotthoff, Geoff Mercer +\end{abstract} + +\clearpage + +% --------------------- + +\section{Überblick} + +Die Baumbefehle sind + + +\begin{BDef} +\Lcs{pstree}\Largb{<root>}\Largb{<successors>} +\end{BDef} + +\begin{BDef} +\begin{tabular}{@{}l@{\kern30pt}l} +\TeX\ version & \LaTeX\ version\\ +\Lcs{psTree}\Largb{<root>} & \LBEG{psTree}\Largb{root}\\ +\qquad<successors> & \qquad<successors> \\ +\Lcs{endpsTree} & \LEND{psTree} +\end{tabular} +\end{BDef} + +Diese Befehle erfüllen die gleiche Funktion und haben nur eine unterschiedliche Syntax. +\Lcs{psTree} ist die \glqq +lange\grqq{} Version. Diese Makros erstellen eine Box, die alle Knoten einschließt und deren +Grundlinie durch den Mittelpunkt des +Wurzelknotens verläuft. Die meisten der Knoten haben eine Variante für die Verwendung innerhalb +eines Baumes und werden Baumknoten genannt (Siehe Abschnitt~\ref{treenodes}). + +Bäume und Baumknoten werden \emph{\Index{Baumobjekte}} genannt. Die \Larg{Wurzel} eines Baumes +sollte ein einzelnes +Baumobjekt sein und die \Larg{Nachfolger} sollten ein oder mehrere Baum\-objekte sein. Hier ist ein +Beispiel, das nur aus Knoten besteht: + +\begin{LTXexample}[pos=l] + \pstree[radius=3pt]{\Toval{root}}{\TC* \TC* \TC* \TC*} +\end{LTXexample} + +\noindent Es gibt keinen Unterschied zwischen einem End- und einem Wurzelknoten, abgesehen von der +Position im +\Lcs{pstree}\Largb{}-Befehl. Das folgende Beispiel zeigt einen Baum, der in der Liste der Nachfolger +erscheint und so ein \Index{Unterbaum} wird: + +\begin{LTXexample}[pos=l] + \pstree[radius=3pt]{\Tp}{% + \TC* + \pstree{\TC}{\TC* \TC*} + \TC*} +\end{LTXexample} + + +\section{Baumknoten}\label{treenodes} + +Der Name des Baumknotens ergibt sich immer durch Auslassen des \glqq node \grqq{} vom Ende des +Namens und durch +Anfügen eines \glqq T \grqq{} am Anfang. Beispielsweise wird \Lcs{psovalnode} zu \Lcs{Toval}. +Hier ist eine Liste solcher Baumknoten: + +\begin{BDef} +\LcsStar{Tp}\OptArgs\\ +\LcsStar{Tc}\OptArgs\Largb{dim}\\ +\LcsStar{TC}\OptArgs\\ +\LcsStar{Tf}\OptArgs\\ +\LcsStar{Tdot}\OptArgs\\ +\LcsStar{Tr}\OptArgs\Largb{stuff}\\ +\LcsStar{TR}\OptArgs\Largb{stuff}\\ +\LcsStar{Tcircle}\OptArgs\Largb{stuff}\\ +\LcsStar{TCircle}\OptArgs\Largb{stuff}\\ +\LcsStar{Toval}\OptArgs\Largb{stuff}\\ +\LcsStar{Tdia}\OptArgs\Largb{stuff}\\ +\LcsStar{Ttri}\OptArgs\Largb{stuff} +\end{BDef} + +Die Syntax eines Baumknotens gleicht der des korrespondierenden \glqq normalen\grqq{} Knotens, +außer dass: +\begin{itemize} + \item es immer ein optionales Argument für die Einstellung von grafischen Parametern gibt, + auch wenn der ursprüngliche Knoten keines hatte; + \item es kein Argument zum Spezifizieren des Knotennamens gibt; + \item es nie ein Koordinatenargument zum Positionieren des Knotens gibt und + \item um den Referenzpunkt bei \Lcs{Tr} zu setzen, der \Lkeyword{ref}-Parameter benötigt wird. +\end{itemize} + +\noindent Abbildung~\vref{allnodes} gibt einen Überblick, wie die einzelnen Knoten aussehen. + +\begin{figure}[!htb] +\begin{LTXexample} + \small + \psset{armB=1cm, levelsep=3cm, treesep=-3mm, angleB=-90, angleA=90, nodesepA=3pt} + \def\s#1{#1~{\tt\string#1}}\def\b#1{#1{\tt\string#1}}\def\psedge#1#2{\ncangle{#2}{#1}} + \psTree[treenodesize=1cm]{\Toval{Tree nodes}} + \s\Tp\Tc{.5}~{\tt\string\Tc} \s\TC + \psTree[levelsep=4cm,armB=2cm]{\Tp[edge=\ncline]} + \b\Tcircle \s\Tdot + \TCircle[radius=1.2]{\tt\string\TCircle} + \Tn \b\Toval \b\Ttri \b\Tdia + \endpsTree + \s\Tf \b\Tr \b\TR + \endpsTree +\end{LTXexample} +\caption{Die Baumknoten.}\label{allnodes} +\end{figure} + +~\\ +\noindent Der Unterschied zwischen \Lcs{Tr} und \Lcs{TR} (jeweils Varianten von \Lcs{rnode} und +\Lcs{Rnode}) spielt in Bäumen +eine wichtige Rolle. Für gewöhnlich will man \Lcs{TR} bei vertikalen Bäumen verwenden, da die +Grundlinien des Textes bündig horizontal verlaufen. Zum Beispiel: + +\begin{LTXexample}[pos=l] + $ + \pstree[nodesepB=3pt]{\Tcircle{X}}{% + \TR{\tilde{\tilde{X}}} + \TR{x} + \TR{y}} + $ +\end{LTXexample} + +Vergleichen Sie mit diesem Beispiel, welches \Lcs{Tr} verwendet: +\begin{LTXexample}[pos=l] + $ + \pstree[nodesepB=3pt]{\Tcircle{X}}{% + \Tr{\tilde{\tilde{X}}} + \Tr{x} + \Tr{y}} + $ +\end{LTXexample} + +\newpage +Es gibt auch einen Null-Baumknoten: +\begin{BDef} +\Lcs{Tn} +\end{BDef} + +Dieser ist als Platzhalter gedacht. Sehen Sie sich den Baum in Abb. 1 auf Seite~\pageref{allnodes} an: +Bei der unteren Reihe fehlt ein Knoten in der Mitte. \Lcs{Tn}\Largb{} wurde für diesen fehlenden +Knoten verwendet. +\clearpage + +\noindent Es gibt auch einen besonderen Baumknoten, der keine \glqq normale \grqq Version aufweist +und der nicht als Wurzelknoten eines kompletten Baumes genutzt werden kann: +\begin{BDef} +\LcsStar{Tfan}\OptArgs +\end{BDef} + +Dieser Befehl zeichnet ein Dreieck, dessen Grundlinie sich aus \Lkeyword{fansize} ergibt und +dessen gegenüberliegende +Ecke (anhand der Werte von \Lkeyword{nodesepA} und \Lkeyword{offsetA} ausgerichtet) den vorhergehenden +Knoten bildet. +Zum Beispiel: + +\begin{LTXexample}[pos=l] + \pstree[dotstyle=oplus,dotsize=8pt,nodesep=2pt]{\Tcircle{11}}{% + \Tdot + \pstree{\Tfan}{\Tdot} + \pstree{\Tdot}{\Tfan[linestyle=dashed]}} +\end{LTXexample} + + +\section{Baumausrichtung} + +Bäume können nach unten, oben, rechts oder links wachsen, abhängig vom \Lkeyword{treemode=}\Lkeyval{D}, \Lkeyval{U}, \Lkeyval{R}, oder \Lkeyval{L}-Parameter. + +\noindent So sähe das vorherige Beispiel mit Rechtswachstum aus: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \pstree[dotstyle=oplus,dotsize=8pt, + nodesep=2pt,treemode=R] + {\Tcircle{11}}{% + \Tdot + \pstree{\Tfan}{\Tdot} + \pstree{\Tdot}{\Tfan[linestyle=dashed]}} +\end{LTXexample} + + +\noindent Die Ausrichtung von \Lkeyword{treemode} kann auch mitten im Baum erfolgen. Hier ist +z.\,B. ein Baum, der nach oben +wächst und dann einen Unterbaum beinhaltet, welcher nach links wächst: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \footnotesize + \pstree[treemode=U,dotstyle=otimes,dotsize=8pt,nodesep=2pt] + {\Tdot}{% + \pstree[treemode=L]{\Tdot}{\Tcircle{1} \Tcircle{2}} + \pstree{\Tdot}{\Tcircle{3} \Tcircle{4}}} +\end{LTXexample} + +\noindent Da man die Ausrichtung eines Baumes ändern kann, kann es sinnvoll sein, einen Baum +(<baumA>) als Wurzelknoten (von +<baumB>) einzuschließen. Das ergibt einen einzelnen logischen Baum, dessen Wurzel die Wurzel von +<baumB> ist und der +Nachfolger in verschiedenen Richtungen hat, abhängig davon, ob diese als Nachfolger von <baumA> oder +<baumB> erscheinen. + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \pstree{\pstree[treemode=L]{\Tcircle{root}}{\Tr{B}}}{% + \Tr{A1} + \Tr{A2}} +\end{LTXexample} + +%%DG: to do + +\noindent Beachten Sie als verwandtes Thema, dass jeder Knoten, der eine LR-Box erzeugt, einen Baum +enthalten kann. +Verschachtelte Bäume dieser Art stehen jedoch in keiner Beziehung zum Rest des Baumes. Hier ist ein +Beispiel dafür: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \psTree{\Tcircle{% + \pstree[treesep=0.4,levelsep=0.6, + nodesepB=-6pt]{\Tdot}{% + \TR{a} \TR{b}}}} + \TC + \TC + \endpsTree +\end{LTXexample} + +\noindent Wenn der Baum nach oben oder unten wächst, werden die Nachfolger in der Reihenfolge, in der +sie in \Lcs{pstree} +erscheinen von links nach rechts aufgereiht. Wenn der Baum nach links oder +rechts wächst, werden die Nachfolger von oben +nach unten aufgereiht. Im Nachhinein könnte man die Reihenfolge der Knoten umdrehen. Der Code +\Lkeyword{treeflip}=\true/\false{} ermöglicht dies. Zum Beispiel: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] +\footnotesize +\pstree[treemode=U,dotstyle=otimes,dotsize=8pt, + nodesep=2pt,treeflip=true]{\Tdot}{% + \pstree[treemode=R]{\Tdot}{\Tcircle{1} \Tcircle{2}} + \pstree{\Tdot}{\Tcircle{3} \Tcircle{4}}} +\end{LTXexample} +Beachten Sie, dass man immer noch zurückgehen und den \Lkeyword{treemode} des Unterbaums, der nach +links wuchs, ändern müsste. + + +\section{Der Abstand zwischen Nachfolgern} + +Der Abstand zwischen Nachfolgern wird durch \Lkeyword{treesep} bestimmt. Der Rest dieses Abschnitts +zeigt Wege, wie +man die Feinabstimmung für die Zwischenräume bei Nachfolgern vornimmt. Die Art und Weise wie die +Abstände zwischen Unterbäumen berechnet werden, kann durch den +Parameter \Lkeyword{treefit}=\Lkeyval{tight}/\Lkeyval{loose} geändert +werden. Hier sind zwei Methoden: + +\begin{description} +\item[\Lkeyval{tight}]Wenn \Lkeyset{treefit=tight} (Normalfall) eingestellt ist, wird +\Lkeyword{treesep} der Minimalabstand zwischen jeder der Ebenen der Unterbäume. +\item[\Lkeyval{loose}]Wenn \Lkeyset{treefit=loose} eingestellt ist, wird \Lkeyword{treesep} +der Abstand zwischen den Bounding Boxes der Unterbäume. Außer bei großen Zwischenknoten hat dies +zur Folge, dass der horizontale Abstand (oder +der vertikale Abstand bei horizontalen Bäumen) zwischen all den Endknoten der gleiche ist (auch wenn +sie sich auf verschiedenen Ebenen befinden).\footnote{% +Wenn alle Endknoten auf der gleichen Ebene liegen und die Zwischenknoten nicht breiter als die +Grundlinien ihrer +zugehörigen \Index{Unterbäume} sind, entfällt der Unterschied zwischen beiden Methoden.} +\end{description} + +\noindent Zum Vergleich: +\begin{center} +\tabcolsep=1cm +\begin{tabular}{cc} + \psset{radius=2pt} + \pstree{\TC*}{% + \TC + \pstree{\TC*}{% + \pstree{\Tc{3pt}}{\TC \TC} + \TC*}} + & + \psset{radius=2pt} + \pstree[treefit=loose]{\TC*}{% + \TC + \pstree{\TC*}{% + \pstree{\Tc{3pt}}{\TC \TC} + \TC*}} +\end{tabular} +\end{center} + +\noindent Bei \Lkeyset{treefit=loose} benötigen Bäume mehr Platz, die Struktur des Baumes wird dabei +manchmal betont. +%Another (orthogonal) way to highlight the structure of the tree is by setting +%\begin{Ex} +% \Par{xtreesep=dim} +%\end{Ex} +%to a positive value. The effect is that adjacent nodes with different parents +%are farther apart than adjacent nodes with the same parent.\footnote{% +%When \p{treefit=tight}, the minimum distance between levels other than the top +%of the subtrees is increased by \p{xtreesep}. When \p{treefit=loose}, the +%minimum distance between subtrees is increased by \p{xtreesep}}. + +%This would have no effect in the previous two examples, but compare the +%spacing between the two subtrees in +%\begin{LTXexample} +% \psTree[radius=2pt,levelsep=1.5,xtreesep=.25cm] \TC* \\ +% \pstree{\TC*}{\TC* \TC*} +% \pstree{\TC*}{\TC* \TC*} +% \endpsTree +%\end{LTXexample} +%with the spacing in +%\begin{LTXexample} +% \psTree[radius=2pt,levelsep=1.5] \TC* \\ +% \pstree{\TC*}{\TC* \TC*} +% \pstree{\TC*}{\TC* \TC*} +% \endpsTree +%\end{LTXexample} + +\noindent Manchmal will man den Abstand zwischen den Mittelpunkten der Knoten regelmäßig gestalten, +auch wenn die Knoten unterschiedlich groß sind. Wenn man \Lkeyword{treenodesize} auf einen positiven +Wert setzt, stellt PSTricks die Breite (oder +Höhe+Tiefe bei vertikalen Bäumen) auf \Lkeyword{treenodesize}, \emph{um den Abstand zwischen den +Nachfolgern zu berechnen}. + +\noindent Dreigliedrige Bäume sehen beispielsweise gut aus, wenn sie wie im folgenden Beispiel +symmetrisch sind: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \pstree[nodesepB=-8pt,treenodesize=.85]{\Tc{3pt}}{% + \TR{$x=y$} + \TR{$x_1=y_1$} + \TR{$x_{11}=y_{11}$}}%$ +\end{LTXexample} + +\noindent Vergleichen Sie mit folgendem Beispiel, wo sich der Abstand mit der Größe der Knoten ändert: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \pstree[nodesepB=-8pt]{\Tc{3pt}}{% + \TR{$x=y$} + \TR{$x_1=y_1$} + \TR{$x_{11}=y_{11}$}}%$ +\end{LTXexample} + +\noindent Wenn alles andere nicht funktioniert, kann man den Abstand zwischen zwei Nachfolgern durch +das Einfügen von \Lcs{tspace}\Largb{length} zwischen beiden ausrichten: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \pstree{\Tc{3pt}}{% + \Tdia{foo} + \tspace{-0.5} + \Toval{and} + \Ttri{bar}} +\end{LTXexample} + +\section{Abstand zwischen der Wurzel und den Nachfolgern} + +Der Abstand zwischen den Mittellinien der Baumebenen ist \Lkeyword{levelsep}. Wenn man will, dass +sich der Abstand +zwischen den Ebenen mit deren Größe ändert, verwendet man die *-Konvention. \Lkeyword{levelsep} ist +dann der Abstand +zwischen dem unteren Ende der einen und dem oberen Ende der nächsten Ebene (oder zwischen den Seiten +der beiden Ebenen bei horizontalen Bäumen). + +\noindent Beachten Sie: PSTricks muss Informationen in die \Lext{aux}-Datei (unter \LaTeX) oder +\Lcs{jobname}.pst andererseits +schreiben, um den Abstand zu berechnen. Sie müssen die Eingabedatei einige Male kompilieren, bevor +PSTricks die Abstände korrekt einrichtet. +%%DG: to do +%You are most likely to want to set \p{varlevelsep} to "true" in horizontal +Vergleichen Sie das folgende Beispiel: + +\begin{LTXexample} + \def\psedge#1#2{\ncdiagg[nodesep=3pt,angleA=180,armA=0]{#2}{#1}} + \pstree[treemode=R,levelsep=*1cm]{\Tr{George Alexander Kopf VII}}{% + \pstree{\Tr{Barry Santos}}{\Tr{James Kyle} \Tr{Ann Ada}} + \pstree{\Tr{Terri Maloney}}{\Tr{Uwe Kopf} \Tr{Vera Kan}}} +\end{LTXexample} + +\noindent mit diesem Beispiel, in dem der Abstand zwischen den Ebenen unverändert ist: + +\begin{LTXexample} + \def\psedge#1#2{\ncdiagg[nodesep=3pt,angleA=180,armA=0]{#2}{#1}} + \pstree[treemode=R,levelsep=3cm]{\Tr{George Alexander Kopf VII}}{% + \pstree{\Tr{Barry Santos}}{\Tr{James Kyle} \Tr{Ann Ada}} + \pstree{\Tr{Terri Maloney}}{\Tr{Uwe Kopf} \Tr{Vera Kan}}} +\end{LTXexample} + +%The center of the root node of a tree is positioned above the midpoint between +%the centers of the two outer successors. If you want the root to be positioned +%drectly above one of the successors, put the command +% \Mac \treecenter +%right \emph{after} that successor. For example: +%\begin{LTXexample} +% \def\myfan#1{\Tfan[fillstyle=solid,fillcolor=#1]\treecenter}% +% \pstree{\Tcircle{$x_2$}}{% +% \pstree{\Tcircle{$x_1$}}{% +% \pstree{\Tcircle{$x_0$}}{\myfan{black}} +% \myfan{gray}} +% \myfan{white}} +%\end{LTXexample} + +%Here is another interesting example: +%\begin{example} +% \def\psedge{\ncangle[angleA=0,angleB=90]} +% \pstree[treesep=10pt]{\Tcircle[name=after]{$x_0$}}{% +% \Tfan[fillstyle=solid,fillcolor=black] +% \treecenter +% \pstree{\Tcircle{$x_1$}}{\Tfan[fillstyle=solid,fillcolor=darkgray]} +% \pstree{\Tcircle{$x_2$}}{\Tfan[fillstyle=solid,fillcolor=gray]} +% \pstree{\Tcircle{$x_3$}}{\Tfan[fillstyle=solid,fillcolor=lightgray]} +% \pstree{\Tcircle{$x_4$}}{\Tfan[fillstyle=solid,fillcolor=white]}} +%\end{example} + + +\section{Äste} + +Wenn man einen Baumknoten-Befehl verwendet, ist \Lcs{pssucc} gleich dem Namen des Knoten +und \Lcs{pspred} ist gleich dem Namen des Vorgängerknotens. Daher kann man eine Linie zwischen dem +Knoten und dessen Vorgänger zeichnen, +indem man beispielsweise Folgendes einfügt: + +\begin{lstlisting}[style=syntax] +\ncline{\pspred}{\pssucc} +\end{lstlisting} + +\noindent Um sich den Aufwand für jeden Knoten zu ersparen, führt jeder Knoten folgenden Befehl aus: +\begin{lstlisting}[style=syntax] + \psedge{\pspred}{\pssucc} +\end{lstlisting} +Die Standarddefiniton für \Lcs{psedge} ist \Lcs{ncline}, kann aber nach Belieben mit \Lcs{def} oder +\Lcs{renewcommand} von \LaTeX{} redefiniert werden. + +\noindent Im Folgenden wird beispielsweise \Lcs{ncdiag} mit +\Lkeyword{armA}=0 verwendet, um alle Knotenverbindungen vom selben +Punkt des Vorgängers ausgehen zu lassen. \LaTeX-User können stattdessen eingeben: +\begin{lstlisting}[style=syntax] +\renewcommand{\psedge}{\ncdiag[armA=0,angleB=180,armB=1cm]} +\end{lstlisting} + + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \def\psedge{\ncdiag[armA=0,angleB=180,armB=1cm]} + \pstree[treemode=R,levelsep=3.5cm,framesep=2pt]{\Tc{6pt}}{% + \small \Tcircle{K} \Tcircle{L} \Tcircle{M} \Tcircle{N}} +\end{LTXexample} + +\noindent Hier ist ein Beispiel mit \Lcs{ncdiagg}. Beachten Sie die Verwendung eines negativen Wertes +für \Lkeyword{armA}, damit die Ecken der Äste vertikal ausgerichtet sind, auch wenn die Knoten +verschieden groß sind: + +\begin{LTXexample} +$ +\def\psedge#1#2{\ncdiagg[angleA=180,armA=1cm,nodesep=4pt]{#2}{#1}} +% Or: \renewcommand{\psedge}[2]{ ... } +\pstree[treemode=R, levelsep=5cm]{\Tc{3pt}}{% + \Tr{z_1\leq y} \Tr{z_1<y\leq z_2} \Tr{z_2<y\leq x} \Tr{x<y} +} +$ +\end{LTXexample} + +\noindent Eine andere Methode, \Lcs{psedge}\Largb{} zu definieren, stellt die Verwendung des +\Lkeyword{edge}-Parameters dar. +Stellen Sie sicher, den Wert in geschweifte Klammern einzuschließen, wenn er Kommata oder andere +Parameterbegrenzungen +enthält. Dies sieht in langen Befehlen sehr unübersichtlich aus und man kann keine Argumente wie im +vorangegangenen +Beispiel verwenden, für einfache Änderungen ist es aber nützlich. Wenn man zum Beispiel häufig +zwischen einigen +Knotenverbindungen umschalten möchte, könnte man einen Befehl für jede Knotenverbindung definieren und +dann den \Lkeyword{edge}-Parameter benutzen. + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \def\dedge{\ncline[linestyle=dashed]} + \pstree[treemode=U,radius=2pt]{\Tc{3pt}}{% + \TC*[edge=\dedge] + \pstree{\Tc{3pt}}{\TC*[edge=\dedge] \TC*} + \TC*} +\end{LTXexample} + +\noindent Man kann auch \Lkeyset{edge=none} einstellen um die Knotenverbindung zu unterdrücken. + +\noindent Wenn man eine Knotenverbindung zwischen zwei Knoten zeichnen möchte, die nicht direkt +Vorgänger und Nachfolger sind, +muss man den Knoten einen Namen geben, auf den man verweisen kann, indem man den +\Lkeyword{name}-Parameter benutzt. +Hier verbinde ich beispielsweise zwei Knoten auf der gleichen Ebene: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \pstree[nodesep=3pt,radius=2pt]{\Toval{nature}}{% + \pstree{\Tc[name=top]{3pt}}{\TC* \TC*} + \pstree{\Tc[name=bot]{3pt}}{\TC* \TC*}} + \ncline[linestyle=dashed]{top}{bot} +\end{LTXexample} + +\noindent Abschließend noch weitere Beispiele. + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \def\psedge{\nccurve[angleB=180, nodesepB=3pt]} + \pstree[treemode=R, treesep=1.5, levelsep=3.5]% + {\Toval{root}}{\Tr{X} \Tr{Y} \Tr{Z}} +\end{LTXexample} + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \pstree[nodesepB=3pt, arrows=->, xbbl=15pt, + xbbr=15pt, levelsep=2.5cm]{\Tdia{root}}{% + $ + \TR[edge={\ncbar[angle=180]}]{x} + \TR{y} + \TR[edge=\ncbar]{z} + $} +\end{LTXexample} + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \psset{armB=1cm, levelsep=3cm, treesep=1cm, + angleB=-90, angleA=90, arrows=<-, nodesepA=3pt} + \def\psedge#1#2{\ncangle{#2}{#1}} + \pstree[radius=2pt]{\Ttri{root}}{\TC* \TC* \TC* \TC*} +\end{LTXexample} + + + +\section{Labels bei Ästen und Knoten} + +Typischerweise wird eine Linie gleich nach dem Knoten gezeichnet und man kann Labels mittels +\Lcs{ncput}, \Lcs{tlput} +usw. anhängen. Mit \Lcs{tlput}, \Lcs{trput}, \Lcs{taput} und \Lcs{tbput} können die Labels vertikal +oder horizontal +ausgerichtet werden, genau wie bei Knoten. Das mag gut aussehen, zumindest dann, wenn die Neigung der +Knotenverbindungen nicht zu verschieden ist. + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \pstree[radius=2pt]{\Tp}{% + \psset{tpos=.6} + \TC* \tlput{k} + \pstree{\Tc{3pt} \tlput[labelsep=3pt]{r}}{% + \TC* \tlput{j} + \TC* \trput{i}} + \TC* \trput{m}} +\end{LTXexample} + +\noindent Innerhalb von Bäumen misst der Parameter \Lkeyword{tpos} die Entfernung zwischen Vorgänger +und Nachfolger, unabhängig +von der Ausrichtung des Baumes (außerhalb von Bäumen misst er die Entfernung von oben nach unten +verlaufenden bzw. von links nach rechts verlaufenden Knoten). + +Weiterhin setzt PSTricks \Lkeyset{shortput=tab} innerhalb von Bäumen. Dabei handelt es sich um eine +spezielle Option +von \Lkeyword{shortput}, die nicht außerhalb von Bäumen verwendet werden sollte. Sie implementiert +die folgenden Kürzel, die von der Ausrichtung des Baumes abhängen: + +\begin{center} +\begin{tabular}{ccc} + & \multicolumn{2}{c}{Kurz für:}\\ + \emph{Zeichen} & \emph{Vertikale} & \emph{Horizontale}\\[2pt] + \textasciicircum & \Lcs{tlput} & \Lcs{taput} \\ + \textunderscore & \Lcs{trput} & \Lcs{tbput} +\end{tabular} +\end{center} +(Das Schema ist umgekehrt, wenn \Lkeyset{treeflip=true}). + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \psset{tpos=.6} + \pstree[treemode=R, thistreesep=1cm, + thislevelsep=3cm,radius=2pt]{\Tc{3pt}}{% + \pstree[treemode=U, xbbr=20pt]{\Tc{3pt}^{above}}{% + \TC*^{left} + \TC*_{right}} + \TC*^{above} + \TC*_{below}} +\end{LTXexample} + +\noindent Geändert werden können die Zeichenkürzel mittels + +\begin{BDef} +\Lcs{MakeShortTab}\Largb{<char1>}\Largb{<char2>} +\end{BDef} + +Die \verb+\n*put+-Befehle können auch für gute Ergebnisse sorgen: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] + \psset{npos=.6,nrot=:U} + \pstree[treemode=R, thistreesep=1cm, + thislevelsep=3cm]{\Tc{3pt}}{% + \Tc{3pt}\naput{above} + \Tc*{2pt}\naput{above} + \Tc*{2pt}\nbput{below}} +\end{LTXexample} + +\noindent Mittels \Lcs{nput} kann man Knoten mit Labels versehen. Jedoch lässt \Lcs{pstree} diese +Labels außer acht, wenn es die Bounding Boxes berechnet. + +\noindent Es gibt eine spezielle Knotenlabel-Option für Bäume, die die Bounding Boxes berücksichtigt: +\begin{BDef} +\Lnotation{\texttildelow}\OptArg*{*}\OptArgs\Largb{stuff} +\end{BDef} +Nennen wir dies ein \glqq Baumknoten-Label \grqq + +\noindent Setzen Sie ein Baumknoten-Label gleich nach dem Knoten, auf den es sich beziehen soll, +bevor Sie dies für die anderen +Knotenverbindungs-Labels tun (Knotenverbindungs-Labels, inklusive der Kurzformen, können aber auf +ein Baumknoten-Label +folgen). Das Label wird in vertikalen Bäumen direkt unter dem Knoten positioniert; in anderen Bäumen +verläuft dies ähnlich. Zum Beispiel: + +\begin{LTXexample} + \pstree[radius=2pt]{\Tc{3pt}\nput{45}{\pssucc}{root}}{% + \TC*~{$h$} \TC*~{$i$} \TC*~{$j$} \TC*~{$k$}} +\end{LTXexample} + +\noindent Beachten Sie, dass es keine \glqq Langform\grqq{} für dieses Baumknoten-Label gibt. Man +kann jedoch das einzelne Zeichen für die Begrenzung des Labels folgendermaßen ändern: +\begin{BDef} +\Lcs{MakeShortTnput}\Largb{<char1>} +\end{BDef} +Wenn Sie es verwirrend finden, ein Einzelzeichen zu verwenden, können Sie auch auf eine Befehlssequenz +zurückgreifen. Zum Beispiel: +\begin{lstlisting}[style=syntax] +\MakeShortTnput{\tnput} +\end{lstlisting} + +\noindent Man kann mehrere Labels setzen, aber jedes folgende Label wird relativ zur die vorherigen +Labels beherbergenden +Bounding Box positioniert. Daher macht es einen Unterschied, in welcher Reihenfolge die Labels +platziert werden und +nicht alle Kombinationen ergeben zufriedenstellende Ergebnisse. + +\noindent Sie werden wahrscheinlich finden, dass die Baumknoten-Labels gut bei Endknoten +funktionieren, auch ohne Ihr Zutun. Wie +dem auch sei: Man kann die Baumknoten-Labels durch das Setzen verschiedener Parameter kontrollieren. + +\noindent Um das Label auf einer beliebigen Seite des Knotens zu platzieren +(\glqq l\grqq eft, \glqq r\grqq ight, \glqq a\grqq +bove oder \glqq b\grqq elow), stellt man +\Lkeyword{tnpos}=\Lkeyval{l}/\Lkeyval{r}/\Lkeyval{a}/\Lkeyval{b} ein. + +\begin{LTXexample}[pos=l,width=0.4\linewidth] +\psframebox{% + \pstree{\Tc{3pt}~[tnpos=a,tndepth=0pt,radius=4pt]{root}}{% + \TC*~[tnpos=l]{$h$} + \TC*~[tnpos=r]{$i$}}} +\end{LTXexample} + +\noindent Wenn das Argument leer gelassen wird (Normalfall), wählt PSTricks die Labelposition +automatisch. + +\noindent Um den Abstand zwischen Knoten und Label zu ändern, setzen sie \Lkeyword{tnsep} auf den +entsprechenden Wert. Wenn das +Argument leer gelassen wird (Normalfall), verwendet PSTricks den Wert von \Lkeyword{labelsep}. Bei +einem negativen Wert wird der Abstand vom Mittelpunkt des Knotens aus gemessen. + +\noindent Wenn Labels unterhalb eines Knotens positioniert werden, erhält das Label eine Minimalhöhe +von \Lkeyword{tnheight}. +Wenn man also Labels mehreren Knoten zuweist, die horizontal ausgerichtet +sind, und wenn diese Knoten entweder die +gleiche Tiefe besitzen oder \Lkeyword{tnsep} oder diese negativ ist und die Höhe jedes der Labels +nicht größer als +\Lkeyword{tnheight} ist, werden die Labels ebenfalls anhand ihrer Grundlinien ausgerichtet. Der +Normalfall ist +\nxLcs{ht}\Lcs{strutbox}, welcher in den meisten \TeX-Formaten die Höhe einer typischen Textlinie +in der +gebräuchlichen Schriftart darstellt. Beachten Sie, dass der Wert von \Lkeyword{tnheight} nicht +berechnet wird, bevor er verwendet wird. + +\noindent Die Positionierung ähnelt der von Labels, die unter einem Knoten stehen. Das Label erhält +eine \emph{Mindesttiefe} von +\Lkeyword{tndepth}. Für oberhalb oder unterhalb platzierte Labels wird der horizontale Referenzpunkt +des Labels, d.\,h. +der Punkt im Label direkt über oder unter dem Mittelpunkt des Knotens durch den +\Lkeyword{href}-Parameter gesetzt. + +\noindent Wenn Labels rechts oder links platziert werden, wird die rechte oder linke Kante des Labels +in der Entfernung +\Lkeyword{tnsep} vom Knoten positioniert. Der vertikale Punkt, der im Zentrum des Knotens ausgerichtet +wird, ergibt +sich aus \Lkeyword{tnyref}. Wenn dies leer bleibt, wird stattdessen \Lkeyword{vref} verwendet. +Behalten Sie im +Gedächtnis, dass \Lkeyword{vref} den vertikalen Abstand von der Grundlinie vorgibt. Ansonsten +funktioniert der +\Lkeyword{tnyref}-Parameter wie der \Lkeyword{yref}-Parameter, der das Stück der Distanz von der +Ober- zur Unterkante des Labels liefert. + +\section{Details} + +PSTricks ist recht zuverlässig, was die Platzierung der Knoten und das Anlegen einer Box betrifft, +deren Größe der +Bounding Box des Baumes ziemlich genau gleicht. Wie dem auch sei, PSTricks lässt die +Knotenverbindungen oder Labels +außer acht (mit Ausnahme der Baumknoten-Labels), wenn es die Bounding Boxes berechnet. + +\noindent Wenn Sie aus diesen oder anderen Gründen eine Feinabstimmung für die Bounding Boxes der +Knoten vornehmen wollen, +können Sie die folgenden Parameter auf den entsprechenden Wert setzen: + +~\\ +\begin{tabular}{@{}l l @{}} +\emph{Name} & \emph{Voreinstellung}\\\hline +\Lkeyword{bbl} & 0pt\\ +\Lkeyword{bbr}& 0pt\\ +\Lkeyword{bbh}& 0pt\\ +\Lkeyword{bbd}& 0pt\\ +\Lkeyword{xbbl}& 0pt\\ +\Lkeyword{xbbr}& 0pt\\ +\Lkeyword{xbbh}& 0pt\\ +\Lkeyword{xbbd}& 0pt +\end{tabular} + +~\\ +\noindent Die \glqq x\grqq-Versionen vergrößern die Bounding Box um den jeweiligen Wert, die anderen +setzen die Box auf den +entsprechenden Wert. Es gibt einen Parameter für jede Richtung vom Mittelpunkt des Knotens aus: +\textbf{l}eft, \textbf{r}ight, \textbf{h}eight (Höhe) und \textbf{d}epth (Tiefe). + +\noindent Diese Parameter beeinflussen Bäume und Knoten sowie Unterbäume, die ihre Richtung ändern, +jedoch keine Unterbäume, +welche in die gleiche Richtung verlaufen, wie deren übergeordneter Baum (solche Unterbäume haben ein +Profil anstelle +einer Bounding Box und sollten über die Änderung der den einzelnen Knoten zugehörigen Bounding Boxes +angepasst werden). + +\noindent Heben Sie sich die Feineinstellungen der Bounding Box für den Schluss auf, wenn sie +ansonsten mit dem Baum fertig sind. + +\noindent Sie können die Bounding Box sehen, wenn sie den Parameter +\Lkeyword{showbbox}=\true/\false{} auf \true{} setzen. Um +die Bounding Boxes aller Knoten im Baum zu sehen, muss dieser Parameter vor dem Baum gesetzt werden. + +\noindent Im folgenden Beispiel ragen die Labels aus der Bounding Box heraus: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] +\psset{tpos=.6,showbbox=true} +\pstree[treemode=U]{\Tc{5pt}}{% + \TR{foo}^{left} + \TR{bar}_{right}} +\end{LTXexample} + +\newpage +\noindent So schaffen wir Abhilfe: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] +\psset{tpos=.6,showbbox=true} +\pstree[treemode=U,xbbl=8pt,xbbr=14pt]{\Tc{5pt}}{% + \TR{foo}^{left} + \TR{bar}_{right}} +\end{LTXexample} + +\noindent Nun können wir den Baum umrahmen: + +\begin{LTXexample}[pos=l,width=0.4\linewidth] +\psframebox[fillstyle=solid,fillcolor=lightgray,framesep=14pt, + linearc=14pt,cornersize=absolute,linewidth=1.5pt]{% + \psset{tpos=.6,border=1pt,nodesepB=3pt} + \pstree[treemode=U,xbbl=8pt,xbbr=14pt]{% + \Tc[fillcolor=white,fillstyle=solid]{5pt}}{% + \TR*{foo}^{left} + \TR*{bar}_{right}}} +\end{LTXexample} + +\noindent Wir hätten das gleiche Ergebnis auch über das Ändern der Bounding Box der zwei +Endknoten erhalten können. + +\noindent Um Ebenen zu überspringen, verwendet man +\begin{BDef} +\LcsStar{skiplevel}\OptArgs\Largb{nodes or subtrees}\\[4pt] +\LcsStar{skiplevels}\OptArgs\Largb{int} \\ +\qquad<nodes or subtrees> \\ +\Lcs{endskiplevels} +\end{BDef} + +Dies sind eine Art Unterbäume, nur ohne Wurzelknoten. + +\begin{LTXexample} + \pstree[treemode=R,levelsep=1.8,radius=2pt]{\Tc{3pt}}{% + \skiplevel{\Tfan} + \pstree{\Tc{3pt}}{% + \TC* + \skiplevels{2} + \pstree{\Tc{3pt}}{\TC* \TC*} + \TC* + \endskiplevels + \pstree{\Tc{3pt}}{\TC* \TC*}}} +\end{LTXexample} + +\noindent Das Profil bei den fehlenden Ebenen ist das gleiche wie bei der ersten nicht fehlenden +Ebene. Man kann dies über die +Parameter der Bounding Box anpassen. Die maximale Kontrolle erhält man über den Einsatz verschachtelter +\Lcs{skiplevel}-Befehle anstelle von \Lcs{skiplevels}. + +\begin{LTXexample} +\large\psset{radius=6pt, dotsize=4pt} +\pstree[thislevelsep=0,edge=none,levelsep=2.5cm]{\Tn}{% + \pstree{\TR{Player 1}}{\pstree{\TR{Player 2}}{\TR{Player 3}}} + \psset{edge=\ncline} + \pstree{\pstree[treemode=R]{\TC}{\Tdot ~{(0,0,0)} ^{N}}}{% + \pstree{\TC[name=A] ^{L}}{% + \Tdot ~{(-10,10.-10)} ^{l} + \pstree{\TC[name=C] _{r}}{% + \Tdot ~{(3,8,-4)} ^{c} + \Tdot ~{(-8,3,4)} _{d}}} + \pstree{\TC[name=B] _{R}}{% + \Tdot ~{(10,-10.0)} ^{l} + \pstree{\TC[name=D]_{r}}{% + \Tdot ~{(4,8,-3)} ^{c} + \Tdot ~{(0,-5,0)} _{d}}}}} +\ncbox[linearc=.3,boxsize=.3,linestyle=dashed,nodesep=.4]{A}{B} +\ncarcbox[linearc=.3,boxsize=.3,linestyle=dashed,arcangle=25,nodesep=.4]{D}{C} +\end{LTXexample} + +\section{Der Spielraum bei Parameteränderungen} + +\Lkeyword{edge} ist der einzige Parameter, der, wenn im Parameterargument des Baumknotens gesetzt, +das Zeichnen der +Knotenverbindung beeinflusst (wenn man beispielsweise \Lkeyword{nodesep} ändern möchte, muss die +Linie die +Parameteränderung beinhalten oder man muss sie vor den Knoten setzen). + +\noindent Wie zu Beginn dieses Abschnitts angesprochen, beeinflussen mit +\Lcs{pstree} vollzogene Parameteränderungen alle +Unterbäume. Es gibt jedoch Varianten von einigen dieser Parameter, um lokale Änderungen +herbeizuführen, d.\,h. +Änderungen, die nur die aktuelle Ebene betreffen: \Lkeyword{thistreesep}, \Lkeyword{thistreenodesize}, +\Lkeyword{thistreefit}=\Lkeyval{tight}/\Lkeyval{loose} und \Lkeyword{thislevelsep}. + +Zum Beispiel: +\begin{LTXexample}[pos=l,width=0.4\linewidth] +\pstree[thislevelsep=.5cm,thistreesep=2cm, + radius=2pt]{\Tc*{3pt}}{% + \pstree{\TC*}{\TC* \TC*} + \pstree{\TC*}{\TC* \TC*}} +\end{LTXexample} + +\noindent Es gibt einige Dinge (wie \Lkeyword{levelsep}), die Sie vielleicht einheitlich für +eine Baumebene einstellen wollen. +Auf der Ebene <n> wird der Befehl \nxLcs{pstreehook<roman(n)>} (z.\,B. \Lcs{pstreehookii}) ausgeführt, +wenn er definiert +ist (der Wurzelknoten des gesamten Baumes ist Ebene 0, die nachfolgenden Baumobjekte und die +Knotenverbindungen vom +Wurzelknoten zu diesen Nachfolgern ist Ebene 1 usw.). Im folgenden Beispiel wird \Lkeyword{levelsep} +für Ebene 2 +geändert, ohne dabei den \Lkeyword{thislevelsep}-Parameter für jeden der drei Unterbäume der zweiten +Ebene gesondert einstellen zu müssen: + +\begin{LTXexample} +\[ +\def\pstreehookiii{\psset{thislevelsep=3cm}} +\pstree[treemode=R,levelsep=1cm,radius=2pt]{\Tc{4pt}}{% + \pstree{\TC*}{% + \pstree{\TC*}{\Tr{X_1} \Tr{X_2}} + \pstree{\TC*}{\Tr{Y_1} \Tr{Y_2}}} + \pstree{\TC*}{% + \pstree{\TC*}{\Tr{K_1} \Tr{K_2}} + \pstree{\TC*}{\Tr{J_1} \Tr{J_2}}}} +\] +\end{LTXexample} + +\clearpage +\section{Liste aller optionalen Argumente für \nxLPack{pst-tree}} + +Der Standardwert wird eingestellt, wenn ein optionales Argument ohne Wert aufgerufen wird, z.\, B. ist +\Lcs{pstree}\Largs{levelsep} das gleiche Argument wie \Lcs{pstree}\Largs{levelsep=2cm}. Alle +booleschen Argumente sind per Voreinstellung \false. + +\xkvview{family=pst-tree,columns={Option,Typ,Standardwert}} + +\nocite{*} +\bgroup +\raggedright +\bibliographystyle{plain} +%\bibliography{\jobname} +\newpage +\bibliography{pst-tree-doc} +\egroup + +\printindex + + +\end{document} |