% 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 % rechtslinks % 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