From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 macros/latex/contrib/struktex/struktex.dtx | 7836 ++++++++++++++++++++++++++++
 1 file changed, 7836 insertions(+)
 create mode 100644 macros/latex/contrib/struktex/struktex.dtx

(limited to 'macros/latex/contrib/struktex/struktex.dtx')

diff --git a/macros/latex/contrib/struktex/struktex.dtx b/macros/latex/contrib/struktex/struktex.dtx
new file mode 100644
index 0000000000..d124d8ecca
--- /dev/null
+++ b/macros/latex/contrib/struktex/struktex.dtx
@@ -0,0 +1,7836 @@
+% \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:
-- 
cgit v1.2.3

