% \iffalse meta-comment
%
% Copyright (C) 1995 - 2025 by Jobst Hoffmann, FH Aachen, Campus Jülich
%                              <j.hoffmann_(at)_fh-aachen.de>
% -------------------------------------------------------------------------------------------
%
% This work may be distributed and/or modified under the conditions of the
% LaTeX Project Public License, either version 1.3c of this license or (at
% your option) any later version. The latest version of this license can be
% found at
%
%     https://ctan.org/license/lppl1.3c
%
% and version 1.3c or later is part of all distributions of LaTeX version
% 2005/12/01 or later.
%
% This work is "maintained" (as per LPPL maintenance status) by
% Jobst Hoffmann.
%
% This work consists of the files README.md,
%                                 struktex.dtx and
% and the derived files           struktex.sty,
%                                 strukdoc.sty,
%                                 struktxf.sty
%                                 struktxp.sty
%                                 struktex-test_<n>.tex, n=1(1)3,
%                                 struktex-tst-00.nss,
%                                 struktxf-tst-00.tex,
%                                 struktxp-tst-00.tex,
%                                 build.lua
%                                 build-config.lua
%
%<*ignore>
\begingroup
  \def\x{LaTeX2e}
\expandafter\endgroup
\ifcase 0\ifx\install y1\fi\expandafter
         \ifx\csname processbatchFile\endcsname\relax\else1\fi
         \ifx\fmtname\x\else 1\fi\relax
\else\csname fi\endcsname
%</ignore>
%<*install>
%%
\input docstrip.tex

\preamble

Copyright (C) 1989-2025 by Jobst Hoffmann.  All rights reserved.

IMPORTANT COPYRIGHT NOTICE:

No other permissions to copy or distribute this file in any form
are granted and in particular NO PERMISSION to modify its contents.

You are NOT ALLOWED to change this file.

Please address error reports and any problems in case of UNCHANGED versions
to
        j.hoffmann_(at)_fh-aachen.de
\endpreamble

\declarepostamble\examplepost
\endpostamble

\BaseDirectory{~/texmf}
\UseTDS

\keepsilent

\def\targetdirectory{}                          % or may be for example
%\def\targetdirectory{../../../../texmf/tex/latex/struktex/}

% programs and packages

\Msg{*** Generating the package files ***}

\generate%
{%
    \askforoverwritefalse
    \file{struktex.drv}{\from{struktex.dtx}{driver}}
    \file{struktex.sty}{\from{struktex.dtx}{struktex}}
    \file{strukdoc.sty}{\from{struktex.dtx}{strukdoc}}
    \file{struktxf.sty}{\from{struktex.dtx}{struktxf}}
    \file{struktxp.sty}{\from{struktex.dtx}{struktxp}}
}

\Msg{*** Generating example files ***}

\preamble
\endpreamble%
\generate%
{%
    \askforoverwritefalse
    \usepostamble\examplepost
    \file{struktex-tst-00.nss}{\from{struktex.dtx}{nss-sample}}
    \file{struktex-test-1.tex}{\from{struktex.dtx}{example1}}
    \file{struktex-test-2.tex}{\from{struktex.dtx}{example2}}
    \file{struktex-test-3.tex}{\from{struktex.dtx}{example3}}
    \file{struktxf-tst-00.tex}{\from{struktex.dtx}{struktxf-00}}
    \file{struktxp-tst-00.tex}{\from{struktex.dtx}{struktxp-00}}
}

\Msg{*** Generating some additional files for easier handling ***}
\generate{%
    \askforoverwritefalse%
    \nopreamble\nopostamble\def\MetaPrefix{}%
    \file{build-config.lua}{\from{struktex.dtx}{config}}
    \file{build.lua}{\from{struktex.dtx}{lbuild}}
    \file{struktex.el}{\from{struktex.dtx}{auctex}}
}

\ifToplevel{%
\Msg{***********************************************************}
\Msg{*}
\Msg{* To finish the installation you have to move the file}
\Msg{*}
\Msg{* \space\space\space\space struktex.sty}
\Msg{*}
\Msg{* into a directory searched by TeX:}
\Msg{* To produce the documentation, run the file}
\Msg{*}
\Msg{* \space\space\space\space struktex.dtx through LaTeX.}
\Msg{*}
\Msg{* To see the examples, run the files}
\Msg{*}
\Msg{* \space\space\space\space struktex-test-1.tex}
\Msg{* \space\space\space\space struktex-test-2.tex}
\Msg{* \space\space\space\space struktex-test-3.tex}
\Msg{* \space\space\space\space struktxf-tst-00.tex}
\Msg{* \space\space\space\space struktxp-tst-00.tex}
\Msg{*}
\Msg{* through LaTeX.}
\Msg{***********************************************************}
}

\endbatchfile
%</install>
%<*ignore>
\fi
%</ignore>
%<*driver>
                                % set the default formatting language:
\expandafter\ifx\csname primarylanguage\endcsname\relax
    \def\primarylanguage{ngerman}
    \def\secondarylanguage{english}
\fi

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

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

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

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

% \EnableCrossrefs
% \DisableCrossrefs   % remove comment char if index is ready
% \RecordChanges      % remove comment char to gather update information
% \CodelineIndex      % remove comment char to index entry code by line number
\OnlyDescription    % add comment char to include the implementation details

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

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

\typeout{\string\primarylanguage: \primarylanguage, \string\language: \the\language}
\def\languageNGerman{\the\csname l@ngerman\endcsname} % depends on language.dat,
                                % there may be changes from release to
                                % release

