diff options
author | Karl Berry <karl@freefriends.org> | 2007-10-27 22:42:59 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2007-10-27 22:42:59 +0000 |
commit | 04f8d3312301550a655b78c346f9c38a9377e0c5 (patch) | |
tree | 9d33b81e721c0f7fdea86b630b2137ac06ce41ea /Master/texmf-dist/tex/latex/gu | |
parent | b573709765ac7c870e6e7ee9879a552dffd9f93b (diff) |
new latex package gu (25nov06)
git-svn-id: svn://tug.org/texlive/trunk@5293 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/gu')
-rw-r--r-- | Master/texmf-dist/tex/latex/gu/gu.sty | 958 |
1 files changed, 958 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/gu/gu.sty b/Master/texmf-dist/tex/latex/gu/gu.sty new file mode 100644 index 00000000000..a2b9c771f70 --- /dev/null +++ b/Master/texmf-dist/tex/latex/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{}% +} + + + |