summaryrefslogtreecommitdiff
path: root/macros/latex209/contrib/fchart
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex209/contrib/fchart
Initial commit
Diffstat (limited to 'macros/latex209/contrib/fchart')
-rw-r--r--macros/latex209/contrib/fchart/fcdoc.pdfbin0 -> 92108 bytes
-rw-r--r--macros/latex209/contrib/fchart/fcdoc.tex345
-rw-r--r--macros/latex209/contrib/fchart/fchart.tex548
3 files changed, 893 insertions, 0 deletions
diff --git a/macros/latex209/contrib/fchart/fcdoc.pdf b/macros/latex209/contrib/fchart/fcdoc.pdf
new file mode 100644
index 0000000000..8fd7c35761
--- /dev/null
+++ b/macros/latex209/contrib/fchart/fcdoc.pdf
Binary files differ
diff --git a/macros/latex209/contrib/fchart/fcdoc.tex b/macros/latex209/contrib/fchart/fcdoc.tex
new file mode 100644
index 0000000000..dd185060db
--- /dev/null
+++ b/macros/latex209/contrib/fchart/fcdoc.tex
@@ -0,0 +1,345 @@
+\documentstyle[german]{article}
+
+\def\stat#1{$\langle${\em #1\/}$\rangle$}
+
+\def\bs{\tt\char'134}
+\def\lb{\tt\char'173}
+\def\rb{\tt\char'175}
+\def\ti{\tt\char'176}
+
+\def\exprleft{$\vcenter\bgroup\hsize=4.5cm}
+\def\exprmid{\egroup\Longrightarrow\vcenter\bgroup\hsize=6cm}
+\def\exprright{\egroup$}
+
+\input{fchart}
+
+\title{
+ {\tt floatchart}\\
+ Flu"sdiagramme in \TeX/\LaTeX
+}
+
+\author{M.~Schollmeyer}
+
+\begin{document}
+
+\maketitle
+
+{\tt floatchart} sind eine Sammlung von Definitionen, die das Erstellen von
+Struktogrammen in \TeX/\LaTeX\ erm"oglichen.
+
+Wenn man an \LaTeX\ und Struktogramme denkt, wird man geneigt sein, eine {\tt
+picture} Umgebung zu nehmen, eine Menge {\em counter} und {\em dimensions} zu
+definieren und\dots. \TeX\ bietet eine viel einfachere Art an, dieses Problem
+zu l"osen, und mich wundert es, da"s ich so etwas noch auf keinem SoftServer
+gesehen habe.
+
+Die Dateien {\tt fchart.tex} und {\tt fcdoc.tex} k"onnen "uber Anonymous Ftp vom
+SoftServer der Uni Stuttgart\hfill {\tt rusinfo.rus.uni-stuttgart.de}\hfill
+$[129.69.1.12]$\\
+"uber {\em INTERNET\/} bezogen werden.
+
+Falls jemand da drau"sen Vorschl"age, Anmerkungen oder Probleme (mit diesen
+Definitionen) hat, mein Name ist Michael Schollmeyer und ich bin "uber
+{\tt nw@itlrsun1.luftfahrt.uni-stuttgart.de} zu erreichen.
+
+\section{Struktogramme}
+Ein Dokument, in das Sie Struktogramme einbinden m"ochten, mu"s die Definitionen
+f"ur Struktogramme einlesen. Dazu mu"s irgendwo vor dem ersten Struktogramm der
+Befehl
+
+\begin{verbatim}
+ \input{fchart}
+\end{verbatim}
+
+\noindent stehen. Mit diesem Befehl werden die Definitionen eingelesen.
+Nat"urlich brauchen Sie die Datei {\tt fchart.tex} dazu. Sie k"onnen die Datei
+auch in {\tt fchart.sty} umbenennen und dann mit dem Befehl
+\verb|documentstyle| einbinden. Das ist schon alles was Sie brauchen, jetzt
+k"onnen Sie loslegen: Grunds"atzlich mu"s man zwischen Struktogrammen in \TeX\ und
+Struktogrammen in \LaTeX\ unterscheiden. Beide sehen nat"urlich genau gleich aus
+und sind auch gleich, nur die Bedienung ist etwas unterschiedlich. In \TeX\
+sagen Sie, wenn sie ein Flu"sdiagramm beginnen m"ochten
+
+\begin{verbatim}
+ \FLOATCHART(breite){titel}{
+ anweisungen
+ }
+\end{verbatim}
+
+\stat{breite} ist die Breite, die das Struktogramm einnehmen soll. Breite ist
+etwas, das \TeX\ \stat{dimen} nennt, also eine Dimension. Man kann hier
+beispielsweise \verb|10cm| eingeben. \stat{titel} ist eine beliebige
+Zeichenkette, die in die erste Box des Struktogramms gesetzt wird. In dieser
+Zeichenkette k"onnen die Befehle \verb|\TITLE{|\stat{string}\verb|}| und
+\verb|\VAR{|\stat{string}\verb|}| gesetzt werden. bei \verb|\TITLE| wird vor
+die Zeichenkette \stat{string} automatisch \verb|Program| gesetzt, bei
+\verb|\VAR| wird \verb|var| gesetzt. Diese Zeichenketten k"onnen auch ver"andert
+werden.
+
+In \LaTeX\ sagen sie
+
+\begin{verbatim}
+ \begin{floatchart}(breite){titel}
+ anweisungen
+ \end{floatchart}
+\end{verbatim}
+
+F"ur \stat{anweisungen} k"onnen mehrere der folgenden Befehle stehen. Es gibt f"ur
+jeden Schleifentyp eine Definition, mit der dieser Typ erzeugt werden kann.
+
+\begin{description}
+ \item[{\bs S\{\stat{text}\}}] Das ist der einfachste Befehl. S $\equiv$
+ {\em Statement}. Der Text wird links\-b"un\-dig in eine Box gesetzt.
+ \item[{\bs IF(\stat{text})\{\stat{anweisungen}\}\{\stat{anweisungen}\}}]
+ Es wird eine Verzweigungsstruktur mit zwei "Asten erzeugt. Jeder Ast kann
+ wieder beliebige Anweisungen enthalten. Das letzte Argument kann auch
+ weggelassen werden, dann ist dieser Anweisungsblock leer. Der Text "uber den
+ Verzweigungsbl"ocken kann mit \verb|\def\fnyes{...}| und \verb|\def\fnno{...}|
+ eingestellt werden.
+
+\end{description}
+
+ \exprleft
+ \begin{verbatim}
+\IF(\stat{text}){
+ \S{\stat{anweisungen}}
+}{
+ \S{\stat{anweisungen}}
+}
+ \end{verbatim}
+ \exprmid
+ \begin{floatchart}(6cm){\bs IF-Konstruktion}
+ \IF(\stat{text}){
+ \S{\stat{anweisungen}}
+ }{
+ \S{\stat{anweisungen}}
+ }
+ \end{floatchart}
+ \exprright
+
+\begin{description}
+ \item[{\bs WHILE(\stat{text})\{\stat{anweisungen}\}}]
+ Es wird eine Schleifenstruktur erzeugt. Die Zeichenkette vor {\tt text}
+ kann mit \verb|\def\fnwhile{...}| eingestellt werden.
+\end{description}
+
+ \exprleft
+ \begin{verbatim}
+\WHILE(\stat{text}){
+ \S{\stat{anweisungen}}
+}
+ \end{verbatim}
+ \exprmid
+ \begin{floatchart}(6cm){\bs WHILE-Konstruktion}
+ \WHILE(\stat{text}){
+ \S{\stat{anweisungen}}
+ }
+ \end{floatchart}
+ \exprright
+
+\begin{description}
+ \item[{\bs REPEAT\stat{anweisungen}\bs UNTIL(\stat{text})}]
+ Das ist ebenfalls eine Schleifenstruktur. Die Zeichenkette vor {\tt text}
+ kann mit \verb|\def\fnuntil{...}| eingestellt werden.
+\end{description}
+
+ \exprleft
+ \begin{verbatim}
+\REPEAT
+ \S{\stat{anweisungen}}
+\UNTIL(\stat{text})
+ \end{verbatim}
+ \exprmid
+ \begin{floatchart}(6cm){\bs REPEAT-Konstruktion}
+ \REPEAT
+ \S{\stat{anweisungen}}
+ \UNTIL(\stat{text})
+ \end{floatchart}
+ \exprright
+
+\begin{description}
+ \item[{\bs SWITCH(\stat{text})\{\stat{anweisungen}\}}]
+ Das ist eine spezielle Verzweigungsstruktur. Nein, eigentlich ist das eine
+ allgemeine Verweigungsstruktur, auf die z.B. die {\bs IF}-Konstruktion
+ aufbaut. F"ur \stat{anweisungen} sollten nur die beiden Befehle {\bs CASE}
+ und {\bs DEFAULT} verwendet werden.
+\end{description}
+
+ \exprleft
+ \begin{verbatim}
+\SWITCH(\stat{text}){
+ \CASE(\stat{first}){
+ \S{\stat{anw.}}
+ }
+ \CASE(\stat{second}){
+ \VOID
+ }
+ \DEFAULT(\stat{def}){
+ \S{\stat{anw.}}
+ }
+}
+ \end{verbatim}
+ \exprmid
+ \begin{floatchart}(6cm){\bs SWITCH-Konstruktion}
+ \SWITCH(\stat{text}){
+ \CASE(\stat{first}){
+ \S{\stat{anw.}}
+ }
+ \CASE(\stat{second}){
+ \VOID
+ }
+ \DEFAULT(\stat{def}){
+ \S{\stat{anw.}}
+ }
+ }
+ \end{floatchart}
+ \exprright
+
+\begin{description}
+ \item[{\bs FOR(\stat{first})\{\stat{upto}\}(\stat{last})\{\stat{anweisungen}\}}]
+ Das ist eine Schleifenstruktur, in der irgendetwas von einem Zustand in
+ einen Anderen ger"at und dabei evt.~das Abbruchkriterium beeinflu"st. Die
+ Zeichenkette vor {\tt first} kann mit \verb|\def\fnfor{...}| eingestellt
+ werden.
+\end{description}
+
+ \exprleft
+ \begin{verbatim}
+\FOR(\stat{first})
+ {\tt upto}
+ (\stat{last}){
+ \S{\stat{anweisungen}}
+}
+ \end{verbatim}
+ \exprmid
+ \begin{floatchart}(6cm){\bs FOR-Konstruktion}
+ \FOR(\stat{first}){\tt upto}(\stat{last}){
+ \S{\stat{anweisungen}}
+ }
+ \end{floatchart}
+ \exprright
+
+\begin{description}
+ \item[{\bs FOREVER\{\stat{anweisungen}\}}]
+ Das ist eine endlose Schleifenstruktur.
+\end{description}
+
+ \exprleft
+ \begin{verbatim}
+\FOREVER{
+ \S{\stat{anweisungen}}
+}
+ \end{verbatim}
+ \exprmid
+ \begin{floatchart}(6cm){\bs FOREVER-Konstruktion}
+ \FOREVER{
+ \S{\stat{anweisungen}}
+ }
+ \end{floatchart}
+ \exprright
+
+\vskip10pt
+
+Es gibt eine ganze Reihe von Variablen, die das Aussehen der Flu"sdiagramme
+beeinflussen. Einige dieser Variablen sind \verb|\count|er und
+\verb|\dimen|sionen, k"onnen also einfach durch \verb|\variable=wert| ver"andert
+werden. Andere Variablen sind \verb|\def|initionen, die mit
+\verb|\def\variable{wert}| ver"andert werden k"onnen. Die hier angegebenen Werte
+sind die Voreinstellungen.
+
+\begin{description}
+ \item[\tt\bs flnwidth=.5pt] Strichdicke f"ur horizontale und vertikale Linien
+ \item[\tt\bs boxskip=8pt] Abstand des Textes von den Linien
+ \item[\tt\bs boxindent=20pt] Einzug f"ur Verschachtelungen
+ \item[\tt\bs quality=200] Qualit"at f"ur diagonale Linien (klein=schlecht)
+ \item[\tt\bs def\bs fnname\{\bs tt Program \bs bf \}] Text f"ur Titelzeile
+ \item[\tt\bs def\bs fnvar\{\bs tt VAR \bs it \}] Text f"ur Variablen-Definitionen
+ \item[\tt\bs def\bs fnwhile\{\bs tt While \}] Text f"ur While-Schleife
+ \item[\tt\bs def\bs fnuntil\{\bs tt Until \}] Text f"ur While-Until-Schleife
+ \item[\tt\bs def\bs fnfor\{\bs tt For \}] Text f"ur For-Next-Schleife
+ \item[\tt\bs def\bs fnyes\{Yes \}] Text f"ur If-Then-Konstruktion
+ \item[\tt\bs def\bs fnno\{No \}] Text f"ur If-Then-Konstruktion
+ \item[\tt\bs fnnotext] Kein Text f"ur obige Variablen
+ \item[\tt\bs fndeftext] Default Text f"ur obige Variablen
+\end{description}
+
+
+\section{Baumstrukturen}
+
+Struktogramme sind eine brauchbare Art Abl"aufe schematisch darzustellen. F"ur
+Daten und Zusammenh"ange zwischen Daten k"onnen {\em Baumdiagramme} verwendet
+werden. Die Darstellung von Baumdiagrammen ist vielseitiger als die von
+Struktogrammen. Das hier verwendete Layout ist (noch) nicht weit verbreitet,
+aber es l"a"st sich gut in \TeX\ implementieren.
+
+Baumstrukturen basieren auf \stat{nodes}, die jeweils ein Datum darstellen.
+\stat{nodes}, die einger"uckt erscheinen, sind voneinander abh"angig.
+\stat{nodes}, die untereinander stehen, stehen in einer Verbindung zueinander.
+Wie stark diese Bindung ist, wird durch eine Linie angedeutet.
+
+\vskip10pt
+
+\node~{\bs node\it c\lb\it name\rb\it t\lb\it title\rb\lb\it subnodes\rb}-
+ {Druckt eine \stat{node}. Das ist der einzige Befehl, der zur Verf"ugung gestellt
+ wird. Alle anderen Sachen werden mit Optionen eingestellt.}{
+ \node!{\it c}-{Optionales Argument, da"s die Verbindungslinie oder eine
+ Referenz angibt. }{
+ \node{\it c= \tt !}-{Durchgezogene Verbindungslinie}
+ \node{\it c= \ti}-{Geschl"angelte Verbindungslinie}
+ \node{\it c += \tt +}-{Diese \stat{node} ist eine Referenz. Es wird kein Name
+ gedruckt, sondern ein Kreis mit einem automatisch generierten
+ Buchstaben in der Mitte. Der Name kann sp"ater wieder verwendet werden,
+ um den gleichen Buchstaben zu erhalten. Damit k"onnen Bez"uge hergestellt
+ werden.}
+ }
+ \node{\lb\it name\rb}-{Der Name der \stat{node}, wird in Klammern '$\langle
+ name\rangle$' gesetzt.}
+ \node!{\it t}-{Optionales Zeichen, das angibt, ob diese \stat{node} einen Titel
+ hat.}{
+ \node{\it t= \tt -}-{Es gibt einen Titel. Diese Option darf bei
+ Referenzen nicht benutzt werden.}
+ }
+ \node{\lb\it title\rb}-{Titel f"ur diese \stat{node}, wird \bs hangindent\rm`ed
+ gesetzt}
+ \node{\lb subnode\rb}-{Optionales Argument, da"s weitere \stat{subnodes} enth"alt.
+ Mit diesem Argument werden \stat{nodes} verschachtelt.}
+}
+\node~{\bs killnodes}-{Alle Referenzen l"oschen und mit der Buchstabierung neu
+ beginnen.}
+\node{\bs nodemark\{name\}}-{Der Buchstabe f"ur {\tt name} wird an dieser Stelle
+gesetzt.}
+
+\vskip10pt
+
+\node~{Apfelstrudel}-{Rezept nach Hausmannsart}{
+ \node!{Strudelteig}-{Aus den angegebenen Zutaten einen Strudelteig
+ herstellen ---Unter einem erhitzten Topf 30 Minuten ruhen lassen---}{
+ \node{$\mit 250\,\mbox{\it g}$ Mehl}
+ \node{$\mit 1\,\mbox{\it Teel.}$ Butter}
+ \node{$\mit 1\mbox{\it --}2$ Eier}
+ \node{$\mit 1/4\,\mbox{\it Tasse}$ lauwarmes Wasser}
+ \node{$\mit 1\,\mbox{\it Prise}$ Salz}
+ \node{$\mit 1/2\,\mbox{\it Teel.}$ Essig}
+ }
+ \node~{F"ulle}-{Die gezuckerten "Apfel auf dem Teil verteilen und Zimt, die
+ gehackten Mandeln und Sultaninen dar"uberstreuen.}{
+ \node{$\mit 2\,\mbox{\it kg}$ "Apfel}
+ \node{$\mit 8\,\mbox{\it E"sl.}$ Zucker}
+ \node{Zimt}
+ \node{$\mit 1\,\mbox{\it Tasse}$ Mandeln oder N"usse}
+ \node{$\mit 1\,1/2\,\mbox{\it Tassen}$ Sultaninen}
+ \node{$\mit 6\,\mbox{\it E"sl.}$ Butter}
+ \node{$\mit 4\,\mbox{\it E"sl.}$ Br"osel}
+ }
+ \node+{util}
+}
+\node~{Zwetschgennudeln}{
+ \node{\dots}
+}
+\node{\nodemark{util}$:=$Ger"ate}{
+ \node{R"uhrbesen}
+ \node{\dots}
+}
+\killnodes
+
+\end{document}
diff --git a/macros/latex209/contrib/fchart/fchart.tex b/macros/latex209/contrib/fchart/fchart.tex
new file mode 100644
index 0000000000..c842060fa7
--- /dev/null
+++ b/macros/latex209/contrib/fchart/fchart.tex
@@ -0,0 +1,548 @@
+% fchart.tex -- Version 2.0 -- Copyright (c) 1992 M.Schollmeyer -- 6.12.1992
+\message{fchart -- Version 2.0 -- Copyright (c) 1992 M.Schollmeyer}
+%
+% 1. Setzt Struktogramme in TeX/LaTeX
+% Aufbau eines Struktogramms:
+%
+% \FLOATCHART(<dimen>){<text>}{
+% \S{<text>}
+% \IF(<text>){ <statement> }{ <statement> }
+% \WHILE(<text>){ <statement> }
+% \REPEAT <statement> \UNTIL(<text>)
+% \SWITCH(<text>){\CASE(<text>){ <statement> }\DEFAULT(<text>){ <statement> }}
+% \FOR(<text>){<text>}(<text>){ <statement> }
+% \FOREVER{ <statement> }
+% }
+%
+% oder (nur in LaTeX):
+%
+% \begin{floatchart}(<dimen>){<text>}
+% <commands>
+% \end{floatchart}
+%
+% Folgende Variablen k"onnen extern modifiziert werden:
+% Defaultwerte in eckigen Klammern
+%
+% \flnwidth[=.5pt] Strichdicke f"ur horizontale und vertikale
+% Linien
+% \boxskip[=8pt] Abstand des Textes von den Linien
+% \boxindent[=20pt] Einzug f"ur Verschachtelungen
+% \quality[=200] Qualit"at f"ur diagonale Linien (klein=schlecht)
+% \def\fnname{\tt Program \bf } Text f"ur Titelzeile
+% \def\fnvar{\tt VAR \it } Text f"ur Variablen-Definitionen
+% \def\fnwhile{\tt While } Text f"ur While-Schleife
+% \def\fnuntil{\tt Until } Text f"ur While-Until-Schleife
+% \def\fnfor{\tt For } Text f"ur For-Next-Schleife
+% \def\fnyes{Yes } Text f"ur If-Then-Konstruktion
+% \def\fnno{No } Text f"ur If-Then-Konstruktion
+% \fnnotext Kein Text f"ur obige Variablen
+% \fndeftext Default Text f"ur obige Variablen
+%
+%
+% 2. Setzt Ablaufpl"ane
+%
+% \node<c>{name}<t>{title}{subnodes} -> prints a note
+% <c> -> optional argument specifying leaders:
+% <c>=! -> bar
+% <c>=~ -> serpentine line
+% <c>=+ -> this one is a refnode
+% {name} -> name of this note, will be set in angles '<name>'
+% <t> -> optional character specifying if there is a title
+% <t>=- -> there is a title
+% {title} -> title for this node, will be set \hangindended
+% {subnode} -> optional argument specifying subnodes
+%
+% Folgende Variablen k"onnen extern modifiziert werden:
+% Defaultwerte in eckigen Klammern
+%
+% \halfnodeindent[=1em] Halber Einzug f"ur Unterknoten
+%
+% 3. Below is a complete list of all commands in 'fchart'
+%
+% \@ifnextch@r
+% \@true
+% \@false
+% \textch@r
+% \@@ifnc
+% \@ifundefined
+% \b@xwidth
+% \flnwidth
+% \boxskip
+% \boxindent
+% \b@xheight
+% \quality
+% \@frightskip
+% \fndeftext
+% \fnname
+% \fnvar
+% \fnwhile
+% \fnuntil
+% \fnfor
+% \fnyes
+% \fnno
+% \fnnotext
+% \floatchart
+% \TITLE
+% \VAR
+% \endfloatchart
+% \@statement
+% \S
+% \FOREVER
+% \WHILE
+% \REPEAT
+% \SWITCH
+% \CASE
+% \DEFAULT
+% \VOID
+% \caseslash
+% \cross
+% \IF
+% \@ifthenelse
+% \@ifthen
+% \FOR
+% \@exprht
+% \halfnodeindent
+% \leaderb@r
+% \le@derwr
+% \node
+% \i@node
+% \leaderbar
+% \ii@node
+% \next
+% \iii@node
+% \iv@node
+% \refnode
+% \nodemark
+% \newnode
+% \expsubn@de
+% \killnod@s
+% \r@store
+% \addton@des
+% \killnodes
+
+\catcode`@=11 % Make AT letter
+
+%
+% \@ifnextchar t{true}{false}
+% Expands to {true} if the next token is <t>
+% {false} if the next token is not <t>
+%
+\def\@ifnextch@r #1#2#3{\def\@true{#2}\def\@false{#3}\let\testch@r#1
+ \futurelet\nextch@r\@@ifnc}
+\def\@@ifnc{
+ \ifx\nextch@r\testch@r\let\@exec\@true
+ \else\let\@exec\@false\fi\@exec
+}
+
+% \@ifundefined{NAME}{YES}{NO}
+% : If \NAME is undefined then it executes YES,
+% otherwise it executes NO. More precisely,
+% true if \NAME either undefined or = \relax.
+% taken from \LaTeX
+\long\def\@ifundefined#1#2#3{\expandafter\ifx\csname
+ #1\endcsname\relax#2\else#3\fi}
+
+\newdimen\b@xwidth % Aktuelle Breite der Boxen
+\newdimen\flnwidth \flnwidth=.5pt % Linienbreite f"ur Boxen
+\newdimen\boxskip \boxskip=8pt % Rand f"ur Boxen
+\newdimen\boxindent \boxindent=20pt % Einzug f"ur Boxen
+\newdimen\b@xheight % H"ohe der Boxen (switch--case)
+\newcount\quality \quality=200
+\newskip\@frightskip \@frightskip=\z@ plus 1fil
+
+\def\fndeftext{
+ \gdef\fnname{\tt Program \bf }
+ \gdef\fnvar{\tt VAR \it }
+ \gdef\fnwhile{{\tt While} }
+ \gdef\fnuntil{{\tt Until} }
+ \gdef\fnfor{{\tt For} }
+ \gdef\fnyes{\tt Yes }
+ \gdef\fnno{\tt No }
+}
+\fndeftext
+
+\def\fnnotext{
+ \let\fnname\empty
+ \let\fnvar\empty
+ \let\fnwhile\empty
+ \let\fnuntil\empty
+ \let\fnfor\empty
+ \let\fnyes\empty
+ \let\fnno\empty
+}
+
+% Die folgenden Definitionen sind f"ur \LaTeX
+%
+\def\floatchart(#1)#2{%
+ \vbox\bgroup%
+ \def\TITLE##1{\fnname ##1}%
+ \def\VAR##1{\fnvar ##1}%
+ \tolerance10000%
+ \hsize=#1 \b@xwidth=#1%
+ \parindent\z@%
+ \hrule width\b@xwidth height\flnwidth%
+ \vrule width\flnwidth%
+ \kern-\flnwidth%
+ \vbox\bgroup\rightskip=\@frightskip%
+ \S{#2}%
+}%
+
+\def\endfloatchart{%
+ \hfill\egroup%
+ \kern -\flnwidth%
+ \vrule width\flnwidth%
+ \egroup%
+}%
+
+% Die folgenden Definitionen sind f"ur \TeX oder \LaTeX
+%
+\def\FLOATCHART(#1)#2#3{\floatchart(#1){#2}{#3}
+ \endfloatchart}
+
+
+\long\def\@statement#1{\begingroup%
+ \advance\b@xwidth by -2\boxskip \advance\b@xwidth by -2\flnwidth%
+ \vskip \boxskip%
+ \hbox{\hskip \boxskip%
+ \vbox{\rightskip=\@frightskip%
+ \hsize=\b@xwidth #1%
+ }\hskip \boxskip%
+ }%
+ \vskip \boxskip%
+ \endgroup%
+ \hrule width\b@xwidth height\flnwidth%
+}%
+\let\S\@statement%
+
+\def\FOREVER#1{\vskip 3\boxskip plus 1fil%
+ \hbox{\hskip\boxindent\vrule width\flnwidth%
+ \kern -\flnwidth%
+ \vbox{\advance\b@xwidth by -\boxindent%
+ \hsize=\b@xwidth%
+ \vrule width\b@xwidth height\flnwidth%
+ {#1}}%
+ }
+ \vskip 2\boxskip plus 1fil%
+ \vrule width\b@xwidth height\flnwidth%
+}%
+
+\def\WHILE(#1)#2{{%
+ \advance\b@xwidth by -2\boxskip \advance\b@xwidth by -2\flnwidth%
+ \vskip \boxskip%
+ \hbox{\hskip \boxskip%
+ \vbox{\hsize=\b@xwidth\fnwhile {#1}}\hskip \boxskip}%
+ \vskip \boxskip%
+ }%
+ \nointerlineskip%
+ \hbox{\vrule width\boxindent height\flnwidth%
+ \vrule width\flnwidth%
+ \kern -\flnwidth%
+ \vbox{\advance\b@xwidth by -\boxindent%
+ \hsize=\b@xwidth%
+ \vrule width\b@xwidth height\flnwidth%
+ \vskip -\flnwidth%
+ \nointerlineskip%
+ {#2}%
+ }%
+ }%
+ \nointerlineskip%
+}%
+
+\def\REPEAT#1\UNTIL(#2){\begingroup%
+ \hbox{\hskip \boxindent%
+ \vrule width\flnwidth%
+ \kern -\flnwidth%
+ \vbox{\advance\b@xwidth by -\boxindent%
+ \hsize=\b@xwidth%
+ {#1}%
+ }%
+ }%
+ \endgroup\begingroup%
+ \advance\b@xwidth by -2\boxskip \advance\b@xwidth by -2\flnwidth%
+ \vskip \boxskip plus 1fil%
+ \nointerlineskip%
+ \hbox{\hskip \boxskip%
+ \vbox{%
+ \hsize=\b@xwidth\fnuntil #2%
+ }%
+ \hskip \boxskip%
+ }%
+ \vskip \boxskip plus 1fil%
+ \endgroup%
+ \vrule width\b@xwidth height\flnwidth%
+}%
+
+\def\SWITCH(#1)#2{\begingroup%
+ \advance\b@xwidth by -2\boxskip \advance\b@xwidth by -2\flnwidth%
+ \vskip \boxskip plus 1fil%
+ \hbox{%
+ \hskip \boxskip%
+ \vbox{%
+ \hsize=\b@xwidth #1%
+ }%
+ \hskip \boxskip%
+ }%
+ \vskip \boxskip plus 1fil%
+ \endgroup\begingroup%
+ \count255=0%
+ \def\CASE(##1)##2{\global\advance\count255 by 1}%
+ \let\DEFAULT\CASE%
+ {#2}\advance\b@xwidth by -\flnwidth%
+ \hbox to\b@xwidth{%
+ \dimen@=\b@xwidth \divide\dimen@ by\count255%
+ \advance\b@xwidth by -\dimen@%
+ \caseslash%
+ }%
+ \nointerlineskip%
+ \vskip -1pt%
+ \divide\b@xwidth by\count255%
+ \hsize=\b@xwidth%
+ \def\CASE(##1)##2{\hskip \z@\vbox{\S{##1}}%
+ \vrule width\flnwidth\kern-\flnwidth\hskip \z@}%
+ \def\DEFAULT(##1)##2{\hskip \z@\vbox{\S{##1}}%
+ \hskip \z@}%
+ \hbox{\hskip \z@#2}%
+ \vskip -1pt%
+ \def\CASE(##1)##2{\hskip \z@%
+ \vbox{##2}\vrule width\flnwidth\kern-\flnwidth\hskip \z@%
+ }%
+ \def\DEFAULT(##1)##2{\hskip \z@%
+ \vbox{##2}\hskip \z@%
+ }%
+ \nointerlineskip%
+ \let\VOID\cross%
+ % maximale H"ohe ermitteln und \b@xheight setzten
+ \b@xheight=\z@%
+ \setbox0=\hbox{#2}\b@xheight=\ht0%
+ % Boxen setzten
+ \hbox{\hskip\z@#2\hskip\flnwidth}%
+ \nointerlineskip%
+ \endgroup%
+}%
+
+\def\caseslash{\begingroup%
+ \advance\count255 by -1%
+ \dimen@i=\z@ \dimen@ii=\boxindent \divide\dimen@ii by\count255%
+ \divide\dimen@ii by\quality%
+ \advance\count255 by -1%
+ \hbox to \b@xwidth{%
+ \loop%
+ \count254=\quality%
+ {\loop%
+ \vbox to \boxindent{%
+ \vskip\dimen@i\hrule width\flnwidth height\flnwidth\vss\vfill%
+ }%
+ \hss\hfill%
+ \global\advance\dimen@i by \dimen@ii \advance\count254 by -1%
+ \ifnum\count254>0%
+ \repeat}%
+ \advance\count255 by -1%
+ \ifnum\count255>0%
+ {\dimen@ii=\boxindent \advance\dimen@ii by -\dimen@i%
+ \vbox to \boxindent{%
+ \vskip\dimen@i\hrule width\flnwidth height\dimen@ii\vss\vfill%
+ }%
+ \hss\hfill%
+ }%
+ \repeat%
+ \hfill%
+ }%
+ \hbox to\dimen@{%
+ \dimen@ii=\boxindent \divide\dimen@ii by\quality%
+ \count 254=\quality%
+ \dimen@i=\boxindent%
+ \loop%
+ \vbox to \boxindent{%
+ \vskip\dimen@i\hrule width\flnwidth height\flnwidth\vss\vfill%
+ }%
+ \hss\hfill%
+ \advance\dimen@i by -\dimen@ii%
+ \advance\count254 by -1%
+ \ifnum\count254>0%
+ \repeat%
+ \hfill%
+ }%
+ \endgroup%
+}%
+
+\def\cross{%
+ \ifdim\b@xheight=\z@\else % ignorieren, wenn wir beim scannen sind%
+ \baselineskip=\flnwidth%
+ \vskip \z@%
+ \vbox to \b@xheight{%
+ \dimen@=\b@xwidth \advance\dimen@ by -2\flnwidth%
+ \count254=\quality \dimen@i=\b@xwidth \divide\dimen@i by\count254%
+ \multiply\dimen@i by 2%
+ \loop%
+ \vskip \z@%
+ \hbox to \b@xwidth{%
+ \hfill\vrule height\flnwidth width\flnwidth%
+ \hskip\dimen@ \vrule height\flnwidth width\flnwidth\hfill%
+ }%
+ \vss%
+ \advance\dimen@ by -\dimen@i%
+ \advance\count254 by -1%
+ \ifnum\count254>0%
+ \repeat%
+ }%
+ \hrule height \flnwidth%
+ \fi%
+}%
+
+\def\IF(#1)#2{
+ \@ifnextch@r \bgroup{\@ifthenelse{#1}{#2}}{\@ifthen{#1}{#2}}}
+
+\def\@ifthenelse#1#2#3{\SWITCH(#1){\CASE(\fnyes){#2}\DEFAULT(\fnno){#3}}}
+\def\@ifthen#1#2#3{\SWITCH(#1){\CASE(\fnyes){#2}\DEFAULT(\fnno){\VOID}}}
+
+\def\FOR(#1)#2(#3)#4{\let\fnwhile\fnfor\WHILE(#1 { \tt #2 } #3){#4}}%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% nodes
+%
+%
+% \@exprht -> \skip for titles that span multiple lines
+\newdimen\@exprht \@exprht=\z@
+% \halfnodeindent -> half of the indentation for subnodes
+\newskip\halfnodeindent \halfnodeindent=1em
+% \maxnode -> last number for reference node
+\newcount\maxnode \maxnode=\z@
+
+% gereral leaders
+\def\leaderb@r{\cleaders\hrule width.5pt\vfil}
+\def\le@derwr{\cleaders\vbox{\vskip 5.7pt\smash{$\wr$}}\vfil}
+
+% \node<c>{name}<t>{title}{subnodes} -> prints a note
+% <c> -> optional argument specifying leaders:
+% <c>=! -> bar
+% <c>=~ -> serpentine line
+% <c>+=+ -> this one is a refnode
+% {name} -> name of this note, will be set in angles '<name>'
+% or name of refnode
+% <t> -> optional character specifying if there is a title
+% <t>=- -> there is a title (not for reference nodes)
+% {title} -> title for this node, will be set \hangindent`ed
+% {subnode} -> optional argument specifying subnodes
+%
+\def\node{\bgroup%
+ \parindent\z@ \@exprht=\z@%
+ \@ifnextch@r \bgroup{\i@node\space}%
+ \i@node}%
+
+% \i@node sets leaders and checks for reference node
+% #1 -> \space if there are no options or the option token
+\def\i@node#1{%
+ % setup leader bar
+ \let\leaderbar\empty \let\next\ref@node%
+ \ifx!#1\let\leaderbar\leaderb@r%
+ \else\ifx~#1\let\leaderbar\le@derwr%
+ \else\ifx+#1\let\next\fref@node%
+ \fi\fi\fi%
+ \@ifnextch@r +\ref@node{\next\space}}%
+
+\def\fref@node#1{\ref@node+}%
+
+% \ref@node -> checks for refnotes and defnodes
+%
+\def\ref@node#1#2{%
+ \ifx+#1\let\next=\v@node%
+ \else\let\next=\ii@node%
+ \fi%
+ \@ifnextch@r -{\next{#2}}{\next{#2}\space}}%
+
+% \ii@node -> checks for title
+% #1 -> name or subnodes
+% #2 -> '-' if there is a title
+\def\ii@node#1#2{%
+ \ifx-#2\let\next=\iii@node%
+ \else\let\next=\iv@node%
+ \fi%
+ \next{#1}}%
+
+% \iii@node -> expands notes with title
+% #1 -> name
+% #2 -> title
+\def\iii@node#1#2{%
+ \vbox\bgroup%
+ \setbox0=\vbox{\hangindent 3\halfnodeindent\strut$\langle${#1}%
+ $\rangle\longrightarrow$ #2\strut\par}%
+ \@exprht=\ht0%
+ \vbox{\box0\vskip-\@exprht\vskip 10pt}%
+ \advance\@exprht-10pt%
+ \@ifnextch@r \bgroup \expsubn@de \skip@title%
+}%
+
+% \skip@title -> skips vertical space for node with title but without subnodes
+\def\skip@title{%
+ \ifdim\@exprht>\z@%
+ \hbox to 2\halfnodeindent{\hss\vbox to \@exprht{\leaderbar}\hss}%
+ \fi%
+ \egroup\egroup%
+}%
+
+% \iv@node -> expands ordinary nodes
+% #1 -> name
+\def\iv@node#1{%
+ \vbox\bgroup%
+ \hbox{\strut$\langle${#1}$\rangle$}%
+ \@ifnextch@r \bgroup \expsubn@de {\egroup\egroup}}%
+
+% \v@node -> expand a reference node
+% #1 -> name
+% #2 -> ignored
+\def\v@node#1#2{%
+ \vbox\bgroup%
+ \hbox to \tw@\halfnodeindent{\hss\nodemark{#1}\hss}%
+ % force \skip below node
+ \@exprht=6pt%
+ \@ifnextch@r \bgroup \expsubn@de {\expsubn@de{}}}%
+
+% \nodemark -> \bigcirc with argument centered
+\def\nodemark#1{%
+ \@ifundefined{n@#1}{\newnode{#1}}{}%
+ \hbox to 10pt{\rlap{$\bigcirc$}\hfil$\scriptstyle%
+ \nodech@r{#1}$\hfil}}%
+
+% \nodech@r -> gets character for a defnode name
+% #1 -> name
+\def\nodech@r#1{
+ \expandafter\ifcase\csname n@#1\endcsname\nodetable\fi}
+
+\def\nodetable{
+ a\or b\or c\or d\or e\or f\or g\or h\or i\or k\or
+ l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or
+ v\or w\or x\or y\or z\else *}
+
+% \newnode -> creates a command sequence \n@<name> wich is set
+% to \maxnode++ and adds it to the restore list
+% #1 -> name
+\def\newnode#1{%
+ \expandafter\xdef\csname n@#1\endcsname{\the\maxnode}%
+ \global\advance\maxnode 1%
+ \addton@des{n@#1}}%
+
+\def\killnod@s{}%
+\def\addton@des#1{\begingroup%
+ \let\r@store\relax%
+ \xdef\killnod@s{\killnod@s\r@store{#1}}\endgroup}%
+
+\def\killnodes{\begingroup%
+ \def\r@store##1{%
+ \expandafter\let\csname ##1\endcsname\relax}%
+ \killnod@s\xdef\killnodes{}\endgroup\global\maxnode=\z@}%
+
+% \expsubn@de -> expands a subnode
+% #1 -> subnodes
+\def\expsubn@de#1{%
+ \hbox{%
+ \setbox0=\vbox{\advance\hsize -2\halfnodeindent\vskip\@exprht\relax #1}%
+ \hbox to 2\halfnodeindent{\hss\vbox to \ht0{\leaderbar}\hss}%
+ \box0%
+ }%
+ \egroup\egroup%
+}%
+
+\catcode`@=12 % Make AT other
+
+% end of file fchart.tex