\begin{document}
\makeatletter
\@ifundefined{selectlanguageEnglish}{}{\selectlanguage{english}}
\makeatother
\DocInput{struktex.dtx}
\end{document}
%</driver>
% \fi
%
% \GetFileInfo{struktex.sty}
%
% \changes{v3.0}{25/06/19}{updated Copyright to 2025}
% \changes{v2.4}{20/01/25}{updated Copyright to 2020}
% \changes{v2.3a}{18/03/07}{updated Copyright to 2018}
% \changes{v2.2b}{17/07/09}{better layout of the source code}
% \changes{v2.2a}{17/06/30}{added notes about versioning scheme}
% \changes{v2.2}{17/06/18}{rewrote LIESMICH.md and README.md}
% \changes{v2.1a}{17/06/11}{made the versioning git aware}
% \changes{v2.0}{17/06/01}{changed version control system to git}
% \changes{v2.0}{17/06/01}{updated copyright}
% \changes{v141}{12/04/10}{updated copyright}
% \changes{v131}{10/09/21}{some more layout changes}
% \changes{v130}{10/09/21}{some changes in the layout of the source,
% removed typos}
% \changes{v121}{10/08/31}{scrumbled the email a little bit}
% \changes{v121}{10/08/31}{moved opening brace to end of line in several cases}
% \changes{v084}{10/06/24}{small layout changes}
% \changes{v084}{10/06/24}{corrected revision macro---added missing command}
% \changes{v062}{10/05/31}{moved the docstrip guards into the corresponding macrocode environments}
% \changes{v061}{10/05/31}{corrected some more typos}
% \changes{v057}{10/01/21}{added some missing closing braces at the end of `ProvidesPackage}
% \iffalse%
%<struktex|struktxf|struktxp|strukdoc>\NeedsTeXFormat{LaTeX2e}[1999/12/01]{%
%<struktex|struktxf|struktxp|strukdoc>  \def\@git@ $#1Date: #2-#3-#4 #5$$#6Revision: v#7$ {%
%<struktex>  \ProvidesPackage{struktex}[#2/#3/#4 v#7 Nassi Shneiderman Diagrams (Jobst Hoffmann)]}
%<struktxf>  \ProvidesPackage{struktxf}[#2/#3/#4 v#7 Fonts for Nassi Shneiderman Diagrams (Jobst Hoffmann)]}
%<struktxp>  \ProvidesPackage{struktxp}[#2/#3/#4 v#7 Keywords for Nassi Shneiderman Diagrams (Jobst Hoffmann)]}
%<strukdoc>  \ProvidesPackage{strukdoc}[#2/#3/#4 v#7 support for reading and writing files verbatim (Jobst Hoffmann)]}
%<struktex|struktxf|struktxp|strukdoc>  %% git revision information
%<struktex|struktxf|struktxp|strukdoc>}%
% \fi
%
%
% \CheckSum{0}  ^^A set to 0 to inactivate the CheckSum
% \def\docdate {2025/01/25} ^^A not style'able!!
%
%    \iffalse meta-comment
%            Alles bis zum nächsten `\ 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-2025 Jobst Hoffmann, alle Rechte vorbehalten.
%
%
% Das Kopieren dieser Datei ist nur zulässig, wenn
% (1) keinerlei Änderungen an dieser Datei durchgeführt werden, oder
% (2) wenn diese Datei geändert wird, sie einen anderen Namen als
%     struktex.DTX erhält.
% Diese Einschränkung dient dazu, dass alle Stiloptionen identisch bleiben.
%
% Fehlermeldungen werden erbeten an: Jobst Hoffmann
%                             Email: <j.hoffmann_(at)_fh-aachen.de>
%
% Achtung: um korrekte Bearbeitung zu erzielen, muss die Umgebung
%    \begin{macrocode}
%    ...
%    \end{macrocode}
% immer (mindestens) fünf Zeichen eingerückt sein, also in Spalte
% sechs beginnen!
%
% \fi
%
% \changes{v2.4}{20/01/28}{using `sFile as markup for file names}
% \def\StrukTeXSty{\sFile{struktex.sty}}
%
% \changes{v056}{10/01/21}{changed revision entries "vN.NNx" $\rightarrow$ "v-N.NNx"}
% \changes{v056}{10/01/21}{removed trailing blanks}
% \changes{v054}{10/01/18}{changed revisioning tool from cvs to subversion}
% \changes{v-9.1}{10/01/17}{changed the position of `label commands}
% \changes{v-8.3b}{06/08/20}{Erweiterung im Makefile: für dist wird automatisch
% eine Datei THIS\_IS\_VERSION\_... erzeugt.}
% \changes{v-8.3a}{06/08/19}{struktex.el erweitert: es wird die korrekte Anzahl
% von `switch{} generiert und mit Inhalt gefüllt}
% \changes{v-8.3}{06/08/18}{Weitere Optionen "`draft"' und "`final"' eingeführt}
% \changes{v-8.2a}{06/01/17}{struktex.el korrigiert und erweitert}
% \changes{v-8.1a}{05/09/01}{Erste (fehlerhafte) Version einer struktex.el Stil
% Datei zur Unterstützung von AUC\TeX{} hinzugefügt}
% \changes{v-8.0f}{05/06/11}{Dokumentation von `case verbessert}
% \changes{v-8.0d}{04/12/29}{`switch zeigt bei geeigneten Beispielen das
% rechtsbündige Setzen von Bedingungen}
% \changes{v-8.0c}{04/07/15}{Zweisprachigkeit verbessert, Bezeichner statt
% Nummern eingeführt}
% \changes{v-8.0b}{04/07/14}{`fileversion und `filedate zur einfacheren
% zentralen Verwaltung von Entwicklungsdaten eingeführt}
% \changes{v-7.0b}{04/03/09}{Anzahl der Zähler reduziert}
% \changes{v-7.0a}{03/04/21}{Code teilweise umgestellt}
% \changes{v-7.0a}{03/04/21}{Dateinamen geändert}
% \changes{v-7.0a}{03/04/21}{Tippfehler korrigiert}
% \changes{v-7.0a}{03/04/21}{Marker für interne Beispiele umbenannt}
% \changes{v-7.0a}{03/04/21}{Testrahmen geändert}
% \changes{v-7.0a}{03/04/21}{Beispiele für unterschiedlichen
% Programmierspracheneinsatz erweitert}
% \changes{v-7.0a}{03/04/21}{Makefile integriert}
% \changes{v-7.0a}{03/04/21}{`pLanguage geändert: `pLanguage@nss
% zusätzlich eingeführt}
% \changes{v-7.0a}{03/04/21}{Sprachbezeichnungen geändert: Suffix @nss}
% \changes{v-7.0}{03/04/21}{Wechsel von der RWTH Aachen zur FH Aachen,
% Abt. Jülich}
% \changes{v-6.0a}{01/04/22}{Dokumentation von `case verbessert}
% \changes{v-6.0a}{00/12/08}{Makros `cs, `marg, `oarg, `pparg sowie `envb
% und `enve zur besseren Dokumentation eingesetzt}
% \changes{v-6.0a}{00/11/24}{Englische Übersetzung der Dokumentation
% hinzugefügt }
% \changes{v-6.0a}{00/11/24}{Code umgestaltet, z.B. `def $\rightarrow$
% `newcommand, \$\ldots\$ $\rightarrow$ `(\ldots`) }
% \changes{v-6.0a}{00/11/24}{Zusätzliche Paketoption "`curves"' zur
% Gestaltung beliebiger Steigungen eingeführt}
% \changes{v-5.4b}{00/12/08}{Umgebungen zur einfacheren Notation der
% Dokumentation eingeführt}
% \changes{v-5.4b}{00/12/08}{Erster Versuch einer gemischtsprachigen
% Dokumentation}
% \changes{v-5.4a}{99/11/16}{\sFile{stuktxp.sty} überarbeitet zur
% besseren Darstellung von Programmen}
% \changes{v-5.3a}{98/11/27}{Die Form des Textes in Bedingungen ist nun an
% beliebige Steigungen angepasst}
% \changes{v-5.2b}{98/05/28}{Tippfehlerkorrektur: Umlaut "`ue"' durch
% "`ü"' ersetzt}
% \changes{v-5.2a}{97/12/03}{Umstellung der Dokumentation, dadurch Verzicht
% auf eigene Treiberdatei möglich}
% \changes{v-5.2a}{97/12/03}{kleinere Korrekturen}
% \changes{v-5.1b}{97/11/02}{Umstellung der Dokumentation mittels Umgebung
% \texttt{example}, `verbatiminput und verbatimwrite}
% \changes{v-5.1a}{97/04/29}{kleinere stilistische Änderungen nach W. Hanrath}
% \changes{v-5.0}{97/04/28}{Dateinamen zwecks Kompatibilität auf
% Kleinschreibung umgesetzt}
% \changes{v-5.0}{97/04/28}{kleinere textuelle Änderungen, Fontauswahl
% teilweise geändert}
% \changes{v-5.0}{97/04/28}{Abhängigkeiten der Dokumentation von
% zusätzlichen Paketen beseitigt}
% \changes{v-4.5e}{97/04/25}{Verzicht auf Groß- und Kleinschreibung im
% Namen von .sty-Dateien}
% \changes{v-4.5a}{96/03/14}{Umgebung \texttt{description} auf
% \texttt{list}-Umgebung zurückgeführt}
% \changes{v-4.5a}{96/03/14}{Eigenes Paket zur Formatierung von
% Programminhalten integriert}
% \changes{v-4.1c}{95/07/24}{Dokumentation verbessert}
% \changes{v-4.1b}{95/07/19}{Höhe des Bedingungsrechteckes bei `ifthenelse
% vorgebbar}
% \changes{v-4.1a}{95/07/17}{Geraden mit beliebiger Steigung durch `emline
% möglich}
% \changes{v-4.0a}{95/04/12}{Anpassung an LaTeX2e}
% \changes{v-3.5a}{94/11/22}{Entwicklunglinien J. Dietel, J. Hoffmann vereinigt}
% \changes{v-3.3a}{94/09/14}{Schnittstellenbeschreibung verallgemeinert}
% \changes{v-3.2a}{94/09/14}{Dokumentation verbessert}
% \changes{v-3.1a}{94/09/09}{Verschiedene Erweiterungen}
% \changes{v-3.0a}{94/06/06}{Urversion mit integrierter Dokumentation}
% \changes{v-2.5}{93/09/09}{Jobst Hoffmann, Rechenzentrum RWTH Aachen}
% \changes{v-2.0}{92/01/17}{Dorothea Rieger, Rechenzentrum RWTH Aachen}
% \changes{v-1.41}{88/06/20}{Andreas Wagener, Proze"srechner CYBER 815}
%
% \DoNotIndex{\ ,\!,\C,\[,\\,\],\^,\`,\{,\},\~,\<,\=}
% \DoNotIndex{\@ifundefined,\@ne,\catcode,\def,\docdate}
% \DoNotIndex{\else,\endinput,\expandafter,\fi,\filedate,\fileversion}
% \DoNotIndex{\gdef,\global,\ifnum,\ifx,\let,\long}
% \DoNotIndex{\newcount,\newdimen,\newif,\next,\space,\string}
% \DoNotIndex{\the,\xdef,\z@}
% \DoNotIndex{\@@par, \@empty, \@hangfrom, \@reffalse, \@reftrue,}
% \DoNotIndex{\advance, \Alph, \alph, \arabic, \baselineskip, \begin}
% \DoNotIndex{\bgroup, \box, \bullet, \cdot, \centering}
% \DoNotIndex{\columnwidth, \day, \divide}
% \DoNotIndex{\egroup, \end, \font, \footins, \foo}
% \DoNotIndex{\frenchspacing, \hbadness, \hbox, \hfil, \hfill}
% \DoNotIndex{\hrule, \hsize, \hskip, \hspace, \hss, \ifcase, \ifdim, \ifodd}
% \DoNotIndex{\ifvmode, \ignorespaces, \input, \interlinepenalty, \item}
% \DoNotIndex{\itemindent, \kern, \L, \list, \listparindent, \magstep}
% \DoNotIndex{\magstephalf, \makelabel, \MakeShortVerb, \marginpar}
% \DoNotIndex{\mark, \month, \newpage, \nobreak, \noindent, \normalsize, \null}
% \DoNotIndex{\number, \onecolumn, \or, \overfullrule}
% \DoNotIndex{\pagebreak, \parbox, \penalty, \phantom}
% \DoNotIndex{\raggedbottom, \raggedleft}
% \DoNotIndex{\relax, \renewcommand, \reversemarginpar}
% \DoNotIndex{\rightmargin, \rule, \setbox, \setcounter}
% \DoNotIndex{\setlength, \settowidth, \strut, \svtnsfb}
% \DoNotIndex{\thepage, \thispagestyle, \triangleright}
% \DoNotIndex{\underline, \vadjust, \vbadness, \vbox, \verb, \vfil}
% \DoNotIndex{\vspace, \wd, \year}
% \DoNotIndex{\arg}
% \DoNotIndex{\begingroup, \bottomfraction}
% \DoNotIndex{\CodelineIndex, \columnsep, \csname}
% \DoNotIndex{\DisableCrossrefs, \DocInput, \documentstyle, \dp}
% \DoNotIndex{\empty, \EnableCrossrefs, \endcsname, \endgroup}
% \DoNotIndex{\evensidemargin, \exhyphenpenalty}
% \DoNotIndex{\framebox}
% \DoNotIndex{\headsep, \ht, \hyphenpenalty}
% \DoNotIndex{\ifmmode, \ifundefined, \it}
% \DoNotIndex{\leftarrow, \leftskip}
% \DoNotIndex{\makeatletter, \makeatother, \makebox, \marginparwidth}
% \DoNotIndex{\newbox}
% \DoNotIndex{\oddsidemargin, \OnlyDescription}
% \DoNotIndex{\parfillskip, \parindent, \parshape, \parskip, \pretolerance}
% \DoNotIndex{\raise, \RecordChanges}
% \DoNotIndex{\textheight, \textwidth, \tolerance, \topmargin, \typeout}
% \DoNotIndex{\vrule, \vtop}
% \DoNotIndex{\bf, \tt, \par, \smallskip, \stepcounter}
%
% \pFonts{\itshape}{}{} ^^A Variablen werden als italics ausgegeben
%
% \changes{v-9.2}{10/01/18}{changed some textual layout}
% \IndexPrologue{%
% \section*{Index}
% \ifnum\language=\languageNGerman
%   Die kursiven Zahlen bezeichnen die Seite, auf der der jeweilige Eintrag
%   beschrieben ist, unterstrichene Zahlen verweisen auf seine Definition;
%   alle anderen Zahlen geben Stellen an, an denen der Eintrag auftritt.%
% \else%
%   The italic numbers mark the page certain entries are described on.
%   Underlined numbers refer to its definition. All other numbers declare
%   positions, where the entry occurs.%
% \fi}
% ^^A \setlength{\IndexMin}{0.3\textheight}
%
% ^^A \iflanguage{}{} ist für große Textblöcke nicht nutzbar (stack
% ^^A overflow), daher durchgehend die Konstruktion
% ^^A \ifnum\language=\languageNGerman
% ^^A <deutscher Text>
% ^^A \else
% ^^A <englischer Text>
% ^^A \fi
%
% \GlossaryPrologue{\section*{\ifnum\language=\languageNGerman
% Revisionsgeschichte
% \else%
% History\fi}}
%
% \title{\StrukTeXSty\thanks{\ifnum\language=\languageNGerman%
%           Diese Datei hat die Versionsnummer \fileversion, wurde zuletzt
%           bearbeitet am \filedate, und die Dokumentation datiert vom
%           \docdate.
%        \else%
%          This file has version number \fileversion, last revised on
%          \filedate{}, documentation dated \docdate.
%        \fi%
% }
%        }
% \author{\ifnum\language=\languageNGerman%
%           Jobst Hoffmann\\
%           Fachhochschule Aachen, Abt. Jülich\\
%           Ginsterweg 1\\
%           52428 Jülich\\
%           Bundesrepublik Deutschland
%         \else%
%           Jobst Hoffmann\\
%           University of Applied Sciences Aachen, Abt. Jülich\\
%           Ginsterweg 1\\
%           52428 Jülich\\
%           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 des
%         \LaTeX-Paketes \StrukTeXSty{} zum Setzen von Struktogrammen
%         nach Nassi-Shneiderman.
%     \end{abstract}
% \else
%     \begin{abstract}
%         This article describes the use and implementation of the
%         \LaTeX-\foreign{package} \StrukTeXSty{} for structured box charts
%         (Nassi-Shneiderman diagrams).
%     \end{abstract}
% \fi
%
% \newif\ifmulticols
% \IfFileExists{multicol.sty}{\multicolstrue}{}
%
% \ifmulticols
% \addtocontents{toc}{\protect\begin{multicols}{2}}
% \fi
%
% {\parskip 0pt                ^^A We have to reset \parskip
%                              ^^A (bug in \LaTeX)
% \tableofcontents
% }
%
%
% \changes{v074}{10/06/08}{little corrections concerning the license}
% \section{\ifnum\language=\languageNGerman Lizenzvereinbarung\else
% License\fi}
%
% This package is copyright \copyright{} 1995 -- 2025 by:
% \begin{quote}
%      Jobst Hoffmann,
%      E-Mail: j.hoffmann\_(at)\_fh-aachen.de
% \end{quote}
% This program can be redistributed and/or modified under the terms of
% the LaTeX Project Public License, distributed from the CTAN archives
% as file \url{https://ctan.org/license/lppl1.3c}; either version 1 of
% the License, or (at your option) any later version.
%
%
% \section{\ifnum\language=\languageNGerman Vorwort\else Preface\fi}
%\label{sec:vorwort}
%
% \begin{quote}
%     \sffamily\small%
%     \ifnum\language=\languageNGerman%
%     \StrukTeX{} hat eine lange Entwicklung hinter sich. Bei der
%     Entwicklung wurden verschiedene Programme zur Versionsverwaltung --
%     cvs, subversion und aktuell git -- eingesetzt, die alle
%     unterschiedliche Möglichkeiten bieten, Versionsnummern zu
%     definieren. Um diese unterschiedlichen Versionsnummern zeitlich
%     zuordnen zu können, wird folgendes Schema verwendet: Versionnummern
%     der Form "`v-\meta{d}.\meta{d}[\meta{a}]"' mit \meta{d} als
%     Dezimalzahl und \meta{a} als Buchstabe, etwa v-4.1a bezeichnen die
%     erste Entwicklungslinie (rcs). Die folgenden Versionnummern haben die
%     Form "`v\meta{n}\meta{n}\meta{n}"' mit \meta{n} als Dezimalziffer,
%     \zB{} v122 (subversion). Die aktuelle Entwicklung erfolgt unter git
%     und benutzt Versionnummern der Form
%     "`v\meta{d}.\meta{d}[\meta{a}][-\meta{d}]-g\meta{x}"', beispielsweise
%     v2.1-13-gd28a927; \meta{x} ist dabei eine Hexadezimalzahl. Allgemein
%     gilt für das Alter und somit die Reihenfolge der Versionen%
%     \else%
%     \StrukTeX{} has a long history. In development several different
%     programs for version management were used---rcs, subversion and
%     currently git---, all of which offer different possibilities to
%     define version numbers. To correlate these different version numbers
%     correctly in time, the following schema will be used: Version numbers
%     of the form ``v-\meta{d}.\meta{d}[\meta{a}]'' with \meta{d} as a decimal
%     digit and \meta{a} as a character, say v-4.1a denote the first
%     development line (rcs). The following version numbers have the form
%     ``v\meta{n}\meta{n}\meta{n}'' with \meta{n} as a decimal number,
%     e.\,g.  v122 (subversion). The current development is under git and
%     uses version numbers of the form
%     \meta{d}.\meta{d}[\meta{a}][\meta{d}]-g\meta{x}, for example,
%     v2.1-13-gd28a927; \meta{x} stands for a hexadecimal number. In
%     general, the age and therefore the sequence of the versions is%
%     \fi
%     \[
%         \mbox{v-\meta{d}.\meta{d}[\meta{a}]} <
%         \mbox{v\meta{n}\meta{n}\meta{n}} <
%         \mbox{v\meta{d}.\meta{d}[\meta{a}][-\meta{d}]-g\meta{x}}
%     \]
% \end{quote}
%
% \changes{v100}{10/06/25}{added remark about Struktorizer}
% \changes{v-8.0b}{04/07/14}{Hinweis auf \sFile{pict2e.sty}}
% \changes{v-8.0b}{04/07/14}{Entwicklungsgeschichte korrigiert und
% erweitert}
% \ifnum\language=\languageNGerman
% Mit dem hier beschriebenen Makropaket ist es möglich,
% 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öcke, Schleifenkonstrukte,
% Sinnbilder für Alternativen usw.\ zu generieren. Die Struktogramme
% werden mit Hilfe der Picture-Umgebung von \LaTeX{} erzeugt.\footnote{%
% Wer es scheut, Struktogramme mittels \LaTeX{} direkt zu schreiben, kann
% beispielsweise unter \url{http://structorizer.fisch.lu/} ein Programm
% (Struktorizer) finden, mit dem man seine Struktogramme mittels Maus
% entwickeln und abschließend als \LaTeX-Code exportieren kann.} %
% \else%
% It is possible to draw structured box charts by this package of macros
% which is described herewith. Through this article the package will be
% always called \StrukTeX. It can generate the most important elements of a
% structured box chart like processing blocks, loops, mapping conventions
% for alternatives etc.\footnote{%
% Those who don't like to code the diagrams by hand, can use for example
% the program Struktorizer (\url{http://structorizer.fisch.lu/}). By using
% this program one can draw the diagrams by mouse and export the result
% into a \LaTeX-file.} %
% \fi%
%
% \ifnum\language=\languageNGerman%
%     Ab Version v-4.1a werden die mathematischen Symbole von \AmSTeX{} geladen,
%     die den mathematischen Zeichensatz erweitern und andere Darstellungen von
%     Mengensymbolen (etwa \(\nat\), \(\integer\) und
%     \(\real\) für die natürlichen, ganzen und reellen Zahlen) ermöglichen.
%     Insbesondere das Zeichen für die leere Menge
%     ($\emptyset$) ist in der Darstellung auffälliger als das
%     standardmäßige Zeichen
%     ("`\(\mathchar"023B\)"') und somit besser für die Darstellung von
%     Struktogrammen geeignet. Die Dokumentation der Zeichen und weiterer
%     Kommandos findet sich in \ref{sec:spez-zeichen}%
% \else%
%     Since version v-4.1a the mathematical symbols are loaded by \AmSTeX.  They
%     extend the mathematical character set and make other representations of
%     symbols sets (like \(\nat\), \(\integer\) and \(\real\) for the
%     natural, the integer and the real numbers) possible. specially the
%     symbol for the empty set (\(\emptyset\)) has a more outstanding
%     representation than the standard symbol
%     (``\(\mathchar"023B\)''). Therefore it is the better representation
%     in structured box charts.%
% \fi
%
% \ifnum\language=\languageNGerman
% Weiterhin ist aus dem \sFile{oz.sty} die Idee übernommen,
% Variablennamen in \foreign{italics} zu setzen, ohne dass die teilweise
% unschönen Zwischenräume erzeugt werden.
% \else%
% Furthermore the idea to set names of variables in \foreign{italics}
% without generating the partly unpleasant distances is taken over from
% \sFile{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
% \sFile{emlines2.sty} zu zeichnen, um die durch \LaTeX{} gegebenen
% Einschränkungen -- es gibt nur vordefinierte Steigungen --
% aufzuheben. Dies ist -- für das \cs{ifthenelse} mit den
% Versionen v-4.1a und v-4.1b, für das \cs{switch} mit der Version v-4.2a --
% erledigt, nicht jedoch für Systeme, die die
% entsprechenden |\special{|\dots|}|-Befehle nicht unterstützen.
% Erreicht werden kann dies jedoch durch Einsatz entsprechender Makros
% aus dem \sFile{curves.sty}. Seit der Version v-8.0a wird das Paket
% \sFile{pict2e.sty} unterstützt, das mittels der üblichen Treiber die von
% der |picture|-Umgebung bekannten Beschränkungen 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
% \sFile{emlines2.sty} for eliminating the constraints given by
% \LaTeX---there are only predefined slopes. This is done for the
% \cs{ifthenelse} in the versions v-4.1a and v-4.1b and for \cs{switch} in
% the version v-4.2a, but not for the systems, which do not support the
% corresponding |\special{|\dots|}|-commands. Nevertheless it can be
% attained by using the corresponding macros of \sFile{curves.sty}. Since
% version v-8.0a the package \sFile{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öcke zu erweitern,
% wie sie in dem Buch von Futschek (\cite{Futschek:Programmentwicklung})
% eingesetzt werden. Dieses ist ebenfalls mit der Version v-8.0a realisiert
% worden.%
% \else%
% Just so it is planned to extend structured box charts by comments as they
% are used in the book of Futschek
% (\cite{Futschek:Programmentwicklung}). This is also implemented in
% version v-8.0a.%
% \fi
%
% \ifnum\language=\languageNGerman
% Weitere Zukunftspläne sind:
% \else%
% Further plans for future are:%
% \fi%
%
% \begin{enumerate}
%   \item \ifnum\language=\languageNGerman%
%     Ein \cs{otherwise}-Zweig beim \cs{switch} (abgeschlossen durch die
%     Version v-4.2a).%
%     \else%
%     An \cs{otherwise}-branch at \cs{switch} (done in version v-4.2a).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Neuimplementation der |declaration|-Umgebung mittels der
%     |list|-Umgebung gemäß
%     \cite[Abs. 3.3.4]{GoossensMittelbachSamarin:Companion} (abgeschlossen
%     mit der Version v-4.5a).%
%     \else%
%     The reimplementation of the |declaration|-environment through the
%     |list|-environment by
%     \cite[Abs. 3.3.4]{GoossensMittelbachSamarin:Companion} (done in
%     version v-4.5a).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Anpassung an \LaTeXe\ im Sinne eines Packages (abgeschlossen
%     durch die Version v-4.0a).%
%     \else%
%     The adaption to \LaTeXe\ in the sense of packages (done in version
%     v-4.0a).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Verbesserung der Dokumentation, um Teile des Algorithmus
%     verständlicher zu machen.
%     \else%
%     The improvement of documentation in order to make parts of the
%     algorithm more understandable.%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Unabhängigkeit des \StrukTeXSty{} von anderen
%     \sFile{.sty}-Dateien wie etwa dem \sFile{JHfMakro.sty}
%     (abgeschlossen mit der Version v-4.5a).%
%     \else%
%     The independence of \StrukTeXSty{} of other \sFile{.sty}-files like
%     e.g. \sFile{JHfMakro.sty} (done in version v-4.5a).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%      \changes{v-4.5a}{96/03/14}{Umbenennungen: `sVar $\rightarrow$ `pVar, \ldots}%
%      \changes{v-4.3a}{96/01/26}{Variable `sBoolValue ersetzt `sLVal}
%     Die vollständige Implementation der Makros \cs{pVar}, \cs{pKey},
%     \cs{pFonts}, \cs{pTrue}, \cs{pFalse} und \cs{pBoolValue} (erledigt
%     vor Version v-7.0).%
%     \else%
%     \changes{v-4.5a}{96/03/14}{redesignation: `sVar $\rightarrow$ `pVar,
%     \ldots}
%     \changes{v-4.3a}{96/01/26}{variable `sBoolValue replaces `sLVal}%
%     The complete implementation of the macros \cs{pVar}, \cs{pKey},
%     \cs{pFonts}, \cs{pTrue}, \cs{pFalse} and \cs{pBoolValue} (done before
%     version v-7.0).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     \changes{v-4.4a}{96/02/29}{Kommando `ifthenelse internalisiert}%
%     Die vollständige 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äglicher zu gestalten,
%     etwa mit dem \sFile{ifthenelse.sty}. Begonnen wurde die
%     Internalisierung mit der Version v-4.4a.
%     \else%
%     \changes{v-4.4a}{96/02/29}{command `ifthenelse internalisated}%
%     The complete internalization of commands, which only make sense in
%     the environment |struktogramm|. Internalization means, that these
%     commands are only defined in this environment. This is for
%     compatibility of this package with other packages, e.g. with
%     \sFile{ifthenelse.sty}.  The internalization has been started in
%     version v-4.4a.
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Die Unabhängigkeit der Dokumentation von anderen
%     \sFile{.sty}-Dateien wie etwa dem \sFile{JHfMakro.sty}
%     (abgeschlossen mit der Version v-5.0).%
%     \else%
%     The independence of the documentation of other \sFile{.sty}-files
%     like \sFile{JHfMakro.sty} (done in version v-5.0).%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Eine alternative Darstellung der Deklarationen, wie sie von Rico Bolz
%     vorgeschlagen wurde%
%     \else%
%     an alternative representation of declarations as proposed by Rico
%     Bolz%
%     \fi%
%
%   \item \ifnum\language=\languageNGerman%
%     Wiedereinführung 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 dieser Dokumentation%
%   \else%
%   Hints for maintenance and installation
%   of this documentation%
%   \fi}
%
% \ifnum\language=\languageNGerman%
% \changes{v3.0}{25/06/19}{rewrote text about installation using l3build}
% \changes{v-4.5e}{97/04/26}{Neue .sty-Datei strukdoc.sty eingeführt}
% \changes{v-1.5}{92/01/07}{StrukTeX Makros nun als .sty-Datei, J. Hoffmann}
% \changes{v-2.0}{92/01/17}{Erweitert um `exit, `forever und `foreverend, D. Rieger}
% \changes{v-2.1}{92/01/07}{`exit modifiziert, J. Hoffmann}
% \changes{v-2.2}{93/09/08}{Beschreibung von Variablen eingeführt, J. Hoffmann}
% \changes{v-2.2a}{93/09/09}{Beschreibung von Variablen verbessert, J. Hoffmann}
% \else%
% \changes{v-4.5e}{97/04/26}{new .sty-File strukdoc.sty introduced}
% \changes{v-1.5}{92/01/07}{StrukTeX macros now as .sty-File, J. Hoffmann}
% \changes{v-2.0}{92/01/17}{extended by `exit, `forever and `foreverend, D. Rieger}
% \changes{v-2.1}{92/01/07}{`exit modified, J. Hoffmann}
% \changes{v-2.2}{93/09/08}{description of variables introduced, J. Hoffmann}
% \changes{v-2.2a}{93/09/09}{description of variables improved, J. Hoffmann}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Das Paket, zu dem der  \StrukTeXSty{} gehört, besteht aus
% insgesamt fünf Dateien:
% \begin{quote}
% \texttt{LIESMICH.md}, \\
% \texttt{README.md}, \\
% \texttt{struktex.dtx}, \\
% \texttt{struktex.de.pdf} und \\
% \texttt{struktex.en.pdf}.
% \end{quote}
% Um daraus einerseits die Dokumentation, andererseits die \sFile{.sty}-Datei
% zu erzeugen, muss folgendermaßen vorgegangen werden:
% \else%
% The package \StrukTeXSty{} is belonging to consists of altogether five files:
% \begin{quote}
% \texttt{LIESMICH.md}, \\
% \texttt{README.md}, \\
% \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
% \sFile{.sty}-file one has to proceed as follows:%
% \fi%
%
% \changes{v3.0a}{25/06/20}{corrected last(?) glitches}
% \changes{v2.4}{20/01/28}{corrected number of examples}
% \ifnum\language=\languageNGerman%
% Zunächst wird mit \zB\
% \begin{quote}\tt
% pdftex  struktex.dtx
% \end{quote}
% die Datei \sFile{struktex.dtx} formatiert.
%
% Dieser Formatierungslauf erzeugt einige weitere Dateien. Dies sind zunächst
% alle drei \sFile{.sty}-Dateien \sFile{struktex.sty},
% \sFile{struktxf.sty} und \sFile{struktxp.sty}, die beiden letzteren werden von
% \StrukTeXSty{} verwendet.  Weiterhin sind dies die beiden Dateien
% \sFile{struktex-tst-00.nss} und \sFile{strukdoc.sty}, die
% für die Erstellung der hier vorgestellten Dokumentation verwendet werden.  Dann gibt es
% fünf Testdateien \sFile{struktex-test-\textit{i}.tex}, \(i=1(1)3\),
% \sFile{struktxf.tex} und \sFile{struktxf.tex} zum Testen der
% entsprechenden \textsf{. sty}-Dateien und nicht zuletzt zwei
% Skriptdateien \sFile{lbuild.lua} und \sFile{lbuild-config.lua} (siehe
% \cref{sec:lbuild_lua}).
%
% Die Dokumentation wird gemäß \textsf{l3build} mit dem Befehl
% \begin{quote}\tt
%     l3build doc
% \end{quote}
% erzeugt.
%
% Das Ergebnis dieses Formatierlaufes ist die
% Dokumentation in Form einer \sFile{.pdf}-Datei, die in gewohnter Weise
% weiterbearbeitet werden kann. Weitere Informationen zum Arbeiten mit der
% integrierten Dokumentation findet man in
% \cite{FM:TheDocAndShortvrbPackages-V-2.0} und
% \cite{MittelbachDuchierBraams:DocStrip-V-2.5b}.%
% \else%
% First the file \sFile{struktex.dtx} will be formatted e.g.\ with
% \begin{quote}\tt
%     pdftex struktex.dtx
% \end{quote}
%
% This formatting run creates a few more files. These are first of
% all the three \sFile{.sty}-files \sFile{struktex.sty},
% \sFile{struktxf.sty} and \sFile{struktxp.sty}, the latter two are used by
% \StrukTeXSty.  Furthermore these are the two files
% \sFile{struktex-tst-00.nss} and \sFile{strukdoc.sty}, which are used
% for the generation of the hereby presented documentation.  Then there are
% five test files \sFile{struktex-test-\textit{i}.tex}, \(i=1(1)3\),
% \sFile{struktxf.tex}, and \sFile{struktxf.tex} for testing the
% corresponding \textsf{.sty}-files and last, but not least two script
% files \sFile{lbuild.lua} and \sFile{lbuild-config.lua} (see
% \cref{sec:lbuild_lua}).
%
% The documentation is generated according to \textsf{l3build} with the command
% \begin{quote}\tt
% l3build doc
% \end{quote}
%
% The result of this formatting run is the documentation in form of a
% \sFile{.pdf}-file, that can be manipulated the normal way. Further
% informations about the work with the integrated documentation one can
% find in \cite{FM:TheDocAndShortvrbPackages-V-2.0} and
% \cite{MittelbachDuchierBraams:DocStrip-V-2.5b}.%
% \fi
%
% \changes{v100}{10/06/25}{corrected some inconsistencies in the
% description of the installation process}
% \ifnum\language=\languageNGerman%
% Die Installation wird abgeschlossen, indem die Datei
% \texttt{struktex.sty} in ein Verzeichnis verschoben wird, das von \TeX{}
% gefunden werden kann, das ist in einer TDS-konformen Installation
% typischerweise \texttt{.../tex/latex/struktex/}, die Dokumentation wird
% analog in das Verzeichnis \texttt{.../doc/latex/struktex/}
% verschoben.\footnote{Wenn die automatische Installation (vgl. Abschnitt
% \ref{sec:lbuild_lua}) vorgenommen wird, erfolgt diese entsprechend.} %
% \else%
% To finish the installation, the file \texttt{struktex.sty} should be
% moved to a directory, where \TeX{} can find it, in a TDS conforming
% installation this is \texttt{.../tex/latex/struktex/} typical,
% analogously the documentation has to be moved to
% \texttt{.../doc/latex/struktex/}. If the installation process is done
% automatically (see section \ref{sec:lbuild_lua}), the target directories
% follow that rule. %
% \fi
%
% \ifnum\language=\languageNGerman%
% Sollen Änderungen durchgeführt werden, so sollten neben diesen
% die Werte von \cs{fileversion}, \cs{filedate} und \cs{docdate} bei Bedarf
% entsprechend geändert werden. Weiterhin sollte darauf geachtet werden,
% dass die Revisionsgeschichte durch Einträge von
% \begin{quote}
% |\changes{|\meta{Version}|}{|\meta{Datum}|}{|\meta{Kommentar}|}|
% \end{quote}
% weitergeschrieben wird.
% \meta{Version} gibt die Versionsnummer an, unter der die jeweilige
% Änderung durchgeführt wurde,
% \meta{Datum} gibt das Datum in der Form |yy/mm/dd| an und
% \meta{Kommentar} erläutert die jeweilige Änderung.
% \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 shouldn't begin with
% ``\texttt{\textbackslash}'' (\foreign{backslash}), but with the
% ``\texttt{`}'' (\foreign{accent}).% \fi%
%
% \changes{v2.1b}{17/06/17}{better wording: leftright $\rightarrow$ outer}
% \changes{v-8.0b}{04/07/14}{Umstellung der Sprachverwaltung auf babel}
% \ifnum\language=\languageNGerman%
% Die nächsten Anweisungen bilden den Treiber für die hier vorliegende
% Dokumentation.
% \else%
% The following commands make up the driver of the documentation lieing before.%
% \fi%
% \changes{v130}{10/09/21}{set additional option for (internally loaded)
% package url to obey spaces}
% \changes{v-9.2}{10/01/18}{changed the selection of languages}
% {%
%   \def\listinglabel#1{\llap{\footnotesize\rmfamily\the#1}%
%       \hskip\listingoffset\relax}
%       \footnotesize\listinginput{1}{struktex.drv}
% }
%
%
% \section{\ifnum\language=\languageNGerman Die Benutzungsschnittstelle
%             \else The User interface
%             \fi}
% \changes{v2.4}{20/01/28}{unified `label/`ref arguments}
% \label{sec:interface}
% \changes{v-4.3a}{96/01/26}{Dokumentation verbessert und korrigiert}
% \ifnum\language=\languageNGerman%
% Der \StrukTeXSty{} wird wie jede andere |.sty|-Datei als \foreign{package} in
% ein \LaTeX-Dokument eingebunden:
% \begin{quote}
% |\usepackage[|\meta{Optionen}|]{struktex}|
% \end{quote}
% \else%
% The \StrukTeXSty{} will be included in a \LaTeX-document like every other
% |.sty|-file by \foreign{package}:
% \begin{quote}
% |\usepackage[|\meta{options}|]{struktex}|
% \end{quote}%
% \fi%
%
% \changes{v2.0c}{17/06/06}{added description of debug and leftright option}
% \changes{v141}{12/04/10}{added description of default values}
% \changes{v141}{12/04/10}{added description of language option}
% \ifnum\language=\languageNGerman%
% Die folgenden Optionen stehen zur Verfügung:
% \begin{enumerate}
%   \item |english|, |ngerman| oder |german|:
%
%     Die jeweilige Option legt die Sprache für definierte Werte wie
%     |\sTrue| fest, Standardwert ist |english|.
%   \item |emlines|, |curves| oder |pict2e|:
%
%     Durch Angabe einer der drei Optionen ist es möglich, beliebige
%     Steigungen in Struktogrammen zu zeichnen. Erstere Option ist
%     sinnvoll, wenn mit dem em\TeX-Paket von Eberhard Mattes gearbeitet
%     wird (DOS oder OS/2), ansonsten wird der Einsatz von |pict2e|
%     empfohlen. Der Einsatz des Paketes \sFile{curves.sty} (Ian
%     Maclaine-cross), das das Zeichnen von Geraden beliebiger Steigungen
%     durch das Setzen vieler einzelner Punkte ermöglicht, ist durch das
%     Erscheinen des Paketes \sFile{pict2e.sty} (Hubert Gäßlein und Rolf
%     Niepraschk) im Prinzip obsolet, aus Kompatibilitätsgründen wird er
%     weiter unterstützt. Durch die Angabe einer der genannten Option wird
%     das jeweilige Paket (\sFile{emlines2.sty}, \sFile{curves.sty} bzw.
%     \sFile{pict2e.sty}) automatisch geladen, Standardwert ist |pict2e|.
%   \item |verification|:
%
%     Nur wenn diese Option gesetzt ist, steht \cs{assert} als Kommando zur
%     Verfügung.
%   \item |nofiller|:
%
%     Setzen dieser Option lässt jeden Freiraum leer. Ansonsten wird
%     Freiraum in Alternativen als \(\emptyset\) markiert.
%   \item |draft|, |final|:
%
%     Diese Optionen dienen in üblicher Weise dazu, den Entwurf
%     beziehungsweise die endgültige Fassung zu kennzeichnen (vgl.
%     |\sProofOn|/|\sProofOff|). Im Entwurfsmodus werden die vier Eckpunkte
%     eines Struktogramms in der vom Benutzer vorgegebenen Größe
%     ausgegeben, diese Markierung fällt in der endgültigen Fassung
%     weg. Der Standardwert ist |final|.
%   \item |debug|:
%
%     Mit dem Setzen dieser Option werden Zeilen der Form
%     \begin{quote}
%         |===> dbg |\meta{Text}
%     \end{quote}
%      in die .log-Datei geschrieben.
%   \item |outer|:
%
%     Das Setzen dieser Option führt dazu, die ja/nein Flaggen statt auf
%     der Mitte der Grundlinie jeweils links bzw. rechts außen erscheinen
%     zu lassen.
% \end{enumerate}
% Nach dem Laden der |.sty|-Datei stehen verschiedene Kommandos und Umgebungen
% zur Verfügung, die das Zeichnen der Struktogramme ermöglichen.%
% \else%
% The following options are available:
% \begin{enumerate}
%   \item |english|, |ngerman| oder |german|:
%
%     This option defines the language of defined values as |\sTrue|,
%     default: |english|.
%   \item |emlines|, |curves|, or |pict2e|:
%
%     If you set one of these options, any slope can be drawn in the
%     structured box chart. You should use |emlines|, if you are working
%     with the em\TeX-package for DOS or OS/2 by E. Mattes, else you should
%     use |pict2e|; |curves| is included just for compatibility. In all
%     cases the required packages (\sFile{emline2.sty},
%     \sFile{curves.sty}, or \sFile{pict2e} resp.) will be loaded
%     automatically; the default value is |pict2e|.
%   \item |verification|:
%
%     Only if this option is set, the command \cs{assert} is available.
%   \item |nofiller|:
%
%     Setting this option prohibits setting of \(\emptyset\) in alternatives.
%   \item |draft|, |final|:
%
%     These options serve as usual to diffentiate between the draft and the
%     final version of a structured box chart (see |\sProofOn|). While in
%     the draft mode the user given size of the chart is denoted by the
%     four bullets, the final version leaves out these markers; the default
%     value is |final|.
%   \item |debug|:
%
%     Setting this option produces lines of the form %
%     |===> dbg |\meta{text} in the .log-file.
%   \item |outer|:
%
%     Setting this option changes the position of flags in the
%     |ifthenelse|-triangles from the mid to the left and right of the
%     baselines of the triangles.
% \end{enumerate}
% After loading the |.sty|-file there are different commands and environments,
% which enable the draw of structured box charts.%
% \fi%
%
% \DescribeMacro{\StrukTeX}
% \ifnum\language=\languageNGerman%
% Zunächst sei der Befehl erwähnt, 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 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öhe}\oarg{Überschrift}
% \dots
% \enve{struktogramm}
% \end{quote}
% erzeugt Raum für ein
% neues Struktogramm. Die beiden Parameter
% legen die Breite und die Höhe des Platzes fest, der für 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ächlichen Breite,
% die tatsächliche Höhe wird den Erfordernissen angepasst. Stimmt die
% angegebene Höhe nicht mit den tatsächlichen Erfordernissen überein,
% läuft das Struktogramm in den umgebenden Text hinein oder es bleibt
% Raum frei. Es gibt einen Schalter \cs{sProofOn}, mit dem die angegebene
% Größe des Struktogramms durch vier Punkte gezeigt wird, um Korrekturen
% einfacher durchführen zu können. \cs{sProofOff} schaltet diese Hilfe
% entsprechend wieder ab.
% Die Überschrift 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äuchliche Längeneinheit \cs{unitlength} wird bei den Struktogrammen
% nicht benutzt; die Längeneinheit ist aus technischen Gründen auf $1\, mm$
% festgelegt. Weiterhin müssen alle Längenangaben 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ändert 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öhe}\marg{Inhalt},
% \end{quote}
% wobei die eckigen Klammern wie üblich ein optionales Argument
% bezeichnen.  Die Breite und die Höhe des Kastens werden den
% Erfordernissen gemäß automatisch angepasst, man kann aber mittels des
% optionalen Argumentes die Höhe des Kastens vorgeben.%
% \else%
% The main element of a structured box chart is a box, in which an
% operation is described. Such a box will be assigned by \cs{assign}. The
% syntax is the following:
% \begin{quote}
% \cs{assign}\oarg{height}\marg{content},
% \end{quote}
% where the square brackets name an optional element as usual. The width
% and the height of the box will be adjusted automatically according to
% demands. But one can predefine the height of the box by the optional
% argument.%
% \fi
%
% \ifnum\language=\languageNGerman%
% Der \textit{Text} wird normalerweise linksbündig in den
% Kasten gesetzt; ist er dafür zu lang, so wird ein Paragraph (im
% Blocksatz) gesetzt.
% \else%
% The \textit{text} is normally set centered in the box. If the text is too
% long for that, then a (justified) paragraph is set.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% \begin{tExample}
% Ein einfaches Struktogramm wird mit den folgenden Anweisungen erzeugt:
% \begin{verbatimwrite}{struktex.tmp}
% \sProofOn
% \begin{struktogramm}(70,12)[1.\ Versuch]
%     \assign{Quadratwurzel von \(\pi\) berechnen und ausgeben}
% \end{struktogramm}
% \sProofOff
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen führen zu folgendem Struktogramm, wobei der Anwender
% wie auch bei der zugrundeliegenden |picture|-Umgebung für 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öhe mit 12mm.
% Eine Alternative ist durch die |centernss|-Umgebung gegeben,
% die auf Seite \pageref{sec: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{Calculate and output square root of \(\pi\)}
% \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{sec:centernss}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Gleichzeitig wird die Wirkung von \cs{sProofOn} und \cs{sProffOff} gezeigt,
% wobei die zu große vorgegebene Größe 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öhe 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ühren 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öhe 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]{Calculate and output square root of \(\pi\)}
% \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{Überschrift}
% \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 Überschriftsangabe ist optional. Lässt man die Angabe weg, so wird
% standardmäßig die Überschrift: "`Speicher bereitstellen:"' erzeugt.
% Will man einen anderen Text haben, wird dieser mit
% \cs{declarationtitle}\marg{Überschrift} global festgelegt. Will man für
% ein einzelnes Struktogramm einen speziellen Titel erzeugen, so gibt man
% diesen in den eckigen Klammern an.
% \else%
% The declaration of the title is optional. If the declaration is omitted, the standard
% title: `Providing Memory Space' will be generated.
% If one wants to have another text, it will be provided globally by
% \cs{declarationtitle}\marg{title}. If one wants to generate a special title for a
% certain structured box chart, one has to declare it within square brackets.%
% \fi%
%
% \DescribeMacro{\description}
% \DescribeMacro{\descriptionindent}
% \DescribeMacro{\descriptionwidth}
% \DescribeMacro{\descriptionsep}
% \changes{v-8.0b}{04/07/14}{Zeichnung zum Layout der Deklarationen
% verbessert (`multiput statt n-mal `put, Korrektur von Bezeichnungen)}
% \ifnum\language=\languageNGerman%
% Innerhalb der |declaration|-Umgebung werden die Beschreibungen der einzelnen
% Variablen mit
% \begin{quote}
% \cs{description}\marg{Variablenname}\marg{Variablenbeschreibung}
% \end{quote}
% erzeugt. Dabei ist zu beachten, dass \meta{Variablenname} keine
% schließende eckige Klammer "`]"' beinhalten darf, da dieser Makro
% mittels des \cs{item}-Makros definiert worden ist. Eckige Klammern sind in
% diesem Fall als \cs{lbracket} und \cs{rbracket} einzugeben.
% \else%
% Within the |declaration| environment the descriptions of the variables can be
% generated by
% \begin{quote}
% \cs{description}\marg{variableName}\marg{variableDescription}
% \end{quote}
% In doing so one has to pay attention on the \meta{variableName}, that is not
% allowed to content a right square bracket ``]'', because this macro has been
% defined by the \cs{item} macros. Square brackets have to be entered as
% \cs{lbracket} or \cs{rbracket} respectively.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Das Aussehen einer Beschreibung lässt sich mit drei Parametern
% steuern: \cs{descriptionindent}, \cs{descriptionwidth} und \cs{descriptionsep};
% die Bedeutung der Parameter ist der \Abb{fig:description} zu entnehmen
% (\cs{xsize@nss} und \cs{xin@nss} sind interne Größen, die von \StrukTeX\
% vorgegeben werden).
% Die Vorbesetzung dieser Werte ist folgendermaßen:
% \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ürzer als \cs{descriptionwidth} ist, eine Beschreibung
% erhält, die auf der gleichen Höhe 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{fig: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{Überschrift}%
%                                             \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{fig:description}\ifnum\language=\languageNGerman Aufbau
%                                      einer Variablenbeschreibung
%                                 \else Construction of a variable description
%                                 \fi}
% \end{figure}
%
% \begin{tExample}
% \ifnum\language=\languageNGerman%
% Zunächst 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ühren}
%         \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örige Struktogramm, wobei zu beachten ist, dass durch die
% leeren eckigen Klammern keine Überschrift erzeugt wird.
% \else%
% The corresponding structured box chart is the following, at which one has to
% pay attention, that there are no titels generated by the empty square
% brackets.%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Nun werden Variablen genauer spezifiziert:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,50)
%     \assign{%
%         \begin{declaration}[Parameter:]
%             \description{\pVar{iPar}}{ein \pKey{int}-Parameter,
%                         dessen Bedeutung hier beschrieben wird}
%         \end{declaration}
%         \begin{declaration}[lokale Variablen:]
%             \description{\pVar{iVar}}{eine \pKey{int}-Variable,
%                         deren Bedeutung hier beschrieben wird}
%             \description{\pVar{dVar}}{eine \pKey{double}-Variable,
%                         deren Bedeutung hier beschrieben wird}
%         \end{declaration}
%     }
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% Now variables will be specified more precisely:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,50)
%     \assign{%
%         \begin{declaration}[Parameter:]
%             \description{\pVar{iPar}}{an \pKey{int} parameter with the
%                         meaning described here}
%         \end{declaration}
%         \begin{declaration}[local Variables:]
%             \description{\pVar{iVar}}{an \pKey{int} variable with the meaning
%                         described here}
%             \description{\pVar{dVar}}{a \pKey{double} variable with the
%                          meaning described here}
%         \end{declaration}
%     }
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Das ergibt:
% \else%
% This results in:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \changes{v121}{10/08/31}{removed catcoding from example code}
% \ifnum\language=\languageNGerman%
% Zuletzt die globale Vereinbarung eines Titels:
% \begin{verbatimwrite}{struktex.tmp}
% \def\declarationtitle{globale Variablen:}
% \begin{struktogramm}(95,13)
%     \assign{%
%     \begin{declaration}
%         \description{\pVar{iVar_g}}{eine \pKey{int}-Variable}
%     \end{declaration}
%   }
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% Finally the global declaration of a titel:
% \begin{verbatimwrite}{struktex.tmp}
% \def\declarationtitle{global variables}
% \begin{struktogramm}(95,13)
%     \assign{%
%     \begin{declaration}
%         \description{\pVar{iVar_g}}{an \pKey{int} variable}
%     \end{declaration}
%   }
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Dies ergibt das folgende Aussehen:
% \else%
% This results in the following shape:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Hier ist die lokale Umsetzung des \cs{catcode}s des Unterstrichs zu
% beachten, die erforderlich ist, wenn man einen Unterstrich in einem
% Makroargument einsetzen möchte. 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ür einen Unterprogrammsprung und einen Aussprung aus dem
% Programm sehen ähnlich aus und werden mit folgenden Befehlen gezeichnet:
% \begin{quote}\obeylines
% \cs{sub}\oarg{Höhe}\marg{Text}
% \cs{return}\oarg{Höhe}\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ächste Beispiel zeigt, wie diese Sinnbilder gezeichnet werden.\par
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,20)
%     \sub{Liste sortieren}
%     \return{Listenkopf zurückgeben}
% \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ühren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
%\DescribeMacro{\while}
%\DescribeMacro{\whileend}
%\DescribeMacro{\until}
%\DescribeMacro{\untilend}
%\DescribeMacro{\forallin}
%\DescribeMacro{\forallinend}
%\DescribeMacro{\forever}
%\DescribeMacro{\foreverend}
% \changes{v2.1}{17/06/06}{`forallin, `forallinend: added english documentation}
% \changes{v2.0c}{17/06/06}{`forallin, `forallinend: added german documentation}
% \changes{v2.0b}{17/06/02}{`forallin, `forallinend: renamed from
% `foreach, `foreach to avoid conflict with tikz}
% \changes{v2.0a}{17/06/02}{`foreach, `foreachend: renamed from `forall, `forallend}
% \ifnum\language=\languageNGerman%
% Zum Darstellen von Schleifenkonstrukten stehen die drei Befehle
% \cs{while}, \cs{until} und \cs{forever} zur Verfügung.
% Die While-Schleife stellt
% eine Wiederholung mit vorausgehender Bedingungsprüfung (kopfgesteuerte
% Schleife) dar, die
% Until-Schleife testet die Bedingung am Schleifenende (fußgesteuerte
% 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öhe}\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öhe des
% Textes. Der Text wird linksbündig in den Rahmen geschrieben.
% Ist der Text leer,  so wird ein dünner Rahmen gezeichnet.
%
% Ein Kontrollkonstrukt, das heute in vielen Programmiersprachen verfügbar
% ist, ist eine Schleife, die abhängig von der jeweiligen Sprache als
% |forall|-, |for| \ldots{} |in| oder |foreach|-Schleife bezeichnet
% wird. Diese Schleifenart kann prinzipiell als kopfgesteuerte Schleife
% angesehen werden, manche ziehen aber eine Schreibweise vor, die von der
% Endlosschleife abgeleitet wird. Für diesen Fall gibt es das Konstrukt
% \begin{quote}
%  \cs{forallin}\oarg{Breite}\marg{Text}\meta{Unterstruktogramm}\cs{forallinend}
% \end{quote}
% \else%
% For representation of loop constructions there are three instructions
% available:
% \cs{while}, \cs{until} and \cs{forever}.
% The while loop is a repetition with preceding condition check (loop with
% a pre test).
% The until loop checks the condition at the end of the loop (loop with a
% post test).
% And the forever loop is a neverending loop, that can be left by \cs{exit}.
% \begin{quote}\obeylines
% \cs{while}\oarg{width}\marg{text}\meta{structured subbox chart}%
%         \cs{whileend}
% \cs{until}\oarg{width}\marg{text}\meta{structured subbox chart}%
%         \cs{untilend}
% \cs{forever}\oarg{width}\meta{structured subbox chart}\cs{foreverend}
% \cs{exit}\oarg{height}\meta{text}
% \end{quote}
% \meta{width} is the width of frame of the mapping convention and \meta{text}
% is the conditioning text, that is written inside this frame. If the width
% is not given, the thickness of frame depends on the height of text. The
% text will be written left adjusted inside the frame. If there is'nt given
% any text, there will be a thin frame.
%
% A control structure which nowadays is provided by many programming
% languages is a loop known as |forall|-, |for| \ldots |in|-, or
% |foreach|-loop. This kind of loop can be seen as tail first loop but some
% people prefer the form of the endless loop with included text. For this
% case there is the control structure
% \begin{quote}
%     \cs{forallin}\oarg{width}\marg{text}\meta{structured subbox chart}\cs{forallinend}
% \end{quote}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% An Stelle
% von \meta{Unterstruktogramm} können beliebige Befehle von \StrukTeX\
% stehen (mit Ausnahme von \cs{openstrukt} und \cs{closestrukt}), die
% das Struktogramm innerhalb der \cs{while}-, der \cs{until}- oder der
% \cs{forever}-Schleife
% bilden.
% \else%
% Instead of \meta{structured subbox chart} there might be written any
% instructions of \StrukTeX\ (except \cs{openstrukt} and \cs{closestrukt}), which
% build up the box chart within the \cs{while} loop, the \cs{until} loop or the
% \cs{forever} loop.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% \changes{v2.0}{17/06/01}{corrected typos}
% Um Kompatiblität mit der Weiterentwicklung des \StrukTeXSty{} von J.~Dietel
% zu erreichen, gibt es die Makros \cs{dfr} und \cs{dfrend} mit derselben
% Bedeutung wie \cs{forever} und \cs{foreverend}.
% \else%
% For compatibility with further development of the \StrukTeXSty{} of J.~Dietel
% there are the macros \cs{dfr} and \cs{dfrend} with the same meaning as
% \cs{forever} and \cs{foreverend}.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Die beiden folgenden Beispiele zeigen den Einsatz der \cs{while}- und
% \cs{until}-Makros sowie der \cs{forallin}-Makros,
% \cs{forever} wird weiter unten gezeigt.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \assign{\(I \gets 1\)}
%     \while[8]{\(I < 99\)}
%         \assign{\(J \gets I+1\)}
%         \until{\(J < 100\)}
%             \sub{Vertausche, falls gilt: \(FELD(I) > FELD(J)\)}
%             \assign{\(J \gets J+1\)}
%         \untilend
%         \assign{\(I \gets I+1\)}
%     \whileend
%  \end{struktogramm}
% \end{verbatimwrite}
% \else%
% The two following examples show use of \cs{while} and \cs{until} macros. \cs{forever}
% will be shown later.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \assign{\(I \gets 1\)}
%     \while[8]{\(I < 99\)}
%         \assign{\(J \gets I+1\)}
%         \until{\(J < 100\)}
%             \sub{Swap, if valid: \( ARRAY(I) > ARRAY(J) \)}
%             \assign{\(J \gets J+1\)}
%         \untilend
%         \assign{\(I \gets I+1\)}
%     \whileend
%  \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
%
% \begin{tExample}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen führen zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \ifnum\language=\languageNGerman%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95, 25)
%     \sub{berechne Liste \(L\) der ersten 100 Primzahlen}
%     \forallin{\(\forall l\in L\)}
%         \assign{gib \(l\) aus}
%     \forallinend
%  \end{struktogramm}
% \end{verbatimwrite}
% \else%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95, 25)
%     \sub{compute the list \(L\) of the first 100 primes}
%     \forallin{\(\forall l\in L\)}
%         \assign{print \(l\)}
%     \forallinend
%  \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
%
% \begin{tExample}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% \ifnum\language=\languageNGerman%
% Diese Anweisungen führen zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \ifnum\language=\languageNGerman%
% Die \cs{exit}-Anweisung gibt nur im Zusammenhang mit einfachen oder mehrfachen
% Verzweigungen Sinn, daher wird sie im Anschluss an die Diskussion der
% Verzweigungen vorgestellt.
% \else%
% The \cs{exit} instruction only makes sense in connection with simple or
% multiple branches. Therefore it will be presented after the discussion
% of branches.%
% \fi%
%
% \DescribeMacro{\ifthenelse}%
% \DescribeMacro{\change}%
% \DescribeMacro{\ifend}%
% \ifnum\language=\languageNGerman%
% Zur Darstellung von Alternativen stellt \StrukTeX\ die Sinnbilder für
% einen If-Then-Else-Block und für mehrfache Alternativen eine
% Case-Konstruktion zur Verfügung. Da in der klassischen
% |picture|-Umgebung von \LaTeX{} nur Linien mit bestimmten Steigungen
% gezeichnet werden können, muss der Benutzer bei beiden Befehlen selbst
% den Winkel bestimmen, mit dem die notwendigen schrägen Linien gezeichnet
% werden sollen (hier ist also etwas mehr \glq Handarbeit\grq\ nötig).%
% \else%
% For the representation of alternatives \StrukTeX\ provides mapping
% conventions for an If-Then-Else-block and a Case-construction for
% multiple alternatives.  Since in the traditional |picture| environment of
% \LaTeX{} only lines of certain slopes 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 manual work\grq\
% required.)%
% \fi%
%
% \changes{v2.0}{17/06/01}{mention pict2e.sty}
% \changes{v-6.0}{00/11/24}{Einsatz von curves.sty zum Zeichnen beliebiger
% Steigungen implementiert}
% \ifnum\language=\languageNGerman%
% Wenn hingegen der \sFile{curves.sty}, der \sFile{emlines2.sty} oder der
% \sFile{pict2e.sty} eingesetzt wird, ist die Darstellung von Geraden mit
% beliebiger Steigung möglich.
% \else%
% If however the \sFile{curves.sty}, the \sFile{emlines2.sty} or the
% \sFile{pict2e.sty} is used, then the representation of lines with any
% slope can be drawn.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Der If-Then-Else-Befehl sieht so aus:
% \begin{quote}\obeylines
% \cs{ifthenelse}\oarg{Höhe}\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ür den Fall, dass das optionale Argument \meta{Höhe} 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ßer Wert = kleine Steigung). Größere 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öhe}
% vorgegeben, so bestimmt dieser Wert statt des Ausdruckes
% \(\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt \#1 + \#2}}\) die Höhe 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 slope of both the partitioning lines of
% the If-Then-Else-block (large number = small slope). Larger values are
% put on 6, smaller values on 1. The precise characteristics of the slopes
% can be taken from the following picture. Thereby \cs{xsize@nss} is the width
% of the actual structured subbox chart.
% If the \meta{height} is given, then this value determines the height of the
% conditioning rectangle instead of the expression  \(\frac{\mbox{\cs{xsize@nss}}}
% {\mbox{\tt \#1 + \#2}}\).%
% \fi%
% \begin{quote}
%   \unitlength 1.00mm
%   \linethickness{0.4pt}
%   \begin{picture}(100.00,20.00)
%   \put(10.00,5.00){\framebox(90.00,10.00)[cc]{}}
%   \put(50.00,18.00){\makebox(0,0)[cc]{\cs{xsize@nss}}}
%   \put(2.00,10.00){\makebox(0,0)[cc]
%   {$\frac{\mbox{\tt\char92 xsize@nss}}{\mbox{\tt \#1 + \#2}}$}}
%   \put(0.00,15.00){\line(1,0){4.00}}
%   \put(2.00,15.00){\line(0,-1){2.00}}
%   \put(0.00,5.00){\line(1,0){4.00}}
%   \put(2.00,5.00){\line(0,1){2.00}}
%   \put(10.00,4.00){\line(0,-1){4.00}}
%   \put(40.00,4.00){\line(0,-1){4.00}}
%   \put(100.00,0.00){\line(0,1){4.00}}
%   \put(70.00,2.00){\makebox(0,0)[cc]
%   {\tt \#2 $\cdot\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt \#1 + \#2}}$}}
%   \put(25.00,2.00){\makebox(0,0)[cc]
%   {\tt \#1 $\cdot\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt \#1 + \#2}}$}}
%   \put(10.00,2.00){\line(1,0){5.00}}
%   \put(35.00,2.00){\line(1,0){25.00}}
%   \put(80.00,2.00){\line(1,0){20.00}}
%   \put(10.00,16.00){\line(0,1){4.00}}
%   \put(100.00,16.00){\line(0,1){4.00}}
%   \put(10.00,18.00){\line(1,0){30.00}}
%   \put(60.00,18.00){\line(1,0){40.00}}
%   \put(10.00,15.00){\line(3,-1){30.00}}
%   \put(40.00,5.00){\line(6,1){60.00}}
%   \end{picture}
% \end{quote}
% \ifnum\language=\languageNGerman%
% \meta{Bedingung}
% wird in das so gebildete obere mittlere Dreieck gesetzt; die Parameter
% \meta{Linker Text} und \meta{Rechter Text} werden in das
% linke bzw.\ rechte
% untere Dreieck gesetzt. Der Bedingungs-Text kann in seinem Dreiecks-Feld
% umgebrochen werden.  Ab Version v-5.3 wird der Bedingungstext durch
% geeigneten Umbruch beliebigen Steigungen angepasst.\footnote{Diese
% Erweiterung stammt von Daniel Hagedorn, dem ich hiermit herzlich danken
% möchte} Die beiden anderen Texte sollten kurz sein (\zB\
% ja/nein oder true/false), da sie nicht umgebrochen werden können und
% sonst über ihr Dreiecks-Feld hinausragen. Um an dieser Stelle
% Einheitlichkeit zu erzielen, sollten die Makros \cs{pTrue} und
% \cs{pFalse} (vgl. \cref{sec:makros-variablen})
% benutzt werden. Hinter \cs{ifthenelse}
% werden die Befehle für das linke, hinter \cs{change} die für das
% rechte "`Unterstruktogramm"' geschrieben. Falls diese beiden
% Struktogramme nicht gleich lang sind, wird ein Kasten mit einem
% \(\emptyset\) (vgl. \cref{sec:spez-zeichen})
% ergänzt.\footnote{Eventuell ist ein \cs{strut} hilfreich, um
% unterschiedliche Höhen von Texten auszugleichen.} Mit \cs{ifend} wird das
% If-Then-Else-Element beendet.
% Es folgen zwei Beispiele für die Anwendung.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,32)
%     \ifthenelse[12]{1}{2}
%         {Flag für 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. As of version v-5.3, the condition text is adapted
% to any slopes using suitable wrapping.\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}
% (see \cref{sec:makros-variablen}) 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\) (see \cref{sec:spez-zeichen}) 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ühren 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ür 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 redirected 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ühren 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öhe}\marg{Winkel}\marg{Anzahl der Fälle}\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öhe} nicht angegeben, so erhält die Unterteilungslinie
% des Case-Sinnbildes die durch \meta{Winkel} angegebene Steigung (die bei
% \cs{ifthenelse} erwähnten Winkelwerte).  In das obere der durch diese
% Linie entstandenen beiden Dreieck wird der Text \meta{Bedingung}
% gesetzt. Die Größenverhältnisse 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 slope 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{fig: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älle} gibt die Anzahl der zu
% zeichnenden Fälle an; alle Unterstruktogramme der einzelnen Fälle
% erhalten die gleiche Breite. Der \meta{Text des 1. Falles} muss als
% Parameter des \cs{case}-Befehls angegeben werden, alle weiteren Fälle
% werden über den \cs{switch}-Befehl eingeleitet. Hinter dem Text folgen
% dann die Befehle für das eigentliche Unterstruktogramm des jeweiligen
% Falles. Der letzte Fall wird mit \cs{caseend} abgeschlossen.  Ein
% Case-Sinnbild mit drei Fällen 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ühren 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öhe} ist nur einzusetzen, wenn die Option
% "`|curves|"', "`|emlines2|"' oder "`|pict2e|"' gesetzt ist; ist das nicht
% der Fall, können die Struktogramme durcheinander kommen.  Die
% Erweiterung des \cs{switch}-Kommandos mit \oarg{Höhe} führt 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 slope 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{fig: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öhe}\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öhe}\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öhe}\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öhe}\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ühren 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ür den Standardfall sollte dann rechtsbündig
% 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ühren zu folgendem Struktogramm:
% \else%
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \changes{v-9.2}{10/01/18}{changed the selection of languages}
% \ifnum\language=\languageNGerman%
% Das folgende Beispiel zeigt, wie mittels einfacher Verzweigung aus einer
% Endlosschleife gesprungen werden kann. Das Beispiel lässt sich ohne
% weiteres auf eine mehrfache Verzweigung übertragen.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \forever
%         \assign{lies Zeichen}
%         \ifthenelse{3}{3}{Zeichen = 'E'?}
%                          {j}{n}
%             \exit{Sprung hinter Schleife}
%         \change
%         \ifend
%         \assign{Gib Zeichen aus}
%     \foreverend
% \end{struktogramm}
% \end{verbatimwrite}
% \else%
% The following example shows, how one can exit a neverending loop by a simple
% branch. The example is transferable to a multiple branch without much effort.
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \forever
%         \assign{read character}
%         \ifthenelse{3}{3}{character = 'E'}
%                          {y}{n}
%             \exit{Jump behind the Loop}
%         \change
%         \ifend
%         \assign{Put out Character}
%     \foreverend
% \end{struktogramm}
% \end{verbatimwrite}%
% \fi%
% \begin{tExample}
% \ifnum\language=\languageNGerman%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen führen zu folgendem Struktogramm:
% \else%
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% These instructions lead to the following structured box chart:%
% \fi%
% \begin{quote}
%   \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \changes{v-9.2}{10/01/18}{corrected some typos}
% \changes{v-9.1}{10/01/17}{added first draft of of `inparallel, `task, and `inparallelend documentation}
% \DescribeMacro{\inparallel}
% \DescribeMacro{\task}
% \DescribeMacro{\inparallelend}
% \changes{v065}{10/06/07}{added some german translations}
% \ifnum\language=\languageNGerman%
% Heutzutage sind Prozessoren mit mehreren Kernen oder auch massive
% Parallelrechner ein übliches Werkzeug zur Ausführung von Programmen. Um
% die Fähigkeiten dieser Prozessoren auszunutzen, sollten entsprechende
% parallele Algorithmen entwickelt und implementiert werden. Der Makro
% \cs{inparallel} und die zugehörigen Makros \cs{task} und
% \cs{inparallelend} ermöglichen die Darstellung paralleler Verarbeitung in
% einem Programm. Die Syntax lautet:
% \begin{quote}\obeylines
% \cs{inparallel}\oarg{Höhe der 1. Task}\marg{Anzahl paralleler
% Tasks}\marg{Beschreibung der 1. Task}|}|
% \cs{task}\oarg{position}\marg{Beschreibung der 2. Task}
% \dots
% \cs{task}\oarg{position}\marg{Beschreibung der n. Task}
% \cs{inparallelend}
% \end{quote}
%
% Das Layout eines mit diesen Kommandos erzeugten Kastens ist der folgenden
% Abbildung zu entnehmen (die Makroparameter \texttt{\#1}
% und \texttt{\#2} beziehen sich auf die Parameter von \cs{inparallel}):
% \else%
% Nowadays multicore processors or even better massive parallel processors
% are a common tool for executing programs. To use the features of these
% processors parallel algorithms should be developed and implemented. The
% \cs{inparallel} command enables the representation of parallel processing
% in a program. The syntax is as follows:
% \begin{quote}\obeylines
% \cs{inparallel}\oarg{height of 1\(^{\mbox{st}}\) task}\marg{number of
% parallel tasks}\marg{description of 1\(^{\mbox{st}}\) task}|}|
% \cs{task}\oarg{position}\marg{description of 2\(^{\mbox{nd}}\) task}
% \dots
% \cs{task}\oarg{position}\marg{description of n\(^{\mbox{th}}\) task}
% \cs{inparallelend}
% \end{quote}
%
% The layout of the box is as follows (the macro parameters \texttt{\#1}
% and \texttt{\#2} refer to the parameters of \cs{inparallel}):%
% \fi%
%
% \changes{v065}{10/06/07}{changed figure which shows `inparallel layout}
% \begin{center}
% \label{fig:case3}
% \unitlength 1.00mm
% \linethickness{0.4pt}
% \begin{picture}(90.00,40.00)
%   \put(9.00,5.00){\framebox(75.00,30.00)[cc]{}}
%   \put(9.00,36.00){\line(0,1){4.00}}
%   \put(9.00,38.00){\line(1,0){27.50}}
%   \put(46.50,38.00){\makebox(0,0)[cc]{\cs{xsize@nss}}}
%   \put(55.00,38.00){\line(1,0){27.50}}
%   \put(84.00,36.00){\line(0,1){4.00}}
%   \put(0.00,35.00){\line(1,0){4.00}}
%   \put(2.00,35.00){\line(0,-1){10.00}}
%   \put(2.00,15.00){\line(0,-1){10.00}}
%   \put(0.00,5.00){\line(1,0){4.00}}
%   \put(2.00,20.00){\makebox(0,0)[cc]{%
%       \shortstack{%
%         \ifnum\language=\languageNGerman\meta{Höhe}\else\meta{height}\fi\\\texttt{\#1}}}}
%   \put(21.00,20.00){\makebox(0,0)[cc]{%
%       \shortstack{%
%           \ifnum\language=\languageNGerman\meta{Beschreibung\(_1\)}%
%           \else\meta{desc\(_1\)}\fi\\\texttt{\#2}}}}
%   \put(46.50,20.00){\makebox(0,0)[cc]{%
%       \ifnum\language=\languageNGerman\meta{Beschreibung\(_{\ldots}\)}\else\meta{desc\(_{\ldots}\)}\fi}}
%   \put(71.50,20.00){\makebox(0,0)[cc]{%
%       \ifnum\language=\languageNGerman\meta{Beschreibung\(_n\)}\else\meta{desc\(_n\)}\fi}}
%   \put(34.00,11.67){\line(0,1){16.66}} ^^A vertical bars between descriptions
%   \put(59.00,11.67){\line(0,1){16.66}}
%   \put(9.00,0.00){\line(0,1){4.00}}
%   \put(9.00,2.00){\line(1,0){2.00}}
%   \put(34.00,0.00){\line(0,1){4.00}}
%   \put(34.00,2.00){\line(-1,0){2.00}}
%   \put(21.00,2.00){\makebox(0,0)[cc]{$\frac{\mbox{\cs{xsize@nss}}}{\mbox{\tt\#1}}$}}
%   \multiput(10.00,28.33)(3.00, 0.0){25}{\line(1,0){1.5}}
%   \multiput(10.00,31.66)(3.00, 0.0){25}{\line(1,0){1.5}}
%   \multiput(10.00,11.67)(3.00, 0.0){25}{\line(1,0){1.5}}
%   \multiput(10.00,8.34)(3.00, 0.0){25}{\line(1,0){1.5}}
%   \put(86.00,35.00){\line(1,0){4.00}}  ^^A measuring at the right side
%   \put(86.00,28.33){\line(1,0){4.00}}
%   \put(88.00,34.00){\line(0,-1){1.00}}
%   \put(88.00,28.33){\line(0,1){1.00}}
%   \put(88.00,31.66){\makebox(0,0)[cc]{4\,mm}}
% \end{picture}
% \end{center}
%
% \ifnum\language=\languageNGerman%
% Zu beachten ist, dass die verschiedenen Tasks nicht weiter gegliedert
% werden dürfen.
% \else%
% Note: the tasks are not allowed to get divided by \cs{assign} or so. If
% one needs some finer description of a task, this should be made outside
% of the current structured box chart.%
% \fi%
%
% \changes{v-9.2}{10/01/18}{added example for `inparallel}
% \begin{tExample}[\ifnum\language=\languageNGerman%
%   Anwendung von \cs{inparallel}\else Application of \cs{inparallel}\fi]
% \ifnum\language=\languageNGerman%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \inparallel[20]{3}{Motor starten}
%     \task{Wasser einfüllen}
%     \task{Wasser erhitzen}
%     \inparallelend
% \end{struktogramm}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% Diese Anweisungen ergeben das folgende Struktogramm:
% \else%
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(95,40)
%     \inparallel[20]{3}{start motor}
%     \task{fill in water}
%     \task{heat water}
%     \inparallelend
% \end{struktogramm}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% These instructions produce the following structured box chart:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
% \end{tExample}
%
% \DescribeEnv{centernss}
% \label{sec: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ür 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ührt zu folgendem:
% \else%
% This leads to the following:%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \DescribeMacro{\CenterNssFile}
% \ifnum\language=\languageNGerman%
% Häufig gibt es den Fall, dass Struktogramme in eigenen Dateien abgelegt
% werden, damit sie für sich allein auf Korrektheit getestet werden
% können oder in anderen Zusammenhängen genutzt werden können.
% 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}
% \changes{v3.0a}{25/06/20}{corrected last(?) glitches}
% \ifnum\language=\languageNGerman%
% da auf diese Weise der gesamte Text innerhalb des Struktogramms zentriert
% würde. Um diesen Fall einfach und korrekt abhandeln zu können, kann das
% Makro \cs{CenterNssFile} eingesetzt werden, das auch in der Schreibweise
% |centernssfile| definert ist. Voraussetzung ist, dass die Datei,
% die die Anweisungen für das Struktogramm enthält, die
% Dateinamenserweiterung |.nss| hat, der Name der einzubindenden Datei
% \emph{muss} demzufolge ohne Erweiterung angegeben werden. Wenn die Datei
% \sFile{struktex-tst-00.nss} das in \vref{sec:sample}, Zeile 61--68 gezeigte
% Aussehen hat, so führt 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 \sFile{struktex-tst-00.nss} has the shape
% shown in \vref{sec:sample}, line 61--68 the instruction%
% \fi%
% \begin{quote}
% |\centernssfile{struktex-tst-00}|
% \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-tst-00}\egroup%
% \label{sec:centernssfile}
%
% \DescribeMacro{\openstrukt}
% \DescribeMacro{\closestrukt}
% \ifnum\language=\languageNGerman%
% Diese beiden Makros sind nur der Kompatibilität 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öhe \else height \fi}
% \end{quote}
% \ifnum\language=\languageNGerman%
% und
% \else%
% and%
% \fi%
% \begin{quote}
% \cs{closestrukt}.
% \end{quote}
%
%
% \DescribeMacro{\assert}%
% \ifnum\language=\languageNGerman%
% Der Makro \cs{assert} wurde eingeführt, um die Verifikation von
% Algorithmen zu unterstützen, er ist aber nur aktiv, wenn die Stil-Option
% |verification| gesetzt wurde. Er dient dazu, an ausgewählten Stellen
% Zusicherungen über den Zustand von Variablen zu markieren, die Syntax
% entspricht dem \cs{assign}:
% \begin{quote}
%     \cs{assert}\oarg{Höhe}\marg{Zusicherung},
% \end{quote}
% Sein Einsatz ergibt sich aus dem folgenden:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(70,20)[Zusicherungen in Struktogrammen]
%     \assign{\(a\gets a^2\)}
%     \assert{\(a\ge0\)}
% \end{struktogramm}
% \end{verbatimwrite}
% \begin{quote}
%     \verbatiminput{struktex.tmp}
% \end{quote}
% Das dazugehörige Struktogramm sieht folgendermaßen aus:
% \begin{quote}
%     \input{struktex.tmp}
% \end{quote}%
% \else%
% The macro \cs{assert}  was introduced to support the verification of
% algorithms. It is active only if the option |verification| is set. It
% serves the purpose to assert the value of a variable at one point of the
% algorithm. The syntax corresponds to the syntax of \cs{assign}:
% \begin{quote}
%     \cs{assert}\oarg{height}\marg{assertion},
% \end{quote}
% It's usage can be seen from the following:
% \begin{verbatimwrite}{struktex.tmp}
% \begin{struktogramm}(70,20)[Assertions in structured box charts]
%     \assign{\(a\gets a^2\)}
%     \assert{\(a\ge0\)}
% \end{struktogramm}
% \sProofOff
% \end{verbatimwrite}
% \begin{quote}
%     \verbatiminput{struktex.tmp}
% \end{quote}
% The resulting structured box chart looks like
% \begin{quote}
%     \input{struktex.tmp}
% \end{quote}%
% \fi
%
%
% \subsection{\ifnum\language=\languageNGerman Spezielle Zeichen und Textdarstellung
%                 \else Specific characters and text representation
%                 \fi}
% \label{sec:spez-zeichen}
%
% \changes{v3.0}{25/06/19}{extended documentation of the use of the package struktxf}
%
% \DescribeMacro{\nat}
% \DescribeMacro{\integer}
% \DescribeMacro{\real}
% \DescribeMacro{\complex}
% \DescribeMacro{\emptyset}
% \ifnum\language=\languageNGerman%
%     Wegen ihres häufigen Auftretens sind die Mengen der natürlichen,
%     ganzen, rationalen,
%     reellen und komplexen Zahlen (\(\nat\), \(\integer\), \(\rational\), \(\real\) und \(\complex\))
%     im Mathematik-Modus über
%     die folgenden Makros erreichbar: \cs{nat}, \cs{integer}, \cs{real} und \cs{complex}.
%     Ebenso ist das mit \cs{emptyset} erzeugte
%     "`\(\emptyset\)"' als Zeichen für die leere Anweisung auffälliger als
%     das standardmäßige Zeichen "`$\mathchar"023B$"'
%     Andere Mengensymbole wie \(\mathbb L\) (für Lösungsmenge) sind über
%     |\(\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}
%
% \changes{v3.0}{25/06/19}{documented the incompatibility of `MathItalics
% and `bm}
%
% \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
%         \begin{equation}
%             NeuerWert = AlterWert + Korrektur
%             \label{eq:-neuerwert-N}
%         \end{equation}
%     \end{example}
%     und
%     \begin{example}
%         \MathItalics
%         \begin{equation}
%             NeuerWert = AlterWert + Korrektur
%             \label{eq:-neuerwert-I}
%         \end{equation}
%     \end{example}
% \else%
%     \begin{example}
%         \MathNormal
%         \begin{equation}
%             NewValue = OldValue + Correction
%             \label{eq:-neuerwert-N}
%         \end{equation}
%     \end{example}
%     and
%     \begin{example}
%         \MathItalics
%         \begin{equation}
%             NewValue = OldValue + Correction
%             \label{eq:-neuerwert-I}
%         \end{equation}
%     \end{example}%
% \fi%
% \ifnum\language=\languageNGerman%
% Diese Kommandos sind in einem eigenen Paket \textsf{struktxf.sty}
% definiert, das wie üblich geladen werden kann:
% \begin{quote}
% |\usepackage[|\meta{Optionen}|]{struktxf}|
% \end{quote}
% \else%
% These commands are defined in a separate package \textsf{struktxf.sty},
% which can be loaded as usual:
% \begin{quote}
% |\usepackage[|\meta{options}|]{struktxf}|
% \end{quote}%
% \fi%
% \ifnum\language=\languageNGerman%
%     Die folgenden Optionen stehen zur Verfügung:
%     \begin{enumerate}
%       \item |iso|:
%
%         Diese Option legt die Darstellung von Zahlenmengen in Übereinstimmung
%         mit ISO 80\,000-2 fest. Ist sie gesetzt,
%         werden die Zahlenmengen durch fette Großbuchstaben wie \(\mathbf{Q}\)
%         dargestellt, ansonsten durch Zeichen aus dem |\mathbb| Zeichensatz
%         wie \(\rational\). Der Standardwert ist |iso=false|.
%       \item |mathitalics|:
%
%         Das Setzen dieser Option führt dazu, dass Zuweisungen, wie sie bei
%         der Beschreibung von Algorithmen auftreten, statt wie in
%         \vref{eq:-neuerwert-N} so wie in
%         \vref{eq:-neuerwert-I} dargestellt werden.
%
%         Es muss darauf hingewiesen werden, dass diese Option mit den
%         Befehlen |\boldsymbol{...}| (aus \textsf{amsmath.sty})
%         bzw. |\bm{...}| (aus \textsf{bm.sty}) inkompatibel ist, vor diesen
%         Befehlen |\MathNormal| aktiviert werden muss.
%     \end{enumerate}
% \else%
%     The following options are available:
%     \begin{enumerate}
%       \item |iso|:
%
%         This option specifies the representation of numerical quantities
%         in accordance with ISO 80\,000-2. If it is set, the numerical
%         quantities are represented by bold capital letters such as
%         \(\mathbf{Q}\), otherwise by characters from the |\mathbb|
%         character set such as \(\rational\). The default value is
%         |iso=false|.
%       \item |mathitalics|:
%
%         Setting this option results in assignments, such as those
%         occurring in of the description of algorithms, being displayed as
%         in \vref{eq:-newvalue-N} instead of \vref{eq:-newvalue-I}.
%
%         It should be noted that this option is incompatible with the
%         commands |\boldsymbol{...}| (from \textsf{amsmath.sty}) or
%         |\bm{...}| (from \textsf{bm.sty}) and therefore |\MathNormal|
%         must be activated before these commands.
%     \end{enumerate}
% \fi%
%
%
% \subsection{\ifnum\language=\languageNGerman Makros zur Darstellung von
%     Variablen, Schlüsselwörtern und anderen programmierspezifischen
%     Details \else Macros for representing variables, keywords and other
%     programming-specific details\fi% }
% \label{sec:makros-variablen}
%
% \DescribeMacro{\pVariable}
% \DescribeMacro{\pVar}
% \ifnum\language=\languageNGerman%
% \changes{v-2.0n}{94/03/31}{Dokumentation überarbeitet}
% \else%
% \changes{v-2.0n}{94/03/31}{documentation changed}%
% \fi%
% \DescribeMacro{\pKeyword}
% \DescribeMacro{\pKey}
% \DescribeMacro{\pComment}
% \changes{v131}{10/09/21}{changed location of documentation of new use of
% struktxp.sty}
% \changes{v130}{10/09/21}{enhanced the description of using source code}
% \ifnum\language=\languageNGerman%
% Struktogramme enthalten manchmal direkt zu programmierenden Code.
% Um hier ein einheitliches Aussehen zu erreichen, sind die hier
% aufgeführten Makros definiert worden. Um diese Makros auch in anderem
% Zusammenhang nutzen zu können, sind sie zu einem eigenen
% \foreign{package} \sFile{struktxp.sty} zusammengefasst worden. Dabei
% wird ab Version 122 zur Darstellung von Code auf das Paket
% "`\sFile{url.sty}"' von Donald Arsenau zurückgegriffen, das es
% ermöglicht, verbatim gesetzte Texte als Parameter an ein anderes Makro zu
% übergeben. Wenn diese Texte ein Leerzeichen enthalten, das erhalten
% bleiben soll, muss der Benutzer vor dem Laden von \sFile{url.sty},
% typischerweise also vor der Anweisung
% \begin{quote}
%     |\usepackage{struktex}|
% \end{quote}
% die Anweisung
% \begin{quote}
%     |\PassOptionsToPackage{obeyspaces}{url}|
% \end{quote}
% setzen.
% \else%
% Structured box charts sometimes include code, that has to be programmed
% directly. For achieving a homogenous appearance the mentioned macros have
% been defined. They have been collected in a separate package
% \sFile{struktxp.sty} to be able to use them in another context. From
% version 122 on \sFile{struktxp.sty} is based on "\sFile{url.sty}" of
% Donald Arsenau. This package makes allows to pass verbatim texts as
% parameters to other macros. If this verbatim stuff contains blank spaces,
% which should be preserved, the user has to execute the command
% \begin{quote}
%     |\PassOptionsToPackage{obeyspaces}{url}|
% \end{quote}
% before \sFile{url.sty} is loaded, that is in most of the cases before
% the command
% \begin{quote}
%     |\usepackage{struktex}|
% \end{quote}%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Mit |\pVariable{|\meta{Variablenname}|}| wird ein Variablenname gesetzt.
% \meta{Variablenname} ist dabei ein Bezeichner eine Variable, wobei der
% Unterstrich "`|_|"', das kaufmännische 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 ampersand ``|&|'' 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önnen.
% Es darf als Abkürzung \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üsselwort}|}| ein Schlüsselwort
% gesetzt.
% Dabei ist \meta{Schlüsselwort} ein Schlüsselwort in einer
% Programmiersprache, wobei der Unterstrich "`|_|"' und das
% \foreign{hash}-Zeichen "`|#|"' als Teil des Schlüsselwortes
% erlaubt ist. Damit lässt 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 number sign ``|#|'' 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ürzt 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 ähnlicher 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üssen geschrieben
% werden. \cs{pComment} kann nicht abgekürzt 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üsselwörtern und Kommentar:
% \begin{quote}
% |\pFonts{|\meta{Variablenfont}|}{|\meta{Schlüsselwortfont}|}|%
%     |{|\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üsselwortfont} als |\small\sffamily\bfseries| und
%
% \item \meta{Kommentarfont} als |\small\sffamily\slshape|.
%
% \end{itemize}
% \else%
% The default values for the certain fonts are
% \begin{itemize}
% \item \meta{variablefont} as |\small\sffamily|,
%
% \item \meta{keywordfont} as |\small\sffamily\bfseries| and
%
% \item \meta{commentfont} as |\small\sffamily\slshape|.
%
% \end{itemize}%
% \fi%
% \ifnum\language=\languageNGerman%
% Damit wird die obige Zeile nach
% \else%
% With that the above line%
% \fi%
% \ifnum\language=\languageNGerman%
% \begin{verbatimwrite}{struktex.tmp}
% \pFonts{\itshape}{\sffamily\bfseries}{\scshape}
% \pVar{a = }\pKey{sqrt}\pVar{(a);} \pComment{// Iteration}
% \end{verbatimwrite}
% \begin{quote}
% \verbatiminput{struktex.tmp}
% \end{quote}
% zu
% \else%
% becomes%
% \fi%
% \begin{quote}
% \input{struktex.tmp}
% \end{quote}
%
% \changes{v130}{10/09/21}{removed unnecessary math mode}
% \ifnum\language=\languageNGerman%
% Entsprechend können 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ät mit
% früheren Versionen des \StrukTeXSty{} zu gewährleisten.
% Dasselbe gilt auch für 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%
%     Makros zur Erstellung der Dokumentation des \StrukTeXSty-Paketes
% \else%
%     Macros for generating the documentation of the package \StrukTeXSty
% \fi}
%
% \ifnum\language=\languageNGerman%
% Um die Formatierung der Dokumentation ein wenig zu erleichtern, werden ein
% paar Makros benutzt, die in einer eigenen \sFile{.sty}-Datei
% zusammengefasst wurden. Ein wesentlicher Teil beruht auf einer
% Modifikation der \texttt{newtheorem}-Umgebung aus \sFile{latex.sty} zur
% Auszeichnung der Beispiele, die Implementation der Abkürzungen wurde in
% \cite{Neubauer:MikrotypographieI} vorgeschlagen.
% \else%
% To simplify the formatting of the documentation some macros are used,
% which are collected in a particular \sFile{.sty} file. An essential part
% is based on a modification of the \texttt{newtheorem} environment out of
% \sFile{latex.sty} for distinguishing examples. The implementation of
% abbreviations has been proposed in \cite{Neubauer:MikrotypographieI}.%
% \fi%
%
% \ifnum\language=\languageNGerman%
% Dazu wurden aus dem \sFile{verbatim.sty} einige Kommandos übernommen
% und modifiziert, damit das Schreiben und Lesen von Dateien im
% |verbatim|-Modus auch im Zusammenhang mit dem |docstrip|-Paket
% funktioniert. Schließlich wurde auch noch eine Idee von Tobias Oetiker
% aus seinem \sFile{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 \sFile{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 \sFile{layout.sty} also has
% been used, which has been developed in connection with ``|lshort2e.tex| --
% The not so short introduction to LaTeX2e''.%
% \fi%
% \changes{v-8.0e}{05/05/17}{nun wird die .pdf-Ausgabe sauber abgefangen}
%    \begin{macrocode}
%<*strukdoc>
\RequirePackage{ifpdf}
\newif\ifcolor
\IfFileExists{color.sty}{\colortrue}{}
\RequirePackage{varioref}
\ifpdf
    \RequirePackage[colorlinks]{hyperref}
\else
    \def\href#1{\texttt}
\fi
\RequirePackage{cleveref}
\ifcolor
    \RequirePackage{color}
\fi
\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}}
\newcommand\sFile[1]{\textsf{#1}}
\def\newexample#1{%
  \@ifnextchar[{\@oexmpl{#1}}{\@nexmpl{#1}}}
\def\@nexmpl#1#2{%
  \@ifnextchar[{\@xnexmpl{#1}{#2}}{\@ynexmpl{#1}{#2}}}
\def\@xnexmpl#1#2[#3]{%
  \expandafter\@ifdefinable\csname #1\endcsname
    {\@definecounter{#1}\@newctr{#1}[#3]%
     \expandafter\xdef\csname the#1\endcsname{%
       \expandafter\noexpand\csname the#3\endcsname \@exmplcountersep
          \@exmplcounter{#1}}%
     \global\@namedef{#1}{\@exmpl{#1}{#2}}%
     \global\@namedef{end#1}{\@endexample}}}
\def\@ynexmpl#1#2{%
  \expandafter\@ifdefinable\csname #1\endcsname
    {\@definecounter{#1}%
     \expandafter\xdef\csname the#1\endcsname{\@exmplcounter{#1}}%
     \global\@namedef{#1}{\@exmpl{#1}{#2}}%
     \global\@namedef{end#1}{\@endexample}}}
\def\@oexmpl#1[#2]#3{%
  \@ifundefined{c@#2}{\@nocounterr{#2}}%
    {\expandafter\@ifdefinable\csname #1\endcsname
    {\global\@namedef{the#1}{\@nameuse{the#2}}%
  \global\@namedef{#1}{\@exmpl{#2}{#3}}%
  \global\@namedef{end#1}{\@endexample}}}}
\def\@exmpl#1#2{%
  \refstepcounter{#1}%
  \@ifnextchar[{\@yexmpl{#1}{#2}}{\@xexmpl{#1}{#2}}}
\def\@xexmpl#1#2{%
  \@beginexample{#2}{\csname the#1\endcsname}\ignorespaces}
\def\@yexmpl#1#2[#3]{%
  \@opargbeginexample{#2}{\csname the#1\endcsname}{#3}\ignorespaces}
\def\@exmplcounter#1{\noexpand\arabic{#1}}
\def\@exmplcountersep{.}
\def\@beginexample#1#2{%
    \@nobreaktrue\list{}{\setlength{\rightmargin}{\leftmargin}}%
    \item[{\bfseries #1\ #2}]\mbox{}\\\sf}
\def\@opargbeginexample#1#2#3{%
    \@nobreaktrue\list{}{\setlength{\rightmargin}{\leftmargin}}%
    \item[{\bfseries #1\ #2}\ (#3)]\mbox{}\\\sf}
\def\@endexample{\endlist}

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

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

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

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

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

\newread\verbatim@in@stream
\def\verbatim@readfile#1{%
  \verbatim@startline
  \openin\verbatim@in@stream #1\relax
  \ifeof\verbatim@in@stream
    \typeout{No file #1.}%
  \else
    \@addtofilelist{#1}%
    \ProvidesFile{#1}[(verbatim)]%
    \expandafter\endlinechar\expandafter\m@ne
    \expandafter\verbatim@read@file
    \expandafter\endlinechar\the\endlinechar\relax
    \closein\verbatim@in@stream
  \fi
  \verbatim@finish
}
\def\verbatim@read@file{%
  \read\verbatim@in@stream to\next
  \ifeof\verbatim@in@stream
  \else
    \expandafter\verbatim@addtoline\expandafter{\expandafter\check@percent\next}%
    \verbatim@processline
    \verbatim@startline
    \expandafter\verbatim@read@file
  \fi
}
\def\verbatiminput{\begingroup\MacroFont
  \@ifstar{\verbatim@input\relax}%
          {\verbatim@input{\frenchspacing\@vobeyspaces}}}
\def\verbatim@input#1#2{%
   \IfFileExists {#2}{\@verbatim #1\relax
    \verbatim@readfile{\@filef@und}\endtrivlist\endgroup\@doendpe}%
   {\typeout {No file #2.}\endgroup}}
%</strukdoc>
%    \end{macrocode}
%
%
% \section{\ifnum\language=\languageNGerman%
%     Verschiedene Beispieldateien
% \else%
%     Several sample files
% \fi}
%
%
% \subsection[\ifnum\language=\languageNGerman%
% Test des Paketes \sFile{struktxf.sty}\else Testing
% the package \sFile{struktxf.sty}\fi]{%
% \ifnum\language=\languageNGerman%
%     Datei zum Austesten der Makros des Paketes \sFile{struktxf.sty}%
% \else%
%     File for testing the macros of the package \sFile{struktxf.sty}%
% \fi}
%
%
%    \begin{macrocode}
%<*struktxf-00>
\documentclass[fleqn, 12pt, english]{article} % 12pt for better readability

\usepackage{babel}
\usepackage[iso, mathitalics]{struktxf} % the options could be omitted,
                                        % they represent the default

\nofiles

\begin{document}

\section*{Mathematical Sets:}

\begin{itemize}
  \item natural numbers: \(\nat\)
  \item integer numbers: \(\integer\)
  \item rational numbers: \(\rational\)
  \item real numbers: \(\real\)
  \item complex numbers: \(\complex\)
\end{itemize}
To compare the fonts visually, should not be done in real documents:
\begin{verbatim}
\makeatletter\@nss@isofalse\makeatother
\end{verbatim}
\makeatletter\@nss@isofalse\makeatother
\begin{itemize}
  \item natural numbers: \(\nat\)
  \item integer numbers: \(\integer\)
  \item rational numbers: \(\rational\)
  \item real numbers: \(\real\)
  \item complex numbers: \(\complex\)
\end{itemize}
or (with \verb|\@nss@isotrue|)
\makeatletter\@nss@isotrue\makeatother
\begin{itemize}
  \item natural numbers: \(\nat\)
  \item integer numbers: \(\integer\)
  \item rational numbers: \(\rational\)
  \item real numbers: \(\real\)
  \item complex numbers: \(\complex\)
\end{itemize}

\section*{Assignments:}

\begin{itemize}
  \item Default settings:
    \begin{equation}
        \label{eq:def}
        NewValue = OldValue + Correction
    \end{equation}
  \item \verb|MathNormal| settings: \MathNormal
    \begin{equation}
        \label{eq:norm}
        NewValue = OldValue + Correction
    \end{equation}
  \item \verb|MathItalics| settings: \MathItalics
    \begin{equation}
        \label{eq:ital}
        NewValue = OldValue + Correction
    \end{equation}
\end{itemize}

\end{document}
%</struktxf-00>
%    \end{macrocode}
%
%
% \subsection[\ifnum\language=\languageNGerman Test des Paketes
% \sFile{struktxp.sty}\else File for testing the package
% \sFile{struktxp.sty}\fi]{%
% \ifnum\language=\languageNGerman%
%     Datei zum Austesten der Makros des Paketes \sFile{struktxp.sty}%
% \else%
%     File for testing the macros of the package \sFile{struktxp.sty}%
% \fi}
%
% \changes{v2.4}{20/01/28}{better preamble for the sample files}
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen bilden eine Musterdatei, die zum Austesten
% der Makros des \sFile{struktxp.sty} benutzt werden kann. Zum Testen
% sollten auch die Kommentarzeichen vor der Zeile
% |\usepackage[T1]{fontenc}| gelöscht werden. Der Text ist nur in Englisch
% vorgegeben.
% \else%
% The following lines build a sample file, which can be used for testing
% the macros of \sFile{struktxp.sty}. For testing one should delete the
% comment characters before the line |\usepackage[T1]{fontenc}|.%
% \fi%
% \changes{v121}{10/08/31}{added babel package to the test of struktxp}
%    \begin{macrocode}
%<*example3>
\documentclass[english]{article}

\usepackage{babel}
\usepackage{struktxf}
\usepackage{struktxp}

\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}
%</example3>
%    \end{macrocode}
%
%
% \changes{v2.4}{20/01/28}{corrected number of examples}
% \subsection[\ifnum\language=\languageNGerman Positionierung von Struktogrammen
% mit \cs{centernss}/\cs{input}\else Positioning of structured box charts
% with \cs{centernss}/\cs{input}\fi]{%
% \ifnum\language=\languageNGerman%
%  Beipieldatei zum Einbinden in die Dokumentation: Positionierung von
%  Struktogrammen mit \cs{centernss}/\cs{input}%
%                  \else%
% Sample file for including into the documentation: Positioning of
% structured box charts with \cs{centernss}/\cs{input}%
%                  \fi}
% \label{sec:sample}
%
% \changes{v2.4}{20/01/28}{better preamble for the sample files}
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen bilden eine Beispieldatei, die bei der Erstellung
% dieser Dokumentation (siehe S.~\pageref{sec:centernss}) benötigt wird.
% \else%
% The following lines build up a sample file, which is needed for the
% preparation of this documentation (see p.~\pageref{sec:centernss}); there
% is only a german version of this file.%
% \fi%
%    \begin{macrocode}
%<*nss-sample>
\begin{struktogramm}(95,40)[Text]
    \case[10]{3}{3}{Signum(x)}{-1}
         \assign{\(z \gets - \frac{1}{x}\)}
    \switch{0}
         \ifnum\language=\languageNGerman%
             \assign{Ausgabe: Division durch 0}
         \else
             \assign{Output: Division by 0}
         \fi
    \switch[r]{1}
         \assign{\(z \gets \frac{1}{x}\)}
    \caseend
\end{struktogramm}
%</nss-sample>
%    \end{macrocode}
%
%
% \subsection[\ifnum\language=\languageNGerman %
%     Vordefinierte Steigung von Fallunterscheidungen\else %
% Predefined slopes at selections\fi]{%
% \ifnum\language=\languageNGerman%
%     Darstellung von Fallunterscheidungen mit vordefinierten Steigungen
%     ohne die Benutzung optionaler Pakete
% \else%
%     Display of selections with predefined slopes without the
%    use of optional packages
% \fi}
%
% \changes{v2.4}{20/01/28}{better preamble for the sample files}
% \changes{v-4.1c}{95/07/24}{Eigene Datei zum Austesten der Makros
% integriert}%
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen bilden eine Beispieldatei, die zum Austesten der
% Makros benutzt werden kann. Es wird gezeigt, wie die Steigung von
% Fallunterscheidungen ohne optionale Zusatzpakete aussehen kann. Der Inhalt
% ist nur in Englisch vorhanden.%
% \else%
% The following lines build up a sample file, that can be used for testing
% the macros. The slope used at the \cs{ifthenelse} macro is one of the
% six cases defined in \LaTeXe{}, because no optional package is loaded.%
% \fi%
%    \begin{macrocode}
%<*example1>
\documentclass[draft]{article}
\usepackage{struktex}

\begin{document}

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

\end{document}
%</example1>
%    \end{macrocode}
%
% \subsection[\ifnum\language=\languageNGerman %
% Variable Steigung von Fallunterscheidungen\else %
% Variable slopes at selections\fi]{%
% \ifnum\language=\languageNGerman%
%     Darstellung von Fallunterscheidungen mit variablen Steigungen
%     mit dem Paket \sFile{pict2e.sty}
% \else%
%     Display of case distinctions with variable slopes
% with the package \sFile{pict2e.sty}
% \fi}
%
% \changes{v2.4}{20/01/28}{better preamble for the sample files}
% \changes{v-4.1c}{95/07/24}{Eigene Datei zum Austesten der Makros
% integriert}%
% \ifnum\language=\languageNGerman%
% Die folgenden Zeilen bilden eine Musterdatei, die zum Austesten der
% Makros benutzt werden kann. Es wird gezeigt, wie die Steigung automatisch
% berechnet wird, wenn das Pakete \sFile{pict2e} geladen wird. Der Inhalt
% ist nur in Englisch vorhanden.%
% \else%
% The following lines build up a template file, that can be used for
% testing the macros. It is shown, how the slope gets automatically
% calculated after loading the package \sFile{pict2e}.%
% \fi%
%    \begin{macrocode}
%<*example2>
\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}
%</example2>
%    \end{macrocode}
%
%
% \subsection[\ifnum\language=\languageNGerman %
%     Dokumentation von Java Programmen\else%
%     Documentation of Java programs\fi]{%
% \ifnum\language=\languageNGerman%
%     Dokumentation von Java Methoden im Vorspann eines Struktogramms mit
%     dem Paket \sFile{struktxp.sty}
% \else%
%     Documentation of Java methods in the header of a structure chart with
%     the package \sFile{struktxp.sty}
% \fi}
%
% \changes{v2.4}{20/01/28}{better preamble for the sample files}
% \ifnum\language=\languageNGerman%
% Der folgende Code wird in einem anderen Zusammenhang benutzt, nämlich um
% Java-Methoden zu dokumentieren. An dieser Stelle wird ein eigener Weg
% gewählt, da das sonst übliche Arbeiten mit \cs{lstinline} aus dem
% \sFile{listings} Paket zu Fehlern führt.
%
% Der Code zeigt zusätzlich, wie die dokumentierten Methoden im Index
% aufgeführt werden können.
% \else%
% The following code serves as a sample for documenting Java methods. Here
% a special method is used, because the common use of \cs{lstinline} from
% the \sFile{listings} package leads to errors.
%
% The code also shows how the documented methods can be listed in the
% index.
% \fi%
%    \begin{macrocode}
%<*struktxp-00>
\documentclass{article}

\usepackage{index} % produce the index afterwards with the command
                   % makeindex -o struktxp-tst-00.ind struktxp-tst-00.idx
\usepackage{struktxp}

\makeindex

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

\pLanguage{Java}

\begin{document}

\begin{fdescription}
 \item[\index{Methods!drawImage(Image img,
                                    int dx1,
                                    int dy1,
                                    int dx2,
                                    int dy2,
                                    int sx1,
                                    int sy1,
                                    int sx2,
                                    int sy2,
                                    ImageObserver observer)@%
       \pExp{\pKey{public} \pKey{abstract} \pKey{boolean} drawImage(Image img,
                                    \pKey{int} dx1,
                                    \pKey{int} dy1,
                                    \pKey{int} dx2,
                                    \pKey{int} dy2,
                                    \pKey{int} sx1,
                                    \pKey{int} sy1,
                                    \pKey{int} sx2,
                                    \pKey{int} sy2,
                                    ImageObserver observer)}}%
       \pExp{public abstract boolean drawImage(Image img, int dx1, int
         dy1, int dx1, int dy2, int sx1, int sy1, int sx2, int sy2,
         ImageObserver observer)}]%
 \ldots
\end{fdescription}

\printindex
\end{document}
%</struktxp-00>
%    \end{macrocode}
%
%
% \section[\ifnum\language=\languageNGerman%
% Prüfen und Erstellen des Pakets \StrukTeXSty\else%
% Checking and building the package \StrukTeXSty\fi]{%
% \ifnum\language=\languageNGerman%
% Prüfen und Erstellen des Pakets \StrukTeXSty{} mit \textsf{l3build} \else%
% Checking and building the package \StrukTeXSty{} with \textsf{l3build}\fi}
% \label{sec:lbuild_lua}
%
% \changes{v3.0a}{25/06/20}{corrected last(?) glitches}
% \changes{v2.4}{20/01/28}{replaced Makefile by lbuild.lua}
% \changes{v2.1b}{17/06/17}{added tds-zip as new target}
% \changes{v2.1b}{17/06/17}{changed basic formatting engine to pdflatex}
% \changes{v2.1a}{17/06/11}{Makefile now reflects git git aware}
% \changes{v101}{10/06/25}{changed Makefile according to subversion
% revision numbers}
% \changes{v061}{10/05/31}{corrected some more typos}
% \changes{v056}{10/01/21}{corrected Makefile once more}
% \changes{v-9.2}{10/01/18}{corrected the Makefile}
% \changes{v-8.0e}{05/05/17}{Tippfehler korrigiert: \$\$\$f $\rightarrow$ \$\$f}
% \changes{v-8.0e}{05/05/17}{\& mit Fluchtzeichen versehen}
% \changes{v-8.0b}{04/07/14}{.pdf-Ausgabe eingeführt}
% \changes{v-8.2a}{06/01/19}{HOMETEXMF $\rightarrow$ TEXMFHOME}
%
% \ifnum\language=\languageNGerman%
% Der Umgang mit \sFile{.dtx}-Paketen ist wesentlich einfacher, wenn ein
% Werkzeug für die Automatisierung der wesentlichen Schritte vorliegt. Ein
% solches Werkzeug ist mit dem Paket \sFile{l3build} plattformübergreifend
% gegeben \cite{LaTeX3:l3build}.
%
% Die Anpassung an die Gegebenheiten für ein spezielles Projekt erfolgt
% durch ein \sFile{build.lua}-Skript, das bei Bedarf durch eine
% Konfigurationsdatei \sFile{build-config.lua} begleitet wird. Beide
% Dateien sind hier in die Dokumentation integriert, auf ihre Benutzung
% wird hier nicht weiter eingegangen, sie ist in \cite{LaTeX3:l3build}
% nachzulesen.%
% \else%
% Working with \sFile{.dtx} packages is much easier when working with a
% well suited tool like \sFile{l3build} which can be used on all platforms
% \cite{LaTeX3:l3build}.
%
% For a special project there must exist a \sFile{build.lua} script to
% adapt the behaviour to its needs. This script is accomplished by a
% settings file \sFile{build-config.lua}. Both files are integrated in this
% documentation, their usage isn't described here, it can be read in
% \cite{LaTeX3:l3build}.%
% \fi
%
%    \begin{macrocode}
%<*lbuild>
#!/usr/bin/env texlua

-- Build script for "StrukTeX" files

-- Identify the bundle and module: the module may be empty in the case where
-- there is no subdivision
bundle = ""
module = "struktex"

-- Location of main directory: use Unix-style path separators
-- Should match that defined by the bundle.
maindir = "."

-- the files to be installed
installfiles = {"*.sty"}

-- the files which should not be installed
excludefiles = {"*/TODO.md"}

-- these files are to copy for unpackaging
sourcefiles = {"*.dtx", "*.ins", "build.lua", "build-config.lua"}

-- these files are part of the documentation
docfiles = {"struktex.drv", "struktex.sty"}

-- these files get tags
tagfiles = {"*.sty"}

-- this file must be TeXed to unpack all
unpackfiles = {"struktex.dtx"}
-- unpackopts = "-interaction=batchmode"

-- create a TDS-suited .zip-file
packtdszip = true

-- Files to copy to unpacking when typesetting
typesetsourcefiles = {"struktex.sty"}

-- Files needed to support typesetting when "sandboxed"?
typesetsuppfiles = {"tex-bib.bib"}

-- only using the following engines for testing the code
checkengines    = checkengines or {"latex", "pdftex"}

-- install also documentation (doesn't work, because
-- there are no *.pdf-files in the unpacked directory
installfiles     = installfiles or {"*.pdf", "*.sty"}

-- Load the common build code
dofile(maindir .. "/build-config.lua")

-- specific settings for the StrukTeX development repo, used by l3build script

function prepare_contents(file)
  -- can't be set locally, so: set it back later on!
  typesetopts = "--output-format=dvi"
  tex(file)

  -- create .pdf-file from .dvi-source
  name = stripext(file)
  dvitopdf(name, typesetdir, typesetexe, true)
  run(typesetdir, "pdfcrop " .. name .. pdfext)
  ren(typesetdir, name .. "-crop" .. pdfext, name .. pdfext)
end

function print_log(log_message)
  print(log_message)
  return 0
end

function typeset(file)
  local name = jobname(file)

  typesetopts = "--output-format=pdf"
  local errorlevel = tex(file, typesetdir)

  print("\ntypeset.errorlevel:", errorlevel, "\n")

  if errorlevel == 0 then
    -- Return a non-zero errorlevel if anything goes wrong
    print("prepare additional information")
    errorlevel = (
      print_log("file: " .. file .. ", name: " .. name) +
        print_log("going to bibtex with >" ..  name .. "<") +
        bibtex(name, typesetdir) +
        print_log("\nbibtex done\n") +
        tex(file, typesetdir) +
        print_log("going to makeindex with", name) +
        makeindex(name, typesetdir, ".idx", ".ind", ".ilg", "gind.ist") +
        makeindex(name, typesetdir, ".glo", ".gls", ".glg", "gglo.ist") +
        print_log("\nmakeindex done\n") +
        tex(file, typesetdir)
                 )
    print_log("\ntypesetting done\n")
    ren(typesetdir, "struktex.pdf", "struktex." .. targetlanguage .. ".pdf")
    print_log("\nrenaming to struktex." .. targetlanguage .. ".pdf done\n")
  end

  return errorlevel
end

function setversion_update_line(line, date, release)
  local function get_date_release()
    -- get version information from git
    local f = io.popen("git describe", "r")
    local release = {}
    for entry in f:lines() do
      release[#release + 1] = entry
    end
    return os.date("%Y/%m/%d", os.time()), release[1]:sub(2, -1)
  end

  date, release = get_date_release()

  for _,i in pairs({"Class", "File", "Package"}) do
    if string.match(
      line,
      "^\\ProvidesExpl" .. i .. " *{[a-zA-Z0-9%-%.]+}"
    ) then
      line = string.gsub(
        line,
        "{%d%d%d%d/%d%d/%d%d}( *){[^}]*}",
        "{" .. string.gsub(date, "%-", "/") .. "}%1{" .. release .. "}"
      )
      break
    end
  end
  return line
end

--###  doc_init_hook begin  ############################################
--[[
  The git informations (commit name, commit date, commit author)
  must be included in the .sty files. This is done here.
  1. git describe --long HEAD: returns the most recent tag (HEAD
       can be omitted, it's the default), that's the commit name
  2. git --no-pager show -s --format=format:"<format>": returns
       the needed commit date and commit author. <format> is set
       up so that the three lines below are generated

  These informations replace the line
  %% git revision information
  by someting like
  \@git@ $Date: <commit date> $%
     $Revision: <commit name> $
  %% $Author: <commit author> $

  <commit date> has the format "yyyy-mm-dd hh:mm:ss +nnnn"
  <commit name> has the format as described in the git describe
    man page
--]]
function docinit_hook()
  print("now set git data")
  local f = io.popen('git describe --long HEAD', 'r')
  local commit_name = f:read "*all"
  commit_name = string.sub(commit_name, 1, #commit_name - 1)

  f = io.popen('git --no-pager show -s --format=format:"%n  ' ..
                 '\\@git@ \\$Date: %ci \\$%%%%%n  \\$Revision: ' ..
                 '<commit name> \\$%n  %%%%%%%% \\$Author: %cn \\$%n"')
  local revision_information = f:read "*all"
  revision_information = string.sub(revision_information, 1,
      #revision_information - 1)

  print("commit_name: >>" .. commit_name .. "<<, Länge: " ..
      tostring(string.len(commit_name)))
  print("revision_information: " .. revision_information)

  revision_information = revision_information:gsub("<commit name>", commit_name)
  print("revision_information: " .. revision_information)

  filenames = {"strukdoc.sty", "struktex.sty", "struktxf.sty", "struktxp.sty"}

  for _, file in ipairs(filenames) do
    file = unpackdir .. "/" .. file
    print(file)

    local f = assert(io.open(file,"rb"))
    local content = f:read("*all")
    f:close()

    content = content:gsub("%%%% git revision information",
                           revision_information)
    print(content)

    f = assert(io.open(file,"w"))
    f:write(content)
    f:close()

    if file == unpackdir .."/" .. "struktex.sty" then
      file = file:gsub(unpackdir, typesetdir)
      f = assert(io.open(file,"w"))
      f:write(content)
      f:close()
    end
  end

  -- this file is needed for the documentation but isn't automatically
  -- copied
  cp("struktex-tst-00.nss", unpackdir, typesetdir)

  return 0
end
--###  doc_init_hook end  ##############################################

-- Find and run the build system
kpse.set_program_name("kpsewhich")
if not release_date then
  dofile(kpse.lookup("l3build.lua"))
end

%</lbuild>
%    \end{macrocode} ^^A$
%
% \ifnum\language=\languageNGerman%
% Die folgende Zeilen, die nach Ausführen des Befehls |pdftex struktex.dtx| als Datei
% \sFile{build-config.lua} vorliegen, dienen der Umschaltung der
% Dokumentationssprache zwischen Deutsch und Englisch.%
% \else%
% The file \sFile{lbuild-config.lua} consists of the following lines and is
% generated by executing the command |tex struktex.ins|. Its purpose is the
% switching between English and german documentation.%
% \fi%
%    \begin{macrocode}
%<*config>
-- configuration file for the StrukTeX package

%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% "`\cs{z}"' ermöglicht den Umbruch von Zeichenketten.
% \else%
% ``\cs{z}'' allows breaking strings.
% \fi%
%    \begin{macrocode}
print("This is the additional configuration for setting \z
    the documentation language")

%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% An dieser Stelle kann die Zielsprache die Dokumentation eingestellt werden,
% erlaubt ist "`de"' oder "`en"'. |targetlanguage| muss global gelten, da
% der Wert am Ende des Dokumentationslaufes benötigt wird.%
% \else%
% At this point the language of the documentation can be configured: one
% can choose between ``de'' and ``en''. |targetlanguage| must be global, because
% the value is referenced at the end of the documentation step.%
% \fi%
%    \begin{macrocode}
targetlanguage = targetlanguage or "de"
print("target language: >" .. targetlanguage .. "<")

local exit = os.exit

if targetlanguage == "de" then
  typesetcmds = "\\def\\primarylanguage{ngerman}" ..
    "\\def\\secondarylanguage{english}"
elseif targetlanguage == "en" then
  typesetcmds = "\\def\\primarylanguage{english}" ..
    "\\def\\secondarylanguage{ngerman}"
else
  print("Illegal language")
  exit(1)
end
%</config>
%    \end{macrocode}
%
%
% \changes{v2.3a}{18/03/07}{struktex.el: added package option fixedindent}
% \changes{v055}{10/01/21}{added "declaration" to LaTeX-item-list again
% (previously removed unintentionally)}
% \changes{v055}{10/01/21}{corrected "task" entry}
% \changes{v055}{10/01/21}{corrected lisp comments "\texttt{\char92}"
% $\rightarrow$ "\texttt{\char92}\texttt{\char92}"}
% \changes{v055}{10/01/21}{corrected format entry}
% \changes{v-9.2}{10/01/18}{extended .el-file: `inparallel, `task, `inparallelend}
% \changes{v-8.3}{06/08/18}{struktex.el erweitert, so dass die Parameter
% alle Kommandos automatisch abgefragt werden.}
% \section{\ifnum\language=\languageNGerman%
%  Stil-Datei zur einfachen
% Eingabe von Struktogrammen beim Arbeiten mit dem Emacs und AUC\TeX
% \else%
%   Style file for easier input while working with the Emacs
%   and AUC\TeX%
%   \fi%
% }
% \label{sec:auctex}
%
% \ifnum\language=\languageNGerman%
% Der (X)emacs und das Paket AUC\TeX{}
% (\url{http://www.gnu.org/software/auctex/}) bilden ein mächtiges Werkzeug
% beim Erstellen von \TeX/\LaTeX-Dateien.  Wenn es eine passende Stildatei
% für ein \LaTeX-Paket wie das hier vorliegende \StrukTeX{} gibt,
% wird die Eingabe von Quelltext durch automatisiertes Vervollständigen
% und viele andere Hilfsmittel sehr erleichtert. Im folgenden wird eine
% derartige Stildatei bereitgestellt; sie muss nach ihrer Erzeugung noch an
% eine entsprechende Stelle kopiert werden.
%
% Diese Datei ist zum jetzigen Zeitpunkt noch in der Entwicklungsphase,
% d.\,h. man kann mit ihr arbeiten, aber es fehlen noch ein paar Dinge wie
% das \textit{font locking}, die Anzahl der automatisch eingefügten \cs{switch}
% Kommandos sollte nicht fest gleich eins sein, sondern von der Anzahl der
% eingegebenen Fälle abhängig sein.
% \else%
% The (X)emacs and the package AUC\TeX{}
% (\url{http://www.gnu.org/software/auctex/}) form a powerful tool for
% creating and editing of \TeX/\LaTeX{} files. If there is a suitable
% AUCTeX style file for a \LaTeX{} package like the hereby provided
% \StrukTeX{} package, then there is support for many common operations
% like creating environments and so on.  The following part provides such a
% style file; it must be copied to a place, where (X)emacs can find it
% after its creation.%
%
% This file is still in a development phase, i.\,e. one can work with it,
% but there is a couple of missing things as for example font locking or
% the automatic insertion of \cs{switch} commands according to the user's
% input.%
% \fi%
%    \begin{macrocode}
%<*auctex>
;;; struktex.el -*-coding: utf-8; lexical-binding: t-*-
;;; AUCTeX style for `struktex.sty'

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

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

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

;;; Code:

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

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

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

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

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

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

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

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

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

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

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

;;; struktex.el ends here.
%</auctex>
%    \end{macrocode}
%
%
% \changes{v2.4}{20/01/28}{added l3build}
% \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[LaT20]{LaTeX3:l3build}
%       The \LaTeX{3} Project.
%       \newblock {\em {The {\sf l3build} package---Checking and building
%       packages}}, Januar 2020.
%
%       \bibitem[MDB94]{MittelbachDuchierBraams:DocStrip}
%       Frank Mittelbach, Denys Duchier and Johannes Braams.
%       \newblock {\em {The {\sf DocStrip} program}}, Dezember 1994.
%
%       \bibitem[MDB01]{MittelbachDuchierBraams:DocStrip-V-2.5b}
%       Frank Mittelbach, Denys Duchier, Johannes Braams,
%       Marcin Woli\'nski and Mark Wooding
%       \newblock {\em {The {\sf DocStrip} program}}, September 2001.
%
%       \bibitem[Mit94]{FM:TheDocAndShortvrbPackages}
%       Frank Mittelbach.
%       \newblock {\em {The {\sf doc} and {\sf shortvrb} Packages}}, Oktober 1994.
%
%       \bibitem[Mit01]{FM:TheDocAndShortvrbPackages-V-2.0}
%       Frank Mittelbach.
%       \newblock {\em {The {\sf doc} and {\sf shortvrb} Packages}}, September 2001.
%
%       \bibitem[Neu96]{Neubauer:MikrotypographieI}
%       Marion Neubauer.
%       \newblock {Feinheiten bei wissenschaftlichen Publikationen --
%         Mikrotypographie-Regeln, Teil I}.
%       \newblock {\em Die \TeX{}nische Komödie}, 8(4):23--40, Februar 1996.
%
%       \bibitem[Rah92]{Rahtz:OZ.STY}
%       Sebastian Rahtz.
%       \newblock {\em The {\sf oz} package}, 1999.
%
%     \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äglich sein.
% Die Gültigkeit von Makros wurde im Regelfall auf einen
% möglichst kleinen Bereich beschränkt. Um Seiteneffekte mit anderen
% \foreign{packages} so weit wie möglich 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
% information\fi}
%
% \changes{v084}{10/06/24}{removed flag preventing double load of the package}
% \ifnum\language=\languageNGerman%
% Dies ist ein Paket, das für \LaTeX2e entwickelt wurde, es wird daher
% eine entsprechende Fehlermeldung ausgegeben, wenn ein anderes Format
% benutzt wird,
% was nicht zu Fehlern führen sollte; zusätzlich wird das Paket
% \sFile{ifthen.sty} geladen, falls es noch nicht anderweitig angefordert
% wurde.
% \else%
% This is a package, that has been developed for \LaTeX2e. Hence it will be
% print an adequate error message, if another format is used, which should
% not lead to any errors. In addition the package \sFile{ifthen.sty} will
% be loaded, if not already done.%
% \fi%
% \changes{v-4.4b}{96/03/13}{`RequirePackage umgestellt wg. korrekter
% Versionsmeldung}
% \ifnum\language=\languageNGerman%
% Nun wird das Einlesen des Makropakets mit der aktuellen
% Versionsnummer gemeldet.
% \else%
% Now loading of the macro package with the actual version number will
% be messaged.%
% \fi%
%    \begin{macrocode}
%<*struktex>
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{ifthen}
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% Der |\ifthenelse|-Makro muss unter einem anderen Namen verfügbar bleiben,
% da \StrukTeX{} einen gleichnamigen Makro mit einer anderen Bedeutung
% bereitstellt.%
% \else%
% The |\ifthenelse| must be mapped to |\@ifthenelse| to prevent overloading it by
% the command from the current package with the same name.%
% \fi%
%    \begin{macrocode}
\let\@ifthenelse\ifthenelse
%    \end{macrocode}
% \ifnum\language=\languageNGerman%
% \StrukTeX{} benötigt zwei weitere Pakete, die zum Lieferumfang gehören.
% Diese werden hier geladen.%
% \else%
% \StrukTeX{} uses two additional packages which are included in the
% package,these are loaded here.%
% \fi
%    \begin{macrocode}
\RequirePackage{struktxf}
\RequirePackage{struktxp}
%    \end{macrocode}
%
% \changes{v075}{10/06/23}{added markers to make debug code removeable}
% \ifnum\language=\languageNGerman%
% Zu Entwicklungszwecken werden hier ein paar Makros definiert, die
% Hilfsausgaben erzeugen (Option: |debug|, für die Veröffentlichung
% sollte diese Option nicht gesetzt werden).%
% \else%
% For developing purposes there are some debugging macros (option: |debug|,
% for the release
% version this option shouldn't be set at all); .%
% \fi%
% \changes{v061}{10/05/31}{added some debugging macros}
%    \begin{macrocode}
\newcommand{\dbgArgs@nss}[1]{\typeout{===> dbg Args:\space\space\space#1}}
\newcommand{\dbgCond@nss}[1]{%
  \@ifthenelse{\boolean{#1}}{
    \typeout{===> dbg Cond:\space #1 = true}
  }{
    \typeout{===> dbg Cond:\space #1 = false}
  }
}
\newcommand{\dbgCount@nss}[2][]{%
  \def\argI{#1}%  ^^A dbg
  \typeout{===> dbg Count:\space\space\ifx\argI\empty\else(#1)\space\fi%
    \string#2 = \the#2}}
\newcommand{\dbgCoord@nss}[3][]{%
  \def\argI{#1}%  ^^A dbg
  \typeout{===> dbg Coord:\space\space\ifx\argI\empty\else(#1)\space\fi%
    (\string#2, \string#3) = (\the#2, \the#3)}}%  ^^A dbg
\newcommand{\dbgMark@nss}[3][]{%
  \def\argI{#1}%  ^^A dbg
  \put(#2,#3){\makebox(0,0)[cc]{\ifx\argI\empty$\bullet$\else#1\fi%
    }}}% ^^A dbg
\newcommand{\dbgString@nss}[1]{\typeout{===> dbg String:\space#1}}
%    \end{macrocode}
% \changes{v075}{10/06/23}{added some more documentation about options}
% \changes{v-5.3a}{98/11/27}{Option \texttt{emlines} eingeführt}
% \ifnum\language=\languageNGerman%
% Ab der Version v-5.3a kennt \StrukTeX{} eine Option "`|emlines|"', die es
% ermöglicht, Geraden beliebiger Steigung zu zeichnen; später kann auch
% das Paket \sFile{curves} (Option "`|curves|"') zum Zeichnen beliebiger
% Steigungen eingesetzt werden, ab der Version v-8.0a wird auch das Paket
% \sFile{pict2e} (Option "`|pict2e|"') unterstützt, das dazugehörige
% Paket wird hier geladen.%
% \else%
% From version v-5.3a on there is the option ``|emlines|'' which makes it
% possible to draw lines with any slope; later on one can use the package
% \sFile{curves} (Option ``|curves|'') and from version v-8.0a on
% \sFile{pict2e} (option ``|pict2e|'') is supported, these packages are
% loaded here.%
% \fi
% \changes{v3.0}{25/06/19}{replaced gradient by slope}
% \changes{v104}{10/08/15}{some editorial changes}
%    \begin{macrocode}
\newboolean{curves}
\newboolean{emlines}
\newboolean{pictIIe}
\newboolean{anyslope}
\DeclareOption{curves}{%
    \setboolean{anyslope}{true}
    \setboolean{curves}{true}
    \setboolean{emlines}{false}
    \setboolean{pictIIe}{false}
}
\DeclareOption{emlines}{%
    \setboolean{anyslope}{true}
    \setboolean{curves}{false}
    \setboolean{emlines}{true}
    \setboolean{pictIIe}{false}
}
\DeclareOption{pict2e}{%
    \setboolean{anyslope}{true}
    \setboolean{curves}{false}
    \setboolean{emlines}{false}
    \setboolean{pictIIe}{true}
}
%    \end{macrocode}
%
% \ifnum\language=\languageNGerman%
% Zur Unterstützung der Internationalisierung werden feste Texte in der
% jeweilig benutzten Sprache (beispielsweise als |babel|-Option definiert)
% hier vorbereitet.
% \else%
% To support i18n as provided by |babel| here are some common fixed texts:%
% \fi%
% \changes{v121}{10/08/31}{added some more translations}
% \changes{v104}{10/08/15}{first steps to babel support}
%    \begin{macrocode}
\DeclareOption{english}{%
  \def\declarationtitlename@nss{providing memory space:}%
  \def\pTruename@nss{true}%
  \def\pFalsename@nss{false}%
}
\DeclareOption{german}{%
  \def\declarationtitlename@nss{Speicherplatz bereitstellen:}
  \def\pTruename@nss{WAHR}%
  \def\pFalsename@nss{FALSCH}%
}
\DeclareOption{ngerman}{%
  \def\declarationtitlename@nss{Speicherplatz bereitstellen:}
  \def\pTruename@nss{WAHR}%
  \def\pFalsename@nss{FALSCH}%
}
%    \end{macrocode}
%
% \changes{v-7.0a}{04/01/05}{Option \texttt{verification} eingeführt}
% \ifnum\language=\languageNGerman%
% Ab der Version v-7.0a kennt \StrukTeX{} eine Option "`|verification|"', die
% ein zusätzliches Element definiert: die \cs{assert}-Box, die in
% \cite{Futschek:Programmentwicklung} eingeführt wird.
% \else%
% From version v-7.0a on \StrukTeX{} knows the option ``|verification|'', which
% defines an additional element: the \cs{assert}-box, which is introduced
% in \cite{Futschek:Programmentwicklung}.%
% \fi%
%    \begin{macrocode}
\newboolean{verification}
\DeclareOption{verification}%
{%
    \setboolean{verification}{true}
}
%    \end{macrocode}
%
% \changes{v-8.2a}{06/01/17}{Option \texttt{nofiller} eingeführt}
% \ifnum\language=\languageNGerman%
% Ab der Version v-8.2a kennt \StrukTeX{} eine Option ``|nofiller|'', die
% die Darstellung von Leerraum beeinflusst: ohne diese Option wird in
% Alternativen ein \(\emptyset\)-Zeichen ausgegeben, wenn der Platz
% ausreichend ist. Dies führt zu einer uneinheitlichen Darstellung im
% Vergleich mit dem Leerraum, der von einem \cs{case}-Block erzeugt wird,
% da hier der Leerraum nicht in entsprechende Weise angezeigt wird -- dies
% wäre nur mit einer aufwendigen Listenverwaltung möglich. Angabe der
% Option führt dazu, dass das \(\emptyset\)-Zeichen einheitlich weggelassen
% wird.
% \else%
% From version v-8.2a on \StrukTeX{} knows the option ``|nofiller|'', which
% makes the \(\emptyset\)-character vanishing in alternatives.%
% \fi%
%    \begin{macrocode}
\newboolean{filler}
\setboolean{filler}{true}
\DeclareOption{nofiller}%
{%
    \setboolean{filler}{false}
}
%    \end{macrocode}
%
% \changes{v-8.3}{06/08/17}{Optionen \texttt{draft} und \texttt{final} eingeführt}
% \ifnum\language=\languageNGerman%
% Ab der Version v-8.3 kennt \StrukTeX{} die Optionen "`|draft|"' und
% "`|final|"', die zwischen dem Entwurf und der endgültigen Version des
% Struktogramms umschalten. Entwurfsmodus ist |\sProofOn| gesetzt, für die
% endgültige Version wird |\sProofOff| gesetzt.%
% \else%
% From version v-8.3 on \StrukTeX{} knows the options ``|draft|'' and
% ``|final|'', which differentiate between the draft (|\sProofOn|) and the
% final (|\sProofOff|) version of the structured box chart makes the
% \(\emptyset\)-character vanishing in alternatives.%
% \fi
%    \begin{macrocode}
\let\ifdraft@nss\iffalse
\let\iffinal@nss\iftrue
\DeclareOption{draft}%
{%
  \let\ifdraft@nss\iftrue
  \let\iffinal@nss\iffalse
}
\DeclareOption{final}%
{%
  \let\ifdraft@nss\iffalse
  \let\iffinal@nss\iftrue
}
%    \end{macrocode}
%
%    \begin{macrocode}
\newboolean{debug}
\DeclareOption{debug}%
{%
  \setboolean{debug}{true}
}
\DeclareOption{nodebug}%
{%
  \setboolean{debug}{false}
}
%    \end{macrocode}
%
%    \begin{macrocode}
\newboolean{outer}
\DeclareOption{outer}%
{%
  \setboolean{outer}{true}
}
%    \end{macrocode}
%
% \changes{v2.3}{17/11/17}{introduced option \texttt{fixedindent}}
% \ifnum\language=\languageNGerman%
% Ab der Version v2.3 kennt \StrukTeX{} eine Option "`|fixedindent|"', die
% den Einzug von Blöcken in |while|- und |until|-Schleifen
% beeinflusst. Standardmäßig ist dieser Einzug gleich dem vertikalen
% Abstand zum umgebenden Block, was bei mehrzeiligen Bedingungen zu einem
% großen, unschönen Einzug führt. Wenn |fixedindent| gesetzt ist, entspricht
% der Einzug (ungefähr) dem Zeilenabstand, was einer einzeiligen Bedingung
% entspricht. Der Makrobefehl |\dimtomm| stammt aus
% \url{https://tex.stackexchange.com/questions/223740/convert-dimension-to-integer-number-of-mm}.%
% \else%
% From version v2.3 on  \StrukTeX{} has an option ``|fixedindent|'', which affects
% the indentation of blocks in |while| and |until| loops. By default, this
% indentation is the same as the vertical distance to the surrounding
% block, which leads in multi-line conditions to a large, ugly
% indentation. If |fixedindent| is set, the indentation (approximately)
% corresponds to the line spacing, which is equivalent to a one-line
% condition. The macro |\dimtomm| comes from
% \url{https://tex.stackexchange.com/questions/223740/convert-dimension-to-integer-number-of-mm}.%
% \fi%
%    \begin{macrocode}
\def\dimtomm #1{\the\numexpr \dimexpr #1\relax*635000/118407168\relax }
%    \end{macrocode}
%    \begin{macrocode}
\newboolean{fixedindent@nss}
\DeclareOption{fixedindent}%
{%
  \setboolean{fixedindent@nss}{true}
  \gdef\xindent@nss{\dimtomm{\baselineskip}}
}
%    \end{macrocode}
%
%% \ifnum\language=\languageNGerman%
% Nun werden andere Pakete geladen und die Optionen verarbeitet.%
% \else%
% Now load additional packages and process the options.%
% \fi
% \changes{v141}{12/04/10}{added `ExecuteOptions call for settings default
% values}
% \changes{v104}{10/08/15}{corrected `ProcessOptions call}
%    \begin{macrocode}
\ExecuteOptions{pict2e,english,final}
\ProcessOptions*\relax
\ifcurves%
    \RequirePackage{curves}
\else\ifemlines
    \RequirePackage{emlines2}
\else\ifpictIIe
    \RequirePackage{pict2e}
\fi\fi\fi
\ifthenelse{\boolean{debug}}{
  \typeout{debug active}}{
  \typeout{debug inactive}
  \renewcommand{\dbgCond@nss}[1]{}
  \renewcommand{\dbgCount@nss}[2][]{}
  \renewcommand{\dbgCoord@nss}[3][]{}
  \renewcommand{\dbgMark@nss}[3][]{}
  \renewcommand{\dbgString@nss}[1]{}
}
%    \end{macrocode}
%
% \begin{macro}{\StrukTeX}
% \ifnum\language=\languageNGerman%
% Das Logo des Paketes:%
% \else%
% The logo of package:%
% \fi%
%    \begin{macrocode}
\def\StrukTeX{S\kern-.05emt\kern-.05em\raise.5ex\hbox{r}%
              \kern-.1667emu\kern-.05em\lower.5ex\hbox{k}%
              \kern-.2emT\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</struktex>
%    \end{macrocode}
%
%
% \subsection{\ifnum\language=\languageNGerman Das \textsf{struktxf} Paket
%                 \else The \textsf{struktxf} Package
%                 \fi}
%
% \changes{v-4.1c}{95/07/24}{Eigene Datei für spezielle Fonts anlegen}
% \ifnum\language=\languageNGerman%
% Um eine einheitliche Darstellung von Zuweisungen und Zeichen über
% verschiedene Dokumente hinweg gewährleisten zu können, wird hier ein
% eigenes Paket bereitgestellt

% Zunächst werden zusätzlich benötigte Fonts und ein paar Glyphen bereitgestellt. Da diese
% Fonts auch in anderem Zusammenhang benötigt werden, wird hierfür ein
% eigenes Paket definiert.
% \else%
% First the additionally needed fonts are provided. Since these fonts are also used
% in another connection, therefore an own package is defined.%
% \fi%
%    \begin{macrocode}
%<*struktxf>
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareKeys{
  iso.if =           @nss@iso,
  mathbb.ifnot =     @nss@iso,
  mathitalics.if =   @nss@mathitalics,
  mathnormal.ifnot = @nss@mathitalics
}

\ProcessKeyOptions
\SetKeys{iso=false, mathitalics=true} % the default values for use with struktex.sty

\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}{\rational}
% \begin{macro}{\real}
% \begin{macro}{\complex}
% \changes{v-4.1b}{95/07/23}{`complex eingeführt}
% \changes{v-4.1a}{95/07/17}{`nat, `integer und `real eingeführt}
% \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}
\newcommand{\naturalNumber}{\if@nss@iso\mathbf{N}\else\mathbb{N}\fi}
\newcommand{\integerNumber}{\if@nss@iso\mathbf{Z}\else\mathbb{Z}\fi}
\newcommand{\rationalNumber}{\if@nss@iso\mathbf{Q}\else\mathbb{Q}\fi}
\newcommand{\realNumber}{\if@nss@iso\mathbf{R}\else\mathbb{R}\fi}
\newcommand{\complexNumber}{\if@nss@iso\mathbf{C}\else\mathbb{C}\fi}
\let\nat\naturalNumber
\let\integer\integerNumber
\let\rational\rationalNumber
\let\real\realNumber
\let\complex\complexNumber
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\btt}
% \changes{v-4.1a}{95/07/17}{`btt auf NFSS umgestellt}
% \changes{v-8.0b}{04/07/14}{Hinweis auf Luxi Mono als Ersatz fuer cmbtt}
% \ifnum\language=\languageNGerman%
% Um fetten Schreibmaschinensatz erzeugen zu können, gibt es den Font \cs{btt},
% der als Erweiterung der \textsf{cmtt}-Font-Familie definiert ist. Um
% auf diesen Font auch ohne zusätzliches Einbinden dieses \foreign{packages}
% zugreifen zu können, kann man die entsprechenden Deklarationen in den
% Dateien |ot1cmtt.fd| bzw.\ |t1cmtt.fd| durch die folgende
% ersetzen.\footnote{Eine Alternative ist die Benutzung des Luxi Mono Fonts.}
% \else%
% For generating bold face typescript there's the font \cs{btt}, that is defined as
% an extension of the \textsf{cmtt} font family. For access to these
% \foreign{packages} without supplementary tieing up one can exchange the
% adequate declaration in the files |ot1cmtt.fd| or |t1cmtt.fd|
% respectively by the following:\footnote{An alternative is using the font
% Luxi Mono.}%
% \fi%
%    \begin{macrocode}
\DeclareFontFamily{OT1}{cmbtt}{}
\DeclareFontShape{OT1}{cmtt}{bx}{n}{
   <-8> cmbtt8 <9> cmbtt9 <10-> cmbtt10
}{}

\def\btt{%
    \fontencoding{\encodingdefault}\fontfamily{cmbtt}\fontseries{bx}%
    \fontshape{n}\selectfont%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\MathItalics}
% \begin{macro}{\MathNormal}
% \changes{v-4.1a}{95/07/17}{`MathItalics und `MathNormal eingeführt}
% \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} übernommen. Als Standard wird \cs{MathItalics}
% genommen, um eine schönere 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}
}

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