\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}
