% 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{}% }