% \iffalse meta-comment
%
% Copyright (C) 1995 - 2018 Jobst Hoffmann, FH Aachen, Campus J"ulich
% <j.hoffmann_(at)_fh-aachen.de>
% -------------------------------------------------------------------------------------------
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
% 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.2 or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
%
% \fi
%
% \changes{v2.3a}{18/03/07}{updated Copyright to 2018}
% \changes{v2.2b}{17/07/09}{better layout of the source code}
% \changes{v2.2a}{17/06/30}{added notes about versioning scheme}
% \changes{v2.2}{17/06/18}{rewrote LIESMICH.md and README.md}
% \changes{v2.1a}{17/06/11}{made the versioning git aware}
% \changes{v2.0}{17/06/01}{changed version control system to git}
% \changes{v2.0}{17/06/01}{updated copyright}
% \changes{v141}{12/04/10}{updated copyright}
% \changes{v131}{10/09/21}{some more layout changes}
% \changes{v130}{10/09/21}{some changes in the layout of the source,
% removed typos}
% \changes{v121}{10/08/31}{scrumbled the email a little bit}
% \changes{v121}{10/08/31}{moved opening brace to end of line in several cases}
% \changes{v084}{10/06/24}{small layout changes}
% \changes{v084}{10/06/24}{corrected revision macro---added missing command}
% \changes{v062}{10/05/31}{moved the docstrip guards into the corresponding macrocode environments}
% \changes{v061}{10/05/31}{corrected some more typos}
% \changes{v057}{10/01/21}{added some missing closing braces at the end of `ProvidesPackage}
% \iffalse%
%<struktex|struktxf|struktxp|strukdoc>\NeedsTeXFormat{LaTeX2e}[1999/12/01]{%
%<struktex|struktxf|struktxp|strukdoc>  \def\@git@ $#1Date: #2-#3-#4 #5$$#6Revision: #7$ {%
%<struktex>  \ProvidesPackage{struktex}[#2/#3/#4 v#7 Nassi Shneiderman Diagrams (Jobst Hoffmann)]}
%<struktxf>  \ProvidesPackage{struktxf}[#2/#3/#4 v#7 Fonts for Nassi Shneiderman Diagrams (Jobst Hoffmann)]}
%<struktxp>  \ProvidesPackage{struktxp}[#2/#3/#4 v#7 Keywords for Nassi Shneiderman Diagrams (Jobst Hoffmann)]}
%<strukdoc>  \ProvidesPackage{strukdoc}[#2/#3/#4 v#7 support for reading and writing files verbatim (Jobst Hoffmann)]}
%<struktex|struktxf|struktxp|strukdoc>  %% git revision information
%<struktex|struktxf|struktxp|strukdoc>}%
% \fi
%
%
% \CheckSum{2634}  ^^A set to 0 to inactivate the CheckSum
% \def\docdate {2018/06/04} ^^A not style'able!!
%
%    \iffalse meta-comment
%            Alles bis zum n"achsten `\ fi' (ohne Leerzeichen) wird
%            ignoriert.  Das ist notwendig, da `%' nicht weiter
%            Kommentar einleitet, wenn diese Datei eingelesen wird.
%
% Stil-Option `struktex' zum Gebrauch mit LaTeX2e
% Copyright (C) 1995-2018 Jobst Hoffmann, alle Rechte vorbehalten.
%
%
% Das Kopieren dieser Datei ist nur zul"assig, wenn
% (1) keinerlei "Anderungen an dieser Datei durchgef"uhrt werden, oder
% (2) wenn diese Datei ge"andert wird, sie einen anderen Namen als
%     struktex.DTX erh"alt.
% Diese Einschr"ankung dient dazu, dass alle Stiloptionen identisch bleiben.
%
% Fehlermeldungen werden erbeten an: Dr. Jobst Hoffmann
%                                    Fachhochschule Aachen, Campus J"ulich
%                                    Ginsterweg 1
%                                    52428 J"ulich
%                                    Bundesrepublik Deutschland
%                            Email:  <j.hoffmann_(at)_fh-aachen.de>
%
% Achtung: um korrekte Bearbeitung zu erzielen, muss die Umgebung
%    \begin{macrocode}
%    ...
%    \end{macrocode}
% immer (mindestens) f"unf Zeichen einger"uckt sein, also in Spalte
% sechs beginnen!
%
% \fi
%
% \def\StrukTeXSty{\textsf{struktex.sty}}
%
% \changes{v056}{10/01/21}{changed revision entries "vN.NNx" $\rightarrow$ "v-N.NNx"}
% \changes{v056}{10/01/21}{removed trailing blanks}
% \changes{v054}{10/01/18}{changed revisioning tool from cvs to subversion}
% \changes{v-9.1}{10/01/17}{changed the position of `label commands}
% \changes{v-8.3b}{06/08/20}{Erweiterung im Makefile: f"ur dist wird automatisch
% eine Datei THIS\_IS\_VERSION\_... erzeugt.}
% \changes{v-8.3a}{06/08/19}{struktex.el erweitert: es wird die korrekte Anzahl
% von `switch{} generiert und mit Inhalt gef"ullt}
% \changes{v-8.3}{06/08/18}{Weitere Optionen "`draft"' und "`final"' eingef"uhrt}
% \changes{v-8.2a}{06/01/17}{struktex.el korrigiert und erweitert}
% \changes{v-8.1a}{05/09/01}{Erste (fehlerhafte) Version einer struktex.el Stil
% Datei zur Unterst"utzung von AUC\TeX{} hinzugef"ugt}
% \changes{v-8.0f}{05/06/11}{Dokumentation von `case verbessert}
% \changes{v-8.0d}{04/12/29}{`switch zeigt bei geeigneten Beispielen das
% rechtsb"undige Setzen von Bedingungen}
% \changes{v-8.0c}{04/07/15}{Zweisprachigkeit verbessert, Bezeichner statt
% Nummern eingef"uhrt}
% \changes{v-8.0b}{04/07/14}{`fileversion und `filedate zur einfacheren
% zentralen Verwaltung von Entwicklungsdaten eingef"uhrt}
% \changes{v-7.0b}{04/03/09}{Anzahl der Z"ahler reduziert}
% \changes{v-7.0a}{03/04/21}{Code teilweise umgestellt}
% \changes{v-7.0a}{03/04/21}{Dateinamen ge"andert}
% \changes{v-7.0a}{03/04/21}{Tippfehler korrigiert}
% \changes{v-7.0a}{03/04/21}{Marker f"ur interne Beispiele umbenannt}
% \changes{v-7.0a}{03/04/21}{Testrahmen ge"andert}
% \changes{v-7.0a}{03/04/21}{Beispiele f"ur unterschiedlichen
% Programmierspracheneinsatz erweitert}
% \changes{v-7.0a}{03/04/21}{Makefile integriert}
% \changes{v-7.0a}{03/04/21}{`pLanguage ge"andert: `pLanguage@nss
% zus"atzlich eingef"uhrt}
% \changes{v-7.0a}{03/04/21}{Sprachbezeichnungen ge"andert: Suffix @nss}
% \changes{v-7.0}{03/04/21}{Wechsel von der RWTH Aachen zur FH Aachen,
% Abt. J"ulich}
% \changes{v-6.0a}{01/04/22}{Dokumentation von `case verbessert}
% \changes{v-6.0a}{00/12/08}{Makros `cs, `marg, `oarg, `pparg sowie `envb
% und `enve zur besseren Dokumentation eingesetzt}
% \changes{v-6.0a}{00/11/24}{Englische "Ubersetzung der Dokumentation
% hinzugef"ugt }
% \changes{v-6.0a}{00/11/24}{Code umgestaltet, z.B. `def $\rightarrow$
% `newcommand, \$\ldots\$ $\rightarrow$ `(\ldots`) }
% \changes{v-6.0a}{00/11/24}{Zus"atzliche Paketoption "`curves"' zur
% Gestaltung beliebiger Steigungen eingef"uhrt}
% \changes{v-5.4b}{00/12/08}{Umgebungen zur einfacheren Notation der
% Dokumentation eingef"uhrt}
% \changes{v-5.4b}{00/12/08}{Erster Versuch einer gemischtsprachigen
% Dokumentation}
% \changes{v-5.4a}{99/11/16}{\textsf{stuktxp.sty} "uberarbeitet zur
% besseren Darstellung von Programmen}
% \changes{v-5.3a}{98/11/27}{Die Form des Textes in Bedingungen ist nun an
% beliebige Steigungen angepasst}
% \changes{v-5.2b}{98/05/28}{Tippfehlerkorrektur: Umlaut "`ue"' durch
% "`"u"' ersetzt}
% \changes{v-5.2a}{97/12/03}{Umstellung der Dokumentation, dadurch Verzicht
% auf eigene Treiberdatei m"oglich}
% \changes{v-5.2a}{97/12/03}{kleinere Korrekturen}
% \changes{v-5.1b}{97/11/02}{Umstellung der Dokumentation mittels Umgebung
% \texttt{example}, `verbatiminput und verbatimwrite}
% \changes{v-5.1a}{97/04/29}{kleinere stilistische "Anderungen nach W. Hanrath}
% \changes{v-5.0}{97/04/28}{Dateinamen zwecks Kompatibilit"at auf
% Kleinschreibung umgesetzt}
% \changes{v-5.0}{97/04/28}{kleinere textuelle "Anderungen, Fontauswahl
% teilweise ge"andert}
% \changes{v-5.0}{97/04/28}{Abh"angigkeiten der Dokumentation von
% zus"atzlichen Paketen beseitigt}
% \changes{v-4.5e}{97/04/25}{Verzicht auf Gro"s- und Kleinschreibung im
% Namen von .sty-Dateien}
% \changes{v-4.5a}{96/03/14}{Umgebung \texttt{description} auf
% \texttt{list}-Umgebung zur"uckgef"uhrt}
% \changes{v-4.5a}{96/03/14}{Eigenes Paket zur Formatierung von
% Programminhalten integriert}
% \changes{v-4.1c}{95/07/24}{Dokumentation verbessert}
% \changes{v-4.1b}{95/07/19}{H"ohe des Bedingungsrechteckes bei `ifthenelse
% vorgebbar}
% \changes{v-4.1a}{95/07/17}{Geraden mit beliebiger Steigung durch `emline
% m"oglich}
% \changes{v-4.0a}{95/04/12}{Anpassung an LaTeX2e}
% \changes{v-3.5a}{94/11/22}{Entwicklunglinien J. Dietel, J. Hoffmann vereinigt}
% \changes{v-3.3a}{94/09/14}{Schnittstellenbeschreibung verallgemeinert}
% \changes{v-3.2a}{94/09/14}{Dokumentation verbessert}
% \changes{v-3.1a}{94/09/09}{Verschiedene Erweiterungen}
% \changes{v-3.0a}{94/06/06}{Urversion mit integrierter Dokumentation}
% \changes{v-2.5}{93/09/09}{Jobst Hoffmann, Rechenzentrum RWTH Aachen}
% \changes{v-2.0}{92/01/17}{Dorothea Rieger, Rechenzentrum RWTH Aachen}
% \changes{v-1.41}{88/06/20}{Andreas Wagener, Proze"srechner CYBER 815}
%
% \DoNotIndex{\ ,\!,\C,\[,\\,\],\^,\`,\{,\},\~,\<,\=}
% \DoNotIndex{\@ifundefined,\@ne,\catcode,\def,\docdate}
% \DoNotIndex{\else,\endinput,\expandafter,\fi,\filedate,\fileversion}
% \DoNotIndex{\gdef,\global,\ifnum,\ifx,\let,\long}
% \DoNotIndex{\newcount,\newdimen,\newif,\next,\space,\string}
% \DoNotIndex{\the,\xdef,\z@}
% \DoNotIndex{\@@par, \@empty, \@hangfrom, \@reffalse, \@reftrue,}
% \DoNotIndex{\advance, \Alph, \alph, \arabic, \baselineskip, \begin}
% \DoNotIndex{\bgroup, \box, \bullet, \cdot, \centering}
% \DoNotIndex{\columnwidth, \day, \divide}
% \DoNotIndex{\egroup, \end, \font, \footins, \foo}
% \DoNotIndex{\frenchspacing, \hbadness, \hbox, \hfil, \hfill}
% \DoNotIndex{\hrule, \hsize, \hskip, \hspace, \hss, \ifcase \ifdim, \ifodd}
% \DoNotIndex{\ifvmode, \ignorespaces, \input, \interlinepenalty, \item}
% \DoNotIndex{\itemindent, \kern, \L, \list, \listparindent, \magstep}
% \DoNotIndex{\magstephalf, \makelabel, \MakeShortVerb, \marginpar}
% \DoNotIndex{\mark, \month, \newpage, \nobreak, \noindent, \normalsize, \null}
% \DoNotIndex{\number, \onecolumn, \or, \overfullrule}
% \DoNotIndex{\pagebreak, \parbox, \penalty, \phantom}
% \DoNotIndex{\raggedbottom, \raggedleft}
% \DoNotIndex{\relax, \renewcommand, \reversemarginpar}
% \DoNotIndex{\rightmargin, \rule, \setbox, \setcounter}
% \DoNotIndex{\setlength, \settowidth, \strut, \svtnsfb}
% \DoNotIndex{\thepage, \thispagestyle, \triangleright}
% \DoNotIndex{\underline, \vadjust, \vbadness, \vbox, \verb, \vfil}
% \DoNotIndex{\vspace, \wd, \year}
% \DoNotIndex{\arg}
% \DoNotIndex{\begingroup, \bottomfraction}
% \DoNotIndex{\CodelineIndex, \columnsep, \csname}
% \DoNotIndex{\DisableCrossrefs, \DocInput, \documentstyle, \dp}
% \DoNotIndex{\empty, \EnableCrossrefs, \endcsname, \endgroup}
% \DoNotIndex{\evensidemargin, \exhyphenpenalty}
% \DoNotIndex{\framebox}
% \DoNotIndex{\headsep, \ht, \hyphenpenalty}
% \DoNotIndex{\ifmmode, \ifundefined, \it}
% \DoNotIndex{\leftarrow, \leftskip}
% \DoNotIndex{\makeatletter, \makeatother, \makebox, \marginparwidth}
% \DoNotIndex{\newbox}
% \DoNotIndex{\oddsidemargin, \OnlyDescription}
% \DoNotIndex{\parfillskip, \parindent, \parshape, \parskip, \pretolerance}
% \DoNotIndex{\raise, \RecordChanges}
% \DoNotIndex{\textheight, \textwidth, \tolerance, \topmargin, \typeout}
% \DoNotIndex{\vrule, \vtop}
% \DoNotIndex{\bf, \tt, \par, \smallskip, \stepcounter}
%
% \pFonts{\itshape}{}{} ^^A Variablen werden als italics ausgegeben
%
% \changes{v-9.2}{10/01/18}{changed some textual layout}
% \IndexPrologue{%
% \section*{Index}
% \ifnum\language=\languageNGerman
%   Die kursiven Zahlen bezeichnen die Seite, auf der der jeweilige Eintrag
%   beschrieben ist, unterstrichene Zahlen verweisen auf seine Definition;
%   alle anderen Zahlen geben Stellen an, an denen der Eintrag auftritt.%
% \else%
%   The italic numbers mark the page certain entries are described on.
%   Underlined numbers refer to its definition. All other numbers declare
%   positions, where the entry occurs.%
% \fi}
% ^^A \setlength{\IndexMin}{0.3\textheight}
%
% ^^A \iflanguage{}{} ist f"ur gro"se Textbl"ocke nicht nutzbar (stack
% ^^A overflow), daher durchgehend die Konstruktion
% ^^A \ifnum\language=\languageNGerman
% ^^A <deutscher Text>
% ^^A \else
% ^^A <englischer Text>
% ^^A \fi
%
% \GlossaryPrologue{\section*{\ifnum\language=\languageNGerman
% Revisionsgeschichte
% \else%
% History\fi}}
%
% \title{\StrukTeXSty\thanks{\ifnum\language=\languageNGerman%
%           Diese Datei hat die Versionsnummer \fileversion, wurde zuletzt
%           bearbeitet am \filedate, und die Dokumentation datiert vom
%           \docdate.
%        \else%
%          This file has version number \fileversion, last revised on
%          \filedate{}, documentation dated \docdate.
%        \fi%
% }
%        }
% \author{\ifnum\language=\languageNGerman%
%           Jobst Hoffmann\\
%           Fachhochschule Aachen, Abt. J"ulich\\
%           Ginsterweg 1\\
%           52428 J"ulich\\
%           Bundesrepublik Deutschland
%         \else%
%           Jobst Hoffmann\\
%           University of Applied Sciences Aachen, Abt. J\"ulich\\
%           Ginsterweg 1\\
%           52428 J\"ulich\\
%           Federal Republic of Germany%
%         \fi%
% }
% \date{\ifnum\language=\languageNGerman gedruckt am \else printed on \fi \today}
%
% ^^A\markboth{\ifnum\language=\languageNGerman \LaTeX\ Stil-Option struktex,
% ^^A                            Version \fileversion\ vom \filedate
% ^^A          \else \LaTeX\ styleoption struktex,
% ^^A                            version \fileversion\ from \filedate
% ^^A          \fi}
% ^^A         {\ifnum\language=\languageNGerman \LaTeX\ Stil-Option struktex,
% ^^A                            Version \fileversion\ vom \filedate
% ^^A          \else \LaTeX\ styleoption struktex,
% ^^A                            version \fileversion\ from \filedate
% ^^A          \fi}
%
% \maketitle
%
% \ifnum\language=\languageNGerman%
% \begin{abstract}
%     Dieser Artikel beschreibt den Einsatz und die Implementation der
%     \LaTeX-\foreign{package} \StrukTeXSty{} zum Setzen von Struktogrammen
%     nach Nassi-Shneiderman.
% \end{abstract}
% \else%
% \begin{abstract}
% This article describes the use and implementation of
% \LaTeX-\foreign{package} \StrukTeXSty{} for structured box charts
% (Nassi-Shneiderman diagrams).
% \end{abstract}
% \fi%
%
% \newif\ifmulticols
% \IfFileExists{multicol.sty}{\multicolstrue}{}
%
% \ifmulticols
% \addtocontents{toc}{\protect\begin{multicols}{2}}
% \fi
%
% {\parskip 0pt                ^^A We have to reset \parskip
%                              ^^A (bug in \LaTeX)
% \tableofcontents
% }
%
%
%
% \changes{v074}{10/06/08}{little corrections concerning the license}
% \section{\ifnum\language=\languageNGerman Lizenzvereinbarung\else
% License\fi}
%
% This package is copyright \copyright{} 1995 -- 2018 by:
% \begin{quote}
%      Jobst Hoffmann, c/o University of Applied Sciences Aachen \\
%      Aachen, Germany \\
%      E-Mail: j.hoffmann\_(at)\_fh-aachen.de
% \end{quote}
% This program can be redistributed and/or modified under the terms of the LaTeX
% Project Public License, distributed from the CTAN archives as file
% |macros/latex/base/lppl.txt|; either version 1 of the License, or (at
% your option) any later version.
%
%
% \section{\ifnum\language=\languageNGerman Vorwort\else Preface\fi}
%\label{sec:vorwort}
%
% \begin{quote}
%     \sffamily\small%
%     \ifnum\language=\languageNGerman%
%     \StrukTeX{} hat eine lange Entwicklung hinter sich. Bei der
%     Entwicklung wurden verschiedene Programme zur Versionsverwaltung --
%     cvs, subversion und aktuell git -- eingesetzt, die alle
%     unterschiedliche M"oglichkeiten bieten, Versionsnummern zu
%     definieren. Um diese unterschiedlichen Versionsnummern zeitlich
%     zuordnen zu k"onnen, wird folgendes Schema verwendet: Versionnummern
%     der Form "`v-\meta{d}.\meta{d}[\meta{a}]"' mit \meta{d} als
%     Dezimalzahl und \meta{a} als Buchstabe, etwa v-4.1a bezeichnen die
%     erste Entwicklungslinie (rcs). Die folgenden Versionnummern haben die
%     Form "`v\meta{n}\meta{n}\meta{n}"' mit \meta{n} als Dezimalziffer,
%     \zB{} v122 (subversion). Die aktuelle Entwicklung erfolgt unter git
%     und benutzt Versionnummern der Form
%     "`v\meta{d}.\meta{d}[\meta{a}][-\meta{d}]-g\meta{x}"', beispielsweise
%     v2.1-13-gd28a927; \meta{x} ist dabei eine Hexadezimalzahl. Allgemein
%     gilt f"ur das Alter und somit die Reihenfolge der Versionen%
%     \else%
%     \StrukTeX{} has a long history. In development several different
%     programs for version management were used---rcs, subversion and
%     currently git---, all of which offer different possibilities to
%     define version numbers. To correlate these different version numbers
%     correctly in time, the following schema will be used: Version numbers
%     of the form ``v-\meta{d}.\meta{d}[\meta{a}]'' with \meta{d} as a decimal
%     digit and \meta{a} as a character, say v-4.1a denote the first
%     development line (rcs). The following version numbers have the form
%     ``v\meta{n}\meta{n}\meta{n}'' with \meta{n} as a decimal number,
%     e.\,g.  v122 (subversion). The current development is under git and
%     uses version numbers of the form
%     \meta{d}.\meta{d}[\meta{a}][\meta{d}]-g\meta{x}, for example,
%     v2.1-13-gd28a927; \meta{x} stands for a hexadecimal number. In
%     general, the age and therefore the sequence of the versions is%
%     \fi
%     \[
%         \mbox{v-\meta{d}.\meta{d}[\meta{a}]} <
%         \mbox{v\meta{n}\meta{n}\meta{n}} <
%         \mbox{v\meta{d}.\meta{d}[\meta{a}][-\meta{d}]-g\meta{x}}
%     \]
% \end{quote}
%
% \changes{v100}{10/06/25}{added remark about Struktorizer}
% \changes{v-8.0b}{04/07/14}{Hinweis auf \textsf{pict2e.sty}}
% \changes{v-8.0b}{04/07/14}{Entwicklungsgeschichte korrigiert und
% erweitert}
% \ifnum\language=\languageNGerman
% Mit dem hier beschriebenen Makropaket ist es m"oglich,
% Struktogramme mit \LaTeX{} zu zeichnen. Das Makropaket wird im folgenden
% immer \StrukTeX\ genannt. Es ist in der Lage, die wichtigsten Elemente
% eines Struktogrammes wie \zB\ Verarbeitungsbl"ocke, Schleifenkonstrukte,
% Sinnbilder f"ur Alternativen usw.\ zu generieren. Die Struktogramme
% werden mit Hilfe der Picture-Umgebung von \LaTeX{} erzeugt.\footnote{%
% Wer es scheut, Struktogramme mittels \LaTeX{} direkt zu schreiben, kann
% beispielsweise unter \url{http://structorizer.fisch.lu/} ein Programm
% (Struktorizer) finden, mit dem man seine Struktogramme mittels Maus
% entwickeln und abschlie"send als \LaTeX-Code exportieren kann.} %
% \else%
% It is possible to draw structured box charts by this package of macros
% which is described herewith. Through this article the package will be
% always called \StrukTeX. It can generate the most important elements of a
% structured box chart like processing blocks, loops, mapping conventions
% for alternatives etc.\footnote{%
% Those who don't like to code the diagrams by hand, can use for example
% the program Struktorizer (\url{http://structorizer.fisch.lu/}). By using
% this program one can draw the diagrams by mouse and export the result
% into a \LaTeX-file.} %
% \fi%
%
% \ifnum\language=\languageNGerman%
% Ab Version v-4.1a werden die mathematischen Symbole von \AmSTeX{} geladen,
% die den mathematischen Zeichensatz erweitern und andere Darstellungen von
% Mengensymbolen (etwa $\nat$, $\integer$ und
% $\real$ f"ur die nat"urlichen, ganzen und reellen Zahlen) erm"oglichen.
% Insbesondere das Zeichen f"ur die leere Menge
% ($\emptyset$) ist in der Darstellung auff"alliger als das
% standardm"a"sige Zeichen
% ("`$\mathchar"023B$"') und somit besser f"ur die Darstellung von
% Struktogrammen geeignet.%
% \else%
% Since version v-4.1a the mathematical symbols are loaded by \AmSTeX.  They
% extend the mathematical character set and make other representations of
% symbols sets (like $\nat$, $\integer$ and
% $\real$ for the natural, the integer and the real numbers) possible.
% Especially the symbol for the empty set
% ($\emptyset$) has a more outstanding representation than the standard
% symbol
% ("`$\mathchar"023B$"'). Therefore it is the better representation in
% structured box charts.  \fi
%
% \ifnum\language=\languageNGerman
% Weiterhin ist aus dem \textsf{oz.sty} die Idee "ubernommen,
% Variablennamen in \foreign{italics} zu setzen, ohne dass die teilweise
% unsch"onen Zwischenr"aume erzeugt werden.
% \else%
% Furthermore the idea to set names of variables in \foreign{italics}
% without generating the partly unpleasant distances is taken over from
% \textsf{oz.sty}.
% \fi%
%
% \ifnum\language=\languageNGerman%
% Die Entwicklung dieses Makropaketes ist noch nicht abgeschlossen.
% Es war geplant, die Struktogramme unter dem Einsatz des Makros aus
% \textsf{emlines2.sty} zu zeichnen, um die durch \LaTeX{} gegebenen
% Einschr"ankungen -- es gibt nur vordefinierte Steigungen --
% aufzuheben. Dies ist -- f"ur das \cs{ifthenelse} mit den
% Versionen v-4.1a und v-4.1b, f"ur das \cs{switch} mit der Version v-4.2a --
% erledigt, nicht jedoch f"ur Systeme, die die
% entsprechenden |\special{|\dots|}|-Befehle nicht unterst"utzen.
% Erreicht werden kann dies jedoch durch Einsatz entsprechender Makros
% aus dem \textsf{curves.sty}. Seit der Version v-8.0a wird das Paket
% \textsf{pict2e.sty} unterst"utzt, das mittels der "ublichen Treiber die von
% der |picture|-Umgebung bekannten Beschr"ankungen auf nur wenige Steigungen
% im wesentlichen aufhebt, so dass sich die Benutzung der entsprechenden
% Option (s.u.) dauerhaft empfiehlt.
% \else%
% The development of this macro package is still not finished.
% It was planned to draw the structured box charts by using the macros of
% \textsf{emlines2.sty} for eliminating the constraints given by \LaTeX.
% -- There are only predefined gradients. -- This is done for the \cs{ifthenelse}
% in the versions v-4.1a and v-4.1b and for \cs{switch} in the version v-4.2a,
% but not for the systems, which do not support the corresponding
% |\special{|\dots|}|-commands. Nevertheless it can be attained by using the
% corresponding macros of \textsf{curves.sty}. Since version v-8.0a the
% package \textsf{pict2e} is supported. This package eliminates the above
% mentioned constraints by using the common drivers, so it is recommended
% to use the respective (see below) option permanently.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Ebenso ist es geplant, Struktogramme um Kommentarbl"ocke zu erweitern,
% wie sie in dem Buch von Futschek (\cite{Futschek:Programmentwicklung})
% eingesetzt werden. Dieses ist ebenfalls mit der Version v-8.0a realisiert
% worden.%
% \else%
% Just so it is planned to extend structured box charts by comments as they
% are used in the book of Futschek
% (\cite{Futschek:Programmentwicklung}). This is also implemented in
% version v-8.0a.%
% \fi
%
% \ifnum\language=\languageNGerman
% Weitere Zukunftspl"ane sind:
% \else%
% Further plans for future are:%
% \fi%
%
% \begin{enumerate}
%   \item \ifnum\language=\languageNGerman%
%     Ein \cs{otherwise}-Zweig beim \cs{switch} (abgeschlossen durch die
%     Version v-4.2a).%
%     \else%
%     An \cs{otherwise}-branch at \cs{switch} (done in version v-4.2a).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Neuimplementation der |declaration|-Umgebung mittels der
%     |list|-Umgebung gem"a"s
%     \cite[Abs. 3.3.4]{GoossensMittelbachSamarin:Companion} (abgeschlossen
%     mit der Version v-4.5a).%
%     \else%
%     The reimplementation of the |declaration|-environment through the
%     |list|-environment by
%     \cite[Abs. 3.3.4]{GoossensMittelbachSamarin:Companion} (done in
%     version v-4.5a).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Anpassung an \LaTeXe\ im Sinne eines Packages (abgeschlossen
%     durch die Version v-4.0a).%
%     \else%
%     The adaption to \LaTeXe\ in the sense of packages (done in version
%     v-4.0a).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Verbesserung der Dokumentation, um Teile des Algorithmus
%     verst"andlicher zu machen.
%     \else%
%     The improvement of documentation in order to make parts of the
%     algorithm more understandable.%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Unabh"angigkeit des \StrukTeXSty{} von anderen
%     \textsf{.sty}-Dateien wie etwa dem \textsf{JHfMakro.sty}
%     (abgeschlossen mit der Version v-4.5a).%
%     \else%
%     The independence of \StrukTeXSty{} of other \textsf{.sty}-files like
%     e.g. \textsf{JHfMakro.sty} (done in version v-4.5a).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%      \changes{v-4.5a}{96/03/14}{Umbenennungen: `sVar $\rightarrow$ `pVar, \ldots}%
%      \changes{v-4.3a}{96/01/26}{Variable `sBoolValue ersetzt `sLVal}
%     Die vollst"andige Implementation der Makros \cs{pVar}, \cs{pKey},
%     \cs{pFonts}, \cs{pTrue}, \cs{pFalse} und \cs{pBoolValue} (erledigt
%     vor Version v-7.0).%
%     \else%
%     \changes{v-4.5a}{96/03/14}{redesignation: `sVar $\rightarrow$ `pVar,
%     \ldots}
%     \changes{v-4.3a}{96/01/26}{variable `sBoolValue replaces `sLVal}%
%     The complete implementation of the macros \cs{pVar}, \cs{pKey},
%     \cs{pFonts}, \cs{pTrue}, \cs{pFalse} and \cs{pBoolValue} (done before
%     version v-7.0).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     \changes{v-4.4a}{96/02/29}{Kommando `ifthenelse internalisiert}%
%     Die vollst"andige Internalisierung von Kommandos, die nur in der
%     Umgebung |struktogramm| Sinn machen. Internalisierung bedeutet, dass
%     diese Kommandos nur innerhalb der Umgebung definiert sind. Dies hat
%     den Zweck, das Paket mit anderen Paketen vertr"aglicher zu gestalten,
%     etwa mit dem \textsf{ifthenelse.sty}. Begonnen wurde die
%     Internalisierung mit der Version v-4.4a.
%     \else%
%     \changes{v-4.4a}{96/02/29}{command `ifthenelse internalisated}%
%     The complete internalization of commands, which only make sense in
%     the environment |struktogramm|. Internalization means, that these
%     commands are only defined in this environment. This is for
%     compatibility of this package with other packages, e.g. with
%     \textsf{ifthenelse.sty}.  The internalization has been started in
%     version v-4.4a.
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Unabh"angigkeit der Dokumentation von anderen
%     \textsf{.sty}-Dateien wie etwa dem \textsf{JHfMakro.sty}
%     (abgeschlossen mit der Version v-5.0).%
%     \else%
%     The independence of the documentation of other \textsf{.sty}-files
%     like \textsf{JHfMakro.sty} (done in version v-5.0).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Eine alternative Darstellung der Deklarationen, wie sie von Rico Bolz
%     vorgeschlagen wurde%
%     \else%
%     an alternative representation of declarations as proposed by Rico
%     Bolz%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Wiedereinf"uhrung der |make|-Ziele |dist-src| |dist-tar| und
%     |dist-zip|.%
%     \else%
%     Reintroduction of the |make|-targets |dist-src| |dist-tar| and
%     |dist-zip|.%
%     \fi%
%
% \end{enumerate}
%
% \ifnum\language=\languageNGerman%
% Der derzeitige Stand der Implementierung ist an entsprechender Stelle
% vermerkt.
% \else%
% The current state of the implementation is noted at suitable points.%
% \fi%
%
%
% \section{\ifnum\language=\languageNGerman%
%   Hinweise zur Pflege und Installation sowie die Treiberdatei zur
%   Erzeugung dieser Dokumentation%
%   \else%
%   Hints for maintenance and installation as well as driver file creating
%   of this documentation%
%   \fi}
%
% \ifnum\language=\languageNGerman%
% \changes{v-4.5e}{97/04/26}{Neue .sty-Datei strukdoc.sty eingef"uhrt}
% \changes{v-1.5}{92/01/07}{StrukTeX Makros nun als .sty-Datei, J. Hoffmann}
% \changes{v-2.0}{92/01/17}{Erweitert um `exit, `forever und `foreverend, D. Rieger}
% \changes{v-2.1}{92/01/07}{`exit modifiziert, J. Hoffmann}
% \changes{v-2.2}{93/09/08}{Beschreibung von Variablen eingef"uhrt, J. Hoffmann}
% \changes{v-2.2a}{93/09/09}{Beschreibung von Variablen verbessert, J. Hoffmann}
% \else%
% \changes{v-4.5e}{97/04/26}{new .sty-File strukdoc.sty introduced}
% \changes{v-1.5}{92/01/07}{StrukTeX macros now as .sty-File, J. Hoffmann}
% \changes{v-2.0}{92/01/17}{extended by `exit, `forever and `foreverend, D. Rieger}
% \changes{v-2.1}{92/01/07}{`exit modified, J. Hoffmann}
% \changes{v-2.2}{93/09/08}{description of variables introduced, J. Hoffmann}
% \changes{v-2.2a}{93/09/09}{description of variables improved, J. Hoffmann}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Das Paket, zu dem der  \StrukTeXSty{} geh"ort, besteht aus
% insgesamt sechs Dateien:
% \begin{quote}
% \texttt{LIESMICH}, \\
% \texttt{README}, \\
% \texttt{struktex.ins}, \\
% \texttt{struktex.dtx}, \\
% \texttt{struktex.de.pdf} und \\
% \texttt{struktex.en.pdf}.
% \end{quote}
% Um daraus einerseits die Dokumentation, andererseits die \textsf{.sty}-Datei
% zu erzeugen, muss folgenderma"sen vorgegangen werden:
% \else%
% The package \StrukTeXSty{} is belonging to consists of altogether two files:
% \begin{quote}
% \texttt{LIESMICH}, \\
% \texttt{README}, \\
% \texttt{struktex.ins}, \\
% \texttt{struktex.dtx}, \\
% \texttt{struktex.de.pdf} und \\
% \texttt{struktex.en.pdf}.
% \end{quote}
% In order to generate on the one hand the documentation and on the other hand the
% \textsf{.sty}-file one has to proceed as follows:%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Zun"achst wird mit \zB\
% \begin{quote}\tt
% tex  struktex.ins
% \end{quote}
% die Datei \textsf{struktex.ins} formatiert.
% Dieser Formatierungslauf erzeugt elf weitere Dateien. Dies sind zun"achst
% die drei \textsf{.sty}-Dateien \textsf{struktex.sty},
% \textsf{struktxf.sty} und
% \textsf{struktxp.sty}, die beim Einsatz des \StrukTeXSty{} ben"otigt werden;
% weiterhin sind es die beiden Dateien \textsf{struktex\_test\_0.nss}
% und \textsf{strukdoc.sty}, die zur
% Erzeugung der hier vorliegenden Dokumentation ben"otigt werden. Dazu kommen
% drei Testdateien \textsf{struktex\_test\_\textit{i}.nss},
% \(i=1(2)3\), sowie die beiden Dateien \textsf{struktex.makemake} und
% \textsf{struktex.mk} (vgl. Abschnitt~\ref{sec:Makefile}).
%
% Die Dokumentation wird wie "ublich durch
% \begin{quote}\tt
%     pdflatex struktex.dtx \\
%     pdflatex struktex.dtx \\
%     makeindex -s gind.ist struktex.idx \\
%     pdflatex struktex.dtx
% \end{quote}
% erzeugt.\footnote{Die Erzeugung der Dokumentation kann durch den Einsatz
% einer \texttt{make}-Datei vereinfacht werden, vgl.
% Abschnitt~\ref{sec:Makefile}} Das Ergebnis dieses Formatierlaufes ist die
% Dokumentation in Form einer \textsf{.pdf}-Datei, die in gewohnter Weise
% weiterbearbeitet werden kann. Weitere Informationen zum Arbeiten mit der
% integrierten Dokumentation findet man in
% \cite{FM:TheDocAndShortvrbPackages-V-2.0} und
% \cite{MittelbachDuchierBraams:DocStrip-V-2.5b}.%
% \else%
% First the file \textsf{struktex.ins} will be formatted e.g.\ with
% \begin{quote}\tt
%     tex struktex.ins
% \end{quote}.  This formatting run generates eleven further files. These
% are first of all the three \textsf{.sty}-files \textsf{struktex.sty},
% \textsf{struktxf.sty} and \textsf{struktxp.sty}, that are used for
% \StrukTeXSty.  Furthermore these are the two files
% \textsf{struktex\_test\_0.nss} and \textsf{strukdoc.sty}, which are used
% for the generation of the hereby presented documentation.  Then there are
% three test files \textsf{struktex\_test\_\textit{i}.nss}, \(i=1(2)3\) as
% well as the files \textsf{struktex.makemake} and \textsf{struktex.mk}
% (see section~\ref{sec:Makefile}).
%
% The common procedure to produce the documentation is\footnote{Generating the
% documentation is much easier with the \texttt{make} utility, see
% section~\ref{sec:Makefile}.}
% \begin{quote}\tt
%     pdflatex struktex.dtx \\
%     pdflatex struktex.dtx \\
%     makeindex -s gind.ist struktex.idx \\
%     pdflatex struktex.dtx
% \end{quote}
% The result of this formatting run is the documentation in form of a
% \textsf{.pdf}-file, that can be manipulated the normal way. Further
% informations about the work with the integrated documentation one can
% find in \cite{FM:TheDocAndShortvrbPackages-V-2.0} and
% \cite{MittelbachDuchierBraams:DocStrip-V-2.5b}.%
% \fi
%
% \changes{v100}{10/06/25}{corrected some inconsistencies in the
% description of the installation process}
% \ifnum\language=\languageNGerman%
% Die Installation wird abgeschlossen, indem die Datei
% \texttt{struktex.sty} in ein Verzeichnis verschoben wird, das von \TeX{}
% gefunden werden kann, das ist in einer TDS-konformen Installation
% typischerweise \texttt{.../tex/latex/struktex/}, die Dokumentation wird
% analog in das Verzeichnis \texttt{.../doc/latex/struktex/}
% verschoben.\footnote{Wenn die automatische Installation (vgl. Abschnitt
% \ref{sec:Makefile}) vorgenommen wird, erfolgt diese entsprechend.} %
% \else%
% To finish the installation, the file \texttt{struktex.sty} should be
% moved to a directory, where \TeX{} can find it, in a TDS conforming
% installation this is \texttt{.../tex/latex/struktex/} typical,
% analogously the documentation has to be moved to
% \texttt{.../doc/latex/struktex/}. If the installation process is done
% automatically (see section \ref{sec:Makefile}), the target directories
% follow that rule. %
% \fi
%
% \ifnum\language=\languageNGerman%
% Sollen "Anderungen durchgef"uhrt werden, so sollten neben diesen
% die Werte von \cs{fileversion}, \cs{filedate} und \cs{docdate} bei Bedarf
% entsprechend ge"andert werden. Weiterhin sollte darauf geachtet werden,
% dass die Revisionsgeschichte durch Eintr"age von
% \begin{quote}
% |\changes{|\meta{Version}|}{|\meta{Datum}|}{|\meta{Kommentar}|}|
% \end{quote}
% weitergeschrieben wird.
% \meta{Version} gibt die Versionsnummer an, unter der die jeweilige
% "Anderung durchgef"uhrt wurde,
% \meta{Datum} gibt das Datum in der Form |yy/mm/dd| an und
% \meta{Kommentar} erl"autert die jeweilige "Anderung.
% \meta{Kommentar} darf nicht mehr als 64 Zeichen enthalten.
% Daher sollten Kommandos nicht mit dem "`$\backslash$"'
% (\foreign{backslash}) eingeleitet werden, sondern  mit dem "``"'
% (\foreign{accent}).
% \else%
% If one wants to carry out changes, the values of \cs{fileversion}, \cs{filedate}
% and \cs{docdate} should be also changed if needed. Furthermore one should
% take care that the audit report will be carried on by items in the form of
% \begin{quote}
% |\changes{|\meta{version}|}{|\meta{date}|}{|\meta{comment}|}|
% \end{quote}
% The version number of the particular change is given by \meta{version}.
% The date is given by \meta{date} and has the form |yy/mm/dd|.
% \meta{comment} describes the particular change. It need not contain
% more than 64 characters.
% Therefore commands should'nt begin with "`$\backslash$"' (\foreign{backslash}),
% but with the "``"' (\foreign{accent}).%
% \fi%
%
% \changes{v2.1b}{17/06/17}{better wording: leftright $\rightarrow$ outer}
% \changes{v-8.0b}{04/07/14}{Umstellung der Sprachverwaltung auf babel}
% \ifnum\language=\languageNGerman%
% Die n"achsten Anweisungen bilden den Treiber f"ur die hier vorliegende
% Dokumentation.
% \else%
% The following commands make up the driver of the documentation lieing before.%
% \fi%
% \changes{v130}{10/09/21}{set additional option for (internally loaded)
% package url to obey spaces}
% \changes{v-9.2}{10/01/18}{changed the selection of languages}
%    \begin{macrocode}
%<*driver>
                                % select the formatting language:
\expandafter\ifx\csname primarylanguage\endcsname\relax%
\def\primarylanguage{ngerman}%
\def\secondarylanguage{english}%
\else%
\def\secondarylanguage{ngerman}%
\fi

\documentclass[a4paper, \secondarylanguage,     % select the language
        \primarylanguage]{ltxdoc}

\PassOptionsToPackage{obeyspaces}{url} % must be done before any package is
                                % loaded

\usepackage{babel}              % for switching the documentation language
\usepackage{strukdoc}           % the style-file for formatting this
                                % documentation

\usepackage[pict2e, % <---------- to produce finer results
                                % visible under xdvi, alternatives are
                                % curves or emlines2 (visible only under
                                % ghostscript), leave out if not
                                % available
    verification,
    outer, % <------------------- to set the position of the \ifthenelse
                                % flags to the outer edges
    debug,
    ]
    {struktex}
\GetFileInfo{struktex.sty}

\EnableCrossrefs
%\DisableCrossrefs   % say \DisableCrossrefs if index is ready

%\RecordChanges      % say \RecordChanges to gather update information

%\CodelineIndex      % say \CodelineIndex to index entry code by line number

\OnlyDescription    % say \OnlyDescription to omit the implementation details

\MakeShortVerb{\|}   % |\foo| acts like \verb+\foo+

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% to avoid underfull ... messages while formatting two/three columns
\hbadness=10000 \vbadness=10000

\typeout{\string\primarylanguage: \primarylanguage, \string\language: \the\language}

\def\languageNGerman{10}        % depends on language.dat, put
                                % \the\language here

\begin{document}
\makeatletter
\@ifundefined{selectlanguageEnglish}{}{\selectlanguage{english}}
\makeatother
\DocInput{struktex.dtx}
\end{document}
%</driver>
%    \end{macrocode}
%
% \section{\ifnum\language=\languageNGerman Die Benutzungsschnittstelle
%             \else The User interface
%             \fi}
% \label{Schnittstelle}
% \label{interface}
% \changes{v-4.3a}{96/01/26}{Dokumentation verbessert und korrigiert}
% \ifnum\language=\languageNGerman%
% Der \StrukTeXSty{} wird wie jede andere |.sty|-Datei als \foreign{package} in
% ein \LaTeX-Dokument eingebunden:
% \begin{quote}
% |\usepackage[|\meta{Optionen}|]{struktex}|
% \end{quote}
% \else%
% The \StrukTeXSty{} will be included in a \LaTeX-document like every other
% |.sty|-file by \foreign{package}:
% \begin{quote}
% |\usepackage[|\meta{options}|]{struktex}|
% \end{quote}%
% \fi%
%
% \changes{v2.0c}{17/06/06}{added description of debug and leftright option}
% \changes{v141}{12/04/10}{added description of default values}
% \changes{v141}{12/04/10}{added description of language option}
% \ifnum\language=\languageNGerman%
% Die folgenden Optionen stehen zur Verf"ugung:
% \begin{enumerate}
%   \item |english|, |ngerman| oder |german|:
%
%     Die jeweilige Option legt die Sprache f"ur definierte Werte wie
%     |\sTrue| fest, Standardwert ist |english|.
%   \item |emlines|, |curves| oder |pict2e|:
%
%     Durch Angabe einer der drei Optionen ist es m"oglich, beliebige
%     Steigungen in Struktogrammen zu zeichnen. Erstere Option ist
%     sinnvoll, wenn mit dem em\TeX-Paket von Eberhard Mattes gearbeitet
%     wird (DOS oder OS/2), ansonsten wird der Einsatz von |pict2e|
%     empfohlen. Der Einsatz des Paketes \textsf{curves.sty} (Ian
%     Maclaine-cross), das das Zeichnen von Geraden beliebiger Steigungen
%     durch das Setzen vieler einzelner Punkte erm"oglicht, ist durch das
%     Erscheinen des Paketes \textsf{pict2e.sty} (Hubert G"a"slein und Rolf
%     Niepraschk) im Prinzip obsolet, aus Kompatibilit"atsgr"unden wird er
%     weiter unterst"utzt. Durch die Angabe einer der genannten Option wird
%     das jeweilige Paket (\textsf{emlines2.sty}, \textsf{curves.sty} bzw.
%     \textsf{pict2e.sty}) automatisch geladen, Standardwert ist |pict2e|.
%   \item |verification|:
%
%     Nur wenn diese Option gesetzt ist, steht \cs{assert} als Kommando zur
%     Verf"ugung.
%   \item |nofiller|:
%
%     Setzen dieser Option l"asst jeden Freiraum leer. Ansonsten wird
%     Freiraum in Alternativen als \(\emptyset\) markiert.
%   \item |draft|, |final|:
%
%     Diese Optionen dienen in "ublicher Weise dazu, den Entwurf
%     beziehungsweise die endg"ultige Fassung zu kennzeichnen (vgl.
%     |\sProofOn|/|\sProofOff|). Im Entwurfsmodus werden die vier Eckpunkte
%     eines Struktogramms in der vom Benutzer vorgegebenen Gr"o"se
%     ausgegeben, diese Markierung f"allt in der endg"ultigen Fassung
%     weg. Der Standardwert ist |final|.
%   \item |debug|:
%
%     Mit dem Setzen dieser Option werden Zeilen der Form
%     \begin{quote}
%         |===> dbg |\meta{Text}
%     \end{quote}
%      in die .log-Datei geschrieben.
%   \item |outer|:
%
%     Das Setzen dieser Option f"uhrt dazu, die ja/nein Flaggen statt auf
%     der Mitte der Grundlinie jeweils links bzw. rechts au"sen erscheinen
%     zu lassen.
% \end{enumerate}
% Nach dem Laden der |.sty|-Datei stehen verschiedene Kommandos und Umgebungen
% zur Verf"ugung, die das Zeichnen der Struktogramme erm"oglichen.%
% \else%
% The following options are available:
% \begin{enumerate}
%   \item |english|, |ngerman| oder |german|:
%
%     This option defines the language of defined values as |\sTrue|,
%     default: |english|.
%   \item |emlines|, |curves|, or |pict2e|:
%
%     If you set one of these options, any ascent can be drawn in the
%     structured box chart. You should use |emlines|, if you are working
%     with the em\TeX-package for DOS or OS/2 by E. Mattes, else you should
%     use |pict2e|; |curves| is included just for compatibility. In all
%     cases the required packages (\textsf{emline2.sty},
%     \textsf{curves.sty}, or \textsf{pict2e} resp.) will be loaded
%     automatically; the default value is |pict2e|.
%   \item |verification|:
%
%     Only if this option is set, the command \cs{assert} is available.
%   \item |nofiller|:
%
%     Setting this option prohibits setting of \(\emptyset\) in alternatives.
%   \item |draft|, |final|:
%
%     These options serve as usual to diffentiate between the draft and the
%     final version of a structured box chart (see |\sProofOn|). While in
%     the draft mode the user given size of the chart is denoted by the
%     four bullets, the final version leaves out these markers; the default
%     value is |final|.
%   \item |debug|:
%
%     Setting this option produces lines of the form %
%     |===> dbg |\meta{text} in the .log-file.
%   \item |outer|:
%
%     Setting this option changes the position of flags in the
%     |ifthenelse|-triangles from the mid to the left and right of the
%     baselines of the triangles.
% \end{enumerate}
% After loading the |.sty|-file there are different commands and environments,
% which enable the draw of structured box charts.%
% \fi%
%
% \DescribeMacro{\StrukTeX}
% \ifnum\language=\languageNGerman%
% Zun"achst sei der Befehl erw"ahnt, der das Logo \StrukTeX\ erzeugt:
% \else%
% First of all the logo \StrukTeX\ producing command should be mentioned:%
% \fi%
% \begin{quote}
% \verb-\StrukTeX-
% \end{quote}
%
% \ifnum\language=\languageNGerman%
% Damit kann in Dokumentationen auf die hier vorliegende Stil-Option
% verwiesen werden.
% \else%
% So in documentations one can refer to the style option given hereby.%
% \fi%
%
% \subsection{\ifnum\language=\languageNGerman Spezielle Zeichen und Textdarstellung
%                 \else Specific characters and text representation
%                 \fi}
%
% \DescribeMacro{\nat}
% \DescribeMacro{\integer}
% \DescribeMacro{\real}
% \DescribeMacro{\complex}
% \DescribeMacro{\emptyset}
% \ifnum\language=\languageNGerman%
% Wegen ihres h"aufigen Auftretens sind die Mengen der nat"urlichen, ganzen,
% reellen und komplexen Zahlen ($\nat$, $\integer$, $\real$ und $\complex$)
% im Mathematik-Modus "uber
% die folgenden Makros erreichbar: \cs{nat}, \cs{integer}, \cs{real} und \cs{complex}.
% Ebenso ist das mit \cs{emptyset} erzeugte
% "`$\emptyset$"' als Zeichen f"ur die leere Anweisung auff"alliger als
% das standardm"a"sige Zeichen "`$\mathchar"023B$"'
% Andere Mengensymbole wie $\mathbb L$ (f"ur L"osungsmenge) sind "uber
% |$\mathbb L$| zu
% erzeugen.
% \else%
% Since sets of natural, whole, real and complex numbers ($\nat$, $\integer$,
% $\real$ and $\complex$) occur often in the Mathematics Mode they can be
% reached by the macros \cs{nat}, \cs{integer}, \cs{real} and \cs{complex}.
% Similarly "`$\emptyset$"', which is generated by \cs{emptyset}, is the more
% remarkable symbol for the empty statement than the standard symbol
% "`$\mathchar"023B$"'.
% Other set symbols like $\mathbb L$ (for solution space) have to be
% generated by |$\mathbb L$|.%
% \fi%
%
% \DescribeMacro{\MathItalics}
% \DescribeMacro{\MathNormal}
% \ifnum\language=\languageNGerman%
% Mit diesen beiden Makros kann die Darstellung von Variablennamen beeinflusst
% werden:
% \else%
% One can influence the descriptions of variable names by these macros.%
% \fi%
% \ifnum\language=\languageNGerman%
% \begin{example}
% \MathNormal
% \[
% NeuerWert = AlterWert + Korrektur
% \]
% \end{example}
% \ifnum\language=\languageNGerman und\else and\fi
% \begin{example}
% \MathItalics
% \[
% NeuerWert = AlterWert + Korrektur
% \]
% \end{example}
% \else%
% \begin{example}
% \MathNormal
% \[
% NewValue = OldValue + Correction
% \]
% \end{example}
% und
% \begin{example}
% \MathItalics
% \[
% NewValue = OldValue + Correction
% \]
% \end{example}%
% \fi%
%
% \subsection{\ifnum\language=\languageNGerman Makros zur Darstellung von Variablen, Schl"usselw"ortern
% und anderen programmierspezifischen Details
% \else%
% Macros for representing variables, keywords and other
% specific details of programming%
% \fi%
% }
%
% \DescribeMacro{\pVariable}
% \DescribeMacro{\pVar}
% \ifnum\language=\languageNGerman%
% \changes{v-2.0n}{94/03/31}{Dokumentation "uberarbeitet}
% \else%
% \changes{v-2.0n}{94/03/31}{documentation changed}%
% \fi%
% \DescribeMacro{\pKeyword}
% \DescribeMacro{\pKey}
% \DescribeMacro{\pComment}
% \changes{v131}{10/09/21}{changed location of documentation of new use of
% struktxp.sty}
% \changes{v130}{10/09/21}{enhanced the description of using source code}
% \ifnum\language=\languageNGerman%
% Struktogramme enthalten manchmal direkt zu programmierenden Code.
% Um hier ein einheitliches Aussehen zu erreichen, sind die hier
% aufgef"uhrten Makros definiert worden. Um diese Makros auch in anderem
% Zusammenhang nutzen zu k"onnen, sind sie zu einem eigenen
% \foreign{package} \textsf{struktxp.sty} zusammengefasst worden. Dabei
% wird ab Version 122 zur Darstellung von Code auf das Paket
% "`\textsf{url.sty}"' von Donald Arsenau zur"uckgegriffen, das es
% erm"oglicht, verbatim gesetzte Texte als Parameter an ein anderes Makro zu
% "ubergeben. Wenn diese Texte ein Leerzeichen enthalten, das erhalten
% bleiben soll, muss der Benutzer vor dem Laden von \textsf{url.sty},
% typischerweise also vor der Anweisung
% \begin{quote}
%     |\usepackage{struktex}|
% \end{quote}
% die Anweisung
% \begin{quote}
%     |\PassOptionsToPackage{obeyspaces}{url}|
% \end{quote}
% setzen.
% \else%
% Structured box charts sometimes include code, that has to be programmed
% directly. For achieving a homogenous appearance the mentioned macros have
% been defined. They have been collected in a separate package
% \textsf{struktxp.sty} to be able to use them in another context. From
% version 122 on \textsf{struktxp.sty} is based on "\textsf{url.sty}" of
% Donald Arsenau. This package makes allows to pass verbatim texts as
% parameters to other macros. If this verbatim stuff contains blank spaces,
% which should be preserved, the user has to execute the command
% \begin{quote}
%     |\PassOptionsToPackage{obeyspaces}{url}|
% \end{quote}
% before \textsf{url.sty} is loaded, that is in most of the cases before
% the command
% \begin{quote}
%     |\usepackage{struktex}|
% \end{quote}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Mit |\pVariable{|\meta{Variablenname}|}| wird ein Variablenname gesetzt.
% \meta{Variablenname} ist dabei ein Bezeichner eine Variable, wobei der
% Unterstrich "`|_|"', das kaufm"annische Und "`|&|"' und das Dach "`|^|"'
% als Teile des Variablennamens erlaubt sind:
% \else%
% Variable names are set by |\pVariable{|\meta{VariableName}|}|.
% There \meta{VariableName} is an identifier of a variable, whereby the underline
% "`|_|"', the commercial and "`|&|"' and the hat "`|^|"' are allowed to be parts
% of variables:%
% \fi%
% \ifnum\language=\languageNGerman%
% \pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}
% \begin{example}\obeylines
% \renewcommand{\pLanguage}{C}
% \pVariable{cEineNormaleVariable}
% \pVariable{c_eine_normale_Variable}
% \pVariable{&iAdresseEinerVariablen}
% \renewcommand{\pLanguage}{Pascal}
% \pVariable{zZeigerAufEineVariable^.sInhalt}
% \end{example}
% \else%
% \pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}
%  \begin{example}\obeylines
% \pVariable{cANormalVariable}
% \pVariable{c_a_normal_variable}
% \pVariable{&iAddressOfAVariable}
% \pVariable{pPointerToAVariable^.sContent}
% \end{example}%
% \fi%
% \ifnum\language=\languageNGerman%
% Leerzeichen werden beachtet, so dass ganze Anweisungen geschrieben werden
% k"onnen.
% Es darf als Abk"urzung \cs{pVar} benutzt werden.
% \else%
% Blanks are considered such, that whole statements can be written.
% For abbreviation it is allowed to use \cs{pVar}.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Entsprechend wird mit |\pKeyword{|\meta{Schl"usselwort}|}| ein Schl"usselwort
% gesetzt.
% Dabei ist \meta{Schl"usselwort} ein Schl"usselwort in einer
% Programmiersprache, wobei der Unterstrich "`|_|"' und das
% \foreign{hash}-Zeichen "`|#|"' als Teil des Schl"usselwortes
% erlaubt ist. Damit l"asst sich setzen:
% \else%
% A keyword is set by |\pKeyword{|\meta{keyword}|}| respectively.
% There \meta{keyword} is a keyword in a programming language, whereby
% the underline "`|_|"' and the \foreign{hash} symbol "`|#|"' are allowed to be
% parts of keywords. Therewith the following can be set:%
% \fi%
% \begin{example}\obeylines
% \pKeyword{begin}
% \renewcommand{\pLanguage}{Pascal}
% \pKeyword{program}
% \renewcommand{\pLanguage}{C}
% \pKeyword{#include}
% \end{example}
% \ifnum\language=\languageNGerman%
% Auch \cs{pKeyword} darf
% abgek"urzt werden: \cs{pKey}. Damit erzeugt dann der Quelltext
% \else%
% \cs{pKeyword} is also allowed to be abbreviated by \cs{pKey}. With that the
% source code%
% \fi%
% \begin{verbatimwrite}{struktex.tmp}
% \renewcommand{\pLanguage}{Pascal}
% \pKey{begin} \pExp{iVar := iVar + 1;} \pKey{end}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% als Ausgabe dieses Ergebnis:
% \else%
% generates the following result as output:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \ifnum\language=\languageNGerman%
% In "ahnlicher Weise dient \cs{pComment} zur Darstellung von Kommentar.
% Das Argument darf nur Zeichen der \TeX-Kategorie \foreign{letter}
% haben, Zeichen, die einen Kommentar einleiten, m"ussen geschrieben
% werden. \cs{pComment} kann nicht abgek"urzt werden.
% Beispielsweise ergibt
% \else%
% In a similar way \cs{pComment} is of representation purposes of comments.
% The argument is only allowed to consist of characters of the
% category \foreign{letter}. Characters, that start a comment, have to be written.
% \cs{pComment} can't be abbreviated. For instance%
% \fi%
% \begin{verbatimwrite}{struktex.tmp}
% \pExp{a = sqrt(a);} \pComment{// Iteration}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% die Zeile
% \else%
% results in the line%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \DescribeMacro{\pTrue}
% \DescribeMacro{\pFalse}
% \ifnum\language=\languageNGerman%
% Logische Werte spielen in der Programmierung eine wesentliche Rolle.
% Mit \cs{pTrue} und \cs{pFalse} sind entsprechende Werte vorgegeben:
% \pTrue\ und \pFalse.
% \else%
% Boolean values play an importand role in programming. There are given
% adequate values by \cs{pTrue} and \cs{pFalse}: \pTrue\ and \pFalse.%
% \fi%
%
% \DescribeMacro{\pFonts}
% \DescribeMacro{\pBoolValue}
% \ifnum\language=\languageNGerman%
% Der Makro \cs{pFonts} dient der Auswahl von Fonts zur Darstellung von
% Variablen, Schl"usselw"ortern und Kommentar:
% \begin{quote}
% |\pFonts{|\meta{Variablenfont}|}{|\meta{Schl"usselwortfont}|}|%
%     |{|\meta{Kommentarfont}|}|
% \end{quote}
% \else%
% The macro \cs{pFonts} is used for the choice of fonts for representation of
% variables, keywords and comments:
% \begin{quote}
% |\pFonts{|\meta{variablefont}|}{|\meta{keywordfont}|}|%
%     |{|\meta{commentfont}|}|
% \end{quote}%
% \fi%
% \ifnum\language=\languageNGerman%
% Vorbesetzt sind die einzelnen Fonts mit
% \begin{itemize}
% \item \meta{Variablenfont} als |\small\sffamily|,
%
% \item \meta{Schl"usselwortfont} als |\small\sffamily\bfseries| und
%
% \item \meta{Kommentarfont} als |\small\sffamily\slshape|.
%
% \end{itemize}
% \else%
% The default values for the certain fonts are
% \begin{itemize}
% \item \meta{variablefont} as |\small\sffamily|,
%
% \item \meta{keywordfont} as |\small\sffamily\bfseries| and
%
% \item \meta{commentfont} as |\small\sffamily\slshape|.
%
% \end{itemize}%
% \fi%
% \ifnum\language=\languageNGerman%
% Damit wird die obige Zeile nach
% \else%
% With that the above line%
% \fi%
% \ifnum\language=\languageNGerman%
% \begin{verbatimwrite}{struktex.tmp}
% \pFonts{\itshape}{\sffamily\bfseries}{\scshape}
% \pVar{a = }\pKey{sqrt}\pVar{(a);} \pComment{// Iteration}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% zu
% \else%
% becomes%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \changes{v130}{10/09/21}{removed unnecessary math mode}
% \ifnum\language=\languageNGerman%
% Entsprechend k"onnen durch den Makro
% \begin{quote}
%   |\sBoolValue{|\meta{Ja-Wert}|}{|\meta{Nein-Wert}|}|
% \end{quote}
% die Werte von \cs{pTrue} und \cs{pFalse} umdefiniert werden. Somit
% liefern die Zeilen
% \begin{verbatimwrite}{struktex.tmp}
% \renewcommand{\pLanguage}{Pascal}
% \sBoolValue{\textit{ja}}{\textit{nein}}
% \pFalse{} = \pKey{not} \pTrue
% \end{verbatimwrite}
% \else%
% Similarly the values of \cs{pTrue} and \cs{pFalse} can be redefined by
% the macro
% \begin{quote}
%   |\sBoolValue{|\meta{Yes-Value}|}{|\meta{No-Value}|}|
% \end{quote}
% So the lines
% \begin{verbatimwrite}{struktex.tmp}
% \renewcommand{\pLanguage}{Pascal}
% \sBoolValue{\textit{yes}}{\textit{no}}
% \pFalse = \pKey{not} \pTrue
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% das folgende Ergebnis:
% \else%
% result in the following:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \DescribeMacro{\sVar}
% \DescribeMacro{\sKey}
% \DescribeMacro{\sTrue}
% \DescribeMacro{\sFalse}
% \ifnum\language=\languageNGerman%
% Die Makros \cs{sVar} und \cs{sKey} sind mit den Makros \cs{pVar} und \cs{pKey}
% identisch, sie werden hier nur definiert, um Kompatibilit"at mit
% fr"uheren Versionen des \StrukTeXSty{} zu gew"ahrleisten.
% Dasselbe gilt auch f"ur die Makros \cs{sTrue} und \cs{sFalse}.
% \else%
% The macros \cs{sVar} and \cs{sKey} are the same as the macros |pVar| and |pKey|.
% Here they are just described for compatibility reasons with former versions
% of \StrukTeXSty. The same rule shall apply to the macros \cs{sTrue} and
% \cs{sFalse}.%
% \fi%
%
% \subsection{\ifnum\language=\languageNGerman Die Makros zur Erzeugung von Struktogrammen
%                    \else The Macros for generating structured box charts
%                    \fi}
%
% \DescribeEnv{struktogramm}
% \DescribeMacro{\sProofOn}
% \DescribeMacro{\sProofOff}
% \DescribeMacro{\PositionNSS}
% \ifnum\language=\languageNGerman%
% Die Umgebung
% \begin{quote}\obeylines
% \envb{struktogramm}\pparg{Breite}{H"ohe}\oarg{"Uberschrift}
% \dots
% \enve{struktogramm}
% \end{quote}
% erzeugt Raum f"ur ein
% neues Struktogramm. Die beiden Parameter
% legen die Breite und die H"ohe des Platzes fest, der f"ur das Struktogramm
% reserviert wird. Die Angaben werden in Millimetern gemacht, wobei der
% aktuelle Wert von \cs{unitlength} keine Rolle spielt.
% Dabei entspricht die Breite der tats"achlichen Breite,
% die tats"achliche H"ohe wird den Erfordernissen angepasst. Stimmt die
% angegebene H"ohe nicht mit den tats"achlichen Erfordernissen "uberein,
% l"auft das Struktogramm in den umgebenden Text hinein oder es bleibt
% Raum frei. Es gibt einen Schalter \cs{sProofOn}, mit dem die angegebene
% Gr"o"se des Struktogramms durch vier Punkte gezeigt wird, um Korrekturen
% einfacher durchf"uhren zu k"onnen. \cs{sProofOff} schaltet diese Hilfe
% entsprechend wieder ab.
% Die "Uberschrift dient zur Identifizierung des Struktogramms,
% wenn man sich von anderer Stelle, etwa aus einem anderen Struktogramm
% heraus auf dieses hier beziehen will.
% \else%
% The environment
% \begin{quote}\obeylines
% |\begin{struktogramm}(|\meta{width}|,|\meta{height}|)|\oarg{titel}
% \dots
% |\end{struktogramm}|
% \end{quote}
% generates space for a new box chart. Both the parameters provide the width
% and the height of the place, which is reservated for the structured box chart.
% Lengths etc. are described in millimeters. In doing so the actual
% value of \cs{unitlength} is unimportand.
% At the same time the width corresponds with the real width and the
% real height will be adjusted to the demands. If the given height does'nt match
% with the real demands, the structured box chart reaches into the surrounding
% text or there is empty space respectively. There is a switch \cs{sProofOn},
% with which the stated dimensions of the structured box charts is given by
% four points to make corrections easier. \cs{sProofOff} similarly switches this help
% off.
% The title is for identification of structured box charts, if one wants to refer
% to this from another part, e.g. from a second box chart.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Die Struktogramm-Umgebung basiert auf der |picture|-Umgebung von
% \LaTeX.
% Die in der |picture|-Umgebung
% gebr"auchliche L"angeneinheit \cs{unitlength} wird bei den Struktogrammen
% nicht benutzt; die L"angeneinheit ist aus technischen Gr"unden auf $1\, mm$
% festgelegt. Weiterhin m"ussen alle L"angenangaben ganzzahlige Werte sein.
% \cs{unitlength} hat zwar nach dem Zeichnen eines Struktogrammes mit
% \StrukTeX\ den gleichen Wert wie vorher, ist aber innerhalb eines
% Struktogrammes umdefiniert und darf dort auch nicht ge"andert werden.
% \else%
% The structured box chart environment is based on the |picture| environment of
% \LaTeX.
% The unit of length \cs{unitlength}, which is often used in the |picture| environment,
% is not used in structured box charts. The unit of length is fixed by
% $1\, mm$ for technical reasons. Furthermore all of length specifications have to
% be whole numbers. After drawing a structured box chart by \StrukTeX\
% \cs{unitlength} is of the same quantity as before. But it is redefined within a
% structured box chart and need not be changed there.%
% \fi%
%
% \DescribeMacro{\assign}
% \ifnum\language=\languageNGerman%
% Das Hauptelement eines Struktogramms ist ein Kasten, in dem eine Operation
% beschrieben wird. Ein solcher Kasten wird mit \cs{assign} erzeugt. Die
% Syntax ist
% \begin{quote}
% \cs{assign}\oarg{H"ohe}\marg{Inhalt},
% \end{quote}
% wobei die eckigen Klammern wie "ublich ein optionales Argument
% bezeichnen.  Die Breite und die H"ohe des Kastens werden den
% Erfordernissen gem"a"s automatisch angepasst, man kann aber mittels des
% optionalen Argumentes die H"ohe des Kastens vorgeben.%
% \else%
% The main element of a structured box chart is a box, in which an
% operation is described. Such a box will be assigned by \cs{assign}. The
% syntax is the following:
% \begin{quote}
% \cs{assign}\oarg{height}\marg{content},
% \end{quote}
% where the square brackets name an optional element as usual. The width
% and the height of the box will be adjusted automatically according to
% demands. But one can predefine the height of the box by the optional
% argument.%
% \fi
%
% \ifnum\language=\languageNGerman%
% Der \textit{Text} wird normalerweise linksb"undig in den
% Kasten gesetzt; ist er daf"ur zu lang, so wird ein Paragraph (im
% Blocksatz) gesetzt.
% \else%
% The \textit{text} is normally set centered in the box. If the text is too
% long for that, then a (justified) paragraph is set.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% \begin{tExample}
% Ein einfaches Struktogramm wird mit den folgenden Anweisungen erzeugt:
% \begin{verbatimwrite}{struktex.tmp}
% \sProofOn
% \begin{struktogramm}(70,12)[1.\ Versuch]
%     \assign{Quadratwurzel von $\pi$ berechnen und ausgeben}
% \end{struktogramm}
% \sProofOff
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen f"uhren zu folgendem Struktogramm, wobei der Anwender
% wie auch bei der zugrundeliegenden |picture|-Umgebung f"ur eine geeignete
% Positionierung zu sorgen hat. Die Positionierung erfolgt in dieser
% Dokumentation im Regelfall mit der |quote|-Umgebung, man kann ein
% Struktogramm aber auch mit der |center|-Umgebung zentrieren.
% Die Breite des Struktogramms ist mit 70mm vorgegeben, die H"ohe mit 12mm.
% Eine Alternative ist durch die |centernss|-Umgebung gegeben,
% die auf Seite \pageref{centernss} beschrieben wird.
% \else%
% \begin{tExample}
% A simple structured box chart will be generated by the following instructions:
% \begin{verbatimwrite}{struktex.tmp}
% \sProofOn
% \begin{struktogramm}(70,20)[1.\ trial]
%     \assign{Root of $\pi$, calculation and output}
% \end{struktogramm}
% \sProofOff
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% These instructions lead to the following box chart, at which the user has to
% provide an appropriate positioning like in the basing \cs{picture} environment.
% Herewith the positioning is normally done by the |quote| environment. But one can
% also center the structured box chart by the |center| environment.
% The width of the box chart is given by 70mm, the height by 12mm. An alternative
% is given by the |centernss| environment, that is described on page
% \pageref{centernss}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Gleichzeitig wird die Wirkung von \cs{sProofOn} und \cs{sProffOff} gezeigt,
% wobei die zu gro"se vorgegebene Gr"o"se des Struktogrammes zu beachten ist.
% \else%
% At the same time the effect of \cs{sProofOn} and \cs{sProofOff} is shown,
% at which the too large size of structured box chart has to be taken notice of.%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \ifnum\language=\languageNGerman%
% Die Bedeutung des optionalen Argumentes macht das folgende Beispiel deutlich.
% \begin{tExample}
% Die H"ohe des Kastens wird vorgegeben:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{center}
% \begin{struktogramm}(70,20)
%     \assign[20]{Quadratwurzel von $\pi$ berechnen und ausgeben}
% \end{struktogramm}
% \end{center}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen f"uhren zu folgendem Struktogramm, wobei zu beachten
% ist, dass die |struktogramm|-Umgebung mittels einer |center|-Umgebung
% zentriert wurde, wobei die Breite des Struktogramms wiederum mit 70mm
% vorgegeben ist, die H"ohe diesmal aber mit 20mm.
% \else%
% The meaning of the optional argument will be made clear by the following
% example:
% \begin{tExample}
% The height of the box is given by:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{center}
% \begin{struktogramm}(70,20)
%     \assign[20]{Root of $\pi$, calculation and output}
% \end{struktogramm}
% \end{center}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% These instructions lead to the following structured box chart. In doing so it is to
% pay attention on the |struktogramm| environment, which has been centered
% by the |center| environment, at which the width of the structured box chart is again
% given by 70mm, but the height by 20mm this time.%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \DescribeEnv{declaration}
% \ifnum\language=\languageNGerman%
% Die |declaration|-Umgebung dient der Beschreibung von Variablen bzw.
% der Beschreibung der Schnittstelle. Ihre
% Syntax ist
% \begin{quote}\obeylines
% \envb{declaration}\oarg{"Uberschrift}
% \dots
% \enve{declaration}
% \end{quote}
% \else%
% The |declaration| environment is used for the description of variables or interfaces
% respectively. Its syntax is given by
% \begin{quote}\obeylines
% \envb{declaration}\oarg{titel}
% \dots
% \enve{declaration}
% \end{quote}%
% \fi%
%
% \DescribeMacro{\declarationtitle}
% \ifnum\language=\languageNGerman%
% Die "Uberschriftsangabe ist optional. L"asst man die Angabe weg, so wird
% standardm"a"sig die "Uberschrift: "`Speicher bereitstellen:"' erzeugt.
% Will man einen anderen Text haben, wird dieser mit
% \cs{declarationtitle}\marg{"Uberschrift} global festgelegt. Will man f"ur
% ein einzelnes Struktogramm einen speziellen Titel erzeugen, so gibt man
% diesen in den eckigen Klammern an.
% \else%
% The declaration of the title is optional. If the declaration is omitted, the standard
% title: `Providing Memory Space' will be generated.
% If one wants to have another text, it will be provided globally by
% \cs{declarationtitle}\marg{title}. If one wants to generate a special title for a
% certain structured box chart, one has to declare it within square brackets.%
% \fi%
%
% \DescribeMacro{\description}
% \DescribeMacro{\descriptionindent}
% \DescribeMacro{\descriptionwidth}
% \DescribeMacro{\descriptionsep}
% \changes{v-8.0b}{04/07/14}{Zeichnung zum Layout der Deklarationen
% verbessert (`multiput statt n-mal `put, Korrektur von Bezeichnungen)}
% \ifnum\language=\languageNGerman%
% Innerhalb der |declaration|-Umgebung werden die Beschreibungen der einzelnen
% Variablen mit
% \begin{quote}
% \cs{description}\marg{Variablenname}\marg{Variablenbeschreibung}
% \end{quote}
% erzeugt. Dabei ist zu beachten, dass \meta{Variablenname} keine
% schlie"sende eckige Klammer "`]"' beinhalten darf, da dieser Makro
% mittels des \cs{item}-Makros definiert worden ist. Eckige Klammern sind in
% diesem Fall als \cs{lbracket} und \cs{rbracket} einzugeben.
% \else%
% Within the |declaration| environment the descriptions of the variables can be
% generated by
% \begin{quote}
% \cs{description}\marg{variableName}\marg{variableDescription}
% \end{quote}
% In doing so one has to pay attention on the \meta{variableName}, that is not
% allowed to content a right square bracket "']"', because this macro has been
% defined by the \cs{item} macros. Square brackets have to be entered as
% \cs{lbracket} or \cs{rbracket} respectively.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Das Aussehen einer Beschreibung l"asst sich mit drei Parametern
% steuern: \cs{descriptionindent}, \cs{descriptionwidth} und \cs{descriptionsep};
% die Bedeutung der Parameter ist der \Abb{description} zu entnehmen
% (\cs{xsize@nss} und \cs{xin@nss} sind interne Gr"o"sen, die von \StrukTeX\
% vorgegeben werden).
% Die Vorbesetzung dieser Werte ist folgenderma"sen:
% \begin{quote}\begin{verbatim}
% \descriptionindent=1.5em
% \descriptionwidth=40pt
% \descriptionsep=\tabcolsep
% \end{verbatim}\end{quote}
% Die Bedeutung von \cs{descriptionwidth} ist darin zu sehen, dass ein
% Variablenname, der k"urzer als \cs{descriptionwidth} ist, eine Beschreibung
% erh"alt, die auf der gleichen H"ohe liegt; ansonsten wird die Beschreibung
% eine Zeile tiefer begonnen.
% \else%
% The shape of a description can be controled by three parameters:
% \cs{descriptionindent}, \cs{descriptionwidth} and \cs{descriptionsep}.
% The meaning of the parameters can be taken from \ref{description}
% (\cs{xsize@nss} and \cs{xin@nss} are internal sizes, that are given by
% \StrukTeX).
% The default values are the following:
% \begin{quote}\begin{verbatim}
% \descriptionindent=1.5em
% \descriptionwidth=40pt
% \descriptionsep=\tabcolsep
% \end{verbatim}\end{quote}
% The significance of \cs{descriptionwidth} is, that a variable name, which
% is shorter than \cs{descriptionwidth}, gets a description of the same
% height. Otherwise the description will be commenced in the next line.%
% \fi%
% \begin{figure}[tb]
%     \unitlength 1.00mm
%     \linethickness{0.4pt}
%     \begin{picture}(125.00,100.00)
%         \put(0.00,0.00){\framebox(125.00,100.00)[cc]{}}
%         \put(62.50,95.00){\makebox(0,0)[cc]{{\cs{xsize@nss}}}}
%         \put(62.50,85.00){\makebox(0,0)[cc]{{\cs{tempxx@nss}}}}
%         \put(10.00,70.00){\framebox(105.00,5.00)[cc]{}}
%         \put(15.00,71.00){\makebox(0,0)[lb]{\ifnum\language=\languageNGerman%
%                                                 \meta{"Uberschrift}%
%                                             \else%
%                                                 \meta{title}%
%                                             \fi}}
%         \put(72.50,95.00){\vector(1,0){52.50}}
%         \put(52.50,95.00){\vector(-1,0){52.50}}
%         \put(73.50,85.00){\vector(1,0){41.50}}
%         \put(51.50,85.00){\vector(-1,0){41.50}}
%         \put(30.00,56.00){\makebox(0,0)[lb]{\ifnum\language=\languageNGerman%
%                                                 \meta{Variablenname}%
%                                             \else%
%                                                 \meta{variable name}%
%                                             \fi}}
%         \put(40.00,52.00){\vector(1,0){17.00}}
%         \put(19.00,57.00){\vector(-1,0){9.00}}
%         \put(67.00,5.00){\framebox(48.00,5.00)[cc]{}}
%         \put(67.00,25.00){\framebox(48.00,35.00)[cc]{}}
%         \put(72.00,56.00){\makebox(0,0)[lb]{\ifnum\language=\languageNGerman%
%                                                 \meta{Variablenbeschreibung}%
%                                             \else%
%                                                 \meta{variable description}%
%                                             \fi}}
%         \put(72.00,6.00){\makebox(0,0)[lb]{\ifnum\language=\languageNGerman%
%                                                 \meta{Variablenbeschreibung}%
%                                            \else%
%                                                 \meta{variable description}%
%                                            \fi}}
%         \put(30.00,16.00){\makebox(0,0)[lb]{\ifnum\language=\languageNGerman%
%                                                 \meta{Variablenname}%
%                                             \else%
%                                                 \meta{variable name}%
%                                             \fi}}
%         \put(25.00,15.00){\framebox(90.00,5.00)[cc]{}}
%         \put(19.00,57.00){\vector(1,0){6.00}}
%         \put(40.00,52.00){\vector(-1,0){15.00}}
%         \put(25.00,50.00){\framebox(32.00,10.00)[cc]{}}
%         \put(62.00,54.00){\vector(-1,0){5.00}}
%         \put(62.00,54.00){\vector(1,0){5.00}}
%         \put(15.00,17.00){\vector(1,0){10.00}}
%         \put(15.00,17.00){\vector(-1,0){5.00}}
%         \put(40.00,42.00){\makebox(0,0)[cc]{{\cs{descriptionwidth}}}}
%         \put(66.00,32.00){\makebox(0,0)[rc]{{\cs{descriptionsep}}}}
%         \put(12.00,36.00){\makebox(0,0)[lc]{{\cs{descriptionindent}}}}
%         \multiput(10.00,100.00)(0.00,-3.00){33}{\line(0,-1){2.00}}
%         \put(10.00,1.00){\line(0,-1){1.00}}
%         \multiput(115.00,100.00)(0.00,-3.00){33}{\line(0,-1){2.00}}
%         \put(115.00,1.00){\line(0,-1){1.00}}
%         \put(60.00,35.00){\line(0,-1){2.00}}
%         \put(17.00,33.00){\line(0,1){1.00}}
%         \put(17.00,39.00){\line(0,-1){1.00}}
%         \put(60.00,35.00){\line(0,1){19.00}}
%         \put(40.00,43.00){\line(0,1){9.00}}
%         \put(17.00,57.00){\line(0,-1){18.00}}
%         \put(17.00,33.00){\line(0,-1){16.00}}
%         \put(17.00,17.00){\circle*{1.00}}
%         \put(17.00,57.00){\circle*{1.00}}
%         \put(40.00,52.00){\circle*{1.00}}
%         \put(60.00,54.00){\circle*{1.00}}
%     \end{picture}
%     \caption{\label{description}\ifnum\language=\languageNGerman Aufbau einer
%                                     Variablenbeschreibung
%                                 \else Construction of a Variable Description
%                                 \fi}
% \end{figure}
%
% \begin{tExample}
% \ifnum\language=\languageNGerman%
% Zun"achst wird nur eine einzelne Variable beschrieben.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,20)
%     \assign%
%     {%
%         \begin{declaration}
%             \description{\pVar{iVar}}{eine \pKey{int}-Variable,
%                             deren Beschreibung hier allein dem
%                             Zweck dient, den Makro vorzuf"uhren}
%         \end{declaration}
%     }
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% First there will be described only one variable.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,20)
%     \assign%
%     {%
%         \begin{declaration}
%             \description{\pVar{iVar}}{an \pKey{int} variable, which is
%                             described here just for presentation of the
%                             macro}
%         \end{declaration}
%     }
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Das zugeh"orige Struktogramm, wobei zu beachten ist, dass durch die
% leeren eckigen Klammern keine "Uberschrift erzeugt wird.
% \else%
% The corresponding structured box chart is the following, at which one has to
% pay attention, that there are no titels generated by the empty square
% brackets.%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Nun werden Variablen genauer spezifiziert:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,50)
%     \assign{%
%         \begin{declaration}[Parameter:]
%             \description{\pVar{iPar}}{ein \pKey{int}-Parameter,
%                         dessen Bedeutung hier beschrieben wird}
%         \end{declaration}
%         \begin{declaration}[lokale Variablen:]
%             \description{\pVar{iVar}}{eine \pKey{int}-Variable,
%                         deren Bedeutung hier beschrieben wird}
%             \description{\pVar{dVar}}{eine \pKey{double}-Variable,
%                         deren Bedeutung hier beschrieben wird}
%         \end{declaration}
%     }
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% Now variables will be specified more precisely:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,50)
%     \assign{%
%         \begin{declaration}[Parameter:]
%             \description{\pVar{iPar}}{an \pKey{int} parameter with the
%                         meaning described here}
%         \end{declaration}
%         \begin{declaration}[local Variables:]
%             \description{\pVar{iVar}}{an \pKey{int} variable with the meaning
%                         described here}
%             \description{\pVar{dVar}}{a \pKey{double} variable with the
%                          meaning described here}
%         \end{declaration}
%     }
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Das ergibt:
% \else%
% This results in:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \changes{v121}{10/08/31}{removed catcoding from example code}
% \ifnum\language=\languageNGerman%
% Zuletzt die globale Vereinbarung eines Titels:
% \begin{verbatimwrite}{struktex.tmp}
% \def\declarationtitle{globale Variablen:}
% \begin{struktogramm}(95,13)
%     \assign{%
%     \begin{declaration}
%         \description{\pVar{iVar_g}}{eine \pKey{int}-Variable}
%     \end{declaration}
%   }
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% Finally the global declaration of a titel:
% \begin{verbatimwrite}{struktex.tmp}
% \def\declarationtitle{global variables}
% \begin{struktogramm}(95,13)
%     \assign{%
%     \begin{declaration}
%         \description{\pVar{iVar_g}}{an \pKey{int} variable}
%     \end{declaration}
%   }
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Dies ergibt das folgende Aussehen:
% \else%
% This results in the following shape:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Hier ist die lokale Umsetzung des \cs{catcode}s des Unterstrichs zu
% beachten, die erforderlich ist, wenn man einen Unterstrich in einem
% Makroargument einsetzen m"ochte. Diese lokale Umsetzung wird zwar auch
% schon bei \cs{pVar} gemacht, reicht aber bei der Makroexpansionstechnik
% von \TeX\ nicht aus.
% \else%
% Here one has to notice the local realisation of the \cs{catcode} of the
% underline, which is necessary, if one wants to place an underline into
% an argument of macro. Although this local transfer is already realized
% at \cs{pVar} it doesn't suffice with the technique of macro expanding
% of \TeX.%
% \fi%
% \end{tExample}
%
% \DescribeMacro{\sub}
% \DescribeMacro{\return}
% \ifnum\language=\languageNGerman%
% Die Sinnbilder f"ur einen Unterprogrammsprung und einen Aussprung aus dem
% Programm sehen "ahnlich aus und werden mit folgenden Befehlen gezeichnet:
% \begin{quote}\obeylines
% \cs{sub}\oarg{H"ohe}\marg{Text}
% \cs{return}\oarg{H"ohe}\marg{Text}
% \end{quote}
% \else%
% The mapping conventions for jumps of subprograms and for exits of program
% look similar and are drawn by the following instructions:
% \begin{quote}\obeylines
% \cs{sub}\oarg{height}\marg{text}
% \cs{return}\oarg{height}\marg{text}
% \end{quote}%
% \fi%
% \ifnum\language=\languageNGerman%
% Die Parameter haben dieselbe Bedeutung wie bei \cs{assign}.
% Das n"achste Beispiel zeigt, wie diese Sinnbilder gezeichnet werden.\par
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,20)
%     \sub{Liste sortieren}
%     \return{Listenkopf zur"uckgeben}
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% The parameters mean the same as at \cs{assign}. The next example
% shows how the mapping conventions are drawn.\par
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,20)
%     \sub{sorting the list}
%     \return{return of list header}
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{tExample}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
%\DescribeMacro{\while}
%\DescribeMacro{\whileend}
%\DescribeMacro{\until}
%\DescribeMacro{\untilend}
%\DescribeMacro{\forallin}
%\DescribeMacro{\forallinend}
%\DescribeMacro{\forever}
%\DescribeMacro{\foreverend}
% \changes{v2.1}{17/06/06}{`forallin, `forallinend: added english documentation}
% \changes{v2.0c}{17/06/06}{`forallin, `forallinend: added german documentation}
% \changes{v2.0b}{17/06/02}{`forallin, `forallinend: renamed from
% `foreach, `foreach to avoid conflict with tikz}
% \changes{v2.0a}{17/06/02}{`foreach, `foreachend: renamed from `forall, `forallend}
% \ifnum\language=\languageNGerman%
% Zum Darstellen von Schleifenkonstrukten stehen die drei Befehle
% \cs{while}, \cs{until} und \cs{forever} zur Verf"ugung.
% Die While-Schleife stellt
% eine Wiederholung mit vorausgehender Bedingungspr"ufung (kopfgesteuerte
% Schleife) dar, die
% Until-Schleife testet die Bedingung am Schleifenende (fu"sgesteuerte
% Schleife) und die
% Forever-Schleife ist eine Endlosschleife, aus der man mit dem Befehl
% \cs{exit} herausspringen kann.
% \begin{quote}\obeylines
% \cs{while}\oarg{Breite}\marg{Text}\meta{Unterstruktogramm}\cs{whileend}
% \cs{until}\oarg{Breite}\marg{Text}\meta{Unterstruktogramm}\cs{untilend}
% \cs{forever}\oarg{Breite}\meta{Unterstruktogramm}\cs{foreverend}
% \cs{exit}\oarg{H"ohe}\marg{Text}
% \end{quote}
% \meta{Breite} ist die Dicke des Rahmens des Sinnbildes,
% \meta{Text} ist
% der Bedingungstext, der in diesen Rahmen geschrieben wird. Wird die
% Breite nicht angegeben, richtet sich die Rahmendicke nach der H"ohe des
% Textes. Der Text wird linksb"undig in den Rahmen geschrieben.
% Ist der Text leer,  so wird ein d"unner Rahmen gezeichnet.
%
% Ein Kontrollkonstrukt, das heute in vielen Programmiersprachen verf"ugbar
% ist, ist eine Schleife, die abh"angig von der jeweiligen Sprache als
% |forall|-, |for| \ldots{} |in| oder |foreach|-Schleife bezeichnet
% wird. Diese Schleifenart kann prinzipiell als kopfgesteuerte Schleife
% angesehen werden, manche ziehen aber eine Schreibweise vor, die von der
% Endlosschleife abgeleitet wird. F"ur diesen Fall gibt es das Konstrukt
% \begin{quote}
%  \cs{forallin}\oarg{Breite}\marg{Text}\meta{Unterstruktogramm}\cs{forallinend}
% \end{quote}
% \else%
% For representation of loop constructions there are three instructions
% available:
% \cs{while}, \cs{until} and \cs{forever}.
% The while loop is a repetition with preceding condition check (loop with
% a pre test).
% The until loop checks the condition at the end of the loop (loop with a
% post test).
% And the forever loop is a neverending loop, that can be left by \cs{exit}.
% \begin{quote}\obeylines
% \cs{while}\oarg{width}\marg{text}\meta{structured subbox chart}%
%         \cs{whileend}
% \cs{until}\oarg{width}\marg{text}\meta{structured subbox chart}%
%         \cs{untilend}
% \cs{forever}\oarg{width}\meta{structured subbox chart}\cs{foreverend}
% \cs{exit}\oarg{height}\meta{text}
% \end{quote}
% \meta{width} is the width of frame of the mapping convention and \meta{text}
% is the conditioning text, that is written inside this frame. If the width
% is not given, the thickness of frame depends on the height of text. The
% text will be written left adjusted inside the frame. If there is'nt given
% any text, there will be a thin frame.
%
% A control structure which nowadays is provided by many programming
% languages is a loop known as |forall|-, |for| \ldots |in|-, or
% |foreach|-loop. This kind of loop can be seen as tail first loop but some
% people prefer the form of the endless loop with included text. For this
% case there is the control structure
% \begin{quote}
%     \cs{forallin}\oarg{width}\marg{text}\meta{structured subbox chart}\cs{forallinend}
% \end{quote}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% An Stelle
% von \meta{Unterstruktogramm} k"onnen beliebige Befehle von \StrukTeX\
% stehen (mit Ausnahme von \cs{openstrukt} und \cs{closestrukt}), die
% das Struktogramm innerhalb der \cs{while}-, der \cs{until}- oder der
% \cs{forever}-Schleife
% bilden.
% \else%
% Instead of \meta{structured subbox chart} there might be written any
% instructions of \StrukTeX\ (except \cs{openstrukt} and \cs{closestrukt}), which
% build up the box chart within the \cs{while} loop, the \cs{until} loop or the
% \cs{forever} loop.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% \changes{v2.0}{17/06/01}{corrected typos}
% Um Kompatiblit"at mit der Weiterentwicklung des \StrukTeXSty{} von J.~Dietel
% zu erreichen, gibt es die Makros \cs{dfr} und \cs{dfrend} mit derselben
% Bedeutung wie \cs{forever} und \cs{foreverend}.
% \else%
% For compatibility with further development of the \StrukTeXSty{} of J.~Dietel
% there are the macros \cs{dfr} and \cs{dfrend} with the same meaning as
% \cs{forever} and \cs{foreverend}.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Die beiden folgenden Beispiele zeigen den Einsatz der \cs{while}- und
% \cs{until}-Makros sowie der \cs{forallin}-Makros,
% \cs{forever} wird weiter unten gezeigt.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \assign{\(I \gets 1\)}
%     \while[8]{\(I < 99\)}
%         \assign{\(J \gets I+1\)}
%         \until{\(J < 100\)}
%             \sub{Vertausche, falls gilt: \(FELD(I) > FELD(J)\)}
%             \assign{\(J \gets J+1\)}
%         \untilend
%         \assign{\(I \gets I+1\)}
%     \whileend
%  \end{struktogramm}
% \end{verbatimwrite}
% \else%
% The two following examples show use of \cs{while} and \cs{until} macros. \cs{forever}
% will be shown later.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \assign{\(I \gets 1\)}
%     \while[8]{\(I < 99\)}
%         \assign{\(J \gets I+1\)}
%         \until{\(J < 100\)}
%             \sub{Swap, if valid: \( ARRAY(I) > ARRAY(J) \)}
%             \assign{\(J \gets J+1\)}
%         \untilend
%         \assign{\(I \gets I+1\)}
%     \whileend
%  \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
%
% \begin{tExample}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \ifnum\language=\languageNGerman%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95, 25)
%     \sub{berechne Liste \(L\) der ersten 100 Primzahlen}
%     \forallin{\(\forall l\in L\)}
%         \assign{gib \(l\) aus}
%     \forallinend
%  \end{struktogramm}
% \end{verbatimwrite}
% \else%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95, 25)
%     \sub{compute the list \(L\) of the first 100 primes}
%     \forallin{\(\forall l\in L\)}
%         \assign{print \(l\)}
%     \forallinend
%  \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
%
% \begin{tExample}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \ifnum\language=\languageNGerman%
% Die \cs{exit}-Anweisung gibt nur im Zusammenhang mit einfachen oder mehrfachen
% Verzweigungen Sinn, daher wird sie im Anschluss an die Diskussion der
% Verzweigungen vorgestellt.
% \else%
% The \cs{exit} instruction only makes sense in connection with simple or
% multiple branches. Therefore it will be presented after the discussion
% of branches.%
% \fi%
%
% \DescribeMacro{\ifthenelse}%
% \DescribeMacro{\change}%
% \DescribeMacro{\ifend}%
% \ifnum\language=\languageNGerman%
% Zur Darstellung von Alternativen stellt \StrukTeX\ die Sinnbilder f"ur
% einen If-Then-Else-Block und f"ur mehrfache Alternativen eine
% Case-Konstruktion zur Verf"ugung. Da in der klassischen
% |picture|-Umgebung von \LaTeX{} nur Linien mit bestimmten Steigungen
% gezeichnet werden k"onnen, muss der Benutzer bei beiden Befehlen selbst
% den Winkel bestimmen, mit dem die notwendigen schr"agen Linien gezeichnet
% werden sollen (hier ist also etwas mehr \glq Handarbeit\grq\ n"otig).%
% \else%
% For the representation of alternatives \StrukTeX\ provides mapping
% conventions for an If-Then-Else-block and a Case-construction for
% multiple alternatives.  Since in the traditional |picture| environment of
% \LaTeX{} only lines of certain gradients can be drawn, in both cases the
% user has to specify himself the angle, with which the necessary slanted
% lines shall be drawn. (Here is a little bit more \grq handy work\grq\
% required.)%
% \fi%
%
% \changes{v2.0}{17/06/01}{mention pict2e.sty}
% \changes{v-6.0}{00/11/24}{Einsatz von curves.sty zum Zeichnen beliebiger
% Steigungen implementiert}
% \ifnum\language=\languageNGerman%
% Wenn hingegen der \textsf{curves.sty}, der \textsf{emlines2.sty} oder der
% \textsf{pict2e.sty} eingesetzt wird, ist die Darstellung von Geraden mit
% beliebiger Steigung m"oglich.
% \else%
% If however the \textsf{curves.sty}, the \textsf{emlines2.sty} or the
% \textsf{pict2e.sty} is used, then the representation of lines with any
% gradient can be drawn.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Der If-Then-Else-Befehl sieht so aus:
% \begin{quote}\obeylines
% \cs{ifthenelse}\oarg{H"ohe}\marg{Linker Winkel}\marg{Rechter Winkel}
% ~~~~~~~~\marg{Bedingung}\marg{Linker Text}\marg{Rechter Text}
% ~~~~\meta{Unterstruktogramm}
% \cs{change}
% ~~~~\meta{Unterstruktogramm}
% \cs{ifend}
% \end{quote}
% \else%
% The If-Then-Else-command looks like:
% \begin{quote}\obeylines
% \cs{ifthenelse}\oarg{height}\marg{left angle}\marg{right angle}
% ~~~~~~~~\marg{condition}\marg{left text}\marg{right text}
% ~~~~\meta{structured subbox chart}
% \cs{change}
% ~~~~\meta{structured subbox chart}
% \cs{ifend}
% \end{quote}%
% \fi%
% \ifnum\language=\languageNGerman%
% F"ur den Fall, dass das optionale Argument \meta{H"ohe} nicht angegeben
% ist, sind \meta{Linker Winkel} (\texttt{\#1}) und \meta{Rechter Winkel}
% (\texttt{\#2}) Ziffern
% zwischen 1 und 6; diese bestimmen die Steigung der beiden Unterteilungslinien
% des If-Then-Else-Blocks (gro"ser Wert = kleine Steigung). Gr"o"sere Werte
% werden auf 6 gesetzt, kleinere auf 1. Das genaue
% Verhalten der Steigungen ist dem folgenden Bild zu entnehmen;
% \cs{xsize@nss} ist
% dabei die Breite des aktuellen Unterstruktogrammes. Wird die \meta{H"ohe}
% vorgegeben, so bestimmt dieser Wert statt des Ausdruckes
% \(\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt \#1 + \#2}}\) die H"ohe des
% Bedingungsrechteckes.
% \else%
% In the case of omitting the optional argument \meta{height} \meta{left
% angle} and \meta{right angle} are numbers from 1 to 6.
% They specify the gradient of both the partitioning lines of
% the If-Then-Else-block (large number = small gradient). Larger values are
% put on 6, smaller values on 1. The precise characteristics of the gradients
% can be taken from the following picture. Thereby \cs{xsize@nss} is the width
% of the actual structured subbox chart.
% If the \meta{height} is given, then this value determines the height of the
% conditioning rectangle instead of the expression  \(\frac{\mbox{\cs{xsize@nss}}}
% {\mbox{\tt \#1 + \#2}}\).%
% \fi%
% \begin{quote}
%   \unitlength 1.00mm
%   \linethickness{0.4pt}
%   \begin{picture}(100.00,20.00)
%   \put(10.00,5.00){\framebox(90.00,10.00)[cc]{}}
%   \put(50.00,18.00){\makebox(0,0)[cc]{\cs{xsize@nss}}}
%   \put(2.00,10.00){\makebox(0,0)[cc]
%   {$\frac{\mbox{\tt\char92 xsize@nss}}{\mbox{\tt \#1 + \#2}}$}}
%   \put(0.00,15.00){\line(1,0){4.00}}
%   \put(2.00,15.00){\line(0,-1){2.00}}
%   \put(0.00,5.00){\line(1,0){4.00}}
%   \put(2.00,5.00){\line(0,1){2.00}}
%   \put(10.00,4.00){\line(0,-1){4.00}}
%   \put(40.00,4.00){\line(0,-1){4.00}}
%   \put(100.00,0.00){\line(0,1){4.00}}
%   \put(70.00,2.00){\makebox(0,0)[cc]
%   {\tt \#2 $\cdot\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt \#1 + \#2}}$}}
%   \put(25.00,2.00){\makebox(0,0)[cc]
%   {\tt \#1 $\cdot\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt \#1 + \#2}}$}}
%   \put(10.00,2.00){\line(1,0){5.00}}
%   \put(35.00,2.00){\line(1,0){25.00}}
%   \put(80.00,2.00){\line(1,0){20.00}}
%   \put(10.00,16.00){\line(0,1){4.00}}
%   \put(100.00,16.00){\line(0,1){4.00}}
%   \put(10.00,18.00){\line(1,0){30.00}}
%   \put(60.00,18.00){\line(1,0){40.00}}
%   \put(10.00,15.00){\line(3,-1){30.00}}
%   \put(40.00,5.00){\line(6,1){60.00}}
%   \end{picture}
% \end{quote}
% \ifnum\language=\languageNGerman%
% \meta{Bedingung}
% wird in das so gebildete obere mittlere Dreieck gesetzt; die Parameter
% \meta{Linker Text} und \meta{Rechter Text} werden in das
% linke bzw.\ rechte
% untere Dreieck gesetzt. Der Bedingungs-Text kann in seinem Dreiecks-Feld
% umgebrochen werden.  Ab Version v-5.3 wird der Bedingungstext durch
% geeigneten Umbruch beliebigen Steigungen angepasst.\footnote{Diese
% Erweiterung stammt von Daniel Hagedorn, dem ich hiermit herzlich danken
% m"ochte} Die beiden anderen Texte sollten kurz sein (\zB\
% ja/nein oder true/false), da sie nicht umgebrochen werden k"onnen und
% sonst "uber ihr Dreiecks-Feld hinausragen. Um an dieser Stelle
% Einheitlichkeit zu erzielen, sollten die Makros \cs{pTrue} und \cs{pFalse}
% benutzt werden. Hinter \cs{ifthenelse}
% werden die Befehle f"ur das linke, hinter \cs{change} die f"ur das
% rechte "`Unterstruktogramm"' geschrieben. Falls diese beiden
% Struktogramme nicht gleich lang sind, wird ein Kasten mit einem $\emptyset$
% erg"anzt.\footnote{Eventuell ist ein \cs{strut} hilfreich, um
% unterschiedliche H"ohen von Texten auszugleichen.} Mit \cs{ifend} wird das
% If-Then-Else-Element beendet.
% Es folgen zwei Beispiele f"ur die Anwendung.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,32)
%     \ifthenelse[12]{1}{2}
%         {Flag f"ur Drucker-Ausgabe gesetzt ?}{\sTrue}{\sFalse}
%         \assign[15]{Ausgabe auf Drucker umleiten}
%     \change
%         \assign{Ausgabe auf den Bildschirm}
%     \ifend
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% \meta{condition} is set in the upper triangle built in the above way. The
% parameters \meta{left text} and \meta{right text} are set in the left or
% right lower triangle respectively. The conditioning text can be made up
% in its triangle box. From version v-5.3 on the conditioning text \ldots
% \footnote{This extension is due to Daniel Hagedorn, whom I have to thank
% for his work.} Both the other texts should be short (e.g. yes/no or
% true/false), since they can't be made up and otherwise they stand out from
% their triangle box. For obtaining uniformity here the macros \cs{pTrue} and
% \cs{pFalse} should be used. Behind \cs{ifthenelse} the instructions for the
% left "'structured subbox chart"'
% are written and behind \cs{change} the instructions for the right
% "'structured subbox chart"' are written. If these two box charts have not
% the same length, then a box with $\emptyset$ will be completioned.
% The If-Then-Else-element is finished by \cs{ifend}. In the following there
% are two examples for application.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,32)
%     \ifthenelse[12]{1}{2}
%         {Flag for Output on Printer set ?}{\sTrue}{\sFalse}
%         \assign[15]{Output directed to Printer}
%     \change
%         \assign{Output on Screen}
%     \ifend
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{tExample}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
% \ifnum\language=\languageNGerman%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(90,30)
%     \ifthenelse{3}{4}
%         {Flag f"ur Drucker-Ausgabe gesetzt ?}{\sTrue}{\sFalse}
%         \assign[15]{Ausgabe auf Drucker umleiten}
%     \change
%         \assign{Ausgabe auf den Bildschirm}
%     \ifend
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(90,30)
%     \ifthenelse{3}{4}
%         {Output on Printer set ?}{\sTrue}{\sFalse}
%         \assign[15]{Output on Printer diverted}
%     \change
%         \assign{Output on Screen}
%     \ifend
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{tExample}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \DescribeMacro{\case}
% \DescribeMacro{\switch}
% \DescribeMacro{\caseend}
% \ifnum\language=\languageNGerman%
% Das Case-Konstrukt hat folgende Syntax:
% \begin{quote}\obeylines
% \cs{case}\oarg{H"ohe}\marg{Winkel}\marg{Anzahl der F"alle}\marg{Bedingung}\marg{Text des 1. Falles}
% ~~~~\meta{Unterstruktogramm}
% \cs{switch}\oarg{Position}\marg{Text des 2. Falles}
% ~~~~\meta{Unterstruktogramm}
% \dots
% \cs{switch}\oarg{Position}\marg{Text des n.\ Falles}
% ~~~~\meta{Unterstruktogramm}
% \cs{caseend}
% \end{quote}
% \else%
% The Case-Construct has the following syntax:
% \begin{quote}\obeylines
% \cs{case}\oarg{height}\marg{angle}\marg{number of cases}\marg{condition}\marg{text of 1. case}|}|
% ~~~~\meta{structured subbox chart}
% \cs{switch}\oarg{position}\marg{text of 2. case}
% ~~~~\meta{structured subbox chart}
% \dots
% \cs{switch}\oarg{position}\marg{text of n.\ case}
% ~~~~\meta{structured subbox chart}
% \cs{caseend}
% \end{quote}%
% \fi%
% \ifnum\language=\languageNGerman%
% Ist die \meta{H"ohe} nicht angegeben, so erh"alt die Unterteilungslinie
% des Case-Sinnbildes die durch \meta{Winkel} angegebene Steigung (die bei
% \cs{ifthenelse} erw"ahnten Winkelwerte).  In das obere der durch diese
% Linie entstandenen beiden Dreieck wird der Text \meta{Bedingung}
% gesetzt. Die Gr"o"senverh"altnisse ergeben sich aus der folgenden Skizze
% (\cs{xsize@nss} ist die aktuelle Breite des (Unter-)Struktogramms):
% \else%
% If the \meta{height} is not given, then the partitioning line of the
% mapping convention of case gets the gradient given by \meta{angle} (those
% values mentioned at \cs{ifthenelse}).  The text \meta{condition} is set
% into the upper of the both triangles built by this line. The proportions
% are sketched below:%
% \fi%
% \begin{center}
% \label{case1}
% \unitlength 1.00mm
% \linethickness{0.4pt}
% \begin{picture}(64.00,40.00)
%   \put(9.00,5.00){\framebox(50.00,30.00)[cc]{}}
%   \put(9.00,36.00){\line(0,1){4.00}}
%   \put(9.00,38.00){\line(1,0){15.00}}
%   \put(34.00,38.00){\makebox(0,0)[cc]{\cs{xsize@nss}}}
%   \put(44.00,38.00){\line(1,0){15.00}}
%   \put(59.00,40.00){\line(0,-1){4.00}}
%   \put(0.00,35.00){\line(1,0){4.00}}
%   \put(2.00,35.00){\line(0,-1){10.00}}
%   \put(2.00,15.00){\line(0,-1){10.00}}
%   \put(0.00,5.00){\line(1,0){4.00}}
%   \put(2.00,20.00){\makebox(0,0)[cc]{%
%       $\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt\#1}}$}}
%   \put(9.00,35.00){\line(5,-3){50.00}}
%   \put(29.00,5.00){\line(0,1){18.00}}%
%   \put(9.00,0.00){\line(0,1){4.00}}
%   \put(29.00,0.00){\line(0,1){4.00}}
%   \put(19.00,2.00){\makebox(0,0)[cc]{%
%       $\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt\#2}}$}}
%   \put(60.00,35.00){\line(1,0){4.00}}
%   \put(60.00,23.00){\line(1,0){4.00}}
%   \put(62.00,35.00){\line(0,-1){2.00}}
%   \put(62.00,23.00){\line(0,1){2.00}}
%   \put(62.00,29.00){\makebox(0,0)[cc]{%
%       $\frac{\mbox{\tt\#2}\cdot\mbox{\cs{xsize@nss}}}
%       {\mbox{\tt\#1}}$}}
% \end{picture}
% \end{center}
% \ifnum\language=\languageNGerman%
% Der zweite Parameter \meta{Anzahl der F"alle} gibt die Anzahl der zu
% zeichnenden F"alle an; alle Unterstruktogramme der einzelnen F"alle
% erhalten die gleiche Breite. Der \meta{Text des 1. Falles} muss als
% Parameter des \cs{case}-Befehls angegeben werden, alle weiteren F"alle
% werden "uber den \cs{switch}-Befehl eingeleitet. Hinter dem Text folgen
% dann die Befehle f"ur das eigentliche Unterstruktogramm des jeweiligen
% Falles. Der letzte Fall wird mit \cs{caseend} abgeschlossen.  Ein
% Case-Sinnbild mit drei F"allen zeigt das folgende Beispiel.
% \else%
% The second parameter \meta{number of cases} specifies the number of
% cases, that have to be drawn.  All structured subbox charts of the
% certain cases get the same width.  The \meta{text of 1. case} has to be
% given as a parameter of the \cs{case} instruction. All other cases are
% introduced by the \cs{switch} instruction.  Behind the text the
% instructions for the proper structured subbox chart of certain case
% follow. The last case is finished by \cs{caseend}.  A mapping convention
% of case with three cases is shown in the following example.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% \begin{tExample}
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,30)
%     \case{4}{3}{Signum(x)}{-1}
%         \assign{$z \gets - \frac{1}{x}$}
%     \switch{0}
%         \assign{Ausgabe: Division durch 0}
%     \switch{1}
%         \assign{$z \gets \frac{1}{x}$}
%     \caseend
% \end{struktogramm}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% \begin{tExample}
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,30)
%     \case{4}{3}{Signum(x)}{-1}
%         \assign{$z \gets - \frac{1}{x}$}
%     \switch{0}
%         \assign{Output: Division by 0}
%     \switch{1}
%         \assign{$z \gets \frac{1}{x}$}
%     \caseend
% \end{struktogramm}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \ifnum\language=\languageNGerman%
% Der optionale Parameter \oarg{H"ohe} ist nur einzusetzen, wenn die Option
% "`|curves|"', "`|emlines2|"' oder "`|pict2e|"' gesetzt ist; ist das nicht
% der Fall, k"onnen die Struktogramme durcheinander kommen.  Die
% Erweiterung des \cs{switch}-Kommandos mit \oarg{H"ohe} f"uhrt zu einer
% anderen Bedeutung von \meta{Winkel}. Ist der Wert gerade, wird wie zuvor
% eine gerade Linie zur Aufteilung des zugrundeliegenden Rechtecks
% gezeichnet; ist der Wert hingegegen ungerade, wird der letzte Fall wie im
% folgenden gezeigt als Sonderfall gezeichnet.
% \else%
% The optional parameter \oarg{height} can be used if and only if one of
% the options ``curves'', ``emlines2'' or ``pict2e'', resp. is set; if this
% is not the case, the structured chart box may be scrumbled up.  The
% extension of the \cs{switch} instruction by \oarg{height} results in the
% following shape with a different gradient of a slanted line, which now is
% fixed by the height given by the optional parameter. If the value of the
% parameter \meta{angle} is even, a straight line is drawn as before. If
% the value is odd, the last case is drawn as a special case as showed
% below.
%\fi
% \begin{center}
% \label{case2}
% \unitlength 1.00mm
% \linethickness{0.4pt}
% \begin{picture}(69.00,30.00)
%   \put(9.00,5.00){\framebox(60.00,20.00)[cc]{}}
%   \put(9.00,26.00){\line(0,1){4.00}}
%   \put(9.00,28.00){\line(1,0){20.00}}
%   \put(39.00,28.00){\makebox(0,0)[cc]{\cs{xsize@nss}}}
%   \put(49.00,28.00){\line(1,0){20.00}}
%   \put(69.00,30.00){\line(0,-1){4.00}}
%   \put(0.00,25.00){\line(1,0){4.00}}
%   \put(2.00,25.00){\line(0,-1){5.00}}
%   \put(2.00,10.00){\line(0,-1){5.00}}
%   \put(0.00,5.00){\line(1,0){4.00}}
%   \put(2.00,15.00){\makebox(0,0)[cc]{%
%       \ifnum\language=\languageNGerman\meta{H"ohe}\else\meta{height}\fi}}
%   \put(29.00,5.00){\line(0,1){13.33}}
%   \put(9.00,25.00){\line(6,-2){60.00}}
%   \put(9.00,0.00){\line(0,1){4.00}}
%   \put(29.00,0.00){\line(0,1){4.00}}
%   \put(19.00,2.00){\makebox(0,0)[cc]{$\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt\#2}}$}}
%   \put(70.00,25.00){\line(1,0){4.00}}
%   \put(70.00,18.33){\line(1,0){4.00}}
%   \put(72.00,25.00){\line(0,-1){1.00}}
%   \put(72.00,18.33){\line(0,1){1.00}}
%   \put(72.00,21.66){\makebox(0,0)[cc]{%
%       $\frac{\mbox{\ifnum\language=\languageNGerman\meta{H"ohe}\else
%       \meta{height}\fi}}{\mbox{\tt\#2}}$}}
% \end{picture}
% \vspace{5mm}
% \begin{picture}(69.00,30.00)
%   \put(9.00,5.00){\framebox(60.00,20.00)[cc]{}}
%   \put(9.00,26.00){\line(0,1){4.00}}
%   \put(9.00,28.00){\line(1,0){20.00}}
%   \put(39.00,28.00){\makebox(0,0)[cc]{\cs{xsize@nss}}}
%   \put(49.00,28.00){\line(1,0){20.00}}
%   \put(69.00,30.00){\line(0,-1){4.00}}
%   \put(0.00,25.00){\line(1,0){4.00}}
%   \put(2.00,25.00){\line(0,-1){5.00}}
%   \put(2.00,10.00){\line(0,-1){5.00}}
%   \put(0.00,5.00){\line(1,0){4.00}}
%   \put(2.00,15.00){\makebox(0,0)[cc]{%
%       \ifnum\language=\languageNGerman\meta{H"ohe}\else\meta{height}\fi}}
%   \put(29.00,5.00){\line(0,1){10.00}}
%   \put(9.00,25.00){\line(4,-2){40.00}}
%   \put(49.00,5.00){\line(2,2){20.00}}
%   \put(9.00,0.00){\line(0,1){4.00}}
%   \put(29.00,0.00){\line(0,1){4.00}}
%   \put(19.00,2.00){\makebox(0,0)[cc]{%
%       $\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt\#2}}$}}
%   \put(70.00,25.00){\line(1,0){4.00}}
%   \put(70.00,15.00){\line(1,0){4.00}}
%   \put(72.00,25.00){\line(0,-1){2.00}}
%   \put(72.00,15.00){\line(0,1){2.00}}
%   \put(72.00,20.00){\makebox(0,0)[cc]{%
%       $\displaystyle\frac{\mbox{\ifnum\language=\languageNGerman%
%             \meta{H"ohe}\else\meta{height}\fi}}{\mbox{\tt\#2}-1}$}}
% \end{picture}
% \end{center}
%
% \ifnum\language=\languageNGerman%
% \begin{tExample}
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,30)
%     \case[10]{4}{3}{Signum(x)}{-1}
%         \assign{$z \gets - \frac{1}{x}$}
%     \switch{0}
%         \assign{Ausgabe: Division durch 0}
%     \switch{1}
%         \assign{$z \gets \frac{1}{x}$}
%     \caseend
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% \begin{tExample}
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,30)
%     \case[10]{4}{3}{Signum(x)}{-1}
%         \assign{$z \gets - \frac{1}{x}$}
%     \switch{0}
%         \assign{Output: Division by 0}
%     \switch{1}
%         \assign{$z \gets \frac{1}{x}$}
%     \caseend
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \ifnum\language=\languageNGerman%
% Ist der erste Parameter hingegen ungerade, wird ein Standardzweig
% gezeichnet; der Wert f"ur den Standardfall sollte dann rechtsb"undig
% ausgerichtet werden.
% \begin{tExample}
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,30)
%     \case[10]{5}{3}{Signum(x)}{-1}
%         \assign{$z \gets - \frac{1}{x}$}
%     \switch{1}
%         \assign{$z \gets \frac{1}{x}$}
%     \switch[r]{0}
%         \assign{Ausgabe: Division durch 0}
%     \caseend
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% But if the first parameter is odd, then a default branch is drawn; the
% value for the default branch should be set flushed right.
% \begin{tExample}
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,30)
%     \case[10]{5}{3}{Signum(x)}{-1}
%         \assign{$z \gets - \frac{1}{x}$}
%     \switch{1}
%         \assign{$z \gets \frac{1}{x}$}
%     \switch{0}
%         \assign{Output: Division by 0}
%     \caseend
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \changes{v-9.2}{10/01/18}{changed the selection of languages}
% \ifnum\language=\languageNGerman%
% Das folgende Beispiel zeigt, wie mittels einfacher Verzweigung aus einer
% Endlosschleife gesprungen werden kann. Das Beispiel l"asst sich ohne
% weiteres auf eine mehrfache Verzweigung "ubertragen.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \forever
%         \assign{lies Zeichen}
%         \ifthenelse{3}{3}{Zeichen = 'E'?}
%                          {j}{n}
%             \exit{Sprung hinter Schleife}
%         \change
%         \ifend
%         \assign{Gib Zeichen aus}
%     \foreverend
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% The following example shows, how one can exit a neverending loop by a simple
% branch. The example is transferable to a multiple branch without much effort.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \forever
%         \assign{read character}
%         \ifthenelse{3}{3}{character = 'E'}
%                          {y}{n}
%             \exit{Jump behind the Loop}
%         \change
%         \ifend
%         \assign{Put out Character}
%     \foreverend
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{tExample}
% \ifnum\language=\languageNGerman%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
%   \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \changes{v-9.2}{10/01/18}{corrected some typos}
% \changes{v-9.1}{10/01/17}{added first draft of of `inparallel, `task, and `inparallelend documentation}
% \DescribeMacro{\inparallel}
% \DescribeMacro{\task}
% \DescribeMacro{\inparallelend}
% \changes{v065}{10/06/07}{added some german translations}
% \ifnum\language=\languageNGerman%
% Heutzutage sind Prozessoren mit mehreren Kernen oder auch massive
% Parallelrechner ein "ubliches Werkzeug zur Ausf"uhrung von Programmen. Um
% die F"ahigkeiten dieser Prozessoren auszunutzen, sollten entsprechende
% parallele Algorithmen entwickelt und implementiert werden. Der Makro
% \cs{inparallel} und die zugeh"origen Makros \cs{task} und
% \cs{inparallelend} erm"oglichen die Darstellung paralleler Verarbeitung in
% einem Programm. Die Syntax lautet:
% \begin{quote}\obeylines
% \cs{inparallel}\oarg{H"ohe der 1. Task}\marg{Anzahl paralleler
% Tasks}\marg{Beschreibung der 1. Task}|}|
% \cs{task}\oarg{position}\marg{Beschreibung der 2. Task}
% \dots
% \cs{task}\oarg{position}\marg{Beschreibung der n. Task}
% \cs{inparallelend}
% \end{quote}
%
% Das Layout eines mit diesen Kommandos erzeugten Kastens ist der folgenden
% Abbildung zu entnehmen (die Makroparameter \texttt{\#1}
% und \texttt{\#2} beziehen sich auf die Parameter von \cs{inparallel}):
% \else%
% Nowadays multicore processors or even better massive parallel processors
% are a common tool for executing programs. To use the features of these
% processors parallel algorithms should be developed and implemented. The
% \cs{inparallel} command enables the representation of parallel processing
% in a program. The syntax is as follows:
% \begin{quote}\obeylines
% \cs{inparallel}\oarg{height of 1\(^{\mbox{st}}\) task}\marg{number of
% parallel tasks}\marg{description of 1\(^{\mbox{st}}\) task}|}|
% \cs{task}\oarg{position}\marg{description of 2\(^{\mbox{nd}}\) task}
% \dots
% \cs{task}\oarg{position}\marg{description of n\(^{\mbox{th}}\) task}
% \cs{inparallelend}
% \end{quote}
%
% The layout of the box is as follows (the macro parameters \texttt{\#1}
% and \texttt{\#2} refer to the parameters of \cs{inparallel}):%
% \fi%
%
% \changes{v065}{10/06/07}{changed figure which shows `inparallel layout}
% \begin{center}
% \label{case2}
% \unitlength 1.00mm
% \linethickness{0.4pt}
% \begin{picture}(90.00,40.00)
%   \put(9.00,5.00){\framebox(75.00,30.00)[cc]{}}
%   \put(9.00,36.00){\line(0,1){4.00}}
%   \put(9.00,38.00){\line(1,0){27.50}}
%   \put(46.50,38.00){\makebox(0,0)[cc]{\cs{xsize@nss}}}
%   \put(55.00,38.00){\line(1,0){27.50}}
%   \put(84.00,36.00){\line(0,1){4.00}}
%   \put(0.00,35.00){\line(1,0){4.00}}
%   \put(2.00,35.00){\line(0,-1){10.00}}
%   \put(2.00,15.00){\line(0,-1){10.00}}
%   \put(0.00,5.00){\line(1,0){4.00}}
%   \put(2.00,20.00){\makebox(0,0)[cc]{%
%       \shortstack{%
%         \ifnum\language=\languageNGerman\meta{H"ohe}\else\meta{height}\fi\\\texttt{\#1}}}}
%   \put(21.00,20.00){\makebox(0,0)[cc]{%
%       \shortstack{%
%           \ifnum\language=\languageNGerman\meta{Beschreibung\(_1\)}%
%           \else\meta{desc\(_1\)}\fi\\\texttt{\#2}}}}
%   \put(46.50,20.00){\makebox(0,0)[cc]{%
%       \ifnum\language=\languageNGerman\meta{Beschreibung\(_{\ldots}\)}\else\meta{desc\(_{\ldots}\)}\fi}}
%   \put(71.50,20.00){\makebox(0,0)[cc]{%
%       \ifnum\language=\languageNGerman\meta{Beschreibung\(_n\)}\else\meta{desc\(_n\)}\fi}}
%   \put(34.00,11.67){\line(0,1){16.66}} ^^A vertical bars between descriptions
%   \put(59.00,11.67){\line(0,1){16.66}}
%   \put(9.00,0.00){\line(0,1){4.00}}
%   \put(9.00,2.00){\line(1,0){2.00}}
%   \put(34.00,0.00){\line(0,1){4.00}}
%   \put(34.00,2.00){\line(-1,0){2.00}}
%   \put(21.00,2.00){\makebox(0,0)[cc]{$\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt\#1}}$}}
%   \multiput(10.00,28.33)(3.00, 0.0){25}{\line(1,0){1.5}}
%   \multiput(10.00,31.66)(3.00, 0.0){25}{\line(1,0){1.5}}
%   \multiput(10.00,11.67)(3.00, 0.0){25}{\line(1,0){1.5}}
%   \multiput(10.00,8.34)(3.00, 0.0){25}{\line(1,0){1.5}}
%   \put(86.00,35.00){\line(1,0){4.00}}  ^^A measuring at the right side
%   \put(86.00,28.33){\line(1,0){4.00}}
%   \put(88.00,34.00){\line(0,-1){1.00}}
%   \put(88.00,28.33){\line(0,1){1.00}}
%   \put(88.00,31.66){\makebox(0,0)[cc]{4\,mm}}
% \end{picture}
% \end{center}
%
% \ifnum\language=\languageNGerman%
% Zu beachten ist, dass die verschiedenen Tasks nicht weiter gegliedert
% werden d"urfen.
% \else%
% Note: the tasks are not allowed to get divided by \cs{assign} or so. If
% one needs some finer description of a task, this should be made outside
% of the current structured box chart.%
% \fi%
%
% \changes{v-9.2}{10/01/18}{added example for `inparallel}
% \begin{tExample}[\ifnum\language=\languageNGerman%
%   Anwendung von \cs{inparallel}\else Application of \cs{inparallel}\fi]
% \ifnum\language=\languageNGerman%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \inparallel[20]{3}{Motor starten}
%     \task{Wasser einf"ullen}
%     \task{Wasser erhitzen}
%     \inparallelend
% \end{struktogramm}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen ergeben das folgende Struktogramm:
% \else%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \inparallel[20]{3}{start motor}
%     \task{fill in water}
%     \task{heat water}
%     \inparallelend
% \end{struktogramm}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% These instructions produce the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \DescribeEnv{centernss}
% \label{centernss}
% \ifnum\language=\languageNGerman%
% Soll ein Struktogramm zentriert dargestellt werden, so wird dazu die
% Umgebung
% \else%
% If a structured box chart shall be represented centered, then the environment%
% \fi%
% \begin{quote}\obeylines
% \envb{centernss}
% ~~~~\meta{Struktogramm}
% \enve{centernss}
% \end{quote}
% \ifnum\language=\languageNGerman%
% benutzt:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{centernss}
% \begin{struktogramm}(90,35)
%     \ifthenelse{2}{4}
%             {Flag f"ur Drucker-Ausgabe gesetzt?}{\sTrue}{\sFalse}%
%         \assign[20]{Ausgabe auf Drucker umleiten}
%     \change
%         \assign{Ausgabe auf den Bildschirm}
%     \ifend
% \end{struktogramm}
% \end{centernss}
% \end{verbatimwrite}
% \else%
% is used:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{centernss}
% \begin{struktogramm}(90,35)
%     \ifthenelse{2}{4}
%             {Is Flag for Output on Printer set?}{\sTrue}{\sFalse}%
%         \assign[20]{Output on Printer diverted}
%     \change
%         \assign{Output on Screen}
%     \ifend
% \end{struktogramm}
% \end{centernss}
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Das f"uhrt zu folgendem:
% \else%
% This leads to the following:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \DescribeMacro{\CenterNssFile}
% \ifnum\language=\languageNGerman%
% H"aufig gibt es den Fall, dass Struktogramme in eigenen Dateien abgelegt
% werden, damit sie f"ur sich allein auf Korrektheit getestet werden
% k"onnen oder in anderen Zusammenh"angen genutzt werden k"onnen.
% Sollen sie zentriert eingebunden werden, kann nicht mit der folgenden
% Konstruktion gearbeitet werden:
% \else%
% In many cases structured box charts are recorded in particular files such, that
% they can be tested seperately, if they are correct, or that they can be used
% in other connections. If they should be included centeredly, then one can not
% use the following construction:%
% \fi%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{center}
%     \input{...}
% \end{center}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% da auf diese Weise der gesamte Text innerhalb des Struktogramms zentriert
% w"urde. Um diesen Fall einfach und korrekt abhandeln zu k"onnen, kann das
% Makro \cs{CenterNssFile} eingesetzt werden, das auch in der Schreibweise
% |centernssfile| definert ist. Voraussetzung ist, dass die Datei,
% die die Anweisungen f"ur das Struktogramm enth"alt, die
% Dateinamenserweiterung |.nss| hat, der Name der einzubindenden Datei
% \emph{muss} demzufolge ohne Erweiterung angegeben werden. Wenn die Datei
% |struktex-test-0.nss| das in Abschnitt~\ref{Beispiel}, Zeile 2--10 gezeigte
% Aussehen hat, so f"uhrt die Anweisung
% \else%
% since this way the whole text in structured box chart would be centered.
% To deal with this case in a simple and correct way the macro \cs{CenterNssFile}
% can be used. It is also defined in the style |centernssfile|. This requires, that the
% file containing the instructions for the structured box chart has the file name
% extension |.nss|. That is why the name of the file, that has to be tied in,
% \emph{must} be stated without extension. If the file |struktex-test-0.nss| has the shape
% shown in paragraph~\ref{example}, line 2--10 the instruction%
% \fi%
% \begin{quote}
% |\centernssfile{struktex-test-0}|
% \end{quote}
% \ifnum\language=\languageNGerman%
% zu folgendem Aussehen des formatierten Textes:
% \else%
% leads to the following shape of the formatted text:%
% \fi%
% \bgroup\catcode`\%=14\centernssfile{struktex-test-0}\egroup
%
% \DescribeMacro{\openstrukt}
% \DescribeMacro{\closestrukt}
% \ifnum\language=\languageNGerman%
% Diese beiden Makros sind nur der Kompatibilit"at zu vorherigen Versionen
% von \StrukTeX\ willen noch erhalten. Von der Bedeutung her entsprechen sie
% \cs{struktogramm} und \cs{endstruktogramm}. Die Syntax ist
% \else%
% These two macros are only preserved because of compatibility reasons with
% previous versions of \StrukTeX. Their meaning is the same as \cs{struktogramm}
% and \cs{endstruktogramm}. The syntax is%
% \fi%
% \begin{quote}
% \cs{openstrukt}\marg{\ifnum\language=\languageNGerman Breite \else width \fi}\marg{\ifnum\language=\languageNGerman H"ohe \else height \fi}
% \end{quote}
% \ifnum\language=\languageNGerman%
% und
% \else%
% and%
% \fi%
% \begin{quote}
% \cs{closestrukt}.
% \end{quote}
%
%
% \DescribeMacro{\assert}%
% \ifnum\language=\languageNGerman%
% Der Makro \cs{assert} wurde eingef"uhrt, um die Verifikation von
% Algorithmen zu unterst"utzen, er ist aber nur aktiv, wenn die Stil-Option
% |verification| gesetzt wurde. Er dient dazu, an ausgew"ahlten Stellen
% Zusicherungen "uber den Zustand von Variablen zu markieren, die Syntax
% entspricht dem \cs{assign}:
% \begin{quote}
%     \cs{assert}\oarg{H"ohe}\marg{Zusicherung},
% \end{quote}
% Sein Einsatz ergibt sich aus dem folgenden:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(70,20)[Zusicherungen in Struktogrammen]
%     \assign{\(a\gets a^2\)}
%     \assert{\(a\ge0\)}
% \end{struktogramm}
% \end{verbatimwrite}
% \begin{quote}
%     \verbatiminput{struktex.tmp}
% \end{quote}
% Das dazugeh"orige Struktogramm sieht folgenderma"sen aus:
% \begin{quote}
%     \input{struktex.tmp}
% \end{quote}%
% \else%
% The macro \cs{assert}  was introduced to support the verification of
% algorithms. It is active only if the option |verification| is set. It
% serves the purpose to assert the value of a variable at one point of the
% algorithm. The syntax corresponds to the syntax of \cs{assign}:
% \begin{quote}
%     \cs{assert}\oarg{height}\marg{assertion},
% \end{quote}
% It's usage can be seen from the following:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(70,20)[Assertions in structured box charts]
%     \assign{\(a\gets a^2\)}
%     \assert{\(a\ge0\)}
% \end{struktogramm}
% \sProofOff
% \end{verbatimwrite}
% \begin{quote}
%     \verbatiminput{struktex.tmp}
% \end{quote}
% The resulting structured box chart looks like
% \begin{quote}
%     \input{struktex.tmp}
% \end{quote}%
% \fi
%
%
% \section{\ifnum\language=\languageNGerman Beipieldatei zum Einbinden in die Dokumentation
%             \else Example file for including into the documentation
%             \fi}
% \label{Beispiel}
% \label{example}
%
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen bilden eine Beispieldatei, die bei der Erstellung
% dieser Dokumentation ben"otigt wird.
% \else%
% The following lines build up an example file, which is needed for the
% preparation of this documentation; there is only an german version.%
% \fi%
%    \begin{macrocode}
%<*example1>
\begin{struktogramm}(95,40)[Text]
    \case[10]{3}{3}{Signum(x)}{-1}
         \assign{\(z \gets - \frac{1}{x}\)}
    \switch{0}
         \assign{Ausgabe: Division durch 0}
    \switch[r]{1}
         \assign{\(z \gets \frac{1}{x}\)} \caseend
\end{struktogramm}
%</example1>
%    \end{macrocode}
%
% \section{\ifnum\language=\languageNGerman%
%     Verschiedene Beispieldateien
% \else%
%     Some example files
% \fi}
%
% \subsection[\ifnum\language=\languageNGerman Beispieldatei Nr. 1\else example
% file no 1\fi]{\ifnum\language=\languageNGerman%
%     Beispieldatei zum Austesten der Makros des \StrukTeXSty{} ohne die
%     Benutzung optionaler Pakete
% \else%
%     Example file for testing purposes of the macros of \StrukTeXSty{}
%     without any optional packages
% \fi}
%
% \changes{v-4.1c}{95/07/24}{Eigene Datei zum Austesten der Makros integriert}
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen bilden eine Musterdatei, die zum Austesten
% der Makros benutzt werden kann. Der Inhalt ist nur in Englisch
% vorhanden.
% \else%
% The following lines build up a model file, that can be used for testing
% the macros.%
% \fi%
%    \begin{macrocode}
%<*example2>
\documentclass[draft]{article}
\usepackage{struktex}

\begin{document}

\begin{struktogramm}(90,137)
    \assign%
    {
      \begin{declaration}[]
          \description{\(a, b, c\)}{three variables which are to be sorted}
          \description{\(tmp\)}{temporary variable for the circular swap}
      \end{declaration}
    }
    \ifthenelse{1}{2}{\(a\le c\)}{j}{n}
    \change
    \assign{\(tmp\gets a\)}
    \assign{\(a\gets c\)}
    \assign{\(c\gets tmp\)}
    \ifend
    \ifthenelse{2}{1}{\(a\le b\)}{j}{n}
    \ifthenelse{1}{1}{\(b\le c\)}{j}{n}
    \change
    \assign{\(tmp\gets c\)}
    \assign{\(c\gets b\)}
    \assign{\(b\gets tmp\)}
    \ifend
    \change
    \assign{\(tmp\gets a\)}
    \assign{\(a\gets b\)}
    \assign{\(b\gets tmp\)}
    \ifend
\end{struktogramm}

\end{document}
%</example2>
%    \end{macrocode}
%
%
% \subsection[\ifnum\language=\languageNGerman Beispieldatei Nr. 2\else example
% file no 2\fi]{\ifnum\language=\languageNGerman%
%     Beispieldatei zum Austesten der Makros des \StrukTeXSty{} mit dem Paket
%     \textsf{pict2e.sty}
% \else%
%     Example file for testing purposes of the macros of \StrukTeXSty{}
%     with the package \textsf{pict2e.sty}
% \fi}
%%
% \changes{v-4.1c}{95/07/24}{Eigene Datei zum Austesten der Makros integriert}
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen bilden eine Musterdatei, die zum Austesten
% der Makros benutzt werden kann. Der Inhalt ist nur in Englisch
% vorhanden.
% \else%
% The following lines build up a template file, that can be used for testing
% the macros.%
% \fi%
%    \begin{macrocode}
%<*example3>
\documentclass{article}
\usepackage[pict2e, verification]{struktex}

\begin{document}
\def\StruktBoxHeight{7}
%\sProofOn{}
\begin{struktogramm}(90,137)
    \assign%
    {
      \begin{declaration}[]
          \description{\(a, b, c\)}{three variables which are to be sorted}
          \description{\(tmp\)}{temporary variable for the circular swap}
      \end{declaration}
    }
    \assert[\StruktBoxHeight]{\sTrue}
    \ifthenelse[\StruktBoxHeight]{1}{2}{\(a\le c\)}{j}{n}
        \assert[\StruktBoxHeight]{\(a\le c\)}
    \change
        \assert[\StruktBoxHeight]{\(a>c\)}
        \assign[\StruktBoxHeight]{\(tmp\gets a\)}
        \assign[\StruktBoxHeight]{\(a\gets c\)}
        \assign[\StruktBoxHeight]{\(c\gets tmp\)}
        \assert[\StruktBoxHeight]{\(a<c\)}
    \ifend
    \assert[\StruktBoxHeight]{\(a\le c\)}
    \ifthenelse[\StruktBoxHeight]{2}{1}{\(a\le b\)}{j}{n}
        \assert[\StruktBoxHeight]{\(a\le b \wedge a\le c\)}
        \ifthenelse[\StruktBoxHeight]{1}{1}{\(b\le c\)}{j}{n}
            \assert[\StruktBoxHeight]{\(a\le b \le c\)}
        \change
            \assert[\StruktBoxHeight]{\(a \le  c<b\)}
            \assign[\StruktBoxHeight]{\(tmp\gets c\)}
            \assign[\StruktBoxHeight]{\(c\gets b\)}
            \assign[\StruktBoxHeight]{\(b\gets tmp\)}
            \assert[\StruktBoxHeight]{\(a\le b<c\)}
        \ifend
    \change
        \assert[\StruktBoxHeight]{\(b < a\le c\)}
        \assign[\StruktBoxHeight]{\(tmp\gets a\)}
        \assign[\StruktBoxHeight]{\(a\gets b\)}
        \assign[\StruktBoxHeight]{\(b\gets tmp\)}
        \assert[\StruktBoxHeight]{\(a<b\le c\)}
    \ifend
    \assert[\StruktBoxHeight]{\(a\le b \le c\)}
\end{struktogramm}

\end{document}
%</example3>
%    \end{macrocode}
%
% \subsection[\ifnum\language=\languageNGerman Beispieldatei Nr. 3\else example
% file no 3\fi]{\ifnum\language=\languageNGerman%
%     Beispieldatei zum Austesten der Makros des \textsf{struktxp.sty}
% \else%
%     Example file for testing the macros of \textsf{struktxp.sty}
% \fi}
%
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen bilden eine Musterdatei, die zum Austesten
% der Makros des \textsf{struktxp.sty} benutzt werden kann. Zum Testen
% sollten auch die Kommentarzeichen vor der Zeile
% |\usepackage[T1]{fontenc}| gel"oscht werden. Der Text ist nur in Englisch
% vorgegeben.
% \else%
% The following lines build a sample file, which can be used for testing
% the macros of \textsf{struktxp.sty}. For testing one should delete the
% comment characters before the line |\usepackage[T1]{fontenc}|.%
% \fi%
% \changes{v121}{10/08/31}{added babel package to the test of struktxp}
%    \begin{macrocode}
%<*example4>
\documentclass[english]{article}

\usepackage{babel}
\usepackage{struktex}

\nofiles

\begin{document}

\pLanguage{Pascal}
\section*{Default values (Pascal):}

{\obeylines
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{After changing the boolean values with}
\verb-\pBoolValue{yes}{no}-:

{\obeylines
\pBoolValue{yes}{no}
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\itshape}{\sffamily\bfseries}{}-:

{\obeylines
\pFonts{\itshape}{\sffamily\bfseries}{}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}-:

{\obeylines
\pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\itshape}{\bfseries\itshape}{}-:

{\obeylines
\pFonts{\itshape}{\bfseries\itshape}{}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse

\vspace{15pt}
Without \textit{italic correction}:
    M \pVar{M} M \pKey{M} M. \pVar{M}. M. \pKey{M}. M.
}

\pLanguage{C}
\pBoolValue{\texttt{WAHR}}{\texttt{FALSCH}}
\section*{Default values (C):}

{\obeylines
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{After changing the boolean values with}
\verb-\pBoolValue{\texttt{yes}}{\texttt{no}}-:

{\obeylines
\pBoolValue{\texttt{yes}}{\texttt{no}}
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\itshape}{\sffamily\bfseries}{}-:

{\obeylines
\pFonts{\itshape}{\sffamily\bfseries}{}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}-:

{\obeylines
\pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\itshape}{\bfseries\itshape}{}-:

{\obeylines
\pFonts{\itshape}{\bfseries\itshape}{}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse

\vspace{15pt}
Without \textit{italic correction}:
    M \pVar{M} M \pKey{M} M. \pVar{M}. M. \pKey{M}. M.
}

\pLanguage{Java}
\pBoolValue{\texttt{WAHR}}{\texttt{FALSCH}}
\section*{Default values (Java):}

{\obeylines
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{After changing the boolean values with}
\verb-\pBoolValue{\texttt{yes}}{\texttt{no}}-:

{\obeylines
\pBoolValue{\texttt{yes}}{\texttt{no}}
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\itshape}{\sffamily\bfseries}{}-:

{\obeylines
\pFonts{\itshape}{\sffamily\bfseries}{}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}-:

{\obeylines
\pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\itshape}{\bfseries\itshape}{}-:

{\obeylines
\pFonts{\itshape}{\bfseries\itshape}{}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse

\vspace{15pt}
Without \textit{italic correction}:
    M \pVar{M} M \pKey{M} M. \pVar{M}. M. \pKey{M}. M.
}

\pLanguage{Python}
\pBoolValue{\texttt{WAHR}}{\texttt{FALSCH}}
\section*{Default values (Python):}

{\obeylines
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{After changing the boolean values with}
\verb-\pBoolValue{\texttt{yes}}{\texttt{no}}-:

{\obeylines
\pBoolValue{\texttt{yes}}{\texttt{no}}
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\itshape}{\sffamily\bfseries}{}-:

{\obeylines
\pFonts{\itshape}{\sffamily\bfseries}{}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}-:

{\obeylines
\pFonts{\ttfamily}{\ttfamily\bfseries}{\ttfamily\slshape}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse
}

\paragraph{after changing the fonts with}
\verb-\pFonts{\itshape}{\bfseries\itshape}{}-:

{\obeylines
\pFonts{\itshape}{\bfseries\itshape}{}
Variables: \pVar{iV_g}, \sVar{zV^}, \pVariable{&i}
Keywords: \pKeyword{begin}, \pKey{while}, \sKey{__CPP__}
in math mode: \(\pVar{a}+\pVar{iV_g}\)
boolean values: \sTrue, \sFalse, \pTrue, \pFalse

\vspace{15pt}
Without \textit{italic correction}:
    M \pVar{M} M \pKey{M} M. \pVar{M}. M. \pKey{M}. M.
}

\end{document}
%%
%% End of file `struktex-test-2.tex'.
%</example4>
%    \end{macrocode}
%
%
% \subsection[\ifnum\language=\languageNGerman Beispieldatei Nr. 4\else Example
% file no 4\fi]{\ifnum\language=\languageNGerman%
%     Beispieldatei zum Austesten der Makros des \textsf{struktxp.sty}
% \else%
%     Example file for testing the macros of \textsf{struktxp.sty}
% \fi}
%
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen werden in einem anderen Zusammenhang benutzt,
% Java-Methoden zu dokumentieren. An dieser Stelle wird ein eigener Weg
% gew"ahlt, da das sonst "ubliche Arbeiten mit |lstinline| zu Fehlern f"uhrt.
% \else%
% \fi
%    \begin{macrocode}
%<*example5>
\documentclass{article}

\usepackage{struktxp,struktxf}

\makeatletter
\newlength{\fdesc@len}
\newcommand{\fdesc@label}[1]%
{%
    \settowidth{\fdesc@len}{{\fdesc@font #1}}%
    \advance\hsize by -2em
    \ifdim\fdesc@len>\hsize%               % term > labelwidth
        \parbox[b]{\hsize}%
        {%
            \fdesc@font #1%
        }\\%
    \else%                                      % term < labelwidth
    \ifdim\fdesc@len>\labelwidth%               % term > labelwidth
        \parbox[b]{\labelwidth}%
        {%
            \makebox[0pt][l]{{\fdesc@font #1}}\\%
        }%
    \else%                                      % term < labelwidth
        {\fdesc@font #1}%
    \fi\fi%
    \hfil\relax%
}
\newenvironment{fdescription}[1][\tt]%
{%
    \def\fdesc@font{#1}
    \begin{quote}%
    \begin{list}{}%
    {%
        \renewcommand{\makelabel}{\fdesc@label}%
        \setlength{\labelwidth}{120pt}%
        \setlength{\leftmargin}{\labelwidth}%
        \addtolength{\leftmargin}{\labelsep}%
    }%
}%
{%
    \end{list}%
    \end{quote}%
}
\makeatother

\pLanguage{Java}

\begin{document}

\begin{fdescription}
 \item[\index{Methoden>drawImage(Image img,
                                    int dx1,
                                    int dy1,
                                    int dx2,
                                    int dy2,
                                    int sx1,
                                    int sy1,
                                    int sx2,
                                    int sy2,
                                    ImageObserver observer)=%
       \Expr{\pKey{public} \pKey{abstract} \pKey{boolean} drawImage(Image img,
                                    \pKey{int} dx1,
                                    \pKey{int} dy1,
                                    \pKey{int} dx2,
                                    \pKey{int} dy2,
                                    \pKey{int} sx1,
                                    \pKey{int} sy1,
                                    \pKey{int} sx2,
                                    \pKey{int} sy2,
                                    ImageObserver observer)}}%
       \pExp{public abstract boolean drawImage(Image img, int dx1, int
         dy1, int dx1, int dy2, int sx1, int sy1, int sx2, int sy2,
         ImageObserver observer)}]%
 \ldots
\end{fdescription}
\end{document}
%%
%% End of file `struktex-test-5.tex'.
%</example5>
%    \end{macrocode}
%
% \section{\ifnum\language=\languageNGerman%
%     Makros zur Erstellung der Dokumentation des \StrukTeXSty
% \else%
%     Macros for generating the documentation of the \StrukTeXSty
% \fi}
%
% \ifnum\language=\languageNGerman%
% Um die Formatierung der Dokumentation ein wenig zu erleichtern, werden ein
% paar Makros benutzt, die in einer eigenen \textsf{.sty}-Datei
% zusammengefasst wurden. Ein wesentlicher Teil beruht auf einer
% Modifikation der \texttt{newtheorem}-Umgebung aus \textsf{latex.sty} zur
% Auszeichnung der Beispiele, die Implementation der Abk"urzungen wurde in
% \cite{Neubauer:MikrotypographieI} vorgeschlagen.
% \else%
% To simplify the formatting of the documentation some macros are used,
% which are collected in a particular \textsf{.sty} file. An essential part
% is based on a modification of the \texttt{newtheorem} environment out of
% \textsf{latex.sty} for distinguishing examples. The implementation of
% abbreviations has been proposed in \cite{Neubauer:MikrotypographieI}.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Dazu wurden aus dem \textsf{verbatim.sty} einige Kommandos "ubernommen
% und modifiziert, damit das Schreiben und Lesen von Dateien im
% |verbatim|-Modus auch im Zusammenhang mit dem |docstrip|-Paket
% funktioniert. Schlie"slich wurde auch noch eine Idee von Tobias Oetiker
% aus seinem \textsf{layout.sty}, der im Zusammenhang mit
% \foreign{lshort2e.tex - The not so short introduction to LaTeX2e}
% entstand, zum parallelen Setzen von Quelle und formatiertem Text genutzt.
% \else%
% Therefore some instructions of \textsf{verbatim.sty} have been adopted and
% modified, so that writing and reading by the |docstrip| package works.
% Finally an idea of Tobias Oetiker out of \textsf{layout.sty} also has
% been used, which has been developed in connection with "|lshort2e.tex| --
% The not so short introduction to LaTeX2e".%
% \fi%
% \changes{v-8.0e}{05/05/17}{nun wird die .pdf-Ausgabe sauber abgefangen}
%    \begin{macrocode}
%<*strukdoc>
\RequirePackage{ifpdf}
\newif\ifcolor \IfFileExists{color.sty}{\colortrue}{}
\ifpdf \RequirePackage[colorlinks]{hyperref}\else
    \def\href#1{\texttt}\fi
\ifcolor \RequirePackage{color}\fi
\RequirePackage{nameref}
\RequirePackage{url}
\renewcommand\ref{\protect\T@ref}
\renewcommand\pageref{\protect\T@pageref}
\@ifundefined{zB}{}{\endinput}
\providecommand\pparg[2]{%
  {\ttfamily(}\meta{#1},\meta{#2}{\ttfamily)}}
\providecommand\envb[1]{%
  {\ttfamily\char`\\begin\char`\{#1\char`\}}}
\providecommand\enve[1]{%
  {\ttfamily\char`\\end\char`\{#1\char`\}}}
\newcommand{\zBspace}{z.\,B.}
\let\zB=\zBspace
\newcommand{\dhspace}{d.\,h.}
\let\dh=\dhspace
\let\foreign=\textit
\newcommand\Abb[1]{Abbildung~\ref{#1}}
\def\newexample#1{%
  \@ifnextchar[{\@oexmpl{#1}}{\@nexmpl{#1}}}
\def\@nexmpl#1#2{%
  \@ifnextchar[{\@xnexmpl{#1}{#2}}{\@ynexmpl{#1}{#2}}}
\def\@xnexmpl#1#2[#3]{%
  \expandafter\@ifdefinable\csname #1\endcsname
    {\@definecounter{#1}\@newctr{#1}[#3]%
     \expandafter\xdef\csname the#1\endcsname{%
       \expandafter\noexpand\csname the#3\endcsname \@exmplcountersep
          \@exmplcounter{#1}}%
     \global\@namedef{#1}{\@exmpl{#1}{#2}}%
     \global\@namedef{end#1}{\@endexample}}}
\def\@ynexmpl#1#2{%
  \expandafter\@ifdefinable\csname #1\endcsname
    {\@definecounter{#1}%
     \expandafter\xdef\csname the#1\endcsname{\@exmplcounter{#1}}%
     \global\@namedef{#1}{\@exmpl{#1}{#2}}%
     \global\@namedef{end#1}{\@endexample}}}
\def\@oexmpl#1[#2]#3{%
  \@ifundefined{c@#2}{\@nocounterr{#2}}%
    {\expandafter\@ifdefinable\csname #1\endcsname
    {\global\@namedef{the#1}{\@nameuse{the#2}}%
  \global\@namedef{#1}{\@exmpl{#2}{#3}}%
  \global\@namedef{end#1}{\@endexample}}}}
\def\@exmpl#1#2{%
  \refstepcounter{#1}%
  \@ifnextchar[{\@yexmpl{#1}{#2}}{\@xexmpl{#1}{#2}}}
\def\@xexmpl#1#2{%
  \@beginexample{#2}{\csname the#1\endcsname}\ignorespaces}
\def\@yexmpl#1#2[#3]{%
  \@opargbeginexample{#2}{\csname the#1\endcsname}{#3}\ignorespaces}
\def\@exmplcounter#1{\noexpand\arabic{#1}}
\def\@exmplcountersep{.}
\def\@beginexample#1#2{%
    \@nobreaktrue\list{}{\setlength{\rightmargin}{\leftmargin}}%
    \item[{\bfseries #1\ #2}]\mbox{}\\\sf}
\def\@opargbeginexample#1#2#3{%
    \@nobreaktrue\list{}{\setlength{\rightmargin}{\leftmargin}}%
    \item[{\bfseries #1\ #2}\ (#3)]\mbox{}\\\sf}
\def\@endexample{\endlist}

\newexample{tExample}{\ifnum\language=\languageNGerman Beispiel\else Example\fi}

\newwrite\struktex@out
\newenvironment{example}%
 {\begingroup% Lets keep the changes local
  \@bsphack
  \immediate\openout \struktex@out \jobname.tmp
  \let\do\@makeother\dospecials\catcode`\^^M\active
  \def\verbatim@processline{%
    \immediate\write\struktex@out{\the\verbatim@line}}%
  \verbatim@start}%
 {\immediate\closeout\struktex@out\@esphack\endgroup%
%
% And here comes the part of Tobias Oetiker
%
  \par\small\addvspace{3ex plus 1ex}\vskip -\parskip
  \noindent
  \makebox[0.45\linewidth][l]{%
  \begin{minipage}[t]{0.45\linewidth}
    \vspace*{-2ex}
    \setlength{\parindent}{0pt}
    \setlength{\parskip}{1ex plus 0.4ex minus 0.2ex}
    \begin{trivlist}
      \item\input{\jobname.tmp}
    \end{trivlist}
  \end{minipage}}%
  \hfill%
  \makebox[0.5\linewidth][l]{%
  \begin{minipage}[t]{0.50\linewidth}
    \vspace*{-1ex}
    \verbatiminput{\jobname.tmp}
  \end{minipage}}
  \par\addvspace{3ex plus 1ex}\vskip -\parskip
}

\newtoks\verbatim@line
\def\verbatim@startline{\verbatim@line{}}
\def\verbatim@addtoline#1{%
  \verbatim@line\expandafter{\the\verbatim@line#1}}
\def\verbatim@processline{\the\verbatim@line\par}
\def\verbatim@finish{\ifcat$\the\verbatim@line$\else
  \verbatim@processline\fi}

\def\verbatimwrite#1{%
  \@bsphack
  \immediate\openout \struktex@out #1
  \let\do\@makeother\dospecials
  \catcode`\^^M\active \catcode`\^^I=12
  \def\verbatim@processline{%
    \immediate\write\struktex@out
      {\the\verbatim@line}}%
  \verbatim@start}
\def\endverbatimwrite{%
  \immediate\closeout\struktex@out
  \@esphack}

\@ifundefined{vrb@catcodes}%
  {\def\vrb@catcodes{%
     \catcode`\!12\catcode`\[12\catcode`\]12}}{}
\begingroup
 \vrb@catcodes
 \lccode`\!=`\\ \lccode`\[=`\{ \lccode`\]=`\}
 \catcode`\~=\active \lccode`\~=`\^^M
 \lccode`\C=`\C
 \lowercase{\endgroup
    \def\verbatim@start#1{%
      \verbatim@startline
      \if\noexpand#1\noexpand~%
        \let\next\verbatim@
      \else \def\next{\verbatim@#1}\fi
      \next}%
    \def\verbatim@#1~{\verbatim@@#1!end\@nil}%
    \def\verbatim@@#1!end{%
       \verbatim@addtoline{#1}%
       \futurelet\next\verbatim@@@}%
    \def\verbatim@@@#1\@nil{%
       \ifx\next\@nil
         \verbatim@processline
         \verbatim@startline
         \let\next\verbatim@
       \else
         \def\@tempa##1!end\@nil{##1}%
         \@temptokena{!end}%
         \def\next{\expandafter\verbatim@test\@tempa#1\@nil~}%
       \fi \next}%
    \def\verbatim@test#1{%
           \let\next\verbatim@test
           \if\noexpand#1\noexpand~%
             \expandafter\verbatim@addtoline
               \expandafter{\the\@temptokena}%
             \verbatim@processline
             \verbatim@startline
             \let\next\verbatim@
           \else \if\noexpand#1
             \@temptokena\expandafter{\the\@temptokena#1}%
           \else \if\noexpand#1\noexpand[%
             \let\@tempc\@empty
             \let\next\verbatim@testend
           \else
             \expandafter\verbatim@addtoline
               \expandafter{\the\@temptokena}%
             \def\next{\verbatim@#1}%
           \fi\fi\fi
           \next}%
    \def\verbatim@testend#1{%
         \if\noexpand#1\noexpand~%
           \expandafter\verbatim@addtoline
             \expandafter{\the\@temptokena[}%
           \expandafter\verbatim@addtoline
             \expandafter{\@tempc}%
           \verbatim@processline
           \verbatim@startline
           \let\next\verbatim@
         \else\if\noexpand#1\noexpand]%
           \let\next\verbatim@@testend
         \else\if\noexpand#1\noexpand!%
           \expandafter\verbatim@addtoline
             \expandafter{\the\@temptokena[}%
           \expandafter\verbatim@addtoline
             \expandafter{\@tempc}%
           \def\next{\verbatim@!}%
         \else \expandafter\def\expandafter\@tempc\expandafter
           {\@tempc#1}\fi\fi\fi
         \next}%
    \def\verbatim@@testend{%
       \ifx\@tempc\@currenvir
         \verbatim@finish
         \edef\next{\noexpand\end{\@currenvir}%
                    \noexpand\verbatim@rescan{\@currenvir}}%
       \else
         \expandafter\verbatim@addtoline
           \expandafter{\the\@temptokena[}%
           \expandafter\verbatim@addtoline
             \expandafter{\@tempc]}%
         \let\next\verbatim@
       \fi
       \next}%
    \def\verbatim@rescan#1#2~{\if\noexpand~\noexpand#2~\else
        \@warning{Characters dropped after `\string\end{#1}'}\fi}}

\newread\verbatim@in@stream
\def\verbatim@readfile#1{%
  \verbatim@startline
  \openin\verbatim@in@stream #1\relax
  \ifeof\verbatim@in@stream
    \typeout{No file #1.}%
  \else
    \@addtofilelist{#1}%
    \ProvidesFile{#1}[(verbatim)]%
    \expandafter\endlinechar\expandafter\m@ne
    \expandafter\verbatim@read@file
    \expandafter\endlinechar\the\endlinechar\relax
    \closein\verbatim@in@stream
  \fi
  \verbatim@finish
}
\def\verbatim@read@file{%
  \read\verbatim@in@stream to\next
  \ifeof\verbatim@in@stream
  \else
    \expandafter\verbatim@addtoline\expandafter{\expandafter\check@percent\next}%
    \verbatim@processline
    \verbatim@startline
    \expandafter\verbatim@read@file
  \fi
}
\def\verbatiminput{\begingroup\MacroFont
  \@ifstar{\verbatim@input\relax}%
          {\verbatim@input{\frenchspacing\@vobeyspaces}}}
\def\verbatim@input#1#2{%
   \IfFileExists {#2}{\@verbatim #1\relax
    \verbatim@readfile{\@filef@und}\endtrivlist\endgroup\@doendpe}%
   {\typeout {No file #2.}\endgroup}}
%</strukdoc>
%    \end{macrocode}
%
%
% \section[Makefile]{\ifnum\language=\languageNGerman%
%   Makefile zur automatisierten Erstellung der Dokumentation und der Tests
%   des \StrukTeXSty
% \else%
%   Makefile for the automized generation of the documentation and the tests
%   of the \StrukTeXSty
% \fi}
% \label{sec:Makefile}
% \changes{v2.1b}{17/06/17}{added tds-zip as new target}
% \changes{v2.1b}{17/06/17}{changed basic formatting engine to pdflatex}
% \changes{v2.1a}{17/06/11}{Makefile now reflects git git aware}
% \changes{v101}{10/06/25}{changed Makefile according to subversion
% revision numbers}
% \changes{v061}{10/05/31}{corrected some more typos}
% \changes{v056}{10/01/21}{corrected Makefile once more}
% \changes{v-9.2}{10/01/18}{corrected the Makefile}
% \changes{v-8.0e}{05/05/17}{Tippfehler korrigiert: \$\$\$f $\rightarrow$ \$\$f}
% \changes{v-8.0e}{05/05/17}{\& mit Fluchtzeichen versehen}
% \changes{v-8.0b}{04/07/14}{.pdf-Ausgabe eingef"uhrt}
% \changes{v-8.2a}{06/01/19}{HOMETEXMF $\rightarrow$ TEXMFHOME}
%
% \ifnum\language=\languageNGerman%
% Der Umgang mit \textsf{.dtx}-Paketen ist wesentlich einfacher, wenn ein
% Werkzeug f"ur die Automatisierung der wesentlichen Schritte vorliegt. F"ur
% Unix/Linux basierte Systeme ist das mit |make| und einem geeigneten
% |Makefile| einfach zu realisieren. Hier wird der |Makefile| in die
% Dokumentation integriert, die spezielle Syntax mit Tabulatorzeichen wird
% durch ein Hilfsprogramm erzeugt, das weiter unten angegeben ist. Auf die
% Benutzung des |Makefile| wird hier nicht weiter eingegangen, da der
% erfahrene Benutzer des Werkzeugs diese aus der Datei selbst entnehmen kann.
% \else%
% \fi
%
%    \begin{macrocode}
%<*makefile>
#-----------------------------------------------------------------------
# Purpose: generation of the documentation of the struktex package
# Notice:  this file can be used only with dmake and the option "-B";
#          this option lets dmake interpret the leading spaces as
#          distinguishing characters for commands in the make rules.
#
# Rules:
#          - all-de:     generate all the files and the (basic) german
#                        documentation
#          - all-en:     generate all the files and the (basic) english
#                        documentation
#          - test:       format the examples
#          - history:    generate the documentation with revision
#                        history
#          - develop-de: generate the german documentation with revision
#                        history and source code
#          - develop-en: generate the english documentation with
#                        revision history and source code
#          - realclean
#          - clean
#          - clean-example
#
# Author:  Jobst Hoffmann, Fachhochschule Aachen, Standort Juelich
# Date:    2017/06/06
#-----------------------------------------------------------------------

# The texmf-directory, where to install new stuff (see texmf.cnf)
# If you don't know what to do, search for directory texmf at /usr.
# With teTeX and linux often one of following is used:
#INSTALLTEXMF=/usr/TeX/texmf
#INSTALLTEXMF=/usr/local/TeX/texmf
#INSTALLTEXMF=/usr/share/texmf
#INSTALLTEXMF=/usr/local/share/texmf
# user tree:
#INSTALLTEXMF=$(HOME)/texmf
# Try to use user's tree known by kpsewhich:
INSTALLTEXMF=`kpsewhich --expand-var '$$TEXMFHOME'`
# Try to use the local tree known by kpsewhich:
#INSTALLTEXMF=`kpsewhich --expand-var '$$TEXMFLOCAL'`
# But you may set INSTALLTEXMF to every directory you want.
# Use following, if you only want to test the installation:
#INSTALLTEXMF=/tmp/texmf

# If texhash must run after installation, you can invoke this:
TEXHASH=texhash

######### Edit following only, if you want to change defaults!

# The directory, where to install *.cls and *.sty
CLSDIR=$(INSTALLTEXMF)/tex/latex/$(PACKAGE)

# The directory, where to install documentation
DOCDIR=$(INSTALLTEXMF)/doc/latex/$(PACKAGE)

# The directory, where to install the sources
SRCDIR=$(INSTALLTEXMF)/source/latex/$(PACKAGE)

# The directory, where to install demo-files
# If we have some, we have to add following 2 lines to install rule:
#     $(MKDIR) $(DEMODIR); \
#     $(INSTALL) $(DEMO_FILES) $(DEMODIR); \
DEMODIR=$(DOCDIR)/demo

# We need this, because the documentation needs the classes and packages
# It's not really a good solution, but it's a working solution.
TEXINPUTS := $(PWD):$(TEXINPUTS)

########################################################################
#   End of customization section
########################################################################

LATEX = latex
PDFLATEX = pdflatex
TEX = TEX

COMMON_OPTIONS = # \OnlyDescription\CodelineNumbered\PageIndex
HISTORY_OPTIONS = \RecordChanges
DEVELOPER_OPTIONS = \EnableCrossrefs\RecordChanges\AlsoImplementation\CodelineIndex

# tarring options
EXgit = --exclude .git --exclude .gitignore --exclude auto --exclude tests \
 --exclude *.tgz --exclude *.bib

# The name of the game
PACKAGE = struktex

DISTRIBUTION_FILES = ../$(PACKAGE)/$(PACKAGE).de.pdf \
../$(PACKAGE)/$(PACKAGE).en.pdf \
 ../$(PACKAGE)/$(PACKAGE).dtx \
 ../$(PACKAGE)/$(PACKAGE).ins \
 ../$(PACKAGE)/LIESMICH.md \
 ../$(PACKAGE)/README.md
PACKAGE_FILES_A = $(subst ../$(PACKAGE)/,,$(DISTRIBUTION_FILES))
PACKAGE_FILES_B = $(subst $(PACKAGE).dtx ,,$(PACKAGE_FILES_A))
PACKAGE_FILES_C = $(subst $(PACKAGE).ins ,,$(PACKAGE_FILES_B))
PACKAGE_FILES_D = $(subst LIESMICH.md,,$(PACKAGE_FILES_C))
PACKAGE_FILES = $(subst README.md,,$(PACKAGE_FILES_D))

# To generate the version number of the distribution from the source
VERSION_L := git describe --long | xargs git --no-pager show -s \
         --date=short --format=format:"$(PACKAGE) version ???? of %ad%n" |\
         sed -e "s/????/`git describe --long`/"
VERSION_S := `git describe --long | \
             sed 's+-g.*++'`

# to create the correct tar-file
define TAR_COMMANDS
echo $$@
OUT_DIR=$$(mktemp -d)
mkdir $${OUT_DIR}/struktex
cp $$@ $${OUT_DIR}/struktex
pushd $${OUT_DIR}
tar cfvz struktex.tgz struktex
popd
cp $${OUT_DIR}/struktex.tgz .
endef

export TAR_COMMANDS

## Main Targets

# strip off the comments from the package
$(PACKAGE).sty $(PACKAGE)-test-*.tex: $(PACKAGE).ins $(PACKAGE).dtx $(PACKAGE).sed
 +$(TEX) $<; \
  source $(PACKAGE).makemake; \
  make revision_no; \
  source $(PACKAGE).sed  # set version number

all-de: $(PACKAGE).de.pdf

all-en: $(PACKAGE).en.pdf

# prepare the file with git revision information
.PHONY: revision_no
revision_no: $(PACKAGE).sed

$(PACKAGE).sed: $(PACKAGE).dtx
 printf "%b\n" "set_git_info() {" \
    > $(PACKAGE).sed; \
 printf "%b\n" "sed -i -e 's/^[ \\\\t]*%% git revision information$$/\\"  \
    >> $(PACKAGE).sed; \
 git describe --long | \
    xargs git --no-pager show -s --format=format:\
 "    \\\\@git@ \$$Date: %ci $$%%\%n" >> $(PACKAGE).sed; \
 git describe --long | cut -c 2- |\
    sed -e "s/^/      \$$Revision: /" -e "s/$$/ $$\\\\/" \
    >> $(PACKAGE).sed; \
 git describe --long | \
    xargs git --no-pager show -s --format=format:"    %%%% \$$Author: %an $$\\%n" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "/' \$$1" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "};" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "for f in  \\\\" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "$(PACKAGE).sty \\\\" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "struktxf.sty \\\\" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "struktxp.sty \\\\" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "strukdoc.sty \\\\" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "; do \\\\" \
    >> $(PACKAGE).sed; \
 printf "%b\n" "  set_git_info \$$f; done" \
    >> $(PACKAGE).sed; \

# generate the documentation
$(PACKAGE).de.pdf: $(PACKAGE).dtx $(PACKAGE).sty struktex.sed
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}"
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}"
 +mv $(<:.dtx=.pdf) $(<:.dtx=.de.pdf)

$(PACKAGE).en.pdf: $(PACKAGE).dtx $(PACKAGE).sty
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\def\primarylanguage{english}\input{$<}"
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\def\primarylanguage{english}\input{$<}"
 +mv $(<:.dtx=.pdf) $(<:.dtx=.en.pdf)

# generate the documentation with revision history (only german)
history: $(PACKAGE).dtx $(PACKAGE).sty
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(HISTORY_OPTIONS)}\input{$<}"
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(HISTORY_OPTIONS)}\input{$<}"
 +makeindex -s gind.ist                 $(PACKAGE).idx
 +makeindex -s gglo.ist -o $(PACKAGE).gls -t $(PACKAGE).glg $(PACKAGE).glo
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(HISTORY_OPTIONS)}\input{$<}"

# generate the documentation for the developer (revision history always
# in german)
develop-de: $(PACKAGE).dtx $(PACKAGE).sty
 +$(PDFLATEX) "\AtBeginDocument{$(HISTORY_OPTIONS)$(DEVELOPER_OPTIONS)}\input{$<}"
 +$(PDFLATEX) "\AtBeginDocument{$(HISTORY_OPTIONS)$(DEVELOPER_OPTIONS)}\input{$<}"
 +makeindex -s gind.ist                 $(PACKAGE).idx
 +makeindex -s gglo.ist -o $(PACKAGE).gls -t $(PACKAGE).glg $(PACKAGE).glo
 +$(PDFLATEX) "\AtBeginDocument{$(HISTORY_OPTIONS)$(DEVELOPER_OPTIONS)}\input{$<}"
 +mv $(<:.dtx=.pdf) $(<:.dtx=.de.pdf)

develop-en: $(PACKAGE).dtx $(PACKAGE).sty
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(DEVELOPER_OPTIONS)}\def\primarylanguage{english}\input{$<}"
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(DEVELOPER_OPTIONS)}\def\primarylanguage{english}\input{$<}"
 +makeindex -s gind.ist                 $(PACKAGE).idx
 +makeindex -s gglo.ist -o $(PACKAGE).gls -t $(PACKAGE).glg $(PACKAGE).glo
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(DEVELOPER_OPTIONS)}\def\primarylanguage{english}\input{$<}"
 +mv $(<:.dtx=.pdf) $(<:.dtx=.en.pdf)

# format the example/test files
test:
 for i in `seq 1 3`; do \
     f=$(PACKAGE)-test-$$i; \
     echo file: $$f; \
     $(PDFLATEX) $$f; \
 done

install: $(PACKAGE).dtx $(PACKAGE).dvi
 [ -d $(CLSDIR) ] || mkdir -p $(CLSDIR)
 [ -d $(DOCDIR) ] || mkdir -p $(DOCDIR)
 [ -d $(SRCDIR) ] || mkdir -p $(SRCDIR)
 cp $(PACKAGE).sty      $(CLSDIR)
 cp $(PACKAGE).dvi      $(DOCDIR)
 cp $(PACKAGE).ins      $(SRCDIR)
 cp $(PACKAGE).dtx      $(SRCDIR)
 cp $(PACKAGE)-test-*.tex   $(SRCDIR)
 cp LIESMICH        $(SRCDIR)
 cp README          $(SRCDIR)
 cp THIS-IS-VERSION-$(VERSION)  $(SRCDIR)

uninstall:
 rm -f  $(CLSDIR)/$(PACKAGE).sty
 rm -fr $(DOCDIR)
 rm -fr $(SRCDIR)

dist: $(PACKAGE).de.pdf $(PACKAGE).en.pdf  $(PACKAGE).dtx  $(PACKAGE).ins \
LIESMICH.md README.md
 + echo "$$TAR_COMMANDS" > ./tar_commands; \
 rm -f THIS_IS_VERSION_*; \
 $(VERSION_L) > THIS_IS_VERSION_$(VERSION_S); \
 sh  ./tar_commands $^; \
 mv ./struktex.tgz ./struktex-$(VERSION_S).tgz
 rm ./tar_commands

tds-zip:  $(PACKAGE_FILES)
 + rm -f THIS_IS_VERSION_* *.zip; \
 $(VERSION_L) | sed -e "s/??????????/$(VERSION_S)/" > THIS_IS_VERSION_$(VERSION_S); \
 DOC_FILES="LIESMICH.md README.md THIS_IS_* $(PACKAGE).??.pdf"; \
 MAKE_FILES="$(PACKAGE).m*"; \
 SRC_FILES="$(PACKAGE).dtx $(PACKAGE).ins"; \
 STY_FILES="struk*.sty"; \
 TEST_FILES="./$(PACKAGE)-test*"; \
 SUPPORT_FILES="./$(PACKAGE).el"; \
 if [[ -d /tmp/texmf ]]; then \
   rm -rf /tmp/texmf; \
 fi; \
 if [[ -f $(PACKAGE)-TDS.zip ]]; then \
   rm $(PACKAGE)-TDS.zip; \
 fi; \
 mkdir -p /tmp/texmf/doc/latex/$(PACKAGE); \
 mkdir -p /tmp/texmf/source/latex/$(PACKAGE); \
 mkdir -p /tmp/texmf/tex/latex/$(PACKAGE); \
 cp -a $${DOC_FILES} /tmp/texmf/doc/latex/$(PACKAGE); \
 cp -a $${MAKE_FILES} /tmp/texmf/doc/latex/$(PACKAGE); \
 cp -a $${SRC_FILES} /tmp/texmf/source/latex/$(PACKAGE); \
 cp -a $${STY_FILES} /tmp/texmf/tex/latex/$(PACKAGE); \
 cp -a $${TEST_FILES} /tmp/texmf/doc/latex/$(PACKAGE); \
 cp -a $${SUPPORT_FILES} /tmp/texmf/doc/latex/$(PACKAGE); \
 VERSION_SHORT="xxx"; \
 pushd /tmp/texmf; \
 zip -r /tmp/$(PACKAGE)-TDS.zip .; \
 popd; \
 mv /tmp/$(PACKAGE)-TDS.zip ./$(PACKAGE)-TDS-$(VERSION_S).zip


clean:
 -rm -f *.log *.aux *.brf *.idx *.ilg *.ind
 -rm -f *.glg *.glo *.gls *.lof *.lot *.out *.toc *.tmp *~
 -rm *.mk *.makemake

realclean:  clean
 -rm -f *.sty *.cls *.pdf
 -rm -f *-test-* Makefile

clean-test:
 rm $(PACKAGE)-test-*.* # this $-sign is needed for font-locking in XEmacs only
%</makefile>
%    \end{macrocode} ^^A$
%
% \ifnum\language=\languageNGerman%
% Die folgende Zeile, die nach |latex struktex.ins| als Datei
% |struktex.makemake| vorliegt, kann mit dem Kommando
% \begin{verbatim}
% sh struktex.makemake
% \end{verbatim}
% dazu benutzt werden, die obige Datei in ein Format umzusetzen, das von
% "ublichen make-Programmen wie dem GNU |make| verarbeitet werden kann.
% \else%
% The following line -- stripped off as |struktex.makemake| -- can
% be used with the command
% \begin{verbatim}
% sh struktex.makemake
% \end{verbatim}
% to generate the file |Makefile|, which can be further used to
% generate the documentation with a common |make| like the GNU |make|.%
% \fi%
%    \begin{macrocode}
%<*setup>
sed -e "`echo \"s/^ /@/g\" | tr '@' '\011'`" struktex.mk > Makefile
%</setup>
%    \end{macrocode}
%
%
% \changes{v2.3a}{18/03/07}{struktex.el: added package option fixedindent}
% \changes{v055}{10/01/21}{added "declaration" to LaTeX-item-list again
% (previously removed unintentionally)}
% \changes{v055}{10/01/21}{corrected "task" entry}
% \changes{v055}{10/01/21}{corrected lisp comments "\texttt{\char92}"
% $\rightarrow$ "\texttt{\char92}\texttt{\char92}"}
% \changes{v055}{10/01/21}{corrected format entry}
% \changes{v-9.2}{10/01/18}{extended .el-file: `inparallel, `task, `inparallelend}
% \changes{v-8.3}{06/08/18}{struktex.el erweitert, so dass die Parameter
% alle Kommandos automatisch abgefragt werden.}
% \section{\ifnum\language=\languageNGerman%
%  Stil Datei zur einfachen
% Eingabe von Struktogrammen beim Arbeiten mit dem (X)emacs und AUC\TeX
% \else%
%   Style File for easier input while working with (X)emacs
%   and AUC\TeX%
%   \fi%
% }
% \label{AUCTeX}
%
% \ifnum\language=\languageNGerman%
% Der (X)emacs und das Paket AUC\TeX{}
% (\url{http://www.gnu.org/software/auctex/}) bilden ein m"achtiges Werkzeug
% beim Erstellen von \TeX/\LaTeX-Dateien.  Wenn es eine passende Stildatei
% f"ur ein \LaTeX-Paket wie das hier vorliegende \StrukTeX{} gibt,
% wird die Eingabe von Quelltext durch automatisiertes Vervollst"andigen
% und viele andere Hilfsmittel sehr erleichtert. Im folgenden wird eine
% derartige Stildatei bereitgestellt; sie muss nach ihrer Erzeugung noch an
% eine entsprechende Stelle kopiert werden.
%
% Diese Datei ist zum jetzigen Zeitpunkt noch in der Entwicklungsphase,
% d.\,h. man kann mit ihr arbeiten, aber es fehlen noch ein paar Dinge wie
% das \textit{font locking}, die Anzahl der automatisch eingef"ugten \cs{switch}
% Kommandos sollte nicht fest gleich eins sein, sondern von der Anzahl der
% eingegebenen F"alle abh"angig sein.
% \else%
% The (X)emacs and the package AUC\TeX{}
% (\url{http://www.gnu.org/software/auctex/}) form a powerful tool for
% creating and editing of \TeX/\LaTeX{} files. If there is a suitable
% AUCTeX style file for a \LaTeX{} package like the hereby provided
% \StrukTeX{} package, then there is support for many common operations
% like creating environments and so on.  The following part provides such a
% style file; it must be copied to a place, where (X)emacs can find it
% after its creation.%
%
% This file is still in a development phase, i.\,e. one can work with it,
% but there is a couple of missing things as for example font locking or
% the automatic insertion of \cs{switch} commands according to the user's
% input.%
% \fi%
%    \begin{macrocode}
%<*auctex>
;;; struktex.el --- AUCTeX style for `struktex.sty'

;; Copyright (C) 2006 - 2018 Free Software Foundation, Inc.

;; Author: J. Hoffmann <j.hoffmann_(at)_fh-aachen.de>
;; Maintainer: j.hoffmann_(at)_fh-aachen.de
;; Created: 2017/06/06
;; Keywords: tex

;;; Commentary:
;;  This file adds support for `struktex.sty'

;;; Code:

(TeX-add-style-hook
 "struktex"
 (lambda ()
   ;; Add declaration to the list of environments which have
   ;; an optional argument for each item.
   (add-to-list 'LaTeX-item-list
                '("declaration" . LaTeX-item-argument))
   (LaTeX-add-environments
    "centernss"
    '("struktogramm" LaTeX-env-struktogramm)
    '("declaration" LaTeX-env-declaration))
   (TeX-add-symbols
    '("PositionNSS" 1)
    '("assert" [ "Height" ] "Assertion")
    '("assign" [ "Height" ] "Statement")
    "StrukTeX"
    '("case" TeX-mac-case)
    "switch" "Condition"
    "caseend"
    '("declarationtitle" "Title")
    '("description" "Name" "Meaning")
    "emptyset"
    '("exit" [ "Height" ] "What" )
    '("forever" TeX-mac-forever)
    "foreverend"
    '("forallin" TeX-mac-forallin)
    "forallin"
    '("ifthenelse" TeX-mac-ifthenelse)
    "change"
    "ifend"
    '("inparallel" TeX-mac-inparallel)
    '("task" "Description")
    "inparallelend"
    "sProofOn"
    "sProofOff"
    '("until" TeX-mac-until)
    "untilend"
    '("while" TeX-mac-while)
    "whileend"
    '("return" [ "Height" ] "Return value")
    '("sub" [ "Height" ] "Task")
    '("CenterNssFile" TeX-arg-file)
    '("centernssfile" TeX-arg-file))
   (TeX-run-style-hooks
    "pict2e"
    "emlines2"
    "curves"
    "struktxp"
    "struktxf"
    "ifthen")
   ;; Filling
   ;; Fontification
   ))

(defun LaTeX-env-struktogramm (environment)
  "Insert ENVIRONMENT with width, height specifications and
optional title."
  (let ((width (read-string "Width: "))
        (height (read-string "Height: "))
        (title (read-string "Title (optional): ")))
    (LaTeX-insert-environment environment
                              (concat
                               (format "(%s,%s)" width height)
                               (if (not (zerop (length title)))
                                   (format "[%s]" title))))))

(defun LaTeX-env-declaration (environment)
  "Insert ENVIRONMENT with an optional title."
  (let ((title (read-string "Title (optional): ")))
    (LaTeX-insert-environment environment
                              (if (not (zerop (length title)))
                                  (format "[%s]" title)))))

(defun TeX-mac-case (macro)
  "Insert \\case with all arguments, the needed \\switch(es) and
the final \\caseend. These are optional height and the required
arguments slope, number of cases, condition, and the texts for
the different cases"
  (let ((height (read-string "Height (optional): "))
        (slope (read-string "Slope: "))
        (number (read-string "Number of cases: "))
        (condition (read-string "Condition: "))
        (text (read-string "Case no. 1: "))
        (count 1)
        )
    (setq number-int (string-to-number number))
    (insert (concat (if (not (zerop (length height)))
                        (format "[%s]" height))
                    (format "{%s}{%s}{%s}{%s}"
                            slope number condition text)))
    (while (< count number-int)
      (end-of-line)
      (newline-and-indent)
      (newline-and-indent)
      (setq prompt (format "Case no. %d: " (+ 1 count)))
      (insert (format "\\switch{%s}" (read-string prompt)))
      (setq count (1+ count)))
    (end-of-line)
    (newline-and-indent)
    (newline-and-indent)
    (insert "\\caseend")))

(defun TeX-mac-forallin (macro)
  "Insert \\forallin-block with all arguments.
This is the optional height and the description of the loop"
  (let ((height (read-string "Height (optional): "))
        (loop-description (read-string "Description of loop: ")))
    (insert (concat (if (not (zerop (length height)))
                        (format "[%s]" height))
                    (format "{%s}"
                            loop-description)))
    (end-of-line)
    (newline-and-indent)
    (newline-and-indent)
    (insert "\\forallinend")))

(defun TeX-mac-forever (macro)
  "Insert \\forever-block with all arguments.
This is only the optional height"
  (let ((height (read-string "Height (optional): ")))
    (insert (if (not (zerop (length height)))
                (format "[%s]" height)))
    (end-of-line)
    (newline-and-indent)
    (newline-and-indent)
    (insert "\\foreverend")))

(defun TeX-mac-ifthenelse (macro)
  "Insert \\ifthenelse with all arguments.
These are optional height and the required arguments
left slope, right slope, condition, and the possible
values of the condition"
  (let ((height (read-string "Height (optional): "))
        (lslope (read-string "Left slope: "))
        (rslope (read-string "Right slope: "))
        (condition (read-string "Condition: "))
        (conditionvl (read-string "Condition value left: "))
        (conditionvr (read-string "Condition value right: ")))
    (insert (concat (if (not (zerop (length height)))
                        (format "[%s]" height))
                    (format "{%s}{%s}{%s}{%s}{%s}"
                            lslope rslope condition conditionvl
                            conditionvr)))
    (end-of-line)
    (newline-and-indent)
    (newline-and-indent)
    (insert "\\change")
    (end-of-line)
    (newline-and-indent)
    (newline-and-indent)
    (insert "\\ifend")))

(defun TeX-mac-inparallel (macro)
  "Insert \\inparallel with all arguments, the needed \\task(s)
and the final \\inparallelend. These are optional height and the
required arguments number of tasks and the descriptions for the
parallel tasks"
  (let ((height (read-string "Height (optional): "))
        (number (read-string "Number of parallel tasks: "))
        (text (read-string "Task no. 1: "))
        (count 1)
        )
    (setq number-int (string-to-number number))
    (insert (concat (if (not (zerop (length height)))
                        (format "[%s]" height))
                    (format "{%s}{%s}" number text)))
    (while (< count number-int)
      (end-of-line)
      (newline-and-indent)
      (newline-and-indent)
      (setq prompt (format "Task no. %d: " (+ 1 count)))
      (insert (format "\\task{%s}" (read-string prompt)))
      (setq count (1+ count)))
    (end-of-line)
    (newline-and-indent)
    (newline-and-indent)
    (insert "\\inparallelend")))

(defun TeX-mac-until (macro)
  "Insert \\until with all arguments.
These are the optional height and the required argument condition"
  (let ((height (read-string "Height (optional): "))
        (condition (read-string "Condition: ")))
    (insert (concat (if (not (zerop (length height)))
                        (format "[%s]" height))
                    (format "{%s}" condition)))
    (end-of-line)
    (newline-and-indent)
    (newline-and-indent)
    (insert "\\untilend")))

(defun TeX-mac-while (macro)
  "Insert \\while with all arguments.
These are the optional height and the required argument condition"
  (let ((height (read-string "Height (optional): "))
        (condition (read-string "Condition: ")))
    (insert (concat (if (not (zerop (length height)))
                        (format "[%s]" height))
                    (format "{-%s-}" condition)))
    (end-of-line)
    (newline-and-indent)
    (newline-and-indent)
    (insert "\\whileend")))

(defvar LaTeX-struktex-package-options '("anygradient" "curves" "debug"
                                         "draft" "emlines" "final"
                                         "fixedindent" "nofiller"
                                         "outer" "pict2e" "verification")
  "Package options for the struktex package.")

;;; struktex.el ends here.
%</auctex>
%    \end{macrocode}
%
%
% \StopEventually{
%     \begin{thebibliography}{MDB01}
%
%       \bibitem[Fut89]{Futschek:Programmentwicklung}
%       Gerald Futschek.
%       \newblock {\em Programmentwicklung und Verifikation}.
%       \newblock Springer Verlag, Wien -- New York, 1989.
%
%       \bibitem[GMS94]{GoossensMittelbachSamarin:Companion}
%       Michel Goossens, Frank Mittelbach and Alexander Samarin.
%       \newblock {\em The \LaTeX-Companion}.
%       \newblock Addison-Wesley Publishing Company, Reading, Massachusetts, 1994.
%
%       \bibitem[GMS04]{MittelbachGoossens:Companion2}
%       Frank Mittelbach and Michel Goossens.
%       \newblock {\em The \LaTeX-Companion}.
%       \newblock Addison-Wesley Publishing Company, Reading,
%       Massachusetts, second edition, 2004.
%
%       \bibitem[Knu86]{Knuth:TeXBook}
%       D.~E. Knuth.
%       \newblock {\em {The \TeX-Book}}.
%       \newblock Addison-Wesley, Reading, Massachusetts, 1986.
%
%       \bibitem[MDB94]{MittelbachDuchierBraams:DocStrip}
%       Frank Mittelbach, Denys Duchier and Johannes Braams.
%       \newblock {\em {The {\sf DocStrip} program}}, Dezember 1994.
%
%       \bibitem[MDB01]{MittelbachDuchierBraams:DocStrip-V-2.5b}
%       Frank Mittelbach, Denys Duchier, Johannes Braams,
%       Marcin Woli\'nski and Mark Wooding
%       \newblock {\em {The {\sf DocStrip} program}}, September 2001.
%
%       \bibitem[Mit94]{FM:TheDocAndShortvrbPackages}
%       Frank Mittelbach.
%       \newblock {\em {The {\sf doc} and {\sf shortvrb} Packages}}, Oktober 1994.
%
%       \bibitem[Mit01]{FM:TheDocAndShortvrbPackages-V-2.0}
%       Frank Mittelbach.
%       \newblock {\em {The {\sf doc} and {\sf shortvrb} Packages}}, September 2001.
%
%       \bibitem[Neu96]{Neubauer:MikrotypographieI}
%       Marion Neubauer.
%       \newblock {Feinheiten bei wissenschaftlichen Publikationen --
%         Mikrotypographie-Regeln, Teil I}.
%       \newblock {\em Die \TeX{}nische Kom"odie}, 8(4):23--40, Februar 1996.
%
%       \bibitem[Rah92]{Rahtz:OZ.STY}
%       Sebastian Rahtz.
%       \newblock {\em The {\sf oz} package}, 1992.
%
%     \end{thebibliography}
%
%     \ifmulticols
%     \addtocontents{toc}{\protect\end{multicols}}
%     \fi
% }   ^^A  end of \StopEventually
%
% \clearpage
%
% \section{\ifnum\language=\languageNGerman Die Implementation \else The implementation \fi}
%
% \ifnum\language=\languageNGerman%
% Der \StrukTeXSty{} stellt eine einfache Implementation der beschriebenen
% Makros dar; er sollte prinzipiell mit anderen Makropaketen vertr"aglich sein.
% Die G"ultigkeit von Makros wurde im Regelfall auf einen
% m"oglichst kleinen Bereich beschr"ankt. Um Seiteneffekte mit anderen
% \foreign{packages} so weit wie m"oglich zu vermeiden, werden alle
% intern genutzten Makros mit dem Suffix |@nss| versehen.
% \else%
% The \StrukTeXSty{} shows a simple implementation of the described macros.
% On principal it should be compatible with other macro packages.
% The validity of macros has been normally reduced to a range as small as possible.
% All internally used macros are supplied by the suffix |@nss| for avoiding
% sideeffects with other \foreign{packages} as far as possible.%
% \fi%
%
% \subsection{\ifnum\language=\languageNGerman Allgemeines \else general \fi}
%
% \changes{v084}{10/06/24}{removed flag preventing double load of the package}
% \ifnum\language=\languageNGerman%
% Dies ist ein Paket, das f"ur \LaTeX2e entwickelt wurde, es wird daher
% eine entsprechende Fehlermeldung ausgegeben, wenn ein anderes Format
% benutzt wird,
% was nicht zu Fehlern f"uhren sollte; zus"atzlich wird das Paket
% \textsf{ifthen.sty} geladen, falls es noch nicht anderweitig angefordert
% wurde.
% \else%
% This is a package, that has been developed for \LaTeX2e. Hence it will be
% print an adequate error message, if another format is used, which should
% not lead to any errors. In addition the package \textsf{ifthen.sty} will
% be loaded, if not already done.%
% \fi%
% \changes{v-4.4b}{96/03/13}{`RequirePackage umgestellt wg. korrekter
% Versionsmeldung}
% \ifnum\language=\languageNGerman%
% Nun wird das Einlesen des Makropakets mit der aktuellen
% Versionsnummer gemeldet.
% \else%
% Now loading of the macro package with the actual version number will
% be messaged.%
% \fi%
%    \begin{macrocode}
%<*struktex>
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{ifthen}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Der |\ifthenelse|-Makro muss unter einem anderen Namen verf"ugbar bleiben,
% da \StrukTeX{} einen gleichnamigen Makro mit einer anderen Bedeutung
% bereitstellt.%
% \else%
% The |\ifthenelse| must be mapped to |\@ifthenelse| to prevent overloading it by
% the command from the current package with the same name.%
% \fi%
%    \begin{macrocode}
\let\@ifthenelse\ifthenelse
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% \StrukTeX{} ben"otigt zwei weitere Pakete, die zum Lieferumfang geh"oren.
% Diese werden hier geladen.%
% \else%
% \StrukTeX{} uses two additional packages which are included in the
% package,these are loaded here.%
% \fi
%    \begin{macrocode}
\RequirePackage{struktxf}
\RequirePackage{struktxp}
%    \end{macrocode}
%
% \changes{v075}{10/06/23}{added markers to make debug code removeable}
% \ifnum\language=\languageNGerman%
% Zu Entwicklungszwecken werden hier ein paar Makros definiert, die
% Hilfsausgaben erzeugen (Option: |debug|, f"ur die Ver"offentlichung
% sollte diese Option nicht gesetzt werden).%
% \else%
% For developing purposes there are some debugging macros (option: |debug|,
% for the release
% version this option shouldn't be set at all); .%
% \fi%
% \changes{v061}{10/05/31}{added some debugging macros}
%    \begin{macrocode}
\newcommand{\dbgArgs@nss}[1]{\typeout{===> dbg Args:\space\space\space#1}}
\newcommand{\dbgCond@nss}[1]{%
  \@ifthenelse{\boolean{#1}}{
    \typeout{===> dbg Cond:\space #1 = true}
  }{
    \typeout{===> dbg Cond:\space #1 = false}
  }
}
\newcommand{\dbgCount@nss}[2][]{%
  \def\argI{#1}%  ^^A dbg
  \typeout{===> dbg Count:\space\space\ifx\argI\empty\else(#1)\space\fi%
    \string#2 = \the#2}}
\newcommand{\dbgCoord@nss}[3][]{%
  \def\argI{#1}%  ^^A dbg
  \typeout{===> dbg Coord:\space\space\ifx\argI\empty\else(#1)\space\fi%
    (\string#2, \string#3) = (\the#2, \the#3)}}%  ^^A dbg
\newcommand{\dbgMark@nss}[3][]{%
  \def\argI{#1}%  ^^A dbg
  \put(#2,#3){\makebox(0,0)[cc]{\ifx\argI\empty$\bullet$\else#1\fi%
    }}}% ^^A dbg
\newcommand{\dbgString@nss}[1]{\typeout{===> dbg String:\space#1}}
%    \end{macrocode}
% \changes{v075}{10/06/23}{added some more documentation about options}
% \changes{v-5.3a}{98/11/27}{Option \texttt{emlines} eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Ab der Version v-5.3a kennt \StrukTeX{} eine Option "`|emlines|"', die es
% erm"oglicht, Geraden beliebiger Steigung zu zeichnen; sp"ater kann auch
% das Paket \textsf{curves} (Option "`|curves|"') zum Zeichnen beliebiger
% Steigungen eingesetzt werden, ab der Version v-8.0a wird auch das Paket
% \textsf{pict2e} (Option "`|pict2e|"') unterst"utzt, das dazugeh"orige
% Paket wird hier geladen.%
% \else%
% From version v-5.3a on there is the option "|emlines|" which makes it
% possible to draw lines with any slope; later on one can use the package
% \textsf{curves} (Option "|curves|") and from version v-8.0a on
% \textsf{pict2e} (option "|pict2e|") is supported, these packages are
% loaded here.%
% \fi
% \changes{v104}{10/08/15}{some editorial changes}
%    \begin{macrocode}
\newboolean{curves}
\newboolean{emlines}
\newboolean{pictIIe}
\newboolean{anygradient}
\DeclareOption{curves}{%
    \setboolean{anygradient}{true}
    \setboolean{curves}{true}
    \setboolean{emlines}{false}
    \setboolean{pictIIe}{false}
}
\DeclareOption{emlines}{%
    \setboolean{anygradient}{true}
    \setboolean{curves}{false}
    \setboolean{emlines}{true}
    \setboolean{pictIIe}{false}
}
\DeclareOption{pict2e}{%
    \setboolean{anygradient}{true}
    \setboolean{curves}{false}
    \setboolean{emlines}{false}
    \setboolean{pictIIe}{true}
}
%    \end{macrocode}
%
% \ifnum\language=\languageNGerman%
% Zur Unterst"utzung der Internationalisierung werden feste Texte in der
% jeweilig benutzten Sprache (beispielsweise als |babel|-Option definiert)
% hier vorbereitet.
% \else%
% To support i18n as provided by |babel| here are some common fixed texts:%
% \fi%
% \changes{v121}{10/08/31}{added some more translations}
% \changes{v104}{10/08/15}{first steps to babel support}
%    \begin{macrocode}
\DeclareOption{english}{%
  \def\declarationtitlename@nss{providing memory space:}%
  \def\pTruename@nss{true}%
  \def\pFalsename@nss{false}%
}
\DeclareOption{german}{%
  \def\declarationtitlename@nss{Speicherplatz bereitstellen:}
  \def\pTruename@nss{WAHR}%
  \def\pFalsename@nss{FALSCH}%
}
\DeclareOption{ngerman}{%
  \def\declarationtitlename@nss{Speicherplatz bereitstellen:}
  \def\pTruename@nss{WAHR}%
  \def\pFalsename@nss{FALSCH}%
}
%    \end{macrocode}
%
% \changes{v-7.0a}{04/01/05}{Option \texttt{verification} eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Ab der Version v-7.0a kennt \StrukTeX{} eine Option "`|verification|"', die
% ein zus"atzliches Element definiert: die \cs{assert}-Box, die in
% \cite{Futschek:Programmentwicklung} eingef"uhrt wird.
% \else%
% From version v-7.0a on \StrukTeX{} knows the option "`|verification|"', which
% defines an additional element: the \cs{assert}-box, which is introduced
% in \cite{Futschek:Programmentwicklung}.%
% \fi%
%    \begin{macrocode}
\newboolean{verification}
\DeclareOption{verification}%
{%
    \setboolean{verification}{true}
}
%    \end{macrocode}
%
% \changes{v-8.2a}{06/01/17}{Option \texttt{nofiller} eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Ab der Version v-8.2a kennt \StrukTeX{} eine Option "`|nofiller|"', die
% die Darstellung von Leerraum beeinflusst: ohne diese Option wird in
% Alternativen ein \(\emptyset\)-Zeichen ausgegeben, wenn der Platz
% ausreichend ist. Dies f"uhrt zu einer uneinheitlichen Darstellung im
% Vergleich mit dem Leerraum, der von einem \cs{case}-Block erzeugt wird,
% da hier der Leerraum nicht in entsprechende Weise angezeigt wird -- dies
% w"are nur mit einer aufwendigen Listenverwaltung m"oglich. Angabe der
% Option f"uhrt dazu, dass das \(\emptyset\)-Zeichen einheitlich weggelassen
% wird.
% \else%
% From version v-8.2a on \StrukTeX{} knows the option "`|nofiller|"', which
% makes the \(\emptyset\)-character vanishing in alternatives.%
% \fi%
%    \begin{macrocode}
\newboolean{filler}
\setboolean{filler}{true}
\DeclareOption{nofiller}%
{%
    \setboolean{filler}{false}
}
%    \end{macrocode}
%
% \changes{v-8.3}{06/08/17}{Optionen \texttt{draft} und \texttt{final} eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Ab der Version v-8.3 kennt \StrukTeX{} die Optionen "`|draft|"' und
% "`|final|"', die zwischen dem Entwurf und der endg"ultigen Version des
% Struktogramms umschalten. Entwurfsmodus ist |\sProofOn| gesetzt, f"ur die
% endg"ultige Version wird |\sProofOff| gesetzt.%
% \else%
% From version v-8.3 on \StrukTeX{} knows the options "`|draft|"' and
% "`|final|"', which differentiate between the draft (|\sProofOn|) and the
% final (|\sProofOff|) version of the structured box chart makes the
% \(\emptyset\)-character vanishing in alternatives.%
% \fi
%    \begin{macrocode}
\let\ifdraft@nss\iffalse
\let\iffinal@nss\iftrue
\DeclareOption{draft}%
{%
  \let\ifdraft@nss\iftrue
  \let\iffinal@nss\iffalse
}
\DeclareOption{final}%
{%
  \let\ifdraft@nss\iffalse
  \let\iffinal@nss\iftrue
}
%    \end{macrocode}
%
%    \begin{macrocode}
\newboolean{debug}
\DeclareOption{debug}%
{%
  \setboolean{debug}{true}
}
\DeclareOption{nodebug}%
{%
  \setboolean{debug}{false}
}
%    \end{macrocode}
%
%    \begin{macrocode}
\newboolean{outer}
\DeclareOption{outer}%
{%
  \setboolean{outer}{true}
}
%    \end{macrocode}
%
% \changes{v2.3}{17/11/17}{introduced option \texttt{fixedindent}}
% \ifnum\language=\languageNGerman%
% Ab der Version v2.3 kennt \StrukTeX{} eine Option "`|fixedindent|"', die
% den Einzug von Bl"ocken in |while|- und |until|-Schleifen
% beeinflusst. Standardm"a"sig ist dieser Einzug gleich dem vertikalen
% Abstand zum umgebenden Block, was bei mehrzeiligen Bedingungen zu einem
% gro"sen, unsch"onen Einzug f"uhrt. Wenn |fixedindent| gesetzt ist, entspricht
% der Einzug (ungef"ahr) dem Zeilenabstand, was einer einzeiligen Bedingung
% entspricht. Der Makrobefehl |\dimtomm| stammt aus
% \url{https://tex.stackexchange.com/questions/223740/convert-dimension-to-integer-number-of-mm}.%
% \else%
% From version v2.3 on  \StrukTeX{} has an option "`|fixedindent|"', which affects
% the indentation of blocks in |while| and |until| loops. By default, this
% indentation is the same as the vertical distance to the surrounding
% block, which leads in multi-line conditions to a large, ugly
% indentation. If |fixedindent| is set, the indentation (approximately)
% corresponds to the line spacing, which is equivalent to a one-line
% condition. The macro |\dimtomm| comes from
% \url|https://tex.stackexchange.com/questions/223740/convert-dimension-to-integer-number-of-mm|.%
% \fi%
%    \begin{macrocode}
\def\dimtomm #1{\the\numexpr \dimexpr #1\relax*635000/118407168\relax }
%    \end{macrocode}
%    \begin{macrocode}
\newboolean{fixedindent@nss}
\DeclareOption{fixedindent}%
{%
  \setboolean{fixedindent@nss}{true}
  \gdef\xindent@nss{\dimtomm{\baselineskip}}
}
%    \end{macrocode}
%
%% \ifnum\language=\languageNGerman%
% Nun werden andere Pakete geladen und die Optionen verarbeitet.%
% \else%
% Now load additional packages and process the options.%
% \fi
% \changes{v141}{12/04/10}{added `ExecuteOptions call for settings default
% values}
% \changes{v104}{10/08/15}{corrected `ProcessOptions call}
%    \begin{macrocode}
\ExecuteOptions{pict2e,english,final}
\ProcessOptions*\relax
\ifcurves%
    \RequirePackage{curves}
\else\ifemlines
    \RequirePackage{emlines2}
\else\ifpictIIe
    \RequirePackage{pict2e}
\fi\fi\fi
\ifthenelse{\boolean{debug}}{
  \typeout{debug active}}{
  \typeout{debug inactive}
  \renewcommand{\dbgCond@nss}[1]{}
  \renewcommand{\dbgCount@nss}[2][]{}
  \renewcommand{\dbgCoord@nss}[3][]{}
  \renewcommand{\dbgMark@nss}[3][]{}
  \renewcommand{\dbgString@nss}[1]{}
}
%    \end{macrocode}
%
% \begin{macro}{\StrukTeX}
% \ifnum\language=\languageNGerman%
% Das Logo des Paketes:%
% \else%
% The logo of package:%
% \fi%
%    \begin{macrocode}
\def\StrukTeX{S\kern-.05emt\kern-.05em\raise.5ex\hbox{r}%
              \kern-.1667emu\kern-.05em\lower.5ex\hbox{k}%
              \kern-.2emT\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</struktex>
%    \end{macrocode}
%
%
% \subsection{\ifnum\language=\languageNGerman Diverse Makros zur Vorbereitung
%                 \else Various macros for preparation
%                 \fi}
%
% \changes{v-4.1c}{95/07/24}{Eigene Datei f"ur spezielle Fonts anlegen}
% \ifnum\language=\languageNGerman%
% Zun"achst werden die zus"atzlich ben"otigten Fonts bereitgestellt. Da diese
% Fonts auch in anderem Zusammenhang ben"otigt werden, wird hierf"ur ein
% eigenes Paket definiert.
% \else%
% First the additionally needed fonts are provided. Since these fonts are also used
% in another connection, therefore an own package is defined.%
% \fi%
%    \begin{macrocode}
%<*struktxf>
%    \end{macrocode}
%
%    \begin{macrocode}
\@ifundefined{nat}{}{\endinput}
\DeclareSymbolFont{italics}{\encodingdefault}{\rmdefault}{m}{it}%
\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}
\DeclareSymbolFontAlphabet{\mathbb}{AMSb}
%    \end{macrocode}
%
% \begin{macro}{\nat}
% \begin{macro}{\integer}
% \begin{macro}{\real}
% \begin{macro}{\complex}
% \changes{v-4.1b}{95/07/23}{`complex eingef"uhrt}
% \changes{v-4.1a}{95/07/17}{`nat, `integer und `real eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Die folgenden Makros dienen dem vereinfachten Schreiben von Mengen:
% \else%
% The following macros contribute to easier writing of sets:%
% \fi%
%    \begin{macrocode}
\def\nat{{\mathbb N}}
\def\integer{{\mathbb Z}}
\def\real{{\mathbb R}}
\def\complex{{\mathbb C}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\btt}
% \changes{v-4.1a}{95/07/17}{`btt auf NFSS umgestellt}
% \changes{v-8.0b}{04/07/14}{Hinweis auf Luxi Mono als Ersatz fuer cmbtt}
% \ifnum\language=\languageNGerman%
% Um fetten Schreibmaschinensatz erzeugen zu k"onnen, gibt es den Font \cs{btt},
% der als Erweiterung der \textsf{cmtt}-Font-Familie definiert ist. Um
% auf diesen Font auch ohne zus"atzliches Einbinden dieses \foreign{packages}
% zugreifen zu k"onnen, kann man die entsprechenden Deklarationen in den
% Dateien |ot1cmtt.fd| bzw.\ |t1cmtt.fd| durch die folgende
% ersetzen.\footnote{Eine Alternative ist die Benutzung des Luxi Mono Fonts.}
% \else%
% For generating bold face typescript there's the font \cs{btt}, that is defined as
% an extension of the \textsf{cmtt} font family. For access to these
% \foreign{packages} without supplementary tieing up one can exchange the
% adequate declaration in the files |ot1cmtt.fd| or |t1cmtt.fd|
% respectively by the following:\footnote{An alternative is using the font
% Luxi Mono.}%
% \fi%
%    \begin{macrocode}
\DeclareFontFamily{OT1}{cmbtt}{}
\DeclareFontShape{OT1}{cmtt}{bx}{n}{
   <-8> cmbtt8 <9> cmbtt9 <10-> cmbtt10
}{}

\def\btt{%
    \fontencoding{\encodingdefault}\fontfamily{cmbtt}\fontseries{bx}%
    \fontshape{n}\selectfont%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\MathItalics}
% \begin{macro}{\MathNormal}
% \changes{v-4.1a}{95/07/17}{`MathItalics und `MathNormal eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Die folgenden Makros dienen dem Umschalten zwischen verschiedenen Formen
% der \foreign{italics} im Mathematik-Modus. Sie wurden aus
% \cite{Rahtz:OZ.STY} "ubernommen. Als Standard wird \cs{MathItalics}
% genommen, um eine sch"onere Darstellung von langen Variablennamen zu
% erzielen.
% \else%
% The following macros contribute to the switch of the different forms of
% \foreign{italics} in math mode. They have been taken over from
% \cite{Rahtz:OZ.STY}. As a standard there will be taken \cs{MathItalics} to
% generate a nicer representation of long variable names.%
% \fi%
%    \begin{macrocode}
\def\@setmcodes#1#2#3{{\count0=#1 \count1=#3
    \loop \global\mathcode\count0=\count1 \ifnum \count0<#2
    \advance\count0 by1 \advance\count1 by1 \repeat}}
\def\MathItalics%
{%
    \@setmcodes{`A}{`Z}{"7\hexnumber@\symitalics41}
    \@setmcodes{`a}{`z}{"7\hexnumber@\symitalics61}
}
\def\MathNormal%
{%
    \@setmcodes{`A}{`Z}{"7141}
    \@setmcodes{`a}{`z}{"7161}
}
\MathItalics
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
%</struktxf>
%    \end{macrocode}
%
% \subsection[\ifnum\language=\languageNGerman Darstellung von Variablen
% etc.\else Representation of variables etc.\fi]{%
% \ifnum\language=\languageNGerman%
%   Makros zur Darstellung von Variablen, Schl"usselw"ortern und anderen
%   programmierspezifischen Details%
% \else%
%   Macros for representing of variables, keywords and other specific details
%   of programming%
% \fi%
% }
%
% \changes{v121}{10/08/31}{removed unnecessary test to prevent double
% loading of package}
% \changes{v121}{10/08/31}{added package url as an requirement}
%    \begin{macrocode}
%<*struktxp>
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{url}
%    \end{macrocode}
%
% \begin{macro}{\pExpFont@nss}
% \changes{v-5.4a}{99/11/16}{neu eingef"uhrt, ersetzt `pVarFont@nss}
% \begin{macro}{\pKeyFont@nss}
% \changes{v-4.5a}{96/03/15}{neu eingef"uhrt}
% \begin{macro}{\pCommentFont@nss}
% \changes{v-4.5a}{96/03/15}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Die drei Makros |\pExpFont@nss|, |\pKeyFonts@nss| und |\pCommentFont@nss|
% dienen der Vorbesetzung der Fonts zur Formatierung von Variablen,
% Schl"usselw"ortern und Kommentar. Diese kann mit dem Kommando \cs{pFonts}
% umdefiniert werden.
% \else%
% The three macros |\pExpFont@nss|, |\pKeyFonts@nss| and |\pCommentFonr@nss|
% contribute to the default of fonts which serve to formatting variables,
% keywords and comments. These can be redefined by the command \cs{pFonts}.%
% \fi%
%    \begin{macrocode}
\newcommand{\pExpFont@nss}{\small\sffamily}
\newcommand{\pKeyFont@nss}{\small\sffamily\bfseries}
\newcommand{\pCommentFont@nss}{\small\sffamily\slshape}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\pFonts}
% \changes{v-4.5a}{96/03/15}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Der Makro \cs{pFonts} dient dem Umsetzen der Vorbesetzungen der Fonts
% zum Setzen von Variablennamen, Schl"usselw"ortern und Kommentar:
% \else%
% The macro \cs{pFonts} serves to the change of default of fonts for
% setting variable names, keywords and comments:%
% \fi%
%    \begin{macrocode}
\newcommand{\pFonts}[3]{%
  \def\argi@nss{#1} \def\argii@nss{#2} \def\argiii@nss{#3}%
  \ifx\argi@nss\empty\else%
    \renewcommand{\pExpFont@nss}{#1}%
  \fi%
  \ifx\argii@nss\empty\else%
    \renewcommand{\pKeyFont@nss}{#2}%
  \fi%
  \ifx\argiii@nss\empty\else%
    \renewcommand{\pCommentFont@nss}{#3}%
  \fi%
}
%    \end{macrocode}
% \end{macro}
%
% Zum Setzen von Programmtexten innerhalb von Struktogrammen wird
% unterschieden zwischen Ausdr"ucken und (Schl"ussel-)W"ortern. Ein Ausdruck
% (zu verstehen im Sinne eines Ausdrucks einer Programmiersprache) wird in
% einem festen Font gesetzt, der durch |\pExpFont@nss| aktuell
% bestimmt wird. Dieses gilt in gleicher Weise f"ur (Schl"ussel-)W"orter,
% dabei werden aber die Schl"usselw"orter, die in einer entsprechenden
% Liste definiert sind, fett gedruckt. Sowohl Ausdr"ucke als auch
% (Schl"ussel-)w"orter d"urfen Sonderzeichen enthalten:
% \begin{enumerate}
%    \item der Unterstrich "`|_|"',
%    \item das Dach "`|^|"',
%    \item das kaufm"annische Und "`|&|"' und
%    \item das Doppelkreuz "`|#|"'.
% \end{enumerate}
% \begin{macro}{\pExpression}
% \changes{v-5.4a}{99/11/16}{neu eingef"uhrt, ersetzt `pVariable}
% \begin{macro}{\pExp}
% \changes{v-5.4a}{99/11/16}{`pExp als Abk"urzung definiert}
% \ifnum\language=\languageNGerman%
% Leerzeichen werden beachtet, so dass ganze Anweisungen geschrieben werden
% k"onnen. Das Argument kann erst nach der Umdefinition der \foreign{catcodes}
% von einem internen Makro ausgewertet werden.
% \else%
% Blank characters are considered, such that whole statements can be written.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Zur Erleichterung des Schreibens wird mit \cs{let} ein alternativer Zugriff
% auf \cs{pVariable} geschaffen.
% \else%
% For easier writing there is brought about an alternative access by
% \cs{pVariable}.%
% \fi%
%    \begin{macrocode}
\newcommand{\pExpression}{%
  \bgroup%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Zun"achst werden die ben"otigten \foreign{catcodes} auf Sonstige --
% \foreign{other} -- umgesetzt, zur Erinnerung:
% \else%
% First the needed \foreign{catcodes} will be changed to \foreign{other}.
% Recall:%
% \fi%
%
% \ifnum\language=\languageNGerman%
% \DeleteShortVerb{\|}
% \begin{tabular}{r|l}
%     \foreign{catcode} & Bedeutung \\\hline
%     1 & Gruppenanfang \\
%     2 & Gruppenende \\
%     4 & Tabulatorzeichen \\
%     8 & Index \\
%     12& Sonstige \\
% \end{tabular}
% \MakeShortVerb{\|}
% \else%
% \DeleteShortVerb{\|}
% \begin{tabular}{r|l}
%     \foreign{catcode} &Meaning \\\hline
%     1 & Group Begin \\
%     2 & Group End \\
%     4 & Tabulator Character \\
%     8 & Index \\
%     12& Other \\
% \end{tabular}
% \MakeShortVerb{\|}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% In einer Variablen sind die folgenden Sonderzeichen erlaubt:
% \begin{enumerate}
%    \item der Unterstrich "`|_|"',
%    \item das Dach "`|^|"' und
%    \item das kaufm"annische Und "`|&|"'.
% \end{enumerate}
% \else%
% In a variable the following special characters are allowed:
% \begin{enumerate}
%    \item the Underline `|_|',
%    \item the Hat `|^|' and
%    \item the Ampersand `|&|'.
% \end{enumerate}%
% \fi%
%
%    \begin{macrocode}
    \catcode`\_=13  \let\_\textunderscore%
    \catcode`\^=12 \catcode`\&=12 %
    \pUseExpFont@nss%
}
\let\pExp=\pExpression
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\pVariable}
% \changes{v-5.4a}{99/11/16}{neu definiert}
% \changes{v-2.0n}{94/03/31}{Neuimplementation gem"a"s `TeXnischer Kom"odie'}
% \begin{macro}{\pVar}
% \changes{v-2.0c}{93/12/09}{`pVar als Abk"urzung definiert}
% \begin{macro}{\pKeyword}
% \changes{v-5.4a}{99/11/16}{auf `pVariable zur"uckgef"uhrt}
% \changes{v-2.0n}{94/03/31}{Neuimplementation gem"a"s `TeXnischer Kom"odie'}
% \changes{v-2.0c}{93/12/09}{`pKeyword und `pKey definiert}
% \begin{macro}{\pKey}
% \changes{v-5.4a}{99/11/16}{auf `pVariable zur"uckgef"uhrt}
% \changes{v-2.0c}{93/12/09}{neu definiert}
% \ifnum\language=\languageNGerman%
% Die Implementation von \cs{pKeyword} entspricht der von \cs{pVariable}.
% Die hier neu benutzten Fonts (cmbtt..) werden durch den
% \textsf{struktxf.sty} bereitgestellt.
% Ansonsten wird wie bei \cs{pVariable} verfahren:
% \else%
% The implementation of \cs{pKeyword} coincides with the one of \cs{pVariable}.
% The hereby newly used fonts (cmbtt..) are provided by |textsf{struktxf.sty}|.
% Apart from that it will be proceded as with \cs{pVariable}:%
% \fi%
% Zus"atzlich werden Makros \cs{pVar} sowie \cs{pKeyword} und \cs{pKey} mit
% der gleichen Bedeutung definiert. Diese dienen allein der
% R"uckw"artskompatibilit"at.
%    \begin{macrocode}
\newcommand{\pVariable}{%
  \begingroup%
    \catcode`\_=13 \let\_\textunderscore
    \catcode`\#=12 \catcode`\^=12 \catcode`\&=12 %
    \pVariabl@%
}
\let\pVar=\pVariable
\let\pKeyword=\pVariable
\let\pKey=\pVariable
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\pVariabl@}
% \changes{v-5.4a}{99/11/16}{neu definiert}
% \changes{v-8.0d}{04/12/27}{Python-Schl"usselw"orter neu eingef"uhrt}
% Die Liste der Schl"usselw"orter wird nach den verschiedenen
% Anwendungsgebieten unterschieden.\footnote{Die Python-Erweiterung
% erfolgte nach einem Hinweis von Ludger Humbert, Universit"at Dortmund, von
% dem auch die Liste der Schl"usselw"orter stammt, vielen Dank!}
%    \begin{macrocode}
\newcommand{\pVariabl@}[1]{%
    \def\arg{#1}%
    \ifx\pLanguage@nss\Cee@nss%
      \CheckForKeyword@nss{auto,break,case,char,const,continue,default,do,double,%
        else,enum,extern,float,for,goto,if,int,long,register,return,%
        short,signed,sizeof,static,struct,switch,typedef,union,unsigned,%
        void,volatile,while}%
    \else\ifx\pLanguage@nss\Java@nss%
      \CheckForKeyword@nss{abstract,boolean,break,byte,case,catch,char,class,const,%
        continue,default,do,double,else,extends,final,finally,float,for,%
        goto,if,implements,import,instanceof,int,interface,long,native,%
        new,null,package,private,protected,public,return,short,static,%
        super,switch,synchronized,this,throw,throws,transient,try,void,%
        volatile,while,true,false}%
    \else\ifx\pLanguage@nss\Pascal@nss%
      \CheckForKeyword@nss{alfa,and,array,begin,boolean,byte,case,char,const,div,do,%
        downto,else,end,false,file,for,function,get,goto,if,in,integer,%
        label,maxint,mod,new,not,of,or,pack,packed,page,program,put,%
        procedure,read,readln,real,record,repeat,reset,rewrite,set,text,%
        then,to,true,type,unpack,until,var,while,with,write,writeln}%
    \else\ifx\pLanguage@nss\Python@nss%
      \CheckForKeyword@nss{and,assert,break,class,continue,def,del,elif,else,%
        except,exec,finally,for,from,global,if,import,in,is,lambda,not,or,%
        pass,print,raise,return,try,while,yield}%
    \else\ifx\pLanguage@nss\LaTeX@nss%
      \CheckForKeyword@nss{center,description,enumerate,figure,itemize,
        list,quote,tabbing,tabular,table,}%
    \else%
      \CheckForKeyword@nss{}%
    \fi\fi\fi\fi\fi%
    \url{#1}
  \endgroup%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\pLanguage}
% \changes{v-5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\Cee@nss}
% \changes{v-5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\Java@nss}
% \changes{v-5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\Pascal@nss}
% \changes{v-5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\LaTeX@nss}
% \changes{v-5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\Python@nss}
% \changes{v-8.0d}{04/12/27}{Python als zul"assige Sprache neu definiert}
% Die Liste der Schl"usselw"orter wird nach den verschiedenen
% Anwendungsgebieten unterschieden.
%    \begin{macrocode}
\newcommand{\pLanguage}[1]{\gdef\pLanguage@nss{#1}}
\def\Cee@nss{C}
\def\Java@nss{Java}
\def\Pascal@nss{Pascal}
\def\LaTeX@nss{LaTeX}
\def\Python@nss{Python}
\def\OSII@nss{OS/2}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\CheckForKeyword@nss}
% \changes{v130}{10/09/21}{selection of the font is now done by a macro
% from url.sty}
% \changes{v-5.4a}{99/11/16}{neu definiert}
% Die Liste der Schl"usselw"orter wird der Reihe nach durchlaufen und mit
% dem aktuellen Argument \cs{arg} verglichen.
%    \begin{macrocode}
\def\CheckForKeyword@nss#1%
{%
    \let\exec\pExpFont@nss%
    \def\endList{!}%
    \def\yyI##1,%
    {%
        \def\token{##1}%
        \ifx\token\endList%
            \def\UrlFont{\exec}
        \else%
            \ifx\token\arg%
                \let\exec\pKeyFont@nss%
            \fi%
            \expandafter\yyI%
        \fi%
    }%
    \yyI#1,!,%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\pComment}
% \ifnum\language=\languageNGerman%
% Zur Auszeichnung von Kommentar.
% \else%
% For marking up comments.%
% \fi%
%    \begin{macrocode}
\def\pComment{%
    \bgroup%
        \pCommentFont@nss%
        \let\next=%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\pUseKeyFont@nss}
% \begin{macro}{\pUseExpFont@nss}
% \changes{v-5.4a}{99/11/16}{neu eingef"uhrt, ersetzt `pUseVarFont@nss}
% \ifnum\language=\languageNGerman%
% Damit Unterstriche und "ahnliche Sonderzeichen korrekt dargestellt werden
% k"onnen, ist vor der Benutzung eines bestimmten Fonts zu "uberpr"ufen,
% ob die gew"unschten Zeichen in dem betreffenden Font "uberhaupt zur
% Verf"ugung stehen.
% \else%
% In order to represent underlines and similar special characters it has to be
% checked, if the wanted characters are provided in a certain font, before
% using that font.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Es wird stets auf den Textmodus umgeschaltet, was unter Einsatz des
% \textsf{amstex}-Paketes noch besser durch das Kommando \cs{text}
% geschehen k"onnte. Es k"onnen Probleme mit dem  Zeichen
% \texttt{\char94\char94 T}\footnote{Dies funktioniert auf einem
% Linux-System} auftreten, in diesem Fall ist das Zeichen durch
% \texttt{\char94\char94 Y}\footnote{getestet unter OS/2}.
% zu ersetzen
% \else%
% It will be always switched to the text mode, what could be done even better
% by the command \cs{text} of the \textsf{amstex} package. There may be some
% problems using the character \texttt{\char94\char94 T}\footnote{This one
% works under Linux}, in this case it should be replaced by
% \texttt{\char94\char94 Y}\footnote{tested under OS/2}.%
% \fi%
% \errorstopmode
%    \begin{macrocode}
{%
  \catcode`\#=6%
  \gdef\pUseKeyFont@nss#1{%
    \ifmmode\else\let\mbox=\relax\fi%
    \mbox{\pKeyFont@nss{#1}}\egroup%
  }
  \gdef\pUseExpFont@nss#1{%
    \ifmmode\else\let\mbox=\relax\fi%
    \mbox{\pExpFont@nss{#1}}\egroup%
  }
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\pTrue@nss}
% \changes{v-4.5a}{96/03/15}{neu definiert}
% \begin{macro}{\pFalse@nss}
% \changes{v-4.5a}{96/03/15}{neu definiert}
% \ifnum\language=\languageNGerman%
% Die Vorbesetzungen der logischen Werte \cs{pTrue} und \cs{pFalse}:
% \else%
% The default of the boolean values \cs{pTrue} and \cs{pFalse}:%
% \fi%
%    \begin{macrocode}
\newcommand{\pTrue@nss}{\texttt{\pTruename@nss}}
\newcommand{\pFalse@nss}{\texttt{\pFalsename@nss}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\pTrue}
% \changes{v-4.5a}{96/03/15}{neu definiert "uber `pTrue@nss}
% \changes{v-3.5b}{94/01/19}{umbenannt von `true zur Vermeidung von Interferenzen}
% \changes{v-3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\pFalse}
% \changes{v-4.5a}{96/03/15}{neu definiert "uber `pTrue@nss}
% \changes{v-3.5b}{94/01/19}{umbenannt von `false zur Vermeidung von Interferenzen}
% \changes{v-3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Um einheitliches Aussehen logischer Werte zu erzielen, werden entsprechende
% Makros mit den obigen Vorbesetzungen definiert.
% \else%
% For achieving homogenous appearance of boolean values adequate macros
% with the above defaults are defined.%
% \fi%
%    \begin{macrocode}
\newcommand{\pTrue}{\pTrue@nss}
\newcommand{\pFalse}{\pFalse@nss}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\pBoolValue}
% \changes{v-4.5a}{96/03/15}{neu definiert}
% \ifnum\language=\languageNGerman%
% Mit \cs{pBoolValue} k"onnen die voreingestellten Werte von \cs{pTrue} und
% \cs{pFalse} ver"andert werden; \cs{sBoolValue} ist der alternative Aufruf
% zwecks Kompatibilit"at mit alten Struktogrammen.
% \else%
% The default values of \cs{pTrue} and \cs{pFalse} can be changed by \cs{pBoolValue}.
% |sBoolValue| is the alternative command for compatibility reasons with old
% structured box charts.%
% \fi%
%    \begin{macrocode}
\newcommand{\pBoolValue}[2]{%
  \renewcommand{\pTrue@nss}{#1}%
  \renewcommand{\pFalse@nss}{#2}%
}
\let\sBoolValue=\pBoolValue
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sVar}
% \changes{v-3.5b}{94/01/19}{umbenannt von `Var zur Vermeidung von Interferenzen}
% \changes{v-2.5}{93/09/09}{eingef"uhrt durch Jhf}
% \begin{macro}{\sKey}
% \changes{v-4.1a}{95/07/17}{`btt bereits anderweitig definiert}
% \changes{v-3.5b}{94/01/19}{neu eingef"uhrt}
% \begin{macro}{\sTrue}
% \begin{macro}{\sFalse}
% \ifnum\language=\languageNGerman%
% Zur Darstellung von Variablen. Hier nur noch zwecks Kompatibilit"at zu
% fr"uheren Versionen des \StrukTeXSty aufgef"uhrt.
% \else%
% For representation of variables. Here only mentioned for compatibility
% reasons with former versions of \StrukTeXSty.%
% \fi%
%    \begin{macrocode}
\let\sVar=\pVariable
\let\sKey=\pKeyword
\let\sTrue=\pTrue
\let\sFalse=\pFalse
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
%</struktxp>
%    \end{macrocode}
%
%
% \subsection{\ifnum\language=\languageNGerman Belegung von Registern \else Reservation of registers \fi}
%
%    \begin{macrocode}
%<*struktex>
%    \end{macrocode}
%
% \begin{macro}{\savelength@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `s@velength}
% \changes{v-2.5}{93/09/09}{`VarDeclWd eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\savelength@nss|
% dient dazu, die vor dem Struktogramm g"ultige L"angeneinheit
% zwischenzuspeichern, um nach dem Struktogramm den alten Wert
% wiederherstellen zu k"onnen.
% \else%
% |\savelength@nss| contributes to intermediate storing of the unit of length,
% which was valid before the structured box chart, for recovering the old value
% after the box chart.%
% \fi%
%    \begin{macrocode}
\newdimen\savelength@nss
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\gx@nss}
% \changes{v061}{10/05/31}{enhanced the documentation}
% \changes{v-4.0b}{95/05/02}{umbenannt von `gx}
% \changes{v-3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \changes{v-3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\gy@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `gy}
% \begin{macro}{\gsize@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `gsize}
% \changes{v-3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\gx@nss|, |\gy@nss| und |\gsize@nss| enthalten die \emph{globalen} Werte f"ur die
% x- und y-Koordinate und die Breite des Struktogramms;
% zur Vereinfachung der Anwendung wird in allen F"allen
% mit Z"ahlregistern gearbeitet. Um eine hinreichend feine Aufl"osung zu
% erzielen, wird intern mit der \cs{unitlength} von 0.001\,mm gearbeitet.
%
% Die linke untere Koordinate eines Struktogramms ist (0, 0), die rechte
% obere Koordinate (\cs{gxsize@nss}, \cs{gy@nss}).
% \else%
% |\gx@nss|, |gy@nss| and |\gsize@nss| contain the \emph{global} values for the
% x- and y-coordinate and the width of the structured box chart. For simplification
% of the application in all cases it is worked with counter registers. To
% have an adequate resolution the \cs{unitlength} for a structured box
% chart is set to 0.001\,mm.
%
% The lower left corner of a structured box chart has the coordinate (0, 0),
% the upper right corner the coordinate (\cs{gxsize@nss}, \cs{gy@nss}).%
% \fi%
%    \begin{macrocode}
\newcount\gx@nss \newcount\gy@nss \newcount\gsize@nss
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\param@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `param}
% \changes{v-3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\param@nss| enth"alt den  Wert, der als optionales Argument f"ur die Breite
% oder H"ohe eines Struktogramms angegeben wird.
% \else%
% |\param@nss| contains the value, which is given as an optional argument for
% the width or the height of the structured box chart.%
% \fi%
%    \begin{macrocode}
\countdef\param@nss=199
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\x@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `x}
% \changes{v-3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\y@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `y}
% \changes{v-3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\xsize@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `xsize}
% \changes{v-3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\xx@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `xx}
% \begin{macro}{\yy@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `yy}
% \begin{macro}{\tempx@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `tempx}
% \begin{macro}{\tempxx@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `tempxx }
% \begin{macro}{\tempxxx@nss}
% \changes{v-7.2}{04/07/13}{eingef"uhrt f"ur die Unterst"utzung von pict2e}
% \begin{macro}{\tempy@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `tempy}
% \begin{macro}{\tempyy@nss}
% \changes{v-7.2}{04/07/13}{umbenannt von `tempyy}
% \begin{macro}{\tempyyy@nss}
% \changes{v-7.2}{04/07/04}{eingef"uhrt f"ur die Unterst"utzung von pict2e}
% \begin{macro}{\ydepth@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `ydepth}
% \changes{v-3.2a}{94/09/14}{Beschreibung fehlt noch}
% \ifnum\language=\languageNGerman%
% Es werden einige weitere Variablen ben"otigt, die alle zentral an dieser
% Stelle definiert werden: |\x@nss|, |\y@nss| und |\xsize@nss| als lokale
% Werte f"ur die $x$- und $y$-Koordinate und die Breite eines
% (Unter-)Struktogramms; |\ydepth@nss| gibt die "`Tiefe"' eines
% Struktogrammelementes an. Die Variablen |\xx@nss|, |\yy@nss|,
% |\tempx@nss|, |\tempxx@nss|, |\tempxxx@nss|, |\tempy@nss|, |\tempyy@nss|
% und |\tempyyy@nss| haben unterschiedliche tempor"are Bedeutungen, im
% Regelfall deutet ein |x| im Namen auf horizontalen und ein |y| auf
% vertikalen Zusammenhang hin.
% \else%
% There are needed some more variables. All those will be defined here:
% |\x@nss|, |\y@nss| and |\xsize@nss| as local values for the $x$- and
% $y$-coordinate and for the width of a structured subbox chart.
% |\ydepth@nss| represents the "'depth"' of an element of a structured box
% chart.  The variables |\xx@nss|, |\yy@nss|, |\tempx@nss|, |\tempxx@nss|,
% |\tempy@nss|, |\tempyy@nss| have different temporary meanings. Normally
% an |x| in the name points at a horizontal connection and a |y| in the
% name at a vertical connection.%
% \fi%
%    \begin{macrocode}
\countdef\x@nss=220     \countdef\y@nss=221      \countdef\xsize@nss=222
\countdef\ydepth@nss=223
\countdef\xx@nss=224    \countdef\yy@nss=225
\countdef\tempx@nss=226 \countdef\tempxx@nss=227
\countdef\tempy@nss=229 \countdef\tempyy@nss=230
\ifpictIIe%
     \countdef\tempxxx@nss=228  \countdef\tempyyy@nss=231
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\TextBox@nss}
% \changes{v-4.1a}{95/07/18}{umbenannt von `nss@Box}
% \begin{macro}{\TextBoxHt@nss}
% \changes{v-4.1a}{95/07/18}{umbenannt von `nss@BoxHt}
% \changes{v-3.2a}{94/09/09}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\TextBox@nss| ist die Box, die den Text in einem Struktogrammblock enth"alt,
% ihre tats"achliche H"ohe, "Uberl"ange und Unterl"ange wird in |\TextBoxHt@nss|
% abgelegt.
% \else%
% |\TextBox@nss| is the box which contains the text in a structured box chart.
% Its real height, ascender and descender are distributed in |\TextBoxHt@nss|.%
% \fi%
%    \begin{macrocode}
\newbox\TextBox@nss \newdimen\TextBoxHt@nss
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsection{\ifnum\language=\languageNGerman Die einzelnen Makros \else The single macros \fi}
%
% \begin{macro}{\filler@nss}
% \changes{v-8.2a}{06/01/17}{`ifmmode $\rightarrow$ `ensuremath}
% \changes{v-4.1a}{95/07/18}{umbenannt von `filler}
% \changes{v-4.1a}{95/07/17}{`emptyset wird als AMS-Schrift geladen}
% \changes{v-2.5}{93/09/09}{Leerraum von `% auf `emptyset umgestellt}
% \ifnum\language=\languageNGerman%
% Beim Setzen eines Struktogrammes entsteht teilweise Leerraum,
% der mit |\filler@nss| aufgef"ullt wird: "`$\emptyset$"'. Eine
% Alternative w"are "`$\mathchar"023B$"', was mit "`|\mathchar"023B|"'
% erzeugt wird. Der Leerraum wird allerdings nicht gef"ullt, wenn die Option
% |nofiller| gesetzt wird. Will man die globale Einstellung lokal umgehen,
% so kann man einfach die boolesche Variable |filler| auf |true| setzen:
% \cs{fillertrue}.
% \else%
% While setting a structured box chart there arises partly empty space, that
% will be filled up with |\filler@nss|: "'$\emptyset$"'. An alternative would be
% "'$\mathchar"023B$"', which is generated by
% "'|\mathchar"023B|"'. "'$\emptyset$"' will not be set, if the option
% |nofiller| is set.%
% \fi%
%    \begin{macrocode}
\DeclareMathSymbol\varnothing{\mathord}{AMSb}{"3F}
\let\emptyset\varnothing
\def\filler@nss{%
    \iffiller\ensuremath{\emptyset}\fi%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c@nter@nss}
% \changes{v-4.0b}{95/05/02}{umbenannt von `c@nter}
% \changes{v-3.1}{94/09/09}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Der folgende Makro setzt verschiedene Parameter, die zum Zentrieren eines
% Textes gebraucht werden.
% \else%
% The following macro sets different parameters, which are used for centering
% a text.%
% \fi%
%    \begin{macrocode}
\def\c@nter@nss{%
    \leftskip=0pt plus 2em \rightskip=\leftskip \parfillskip=0pt
    \spaceskip=.333em \xspaceskip=.5em
    \pretolerance=9999 \tolerance=9999
    \hyphenpenalty=9999 \exhyphenpenalty=9999%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\PositionNSS}
% \changes{v-4.5c}{96/05/01}{neu eingef"uhrt zur Positionierung der Struktogramme}
% \ifnum\language=\languageNGerman%
% Struktogramme werden intern als |minipage| verwaltet. Das Kommando
% \cs{PositionNSS} erm"oglicht die Positionierung, es erwartet die Werte,
% die die |minipage|-Umgebung akzeptiert: |t|, |b| und keine Parameterangabe.
% Die Parameter werden nicht "uberpr"uft und gelten global ab Aufruf des
% Kommandos.
% \else%
% Structured box charts are internally managed as |minipage|. The instruction
% \cs{PositionNSS} enables the positioning. It expects the values, that the |minipage|
% environment accepts: |t|, |b| and no parameter option. The parameters
% are not checked and are valid globally from the call of instruction on.%
% \fi%
%    \begin{macrocode}
\def\Position@nss{}%
\newcommand{\PositionNSS}[1]{%
    \def\Position@nss{#1}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\struktogramm}
% \changes{v061}{10/05/31}{added missing translations}
% \changes{v-4.4b}{96/03/13}{Optionaler Parameter "uber `empty statt `relax getestet}
% \changes{v-4.4a}{96/02/29}{`ifthenelse als internes Kommando definiert}
% \changes{v-3.1a}{94/09/09}{optionaler Parameter eingef"uhrt}
% \ifnum\language=\languageNGerman%
% \cs{struktogramm} beginnt ein Struktogramm
% \else%
% \cs{struktogramm} starts a structured box chart%
% \fi%
%    \begin{macrocode}
\def\struktogramm(#1,#2){%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Zun"achst werden die internen Kommandos aktiviert:
% \else%
% First the internal instructions are activated:%
% \fi%
%    \begin{macrocode}
    \let\ifthenelse=\ifthenelse@nss%
    \let\ifend=\ifend@nss%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Falls die Option |draft| gesetzt wurde, wird f"ur jedes Struktogramm
% grunds"atzlich auf den Entwurfsmodus umgeschaltet.
% \else%
% If the option |draft| is set we switch to the draft mode for every single
% structured box chart.%
% \fi%
%    \begin{macrocode}
    \ifdraft@nss\let\struktogramm@nss=\struktogramm@Proof\fi%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Um den optionalen Parameter zu behandeln, wird in Abh"angigkeit vom
% n"achsten Zeichen ein internes Makro aufgerufen.
% \else%
% An internal macro depending on the next character will be called to treat the
% optional parameter.%
% \fi%
%    \begin{macrocode}
    \@ifnextchar [{\struktogramm@nss(#1,#2)}{\struktogramm@nss(#1,#2)[]}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\endstruktogramm}
% \ifnum\language=\languageNGerman%
% \cs{endstruktogramm} beendet das Struktogramm. Offene Gruppen und Umgebungen
% werden geschlossen, lokale Definitionen globaler Werte werden r"uckg"angig
% gemacht.
% \else%
% \cs{endstruktogramm} finishes the structured box chart. Open groups and
% environments will be closed, local definitions of global values will be returned.%
% \fi%
%    \begin{macrocode}
\def\endstruktogramm{%
            \endstr@kt%
        \end{picture}%
    \end{minipage}%
    \setlength{\unitlength}{\savelength@nss}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\struktogramm@NoProof}
% \changes{v061}{10/05/31}{enhanced the documentation}
% \changes{v-4.5b}{96/03/26}{Positionierung des Struktogramms "uber [t] bei der minipage}
% \changes{v-4.4b}{96/03/13}{Optionaler Parameter "uber `empty statt `relax getestet}
% \changes{v-4.2b}{95/10/15}{umbenannt von `struktogramm@nss}
% \changes{v-4.0c}{95/05/09}{umbenannt von `nss@struktogramm}
% \changes{v-3.1a}{94/09/09}{als internes Makro zur Behandlung optionaler Parameter neu}
% \changes{v-3.3a}{94/09/21}{`baselineskip=0pt innerhalb von Struktogrammen korrigiert}
% \ifnum\language=\languageNGerman%
% |\struktogramm@NoProof| leitet ein Struktogramm ein. Die drei Parameter
% sind:
% \begin{itemize}
%   \item |#1|: die Breite des Struktogramms,
%   \item |#2|: seine (voraussichtliche) H"ohe und
%   \item |#3|: sein Titel.
% \end{itemize}
% \else%
% |\struktogramm@NoProof| opens a structured box chart. The three
% parameters are:
% \begin{itemize}
%   \item |#1|: the width of the structured box chart,
%   \item |#2|: its (estimated) height and,
%   \item |#3|: its title.
% \end{itemize}%
% \fi%
%    \begin{macrocode}
\def\struktogramm@NoProof(#1,#2)[#3]{%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Zun"achst wird die aktuelle \cs{unitlength} zwischengespeichert, da mit einer
% eigenen Gr"o"se gearbeitet wird.
% \else%
% First the actual \cs{unitlength} will be stored intermediately, since it is worked
% with an own entity.%
% \fi%
%    \begin{macrocode}
    \def\next{#3}
    \setlength{\savelength@nss}{\unitlength}
    \setlength{\unitlength}{0.001mm}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Wenn der dritte Parameter nicht \cs{relax} ist, wird die Bezeichnung
% geschrieben und es muss ein bisschen zus"atzlicher Platz geschaffen werden.
% \else%
% If the third parameter is not \cs{relax}, then the name will be written and it has to
% be created some new space in addition.%
% \fi%
%    \begin{macrocode}
    \begin{minipage}[\Position@nss]{#1mm}
        \ifx\next\empty\else #3\\[\smallskipamount]\fi%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Um die Verwaltung des ben"otigten Raumes m"oglichst einfach zu machen,
% wird eine \cs{picture}-Umgebung ge"offnet, in der eine weitere
% Gruppe durch den Aufruf von |\str@kt| ge"offnet wird.
% \else%
% For easier management of the needed space the \cs{picture} environment will be
% opened, in which an own other group will be opened by call of |str@kt|.%
% \fi%
%    \begin{macrocode}
        \begin{picture}(#1000,#2000)%
            \str@kt{0}{#2000}{#1000}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\struktogramm@Proof}
% \changes{v-4.5b}{96/03/26}{Positionierung des Struktogramms "uber [t] bei der minipage}
% \changes{v-4.4b}{96/03/13}{Optionaler Parameter "uber `empty statt `relax getestet}
% \changes{v-4.2b}{95/10/15}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\struktogramm@proof| "offnet ein Struktogramm im \foreign{proof}-Modus.
% Der Ablauf entspricht im wesentlichen |\struktogramm@NoProof|.
% \else%
% |\struktogramm@proof| opens a structured box chart in the \foreign{proof} mode.
% Progress is essentially equivalent to |\struktogramm@NoProof|.%
% \fi%
%    \begin{macrocode}
\def\struktogramm@Proof(#1,#2)[#3]{%
    \def\next{#3}%
    \setlength{\savelength@nss}{\unitlength}%
    \setlength{\unitlength}{0.001mm}%
    \begin{minipage}[\Position@nss]{#1mm}%
        \ifx\next\empty\else #3\\[\smallskipamount]\fi%
        \begin{picture}(#1000,#2000)%
            \put(0,0){\makebox(0,0)[cc]{$\bullet$}}%
            \put(0,#2000){\makebox(0,0)[cc]{$\bullet$}}%
            \put(#1000,0){\makebox(0,0)[cc]{$\bullet$}}%
            \put(#1000,#2000){\makebox(0,0)[cc]{$\bullet$}}%
            \str@kt{0}{#2000}{#1000}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sProofOn}
% \begin{macro}{\sProofOff}
% \changes{v-4.2b}{95/10/15}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Die Schalter zum Umschalten zwischen \foreign{proof}- und
% \foreign{non proof}-Modus. Abschlie"send wird in den \foreign{non proof}-Modus
% umgeschaltet.
% \else%
% The switches for changing from \foreign{proof} to \foreign{non proof} mode and
% back. Finally it will be switched to \foreign{non proof} mode.%
% \fi%
%    \begin{macrocode}
\def\sProofOn%
{%
    \let\struktogramm@nss=\struktogramm@Proof%
}
\def\sProofOff%
{%
    \let\struktogramm@nss=\struktogramm@NoProof%
}
\let\struktogramm@nss=\struktogramm@NoProof%
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \changes{v-4.3a}{96/01/26}{Dokumentation verbessert und korrigiert}
% \ifnum\language=\languageNGerman%
% Um Kompatibilit"at mit "alteren Versionen von Struktogrammen zu erhalten,
% sind die Makros \cs{openstrukt} und \cs{closestrukt} weiterhin in diesem
% \foreign{package} erhalten. Diese sollten aber nicht weiter benutzt werden.
% \else%
% To achieve compatibility with older versions of structured box charts the
% macros \cs{openstrukt} and \cs{closestrukt} are still included in this package.
% But they should'nt be used any longer.%
% \fi%
% \begin{macro}{\openstrukt}
% \ifnum\language=\languageNGerman%
% \cs{openstrukt} beginnt ein Struktogramm
% \else%
% \cs{openstrukt} begins a structured box chart.%
% \fi%
%    \begin{macrocode}
\def\openstrukt#1#2{%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die aktuelle \cs{unitlength} wird zwischengespeichert, da mit einer eigenen
% Gr"o"se gearbeitet wird.%
% \else%
% The current \cs{unitlength} will be stored intermediately, since it is worked with
% an own entity.%
% \fi%
%    \begin{macrocode}
    \setlength{\savelength@nss}{\unitlength}
    \setlength{\unitlength}{0.001mm}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Um die Verwaltung des ben"otigten Raumes m"oglichst einfach zu machen,
% wird eine \cs{picture}-Umgebung ge"offnet, in der eine eigene weitere
% Gruppe durch den Aufruf von |\str@kt| ge"offnet wird.
% \else%
% For easier management of the needed space the \cs{picture} environment will be
% opened, in which an own other group will be opened by the call of |\str@kt|.%
% \fi%
%    \begin{macrocode}
    \begin{picture}(#1000,#2000)
        \str@kt{0}{#2000}{#1000}%
}
%    \end{macrocode}
% \end{macro}
% \ifnum\language=\languageNGerman%
% Es ist zu beachten, dass es kein optionales Argument gibt.
% \else%
% One has to pay attention that there's no optional argument.%
% \fi%
%
% \begin{macro}{\closestrukt}
% \ifnum\language=\languageNGerman%
% \cs{closestrukt} beendet das Struktogramm. Offene Gruppen und Umgebungen
% werden geschlossen, lokale Definitionen globaler Werte werden r"uckg"angig
% gemacht.
% \else%
% \cs{closestrukt} finishes the structured box chart. Open groups and environments
% will be closed. Local definitions of global values will be reversed.%
% \fi%
%    \begin{macrocode}
\def\closestrukt%
{%
        \endstr@kt
    \end{picture}
    \setlength{\unitlength}{\savelength@nss}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\getoption}
% \ifnum\language=\languageNGerman%
% \cs{getoption} "uberpr"uft, ob ein optionales Argument angegeben wurde. Dies
% geschieht, indem das n"achste Zeichen getestet wird.
% \else%
% \cs{getoption} checks, if an optional argument is given. This happens by
% testing the next character.%
% \fi%
%    \begin{macrocode}
\def\getoption{\@ifnextchar [{\getnum}{\param@nss=0\next}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\getnum}
% \ifnum\language=\languageNGerman%
% \cs{getnum} weist den Parameter dem globalen Z"ahler |\param@nss| zu und ruft
% den auf \cs{next} gesetzten Makro auf.
% \else%
% \cs{getnum} assigns the parameter to the global counter |\param@nss| and calls
% the macro set on \cs{next}.%
% \fi%
%    \begin{macrocode}
\def\getnum[#1]{\param@nss=#1\next}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\str@kt}
%     \changes{v2.3}{17/12/04}{enhanced documentation}
%     \changes{v061}{10/05/31}{added some debug code}
%     \ifnum\language=\languageNGerman%
%     |\str@kt| setzt globale Werte: |\gx@nss| als x-Koordinate (|#1|),
%     |\gy@nss| als y-Koordinate (|#2|) der linken oberen Ecke und
%     |\gsize@nss| als Breite des aktuellen Struktogramms (|#3|). Das
%     Struktogramm selbst wird dann in ein Rechteck mit der unteren linken
%     Ecke (0,0) und der oberen Ecke (|\gx@nss|, |\gy@nss|) gezeichnet.
%
%     Gleichzeitig wird eine Gruppe ge"offnet, in der mit lokalen Kopien
%     dieser Werte (|\x@nss|, |\y@nss| und |\xsize@nss|) gearbeitet werden
%     kann. Diese Gruppe kann dann Unterstruktogramme enthalten (Sequenzen,
%     Schleifen und Entscheidungen).%
%     \else%
%     |\str@kt| sets global values: |\gx@nss| as x-coordinate (|#1|),
%     |\gy@nss| as y-coordinate (|#2|) of the upper left corner and
%     |\gsize@nss| as width of the actual structured box chart (|#3|). The
%     actual structured box chart will be drawn in a recangular region with
%     lower left corner (0, 0) and upper right corner at (|\gx@nss|,
%     |\gy@nss|).
%
%     At the same time a group will be opened, in which one can work with
%     local copies of these values (|\x@nss|, |\y@nss| and
%     |\xsize@nss|). This group may contain further (sub) structured box
%     charts (e.\,g. for loops or selections).%
%     \fi%
%    \begin{macrocode}
\def\str@kt#1#2#3{%
  \dbgString@nss{Beginn \string\str@kt}
  \dbgArgs@nss{#1, #2, #3}
  \global\gx@nss=#1\global\gy@nss=#2\global\gsize@nss=#3%
  \begingroup%
    \x@nss=\gx@nss\y@nss=\gy@nss\xsize@nss=\gsize@nss%
    \dbgString@nss{rectangle size}
    \dbgCoord@nss[Ursprung]{\x@nss}{\y@nss}
    \dbgCount@nss[Breite]{\xsize@nss}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\endstr@kt}
% \ifnum\language=\languageNGerman%
% schlie"st die oben ge"offnete Gruppe, die aktuelle $y$-Koordinate wird global
% umgesetzt, um den (weiter unten liegenden) Ansatzpunkt f"ur das n"achste
% Element des Struktogramms zu erhalten.
% \else%
% closes the above opened group. The actual $y$-coordinate will be globally
% changed to get the point of attachment (which lies further down) for the next
% element of the structured box chart.%
% \fi%
% \changes{v061}{10/05/31}{added some debug code}
%    \begin{macrocode}
\def\endstr@kt{%
    \global\gy@nss=\y@nss%
  \endgroup%
  \ydepth@nss=\gy@nss%
  \dbgString@nss{Ende \string\str@kt}
}
%    \end{macrocode}
% \end{macro}
%
% \changes{v-7.0b}{2004/03/09}{ersetzt durch `tempxx@nss}
% \changes{v-4.0b}{95/05/08}{umbenannt von `xin}
% \changes{v-3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\set@nss}
%     \changes{v2.3}{17/12/04}{corrected documentation}
%     \changes{v061}{10/05/31}{enhanced the documentation and added some
%     debug code}%
%     \changes{v-4.0b}{95/05/08}{umbenannt von `set}%
%     \ifnum\language=\languageNGerman%
%     |\set@nss| setzt den als ersten Parameter |#1| "ubergebenen Text in
%     eine horizontale Box |\TextBox@nss|. Die Breite der Box ist die
%     aktuelle Breite \cs{xsize@nss} vermindert um die Gr"o"se des
%     Parameters |#2|. Ist die Breite dieser Box gr"o"ser als die genannte
%     Breite, wird der Text in eine vertikale Box gesetzt.%
%     \else%
%     |\set@nss| sets the text, which is given as parameter |#1|, into a
%     horizontal box |\TextBox@nss|. The width of this box is the current
%     width \cs{xsize@nss} decremented by |#2|. If this value is less than
%     the natural width of the first parameter the text will be set into a
%     vertical box.%
%     \fi%
%     \changes{v104}{10/08/15}{corrected position of texts in `set@nss}
%    \begin{macrocode}
\def\set@nss#1#2{%
  \dbgString@nss{Beginn \string\set@nss}
  \setbox\TextBox@nss=\hbox{#1}%
  \tempxx@nss=\xsize@nss\advance\tempxx@nss by-#2%
  \ifdim\wd\TextBox@nss>\tempxx@nss\unitlength%
    \setbox\TextBox@nss=\vbox{\hsize=\tempxx@nss\unitlength\noindent#1}%
  \else
    \setbox\TextBox@nss=\hbox to \tempxx@nss\unitlength{#1\hss}%
  \fi%
  \dbgString@nss{Ende \string\set@nss}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\block@nss}
%     \changes{v061}{10/05/31}{enhanced the documentation and added some
%     debug code}%
%     \changes{v-7.0a}{04/01/04}{umbenannt von `bl@ck}%
%     \ifnum\language=\languageNGerman%
%     |\block@nss| setzt die Box |\TextBox@nss| entsprechend dem zweiten
%     Parameter. Ist dieser 2, wird ..., f"ur den Wert 1 wird eine Box mit
%     Rahmen gesetzt, ist dieser 0, wird eine Box ohne Rahmen gesetzt. Bei
%     allen anderen Werten wird nur die Gr"o"se des Struktogramms, gegeben
%     durch |\y@nss|, vergr"o"sert. der erste Parameter |#1| gibt die
%     (optionale) H"ohe des Kastens an.%
%     \else%
%     |\block@nss| sets the box |\TextBox@nss| corresponding to the second
%     parameter.  If this parameter is 1, the box will be set in a frame,
%     and if it is 0, a box without frame will be set. In all other cases
%     only the size of the structured box chart given by |\y@nss| will be
%     changed. Parameter |#1| gives the (optional) height of the box.%
%     \fi%
%    \begin{macrocode}
\def\block@nss#1#2{%
  \dbgString@nss{Beginn \string\block@nss}
  \tempy@nss=#1%
%    \end{macrocode}
% At first we compute the height of the text (in pt):
%    \begin{macrocode}
  \dbgCount@nss{\ydepth@nss}
  \TextBoxHt@nss=\ht\TextBox@nss%
  \advance\TextBoxHt@nss by\dp\TextBox@nss%
  \advance\TextBoxHt@nss by 2mm%
  \dbgCount@nss[original]{\TextBoxHt@nss}
  \ifdim\TextBoxHt@nss<\tempy@nss\unitlength%
    \TextBoxHt@nss=\tempy@nss\unitlength%
  \fi%
  \dbgCount@nss[korrigiert]{\TextBoxHt@nss}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% \else%
% Because of we have to convert a box's height into mm, we have to multiply
% the height by 0.00536 (\(1\;mm=186467\;bp\equiv0.00536\;mm=\;bp\),
% dimensions are internally stored as bp).%
% \fi%
%    \begin{macrocode}
  \TextBoxHt@nss=0.00536\TextBoxHt@nss%
  \dbgCount@nss[skaliert]{\TextBoxHt@nss}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Wegen der Orientierung des Koordinatensystems wird der Ursprung des zu
% zeichnenden Objektes um \cs{ydepth@nss} nach unten verschoben, danach
% wird das Objekt mit der H"ohe \cs{ydepth@nss} gezeichnet.
% \else%
% Because of the orientation of the coordinate system, we go down by
% \cs{ydepth@nss} and draw from that point the box of height
% \cs{ydepth@nss}.%
% \fi%
%    \begin{macrocode}
  \ydepth@nss=\TextBoxHt@nss\advance\y@nss by-\ydepth@nss%
  \dbgCoord@nss[Ursprung]{\x@nss}{\y@nss}
  \dbgCoord@nss[Breite, Hoehe]{\xsize@nss}{\ydepth@nss}
  \ifx#21%
    \put(\x@nss,\y@nss){%
        \framebox(\xsize@nss,\ydepth@nss){\box\TextBox@nss}%
    }%
  \else\ifx#20%
      \put(\x@nss,\y@nss){%
          \makebox(\xsize@nss,\ydepth@nss){\box\TextBox@nss}%
      }%
  \else%
      \advance\y@nss by \ydepth@nss%
  \fi\fi%
  \dbgString@nss{Ende \string\block@nss}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\declarationtitle}
% \ifnum\language=\languageNGerman%
% Der Makro \cs{declarationtitle} legt den Inhalt der optionalen "Uberschrift
% bei Deklarationen fest. Er kann global vorgegeben werden, um eine
% einheitliche Darstellung zu erhalten.
% \else%
% The macro \cs{declarationtitle} determines the content of the optional titel of
% declarations. It can be globally given in order to receive a homogeneous
% representation.%
% \fi%
%    \begin{macrocode}
\def\declarationtitle{\declarationtitlename@nss}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\descriptionindent}
% \changes{v-4.5a}{96/03/14}{an \LaTeX2e angepasst}
% \changes{v-3.3a}{94/09/16}{neu eingef"uhrt}
% \begin{macro}{\descriptionwidth}
% \changes{v-4.5a}{96/03/14}{an \LaTeX2e angepasst}
% \changes{v-3.3a}{94/09/16}{neu eingef"uhrt}
% \begin{macro}{\descriptionwidth@nss}
% \changes{v-4.5a}{96/03/14}{neu eingef"uhrt}
% \begin{macro}{\descriptionsep}
% \changes{v-4.5a}{96/03/14}{an \LaTeX2e angepasst}
% \changes{v-3.3a}{94/09/16}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Die folgenden Variablen (\foreign{dimen-register}) wurden eingef"uhrt,
% um das Layout der Variablenbeschreibung frei gestalten zu k"onnen.
% \else%
% The following variables (\foreign{dimen-register}) have been introduced to
% be able to freely arrange the layout of variable description.%
% \fi%
%    \begin{macrocode}
\newlength{\descriptionindent} \setlength{\descriptionindent}{1.5em}
\newlength{\descriptionwidth}  \setlength{\descriptionwidth}{40pt}
\newlength{\descriptionsep}    \setlength{\descriptionsep}{\tabcolsep}
\newlength{\descriptionwidth@nss}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\descriptionlabel@nss}
% \changes{v-5.2a}{97/12/03}{Vorbesetzung des Fonts entf"allt}
% \changes{v-4.5a}{96/03/14}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Internes Kommando nach
% \else%
% internal command according to%
% \fi%
% \cite[Abs. 3.3.5]{GoossensMittelbachSamarin:Companion}
% \ifnum\language=\languageNGerman zur Definition
% der Marke bei der Liste der Variablenbeschreibungen
% \else%
% for the definition of label on the list of variable definitions%
% \fi%
%    \begin{macrocode}
\newcommand{\descriptionlabel@nss}[1]%
{%
    \settowidth{\descriptionwidth@nss}{#1}%
    \ifnum\descriptionwidth@nss>\descriptionwidth%  % term > labelwidth
        \parbox[b]{\descriptionwidth}%
        {%
            \makebox[0pt][l]{#1}\\%
        }%
    \else%                                      % term < labelwidth
        #1%
    \fi%
    \hfil\relax%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{declaration}
% \changes{v-4.5a}{96/03/14}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Die Beschreibung von Variablen basiert nun auf der allgemeinen
% |list|-Umgebung, die entsprechend modifiziert wurde. Insbesondere
% wurden alle Abst"ande auf 0pt gesetzt.
% \else%
% Now the description of variables is based on the common |list|-environment,
% which has been modified correspondingly. Especially all distances have been set
% on 0pt.%
% \fi%
%    \begin{macrocode}
\newenvironment{declaration}[1][\declarationtitle]%
{%
    \def\next{#1}%
    \ifx\next\empty\else #1\\\fi
    \let\description=\description@nss
    \tempxx@nss=\xsize@nss\advance\tempxx@nss by -\tempx@nss%
    \begin{minipage}[t]{\tempxx@nss\unitlength}
    \begin{list}{}%
    {%
        \renewcommand{\makelabel}{\descriptionlabel@nss}%
        \setlength{\labelwidth}{\descriptionwidth}%
        \setlength{\itemsep}{0pt} \setlength{\topsep}{0pt}%
        \setlength{\parsep}{0pt} \setlength{\partopsep}{0pt}
        \setlength{\leftmargin}{\descriptionwidth}%
        \addtolength{\leftmargin}{\descriptionsep}%
        \addtolength{\leftmargin}{\descriptionindent}%
    }%
}%
{%
    \end{list}%
    \end{minipage}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\description@nss}
% \changes{v-4.5a}{96/03/14}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Um keine Schwierigkeiten mit der |description|-Umgebung zu haben,
% wird das Kommando |\description@nss| mit der Erweiterung |@nss|
% eingef"uhrt. Seine G"ultigkeit wird
% mit einem \cs{let} auf die |declaration|-Umgebung beschr"ankt
% \else%
% In order to avoid difficulties with the |description|-environment the command
% |\description@nss| with the extension |@nss| will be introduced. Its validity will be
% restricted to |declaration|-environment by a \cs{let}.%
% \fi%
%    \begin{macrocode}
\newcommand{\description@nss}[2]{\item[#1] \{#2\}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\assign}
% \changes{v061}{10/05/31}{enhanced the documentation and added some debug code}
% \changes{v-3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Einfache Anweisungen werden "uber \cs{assign} geschrieben. \cs{assign}
% kennt einen zwei Parameter: die H"ohe des Kastens (optional) und den Text,
% der die Aktion angibt. Die H"ohe des Kastens wird in \cs{param@nss} gespeichert.
% \else%
% Simple commands are written by \cs{assign}. \cs{assign} knows two
% parameters: the height of the box (optional) and the text, whichs
% describes the action. The height of the box gets stored in \cs{param@nss}.%
% \fi%
%    \begin{macrocode}
\def\assign{\let\next=\@assign\getoption}%
\def\@assign#1{%
  \dbgString@nss{Beginn \string\@assign}
  \dbgCoord@nss[Ursprung]{\x@nss}{\y@nss}
  \dbgCount@nss[Breite]{\xsize@nss}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Das Setzen einer Zuweisung enth"alt Schritte, die immer wieder
% auftreten. Deshalb werden diese Schritte an dieser Stelle genauer
% beschrieben.
%
% Der aktuelle Kasten wird mit einer Breite von \cs{xsize@nss} gesetzt, und
% der Text soll mit einer vern"unftigen Breite dahinein gesetzt werden. Nach
% Augenschein sehen R"ander von \(\frac{1}{12}\) der Gesamtbreite gut aus, somit
% nimmt der Text \(\frac{5}{6}\) der Gesamtbreite ein.
% \else%
% The following is repeated many times, so it is good to describe it one
% time. \cs{xsize@nss} ist the width of the box to be constructed now. The
% text of the action must be placed into the box with left and right
% margins. The width of one margin is \(\frac{1}{12}\) of the  current width,
% so the text covers \(\frac{5}{6}\) of the width.%
% \fi%
%    \begin{macrocode}
  \tempx@nss=\xsize@nss\divide\tempx@nss by 6%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Zuerst wird der Text behandelt, \ldots
% \else%
% At first the text ist formatted, \ldots{}%
% \fi%
%    \begin{macrocode}
  \set@nss{#1}{\tempx@nss}%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% dann wird die H"ohe der Box in \cs{tempy@nss} zwischengespeichert \ldots{}
% \else%
% the the height of the box gets intermediately stored in \cs{tempy@nss}, \ldots{}%
% \fi%
%    \begin{macrocode}
  \tempy@nss=\number\param@nss000%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% und als letztes wird der Kasten mit dem vorbereiteten Text gesetzt:
% \else%
% and at last the box with the previous prepared text gets set:%
% \fi%
%    \begin{macrocode}
  \block@nss{\tempy@nss}{1}%
  \dbgString@nss{Ende \string\@assign}
  \dbgCoord@nss[Ursprung]{\x@nss}{\y@nss}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sub}
% \changes{v-4.5a}{96/03/14}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Der Aufruf eines Unterprogrammes wird mit \cs{sub} gekennzeichnet:
% \else%
% The call of a subprogram is signed by \cs{sub}:%
% \fi%
%    \begin{macrocode}
\def\sub{\let\next=\@sub\getoption}
\def\@sub#1%
{%
  \@assign{#1}\tempx@nss=\xsize@nss\divide\tempx@nss by 20%
  \tempxx@nss=\x@nss\advance\tempxx@nss by \tempx@nss%
  \put(\tempxx@nss,\y@nss){\line(0,1){\ydepth@nss}}%
  \tempxx@nss=\x@nss\advance\tempxx@nss by \xsize@nss%
  \advance\tempxx@nss by -\tempx@nss%
  \put(\tempxx@nss,\y@nss){\line(0,1){\ydepth@nss}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\exit}
% \changes{v061}{10/05/31}{added missing translation}
% \changes{v-3.3c}{94/09/27}{Fehler mit der Breite korrigiert}
% \changes{v-2.5}{93/09/09}{"Anderungen an der Darstellung}
% \changes{v-2.0}{92/01/17}{Eingef"uhrt durch D. Rieger}
% \ifnum\language=\languageNGerman%
% Verlassen einer Schleife an einer bestimmten Stelle.
% \else%
% Leaving the loop at a certain point.%
% \fi%
%    \begin{macrocode}
\def\exit{\let\next=\@exit\getoption}
\def\@exit#1%
{%
    \tempx@nss=\xsize@nss\divide\tempx@nss by 6%
    \set@nss{#1}{\tempx@nss}%
    \tempy@nss=\number\param@nss000%
    \block@nss{\tempy@nss}{1}%
    \divide\ydepth@nss by 2%
    \advance\y@nss by \ydepth@nss%
    \ifnum\ydepth@nss<3500%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Eigene Gruppe bilden, um "Anderung an |\ydepth@nss| lokal zu halten
% \else%
% Build of an own group to keep change of |\ydepth@nss| local%
% \fi%
%    \begin{macrocode}
    {%
       \multiply\ydepth@nss by 2%
       \put(\x@nss,\y@nss){\line(2,1){\ydepth@nss}}%
       \put(\x@nss,\y@nss){\line(2,-1){\ydepth@nss}}%
    }%
    \else%
       \put(\x@nss,\y@nss){\line(1,1){\ydepth@nss}}%
       \put(\x@nss,\y@nss){\line(1,-1){\ydepth@nss}}%
    \fi%
    \advance\y@nss by-\ydepth@nss%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\return}
% \changes{v-4.5a}{96/03/14}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Die R"uckkkehr aus einem Unterprogramm wird mit \cs{return} gekennzeichnet:
% \else%
% The return from a subprogram is signed by \cs{return}:%
% \fi%
%    \begin{macrocode}
\def\return{\let\next=\@return\getoption}
\def\@return#1%
{%
    \tempy@nss=\number\param@nss000%
    \ifnum\tempy@nss<7000 \tempy@nss=7000 \fi%
    \set@nss{#1}{\tempy@nss} \block@nss{\tempy@nss}{1}%
    \divide\ydepth@nss by 2%
    \advance\y@nss by \ydepth@nss%
    \put(\x@nss,\y@nss){\line(1,1){\ydepth@nss}}%
    \put(\x@nss,\y@nss){\line(1,-1){\ydepth@nss}}%
    \tempx@nss=\x@nss\advance\tempx@nss by \xsize@nss%
    \put(\tempx@nss,\y@nss){\line(-1,1){\ydepth@nss}}%
    \put(\tempx@nss,\y@nss){\line(-1,-1){\ydepth@nss}}%
    \advance\y@nss by-\ydepth@nss%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\condindent@nss}
% \changes{v-4.1b}{95/07/19}{umbenannt von `w@rt@nss}
% \changes{v-4.0b}{95/05/08}{umbenannt von `w@rt}
% \begin{macro}{\index@nss}
% \changes{v-4.1b}{95/07/19}{umbenannt von `zaehler@nss}
% \changes{v-4.0b}{95/05/08}{umbenannt von `zaehler}
% \begin{macro}{\anzzeilen@nss}
% \changes{v-4.1b}{95/07/19}{umbenannt von `zeilen@nss}
% \changes{v-4.0b}{95/05/08}{umbenannt von `zeilen}
% \changes{v-3.1}{94/09/09}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\index@nss|, |\anzzeilen@nss| und |\condindent@nss| werden ben"otigt, um
% den Umbruch der Bedingung in einer \cs{if}-Abfrage geeignet durchf"uhren
% zu k"onnen:
% \begin{quote}
% \DeleteShortVerb{\|}
% \begin{tabular}{|l|p{6cm}|}\hline
% \verb-\index@nss- & ein Schleifenindex \\\hline
% \verb-\anzzeilen@nss- & die Anzahl von
% Zeilen, in die der Bedingungstext maximal zerlegt wird \\\hline
% \verb-\condindent@nss- & enth"alt den jeweiligen Wert des Einzugs, um den
% Bedingungstext an das Dreieck anzupassen \\\hline
% \end{tabular}
% \MakeShortVerb{\|}
%\end{quote}
% Die H"ohe der Zeilen wird bei der Berechnung mit 5mm angenommen.
% \else%
% |\index@nss|, |\anzzeilen@nss| and |\condindent@nss| are used for suitable
% making up of \cs{if}-conditions:
% |\index@nss| is a loopindex, |\anzzeilen@nss| gives the number of lines the
% conditioning text can be analyzed at most and |\condindent@nss| consists
% the value of insertion to adapt the conditioning text to the triangle.
% In this evaluation the height of lines is 5mm.%
% \fi%
%    \begin{macrocode}
\countdef\condindent@nss=232 \countdef\index@nss=233%
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\gindhelp@nss}
% \changes{v-7.0ba}{04/03/09}{umbenannt von `indhelp@nss}
% \begin{macro}{\indentmeasure@nss}
% \changes{v-5.3a}{98/11/27}{neu eingef"uhrt}
% \begin{macro}{\indentmeasureleft@nss}
% \changes{v-5.3a}{98/11/27}{neu eingef"uhrt}
% \begin{macro}{\thisindent@nss}
% \changes{v-5.3a}{98/11/27}{neu eingef"uhrt}
% \begin{macro}{\thisindentleft@nss}
% \changes{v-5.3a}{98/11/27}{neu eingef"uhrt}
% \begin{macro}{\thislength@nss}
% \changes{v-5.3a}{98/11/27}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Um die Textform (\cs{parshape}) an beliebige Steigungen anpassen zu k"onnen,
% sind einige Rechenoperationen mit Hilfsgr"o"sen erforderlich.
% Die folgenden |dimen|-Variablen wurden eingef"uhrt, um die Textform
% (\cs{parshape}) an beliebige Steigungen anpassen zu k"onnen, die Bedeutungen
% sind im einzelnen:
% \begin{quote}
% \DeleteShortVerb{\|}
% \begin{tabular}{|l|p{6cm}|}\hline
% \verb-\indentmeasure@nss-:     & Einheit des Einzugs (links)\\\hline
% \verb-\indentmeasureright@nss-:& Einheit des Einzugs (rechts) \\\hline
% \verb-\thisindent@nss-:        & aktueller Einzug (links) \\\hline
% \verb-\thisindentright@nss-:   & aktueller Einzug (rechts) \\\hline
% \verb-\thislength@nss-:        & L"ange der aktuellen Zeile, ergibt
%                                  sich aus der Zeilenl"ange \verb-\xsize@nss-
%                                  vermindert um \verb-\thisindent@nss-
%                                  und \verb-\thisindentright@nss-\\\hline
% \end{tabular}
% \MakeShortVerb{\|}
%\end{quote}
% |\gindhelp@nss| ist eine einfache Hilfsvariable zur tempor"aren Speicherung
% numerischer Werte.
% \else%
% |\gindhelp@nss| is a simple helper variable for storing a numerical value
% temporarily.%
% \fi%
%    \begin{macrocode}
\newdimen\indentmeasure@nss \newdimen\indentmeasureright@nss
\newdimen\thisindent@nss \newdimen\thisindentright@nss
\newdimen\thislength@nss
\countdef\gindhelp@nss=234
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ifthenelse@nss}
% \changes{v-8.0a}{04/07/13}{Paket \textsf{pict2e.sty} wird unterst"utzt}
% \changes{v-4.4a}{96/02/29}{Kommando intern gemacht, um benannt von `ifthenelse}
% \changes{v-4.1d}{95/10/04}{Tippfehler korrigiert}
% \changes{v-4.0d}{95/04/12}{Tippfehler korrigiert}
% \changes{v-3.1}{94/09/09}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\ifthenelse@nss| leitet eine einfache Verzweigung ein. Um Konflikte
% mit anderen Makropaketen zu vermeiden, wird eine Schreibweise benutzt,
% die auf Grund des Klammeraffens nicht direkt aufrufbar ist. Erst ein \cs{let}
% in der Definition der Umgebung |struktogramm| macht dieses Kommando aktiv.
% \else%
% |\ifthenelse@nss| introduces a simple branch. In order to avoid conflicts with
% other macro packages a style is used, which can't be directly called because
% of the at. Only a \cs{let} in the definition of environment |struktogramm|
% activates the command.%
% \fi%
%    \begin{macrocode}
\def\ifthenelse@nss{\let\next=\@ifthenelse@nss\getoption}
\def\@ifthenelse@nss#1#2#3#4#5{%
  \dbgString@nss{Beginn \string\@ifthenelse@nss}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die 5 Parameter sind:
% \else%
% The 5 parameters are:%
% \fi%
% \ifnum\language=\languageNGerman%
% \begin{enumerate}
%   \item Die Steigung (negativ, invers) des linken Zweiges,
%   \item die Steigung (positiv, invers) des rechten Zweiges,
%   \item die Bedingung, die getestet wird,
%   \item Fall des linken Zweiges ("ublicherweise "`ja"') und
%   \item Fall des rechten Zweiges ("ublicherweise "`nein"').
% \end{enumerate}
% \else%
% \begin{enumerate}
%   \item the gradient (negative, inverse) of the left branch,
%   \item the gradient (positive, inverse) of the right branch,
%   \item the condition, that is tested,
%   \item case of the left branch (normally "`yes"') and
%   \item case of the right branch (normally "`no"').
% \end{enumerate}%
% \fi%
% \ifnum\language=\languageNGerman%
% Als erstes werden die schr"agen Linien gezeichnet. |\tempx@nss| ist die
% Breite des linken Zweiges, |\tempxx@nss| die des rechten Zweiges.
% \else%
% First the slanting lines are drawn. |\tempx@nss| is the width of the left branch,
% |\tempxx@nss| the width of the right branch.%
% \fi%
%    \begin{macrocode}
  \ifanygradient
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Wenn \cs{anygradient} nicht wahr ist, werden schr"age Linien mit \cs{line}
% erzeugt. \cs{xx@nss} ist die Anzahl von Einheiten, in die aktuelle Breite
% zerlegt wird.
% \else%
% If \cs{anygradient} isn't true, the slanting lines are generated by
% \cs{line}. \cs{xx@nss} is the number of unit, into which the current
% width is divided.%
% \fi%
%    \begin{macrocode}
        \xx@nss=#1 \advance\xx@nss by #2%
        \ifnum\number\param@nss000>0%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% \cs{tempyy@nss} ist die H"ohe des "`Bedingungsvierecks"', \cs{tempx@nss}
% die linke und \cs{tempxx@nss} die rechte Breite.
% \else%
% \cs{tempyy@nss} is the height of the box including the condition,
% \cs{tempx@nss} it's left and \cs{tempxx@nss} it's right width.%
% \fi%
%    \begin{macrocode}
            \tempyy@nss=\number\param@nss000%
            \tempx@nss=\xsize@nss%
            \multiply\tempx@nss by #1 \divide\tempx@nss by \xx@nss%
            \tempxx@nss=\xsize@nss%
            \multiply\tempxx@nss by #2 \divide\tempxx@nss by \xx@nss%
        \else%
            \tempyy@nss=\xsize@nss \divide\tempyy@nss by \xx@nss%
            \tempx@nss=\tempyy@nss \multiply\tempx@nss by #1%
            \tempxx@nss=\tempyy@nss \multiply\tempxx@nss by #2%
        \fi%
        \xx@nss=\tempx@nss \advance\xx@nss by \x@nss%
        \tempy@nss=\y@nss \advance\tempy@nss by -\tempyy@nss%
        \ifemlines%
            \emline{\x@nss}{\y@nss}{}{\xx@nss}{\tempy@nss}{}%
        \else\ifcurves%
            \curve(\x@nss, \y@nss, \xx@nss, \tempy@nss)%
        \else\ifpictIIe%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die Steigungen d"urfen jetzt fast beliebige Werte annehmen, Z"ahler und
% Nenner m"ussen jedoch im Intervall \([-1000, 1000]\) liegen, die
% Skalierung mit dem Faktor 1000 muss daher wieder r"uckg"angig gemacht werden.
% \else%
% The slope arguments must lie in the intervall \([-1000, 1000]\), so scale
% them appropriately.%
% \fi%
%    \begin{macrocode}
            \tempyyy@nss=\tempyy@nss
            \divide\tempyyy@nss by 1000
            \tempxxx@nss=\tempx@nss
            \divide\tempxxx@nss by 1000
            \put(\x@nss,\y@nss){\line(\tempxxx@nss, -\tempyyy@nss){\tempx@nss}}
        \fi\fi\fi%
        \advance\x@nss by \xsize@nss%
        \ifemlines%
            \emline{\x@nss}{\y@nss}{}{\xx@nss}{\tempy@nss}{}%
        \else\ifcurves%
            \curve(\x@nss, \y@nss, \xx@nss, \tempy@nss)
        \else\ifpictIIe%
            \tempxxx@nss=\tempxx@nss
            \divide\tempxxx@nss by 1000
            \put(\x@nss,\y@nss){\line(-\tempxxx@nss, -\tempyyy@nss){\tempxx@nss}}
        \fi\fi\fi%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die Koordinaten werden auf die linke untere Ecke des
% "`Bedingungsrechteckes"' gesetzt:
% \else%
% The coordinates are set on the left lower angle of the "conditioning rectangle":%
% \fi%
%    \begin{macrocode}
     \advance\x@nss by -\xsize@nss \advance\y@nss by -\tempyy@nss%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Nun wird die Form des Bedingungstextes berechnet (vgl.
% \else%
% Now the form of the conditioning text will be calculated (cf.%
% \fi%
% \cite[Kap.~14, S.~101--102]{Knuth:TeXBook}):
%    \begin{macrocode}
    \tempy@nss=\tempyy@nss\divide\tempy@nss by 5000%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Wenn die H"ohe des "`Bedingungsrechteckes"' zu gering ist, muss dennoch
% eine Zeile hineingeschrieben werden, ansonsten f"uhrt \cs{parshape} zu einem
% Fehler.
% \else%
% If the height of the "`conditioning rectangle"' is too low, a line has to
% be written though. Otherwise \cs{parshape} causes a mistake.%
% \fi%
% \changes{v-8.0e}{05/05/17}{Fehlermeldung erweitert, nun auch Hinweis auf
% curves und pict2e}
%    \begin{macrocode}
    \ifnum\tempy@nss<1 \tempy@nss=1\fi%
    \indentmeasure@nss=\xsize@nss\unitlength%
    \gindhelp@nss=#1\advance\gindhelp@nss by #2%
    \divide\indentmeasure@nss by \gindhelp@nss%
    \indentmeasureright@nss = \indentmeasure@nss%
    \multiply\indentmeasure@nss by #1%
    \multiply\indentmeasureright@nss by #2%
    \divide\indentmeasure@nss by \tempyy@nss%
    \divide\indentmeasureright@nss by \tempyy@nss%
    \phantom{\vbox{\hsize=0pt\global\gindhelp@nss=\the\baselineskip}}%
    \multiply\gindhelp@nss by 360%
    \multiply\indentmeasure@nss by \gindhelp@nss%
    \multiply\indentmeasureright@nss by \gindhelp@nss%
    \xdef\shape{}\index@nss=0%
    \loop%
        \advance\index@nss by 1% %Zahl der Zeile
        \thisindent@nss=\indentmeasure@nss%
        \multiply\thisindent@nss by \index@nss%
        \advance\thisindent@nss by 0.175cm%
        \xdef\shape{\shape\the\thisindent@nss}%
        \thisindentright@nss=\indentmeasureright@nss%
        \multiply\thisindentright@nss by \index@nss%
        \advance\thisindentright@nss by 0.175cm%
        \thislength@nss=\xsize@nss\unitlength%
        \advance\thislength@nss by -\thisindent@nss
        \advance\thislength@nss by -\thisindentright@nss
        \xdef\shape{\shape\the\thislength@nss}%
        \ifnum\index@nss<\tempy@nss%
    \repeat%
  \else %\ifanygradient
    \ifnum\number\param@nss000>0%
      \typeout{struktex warning:}%
      \typeout{[...] not supplied without curves, emlines2, or pict2e}%
    \fi%
    \tempx@nss=#1 \advance\tempx@nss by #2%
    \tempyy@nss=\xsize@nss \divide\tempyy@nss by \tempx@nss%
    \tempx@nss=\tempyy@nss \multiply\tempx@nss by #1%
    \put(\x@nss,\y@nss){\line(#1,-1){\tempx@nss}}%
    \tempxx@nss=\tempyy@nss \multiply\tempxx@nss by #2%
    \advance\x@nss by \xsize@nss%
    \put(\x@nss,\y@nss){\line(-#2,-1){\tempxx@nss}}%
    \advance\x@nss by -\xsize@nss \advance\y@nss by -\tempyy@nss%
    \tempy@nss=\tempyy@nss\divide\tempy@nss by 5000%
    \ifnum\tempy@nss<1 \tempy@nss=1\fi%
    \xdef\shape{}\index@nss=0%
    \loop%
      \advance\index@nss by 1%
      \condindent@nss=#1\multiply\condindent@nss by\index@nss%
      \multiply\condindent@nss by 5000%
      \xdef\shape{\shape\the\condindent@nss\unitlength}%
      \condindent@nss=#1\advance\condindent@nss by #2%
      \multiply\condindent@nss by\index@nss%
      \multiply\condindent@nss by -5000%
      \advance\condindent@nss by \xsize@nss%
      \xdef\shape{\shape\the\condindent@nss\unitlength}%
      \ifnum\index@nss<\tempy@nss%
    \repeat%
  \fi %\ifanygradient
  \put(\x@nss,\y@nss){%
    \framebox(\xsize@nss,\tempyy@nss)[tl]{%
      \vbox{%
        \hsize=\xsize@nss\unitlength%
        \parshape=\tempy@nss \shape \c@nter@nss%
                                %dies sorgt f"ur den Einzug
        \noindent\vrule width0pt height12pt \relax #3%
                                %hier wird der Text ausgegeben
      }%
    }%
  }%
  \divide\tempyy@nss by 2%
  \xx@nss=\xsize@nss\advance\xx@nss by-\tempx@nss%
  \advance\xx@nss by-\tempxx@nss%
  \ifodd\xx@nss\advance\tempxx@nss by 1\fi%
  \divide\xx@nss by 2\advance\tempxx@nss by \xx@nss%
  \advance\tempx@nss by \xx@nss%
  \ifouter%
  \put(\x@nss,\y@nss){\makebox(\tempx@nss,\tempyy@nss)[l]{\hspace{1em}#4}}%
  \else%\outer
    \put(\x@nss,\y@nss){\makebox(\tempx@nss,\tempyy@nss){#4}}%
  \fi %\outer
  \xx@nss=\x@nss\advance\xx@nss by \tempx@nss%
  \ifouter%
    \put(\xx@nss,\y@nss){\makebox(\tempxx@nss,\tempyy@nss)[r]{#5\hspace{1em}}}%
  \else%\outer
    \put(\xx@nss,\y@nss){\makebox(\tempxx@nss,\tempyy@nss){#5}}%
  \fi %\outer
  \str@kt{\x@nss}{\y@nss}{\tempx@nss}%
  \dbgString@nss{Ende \string\@ifthenelse@nss}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\change}
% \changes{v-4.5b}{96/03/28}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% \cs{change} trennt die Zweige beim |\ifthenelse@nss|
% \else%
% \cs{change} seperates the branches in |\ifthenelse@nss|%
% \fi%
% \changes{v061}{10/05/31}{added debug code}
%    \begin{macrocode}
\def\change{%
  \dbgString@nss{\string\change}
    \endstr@kt\str@kt{\xx@nss}{\y@nss}{\tempxx@nss}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifend@nss}
% \changes{v-4.5b}{96/03/28}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\ifend@nss| beendet |\ifthenelse@nss|, wird in |struktogramm| intern
% gemacht.
% \else%
% |\ifend@nss| terminates |\ifthenelse@nss|, which is internally done in
% |struktogramm|.%
% \fi%
% \changes{v061}{10/05/31}{added debug code}
%    \begin{macrocode}
\def\ifend@nss{%
  \dbgString@nss{Beginn \string\ifend@nss}
  \global\gy@nss=\y@nss\endgroup\tempy@nss=\gy@nss%
  \ifnum\tempy@nss<\ydepth@nss%
    \y@nss=\tempy@nss\advance\ydepth@nss by-\tempy@nss%
    \put(\x@nss,\y@nss){%
      \framebox(\tempx@nss,\ydepth@nss){%
        \ifnum\ydepth@nss>5000\filler@nss\fi%
      }%
    }%
  \else%
    \ifnum\tempy@nss>\ydepth@nss%
      \y@nss=\ydepth@nss\advance\tempy@nss by-\ydepth@nss%
      \put(\xx@nss,\y@nss){%
        \framebox(\tempxx@nss,\tempy@nss){%
          \ifnum\tempy@nss>5000\filler@nss\fi%
        }%
      }%
    \else%
      \y@nss=\ydepth@nss%
    \fi%
  \fi%
  \dbgString@nss{Ende \string\ifend@nss}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\forloop@nss}
% \changes{v2.0a}{17/06/02}{introduced a generic name}
% \changes{v2.0}{17/06/02}{`forall: introduced loop over a set}
% \begin{macro}{\forloopend@nss}
% \changes{v2.0a}{17/06/02}{introduced a generic name}
% \changes{v2.0}{17/06/02}{`forallend: introduced loop over a set}
% \ifnum\language=\languageNGerman%
% Beginn und Ende einer Schleife, die "uber alle Elemente einer Menge
% l"auft. Die Beschreibung der Schleife wird als Parameter "ubergeben.
% \else%
% Begin and end of a loop which traverses all elements of a set. The
% description of the loop is passed as parameter.%
% \fi%
%    \begin{macrocode}
\def\forloop@nss{\let\next=\@forloop@nss\getoption}
\def\@forloop@nss#1{
  \def\argi{#1}
  \dbgString@nss{Beginn \string\@forloop}
  \tempx@nss=\xsize@nss
  \divide\tempx@nss by 6
  \ifx\argi\empty%
    \set@nss{\mbox{\rule{0mm}{2ex}}}{\tempx@nss}%
  \else%
    \set@nss{#1\hskip\xsize@nss\unitlength}{\tempx@nss}%
  \fi%
  \tempy@nss=\number\param@nss000
  \block@nss{\tempy@nss}{0}
  \advance\x@nss by \ydepth@nss
  \tempxx@nss=\xsize@nss
  \advance\tempxx@nss by -\ydepth@nss
  \tempy@nss=\ydepth@nss
  \str@kt{\x@nss}{\y@nss}{\tempxx@nss}
}
\def\forloopend@nss{
  \endstr@kt
  \advance\x@nss by-\tempy@nss
  \advance\ydepth@nss by -\tempy@nss
  \tempyy@nss=\ydepth@nss
  \ydepth@nss=-\ydepth@nss
  \advance\ydepth@nss by \y@nss
  \advance\ydepth@nss by \tempy@nss
  \y@nss=\tempyy@nss
  \put(\x@nss,\y@nss){\framebox(\xsize@nss,\ydepth@nss){}}
  \dbgString@nss{Ende \string\@forloop@nss}
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\forallin}
% \changes{v2.0b}{17/06/02}{renamed from `foreach: conflict with tikz}
% \changes{v2.0a}{17/06/02}{mapped the generic name onto the name for the user's interface}
% \begin{macro}{\forallinend}
% \changes{v2.0b}{17/06/02}{renamed from `foreach: conflict with tikz}
% \changes{v2.0a}{17/06/02}{mapped the generic name the name for onto the user's interface}
% \changes{v2.0a}{17/06/02}{introduced a generic name}
%    \begin{macrocode}
\let\forallin=\forloop@nss
\let\forallinend=\forloopend@nss
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\forever}
% \changes{v2.0a}{17/06/02}{mapped the generic name onto the name for the user's interface}
% \changes{v-3.5a}{94/11/22}{"ubernommen von J. Dietel}
% \changes{v-2.0}{92/01/17}{Eingef"uhrt durch D. Rieger}
% \begin{macro}{\foreverend}
% \changes{v2.0a}{17/06/02}{mapped the generic name onto the name for the user's interface}
% \changes{v-3.5a}{94/11/22}{"ubernommen von J. Dietel}
% \changes{v-2.0}{92/01/17}{Eingef"uhrt durch D. Rieger}
% \ifnum\language=\languageNGerman%
% Beginn und Ende einer Endlosschleife.
% \else%
% Begin and end of an endless loop%
% \fi%
%    \begin{macrocode}
\def\forever{\let\next=\@forever\getoption}
\def\@forever{%
  \@forloop@nss{}%
}
\let\foreverend=\forloopend@nss
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\dfr}
% \changes{v-4.5b}{96/03/28}{Beschreibung eingef"uhrt}
% \begin{macro}{\dfrend}
% \changes{v-4.5b}{96/03/28}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Aus Kompatibilit"atsgr"unden werden f"ur \cs{forever} und \cs{foreverend} noch
% die folgenden Abk"urzungen bereitgestellt.
% \else%
% For reasons of compatibility the following abbreviations for \cs{forever} and
% \cs{foreverend} are provided.%
% \fi%
%    \begin{macrocode}
\let\dfr\forever
\let\dfrend\foreverend
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\while}
% \begin{macro}{\whileend}
% \changes{v061}{10/05/31}{added missing translation and added debug code}
% \ifnum\language=\languageNGerman%
% Beginn und Ende einer kopfgesteuerten Schleife.
% \else%
% Begin and end of a loop with a pre test.%
% \fi%
%    \begin{macrocode}
\def\while{\let\next=\@while\getoption}
\def\@while#1{%
  \dbgString@nss{Beginn \string\@while}
  \dbgCond@nss{fixedindent@nss}
  \tempx@nss=\xsize@nss\divide\tempx@nss by 6
  \set@nss{#1\hskip\xsize@nss\unitlength}{\tempx@nss}
  \tempy@nss=\number\param@nss000 \block@nss{\tempy@nss}{0}
  \tempy@nss=\y@nss\advance\y@nss by \ydepth@nss
  \@ifthenelse{\boolean{fixedindent@nss}}{%
    \tempx@nss=\x@nss\advance\tempx@nss by \xindent@nss
    \tempxx@nss=\xsize@nss\advance\tempxx@nss by -\xindent@nss
  }{%
    \tempx@nss=\x@nss\advance\tempx@nss by \ydepth@nss
    \tempxx@nss=\xsize@nss\advance\tempxx@nss by -\ydepth@nss
  }
  \str@kt{\tempx@nss}{\tempy@nss}{\tempxx@nss}%
}
\def\whileend{%
  \endstr@kt\tempy@nss=\y@nss\advance\tempy@nss by-\ydepth@nss
  \y@nss=\ydepth@nss
  \put(\x@nss,\y@nss){\framebox(\xsize@nss,\tempy@nss){}}%
  \dbgString@nss{Ende \string\whileend}
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\until}
% \begin{macro}{\untilend}
% \ifnum\language=\languageNGerman%
% Beginn und Ende einer fu"sgesteuerten Schleife.
% \else%
% Begin and end of a loop with a post test.%
% \fi%
%    \begin{macrocode}
\def\until{\let\next=\@until\getoption}
\def\@until#1{\tempx@nss=\xsize@nss\divide\tempx@nss by 6
  \dbgString@nss{Beginn \string\@until}
  \dbgCoord@nss[Ursprung]{\x@nss}{\y@nss}
  \dbgCount@nss[Breite]{\xsize@nss}
  \set@nss{#1\hskip\xsize@nss\unitlength}{\tempx@nss}
  \tempy@nss=\number\param@nss000 \block@nss{\tempy@nss}{2}
  \@ifthenelse{\boolean{fixedindent@nss}}{%
    \advance\x@nss by \xindent@nss\tempxx@nss=\xsize@nss
    \advance\tempxx@nss by -\xindent@nss \tempy@nss=\ydepth@nss
    % \advance\x@nss by \xindent@nss\tempxx@nss=\xsize@nss
    % \advance\tempxx@nss by -\xindent@nss \tempy@nss=\ydepth@nss
  }{
    \advance\x@nss by \ydepth@nss\tempxx@nss=\xsize@nss
    \advance\tempxx@nss by -\ydepth@nss \tempy@nss=\ydepth@nss
  }
  \str@kt{\x@nss}{\y@nss}{\tempxx@nss}
}
\def\untilend{\endstr@kt%
  \advance\ydepth@nss by -\tempy@nss
  \tempyy@nss=\ydepth@nss\ydepth@nss=-\ydepth@nss%
  \advance\ydepth@nss by \y@nss
  \y@nss=\tempyy@nss
  \@ifthenelse{\boolean{fixedindent@nss}}{%
    \advance\x@nss by -\xindent@nss
    \put(\x@nss,\y@nss){\framebox(\xsize@nss,\ydepth@nss){}}
    \put(\x@nss,\y@nss){\makebox(\xsize@nss,\tempy@nss)
      {\box\TextBox@nss}}
  }{%
    \advance\x@nss by-\tempy@nss
    \put(\x@nss,\y@nss){\framebox(\xsize@nss,\ydepth@nss){}}
    \put(\x@nss,\y@nss){\makebox(\xsize@nss,\tempy@nss)
      {\box\TextBox@nss}}
  }%
  \dbgString@nss{Ende \string\untilend}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\cases@nss}
% \changes{v-7.0b}{2004/03/09}{ersetzt durch `tempxx@nss}
% \changes{v-4.2a}{95/10/06}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\cases@nss| wird ben"otigt, um die Anzahl der F"alle im linken Zweig
% des \cs{case}-Konstruktes berechnen zu k"onnen. |\cases@nss| nimmt entweder
% die Anzahl der F"alle oder die Anzahl der F"alle $-1$ an.
% \else%
% |\cases@nss| is needed for calculating the number of cases in the left branch of
% the \cs{case}-construct. |\cases@nss| assumes the value either the number of cases
% or the number of cases $-1$.%
% \fi%
% \end{macro}
%
% \begin{macro}{\case}
% \begin{macro}{\caseend}
% \begin{macro}{\switch}
% \changes{v-8.2a}{05/01/17}{Fehlerkorrektur: schr"age Linie endet nun an
% der richtigen Stelle (pict2e)}
% \changes{v-8.0d}{04/12/29}{Fehlerkorrektur: senkrechte Trennlinien haben
% nun die richtige L"ange}
% \changes{v-8.0a}{04/07/13}{Paket \textsf{pict2e.sty} wird unterst"utzt}
% \changes{v-4.2a}{95/10/04}{um \foreign{default}-Zweig erweitert}
% \changes{v-4.1d}{95/10/04}{Dokumentation verbessert}
% \changes{v-3.5a}{94/11/22}{"ubernommen von J. Dietel}
% \ifnum\language=\languageNGerman%
% \cs{case}, \cs{caseend} und \cs{switch} stellen eine Mehrfachverzweigung dar.
% Es sind derzeit noch die alten Versionen \cs{caseold}, \cs{caseoldend} und
% \cs{switchold} zus"atzlich enthalten, diese sollten in einer sp"ateren
% Version gestrichen werden.
% \else%
% \cs{case}, \cs{caseend} and \cs{switch} represent a multiple branch. At the moment
% the old versions \cs{caseold}, \cs{caseoldend} and \cs{switchold} are included in addition.
% These should be cancelled in a later version.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Der Makro hat vier Parameter:
% \begin{enumerate}
%   \item Die Steigung (negativ, invers) der schr"agen Linie,
%   \item die Anzahl der F"alle,
%   \item den Text der Bedingung und
%   \item den des ersten Falles
% \end{enumerate}
% Zus"atzlich gibt es einen optionalen vorangestellten Parameter, der es im
% Falle der Benutzung des \textsf{emlines2.sty} erm"oglicht, die schr"age
% Linie mit einer beliebigen Steigung zu zeichnen. Wird dieser Parameter
% genutzt, hat der erste Parameter eine ge"anderte Bedeutung: ist der
% Parameter eine gerade Zahl, wird die Schr"age gerade durchgezogen (kein
% \foreign{default}-Zweig), ansonsten wird der letzte Zweig als
% Standardfall angesehen und somit werden die Schr"agen entsprechend
% gezeichnet: die ersten $n-1$ F"alle werden im linken Zweig untergebracht,
% der $n$-te Fall wird im rechten Zweig abgehandelt, vgl. dazu auch die
% Abbildungen auf Seite~\pageref{case1} und \pageref{case2}.
% \else%
% The macro has four parameters:
% \begin{enumerate}
%   \item the gradient (negative, inverse) of a slanted line,
%   \item the number of cases,
%   \item the text of the condition and
%   \item the one of the first case
% \end{enumerate}
% Additionally there is an optional parameter placed in front. In the case
% of using of one of the packages \textsf{curves.sty},
% \textsf{emlines2.sty} or \textsf{pict2e.sty} this parameter enables
% drawing the slanted line with any gradient.  If this parameter is used,
% the first parameter has a different meaning: if the parameter is an even
% number, the slanted line will be drawn upright (no \foreign{default}
% branch), otherwise the last branch is regarded as standard case and so
% the slanted lines are drawn accordingly: the first \(n-1\) cases are put
% into the left branch, the \(n\)-th case is done in the right branch. For
% a better understanding see the figures on page~\pageref{case1} and
% \pageref{case2}.%
% \fi%
% \changes{v061}{10/05/31}{added debug code}
%    \begin{macrocode}
\def\case{\let\next=\@case\getoption}
\def\@case#1#2#3#4{%
  \dbgString@nss{Beginn \string\@case}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Merken der Anzahl der F"alle
% \else%
% memo of number of cases%
% \fi%
%    \begin{macrocode}
  \tempxx@nss=\number#2%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Zun"achst die schr"age Linie zeichnen
% \else%
% first drawing the slanted lines%
% \fi%
%    \begin{macrocode}
  \ifanygradient%
  %{%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% -- wenn \cs{anygradient} nicht wahr ist, werden schr"age Linien mit \cs{line}
% erzeugt,
% \else%
% -- if \cs{anygradient} isn't true, the slanted lines are generated by
% \cs{line},%
% \fi%
%    \begin{macrocode}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% wobei die H"ohe des Rahmens f"ur die Fallunterscheidungen aus seiner
% Breite und der vorgegebenen Steigung berechnet wird --,
% \else%
% where the height of frame for the different cases is evaluated from
% the width and the given gradient --,%
% \fi%
%    \begin{macrocode}
        \ifnum\number\param@nss000>0
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Wenn die H"ohe des Rahmens vorgegeben ist, nimm diese, ansonsten berechne
% sie wie oben.
% \else%
% If the height of the frame is given, take it, otherwise calculate it like above.%
% \fi%
%    \begin{macrocode}
            \tempyy@nss=\number\param@nss000%
            \ifodd\number#1
                \advance\tempxx@nss by -1
            \fi
        \else
            \tempyy@nss=\xsize@nss
            \divide\tempyy@nss by #1
        \fi
        \ifnum\number#2=\tempxx@nss
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% \cs{tempxx@nss} ist unver"andert, es wird also die Diagonale (gerade
% Linie) gezeichnet. Die Berechnung der Koordinaten basiert auf:
% \begin{quote}
%     \begin{tabular}{r@{:~}l}
%         \cs{x@nss} & linke obere x-Koordinate des Kastens\\
%         \cs{y@nss} & linke obere y-Koordinate des Kastens\\
%         \cs{xsize@nss} & Breite des Kastens\\
%         \cs{tempyy@nss} & H"ohe des Kastens\\
%         \cs{tempxx@nss} & Anzahl der F"alle (evtl. reduziert um 1)\\
%     \end{tabular}
% \end{quote}
% \else%
% \cs{tempxx@nss} is unchanged, therefore we draw a diagonal. The internal
% computation bases on
% \begin{quote}
%     \begin{tabular}{r@{:~}l}
%         \cs{x@nss} & left upper x-coordinate of the case box\\
%         \cs{y@nss} & left upper y-coordinate of the case box\\
%         \cs{xsize@nss} & width of the case box\\
%         \cs{tempyy@nss} & height of the case box\\
%         \cs{tempxx@nss} & number of cases (maybe reduced by 1)\\
%     \end{tabular}
% \end{quote}%
% \fi%
%    \begin{macrocode}
            \xx@nss=\x@nss \advance\xx@nss by \xsize@nss
            \tempy@nss=\y@nss \advance\tempy@nss by -\tempyy@nss
            \ifemlines%
                \emline{\x@nss}{\y@nss}{}{\xx@nss}{\tempy@nss}{}%
            \else\ifcurves%
                \curve(\x@nss, \y@nss, \xx@nss, \tempy@nss)%
            \else\ifpictIIe%
                \tempxxx@nss=\xx@nss
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die Argumente von \cs{line} f"ur die Steigung m"ussen im Intervall
% \([-1000, 1000]\) liegen, daher
% wird hier der Faktor 1000 wieder wegdividiert. Abschlie"send wird die
% L"ange der Strecke berechnet.
% \else%
% The arguments of \cs{line} for the slope must be in the interval
% \([-1000, 1000]\), so divide by
% the previous introduced factor of 1000. Finally we're computing the
% length of the line.%
% \fi%
%    \begin{macrocode}
                \advance\tempxxx@nss by -\x@nss
                \divide\tempxxx@nss by 1000
                \tempyyy@nss=\tempy@nss
                \advance\tempyyy@nss by -\y@nss
                \divide\tempyyy@nss by 1000
                \advance\xx@nss by -\x@nss
                \put(\x@nss,\y@nss){\line(\tempxxx@nss, \tempyyy@nss){\xx@nss}}
            \fi\fi\fi%
        \else
            \tempx@nss=\xsize@nss
            \multiply\tempx@nss by \tempxx@nss \divide\tempx@nss by #2
            \xx@nss=\x@nss \advance\xx@nss by \tempx@nss
            \tempy@nss=\y@nss \advance\tempy@nss by -\tempyy@nss
            \ifemlines%
                \emline{\x@nss}{\y@nss}{}{\xx@nss}{\tempy@nss}{}%
            \else\ifcurves%
                \curve(\x@nss, \y@nss, \xx@nss, \tempy@nss)%
            \else\ifpictIIe%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die Berechnung der L"ange muss lokal sein, darum wird hier eine eigene
% Gruppe eingef"uhrt anstatt die letzte Subtraktion r"uckg"angig zu machen.
% \else%
% The calculation of the length of the line must be local, so we're using a
% group here---instead of undoing the \cs{advance} operation.%
% \fi%
%    \begin{macrocode}
                \begingroup
                    \tempxxx@nss=\xx@nss
                    \advance\tempxxx@nss by -\x@nss
                    \divide\tempxxx@nss by 1000
                    \tempyyy@nss=\tempy@nss
                    \advance\tempyyy@nss by -\y@nss
                    \divide\tempyyy@nss by 1000
                    \advance\xx@nss by -\x@nss
                    \put(\x@nss,\y@nss){\line(\tempxxx@nss,
                        \tempyyy@nss){\xx@nss}}
                \endgroup
            \fi\fi\fi%
            \advance\x@nss by \xsize@nss
            \ifemlines%
                \emline{\x@nss}{\y@nss}{}{\xx@nss}{\tempy@nss}{}%
            \else\ifcurves%
                \curve(\x@nss, \y@nss, \xx@nss, \tempy@nss)%
            \else\ifpictIIe%
                \tempxxx@nss=\x@nss
                \advance\tempxxx@nss by -\xx@nss
                \divide\tempxxx@nss by 1000
                \tempyyy@nss=\tempy@nss
                \advance\tempyyy@nss by -\y@nss
                \divide\tempyyy@nss by 1000
                \xx@nss=-\xx@nss
                \advance\xx@nss by \x@nss
                \put(\x@nss,\y@nss){\line(-\tempxxx@nss, \tempyyy@nss){\xx@nss}}
            \fi\fi\fi%
            \advance\x@nss by -\xsize@nss
        \fi
    %}{
    \else% \ifanygradient
        \ifnum\number\param@nss000>0
            \typeout{struktex warning:}%
            \typeout{[...] not supplied without curves, emlines2, or pict2e}%
        \fi
        \put(\x@nss,\y@nss){\line(#1,-1){\xsize@nss}}
        \tempyy@nss=\xsize@nss
        \divide\tempyy@nss by #1
    %}
    \fi% \ifanygradient
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% dann den Bedingungstext in die Mitte des rechten oberen Viertels des
% CASE-Rechtecks  schreiben,
% \else%
% then the conditioning text writing into the middle of the upper quarter of
% CASE-rectangle%
% \fi%
% \changes{v-8.0e}{05/05/17}{`tempxxx@nss umbenannt in `tempxx@nss (wir
% befinden uns nicht im Fall pictIIe)}
% \changes{v-8.0f}{05/06/12}{`tempxx@nss umbenannt in `tempx@nss (die Anzahl
% der F"alle wurde versehentlich ge"andert)}
%    \begin{macrocode}
    \tempx@nss=\xsize@nss
    \divide\tempx@nss by 2
    \divide\tempyy@nss by 2
    \advance\x@nss by \tempx@nss
    \advance\y@nss by -\tempyy@nss
    \put(\x@nss,\y@nss){\makebox(\tempx@nss,\tempyy@nss){#3}}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% schlie"slich |\x@nss| und |\y@nss| auf den alten Wert zuruecksetzen und
% zur sp"ateren Verwendung merken.
% \else%
% finally setting |\x@nss| and |\y@nss| on the old value and remembering for later
% use%
% \fi%
%    \begin{macrocode}
    \advance\x@nss by -\tempx@nss
    \advance\y@nss by \tempyy@nss
    \xx@nss=\x@nss
    \yy@nss=\y@nss
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% |\tempx@nss| ist die Breite eines Zweiges, die f"ur alle Zweige gleich ist
% -- Gesamtbreite geteilt durch Anzahl der F"alle --,
% |\tempy@nss| die H"ohe des Falltextes, die von Zweig zu Zweig kleiner wird,
% |\condindent@nss| ist die Schrittweite, um die sich die H"ohe des
% Falltextes bei jedem \cs{switch} verringert. H"ohe und Schrittweite h"angen
% davon ab, ob ein \foreign{default}-Zweig eingef"uhrt wurde oder nicht, sie
% werden demzufolge durch |\tempxx@nss| gesteuert.
% \else%
% |\tempx@nss| is the width of the branch, that is equal for all
% branches---total width divided by number of cases---,
% |\tempy@nss| is the height of the text of case, that decreases from one case
% to the other, |\condindent@nss| is the step size the height of the text of
% case decreases with each \cs{switch}. Height and step size depend on wether
% or not a \foreign{default}-branch is introduced. Accordingly they are controled by
% |\tempxx@nss|.%
% \fi%
%    \begin{macrocode}
    \tempx@nss=\xsize@nss
    \divide\tempx@nss by #2
    \ifnum\number\param@nss000>0
        \tempy@nss=\number\param@nss000%
    \else
        \tempy@nss=\xsize@nss
        \divide\tempy@nss by #1
    \fi
    \condindent@nss=\tempy@nss
    \divide \condindent@nss by \tempxx@nss
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Links oben im linken Zweig den Text des Falles eintragen
% \else%
% Entering the text of case into the left upper part of left branch%
% \fi%
% \changes{v061}{10/05/31}{enhanced the documentation}
%    \begin{macrocode}
    \advance\y@nss by -\tempy@nss
    \put(\x@nss,\y@nss)%
    {%
        \makebox(\tempx@nss,\tempy@nss)[lb]{\raise3pt\hbox{~#4}}%
    }%
% \ifnum\language=\languageNGerman%
% Links oben im linken Zweig den Text des Falles eintragen
% \else%
% To find out the full height of the different cases, we start with a large
% value \cs{ydepth@nss}, which gets smaller by the settings of each
% case. Then the overall group gets opened, this group is closed in \cs{?}%
% \fi%
    \ydepth@nss=1000000%
    \str@kt{\x@nss}{\y@nss}{\tempx@nss}%
    \dbgString@nss{Ende: \string\@case}
    \dbgCoord@nss[Ursprung]{\x@nss}{\y@nss}
    \dbgCount@nss[Breite]{\tempx@nss}
}
%    \end{macrocode}
%
% \ifnum\language=\languageNGerman%
% Der Makro \cs{switch} f"ur die einzelnen F"alle hat zwei Parameter:
% \begin{enumerate}
% \item einen optionalen Parameter, der angibt, wo der Text der Bedingung
% gesetzt wird: |l| oder |r| -- der Standardwert ist |l| --, und
% \item den Bedingungstext
% \end{enumerate}
% \else%
% The macro \cs{switch} for the single cases has two parameters:
% \begin{enumerate}
% \item an optional parameter, which specifies, where the text of condition is set:
% |l| or |r| -- the default value is |l|, and
% \item the text of condition
% \end{enumerate}%
% \fi%
% \changes{v061}{10/05/31}{added debug code and enhanced the documentation}
%    \begin{macrocode}
\def\switch{%
    \@ifnextchar [{\@switch}{\@switch[l]}%
}
\def\@switch[#1]#2{%
  \dbgString@nss{Beginn \string\@switch}
    \global\gy@nss=\y@nss\endgroup
    \tempyy@nss=\gy@nss
    \ifnum\tempyy@nss<\ydepth@nss
        \ydepth@nss=\tempyy@nss
    \fi
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Nun in den n"achsten Zweig gehen und die Falltexth"ohe vermindern.
% \else%
% Now continuing in the next branch and reducing the height of text of case.%
% \fi%
%    \begin{macrocode}
    \advance\x@nss by \tempx@nss
    \advance\tempy@nss by -\condindent@nss
    \put(\x@nss,\y@nss)%
            {\makebox(\tempx@nss,\tempy@nss)[#1b]{\raise3pt\hbox{~#2~}}}
    \str@kt{\x@nss}{\y@nss}{\tempx@nss}
}
\def\caseend{%
  \dbgString@nss{Ende: \string\caseend}
  \global\gy@nss=\y@nss\endgroup
  \tempyy@nss=\gy@nss
  \ifnum\tempyy@nss<\ydepth@nss
    \ydepth@nss=\tempyy@nss
  \fi
  \x@nss=\xx@nss
  \y@nss=\ydepth@nss
  \tempyy@nss=\yy@nss
  \advance\tempyy@nss by -\ydepth@nss
  \put(\x@nss,\y@nss){\framebox(\xsize@nss,\tempyy@nss){}}
  \tempxx@nss=\x@nss
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die folgende Schleife ist daf"ur zust"andig, die Trennlinien zwischen den
% Falltexten zu ziehen. Die erste Trennlinie steht nach dem ersten Block.
% \else%
% The following loop is to draw the partitioning lines between the texts of
% cases. The first partitioning line occurs after the first block.%
% \fi%
%    \begin{macrocode}
  \dbgCount@nss[width?]{\xsize@nss}
  \loop
    \dbgString@nss{draw vertical line}
    \dbgCoord@nss[Ursprung]{\tempxx@nss}{\y@nss}
    \dbgCount@nss[Laenge]{\tempyy@nss}
    \advance\tempyy@nss by -\condindent@nss
    \advance\tempxx@nss by \tempx@nss
    \put(\tempxx@nss,\y@nss){\line(0,1){\tempyy@nss}}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die Schleife endet vor dem letzten Block, deshalb wird der Z"ahler um die
% Blockbreite vor dem Test erh"oht. Zus"atzlich wird ein kleiner Wert (100)
% addiert, um Rundungsfehler der Integer-Arithmetik auszugleichen.
% \else%
% The loop ends just before the last block, so we advance the counter by
% the width of a block before the test. Also a small value is added to
% compensate rounding errors of the integer arithmetic.%
% \fi%
%    \begin{macrocode}
    \xx@nss=\tempxx@nss
    \advance\xx@nss by -\x@nss
    \advance\xx@nss by \tempx@nss
    \advance\xx@nss by 100
    \dbgCount@nss[loop control]{\xx@nss}
    \dbgCount@nss[compare to]{\xsize@nss}
    \ifnum \xx@nss<\xsize@nss
  \repeat
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \changes{v-9.1}{10/01/17}{added stubs for the implementation of `inparallel, `task, and `inparallelend}
% \begin{macro}{\inparallel}
%     \changes{v065}{10/06/07}{added some german translations}
%     \changes{v061}{10/05/31}{enhanced the documentation and added debug code}
%     \changes{v-9.1}{10/01/17}{added}
% \begin{macro}{\inparallelend}
%     \changes{v-9.1}{10/01/17}{added} \ifnum\language=\languageNGerman%
%     \cs{inparallel} und \cs{inparallelend} stellen Start und Ende
%     paralleler Tasks dar.
%
%     Der Makro \cs{inparallel} hat drei Parameter:
%     \begin{enumerate}
%       \item die optionale H"ohe des Blocks (diese H"ohe dient als gemeinsame
%         H"ohe der parallelen Tasks)
%       \item die Anzahl der parallelen Tasks
%       \item die Beschreibung der ersten Task
%     \end{enumerate}
%     Die Implementation folgt den "ublichen Regeln: zuerst wird die
%     optionale H"ohe verarbeitet, so wird sie in \cs{param@nss} gespeichert
%     (wenn der optional Parameter fehlt, wird \cs{param@nss} zu 0
%     gesetzt). %
%     \else%
%     \cs{inparallel} and \cs{inparallelend} represent start and end of
%     parallel tasks.
%
%     The macro \cs{inparallel} has three parameters:
%     \begin{enumerate}
%       \item the optional height of the block (this height is used as a
%         base for the height of the parallel tasks)
%       \item the number of parallel tasks
%       \item the description of the first task
%     \end{enumerate}
%     The implementation follows the common rules: first we process the
%     optional height, in this way it is stored in \cs{param@nss} (if the
%     optional parameter is missing, \cs{param@nss} has a value of 0). %
%     \fi
%    \begin{macrocode}
\def\inparallel{\let\next=\@inparallel\getoption}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Damit braucht \cs{@inparallel} nur zwei Parameter zu verwalten: %
% \else%
% So \cs{@inparallel} needs to manage only two parameters: %
% \fi
%    \begin{macrocode}
\def\@inparallel#1#2{%
  \dbgString@nss{Beginn \string\@inparallel}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Die Schritte zum Zeichnens des Kastens sind:
% \begin{enumerate}
%   \item Berechnen der H"ohe der einzelnen Tasks: %
% \else%
% The steps to draw the box are as follows:
% \begin{enumerate}
%   \item Calculate the intended height of the tasks:
% \fi%
%    \begin{macrocode}
\tempyy@nss=\number\param@nss000%
%    \end{macrocode}
% \item %
%   \ifnum\language=\languageNGerman%
%   Zeichnen der gestrichelten Linien zu Beginn des Blocks; das muss in
%   einer eigenen Gruppe geschehen, da der aktuelle Wert von \cs{y@nss}
%   sp"ater noch gebraucht wird.
%
%   Die aktuelle Startposition des Blocks is |(\x@nss, \y@nss)|, die Breite
%   ist \cs{xsize@nss}, um die Anzahl \cs{tempxx@css} der Striche in der
%   gestrichelten Linie zu bestimmen, wird die Breite durch 3000 geteilt
%   (zweimal die L"ange eines Striches). %
%   \else %
%   Draw the two dashed lines at the top; this must happen in a group of
%   its own, because we need the current \cs{y@nss} later on.
%
%   The current starting position is |(\x@nss, \y@nss)|, the width is
%   \cs{xsize@nss}, first divide the width by 3000 (two times the length of
%   a dash) to get the number \cs{tempxx@css} of dashes for the dashed
%   line. %
%   \fi%
%    \begin{macrocode}
\dbgCoord@nss[Ursprung inparallel]{\x@nss}{\y@nss}
\dbgMark@nss{\x@nss}{\y@nss}
\tempxx@nss=\xsize@nss
\advance\tempxx@nss by 1500% prevent rounding errors
\divide\tempxx@nss by 3000%
\dbgCount@nss[Number of dashes]{\tempxx@nss}
\yy@nss=\y@nss\advance\yy@nss by -2000%
\dbgCoord@nss[draw top dashed line, origin]{\x@nss}{\yy@nss}
\dbgCount@nss[length based on]{\xsize@nss}
\multiput(\x@nss,\yy@nss)(3000, 0){\tempxx@nss}{\line(1,0){1500}}%
\advance\yy@nss by -2000%
\multiput(\x@nss,\yy@nss)(3000, 0){\tempxx@nss}{\line(1,0){1500}}%
%    \end{macrocode}
% \item %
%   \ifnum\language=\languageNGerman%
%   Berechnen der (gemeinsamen) Breite aller parallelen Tasks (Gesamtbreite
%   geteilt durch die Anzahl der Tasks). Zus"atzlich wird die Breite der
%   beschreibenden Texte f"ur alle Tasks berechnet; sie betr"agt
%   \(\frac{5}{6}\) der Breite einer Task. %
%   \else%
%   Calculate the (common) width of all parallel tasks (total width
%   divided by number of tasks). Additionally we calculate the text width
%   for all tasks, which is \(\frac{5}{6}\) of the task. %
%   \fi%
%    \begin{macrocode}
\xx@nss=\x@nss%
\advance\xx@nss by \xsize@nss%
\divide\xsize@nss by #1%
\tempx@nss=\xsize@nss\divide\tempx@nss by 6%
%    \end{macrocode}
% \item %
%   \ifnum\language=\languageNGerman%
%   Zeichnen der verschiedenen parallelen Tasts (z.\,Zt. besteht eine Task
%   nur aus einer Aktion, wenn sie aus mehreren Aktionen best"ande,
%   m"ussten diese durch horizontale Linien getrennt werden, dies k"onnte
%   zu einem sp"ateren Zeitpunkt implementiert werden). Die erste Task wird
%   hier gezeichnet, weitere Tasks werden mit dem Makro \cs{task}
%   gezeichnet. %
%   \else%
% \item Draw the several parallel tasks (the tasks may consist of several
%   actions each, if that's the case, they must be divided by horizontal
%   lines, but that isn't implemented for now). The first task is drawn
%   here, further tasks are drawn by the command \cs{task}. %
%   \fi%
%    \begin{macrocode}
\begingroup
\y@nss=\yy@nss%
\dbgCoord@nss[Ursprung Task 1]{\x@nss}{\y@nss}
\set@nss{#2}{\tempx@nss}%
\dbgCount@nss[optionale Hoehe der Task]{\tempyy@nss}
\block@nss{\tempyy@nss}{0}%
\tempyy@nss=\TextBoxHt@nss%
\dbgCount@nss[Hoehe der Task]{\tempyy@nss}
%    \end{macrocode}
% \end{enumerate}
%    \begin{macrocode}
}
%    \end{macrocode}
% \end{macro}
% \ifnum\language=\languageNGerman%
% Und nun zur Implementation von \cs{inparallelend}: nach ein paar
% Initialisierungsschritten \ldots{} %
% \else%
% And now for the implementation of \cs{inparallelend}: after some
% initialization steps \ldots{} %
% \fi%
% \changes{v074}{10/06/08}{corrected the calculation of the surrounding box}
% \changes{v061}{10/05/31}{added some documentation}
%    \begin{macrocode}
\def\inparallelend{%
  \dbgString@nss{Beginn \string\@inparallelend}
  \dbgCoord@nss[Endkoordinate]{\x@nss}{\y@nss}
  \global\tempy@nss=\y@nss%
  \global\tempyy@nss=\tempyy@nss%
  \endgroup
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% \ldots{} m"ussen
% \begin{enumerate}
%   \item die senkrechten Linien gezeichnet werden, um die einzelnen Tasks
%   sichtbar abzugrenzen (die Linien m"ussen so lang wie die "`l"angste"' Task
%   sein):  die linke x-Koordinate des Kastens ist \cs{x@nss}, die rechte
%   \cs{xx@nss}, die Gesamtbreite wird auf \#4  -- in
%     \cs{inparallel} gesetzt --Tasks aufgeteilt, somit ist die Breite
%     zwischen zwei Linien \cs{xsize@nss}.
%     Es gibt \(\#4-1\) Linien, damit beginnt die Schleife zum Zeichnen der
%     Linien an der Position
%     \(\cs{x@nss}+\cs{xsize@nss}\) und sie endet an der Position
%     \(\cs{xx@nss}-\frac{\cs{xsize@nss}}{2}\) um Rundungsfehler zu vermeiden. %
% \else%
% \ldots{} we have to
% \begin{enumerate}
%   \item draw the vertical lines to divide the several tasks visual (the
%     lines must be as long as the "longest"{} sequence of actions): the
%     block's left side is given by \cs{x@nss}, it's right side by
%     \cs{xx@nss}, it is divided into \#4 parts---used in
%     \cs{inparallel}---so the width between the lines is \cs{xsize@nss}.
%     There must be \(\#4-1\) lines, so the loop starts at
%     \(\cs{x@nss}+\cs{xsize@nss}\) and it ends at
%     \(\cs{xx@nss}-\frac{\cs{xsize@nss}}{2}\) to avoid rounding errors. %
%     \fi%
%    \begin{macrocode}
\begingroup%
\dbgCoord@nss[left and right limits]{\x@nss}{\xx@nss}
\dbgCount@nss[step size]{\xsize@nss}
\tempx@nss=\xsize@nss%
\divide\tempx@nss by 2%
\advance\xx@nss by -\tempx@nss%
\tempx@nss=\x@nss%
\loop%
\dbgString@nss{draw vertical line}
\advance\tempx@nss by \xsize@nss%
\dbgCoord@nss[Ursprung]{\tempx@nss}{\tempy@nss}
\dbgCount@nss[Laenge]{\tempyy@nss}
\put(\tempx@nss,\tempy@nss){\line(0,1){\tempyy@nss}}%
\tempxx@nss=\tempx@nss%
\advance\tempxx@nss by \xsize@nss%
\dbgCount@nss[loop control]{\tempxx@nss}
\dbgCount@nss[compare to]{\xx@nss}
\ifnum \tempxx@nss<\xx@nss%
\repeat
\endgroup
%    \end{macrocode}
% \item %
%   \ifnum\language=\languageNGerman%
%   Zeichnen der gestrichelten Linien am Ende des Kastens, \else%
%   draw the two dashed lines at the bottom, %
%   \fi %
%    \begin{macrocode}
\dbgCoord@nss[draw bottom, origin]{\x@nss}{\tempy@nss}
\multiput(\x@nss,\tempy@nss)(3000, 0){\tempxx@nss}{\line(1,0){1500}}%
\advance\tempy@nss by -2000%
\multiput(\x@nss,\tempy@nss)(3000, 0){\tempxx@nss}{\line(1,0){1500}}%
%    \end{macrocode}
% \item %
%   \ifnum\language=\languageNGerman%
%   Zeichnen eines Kastens um alle zuvor gezeichneten Elemente. %
%   \else %
%   draw a box around all the previous drawn elements.  \fi %
% \end{enumerate}
%    \begin{macrocode}
\advance\tempy@nss by -2000%
\dbgCount@nss{\tempyy@nss}
\advance\tempyy@nss by 8000%
\advance\xx@nss by -\x@nss%
\dbgCoord@nss[Breite, Hoehe]{\xx@nss}{\tempyy@nss}
\put(\x@nss,\tempy@nss){\framebox(\xx@nss,\tempyy@nss){}}%
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% In einem letzten Schritt werden \cs{y@nss} und \cs{xsize@nss} in den
% global genutzten Registern abgelegt: %
% \else%
% In a last step \cs{y@nss} and \cs{xsize@nss} are stored into the
% registers which are used globally: %
% \fi%
%    \begin{macrocode}
\xsize@nss=\xx@nss%
\y@nss=\tempy@nss%
\dbgCoord@nss[Endkoordinate inparallel]{\x@nss}{\y@nss}
\dbgCount@nss[Breite]{\xsize@nss}
\dbgString@nss{Ende \string\@inparallelend}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\task}
%     \changes{v061}{10/05/31}{implemented the macro}
%     \changes{v-9.1}{10/01/17}{added}
%     \ifnum\language=\languageNGerman%
%     Der Makro \cs{task} definiert die parallelen
%     Tasks, er hat zwei Parameter:
%     \begin{enumerate}
%       \item die optionale H"ohe der Task (dies kann die optionale H"ohe des
%       umgebenden Blocks "uberschreiben)
%       \item die Beschreibung der Task
%     \end{enumerate}
%     \else%
%     \cs{task} defines the parallel tasks, it has two parameters:
%     \begin{enumerate}
%       \item the optional height of the task (this may overwrite the
%       optional height of the surrounding block)
%       \item the description of the task
%     \end{enumerate}
% \fi%
%     \begin{macrocode}
\def\task{\let\next=\@task\getoption}
\def\@task#1{%
  \dbgString@nss{Beginn \string\@task}
  \advance\x@nss by \xsize@nss%
  \y@nss=\yy@nss%
  \dbgCoord@nss[Ursprung parallele Task]{\x@nss}{\y@nss}
  \set@nss{#1}{\tempx@nss}%
  \ifnum\number\param@nss000>\tempyy@nss%
    \tempyy@nss=\number\param@nss000%
  \fi%
  \dbgCount@nss[Hoehe parallele Task]{\tempyy@nss}
  \block@nss{\tempyy@nss}{0}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\centerNss}
% \begin{macro}{\endcenterNss}
% \changes{v-4.5d}{97/03/19}{`CenterBox@nss global gemacht}
% \changes{v-3.3e}{94/09/09}{`centerline durch `strut`hfill ... ersetzt}
% \changes{v-3.3e}{94/09/09}{`TmpBox umbenannt in `nss@CenterBox}
% \changes{v-3.1a}{94/09/09}{aus \textsf{JHfMakro.STY} "ubernommen}
% \changes{v-3.1b}{94/09/09}{erheblich vereinfacht}
% \ifnum\language=\languageNGerman%
% Makro zur Zentrierung von Struktogrammen: da einfaches Zentrieren mit
% \cs{centering} nicht funktioniert, wird mit \cs{centerline} gearbeitet:
% \else%
% Macro for centering the structured box chart: since simple centering with
% \cs{centering} does'nt work, it is worked with \cs{centerline}:%
% \fi%
%    \begin{macrocode}
\newbox\CenterBox@nss%
\def\centernss{%
    \begin{trivlist}%
    \item[] \strut%
        \setbox\CenterBox@nss=\hbox%
                              \bgroup%
}
\def\endcenternss{%
                              \egroup%
        \strut\hfill\box\CenterBox@nss\hfill\strut%
    \end{trivlist}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\CenterNssFile}
% \changes{v-4.5d}{97/03/19}{Belegen von `CenterBox@nss in das `item verlegt}
% \changes{v-3.3e}{94/09/09}{`centerline durch `strut`hfill ... ersetzt}
% \changes{v-3.3e}{94/09/09}{Auf zus"atzliche Gruppe um `trivlist verzichtet}
% \changes{v-3.3e}{94/09/09}{`TmpBox umbenannt in `nss@CenterBox}
% \changes{v-3.1a}{94/09/09}{aus \textsf{JHfMakro.STY} "ubernommen}
% \changes{v-3.1b}{94/09/09}{erheblich vereinfacht}
% \ifnum\language=\languageNGerman%
% Makro zur Zentrierung von Struktogrammen: da einfaches Zentrieren mit
% \cs{centering} nicht funktioniert, wird mit \cs{centerline} gearbeitet:
% \else%
% Macro for centering the structured box charts: since simple centering with
% \cs{centering} does'nt work, it is worked with \cs{centerline}:%
% \fi%
%    \begin{macrocode}
\def\CenterNssFile#1{%
    \begin{trivlist}%
        \item[] \setbox\CenterBox@nss=\hbox{\input{#1.nss}}%
        \strut\hfill\box\CenterBox@nss\hfill\strut%
    \end{trivlist}%
}
\let\centernssfile=\CenterNssFile
%    \end{macrocode}
% \end{macro}
%
% \subsection{\ifnum\language=\languageNGerman Zus"atzliche Makros
% (Verifikation) \else Additional macros (verification)\fi}
%
% \begin{macro}{\assert}
% \changes{v-7.0a}{04/01/04}{neu eingef"uhrt}
% \begin{macro}{\assert@nss}
% \changes{v-7.0a}{04/01/04}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% \cs{assert} wird wie \cs{assign} definiert, f"uhrt ohne die Option
% |verification| aber nicht zu sichtbaren Ergebnissen:
% \else%
% \cs{assert} is defined just like \cs{assign}:%
% \fi%
%    \begin{macrocode}
  \newcommand\assert{\let\next=\assert@nss\getoption}%
  \newcommand\assert@nss[1]{}%
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \ifnum\language=\languageNGerman%
% Der folgende Code ist nur g"ultig, wenn die Option |verification| gesetzt
% wurde:
% \else%
% The following code is valid only, if the option |verification| is set.%
% \fi%
%
%    \begin{macrocode}
\ifthenelse{\boolean{verification}}{%
%    \end{macrocode}
% \begin{macro}{\xsizeo@nss}
% \changes{v-7.0a}{04/01/05}{neu eingef"uhrt}
% \begin{macro}{\ydeptho@nss}
% \changes{v-7.0a}{04/01/05}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% Da \cs{oval} einen anderen Referenzpunkt als \cs{framebox} hat, brauchen
% wir zus"atzliche Z"ahler, um den anderen Referenzpunkt ansprechen zu k"onnen.
% \else%
% Since \cs{oval} has another reference point than \cs{framebox}, we need
% additional counters for the positioning of the \cs{oval}.%
% \fi%
%    \begin{macrocode}
    \countdef\xsizeo@nss=232%
    \countdef\ydeptho@nss=233%
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \ifnum\language=\languageNGerman%
% F"ur den Fall, dass die Option |verification| gesetzt wurde, wird der
% intern genutzte Makro \cs{assert@nss} neu definiert.
% \else%
% \fi
%    \begin{macrocode}
  \renewcommand{\assert@nss}[1]{%
    \tempx@nss=\xsize@nss\divide\tempx@nss by 6%
    \set@nss{#1}{\tempx@nss}\tempy@nss=\number\param@nss000%
    \assertblock@nss{\tempy@nss}{1}%
  }
%    \end{macrocode}
%%
% \begin{macro}{\assertblock@nss}
% \changes{v-7.0a}{04/01/04}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman%
% |\assertblock@nss| setzt die Box |\TextBox@nss| entsprechend dem zweiten Parameter. Ist dieser
% 1, wird eine Box mit Rahmen gesetzt, ist dieser 0, wird eine Box ohne Rahmen
% gesetzt. Bei allen anderen Werten wird nur die Gr"o"se des Struktogramms,
% gegeben durch |\y@nss|, vergr"o"sert.
% \else%
%   |\assertblock@nss| sets the box |\TextBox@nss| corresponding to the second parameter.
%   If this parameter is 1, the box will be set in a frame, and if it is 0, a box without
%   frame will be set. In all other cases only the size of the structured box chart
%   given by |\y@nss| will be changed.%
% \fi%
%    \begin{macrocode}
  \newcommand{\assertblock@nss}[2]{%
    \tempy@nss=#1\TextBoxHt@nss=\ht\TextBox@nss%
    \advance\TextBoxHt@nss by\dp\TextBox@nss%
    \advance\TextBoxHt@nss by 2mm%
    \ifdim\TextBoxHt@nss<\tempy@nss\unitlength%
        \TextBoxHt@nss=\tempy@nss\unitlength%
    \fi%
    \TextBoxHt@nss=0.00536\TextBoxHt@nss%
    \ydepth@nss=\TextBoxHt@nss\advance\y@nss by-\ydepth@nss%
    \xsizeo@nss=\xsize@nss \tempx@nss=\x@nss
    \divide\xsizeo@nss by 2%
    \advance\tempx@nss by+\xsizeo@nss%
    \ydeptho@nss=\ydepth@nss \tempy@nss=\y@nss
    \divide\ydeptho@nss by 2%
    \advance\tempy@nss by+\ydeptho@nss%
    \ifx#21%
        \put(\x@nss,\y@nss)%
        {%
            \framebox(\xsize@nss,\ydepth@nss){\box\TextBox@nss}%
        }%
        \put(\tempx@nss,\tempy@nss){\oval(\xsize@nss,\ydepth@nss)}%
    \else%
        \ifx#20%
            \put(\x@nss,\y@nss)%
            {%
                \makebox(\xsize@nss,\ydepth@nss){\box\TextBox@nss}%
            }%
            \put(\tempx@nss,\tempy@nss){\oval(\xsize@nss,\ydeptho@nss)}%
        \else%
            \advance\y@nss by \ydepth@nss%
        \fi%
    \fi%
  }
}
{} % end of \ifthenelse{\boolean{verification}}
%</struktex>
%    \end{macrocode}
% \end{macro}
%
%
% \Finale
%
% \clearpage
% \PrintIndex
% {\selectlanguage{ngerman}\PrintChanges}
%
\endinput
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\67\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%%
%
% end of struktex.dtx
%
% ^^A Local Variables:
% ^^A mode: docTeX
% ^^A TeX-PDF-mode: t
% ^^A TeX-master: t
% ^^A mode: flyspell
% ^^A ispell-local-dictionary: "deutsch8"
% ^^A End:
