summaryrefslogtreecommitdiff
path: root/macros/latex209/contrib/fchart/fchart.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex209/contrib/fchart/fchart.tex')
-rw-r--r--macros/latex209/contrib/fchart/fchart.tex548
1 files changed, 548 insertions, 0 deletions
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