summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/gu/gu.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/gu/gu.sty')
-rw-r--r--macros/latex/contrib/gu/gu.sty958
1 files changed, 958 insertions, 0 deletions
diff --git a/macros/latex/contrib/gu/gu.sty b/macros/latex/contrib/gu/gu.sty
new file mode 100644
index 0000000000..a2b9c771f7
--- /dev/null
+++ b/macros/latex/contrib/gu/gu.sty
@@ -0,0 +1,958 @@
+% 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{}%
+}
+
+
+