From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex209/contrib/fchart/fcdoc.pdf | Bin 0 -> 92108 bytes macros/latex209/contrib/fchart/fcdoc.tex | 345 +++++++++++++++++++ macros/latex209/contrib/fchart/fchart.tex | 548 ++++++++++++++++++++++++++++++ 3 files changed, 893 insertions(+) create mode 100644 macros/latex209/contrib/fchart/fcdoc.pdf create mode 100644 macros/latex209/contrib/fchart/fcdoc.tex create mode 100644 macros/latex209/contrib/fchart/fchart.tex (limited to 'macros/latex209/contrib/fchart') diff --git a/macros/latex209/contrib/fchart/fcdoc.pdf b/macros/latex209/contrib/fchart/fcdoc.pdf new file mode 100644 index 0000000000..8fd7c35761 Binary files /dev/null and b/macros/latex209/contrib/fchart/fcdoc.pdf 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(){}{ +% \S{} +% \IF(){ }{ } +% \WHILE(){ } +% \REPEAT \UNTIL() +% \SWITCH(){\CASE(){ }\DEFAULT(){ }} +% \FOR(){}(){ } +% \FOREVER{ } +% } +% +% oder (nur in LaTeX): +% +% \begin{floatchart}(){} +% +% \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{name}{title}{subnodes} -> prints a note +% -> optional argument specifying leaders: +% =! -> bar +% =~ -> serpentine line +% =+ -> this one is a refnode +% {name} -> name of this note, will be set in angles '' +% -> optional character specifying if there is a title +% =- -> 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 +% {false} if the next token is not +% +\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{name}{title}{subnodes} -> prints a note +% -> optional argument specifying leaders: +% =! -> bar +% =~ -> serpentine line +% +=+ -> this one is a refnode +% {name} -> name of this note, will be set in angles '' +% or name of refnode +% -> optional character specifying if there is a title +% =- -> 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@ 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 -- cgit v1.2.3