% This is `gu.sty'
% Copyright (C) 2006 Stefan Lange, all rights reserved.
%
% This package may be distributed and/or modified under the				 
% conditions of the LaTeX Project Public License, either version 1.3c	       
% of this license or (at your option) any later version.		       
% The latest version of this license is in				       
% http://www.latex-project.org/lppl.txt				       
% and version 1.3 or later is part of all distributions of LaTeX	       
% version 2003/12/01 or later.
%
%
% Changelog:
% 2006-11-20: erste ver�ffentlichte Version
% 2006-12-02: kleiner Bugfix (Pfeile rechts wurden bei
%             rblock{eins,zwei,drei}deltax != 0 nicht richtig verschoben)
% 2007-01-19: weiterer Bugfix: Pfeile von rechts-oben nach links-unten
%             wurden nicht richtig berechnet
%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{gu}[2007/01/19 Gruppe-Untergruppe-Stammbaeume]
\typeout{gu.sty, Version 2007-01-19, Paket zum Setzen von
Gruppe-Untergruppe-Stammbaeumen im Baernighausen-Formalismus}
\typeout{Copyright (C) 2006, 2007 Stefan Lange}
\DeclareOption{dvips}{\PassOptionsToPackage{\CurrentOption}{pict2e}}
\DeclareOption{xdvi}{\PassOptionsToPackage{\CurrentOption}{pict2e}}
\DeclareOption{pdftex}{\PassOptionsToPackage{\CurrentOption}{pict2e}}
\DeclareOption{vtex}{\PassOptionsToPackage{\CurrentOption}{pict2e}}
\DeclareOption{dvipdfm}{\PassOptionsToPackage{\CurrentOption}{pict2e}}
\DeclareOption{ltxarrows}{\PassOptionsToPackage{\CurrentOption}{pict2e}}
\DeclareOption{pstarrows}{\PassOptionsToPackage{\CurrentOption}{pict2e}}
\ProcessOptions\relax


\RequirePackage{array} 
\RequirePackage{tabularx}
\RequirePackage{pict2e}
\RequirePackage{calc}[2005/08/06]  % Infix-Notation f�r Rechnungen mit L�ngeneinheiten
\RequirePackage{fp}    % Gleitkomma-Berechnungen
\RequirePackage{ifthen} % Verzweigungen

\newcolumntype{z}{>{\centering\arraybackslash}X} % zentrierte Spalten
                                                 % mit fester Breite

\newlength{\@tempvar} % Tempor�re Variable

\newboolean{@randbox}
\newboolean{@lleinsvorhanden}
\newboolean{@llzweivorhanden}
\newboolean{@lpeinsvorhanden}
\newboolean{@lpzweivorhanden}
\newboolean{@lblockeinsvorhanden}
\newboolean{@lblockzweivorhanden}
\newboolean{@lblockdreivorhanden}
\newboolean{@lseinsvorhanden}
\newboolean{@lszweivorhanden}
\newboolean{@rblockeinsvorhanden}
\newboolean{@rblockzweivorhanden}
\newboolean{@rblockdreivorhanden}
\newboolean{@rseinsvorhanden}
\newboolean{@rszweivorhanden}
\newboolean{@rpeinsvorhanden}
\newboolean{@rpzweivorhanden}
\newboolean{@abstiegeinsvertzentr}
\newboolean{@abstiegzweivertzentr}
\newboolean{@kollisiono}
\newboolean{@kollisionu}
\newboolean{@kollisionl}
\newboolean{@kollisionr}

\newcommand{\@variableninitialisieren}{
\setboolean{@randbox}{false}
\setboolean{@lleinsvorhanden}{false}
\setboolean{@llzweivorhanden}{false}
\setboolean{@lpeinsvorhanden}{false}
\setboolean{@lpzweivorhanden}{false}
\setboolean{@lblockeinsvorhanden}{false}
\setboolean{@lblockzweivorhanden}{false}
\setboolean{@lblockdreivorhanden}{false}
\setboolean{@lseinsvorhanden}{false}
\setboolean{@lszweivorhanden}{false}
\setboolean{@rblockeinsvorhanden}{false}
\setboolean{@rblockzweivorhanden}{false}
\setboolean{@rblockdreivorhanden}{false}
\setboolean{@rseinsvorhanden}{false}
\setboolean{@rszweivorhanden}{false}
\setboolean{@rpeinsvorhanden}{false}
\setboolean{@rpzweivorhanden}{false}
\setboolean{@abstiegeinsvertzentr}{false}
\setboolean{@abstiegzweivertzentr}{true}
\setboolean{@kollisiono}{false}
\setboolean{@kollisionu}{false}
\setboolean{@kollisionl}{false}
\setboolean{@kollisionr}{false}


\newcommand{\@rechtepfeile}{}
\newcommand{\@lseins}{}
\newcommand{\@lleins}{}
\newcommand{\@lpeins}{}
\newcommand{\@lszwei}{}
\newcommand{\@llzwei}{}
\newcommand{\@lpzwei}{}
\newcommand{\@lblockeins}{}
\newcommand{\@lblockzwei}{}
\newcommand{\@lblockdrei}{}
\newcommand{\@rseins}{}
\newcommand{\@rszwei}{}
\newcommand{\@rblockeinsdeltaxem}{}
\newcommand{\@rblockeins}{}
\newcommand{\@rblockzweideltaxem}{}
\newcommand{\@rblockzwei}{}
\newcommand{\@rblockdreideltaxem}{}
\newcommand{\@rblockdrei}{}
\newcommand{\spaltenbreiteem}{}
\newcommand{\spalteneins}{}
\newcommand{\spaltenzwei}{}
\newcommand{\spaltendrei}{}
\newcommand{\@lpeinsminem}{}
\newcommand{\@lpzweiminem}{}
\newcommand{\@lleeryem}{}
\newcommand{\@rpeinsminem}{}
\newcommand{\@rpzweiminem}{}
\newcommand{\@rleeryem}{}
\newcommand{\@leerxem}{}
\newcommand{\@kollextrarandxem}{}
\newcommand{\@kollextrarandyem}{}
}


\newcommand{\@variablenreinitialisieren}{
\setboolean{@randbox}{false}
\setboolean{@lleinsvorhanden}{false}
\setboolean{@llzweivorhanden}{false}
\setboolean{@lpeinsvorhanden}{false}
\setboolean{@lpzweivorhanden}{false}
\setboolean{@lblockeinsvorhanden}{false}
\setboolean{@lblockzweivorhanden}{false}
\setboolean{@lblockdreivorhanden}{false}
\setboolean{@lseinsvorhanden}{false}
\setboolean{@lszweivorhanden}{false}
\setboolean{@rblockeinsvorhanden}{false}
\setboolean{@rblockzweivorhanden}{false}
\setboolean{@rblockdreivorhanden}{false}
\setboolean{@rseinsvorhanden}{false}
\setboolean{@rszweivorhanden}{false}
\setboolean{@rpeinsvorhanden}{false}
\setboolean{@rpzweivorhanden}{false}
\setboolean{@abstiegeinsvertzentr}{false}
\setboolean{@abstiegzweivertzentr}{true}
\setboolean{@kollisiono}{false}
\setboolean{@kollisionu}{false}
\setboolean{@kollisionl}{false}
\setboolean{@kollisionr}{false}

\renewcommand{\@rechtepfeile}{}
\renewcommand{\@lseins}{}
\renewcommand{\@lleins}{}
\renewcommand{\@lpeins}{}
\renewcommand{\@lszwei}{}
\renewcommand{\@llzwei}{}
\renewcommand{\@lpzwei}{}
\renewcommand{\@lblockeins}{}
\renewcommand{\@lblockzwei}{}
\renewcommand{\@lblockdrei}{}
\renewcommand{\@rseins}{}
\renewcommand{\@rszwei}{}
\renewcommand{\@rblockeinsdeltaxem}{}
\renewcommand{\@rblockeins}{}
\renewcommand{\@rblockzweideltaxem}{}
\renewcommand{\@rblockzwei}{}
\renewcommand{\@rblockdreideltaxem}{}
\renewcommand{\@rblockdrei}{}
\renewcommand{\spaltenbreiteem}{}
\renewcommand{\spalteneins}{}
\renewcommand{\spaltenzwei}{}
\renewcommand{\spaltendrei}{}
\renewcommand{\@lpeinsminem}{}
\renewcommand{\@lpzweiminem}{}
\renewcommand{\@lleeryem}{}
\renewcommand{\@rpeinsminem}{}
\renewcommand{\@rpzweiminem}{}
\renewcommand{\@rleeryem}{}
\renewcommand{\@leerxem}{}
\renewcommand{\@kollextrarandxem}{}
\renewcommand{\@kollextrarandyem}{}
}

\newcommand{\@umrechnen}[2]{   % aufrufen mit \@umrechnen{\laenge}{\variable}
\setlength{\@tempvar}{#1}      % rechnet \laenge in sp um und speichert das     
\FPset{#2}{\number\@tempvar}   % Ergebnis in \variable
}

\newcommand{\rpfeileinszwei}[2]{%
%
% aufrufen mit \rpfeileinszwei{startkastennr}{endkastennr}
%
% Pfeill�ngen rechts (L�nge bezieht sich auf die y-Komponente)
%
\ifthenelse{\boolean{@rpeinsvorhanden}}{
%
% Berechnung x-Werte der Pfeile rechts
\FPeval\@rleinsx{\@rblockeinsx+(({#1}-0.5)*\@spaltenbreite)+0.5*\@rblockeinsdeltax}
% Die Steigung f�r die nicht-vertikalen Pfeile
\FPeval\@rpstx{round(({#2}-{#1})*\@spaltenbreite+\@rblockzweideltax-\@rblockeinsdeltax,0)}  % Steigungskomponente 1: x
\FPeval\@rpsty{round(2*\@rpeinsh+\@rseinsh,0)}         % Steigungskomponente 2: y
% Wertebereich der Steigungskomponenten ist nur -1000..+1000
% so oft durch 10 teilen und runden, bis diese Bedingung erf�llt ist
%
\whiledo{\@rpstx > 1000 \OR \@rpstx<-1000 \OR \@rpsty > 1000 \OR \@rpsty < -1000}{
\FPeval\@rpstx{round(\@rpstx/10,0)}
\FPeval\@rpsty{round(\@rpsty/10,0)}
}
% Die Pfeill�nge f�r schr�ge Pfeile berechnet sich dadurch automatisch:
\FPifeq{\@rpstx}{0}
\FPeval\@rplaenge{\@rpeinsh}
\else
\FPeval\@rplaenge{abs(\@rpstx/\@rpsty*\@rpeinsh)}  % Pfeill�nge
\fi
%
% Koordinaten der restlichen Elemente
%
\FPifeq{\@rpstx}{0}
\FPset\@rpeinsx{\@rleinsx}
\else
% \@rplaenge muss mit dem Vorzeichen von \@rpstx multipliziert werden,
% sonst stimmt die Berechung f�r schr�g von rechts oben nach links unten 
% verlaufende unterbrochene Pfeile nicht! (siehe Bugreport von Leimi)
% Das Vorzeichen wird durch (\@rpstx/abs(\@rpstx)) bestimmt
% auch bei Kollisionskontrolle!
\FPeval\@rpeinsx{\@rleinsx+(\@rpstx/abs(\@rpstx))*\@rplaenge+(\@rseinsh*\@rpstx/\@rpsty)}
\fi

% Schneidet der Pfeil die Box der Transformationsmatrix?
% Den ganzen Schei� nur durchnudeln, wenns �berhaupt ein rseins gibt
\ifthenelse{\boolean{@rseinsvorhanden}}{
% Fall 1: Schneiden von Ober- oder Unterkante der Box
% x-Wert berechnen, f�r y=Oben, Unten der Transformations-Box
\FPifeq{\@rpstx}{0}
\FPeval\@kollisionxo{round(\@rleinsx,0)}
\FPset\@kollisionxu{\@kollisionxo}
\else
\FPeval\@kollisionxo{round(\@rleinsx+(\@rpstx/abs(\@rpstx))*\@rplaenge,0)}
\FPeval\@kollisionxu{round(\@rleinsx+(\@rpstx/abs(\@rpstx))*\@rplaenge+(\@rseinsh*\@rpstx/\@rpsty),0)}
\fi

% Fall 2: Schneiden von linker oder rechter Kante der Box
% y-Wert f�r x=rseinsx
\FPifeq{\@rpstx}{0}
{} % nix tun, macht keinen Sinn bei senkrechtem Pfeil
\else
\FPeval\@kollisionyl{round(
(\@rseinsy+\@rseinsh)-(\@rpsty/\@rpstx*(\@rseinsx-(\@rleinsx+(\@rpstx/abs(\@rpstx))*\@rplaenge)))
,0)}
% y-Wert f�r x=rseinsx+rseinsb
\FPeval\@kollisionyr{round(
(\@rseinsy+\@rseinsh)-(\@rpsty/\@rpstx*(\@rseinsx+\@rseinsb-(\@rleinsx+(\@rpstx/abs(\@rpstx))*\@rplaenge)))
,0)}
\fi

% Kollision ist dann, wenn kollisionxo oder u zwischen \@rseinsx und
% \@rseinsx+\rtanseinsb liegt incl. evtl.-feintuning
\FPeval\@kollxuntergr{round(\@rseinsx-\@kollextrarandx,0)}
\FPeval\@kollxobergr{round(\@rseinsx+\@rseinsb+\@kollextrarandx,0)}

\ifthenelse{\@kollisionxo > \@kollxuntergr \AND \@kollisionxo < \@kollxobergr}
{\setboolean{@kollisiono}{true}}{}
\ifthenelse{\@kollisionxu > \@kollxuntergr \AND \@kollisionxu < \@kollxobergr}
{\setboolean{@kollisionu}{true}}{}

% Kollision ist auch, wenn kollisionyl oder r zwischen rseinsy und
% rseinsy+rseinsh liegen (incl. evtl Koll.-feintuning)
%
% F�r senkrechte Pfeile macht diese Abfrage keinen Sinn, in diesem Fall
% bleibt alles auf false, also nur f�r rpstx!=0 testen
\FPifeq{\@rpstx}{0}
{} % nix tun
\else
\FPeval\@kollyuntergr{round(\@rseinsy-\@kollextrarandy,0)}
\FPeval\@kollyobergr{round(\@rseinsy+\@rseinsh+\@kollextrarandy,0)}
\ifthenelse{\@kollisionyl > \@kollyuntergr \AND \@kollisionyl < \@kollyobergr}
{\setboolean{@kollisionl}{true}}{}
\ifthenelse{\@kollisionyr > \@kollyuntergr \AND \@kollisionyl < \@kollyobergr}
{\setboolean{@kollisionr}{true}}{}
\fi
} % Ende if-Block rseinsvorhanden: Kollisionskontrolle
{}

\ifthenelse{\boolean{@kollisiono} \OR \boolean{@kollisionu} \OR
\boolean{@kollisionl} \OR \boolean{@kollisionr}}
{
% zeichnen
\put(\@rleinsx,\@rleinsy){%
\line(\@rpstx,-\@rpsty){\@rplaenge}%
}
\put(\@rpeinsx,\@rpeinsy){%
\vector(\@rpstx,-\@rpsty){\@rplaenge}%
}
% f�r n�chsten Pfeil wieder alles auf false setzen
\setboolean{@kollisiono}{false}
\setboolean{@kollisionu}{false}
\setboolean{@kollisionl}{false}
\setboolean{@kollisionr}{false}
}
% ansonsten einfach durchgehenden Pfeil zeichnen
{
\FPifeq{\@rpstx}{0}
\FPeval\@rplaenge{2*\@rplaenge+\@rseinsh}
\else
% Absolutbetrag! (bugreport Leimi)
\FPeval\@rplaenge{2*\@rplaenge+abs((\@rseinsh*\@rpstx/\@rpsty))}
\fi
\put(\@rleinsx,\@rleinsy){%
\vector(\@rpstx,-\@rpsty){\@rplaenge}%
}
}
}{}
}

\newcommand{\rpfeilzweidrei}[2]{%
%
% aufrufen mit \rpfeilzweidrei{startkastennr}{endkastennr}
%
% Pfeill�ngen rechts (L�nge bezieht sich auf die y-Komponente)
%
\ifthenelse{\boolean{@rpzweivorhanden}}{
%
% Berechnung x-Werte der Pfeile rechts
\FPeval\@rlzweix{\@rblockzweix+(({#1}-0.5)*\@spaltenbreite)+0.5*\@rblockzweideltax}
% Die Steigung f�r die nicht-vertikalen Pfeile
\FPeval\@rpstx{round(({#2}-{#1})*\@spaltenbreite+\@rblockdreideltax-\@rblockzweideltax,0)}  % Steigungskomponente 1: x
\FPeval\@rpsty{round(2*\@rpzweih+\@rszweih,0)}         % Steigungskomponente 2: y

% Wertebereich der Steigungskomponenten ist nur -1000..+1000
% so oft durch 10 teilen und runden, bis diese Bedingung erf�llt ist
%
\whiledo{\@rpstx > 1000 \OR \@rpstx<-1000 \OR \@rpsty > 1000 \OR \@rpsty < -1000}{
\FPeval\@rpstx{round(\@rpstx/10,0)}
\FPeval\@rpsty{round(\@rpsty/10,0)}
}
% Die Pfeill�nge f�r schr�ge Pfeile berechnet sich dadurch automatisch:
\FPifeq{\@rpstx}{0}
\FPeval\@rplaenge{\@rpzweih}
\else
\FPeval\@rplaenge{abs(\@rpstx/\@rpsty*\@rpzweih)}  % Pfeill�nge
\fi
%
% Koordinaten der restlichen Elemente
%
\FPifeq{\@rpstx}{0}
\FPset\@rpzweix{\@rlzweix}
\else
% \@rplaenge muss mit dem Vorzeichen von \@rpstx multipliziert werden,
% sonst stimmt die Berechung f�r schr�g von rechts oben nach links unten 
% verlaufende unterbrochene Pfeile nicht! (siehe Bugreport von Leimi)
% Das Vorzeichen wird durch (\@rpstx/abs(\@rpstx)) bestimmt
% auch bei Kollisionskontrolle!
\FPeval\@rpzweix{\@rlzweix+(\@rpstx/abs(\@rpstx))*\@rplaenge+(\@rszweih*\@rpstx/\@rpsty)}
\fi
% Schneidet der Pfeil die Box der Transformationsmatrix?
% Den ganzen Schei� nur durchnudeln, wenns �berhaupt ein rszwei gibt
\ifthenelse{\boolean{@rszweivorhanden}}{
% Fall 1: Schneiden von Ober- oder Unterkante der Box
% x-Wert berechnen, f�r y=Oben, Unten der Transformations-Box
\FPifeq{\@rpstx}{0}
\FPeval\@kollisionxo{round(\@rlzweix,0)}
\FPset\@kollisionxu{\@kollisionxo}
\else
\FPeval\@kollisionxo{round(\@rlzweix+(\@rpstx/abs(\@rpstx))*\@rplaenge,0)}
\FPeval\@kollisionxu{round(\@rlzweix+(\@rpstx/abs(\@rpstx))*\@rplaenge+(\@rszweih*\@rpstx/\@rpsty),0)}
\fi

% Fall 2: Schneiden von linker oder rechter Kante der Box
% y-Wert f�r x=rszweix
\FPifeq{\@rpstx}{0}
{} % nix tun, macht keinen Sinn bei senkrechtem Pfeil
\else
\FPeval\@kollisionyl{round(
(\@rszweiy+\@rszweih)-(\@rpsty/\@rpstx*(\@rszweix-(\@rlzweix+(\@rpstx/abs(\@rpstx))*\@rplaenge)))
,0)}
% y-Wert f�r x=rszweix+rszweib
\FPeval\@kollisionyr{round(
(\@rszweiy+\@rszweih)-(\@rpsty/\@rpstx*(\@rszweix+\@rszweib-(\@rlzweix+(\@rpstx/abs(\@rpstx))*\@rplaenge)))
,0)}
\fi

% Kollision ist dann, wenn kollisionxo oder u zwischen \@rszweix und
% \@rszweix+\rtanszweib liegt incl. evtl.-feintuning
\FPeval\@kollxuntergr{round(\@rszweix-\@kollextrarandx,0)}
\FPeval\@kollxobergr{round(\@rszweix+\@rszweib+\@kollextrarandx,0)}

\ifthenelse{\@kollisionxo > \@kollxuntergr \AND \@kollisionxo < \@kollxobergr}
{\setboolean{@kollisiono}{true}}{}
\ifthenelse{\@kollisionxu > \@kollxuntergr \AND \@kollisionxu < \@kollxobergr}
{\setboolean{@kollisionu}{true}}{}

% Kollision ist auch, wenn kollisionyl oder r zwischen rszweiy und
% rszweiy+rszweih liegen (incl. evtl Koll.-feintuning)
%
% F�r senkrechte Pfeile macht diese Abfrage keinen Sinn, in diesem Fall
% bleibt alles auf false, also nur f�r rpstx!=0 testen
\FPifeq{\@rpstx}{0}
{} % nix tun
\else
\FPeval\@kollyuntergr{round(\@rszweiy-\@kollextrarandy,0)}
\FPeval\@kollyobergr{round(\@rszweiy+\@rszweih+\@kollextrarandy,0)}
\ifthenelse{\@kollisionyl > \@kollyuntergr \AND \@kollisionyl < \@kollyobergr}
{\setboolean{@kollisionl}{true}}{}
\ifthenelse{\@kollisionyr > \@kollyuntergr \AND \@kollisionyl < \@kollyobergr}
{\setboolean{@kollisionr}{true}}{}
\fi
} % Ende if-Block rszweivorhanden: Kollisionskontrolle
{}
\ifthenelse{\boolean{@kollisiono} \OR \boolean{@kollisionu} \OR
\boolean{@kollisionl} \OR \boolean{@kollisionr}}
{
% zeichnen
\put(\@rlzweix,\@rlzweiy){%
\line(\@rpstx,-\@rpsty){\@rplaenge}%
}
\put(\@rpzweix,\@rpzweiy){%
\vector(\@rpstx,-\@rpsty){\@rplaenge}%
}
% f�r n�chsten Pfeil wieder alles auf false setzen
\setboolean{@kollisiono}{false}
\setboolean{@kollisionu}{false}
\setboolean{@kollisionl}{false}
\setboolean{@kollisionr}{false}
}
% ansonsten einfach durchgehenden Pfeil zeichnen
{
\FPifeq{\@rpstx}{0}
\FPeval\@rplaenge{2*\@rplaenge+\@rszweih}
\else
% Absolutbetrag! (bugreport Leimi)
\FPeval\@rplaenge{2*\@rplaenge+abs((\@rszweih*\@rpstx/\@rpsty))}
\fi
\put(\@rlzweix,\@rlzweiy){%
\vector(\@rpstx,-\@rpsty){\@rplaenge}%
}
}
}{}
}


\newcommand{\rechtspfeilsetup}[1]{
\renewcommand{\@rechtepfeile}{#1}
}

\newcommand{\labstiegeins}[1]{
\renewcommand{\@lseins}{#1}
\@umrechnen{\widthof{\@lseins}}{\@lseinsb}  % links, Symbol 1
\@umrechnen{\totalheightof{\fbox{\@lseins}}}{\@lseinsh}  % links, Symbol 1
\renewcommand{\@lleins}{\line(0,-1){\@lleinsh}}
\renewcommand{\@lpeins}{\vector(0,-1){\@lpeinsh}}
}

\newcommand{\labstiegzwei}[1]{
\renewcommand{\@lszwei}{#1}
\@umrechnen{\widthof{\@lszwei}}{\@lszweib}  % links, Symbol 1
\@umrechnen{\totalheightof{\fbox{\@lszwei}}}{\@lszweih}  % links, Symbol 1
\renewcommand{\@llzwei}{\line(0,-1){\@llzweih}}
\renewcommand{\@lpzwei}{\vector(0,-1){\@lpzweih}}
}

\newcommand{\lverbindungeins}[1]{
\renewcommand{\@lblockeins}{#1}
\@umrechnen{\widthof{\@lblockeins}}{\@lblockeinsb}
\@umrechnen{\totalheightof{\fbox{\@lblockeins}}}{\@lblockeinsh}
}

\newcommand{\lverbindungzwei}[1]{
\renewcommand{\@lblockzwei}{#1}
\@umrechnen{\widthof{\@lblockzwei}}{\@lblockzweib}
\@umrechnen{\totalheightof{\fbox{\@lblockzwei}}}{\@lblockzweih}
}

\newcommand{\lverbindungdrei}[1]{
\renewcommand{\@lblockdrei}{#1}
\@umrechnen{\widthof{\@lblockdrei}}{\@lblockdreib}
\@umrechnen{\totalheightof{\fbox{\@lblockdrei}}}{\@lblockdreih}
}

\newcommand{\rlagentranseins}[1]{
\renewcommand{\@rseins}{#1}
\@umrechnen{\widthof{\@rseins}}{\@rseinsb}  % rechts, Matrix 1
\@umrechnen{\totalheightof{\fbox{\@rseins}}}{\@rseinsh}  % rechts, Matrix 1
}

\newcommand{\rlagentranszwei}[1]{
\renewcommand{\@rszwei}{#1}
\@umrechnen{\widthof{\@rszwei}}{\@rszweib}  % rechts, Matrix 1
\@umrechnen{\totalheightof{\fbox{\@rszwei}}}{\@rszweih}  % rechts, Matrix 1
}

\newcommand{\rlagentabelleeins}[1]{
\renewcommand{\@rblockeins}{#1}
\@umrechnen{\widthof{\@rblockeins}+\@rblockeinsdeltaxem}{\@rblockeinsb} % rechts, Tabelle 1
\@umrechnen{\totalheightof{\@rblockeins}}{\@rblockeinsh}
}

\newcommand{\rlagentabellezwei}[1]{
\renewcommand{\@rblockzwei}{#1}
\@umrechnen{\widthof{\@rblockzwei}+\@rblockzweideltaxem}{\@rblockzweib} % rechts, Tabelle 1
\@umrechnen{\totalheightof{\@rblockzwei}}{\@rblockzweih}
}

\newcommand{\rlagentabelledrei}[1]{
\renewcommand{\@rblockdrei}{#1}
\@umrechnen{\widthof{\@rblockdrei}+\@rblockdreideltaxem}{\@rblockdreib} % rechts, Tabelle 1
\@umrechnen{\totalheightof{\@rblockdrei}}{\@rblockdreih}
}

\newcommand{\setuprlagentabellen}[7]{
\renewcommand{\spaltenbreiteem}{#1} % Spaltenbreite, bei Bedarf anpassen
\renewcommand{\spalteneins}{#2} % Anzahl der Spalten von Tab. 1
\renewcommand{\spaltenzwei}{#3} % Anzahl der Spalten von Tab. 2
\renewcommand{\spaltendrei}{#4} % Anzahl der Spalten von Tab. 3
\@umrechnen{\spaltenbreiteem}{\@spaltenbreite}
\renewcommand{\@rblockeinsdeltaxem}{#5}
\@umrechnen{\@rblockeinsdeltaxem}{\@rblockeinsdeltax}
\renewcommand{\@rblockzweideltaxem}{#6}
\@umrechnen{\@rblockzweideltaxem}{\@rblockzweideltax}
\renewcommand{\@rblockdreideltaxem}{#7}
\@umrechnen{\@rblockdreideltaxem}{\@rblockdreideltax}
}

\newcommand{\setuplinks}[8]{
\setboolean{@lblockeinsvorhanden}{#1}
\renewcommand{\@lpeinsminem}{#2}  % Mindestl�nge Pfeile/Linien links 1
\setboolean{@lseinsvorhanden}{#3}
\setboolean{@lblockzweivorhanden}{#4}
\renewcommand{\@lpzweiminem}{#5}  % Mindestl�nge Pfeile/Linien links 2
\setboolean{@lszweivorhanden}{#6}
\setboolean{@lblockdreivorhanden}{#7}
\renewcommand{\@lleeryem}{#8}  % vertikale Abst�nde, linke Spalte
\@umrechnen{\@lpeinsminem}{\@lpeinsmin} % Mindestl�nge Linie/Pfeil1 links, in sp
\@umrechnen{\@lpzweiminem}{\@lpzweimin} % Mindestl�nge Linie/Pfeil2 links, in sp
\@umrechnen{\@lleeryem}{\@lleery}  % links, Abst�nde in y, in sp
\ifthenelse{\NOT \@lpeinsmin > 0}{
\setboolean{@lleinsvorhanden}{false}
\setboolean{@lpeinsvorhanden}{false}}{
\setboolean{@lleinsvorhanden}{true}
\setboolean{@lpeinsvorhanden}{true}
}
\ifthenelse{\NOT \@lpzweimin > 0}{
\setboolean{@llzweivorhanden}{false}
\setboolean{@lpzweivorhanden}{false}}{
\setboolean{@llzweivorhanden}{true}
\setboolean{@lpzweivorhanden}{true}
}
}

\newcommand{\setuprechts}[8]{
\setboolean{@rblockeinsvorhanden}{#1}
\renewcommand{\@rpeinsminem}{#2}
\setboolean{@rseinsvorhanden}{#3}
\setboolean{@rblockzweivorhanden}{#4}
\renewcommand{\@rpzweiminem}{#5}
\setboolean{@rszweivorhanden}{#6}
\setboolean{@rblockdreivorhanden}{#7}
\renewcommand{\@rleeryem}{#8}
\@umrechnen{\@rpeinsminem}{\@rpeinsmin} % rechts, Pfeilh�hen/l�ngen, in sp
\@umrechnen{\@rpzweiminem}{\@rpzweimin} % rechts, Pfeilh�hen/l�ngen, in sp
\@umrechnen{\@rleeryem}{\@rleery} % rechts, Abst�nde in y, in sp
\ifthenelse{\NOT \@rpeinsmin > 0}{
\setboolean{@rpeinsvorhanden}{false}
}{
\setboolean{@rpeinsvorhanden}{true}
}
\ifthenelse{\NOT \@rpzweimin > 0}{
\setboolean{@rpzweivorhanden}{false}
}{
\setboolean{@rpzweivorhanden}{true}
}
}

\newcommand{\setupdivers}[6]{
\renewcommand{\@leerxem}{#1}      % horizontaler Abstand der beiden Spalten
\@umrechnen{\@leerxem}{\@leerx}  % Abstand links <-> rechts, in sp
\renewcommand{\@kollextrarandxem}{#2} % Extraabstand x f�r Kollisionskontrolle
\@umrechnen{\@kollextrarandxem}{\@kollextrarandx}
\renewcommand{\@kollextrarandyem}{#3} % Extraabstand y f�r Kollisionskontrolle
\@umrechnen{\@kollextrarandyem}{\@kollextrarandy}
\setboolean{@abstiegeinsvertzentr}{#4}
\setboolean{@abstiegzweivertzentr}{#5}
\setboolean{@randbox}{#6}
}

% sch�ne inline-Br�che
\providecommand{\nfrac}[2]{\leavevmode\kern.1em%
\raise.5ex\hbox{\scriptsize #1}%
\kern-.1em/\kern-.15em%
\lower.25ex\hbox{\scriptsize #2}}
% Ein paar Abk�rzungen f�r h�ufige Br�che
\providecommand{\eh}{\ensuremath{\nfrac{1}{2}}}
\providecommand{\ed}{\ensuremath{\nfrac{1}{3}}}
\providecommand{\ev}{\ensuremath{\nfrac{1}{4}}}
\providecommand{\es}{\ensuremath{\nfrac{1}{6}}}
\providecommand{\zd}{\ensuremath{\nfrac{2}{3}}}
\providecommand{\dv}{\ensuremath{\nfrac{3}{4}}}
\providecommand{\fs}{\ensuremath{\nfrac{5}{6}}}
\providecommand{\ea}{\ensuremath{\nfrac{1}{8}}}
\providecommand{\da}{\ensuremath{\nfrac{3}{8}}}
\providecommand{\fa}{\ensuremath{\nfrac{5}{8}}}
\providecommand{\sa}{\ensuremath{\nfrac{7}{8}}}


\newcommand{\@abmessungenaufnullsetzen}{
%
% Abmessungen f�r alle Elemente links auf 0 setzen:
\FPset\@lblockeinsh{0}
\FPset\@lblockeinsb{0}
\FPset\@lseinsh{0}
\FPset\@lseinsb{0}
\FPset\@lblockzweih{0}
\FPset\@lblockzweib{0}
\FPset\@lszweih{0}
\FPset\@lszweib{0}
\FPset\@lblockdreih{0}
\FPset\@lblockdreib{0}
% Abmessungen f�r alle Elemente rechts auf 0 setzen: 
\FPset\@rblockeinsh{0}
\FPset\@rblockeinsb{0}
\FPset\@rblockeinsdeltax{0}
\FPset\@rblockzweih{0}
\FPset\@rblockzweib{0}
\FPset\@rblockzweideltax{0}
\FPset\@rblockdreih{0}
\FPset\@rblockdreib{0}
\FPset\@rblockdreideltax{0}
\FPset\@rseinsh{0}
\FPset\@rseinsb{0}
\FPset\@rszweih{0}
\FPset\@rszweib{0}
}

\@variableninitialisieren
\@abmessungenaufnullsetzen

\newcommand{\@guberechnenundzeichnen}{
\setlength{\unitlength}{1sp}  % scaled point (kleinstm�gliche Einheit von TeX)
%
% Bestimmung maximale Breite links
\FPeval\@lmaxb{max(\@lblockeinsb,\@lseinsb)}
\FPeval\@lmaxb{max(\@lmaxb,\@lblockzweib)}
\FPeval\@lmaxb{max(\@lmaxb,\@lszweib)}
\FPeval\@lmaxb{max(\@lmaxb,\@lblockdreib)}
% -> \@lmaxb ist nun die maximale Breite in der linken Spalte in sp

% Bestimmung maximale Breite rechts
\FPeval\@rmaxb{max(\@rblockeinsb,\@rblockzweib)}
\FPeval\@rmaxb{max(\@rmaxb,\@rblockdreib)}
% -> \@rmaxb ist nun die maximale Breite in der rechten Spalte in sp

% Gesamtbreite
\FPeval\@maxb{\@lmaxb+\@leerx+\@rmaxb}

%
% Berechnung der Pfeill�ngen links und rechts
%
% Berechnung der Gesamth�hen von Abstieg eins und zwei
% unter Annahme der eingegebenen Pfeilmindestl�ngen

\FPeval\@labstiegeinsh{2*\@lleery+2*\@lpeinsmin+\@lseinsh}
\FPeval\@rabstiegeinsh{2*\@rleery+2*\@rpeinsmin+\@rseinsh}
\FPeval\@labstiegzweih{2*\@lleery+2*\@lpzweimin+\@lszweih}
\FPeval\@rabstiegzweih{2*\@rleery+2*\@rpzweimin+\@rszweih}

% H�he der Elemente mit ber�cksichtigen, wenn sie sp�ter vertikal zentriert
% werden:
\FPeval\@rabstiegeinshvergleich{\@rabstiegeinsh+0.5*\@rblockeinsh+0.5*\@rblockzweih}
\FPeval\@labstiegeinshvergleich{\@labstiegeinsh+0.5*\@lblockeinsh+0.5*\@lblockzweih}
\FPeval\@rabstiegzweihvergleich{\@rabstiegzweih+0.5*\@rblockzweih+0.5*\@rblockdreih}
\FPeval\@labstiegzweihvergleich{\@labstiegzweih+0.5*\@lblockzweih+0.5*\@lblockdreih}

% Abstieg eins
\FPifgt{\@rabstiegeinshvergleich}{\@labstiegeinshvergleich}
% rechts>links
% rechte Pfeile auf gew�nschtem Minimumwert belassen,
% linke L�ngen von Linie und Pfeil neu berechnen
\FPset\@rpeinsh{\@rpeinsmin}
\FPeval\@lleinsh{
               (\@rabstiegeinshvergleich
               -0.5*\@lblockeinsh
	       -0.5*\@lblockzweih
	       -2*\@lleery
	       -\@lseinsh)*0.5
	       }
\FPset\@lpeinsh{\@lleinsh}
%
\else
% rechts<links
% linke Pfeile auf gew�nschtem Minimumwert belassen,
% rechte Pfeill�ngen entsprechend berechnen
\FPset\@lleinsh{\@lpeinsmin}
\FPset\@lpeinsh{\@lpeinsmin}
\FPeval\@rpeinsh{
               (\@labstiegeinshvergleich
	       -0.5*\@rblockeinsh
	       -0.5*\@rblockzweih
	       -2*\@rleery
	       -\@rseinsh)*0.5
		}
\fi

% Abstieg zwei
\FPifgt{\@rabstiegzweihvergleich}{\@labstiegzweihvergleich}
% rechts>links
% rechte Pfeile auf gew�nschtem Minimumwert belassen,
% linke L�ngen von Linie und Pfeil neu berechnen
\FPset\@rpzweih{\@rpzweimin}
\FPeval\@llzweih{
               (\@rabstiegzweihvergleich
               -0.5*\@lblockzweih
	       -0.5*\@lblockdreih
	       -2*\@lleery
	       -\@lszweih)*0.5
	       }
\FPset\@lpzweih{\@llzweih}
%
\else
% rechts<links
% linke Pfeile auf gew�nschtem Minimumwert belassen,
% rechte Pfeill�ngen entsprechend berechnen
\FPset\@llzweih{\@lpzweimin}
\FPset\@lpzweih{\@lpzweimin}
\FPeval\@rpzweih{
               (\@labstiegzweihvergleich
	       -0.5*\@rblockzweih
	       -0.5*\@rblockdreih
	       -2*\@rleery
	       -\@rszweih)*0.5
		}
\fi


% Neuberechnung der H�hen f�r die Abstiege eins und zwei mit den aktuellen
% Pfeill�ngen
\FPeval\@labstiegeinsh{2*\@lleery+2*\@lpeinsh+\@lseinsh}
\FPeval\@rabstiegeinsh{2*\@rleery+2*\@rpeinsh+\@rseinsh}
\FPeval\@labstiegzweih{2*\@lleery+2*\@lpzweih+\@lszweih}
\FPeval\@rabstiegzweih{2*\@rleery+2*\@rpzweih+\@rszweih}
% H�he rechts:
\FPeval\@rh{
           \@rblockeinsh
          +\@rabstiegeinsh
	  +\@rblockzweih
	  +\@rabstiegzweih
	  +\@rblockdreih
	  }
% H�he links:
\FPeval\@lh{
           \@lblockeinsh
          +\@labstiegeinsh
	  +\@lblockzweih
	  +\@labstiegzweih
	  +\@lblockdreih
	  }
% Bestimmung der Gesamth�he
\FPeval\@maxh{max(\@rh,\@lh)}

%
% Berechnung der x-Werte:
%
% Berechung Mittelpunkt x linke Spalte
\FPeval\@lmx{\@lmaxb/2} % links, Mitte x

% Berechung der Startpunkte x der einzelnen Elemente
\FPeval\@lblockeinsx{\@lmx-(\@lblockeinsb/2)} % links Raumgruppe+Summenformel eins
\FPeval\@lseinsx{\@lmx-(\@lseinsb/2)}	% links, Symbol, 1
\FPeval\@lblockzweix{\@lmx-(\@lblockzweib/2)} % links Raumgruppe+Summenformel zwei
\FPeval\@lszweix{\@lmx-(\@lszweib/2)}	% links, Symbol, 2
\FPeval\@lblockdreix{\@lmx-(\@lblockdreib/2)} % links Raumgruppe+Summenformel drei

% Rechte Spalte
% x-Wert f�r Tabellen
\FPeval\@rblockeinsx{\@lmx+(0.5*\@lmaxb)+\@leerx+0.5*\@rblockeinsdeltax} %
%rechts, Tabelle eins x, 0.5*delta wegen makebox
\FPeval\@rblockzweix{\@lmx+(0.5*\@lmaxb)+\@leerx+0.5*\@rblockzweideltax} % rechts, Tabelle zwei x
\FPeval\@rblockdreix{\@lmx+(0.5*\@lmaxb)+\@leerx+0.5*\@rblockdreideltax} % rechts, Tabelle drei x

% Transformationsmatrix 1 mittig zu Tabelle 1
\FPeval\@rseinsx{\@rblockeinsx+0.5*0.5*(\@rblockeinsb+\@rblockzweib)-0.5*\@rseinsb}
% Transformationsmatrix 2 mittig zu Tabelle 2
\FPeval\@rszweix{\@rblockzweix+0.5*0.5*(\@rblockzweib+\@rblockdreib)-0.5*\@rszweib}

%
% Berechnung der y-Werte:
%
% Platzierung der Elemente so, dass immer Raumgruppe+Summenformel und
% die zugeh�rige Lagentabelle b�ndig sind.

\FPifgt{\@rblockeinsh}{\@lblockeinsh}
% Tabelle eins ganz oben
\FPeval\@rblockeinsy{\@maxh-\@rblockeinsh}
\FPeval\@lblockeinsy{\@rblockeinsy+0.5*\@rblockeinsh-0.5*\@lblockeinsh}
\else
% Raumgruppe+Summenformel eins ganz oben
\FPeval\@lblockeinsy{\@maxh-\@lblockeinsh}
\FPeval\@rblockeinsy{\@lblockeinsy+0.5*\@lblockeinsh-0.5*\@rblockeinsh}
\fi

% Startpunkte y der Symmetrieabstiegsbl�cke eins links und rechts
\FPeval\@lleinsy{\@lblockeinsy-\@lleery}
\FPeval\@rleinsy{\@rblockeinsy-\@rleery}


% Abstieg eins
% restliche Sachen so berechnen, dass alles sch�n vertikal zentriert ist.
\FPeval\@rblockzweiy{\@rleinsy-2*\@rpeinsh-\@rseinsh-\@rleery-\@rblockzweih}
\FPeval\@lblockzweiy{\@rblockzweiy+0.5*\@rblockzweih-0.5*\@lblockzweih}
\FPeval\@rseinsy{\@rleinsy-\@rpeinsh-\@rseinsh}

\FPeval\@lseinsy{\@lleinsy-\@lleinsh-\@lseinsh} % links zentriert
\ifthenelse{\boolean{@abstiegeinsvertzentr}}{
\FPeval\@labstiegeinsmittey{\@lseinsy+0.5*\@lseinsh}
\FPeval\@rabstiegeinsmittey{\@rseinsy+0.5*\@rseinsh}
\FPeval\@abstiegeinsmitteydelta{\@rabstiegeinsmittey-\@labstiegeinsmittey}
\FPeval\@lleinsh{\@lleinsh-\@abstiegeinsmitteydelta}
\FPeval\@lseinsy{\@lseinsy+\@abstiegeinsmitteydelta}
\FPeval\@lpeinsh{\@lpeinsh+\@abstiegeinsmitteydelta}
}{}
\FPset\@lpeinsy{\@lseinsy}
\FPeval\@rpeinsy{\@rleinsy-\@rpeinsh-\@rseinsh}

% Startpunkte y der Symmetrieabstiegsbl�cke zwei links und rechts
\FPeval\@llzweiy{\@lblockzweiy-\@lleery}
\FPeval\@rlzweiy{\@rblockzweiy-\@rleery}

% Abstieg zwei
% restliche Sachen so berechnen, dass alles sch�n vertikal zentriert ist.
\FPeval\@rblockdreiy{\@rlzweiy-2*\@rpzweih-\@rszweih-\@rleery-\@rblockdreih}
\FPeval\@lblockdreiy{\@rblockdreiy+0.5*\@rblockdreih-0.5*\@lblockdreih}
\FPeval\@rszweiy{\@rlzweiy-\@rpzweih-\@rszweih}

\FPeval\@lszweiy{\@llzweiy-\@llzweih-\@lszweih}
\ifthenelse{\boolean{@abstiegzweivertzentr}}{
\FPeval\@labstiegzweimittey{\@lszweiy+0.5*\@lszweih}
\FPeval\@rabstiegzweimittey{\@rszweiy+0.5*\@rszweih}
\FPeval\@abstiegzweimitteydelta{\@rabstiegzweimittey-\@labstiegzweimittey}
\FPeval\@llzweih{\@llzweih-\@abstiegzweimitteydelta}
\FPeval\@lszweiy{\@lszweiy+\@abstiegzweimitteydelta}
\FPeval\@lpzweih{\@lpzweih+\@abstiegzweimitteydelta}
}{}
\FPset\@lpzweiy{\@lszweiy}
\FPeval\@rpzweiy{\@rlzweiy-\@rpzweih-\@rszweih}


% Das ganze zeichnen

\begin{picture}(\@maxb,\@maxh)
\ifthenelse{\boolean{@randbox}}{
   \put(0,0){%
\framebox(\@maxb,\@maxh){}%
}
}{}

\ifthenelse{\boolean{@lblockeinsvorhanden}}{
   \put(\@lblockeinsx,\@lblockeinsy){%
\makebox(\@lblockeinsb,\@lblockeinsh){\@lblockeins}%
}
}{}

\ifthenelse{\boolean{@lleinsvorhanden}}{
   \put(\@lmx,\@lleinsy){%
\@lleins%
}
}{}
   
\ifthenelse{\boolean{@lseinsvorhanden}}{
   \put(\@lseinsx,\@lseinsy){%
\makebox(\@lseinsb,\@lseinsh){\@lseins}%
}
}{}      

\ifthenelse{\boolean{@lpeinsvorhanden}}{
   \put(\@lmx,\@lpeinsy){%
\@lpeins%
}
}{} 

\ifthenelse{\boolean{@lblockzweivorhanden}}{
   \put(\@lblockzweix,\@lblockzweiy){%
\makebox(\@lblockzweib,\@lblockzweih){\@lblockzwei}%
}
}{}

\ifthenelse{\boolean{@llzweivorhanden}}{
   \put(\@lmx,\@llzweiy){%
\@llzwei%
}
}{}
   
\ifthenelse{\boolean{@lszweivorhanden}}{
   \put(\@lszweix,\@lszweiy){%
\makebox(\@lszweib,\@lszweih){\@lszwei}%
}
}{}      

\ifthenelse{\boolean{@lpzweivorhanden}}{
   \put(\@lmx,\@lpzweiy){%
\@lpzwei%
}
}{}   

\ifthenelse{\boolean{@lblockdreivorhanden}}{
   \put(\@lblockdreix,\@lblockdreiy){%
\makebox(\@lblockdreib,\@lblockdreih){\@lblockdrei}%
}
}{}

\ifthenelse{\boolean{@rblockeinsvorhanden}}{
   \put(\@rblockeinsx,\@rblockeinsy){%
\makebox(\@rblockeinsb,\@rblockeinsh){\@rblockeins}%
}
}{}
   
\ifthenelse{\boolean{@rseinsvorhanden}}{
   \put(\@rseinsx,\@rseinsy){%
\makebox(\@rseinsb,\@rseinsh){\@rseins}%
}
}{}

\ifthenelse{\boolean{@rszweivorhanden}}{
   \put(\@rszweix,\@rszweiy){%
\makebox(\@rszweib,\@rszweih){\@rszwei}%
}
}{}

\ifthenelse{\boolean{@rblockzweivorhanden}}{
   \put(\@rblockzweix,\@rblockzweiy){%
\makebox(\@rblockzweib,\@rblockzweih){\@rblockzwei}%
}
}{}
   
\ifthenelse{\boolean{@rblockdreivorhanden}}{   
   \put(\@rblockdreix,\@rblockdreiy){%
\makebox(\@rblockdreib,\@rblockdreih){\@rblockdrei}%
}
}{}

\@rechtepfeile
   
\end{picture}
}

\newenvironment{stammbaum}%
{%
}%
{%
\@guberechnenundzeichnen{}%
\@variablenreinitialisieren{}%
\@abmessungenaufnullsetzen{}%
}