% \iffalse meta-comment
%
% Copyright (C) 1995 - 2005 Jobst Hoffmann, FH Aachen, Abt. 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
%
% \iffalse
%<struktex|struktxf|struktxp|strukdoc>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<struktex|struktxf|struktxp|strukdoc>\def\filedate{2005/05/17}
%<struktex|struktxf|struktxp|strukdoc>\def\fileversion{v8.0f}
%<struktex>\ProvidesPackage{struktex}
%<struktex>   [\filedate\space\fileversion\space Nassi Shneidermann Charts (Jobst Hoffmann)]
%<struktxf>\ProvidesPackage{struktxf}
%<struktxf>   [\filedate\space\fileversion\space Fonts for Nassi Shneidermann Charts (Jobst Hoffmann)]
%<struktxp>\ProvidesPackage{struktxp}
%<struktxp>   [\filedate\space\fileversion\space Keywords for Nassi Shneidermann Charts (Jobst Hoffmann)]
% \fi
% \CheckSum{2030}
% \def\docdate {2005/05/17} ^^A not style'able!!
%
%    \iffalse meta-comment
%   struktex.dtx                                       $Revision: 7.8 $
%                                              $Date: 2005/06/13 13:22:25 $
%                                                $RCSfile: struktex.dtx,v $
%   $Log: struktex.dtx,v $
%   Revision 7.8  2005/06/13 13:22:25  ax006ho
%   - Dokumentation von `case verbessert
%   - Code bereinigt
%   - fehlerhafte Umbenennung von `tempx@nss korrigiert
%   - Tippfehler korrigiert
%
%   Revision 7.7  2005/06/13 13:02:28  ax006ho
%   - ein paar Tippfehler korrigiert
%   - Test auf das Arbeiten mit pdfTeX umgestellt (nun unter Benutzung von
%     ifpdf.sty
%
%   Revision 7.6  2005/01/12 11:16:08  ax006ho
%   - updated copyright
%   - some small changes in the documentation (case)
%   - changed the license remark in the english version
%   - corrected error with case (height of the separating lines)
%   - added key words for Python
%   - added file variables for XEmacs
%
%   Revision 7.5  2004/07/16 10:55:25  ax006ho
%   - Texte verbessert
%   - Umschaltung der Sprache nun durch ein Literal
%   - Ueberschriften fuer die Inhaltsangabe teilweise verkuerzt
%   - Beispieldatei zum Testen der Fontauswahl verbessert: \obeylines
%     ist nun gruppenweise gesetzt
%   - Makefile korrigiert
%   - Literaturangaben aktualisiert
%
%   Revision 7.4  2004/07/14 12:47:57  ax006ho
%   - \fileversion und \filedate zur einfacheren zentralen Verwaltung von
%     Entwicklungsdaten eingefuehrt
%   - Im Vorwort Hinweis auf pict2e.sty gegeben
%   - Entwicklungsgeschichte korrigiert und erweitert
%   - Umstellung der Sprachverwaltung auf babel
%   - Zeichnung zum Layout der Deklarationen verbessert (\multiput statt n-mal
%     \put, Korrektur von Bezeichnungen)
%   - .pdf-Ausgabe eingefuehrt
%   - Hinweis auf Luxi Mono als Ersatz fuer cmbtt
%
%   Revision 7.3  2004/07/13 10:01:51  ax006ho
%   - explizites Laden von pict2e
%   - kleine Korrektur am Makefile
%   - in der zweiten Beispieldatei wird nun statt curves.sty pict2e.sty geladen
%
%   Revision 7.2  2004/07/13 08:46:04  ax006ho
%   - an pict2e.sty angepasst
%   - kleinere Korrekturen an der Dokumentation
%
%   Revision 7.1  2004/07/12 15:32:42  ax006ho
%   - Anzahl der Z"ahler reduziert
%   - einige kleinere Korrekturen angebracht
%
%   Revision 7.0.1.1  2004/03/09 10:09:16  ax006ho
%   - Adresse ge"andert
%   - Code teilweise umgestellt
%   - Dateinamen ge"andert
%   - Tippfehler korrigiert
%   - Marker f"ur interne Beispiel
%   - Testrahmen ge"andert
%   - Beispiele f"ur unterschiedlichen Programmierspracheneinsatz erweitert
%   - Makefile integriert
%   - `pLanguage ge"andert: `pLanguage@nss zus"atzlich eingef"uhrt
%   - Sprachbezeichnungen ge"andert: Suffix @nss
%   - Erweiterung f"ur die Verifikation von Algorithmen eingef"uhrt
%
%   Revision 7.0  2004/01/04 11:07:13  ax006ho
%   - Adresse ge"andert
%   - Code teilweise umgestellt
%   - Dateinamen ge"andert
%   - Tippfehler korrigiert
%   - Marker f"ur interne Beispiel
%   - Testrahmen ge"andert
%   - Beispiele f"ur unterschiedlichen Programmierspracheneinsatz erweitert
%   - Makefile integriert
%   - `pLanguage ge"andert: `pLanguage@nss zus"atzlich eingef"uhrt
%   - Sprachbezeichnungen ge"andert: Suffix @nss
%
%   Revision 6.0  2001/05/25 09:33:44  ax006ho
%   - Dokumentation von `case verbessert
%   - Makros `cs, `marg, `oarg, `pparg sowie `envb und `enve zur besseren
%     Dokumentation eingesetzt
%   - Englische "Ubersetzung der Dokumentation hinzugef"ugt
%   - Code umgestaltet, z.B. `def \(\rightarrow\) `newcommand,
%     \$\ldots\$ \(\rightarrow\) `(\ldots`)
%   - Zus"atzliche Paketoption "`curves"' zur Gestaltung beliebiger Steigungen
%     eingef"uhrt
%
%   Revision 5.0.4.2  2001/04/22 17:18:25  ax006ho
%   - Umgebungen zur einfacheren Notation der Dokumentation eingef"uhrt
%   - Erster Versuch einer gemischtsprachigen Dokumentation
%
%   Revision 5.0.4.1  1999/11/16 20:06:20  Hoffmann
%   - Neuimplementierung des Setzens von Ausdr"ucken und
%     (Schluessel-)woertern
%
%   Revision 5.0.3.1  1999/11/16 10:29:27  Hoffmann
%   - Text in Entscheidungsbloecken wird der Steigung der Linien
%     entsprechend gesetzt
%
%   Revision 5.0.2.2  1998/05/28 11:59:22  Hoffmann
%   - Tippfehlerkorrektur: Umlaut "`ue"' durch "`"u"' ersetzt
%
%   Revision 5.0.2.1  1997/12/03 13:03:33  Hoffmann
%   - Umstellung der Dokumentation, dadurch Verzicht auf eigene Treiberdatei
%     m"oglich
%   - kleinere Korrekturen
%
%   Revision 5.0.1.2  1997/11/02 20:11:39  Hoffmann
%   - Dokumentation umgestellt mittels der Umgebung example sowie der Makros
%     verbatiminput und verbatimwrite
%   - Zugehoerige Makros neu, aber noch nicht dokumentiert
%
%   Revision 5.0.1.1  1997/05/13 06:29:22  Hoffmann
%   kleinere stilistische "Anderungen nach W. Hanrath
%
%   Revision 5.0  1997/04/28 09:46:41  Hoffmann
%   - Dateinamen zwecks Kompatibilit"at auf Kleinschreibung umgesetzt
%   - kleinere textuelle "Anderungen, Fontauswahl teilweise ge"andert
%   - Abh"angigkeiten der Dokumentation von zus"atzlichen Paketen beseitigt
%
%   Revision 4.5  1997/04/28 08:29:29  Hoffmann
%   Umstellung auf Versionskontrolle mit rcs
%
%----------------------------------------------------------------------------
% \fi
%\iffalse    Dies ist ein META-KOMMENTAR
%            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-2004 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, Abt. 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{v8.0f}{05/06/11}{Dokumentation von `case verbessert}
% \changes{v8.0d}{04/12/29}{`switch zeigt bei geeigneten Beispielen das
% rechtsb"undige Setzen von Bedingungen}
% \changes{v8.0c}{04/07/15}{Zweisprachigkeit verbessert, Bezeichner statt
% Nummern eingef"uhrt}
% \changes{v8.0b}{04/07/14}{`fileversion und `filedate zur einfacheren
% zentralen Verwaltung von Entwicklungsdaten eingef"uhrt}
% \changes{v7.0b}{04/03/09}{Anzahl der Z"ahler reduziert}
% \changes{v7.0a}{03/04/21}{Code teilweise umgestellt}
% \changes{v7.0a}{03/04/21}{Dateinamen ge"andert}
% \changes{v7.0a}{03/04/21}{Tippfehler korrigiert}
% \changes{v7.0a}{03/04/21}{Marker f"ur interne Beispiele umbenannt}
% \changes{v7.0a}{03/04/21}{Testrahmen ge"andert}
% \changes{v7.0a}{03/04/21}{Beispiele f"ur unterschiedlichen Programmierspracheneinsatz erweitert}
% \changes{v7.0a}{03/04/21}{Makefile integriert}
% \changes{v7.0a}{03/04/21}{`pLanguage ge"andert: `pLanguage@nss zus"atzlich eingef"uhrt}
% \changes{v7.0a}{03/04/21}{Sprachbezeichnungen ge"andert: Suffix @nss}
% \changes{v7.0}{03/04/21}{Wechsel von der RWTH Aachen zur FH Aachen, Abt. J"ulich}
% \changes{v6.0a}{01/04/22}{Dokumentation von `case verbessert}
% \changes{v6.0a}{00/12/08}{Makros `cs, `marg, `oarg, `pparg sowie  
%                           `envb und `enve zur besseren Dokumentation
%                           eingesetzt}
% \changes{v6.0a}{00/11/24}{Englische "Ubersetzung der Dokumentation 
%                           hinzugef"ugt}
% \changes{v6.0a}{00/11/24}{Code umgestaltet, z.B. `def $\rightarrow$ 
%                           `newcommand, \$\ldots\$ $\rightarrow$ `(\ldots`)}
% \changes{v6.0a}{00/11/24}{Zus"atzliche Paketoption "`curves"' zur Gestaltung
%                           beliebiger Steigungen eingef"uhrt}
% \changes{v5.4b}{00/12/08}{Umgebungen zur einfacheren Notation der
%                           Dokumentation eingef"uhrt}
% \changes{v5.4b}{00/12/08}{Erster Versuch einer gemischtsprachigen
%                           Dokumentation}
% \changes{v5.4a}{99/11/16}{\textsf{stuktxp.sty} "uberarbeitet zur besseren
%                           Darstellung von Programmen}
% \changes{v5.3a}{98/11/27}{Die Form des Textes in Bedingungen ist nun an
%                           beliebige Steigungen angepasst}
% \changes{v5.2b}{98/05/28}{Tippfehlerkorrektur: Umlaut "`ue"' durch
%                           "`"u"' ersetzt}
% \changes{v5.2a}{97/12/03}{Umstellung der Dokumentation, dadurch Verzicht
%                           auf eigene Treiberdatei m"oglich}
% \changes{v5.2a}{97/12/03}{kleinere Korrekturen}
% \changes{v5.1b}{97/11/02}{Umstellung der Dokumentation mittels Umgebung
%                           \texttt{example}, `verbatiminput und verbatimwrite}
% \changes{v5.1a}{97/04/29}{kleinere stilistische "Anderungen nach W. Hanrath}
% \changes{v5.0}{97/04/28}{Dateinamen zwecks Kompatibilit"at auf Kleinschreibung umgesetzt}
% \changes{v5.0}{97/04/28}{kleinere textuelle "Anderungen, Fontauswahl teilweise ge"andert}
% \changes{v5.0}{97/04/28}{Abh"angigkeiten der Dokumentation von zus"atzlichen Paketen beseitigt}
% \changes{v4.5e}{97/04/25}{Verzicht auf Gro"s- und Kleinschreibung im Namen von .sty-Dateien}
% \changes{v4.5a}{96/03/14}{Umgebung \texttt{description} auf \texttt{list}-Umgebung zur"uckgef"uhrt}
% \changes{v4.5a}{96/03/14}{Eigenes Paket zur Formatierung von Programminhalten integriert}
% \changes{v4.1c}{95/07/24}{Dokumentation verbessert}
% \changes{v4.1b}{95/07/19}{H"ohe des Bedingungsrechteckes bei `ifthenelse vorgebbar}
% \changes{v4.1a}{95/07/17}{Geraden mit beliebiger Steigung durch `emline m"oglich}
% \changes{v4.0a}{95/04/12}{Anpassung an LaTeX2e}
% \changes{v3.5a}{94/11/22}{Entwicklunglinien J. Dietel, J. Hoffmann vereinigt}
% \changes{v3.3a}{94/09/14}{Schnittstellenbeschreibung verallgemeinert}
% \changes{v3.2a}{94/09/14}{Dokumentation verbessert}
% \changes{v3.1a}{94/09/09}{Verschiedene Erweiterungen}
% \changes{v3.0a}{94/06/06}{Urversion mit integrierter Dokumentation}
% \changes{v2.5}{93/09/09}{Jobst Hoffmann, Rechenzentrum RWTH Aachen}
% \changes{v2.0}{92/01/17}{Dorothea Rieger, Rechenzentrum RWTH Aachen}
% \changes{v1.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, \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
%
% \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 the version number \fileversion. It has been worked 
%          at at last on \filedate{} and the documentation has been dated 
%          on \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-Shneidermann.
% \end{abstract}
% \else
% \begin{abstract}
% This article describes the use and implementation of
% \LaTeX-\foreign{package} \StrukTeXSty\ for structured box charts
% (Nassi-Shneidermann charts).
% \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
% }
%
% \ifnum\language=\languageNGerman
% \else
%
% \section{License}
% This package is copyright c 1995 -- 2004 by:
%      Jobst Hoffmann, c/o University of Applied Sciences Aachen
%      Aaachen, Germany
%      E-Mail: j.hoffmann \_at\_ fh-aachen.de
%    This program can be redistributed and/or modified under the terms of the LaTeX
% Project Public License, distributed from CTAN archives as macros/latex/base/lppl.txt;
% either version 1 of the License, or (at your option) any later version.
% \fi
%
% \ifnum\language=\languageNGerman
% \section{Vorwort}
% \changes{v8.0b}{04/07/14}{Hinweis auf \textsf{pict2e.sty}}
% \changes{v8.0b}{04/07/14}{Entwicklungsgeschichte korrigiert und erweitert}
% 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.
% \else
% \section{Preface}
% 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.
% \fi
%
% \ifnum\language=\languageNGerman
% Ab Version 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 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 whole
% and the real numbers) possible.
% Especially the symbol for the emptyset ($\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 4.1a und 4.1b, f"ur das \cs{switch} mit der Version 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 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 4.1a and 4.1b and for \cs{switch} in the version 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 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 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 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 4.2a).
% \else
% An \cs{otherwise}-branch at \cs{switch} (done in version 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:Companion2} (abgeschlossen mit
% der Version 4.5a).
% \else
% The reimplementation of the |declaration|-environment through the
% |list|-environment by
% \cite[Abs. 3.3.4]{GoossensMittelbachSamarin:Companion2} (done in version 4.5a).
% \fi
%
% \item \ifnum\language=\languageNGerman
% Die Anpassung an \LaTeXe\ im Sinne eines Packages
% (abgeschlossen durch die Version 4.0a).
% \else
% The adaption to \LaTeXe\ in the sense of packages
% (done in version 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 4.5a).
% \else
% The independence of \StrukTeXSty\ of other \textsf{.sty}-files
% like e.g. \textsf{JHfMakro.sty} (done in version 4.5a).
% \fi
%
% \item \ifnum\language=\languageNGerman
% die vollst"andige Implementation der Makros \cs{pVar},
% \cs{pKey}, \cs{pFonts}, \cs{pTrue}, \cs{pFalse} und \cs{pBoolValue}
% (erledigt vor Version 7.0),
% \changes{v4.5a}{96/03/14}{Umbenenneungen: `sVar $\rightarrow$ `pVar, \ldots}
% \changes{v4.3a}{96/01/26}{Variable `sBoolValue ersetzt `sLVal}
% \else
% The complete implementation of the macros \cs{pVar}, \cs{pKey}, \cs{pFonts},
% \cs{pTrue}, \cs{pFalse} and \cs{pBoolValue} (done before version 7.0),
% \changes{v4.5a}{96/03/14}{redesignation: `sVar $\rightarrow$ `pVar, \ldots}
% \changes{v4.3a}{96/01/26}{variable `sBoolValue replaces `sLVal}
% \fi
%
% \item \ifnum\language=\languageNGerman
% 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 4.4a.
% \changes{v4.4a}{96/02/29}{Kommando `ifthenelse internalisiert}
% \else
% 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 4.4a.
% \changes{v4.4a}{96/02/29}{command `ifthenelse internalisated}
% \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 5.0).
% \else
% The independence of the documentation of other \textsf{.sty}-files like
% \textsf{JHfMakro.sty} (done in version 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{v4.5e}{97/04/26}{Neue .sty-Datei strukdoc.sty eingef"uhrt}
% \changes{v1.5}{92/01/07}{StrukTeX Makros nun als .sty-Datei, J. Hoffmann}
% \changes{v2.0}{92/01/17}{Erweitert um `exit, `forever und `foreverend, D. Rieger}
% \changes{v2.1}{92/01/07}{`exit modifiziert, J. Hoffmann}
% \changes{v2.2}{93/09/08}{Beschreibung von Variablen eingef"uhrt, J. Hoffmann}
% \changes{v2.2a}{93/09/09}{Beschreibung von Variablen verbessert, J. Hoffmann}
% \else
% \changes{v4.5e}{97/04/26}{new .sty-File strukdoc.sty introduced}
% \changes{v1.5}{92/01/07}{StrukTeX macros now as .sty-File, J. Hoffmann}
% \changes{v2.0}{92/01/17}{extended by `exit, `forever and `foreverend, D. Rieger}
% \changes{v2.1}{92/01/07}{`exit modified, J. Hoffmann}
% \changes{v2.2}{93/09/08}{description of variables introduced, J. Hoffmann}
% \changes{v2.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
% latex  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
% latex struktex.dtx \\
% latex struktex.dtx \\
% makeindex -s gind.ist struktex.idx \\
% latex 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{.dvi}-Datei, die in gewohnter Weise weiterbearbeitet
% werden kann. Weitere Informationen zum Arbeiten mit der integrierten
% Dokumentation findet man in \cite{FM:TheDocAndShortvrbPackages-V2.0} und
% \cite{MittelbachDuchierBraams:DocStrip-V2.5b}.
% Die Dateien \textsf{tst\_strf.tex}, \textsf{tst\_strp.tex} schlie"slich
% sind Dateien zum Austesten
% der hier beschriebenen Makros.
% \else
% First the file \textsf{struktex.ins} will be formatted e.g.\ with
% \begin{quote}\tt
% tex \&latexg 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
% \begin{quote}\tt
% latex struktex.dtx \\
% latex struktex.dtx \\
% makeindex -s gind.ist struktex.idx \\
% latex struktex.dtx
% \end{quote}
% The result of this formatting run is the documentation in form of a
% \textsf{.dvi}-file, that can be manipulated the normal way. Further 
% informations
% about the work with the integrated documentation one can find in
% \cite{FM:TheDocAndShortvrbPackages-V2.0} and
% \cite{MittelbachDuchierBraams:DocStrip-V2.5b}.\footnote{Generating the
% documentation is much easier with the \texttt{make} utility, see 
% section~\ref{sec:Makefile}.}
% Finally there are the files \textsf{tst\_strf.tex},
% \textsf{tst\_strp.tex} for testing
% purposes of the macros described herewith.
% \fi
%
% \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 in die
% Verzeichnisse \texttt{.../doc/latex/jhf/struktex/},
% \texttt{.../tex/latex/jhf/struktex/} und 
% \texttt{.../source/latex/jhf/struktex/}.}
% \else
% To finish the installation, the file \texttt{struktex.sty} should be
% moved to a directory, where \TeX{} can find it, in a TDS conform
% 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 are 
% \texttt{.../doc/latex/jhf/struktex/},
% \texttt{.../tex/latex/jhf/struktex/} and 
% \texttt{.../source/latex/jhf/struktex/} resp.
% \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
%
% \ifnum\language=\languageNGerman
% \changes{v8.0b}{04/07/14}{Umstellung der Sprachverwaltung auf babel}
% 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
% \iffalse
%<*driver>
% \fi
%    \begin{macrocode}
\documentclass[a4paper, english, ngerman]{ltxdoc}

\usepackage{babel}                   % for switching the documentation language
\usepackage{strukdoc}                % the style-file for formatting this
                                     % documentation
\usepackage[pict2e]% <-------------- to produce finer results
        {struktex}                   % visible under xdvi, alternative
                                     % curves or emlines2 (visible only under 
                                     % ghostscript), leave out if not 
                                     % available

\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

\def\languageNGerman{3}

\begin{document}
\makeatletter
\@ifundefined{selectlanguageEnglish}{}{\selectlanguage{english}}
\makeatother
\DocInput{struktex.dtx}
\end{document}
%    \end{macrocode}
% \iffalse
%</driver>
% \fi
%
% \section{\ifnum\language=\languageNGerman Die Benutzungsschnittstelle
%             \else The User Interface\label{interface}
%             \fi}
% \label{Schnittstelle}
%
% \changes{v4.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:
% \else
% The \StrukTeXSty\ will be included in a LaTeX-document like every other
% |.sty|-file by \foreign{package}:
% \fi
% \begin{quote}
% |\usepackage{struktex}|
% \end{quote}
%
% \ifnum\language=\languageNGerman
% Das Laden des Paketes kann unter Angabe einer zus"atzlichen Option 
% geschehen, um beliebige Steigungen in Struktogrammen zeichnen zu k"onnen.
% Diese Option kann |emlines|, |curves|, oder |pict2e| lauten; ersteres 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.
%
% Nach dem Laden der |.sty|-Datei stehen verschiedene Kommandos und Umgebungen
% zur Verf"ugung, die das Zeichnen der Struktogramme erm"oglichen.
% \else
% Loading the package can be modified by giving the option |curves| or 
% |emlines|, resp. If this is done, 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
% |curves|. In both cases the required packages (\textsf{emline2.sty} or
% \textsf{curves.sty} resp.) will be loaded automatically.
%
% 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 Representation of Variables, Keywords and other
% Specific Details of Programming
% \fi}
%
% \DescribeMacro{\pVariable}
% \DescribeMacro{\pVar}
% \ifnum\language=\languageNGerman
% \changes{v2.0n}{94/03/31}{Dokumentation "uberarbeitet}
% \else
% \changes{v2.0n}{94/03/31}{documentation changed}
% \fi
% \DescribeMacro{\pKeyword}
% \DescribeMacro{\pKey}
% \DescribeMacro{\pComment}
% \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}
% \ifnum\language=\languageNGerman 
% \else
% \fi
% \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 zentriert in den
% Kasten gesetzt; ist er daf"ur zu lang, so wird ein Paragraph gesetzt.
% \else
% The \textit{text} is normally set centered in the box. If the text is too long for
% that, then a 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,20)[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 Storage 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{v8.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 Klammer 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 varibles 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}
%
% \ifnum\language=\languageNGerman
% Zuletzt die globale Vereinbarung eines Titels:
% \begin{verbatimwrite}{struktex.tmp}
% \def\declarationtitle{globale Variablen:}
% \begin{struktogramm}(95,13)
%     {\catcode`\_=12%
%         \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)
%     {\catcode`\_=12%
%         \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{\forever}
%\DescribeMacro{\foreverend}
% \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 
% \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 
% test before).
% The until loop checks the condition at the end of the loop (loop with 
% test after).
% 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.
% \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
% 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 |forever|
% and |foreverend|.
% \fi
%
% \ifnum\language=\languageNGerman
% Die folgenden Beispiele zeigen den Einsatz der \cs{while}- und \cs{until}-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 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
% Die \cs{exit}-Anweisung gibt nur im Zusammenhang mit einfachen oder mehrfachen
% Verzweigungen Sinn, daher wird sie im Anschluss an die Diskussion der
% Verzweigungen diskutiert.
% \else
% The \cs{exit} instruction makes only sense in connection with simple or
% multiple branches. Therefore it will be discussed 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 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 representation of alternatives \StrukTeX\ provides mapping conventions
% for an If-Then-Else-block and a Case-construction for multiple alternatives.
% Since in the 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{6.0}{00/11/24}{Einsatz von curves.sty zum Zeichnen beliebiger Steigungen implementiert}
% \ifnum\language=\languageNGerman
% Wenn hingegen der der \textsf{curves.sty} bzw. der \textsf{emlines2.sty}
% eingesetzt wird, ist die Darstellung von Geraden mit beliebiger Steigung
% m"oglich.
% \else
% If however the \textsf{curves.sty} or the \textsf{emlines2.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 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 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}
%
% \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{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}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen f"uhren zu folgendem Struktogramm:
% \else
% \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}
% \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}
%
% \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}
%
% \section{\ifnum\language=\languageNGerman Beipieldatei zum Einbinden in die Dokumentation\label{Beispiel}
%             \else Example File for tieing in the Documentation\label{Example}
%             \fi}
%
% \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
% \iffalse
%<*example1>
% \fi
%    \begin{macrocode}
\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}
%    \end{macrocode}
% \iffalse
%</example1>
% \fi
%
% \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{v4.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
% \iffalse
%<*example2>
% \fi
%    \begin{macrocode}
\documentclass{article}
\usepackage{struktex}

\begin{document}

%\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}
    }
    \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}
%    \end{macrocode}
% \iffalse
%</example2>
% \fi
%
%
% \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{v4.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
% \iffalse
%<*example3>
% \fi
%    \begin{macrocode}
\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}
%    \end{macrocode}
%\iffalse
%</example3>
%\fi
%
% \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 model 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
% \iffalse
%<*example4>
% \fi
%    \begin{macrocode}
\documentclass{article}

\usepackage{struktxp,struktxf}

\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'.
%    \end{macrocode}
% \iffalse
%</example4>
% \fi
%
% \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
% For easier formatting of 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 \foreign{lshort2e.tex - The not
% so short introduction to LaTeX2e}.
% \fi
% \changes{v8.0e}{05/05/17}{nun wird die .pdf-Ausgabe sauber abgefangen}
%    \begin{macrocode}
%<*strukdoc>
\RequirePackage{ifpdf}
\ProvidesPackage{strukdoc}
             [\filedate\space\fileversion\space (Jobst Hoffmann)]
\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}}
%    \end{macrocode}
% \iffalse
%</strukdoc>
% \fi
%
%
% \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{v8.0b}{04/07/14}{.pdf-Ausgabe eingef"uhrt}
%
% \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
%
% \changes{v8.0e}{05/05/17}{Tippfehler korrigiert: \$\$\$f $\rightarrow$ \$\$f}
% \changes{v8.0e}{05/05/17}{\& mit Fluchtzeichen versehen}
% \iffalse
%<*makefile>
% \fi
%    \begin{macrocode}
#-----------------------------------------------------------------------
# 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, Abt. Juelich
# Date:    2003/04/18
#-----------------------------------------------------------------------

# 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 '$$HOMETEXMF'`
# 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/jhf/$(PACKAGE)

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

# The directory, where to install the sources
SRCDIR=$(INSTALLTEXMF)/source/latex/jhf/$(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                     
########################################################################

DVIPS = dvips
LATEX = latex
PDFLATEX = pdflatex

# postscript viewer
GV = gv

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

PACKAGE = struktex

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

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

# strip off the comments from the package
$(PACKAGE).sty $(PACKAGE)-test-*.tex: $(PACKAGE).dtx

$(PACKAGE).sty $(PACKAGE)-test-*.tex: $(PACKAGE).ins
 +$(LATEX) $<

# generate the documentation
$(PACKAGE).dvi: $(PACKAGE).sty

$(PACKAGE).de.dvi: $(PACKAGE).dtx
 +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}"
 +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}"
 +mv $(<:.dtx=.dvi) $(<:.dtx=.de.dvi)

$(PACKAGE).de.pdf: $(PACKAGE).dtx
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}"
 +$(PDFLATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}"
 +mv $(<:.dtx=.pdf) $(<:.dtx=.de.pdf)

$(PACKAGE).en.dvi: $(PACKAGE).dtx
 +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\def\selectlanguageEnglish{}\input{$<}"
 +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\def\selectlanguageEnglish{}\input{$<}"
 +mv $(<:.dtx=.dvi) $(<:.dtx=.en.dvi)

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

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

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

develop-en: $(PACKAGE).dtx
 +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(DEVELOPER_OPTIONS)}\def\selectlanguageEnglish{}\input{$<}"
 +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(DEVELOPER_OPTIONS)}\def\selectlanguageEnglish{}\input{$<}"
 +makeindex -s gind.ist                 $(PACKAGE).idx
 +makeindex -s gglo.ist -o $(PACKAGE).gls -t $(PACKAGE).glg $(PACKAGE).glo
 +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(DEVELOPER_OPTIONS)}\def\selectlanguageEnglish{}\input{$<}"
ifneq (,$(findstring pdf,$(LATEX)))
 +mv $(<:.dtx=.pdf) $(<:.dtx=.en.pdf)
else
 +mv $(<:.dtx=.dvi) $(<:.dtx=.en.dvi)
endif

# format the example/test files 
test:
 for i in `seq 1 3`; do \
     f=$(PACKAGE)-test-$$i; \
     echo file: $$f; \
     $(LATEX) $$f; \
     $(DVIPS) -o $$f.ps $$f.dvi; \
     $(GV) $$f.ps \&; \
 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)

pack: $(PACKAGE).de.pdf $(PACKAGE).en.pdf  $(PACKAGE).dtx  $(PACKAGE).ins \
LIESMICH README
 + tar cfvz  $(PACKAGE).tgz $^

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 *.ps *.dvi *.pdf
 -rm -f *test* getversion.* Makefile

clean-test:
 rm $(PACKAGE)-test-*.* # this $-sign is needed for font-locking in XEmacs only
%    \end{macrocode} 
% \iffalse
%</makefile>
% \fi
%
% \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
% \iffalse
%<*setup>
% \fi 
%    \begin{macrocode}
sed -e "`echo \"s/^ /@/g\" | tr '@' '\011'`" struktex.mk > Makefile 
%    \end{macrocode}
% \iffalse
%</setup>
% \fi
% \ifnum\language=\languageNGerman
% Die folgende Datei dient allein dazu, die Version des Paketes zu
% ermitteln.
% \else
% The following file only serves to get the version of the package.
% \fi
% \iffalse
%<*getversion>
% \fi 
%    \begin{macrocode}
\documentclass[english]{ltxdoc}
\nofiles
\usepackage{struktex}
\GetFileInfo{struktex.sty}
\typeout{VERSION \fileversion}
\begin{document}
\end{document}
%    \end{macrocode}
% \iffalse
%</getversion>
% \fi
%
%
% \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-V2.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-V2.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}
%
% \ifnum\language=\languageNGerman
% Als erstes wird getestet, ob das Paket \StrukTeXSty\ noch nicht
% geladen wurde. Wenn das der Fall ist, wird weitergearbeitet, ansonsten
% wird das Lesen sofort abgebrochen.
% \else
% First it is tested, if the package \StrukTeX\ has been loaded. In case it has been,
% it will be proceded. Otherwise reading will be interrupted.
% \fi
%    \begin{macrocode}
%<*struktex>
\@ifundefined{StrukTeX}{}{\endinput}
%    \end{macrocode}
% \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 put out
% an adequate error message, if another format is used, which should not lead to
% errors. In addition the package \textsf{ifthen.sty} will be loaded, if not already
% done.
% \fi
% \changes{v4.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 reading in of macro package with the actual number of version will
% be messaged.
% \fi
%    \begin{macrocode}
\RequirePackage{ifthen}
%    \end{macrocode}
% \ifnum\language=\languageNGerman
% StrukTeX ben"otigt zwei weitere Pakete, die zum Lieferumfang geh"oren.
% Diese werden hier geladen.
% \else
% \fi
%    \begin{macrocode}
\RequirePackage{struktxf}
\RequirePackage{struktxp}
%    \end{macrocode}
%
% \changes{v5.3a}{98/11/27}{Option \texttt{emlines} eingef"uhrt}
% \ifnum\language=\languageNGerman
% Ab der Version 5.3a kennt StrukTeX eine Option "`|emlines|"', die es
% erm"oglicht, Geraden beliebiger Steigung zu zeichnen; sp"ater kann auch
% das Paket \textsf{curves} zum Zeichnen beliebiger Steigungen eingesetzt 
% werden, ab der Version 8.0a wird auch das Paket
% \textsf{pict2e} unterst"utzt, das dazugeh"orige
% Paket wird hier geladen.
% \else
% \fi
%    \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}
%
% \changes{v7.0a}{04/01/05}{Option \texttt{verification} eingef"uhrt}
% \ifnum\language=\languageNGerman
% Ab der Version 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 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}
%
% \ifnum\language=\languageNGerman
% Nun werden andere Pakete geladen und die Optionen verarbeitet
% \else
% \fi
%    \begin{macrocode}
\ProcessOptions
\ifcurves%
    \RequirePackage{curves}
\else\ifemlines
    \RequirePackage{emlines2}
\else\ifpictIIe
    \RequirePackage{pict2e}
\fi\fi\fi
%    \end{macrocode}
%
% \begin{macro}{\StrukTeX}
% \ifnum\language=\languageNGerman
% Das Logo des Paketes, anhand dessen sp"ateres erneutes Einlesen
% unterbunden wird:
% \else
% The logo of package, with which a later second reading in will be
% forestalled:
% \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}
%
% \subsection{\ifnum\language=\languageNGerman Diverse Makros zur Vorbereitung
%                 \else Various Macros for Preparation
%                 \fi}
%
% \changes{v4.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}
%</struktex>
%<*struktxf>
\@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{v4.1b}{95/07/23}{`complex eingef"uhrt}
% \changes{v4.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{v4.1a}{95/07/17}{`btt auf NFSS umgestellt}
% \changes{v8.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{v4.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
%</struktxf>
%<*struktex>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsection[\ifnum\language=\languageNGerman Darstellung von Variablen
% etc.\else Representation of Varibles etc.\fi]{\ifnum\language=\languageNGerman 
%    Makros zur Darstellung von Variablen, 
%                 Schl"usselw"ortern und anderen programmierspezifischen 
%                 Details
% \else Macros for Representation of Variables, Keywords and 
%                 other specific Details of Programming
%             \fi}
%
% \ifnum\language=\languageNGerman
% Struktogramme enthalten manchmal direkt zu programmierenden Code.
% Um hier ein einheitliches Aussehen zu erreichen, sind die folgenden
% 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.
% \else
% Structured box charts sometimes include code, that has to be programmed
% directly. For achieving a homogenous appearance the following macros have
% been defined. They have been collected in a seperate \foreign{package}
% \textsf{struktxp.sty} to be able to use them in another connection.
% \fi
%    \begin{macrocode}
%</struktex>
%<*struktxp>
\@ifundefined{pVariable}{}{\endinput}
%    \end{macrocode}
%
% \begin{macro}{\pExpFont@nss}
% \changes{v5.4a}{99/11/16}{neu eingef"uhrt, ersetzt `pVarFont@nss}
% \begin{macro}{\pKeyFont@nss}
% \changes{v4.5a}{96/03/15}{neu eingef"uhrt}
% \begin{macro}{\pCommentFont@nss}
% \changes{v4.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{v4.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{v5.4a}{99/11/16}{neu eingef"uhrt, ersetzt `pVariable}
% \begin{macro}{\pExp}
% \changes{v5.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 Commercial And "'|&|"'.
% \end{enumerate}
% \fi
%
%    \begin{macrocode}
        \catcode`\_=12 \catcode`\^=12 \catcode`\&=12 %
        \pUseExpFont@nss%
}
\let\pExp=\pExpression
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\pVariable}
% \changes{v5.4a}{99/11/16}{neu definiert}
% \changes{v2.0n}{94/03/31}{Neuimplementation gem"a"s `TeXnischer Kom"odie'}
% \begin{macro}{\pVar}
% \changes{v2.0c}{93/12/09}{`pVar als Abk"urzung definiert}
% \begin{macro}{\pKeyword}
% \changes{v5.4a}{99/11/16}{auf `pVariable zur"uckgef"uhrt}
% \changes{v2.0n}{94/03/31}{Neuimplementation gem"a"s `TeXnischer Kom"odie'}
% \changes{v2.0c}{93/12/09}{`pKeyword und `pKey definiert}
% \begin{macro}{\pKey}
% \changes{v5.4a}{99/11/16}{auf `pVariable zur"uckgef"uhrt}
% \changes{v2.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}%
{%
    \bgroup%
        \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{v5.4a}{99/11/16}{neu definiert}
% \changes{v8.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%
    \egroup%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\pLanguage}
% \changes{v5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\Cee@nss}
% \changes{v5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\Java@nss}
% \changes{v5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\Pascal@nss}
% \changes{v5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\LaTeX@nss}
% \changes{v5.4a}{99/11/16}{neu definiert}
% \begin{macro}{\Python@nss}
% \changes{v8.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{v5.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%
            \ifmmode\else\let\mbox=\relax\fi%
            \mbox{\exec\selectfont\arg}%
        \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{v5.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{v4.5a}{96/03/15}{neu definiert}
% \begin{macro}{\pFalse@nss}
% \changes{v4.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{WAHR}}
\newcommand{\pFalse@nss}{\texttt{FALSCH}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\pTrue}
% \changes{v4.5a}{96/03/15}{neu definiert "uber `pTrue@nss}
% \changes{v3.5b}{94/01/19}{umbenannt von `true zur Vermeidung von Interferenzen}
% \changes{v3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\pFalse}
% \changes{v4.5a}{96/03/15}{neu definiert "uber `pTrue@nss}
% \changes{v3.5b}{94/01/19}{umbenannt von `false zur Vermeidung von Interferenzen}
% \changes{v3.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{v4.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{v3.5b}{94/01/19}{umbenannt von `Var zur Vermeidung von Interferenzen}
% \changes{v2.5}{93/09/09}{eingef"uhrt durch Jhf}
% \begin{macro}{\sKey}
% \changes{v4.1a}{95/07/17}{`btt bereits anderweitig definiert}
% \changes{v3.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
%</struktxp>
%<*struktex>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \subsection{\ifnum\language=\languageNGerman Belegung von Registern \else Reservation of Registers \fi}
%
% \begin{macro}{\savelength@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `s@velength}
% \changes{v2.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{v4.0b}{95/05/02}{umbenannt von `gx}
% \changes{v3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \changes{v3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\gy@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `gy}
% \begin{macro}{\gsize@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `gsize}
% \changes{v3.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.
% \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.
% \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{v4.0b}{95/05/02}{umbenannt von `param}
% \changes{v3.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{v4.0b}{95/05/02}{umbenannt von `x}
% \changes{v3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\y@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `y}
% \changes{v3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\xsize@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `xsize}
% \changes{v3.3c}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\xx@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `xx}
% \begin{macro}{\yy@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `yy}
% \begin{macro}{\tempx@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `tempx}
% \begin{macro}{\tempxx@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `tempxx }
% \begin{macro}{\tempxxx@nss}
% \changes{v7.2}{04/07/13}{eingef"uhrt f"ur die Unterst"utzung von pict2e}
% \begin{macro}{\tempy@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `tempy}
% \begin{macro}{\tempyy@nss}
% \changes{v7.2}{04/07/13}{umbenannt von `tempyy}
% \begin{macro}{\tempyyy@nss}
% \changes{v7.2}{04/07/04}{eingef"uhrt f"ur die Unterst"utzung von pict2e}
% \begin{macro}{\ydepth@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `ydepth}
% \changes{v3.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{v4.1a}{95/07/18}{umbenannt von `nss@Box}
% \begin{macro}{\TextBoxHt@nss}
% \changes{v4.1a}{95/07/18}{umbenannt von `nss@BoxHt}
% \changes{v3.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, that 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{v4.1a}{95/07/18}{umbenannt von `filler}
% \changes{v4.1a}{95/07/17}{`emptyset wird als AMS-Schrift geladen}
% \changes{v2.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.
% \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|"'.
% \fi
%    \begin{macrocode}
\DeclareMathSymbol\varnothing{\mathord}{AMSb}{"3F}
\let\emptyset\varnothing
\def\filler@nss%
{
    \ifmmode%
        \emptyset%
    \else $\emptyset$%
    \fi%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c@nter@nss}
% \changes{v4.0b}{95/05/02}{umbenannt von `c@nter}
% \changes{v3.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{v4.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{v4.4b}{96/03/13}{Optionaler Parameter "uber `empty statt `relax getestet}
% \changes{v4.4a}{96/02/29}{`ifthenelse als internes Kommando definiert}
% \changes{v3.1a}{94/09/09}{optionaler Parameter eingef"uhrt}
% \cs{struktogramm} beginnt ein Struktogramm
%    \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
% 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 tread 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{v4.5b}{96/03/26}{Positionierung des Struktogramms "uber [t] bei der minipage}
% \changes{v4.4b}{96/03/13}{Optionaler Parameter "uber `empty statt `relax getestet}
% \changes{v4.2b}{95/10/15}{umbenannt von `struktogramm@nss}
% \changes{v4.0c}{95/05/09}{umbenannt von `nss@struktogramm}
% \changes{v3.1a}{94/09/09}{als internes Makro zur Behandlung optionaler Parameter neu}
% \changes{v3.3a}{94/09/21}{`baselineskip=0pt innerhalb von Struktogrammen korrigiert}
% \ifnum\language=\languageNGerman
% |\struktogramm@NoProof| "offnet ein Struktogramm
% \else
% |\struktogramm@NoProof| opens a structured box chart.
% \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{v4.5b}{96/03/26}{Positionierung des Struktogramms "uber [t] bei der minipage}
% \changes{v4.4b}{96/03/13}{Optionaler Parameter "uber `empty statt `relax getestet}
% \changes{v4.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{v4.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{v4.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}
% \if
% Die aktuelle \cs{unitlength} wird zwischengespeichert, da mit einer eigenen
% Gr"o"se gearbeitet wird.
% \else
% The actual \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}
% \ifnum\language=\languageNGerman
% |\str@kt| setzt globale Werte: |\gx@nss| als x-Koordinate (|#1|), |\gy@nss| als
% y-Koordinate (|#2|) und |\gsize@nss| als Breite des aktuellen Struktogramms
% (|#3|).
% Gleichzeitig wird eine Gruppe ge"offnet, in der mit lokalen Kopien dieser
% Werte (|\x@nss|, |\y@nss| und |\xsize@nss|) gearbeitet werden kann.
% \else
% |\str@kt| sets global values: |\gx@nss| as x-coordinate (|#1|), |\gy@nss| as
% y-coordinate (|#2|) and |\gsize@nss| as width of the actual structured box chart
% (|#3|).
% 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|).
% \fi
%    \begin{macrocode}
\def\str@kt#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%
}
%    \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 group above opened. 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
%    \begin{macrocode}
\def\endstr@kt%
{%
        \global\gy@nss=\y@nss%
    \endgroup%
    \ydepth@nss=\gy@nss%
}
%    \end{macrocode}
% \end{macro}
%
% \changes{v7.0b}{2004/03/09}{ersetzt durch `tempxx@nss}
% \changes{v4.0b}{95/05/08}{umbenannt von `xin}
% \changes{v3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \begin{macro}{\set@nss}
%\changes{v4.0b}{95/05/08}{umbenannt von `set}
% \ifnum\language=\languageNGerman
% |\set@nss| setzt den als ersten Parameter "ubergebenen Text in eine horizontale
% Box |\TextBox@nss|. Ist die Breite dieser Box gr"o"ser als die im ersten Parameter
% "ubergebene Breite, wird der Text in eine vertikale Box
% gesetzt.
% \else
% |\set@nss| sets the text, which is given as first parameter, into a horizontal
% box |\TextBox@nss|. If the width of this box is bigger than the width
% handed over in the first parameter the text will be set into a vertical box.
% \fi
%    \begin{macrocode}
\def\set@nss#1#2%
{%
    \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}%
    \fi%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\block@nss}
% \changes{v7.0a}{04/01/04}{umbenannt von `bl@ck}
% \ifnum\language=\languageNGerman
% |\block@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
% |\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.
% \fi
%    \begin{macrocode}
\def\block@nss#1#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%
    \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%
}
%    \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{\ifnum\language=\languageNGerman Speicherplatz bereitstellen: 
                      \else providing memory space\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\descriptionindent}
% \changes{v4.5a}{96/03/14}{an \LaTeX2e angepasst}
% \changes{v3.3a}{94/09/16}{neu eingef"uhrt}
% \begin{macro}{\descriptionwidth}
% \changes{v4.5a}{96/03/14}{an \LaTeX2e angepasst}
% \changes{v3.3a}{94/09/16}{neu eingef"uhrt}
% \begin{macro}{\descriptionwidth@nss}
% \changes{v4.5a}{96/03/14}{neu eingef"uhrt}
% \begin{macro}{\descriptionsep}
% \changes{v4.5a}{96/03/14}{an \LaTeX2e angepasst}
% \changes{v3.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{v5.2a}{97/12/03}{Vorbesetzung des Fonts entf"allt}
% \changes{v4.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:Companion2}
% \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{v4.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{v4.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{v3.2a}{94/09/14}{Beschreibung eingef"uhrt}
% \ifnum\language=\languageNGerman
% Einfache Anweisungen werden "uber \cs{assign} geschrieben:
% \else
% Simple commands are written by \cs{assign}:
% \fi
%    \begin{macrocode}
\def\assign{\let\next=\@assign\getoption}%
\def\@assign#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}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sub}
% \changes{v4.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{v3.3c}{94/09/27}{Fehler mit der Breite korrigiert}
% \changes{v2.5}{93/09/09}{"Anderungen an der Darstellung}
% \changes{v2.0}{92/01/17}{Eingef"uhrt durch D. Rieger}
% Verlassen einer Schleife an einer bestimmten Stelle.
%    \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{v4.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{v4.1b}{95/07/19}{umbenannt von `w@rt@nss}
% \changes{v4.0b}{95/05/08}{umbenannt von `w@rt}
% \begin{macro}{\index@nss}
% \changes{v4.1b}{95/07/19}{umbenannt von `zaehler@nss}
% \changes{v4.0b}{95/05/08}{umbenannt von `zaehler}
% \begin{macro}{\anzzeilen@nss}
% \changes{v4.1b}{95/07/19}{umbenannt von `zeilen@nss}
% \changes{v4.0b}{95/05/08}{umbenannt von `zeilen}
% \changes{v3.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{v7.0ba}{04/03/09}{umbenannt von `indhelp@nss}
% \begin{macro}{\indentmeasure@nss}
% \changes{v5.3a}{98/11/27}{neu eingef"uhrt}
% \begin{macro}{\indentmeasureleft@nss}
% \changes{v5.3a}{98/11/27}{neu eingef"uhrt}
% \begin{macro}{\thisindent@nss}
% \changes{v5.3a}{98/11/27}{neu eingef"uhrt}
% \begin{macro}{\thisindentleft@nss}
% \changes{v5.3a}{98/11/27}{neu eingef"uhrt}
% \begin{macro}{\thislength@nss}
% \changes{v5.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{v8.0a}{04/07/13}{Paket \textsf{pict2e.sty} wird unterst"utzt}
% \changes{v4.4a}{96/02/29}{Kommando intern gemacht, um benannt von `ifthenelse}
% \changes{v4.1d}{95/10/04}{Tippfehler korrigiert}
% \changes{v4.0d}{95/04/12}{Tippfehler korrigiert}
% \changes{v3.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%
%    \end{macrocode}
% \ifnum\language=\languageNGerman
% Die 5 Parameter sind:
% \else
% The 5 parameters are:
% \fi
% \begin{enumerate}
% \ifnum\language=\languageNGerman
% \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"').
% \else
% \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"').
% \fi
% \end{enumerate}
%    \begin{macrocode}
{%
%    \end{macrocode}
% \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}
    %\ifthenelse{\boolean{anygradient}}%
    %{%
    \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 belibige 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{v8.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
    \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
    \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%
    \put(\x@nss,\y@nss){\makebox(\tempx@nss,\tempyy@nss){#4}}%
    \xx@nss=\x@nss\advance\xx@nss by \tempx@nss%
    \put(\xx@nss,\y@nss){\makebox(\tempxx@nss,\tempyy@nss){#5}}%
    \str@kt{\x@nss}{\y@nss}{\tempx@nss}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\change}
% \changes{v4.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
%    \begin{macrocode}
\def\change%
{%
    \endstr@kt\str@kt{\xx@nss}{\y@nss}{\tempxx@nss}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifend@nss}
% \changes{v4.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
%    \begin{macrocode}
\def\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%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\forever}
% \changes{v3.5a}{94/11/22}{"ubernommen von J. Dietel}
% \changes{v2.0}{92/01/17}{Eingef"uhrt durch D. Rieger}
% \begin{macro}{\foreverend}
% \changes{v3.5a}{94/11/22}{"ubernommen von J. Dietel}
% \changes{v2.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{
    \tempx@nss=\xsize@nss
    \divide\tempx@nss by 6
    \set@nss{\mbox{\rule{0mm}{3ex}}}{\tempx@nss}
    \tempy@nss=\number\param@nss000
    \block@nss{\tempy@nss}{2}
    \advance\x@nss by \ydepth@nss
    \advance\y@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\foreverend{
    \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){}}
    \put(\x@nss,\y@nss){\makebox(\xsize@nss,\tempy@nss){\box\TextBox@nss}}
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\dfr}
% \changes{v4.5b}{96/03/28}{Beschreibung eingef"uhrt}
% \begin{macro}{\dfrend}
% \changes{v4.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}
% \ifnum\language=\languageNGerman
% Beginn und Ende einer kopfgesteuerten Schleife.
% \else
% Begin and end of a loop withtest before.
% \fi
%    \begin{macrocode}
\def\while{\let\next=\@while\getoption}
\def\@while#1{\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
    \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){}} }
%    \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 test after.
% \fi
%    \begin{macrocode}
\def\until{\let\next=\@until\getoption}
\def\@until#1{\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}{2}
    \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\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
    \y@nss=\tempyy@nss
    \put(\x@nss,\y@nss){\framebox(\xsize@nss,\ydepth@nss){}}
    \put(\x@nss,\y@nss){\makebox(\xsize@nss,\tempy@nss)
    {\box\TextBox@nss}}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\cases@nss}
% \changes{v7.0b}{2004/03/09}{ersetzt durch `tempxx@nss}
% \changes{v4.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{v8.0d}{04/12/29}{Fehlerkorrektur: senkrechte Trennlinien haben
% nun die richtige L"ange}
% \changes{v8.0a}{04/07/13}{Paket \textsf{pict2e.sty} wird unterst"utzt}
% \changes{v4.2a}{95/10/04}{um \foreign{default}-Zweig erweitert}
% \changes{v4.1d}{95/10/04}{Dokumentation verbessert}
% \changes{v3.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
%    \begin{macrocode}
\def\case{\let\next=\@case\getoption}
\def\@case#1#2#3#4%
{
%    \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 (mayve 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
                \divide\tempxxx@nss by 1000
                \tempyyy@nss=\tempy@nss
                \advance\tempyyy@nss by -\y@nss
                \divide\tempyyy@nss by 1000
                \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%
                \tempxxx@nss=\xx@nss
                \divide\tempxxx@nss by 1000
                \tempyyy@nss=\tempy@nss
                \advance\tempyyy@nss by -\y@nss
                \divide\tempyyy@nss by 1000
                \put(\x@nss,\y@nss){\line(\tempxxx@nss, \tempyyy@nss){\xx@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=\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{v8.0e}{05/05/17}{`tempxxx@nss umbenannt in `tempxx@nss (wir
% befinden uns nicht im Fall pictIIe)}
% \changes{v8.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 devided 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
%    \begin{macrocode}
    \advance\y@nss by -\tempy@nss
    \put(\x@nss,\y@nss)%
    {%
        \makebox(\tempx@nss,\tempy@nss)[lb]{\raise3pt\hbox{~#4}}%
    }%
    \ydepth@nss=1000000
    \str@kt{\x@nss}{\y@nss}{\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
%    \begin{macrocode}
\def\switch%
{%
    \@ifnextchar [{\@switch}{\@switch[l]}%
}
\def\@switch[#1]#2%
{
    \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%
{
    \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.
% \else
% The following loop is to draw the partitioning lines between the texts of cases.
% \fi
%    \begin{macrocode}
    \loop
        \put(\tempxx@nss,\y@nss){\line(0,1){\tempyy@nss}}
        \advance\tempyy@nss by -\condindent@nss
        \advance\tempxx@nss by \tempx@nss
%    \end{macrocode}
% \ifnum\language=\languageNGerman
% Die Bedeutung der folgenden Zeilen ist noch unklar, was soll die 100?
% \else
% So far the meaning of the following lines is unclear. What means the 100?
% \fi
%    \begin{macrocode}
        \xx@nss=\tempxx@nss
        \advance\xx@nss by -\x@nss
        \advance\xx@nss by 100
        \ifnum \xx@nss<\xsize@nss
    \repeat
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\centerNss}
% \begin{macro}{\endcenterNss}
% \changes{v4.5d}{97/03/19}{`CenterBox@nss global gemacht}
% \changes{v3.3e}{94/09/09}{`centerline durch `strut`hfill ... ersetzt}
% \changes{v3.3e}{94/09/09}{`TmpBox umbenannt in `nss@CenterBox}
% \changes{v3.1a}{94/09/09}{aus \textsf{JHfMakro.STY} "ubernommen}
% \changes{v3.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{v4.5d}{97/03/19}{Belegen von `CenterBox@nss in das `item verlegt}
% \changes{v3.3e}{94/09/09}{`centerline durch `strut`hfill ... ersetzt}
% \changes{v3.3e}{94/09/09}{Auf zus"atzliche Gruppe um `trivlist verzichtet}
% \changes{v3.3e}{94/09/09}{`TmpBox umbenannt in `nss@CenterBox}
% \changes{v3.1a}{94/09/09}{aus \textsf{JHfMakro.STY} "ubernommen}
% \changes{v3.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}
%
% \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{v7.0a}{04/01/05}{neu eingef"uhrt}
% \begin{macro}{\ydeptho@nss}
% \changes{v7.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}

% \begin{macro}{\assert}
% \changes{v7.0a}{04/01/04}{neu eingef"uhrt}
% \begin{macro}{\assert@nss}
% \changes{v7.0a}{04/01/04}{neu eingef"uhrt}
% \ifnum\language=\languageNGerman
% \cs{assert} wird wie \cs{assign} definiert:
% \else
% \cs{assert} is defined just like \cs{assign}:
% \fi
%    \begin{macrocode}
  \newcommand\assert{\let\next=\assert@nss\getoption}%
  \newcommand{\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}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\assertblock@nss}
% \changes{v7.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
% \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: latex
% ^^A TeX-master: t
% ^^A mode: flyspell
% ^^A ispell-local-dictionary: "deutsch8"
% ^^A End:
