% \CheckSum{2611}
% \iffalse meta-comment
% ======================================================================
%
% Das Corporate Design der TU Dresden auf Basis der KOMA-Script-Klassen
%
% ======================================================================
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c of the license.
% The latest version of this license is in
%     http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later and of this work.
% This work has the LPPL maintenance status "author-maintained".
% The current maintainer and author of this work is Falk Hanisch.
% ----------------------------------------------------------------------
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
% Die neuste Version dieser Lizenz ist
%     http://www.latex-project.org/lppl.txt
% und Version 1.3c ist Teil aller Verteilungen von LaTeX
% Version 2005/12/01 oder spaeter und dieses Werks.
% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
% (allein durch den Autor verwaltet).
% Der aktuelle Verwalter und Autor dieses Werkes ist Falk Hanisch.
% ======================================================================
% \fi
%
% \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\6\7\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         \~}
%
% \iffalse
%%% From File: tudscr-manual.dtx
%<*driver>
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\ProvidesFile{tudscr-manual.dtx}[%
  2014/12/17 v2.02 TUD-KOMA-Script\space%
%</driver>
%<identify>\NeedsTeXFormat{LaTeX2e}[2011/06/27]
%<class&identify>\ProvidesClass{tudscrman}[%
%<package&identify>\ProvidesPackage{tudscrman}[%
%<*driver|(class|package)&identify>
%!TUDVersion
%<class>  class (internal manual)%
%<package>  package (internal tutorials)%
]
%</driver|(class|package)&identify>
%<*driver>
\RequirePackage[ngerman=ngerman-x-latest]{hyphsubst}
\documentclass[english,ngerman]{tudscrdoc}
\usepackage{selinput}\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{tudscrfonts} % only load this package, if the fonts are installed
\KOMAoptions{parskip=half-}
\CodelineIndex
\RecordChanges
\GetFileInfo{tudscr-manual.dtx}
\begin{document}
  \maketitle
  \DocInput{\filename}
\end{document}
%</driver>
% \fi
%
% \selectlanguage{ngerman}
%
% \changes{v2.02}{2014/11/18}{Index für Tutorials möglich}%^^A
% \changes{v2.02}{2014/12/17}{xindy-Stildatei wird zur Laufzeit erzeugt}%^^A
%
% \section{Klasse und Paket für die Anwenderdokumentation von \TUDScript}
%
% Es werden die Klasse \cls{tudscrman} für das \TUDScript-Handuch sowie das 
% Paket \pkg{tudscrman} für das Setzen von einigen Anwenderleitfäden bzw.
% Tutorials erzeugt. Da es zwischen der Klasse und dem Paket es eine große
% Menge an Überschneidungen gibt, basieren diese auf der gleichen Quelldatei.
%
% \StopEventually{\PrintIndex\PrintChanges}
%
% \iffalse
%<*body>
% \fi
%
% \subsection{Benötigte Pakete für die Anwenderdokumentation}
%
% Basis für das Handbuch ist die Klasse \cls{tudscrreprt}. An diese werden alle 
% Klassenoptionen weitergereicht. Sie wird für das Setzen des Anwenderhandbuchs
% genutzt. Zusätzlich wird das Paket \pkg{tudscrman} erstellt, um an das 
% Handbuch angelehnte Tutorials in einem Unterordner zu erstellen. Sowohl für 
% die Klasse als auch das Paket werden einige Pakete geladen.
%
% Das Paket \pkg{xparse} erlaubt eine sehr freie Deklaration von Makros mit
% nahezu beliebig arrangierbaren (optionalen) Argumenten.
%    \begin{macrocode}
\RequirePackage{xparse}[2013/12/31]
%    \end{macrocode}
% Für den Fließtext werden Pfeile u.\,ä. durch \pkg{textcomp} bereitgestellt.
%    \begin{macrocode}
\RequirePackage{textcomp}[2005/09/27]
%    \end{macrocode}
% Verbesserungen am \LaTeX-Kernel.
%    \begin{macrocode}
\RequirePackage{fixltx2e}[2014/06/10]
%    \end{macrocode}
% Vergrößerung des Durchschusses.
%    \begin{macrocode}
\RequirePackage{setspace}[2011/12/19]
\setstretch{1.1}\recalctypearea
%    \end{macrocode}
% Sprachunterstützung.
%    \begin{macrocode}
\RequirePackage{babel}[2014/03/24]
%    \end{macrocode}
% Sprachabhängiges Setzen von Anführungszeichen.
%    \begin{macrocode}
\AfterPackage*{inputenc}{\RequirePackage{csquotes}[2011/10/22]}
\AtBeginDocument{%
  \@ifpackageloaded{csquotes}{}{%
    \ClassWarning{\tudcls@name}{Package `csquotes' not loaded}%
    \providecommand\enquote[1]{\glqg#1\grqq{}}%
  }%
}
%    \end{macrocode}
% Das Paket \pkg{microtype} wird für den optischen Randausgleich verwendet.
%    \begin{macrocode}
\RequirePackage[babel]{microtype}[2013/05/23]
%    \end{macrocode}
% Verbesserte Zitate.
%    \begin{macrocode}
\RequirePackage{quoting}[2014/01/28]
%    \end{macrocode}
% Automatisierte Datumsformatierung.
%    \begin{macrocode}
\RequirePackage{isodate}[2010/01/03]
%    \end{macrocode}
% Verschiedenste Symbole aus dem \LaTeX-Universum.
%    \begin{macrocode}
\RequirePackage{hologo}[2012/04/26]
%    \end{macrocode}
% Das Paket \pkg{marginnote} stellt nicht fließenden Randnotizen bereit.
%    \begin{macrocode}
\RequirePackage{marginnote}[2012/03/29]
%    \end{macrocode}
% Sowohl im Handbuch als auch in den Tutroials werden Quelltextauszüge für das 
% bessere Verständnis des Anwenders angegeben. Um diese darzustellen wird das 
% Paket \pkg{listings} verwendet.
%    \begin{macrocode}
\RequirePackage{listings}[2014/03/04]
\lstdefinestyle{tudscr}{%
  basicstyle=\ttfamily\setstretch{1},%
  keywordstyle=,%
  columns=fullflexible,keepspaces,%
  aboveskip=.5\baselineskipglue,%
  belowskip=.5\baselineskipglue,%
  language=[LaTeX]TeX,%
  texcl,%
}
%    \end{macrocode}
% Mit dem Paket \pkg{silence} lassen sich ungewollte bzw. lästige Warnungen
% deaktivieren.
%    \begin{macrocode}
\RequirePackage{silence}[2012/07/02]
%    \end{macrocode}
% Das Pakete wird genutzt, um externer Dateien nur zu kompilieren, wenn dies 
% aufgrund einer Änderung auch notwendig ist.
%    \begin{macrocode}
\RequirePackage{filemod}[2011/09/19]
%    \end{macrocode}
% Sollte \pkg{auto-pst-pdf} aktiv sein, so wird das Laden von \pkg{todonotes}
% unterdrückt, da dieses wiederum das Paket \pkg{tikz} lädt, was zu Problem bei 
% der automatisierten Erstellung von \env{pstricks}"=Grafiken führt.
%    \begin{macrocode}
\RequirePackage{ifpdf}[2011/01/30]
\ifpdf
  \PassOptionsToPackage{colorinlistoftodos,obeyFinal,color=HKS92!10}{todonotes}
  \RequirePackage{todonotes}[2012/07/25]
\else
  \TUDoptions{ToDo=false}
\fi
%    \end{macrocode}
% Um die \cs{write18} sowohl für Windows als auch für unixoide Betriebssysteme 
% nutzen zu können, wird das Paket \pkg{ifplatform} geladen. Damit dieses nicht 
% allzu lästig ist, wird mithilfe von \pkg{silence} die normalerweise erzeugte 
% Warnung der nicht aktivierten Option \opt{shell escape} deaktiviert.
%    \begin{macrocode}
\WarningFilter*{ifplatform}{^^J \space\space\space shell escape is disabled}
\RequirePackage{ifplatform}[2010/10/22]
%    \end{macrocode}
% Das Paket \pkg{hyperref} wird für alle möglichen Links und Querverweise 
% geladen.
%    \begin{macrocode}
\PassOptionsToPackage{hyperindex=false}{hyperref}
\AtEndPreamble{%
  \RequirePackage{hyperref}[2012/11/06]
  \hypersetup{colorlinks,linkcolor=blue}
%    \end{macrocode}
% Es folgen einige Befehle, die an das Paket \pkg{hyperref} gekoppelt sind.
% \begin{macro}{\Email}
% Hyperlink für die Angabe einer E-Mail-Adresse.
%    \begin{macrocode}
  \newcommand*\Email[1]{\href{mailto:#1}{\nolinkurl{#1}}}
%    \end{macrocode}
% \end{macro}^^A \Email
% Die Bezeichner für die Abschnittsebenen werden umbenannt.
%    \begin{macrocode}
  \renewcaptionname{ngerman}{\sectionautorefname}{Unterkapitel}
  \renewcaptionname{ngerman}{\subsectionautorefname}{Abschnitt}
  \renewcaptionname{ngerman}{\subsubsectionautorefname}{Unterabschnitt}
%    \end{macrocode}
% \begin{macro}{\autorefname}
% \begin{macro}{\@autorefname}
% \begin{macro}{\@@autorefname}
% Der Befehl \cs{autorefname} dient dazu, den Verweistyp beziehungsweise den 
% Bezeichner des aktuellen oder optional zu einem speziellen Label ohne die 
% dazugehörige Nummerierung zu erhalten. Auf der Seite LaTeX Stack Exchange%
%\footnote{\url{http://tex.stackexchange.com/q/33776/}} wurde das Prinzip 
% vorgestellt und hier übernommen.
%    \begin{macrocode}
  \newcommand*\autorefname[1][current]{%
    \ifstr{#1}{current}{%
      \expandafter\HyPsd@@autorefname\@currentHref\@nil%
    }{%
      \@autorefname\HyPsd@@autorefname{#1}%
    }%
    \unskip\xspace%
  }
  \newcommand*\@autorefname[2]{%
    \expandafter\ifx\csname r@#2\endcsname\relax%
      ??%
    \else%
      \expandafter\expandafter\expandafter\@@autorefname%
          \csname r@#2\endcsname{}{}{}{}\@nil#1\@nil%
    \fi%
  }
  \newcommand*\@@autorefname{}
  \def\@@autorefname#1#2#3#4#5\@nil#6\@nil{#6#4.\@nil}
%    \end{macrocode}
% \end{macro}^^A \@@autorefname
% \end{macro}^^A \@autorefname
% \end{macro}^^A \autorefname
% \begin{macro}{\manualhyperdef}
% \changes{v2.02}{2014/10/27}{neu}%^^A
% \begin{macro}{\manualhyperref}
% \changes{v2.02}{2014/10/27}{neu}%^^A
% Diese beiden Befehle dienen zum Defnieren von Textankern im Handbuch und zum
% Referenzieren auf diese. Bei der Erstelung des Ankers mit \cs{manualhyperdef} 
% wird zusätzlich auch noch ein Label (\cs{label}) erzeugt. Die Sternversion 
% des Befehls unterdrückt dies. Der Anker wird mit \cs{Hy@raisedlink}~-- wie es 
% auch bei normalen \pkg{hyperref}-Labels geschieht~-- über die Grundlinie
% gehoben. Die Version mit Apostroph kann nach Überschriften verwendet werden 
% und verschiebt die vertikale Position des Ankers noch weiter nach oben.
%    \begin{macrocode}
%<*class>
  \NewDocumentCommand\manualhyperdef{st'm}{%
    \IfBooleanTF{#2}{%
      \raisebox{4\baselineskip}[0pt][0pt]{\hyperdef{\jobname}{#3}{}}%
      \par\nobreak\vskip\dimexpr-\parskip-\baselineskip%
      \@afterindentfalse\@afterheading%
    }{%
      \Hy@raisedlink{\hyperdef{\jobname}{#3}{}}%
      \ignorespaces%
    }%
    \IfBooleanF{#1}{\label{#3}}%
  }
  \newcommand*\manualhyperref[2]{\hyperref{}{\jobname}{#1}{#2}}
%</class>
%    \end{macrocode}
% Aus einem Tutorial erfolgen alle Querverweise mit \cs{manualhyperref} auf das 
% Anwenderhandbuch \enquote{tudscr}.
%    \begin{macrocode}
%<*package>
  \newcommand*\manualhyperref[2]{\hyperref{../tudscr}{tudscr}{#1}{#2}}
%</package>
%    \end{macrocode}
% \end{macro}^^A \manualhyperref
% \end{macro}^^A \manualhyperdef
% Damit sind die Ausführungen für das Paket \pkg{hyperref} \emph{fast} beendet. 
% Etwas später wird noch der Befehl \cs{pdfexpandableoutline} definiert.
%    \begin{macrocode}
}
%    \end{macrocode}
% Für die Erstellung des Indexes wird das Paket \pkg{imakeidx} zusammen mit 
% \pkg{xindy} verwendet. Zuerst ein paar kleinere Einstellungen für das Layout.
%    \begin{macrocode}
\PassOptionsToPackage{xindy,splitindex}{imakeidx}
\RequirePackage{imakeidx}[2013/07/11]%
\indexsetup{%
%<*class>
  level=\addsec,%
%</class>
%<*package>
  level=\subsection*,%
%</package>
  noclearpage,firstpagestyle=headings,headers={\indexname}{\indexname}%
}
\newcommand*\xdyopt{-M tudscrman-temp.xdy -L german-din}
%    \end{macrocode}
% \begin{macro}{\tud@write@i}
% \changes{v2.02}{2014/10/22}{neu}%^^A
% \begin{macro}{\tud@write@ii}
% \changes{v2.02}{2014/11/02}{neu}%^^A
% \begin{macro}{\tud@read}
% \changes{v2.02}{2014/08/19}{neu}%^^A
% Für die Erstellung der Indizes wird zum Sortieren das Programm \pkg{xindy} 
% genutzt. Für dieses wird eine eigene Stildatei verwendet, welche zur Laufzeit 
% erzeugt wofür zuerst ein Ausgabestream reserviert wird.
%    \begin{macrocode}
\newcommand*\tud@write@i{}
\newwrite\tud@write@i
%    \end{macrocode}
% Für die Tutorials werden später zusätzlich noch ein weiterer Ausgabe- sowie 
% ein Eingabestream benötigt, die hier gleich mit initilaisiert werden.
%    \begin{macrocode}
%<*package>
\newcommand*\tud@write@ii{}
\newwrite\tud@write@ii
\newcommand*\tud@read{}
\newread\tud@read
%</package>
%    \end{macrocode}
% \end{macro}^^A \tud@read
% \end{macro}^^A \tud@write@ii
% \end{macro}^^A \tud@write@i
% Nachfolgend wird die zu erstellenden \pkg{xindy}-Stildatei kurz beschrieben.
%    \begin{macrocode}
\openout\tud@write@i=tudscrman-temp.xdy
%    \end{macrocode}
% Als erstes wird Standard-\LaTeX-Modul geladen.
%    \begin{macrocode}
\write\tud@write@i{(require "texindy.xdy")}
%    \end{macrocode}
% Leider lässt sich für Seitenzahlbereiche via \val{:attr} (noch) kein Markup 
% für angehängte \enquote{f.} sowie \enquote{ff.} einstellen. Diese würden 
% deshalb bei kursiven oder fetten Seitenzahlen trotzdem in normaler Schrift
% erscheinen, weshalb auf die Auszeichnung folgender Seiten verzichtet wird.
%    \begin{macrocode}
%\write\tud@write@i{(require "ff-ranges.xdy")}
%    \end{macrocode}
% Seitenbereiche werden sofort zusammengefasst, wobei als Trennzeichen ein
% Halbgeviertstrich verwendet wird.
%    \begin{macrocode}
\write\tud@write@i{%
(define-location-class^^J%
\space\space "arabic-page-numbers" ("arabic-numbers") :min-range-length 1^^J%
)%
}
\write\tud@write@i{(markup-range :sep "--")}
%    \end{macrocode}
% Alle Argumente in eckigen Klammern werden ignoriert. Dies wird bei einigen
% Indexbefehlen genutzt, um die nicht beachteten RegExp-Regeln auszugleichen, 
% siehe den nächsten Absatz.
%    \begin{macrocode}
\write\tud@write@i{(merge-rule "\[(.*)\]" "" :eregexp)}
%    \end{macrocode}
% Innerhalb ausgewählter Auszeichnungs- und Textbefehle sollten die Befehle
% selbst, nicht jedoch die Argumente verworfen werden. Leider werden die 
% manuell erstellten RegExp-Regeln durch \texttt{texindy} zu spät genutzt 
% (\url{http://sourceforge.net/p/xindy/bugs/22/}).
%    \begin{macrocode}
%\write\tud@write@i{(merge-rule "\\hyperindex\{(.*)\}\{(.*)\}" "/2" :eregexp)}
%\write\tud@write@i{(merge-rule "\\hologo\{(.*)\}" "/1" :eregexp)}
%\write\tud@write@i{(merge-rule "\\texttt\{(.*)\}" "/1" :eregexp)}
%\write\tud@write@i{(merge-rule "\\textsbn\{(.*)\}" "/1" :eregexp)}
%\write\tud@write@i{(merge-rule "\\textsbs\{(.*)\}" "/1" :eregexp)}
%    \end{macrocode}
% Es werden die Attribute \emph{declare} mit der Abkürzung \emph{!} sowie
% \emph{important} mit der Abkürzung \emph{?} und \emph{default} definiert, 
% welche hierarchisch gleichgestellt sind.
%    \begin{macrocode}
\write\tud@write@i{%
  (define-attributes (("declare" "!" "important" "?" "default")))%
}
%    \end{macrocode}
% Eine Alternative wäre, diese in der Hierarchie zu unterscheiden, allerdings
% war eine Bildung von zufriedenstellenden Seitenbereichen dabei nicht möglich
% und wurde deshalb verworfen.
%    \begin{macrocode}
%\write\tud@write@i{(markup-attribute-group-list :sep ", ")}
%\write\tud@write@i{%
%\space\space(define-attributes (("declare" "!") ("important" "?")("default")))%
%}
%    \end{macrocode}
% Einträge, die als wichtig deklariert wurden, können auch für normale zur 
% Bereichsbildung verwendet werden.
%    \begin{macrocode}
\write\tud@write@i{(merge-to "important" "default")}
\write\tud@write@i{(merge-to "?" "default")}
%    \end{macrocode}
% Hier erfolgt die Definition der Auszeichnugen der Attribute. Deklarationen 
% werden fett gedruckt, wichtige Einträge erscheinen kursiv. Außerdem wird ein
% entsprechnder Link auf die Seite eingefügt.
%    \begin{macrocode}
\write\tud@write@i{%
(markup-locref^^J%
\space\space :open "\string\textbf{\string\hyperpage{"^^J%
\space\space :close "}}"^^J%
\space\space :attr "declare"^^J%
)%
}
\write\tud@write@i{%
(markup-locref^^J%
\space\space :open "\string\textbf{\string\hyperpage{"^^J%
\space\space :close "}}"^^J%
\space\space :attr "!"^^J%
)%
}
\write\tud@write@i{%
(markup-locref^^J%
\space\space :open "\string\textsl{\string\hyperpage{"^^J%
\space\space :close "}}"^^J%
\space\space :attr "important"^^J%
)%
}
\write\tud@write@i{%
(markup-locref^^J%
\space\space :open "\string\textsl{\string\hyperpage{"^^J%
\space\space :close "}}"^^J%
\space\space :attr "?"^^J%
)%
}
\write\tud@write@i{%
(markup-locref^^J%
\space\space :open "\string\hyperpage{"^^J%
\space\space :close "}"^^J%
\space\space :attr "default"^^J%
)%
}
%    \end{macrocode}
% Punkte zwischen Eintrag und Seitenzahl.
%    \begin{macrocode}
\write\tud@write@i{%
  (markup-locclass-list :open "\string\,\string\dotfill\string\,")%
}
%    \end{macrocode}
% Dieser Querverweistyp wird speziell im allgemeinen Index verwendet, um auf 
% einen Spezialindex zu verweisen.
%    \begin{macrocode}
\write\tud@write@i{(define-crossref-class "seeidx")}
\write\tud@write@i{%
(markup-crossref-list^^J%
\space\space :class "seeidx" :open "\string\seeidx{" :sep "; " :close "}{}"^^J%
)%
}
%    \end{macrocode}
% Damit ist die \pkg{xindy}-Stildatei fertig.
%    \begin{macrocode}
\closeout\tud@write@i
%    \end{macrocode}
% Nun können die einzelnen Indizes erstellt werden.
%    \begin{macrocode}
%<*class>
\makeindex[title={Allgemeiner Index},options=\xdyopt]%
%</class>
\makeindex[title={Klassen- und Paketoptionen},name=options,options=\xdyopt]%
\makeindex[%
  title={Umgebungen, Befehle und Seitenstile},name=macros,options=\xdyopt%
]%
%<*class>
\makeindex[title={Umgebungs- und Befehlsparameter},name=keys,options=\xdyopt]%
\makeindex[title={Sprachabh\"angige Bezeichner},name=terms,options=\xdyopt]%
\makeindex[title={Schriftelemente},name=fonts,options=\xdyopt]%
\makeindex[title={Farben},name=colors,options=\xdyopt]%
%</class>
\makeindex[title={Klassen, Pakete und Dateien},name=files,options=\xdyopt]%
%<*class>
\makeindex[title={\"Anderungsliste},name=changelog,columns=1,options=\xdyopt]%
%</class>
%    \end{macrocode}
%
% \iffalse
%<*class>
% \fi
%
% \subsubsection{Pakete für die Klasse \cls{tudscrman}}
%
% Das Paket \pkg{enumitem} erlaubt das Beeinflussen der Standardlisten und die 
% Ableitung neuer Listen aus diesen. mit \cs{setlist\{noitemsep\}} werden die 
% zusätzlichen Zwischenräume innerhalb der Listen beseitigt.
%    \begin{macrocode}
\RequirePackage{enumitem}[2011/09/28]
\setlist{noitemsep}
%    \end{macrocode}
% Das Paket \pkg{ellipsis} sorgt für korrekte Auslassungpunkte.
%    \begin{macrocode}
\AtBeginDocument{
  \RequirePackage{ellipsis}[2004/9/28]
  \let\ellipsispunctuation\relax
}
%    \end{macrocode}
% Mit Hilfe von \pkg{tabularx} können Tabellen bestimmter Breite und
% automatisch berechneten Spaltenbreiten gesetzt werden.
%    \begin{macrocode}
\RequirePackage{tabularx}[1999/01/07]
%    \end{macrocode}
% Mit \pkg{ragged2e} wird~-- falls benötigt~-- die Silbentrennung im 
% Flattersatz aktiviert. 
%    \begin{macrocode}
\RequirePackage{ragged2e}[2009/05/21]
%    \end{macrocode}
% Die Fußnoten werden nicht mit jedem Kapitel zurückgesetzt.
%    \begin{macrocode}
\RequirePackage{chngcntr}[2009/09/02]
\counterwithout{footnote}{chapter}
%    \end{macrocode}
% Das Paket wird für die Erstellung von Tabellen verwendet.
%    \begin{macrocode}
\RequirePackage{booktabs}[2005/04/14]
%    \end{macrocode}
% Verbesserte Referenzierungen auf Seiten.
%    \begin{macrocode}
\RequirePackage{varioref}[2011/10/02]%
\renewcommand*\fullref[1]{\hyperref[#1]{\autoref*{#1} \vpageref{#1}}}
%    \end{macrocode}
% Erstellen von Grafiken.
%    \begin{macrocode}
\RequirePackage{tikz}[2013/12/13]
%    \end{macrocode}
% Einbinden von ganzseitigen PDF"~Dokumenten als Beispiel im Handbuch.
%    \begin{macrocode}
\RequirePackage{pdfpages}[2013/08/25]
%    \end{macrocode}
% Typographisch saubere Einheiten.
%    \begin{macrocode}
\RequirePackage{units}[1998/08/04]
%    \end{macrocode}
% Befehle für die Dokumentation des Pakets \pkg{tudscrsupervisor}.
%    \begin{macrocode}
\RequirePackage{tudscrsupervisor}[\TUDVersion]
%    \end{macrocode}
%
% \iffalse
%</class>
%<*package>
% \fi
%
% \subsubsection{Pakete für das Paket \pkg{tudscrman}}
%
% Mit dem Paket \pkg{scrwfile} lassen sich Probleme mit zu wenig verfügbaren 
% Streams für das Schreiben externer Datein beheben. Hintergrund ist die
% Verwendung des Paketes \pkg{glossaries} in einem der Tutorials, welches eine
% Vielzahl solcher Streams benötigt. Das Paket \pkg{morewrites} hat keinen 
% Einfluss auf \pkg{glossaries}.
%    \begin{macrocode}
\RequirePackage{scrwfile}[2013/08/05]
%    \end{macrocode}
% Die Umgebungen \env{Preamble}, \env{Trunk} und \env{Hint} sowie deren
% Varianten nutzen das Paket \pkg{filecontents}, um ihren Inhalt in eine
% temporäre Datei zu schreiben und diese direkt mit dem Paket \pkg{listings}
% darzustellen sowie ggf. den Quelltext auszuführen. Beim Überschreiben einer
% Datei wird für gewöhnlich eine Warnung erzeugt. Mit dem Paket \pkg{silence}
% wird diese innerhalb der genannten Umgebungen deaktiviert.
%    \begin{macrocode}
\RequirePackage{filecontents}[2011/10/08]
\WarningFilter[Tutorial]{latex}{Overwriting file}%
%    \end{macrocode}
%
% \iffalse
%</package>
%</body>
%<*option>
% \fi
%
% \subsection{Optionen der Anwenderdokumentation}
%
% Hier werden die Optionen für Klasse und Paket definiert.
%
% \begin{option}{ToDo}
% \changes{v2.02}{2014/07/10}{neu}%^^A
% \begin{macro}{\if@tud@todo}
% \changes{v2.02}{2014/07/10}{neu}%^^A
% Diese Option ist verantwortlich für den Schalter \cs{if@tud@todo}. Über 
% diesen wird gesteuert, ob ToDo-Notizen ausgegeben werden sollen.
%    \begin{macrocode}
\newif\if@tud@todo
\@tud@todotrue
\TUD@ifkey{ToDo}{@tud@todo}
%    \end{macrocode}
% \end{macro}^^A \if@tud@todo
% \end{option}^^A ToDo
%
% \iffalse
%<*class>
% \fi
%
% Es werden einige Optionen für das Handbuch standardmäßig aktiviert. Dazu 
% werden diese an die entsprechende Elternklasse übergeben.
%    \begin{macrocode}
\PassOptionsToClass{%
  cdfoot=true,%
  chapterpage=true,%
  chapterprefix=true,%
  headings=optiontoheadandtoc,%
  captions=tableheading,%
  numbers=noenddot,%
  color=true,%
}{\tudinh@name}
\PassOptionsToPackage{automark}{scrlayer-scrpage}
%    \end{macrocode}
% \begin{macro}{\tudfinalflag}
% \begin{macro}{\tudprintflag}
% Außerdem wird geprüft, ob durch einen externen pdf\LaTeX-Aufruf die Flags
% \cs{tudfinalflag} und/oder \cs{tudprintflag} definiert wurde. In diesem Fall
% werden Optionen zur finalen Ausgabe und/oder unbunten Druck aktiviert.
%    \begin{macrocode}
\DeclareOption{final}{\let\tudfinalflag\relax}
\DeclareOption{print}{\let\tudprintflag\relax}
\AtBeginDocument{%
  \ifdef{\tudfinalflag}{\TUDoptions{ToDo=false}}{}%
  \ifdef{\tudprintflag}{\hypersetup{hidelinks}\TUDoptions{color=no}}{}%
}
%    \end{macrocode}
% \end{macro}^^A \tudprintflag
% \end{macro}^^A \tudfinalflag
%
% \iffalse
%</class>
%<*package>
% \fi
%
% Wird das Paket \pkg{tudscrman} geladen, werden zu Beginn des Dokumentes ein
% paar Standardeinstellungen gemacht.
%
%    \begin{macrocode}
\KOMAoptions{headings=small}
\TUDoptions{cd=true,cdfoot=true}
%    \end{macrocode}
% Falls innerhalb eines Tutorials das Paket \pkg{pstricks} verwendet wird, muss
% dafür Sorge getragen werden, dass die automatische Kompilierung reibungslos
% mit \pkg{auto-pst-pdf} funktioniert.
%    \begin{macrocode}
\AfterPackage*{pstricks}{%
  \ifnum\pdfshellescape=1\relax
    \RequirePackage{auto-pst-pdf}[2009/04/26]
  \else
    \RequirePackage[off]{auto-pst-pdf}[2009/04/26]
  \fi
}
%    \end{macrocode}
%
% \iffalse
%</package>
%</option>
%<*body>
% \fi
%
% \subsection{Gemeinsame Befehle und Umgebungen für Klasse und Paket}
% 
% Es folgen die Definitionen für Befehle und Umgebungen für Klasse und Paket, 
% welche sich überschneidenden und für beide benötigt werden. Allerdings sind 
% diese jedoch für Klasse und Paket in ihrer Implementierung teilweise sehr
% unterschiedlich.
%
% \subsubsection{Auszeichnung von Variablen, Parametern etc.}
%
% \begin{macro}{\PName}
% \begin{macro}{\PBoolean}
% \begin{macro}{\PBName}
% \changes{v2.02}{2014/11/12}{neu}%^^A
% \begin{macro}{\PSet}
% \begin{macro}{\Parameter}
% \begin{macro}{\OParameter}
% \begin{macro}{\LParameter}
% \begin{macro}{\OLParameter}
% \begin{macro}{\PValue}
% \begin{macro}{\PParameter}
% \begin{macro}{\POParameter}
% Diese Befehle dienen zum Auszeichnen von obligatorischen und optionalen 
% Parametern und Befehlen oder bestimmten Wertzuweisungen.
%    \begin{macrocode}
\newrobustcmd*\PName[1]{\mbox{\texttt{\textsl{<#1>}}}}
\newrobustcmd*\PBoolean{\PName{Ein-Aus-Wert}}
\newrobustcmd*\PBName[1]{\PBoolean|\PName{#1}}
\newrobustcmd*\PSet{\PName{Einstellung}}
\newrobustcmd*\Parameter[1]{\mbox{\texttt{\{}\PName{#1}\texttt{\}}}}
\newrobustcmd*\OParameter[1]{\mbox{\texttt{[}\PName{#1}\texttt{]}}}
\newrobustcmd*\LParameter{\mbox{\texttt{[}\PName{Parameterliste}\texttt{]}}}
\newrobustcmd*\OLParameter[1]{%
  \mbox{\texttt{[}\PName{#1}|\PName{Parameterliste}\texttt{]}}%
}
\newrobustcmd*\PValue[1]{\mbox{\texttt{#1}}}
\newrobustcmd*\PParameter[1]{\mbox{\texttt{\{#1\}}}}
\newrobustcmd*\POParameter[1]{\mbox{\texttt{[#1]}}}
%    \end{macrocode}
% \end{macro}^^A \POParameter
% \end{macro}^^A \PParameter
% \end{macro}^^A \PValue
% \end{macro}^^A \OLParameter
% \end{macro}^^A \LParameter
% \end{macro}^^A \OParameter
% \end{macro}^^A \Parameter
% \end{macro}^^A \PSet
% \end{macro}^^A \PBName
% \end{macro}^^A \PBoolean
% \end{macro}^^A \PName
%
% \subsubsection{Kompilieren von externen Dateien und Querverweise auf diese}
%
% \begin{macro}{\Tutorial}
% \changes{v2.02}{2014/08/22}{neu}%^^A
% \changes{v2.02}{2014/10/22}{Reimplementierung}%^^A
% \begin{macro}{\hypertut}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% Die gegebenenfalls notwendige Kompilierung und die Referenzierung eines 
% Tutorials aus dem Handbuch erfolgt mit \cs{Tutorial}. Außerdem erfolgt mit
% \cs{hypertut} ein verlinkter Eintrag in den Index.
%    \begin{macrocode}
%<*class>
\newrobustcmd*\hypertut[2]{%
  \hyperref{tutorials/#1.pdf}{\jobname}{tutorials:#1}{\textsbn{#1.pdf}#2}%
}
\NewDocumentCommand\Tutorial{som}{%
  \ifnum\pdfshellescape=1\relax%
%    \end{macrocode}
% Um mit den verschachtelten Aufrufen von pdf\LaTeX{} umgehen zu können, wird 
% das ganze Prozedere in ein Skript ausgelagert. Somit können die Aufrufe von
% pdf\LaTeX{} für die Tutorials im entsprechenden Ordner erfolgen.
%    \begin{macrocode}
    \filemodCmp{tutorials/#3.pdf}{tutorials/#3.tex}{}{%
      \immediate\openout\tud@write@i=tutorials.sh%
      \immediate\write\tud@write@i{%
        cd tutorials^^J%
        pdflatex -shell-escape #3^^J%
        biber #3^^J%
        makeglossaries #3^^J%
        pdflatex #3^^J%
        pdflatex #3%
      }%
      \immediate\closeout\tud@write@i%
%    \end{macrocode}
% Hier erfolgt die Unterscheidung der Befehle für die unterschiedlichen OS.
%    \begin{macrocode}
      \ifwindows%
        \immediate\write18{rename tutorials.sh tutorials.bat}%
        \immediate\write18{tutorials.bat}%
        \immediate\write18{del tutorials.bat}%
      \else%
        \immediate\write18{bash tutorials.sh}%
        \immediate\write18{rm tutorials.sh}%
      \fi%
    }%
  \fi%
%    \end{macrocode}
% Hyperlink und Indexeintrag.
%    \begin{macrocode}
  \IfFileExists{tutorials/#3.pdf}{%
    \hypertut{#3}{}%
  }{%
    \textsbn{#3.pdf}%
    \tud@shellescape@wrn%
  }%
  \IfBooleanF{#1}{%
    \index[files]{\hypertut{#3}{~{\idxfont(Tutorial)}\IfValueT{#2}{|#2}}}%
  }%
}
%</class>
%    \end{macrocode}
% Der Befehl für die Querverweise innerhalb von Tutorials.
%    \begin{macrocode}
%<*package>
\newcommand*\Tutorial[1]{\href{#1.pdf}{\textsbn{#1.pdf}}}
%</package>
%    \end{macrocode}
% \end{macro}^^A \hypertut
% \end{macro}^^A \Tutorial
%
% \iffalse
%<*class>
% \fi
%
% \begin{macro}{\IncludeExample}
% \changes{v2.02}{2014/07/25}{Skalierung der eingefügten Seiten}%^^A
% \changes{v2.02}{2014/10/14}{Reimplementierung}%^^A
% Mit diesem Befehl wird eine \LaTeX-Datei ggf. übersetzt und anschließend als
% PDF"~Datei wieder eingebunden. Zuvor wird der dazugehörige Quelltext mittels
% \cs{lstinputlisting} im Dokument ausgegeben. Dieser Befehl wird lediglich für 
% die Klasse \cls{tudscrman} benötigt.
%    \begin{macrocode}
\newcommand*\IncludeExample[1]{%
  \lstinputlisting[style=tudscr]{examples/#1}%
%    \end{macrocode}
% Die Beispiele werden nur erneut kompiliert, wenn sich diese geändert haben 
% oder noch gar kein entsprechendes PDF"~Dokument existiert.
%    \begin{macrocode}
  \ifnum\pdfshellescape=1\relax%
    \filemodCmp{examples/#1.pdf}{examples/#1.tex}{}{%
      \immediate\write18{%
        pdflatex -shell-escape -output-directory examples examples/#1.tex
        pdflatex -output-directory examples examples/#1.tex
        pdflatex -output-directory examples examples/#1.tex
      }%
    }%
  \fi%
%    \end{macrocode}
% Ist die gesuchte Datei vorhanden, wird diese auch eingebunden. Andernfalls 
% wird eine Warnung mit dem Hinweis auf die notwendige Verwednung von 
% \val{pdflatex} mit der Option \opt{--shell-escape} erzeugt.
%    \begin{macrocode}
  \IfFileExists{examples/#1.pdf}{%
    \includepdf[%
      pages=-,noautoscale,frame,keepaspectratio,pagecommand={},%
      height=\textheight,width=\textwidth, offset=5mm 0mm%
    ]{examples/#1.pdf}%
  }{%
    \tud@shellescape@wrn%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \IncludeExample
%
% \iffalse
%</class>
% \fi
%
% \subsubsection{ToDo-Liste}
%
% \begin{macro}{\ToDo}
% \changes{v2.02}{2014/07/10}{Verwendung von \pkg{todonotes}}%^^A
% \begin{macro}{\@ToDo}
% \changes{v2.02}{2014/07/10}{neu}%^^A
% \begin{macro}{\ListOfToDo}
% \changes{v2.02}{2014/07/10}{neu}%^^A
% Mit dem Befehl \cs{ToDo}\oarg{options}\marg{inline text}\oarg{marginnote}
% kann bei aktivierter Option \opt{ToDo} eine Notiz mit einer offenen Ausgabe
% erstellt werden. Das vorangestellte Argument kann Optionen beinhalten, welche
% durch \pkg{todonotes} unterstützt werden. Außerdem werden die vier boolschen
% Schlüssel \val{doc}, \val{man}, \val{imp} und \val{nxt} definiert, welche
% eine feste, farbliche Kodierung erzeugen. Das angestellte optionale Argument
% erzeugt eine gleichartige Notiz am Rand, in welcher vorzugsweise die
% angedachte Version eingetragen werden kann. Mit \cs{ListOfToDo} wird abhängig
% von der Option \opt{ToDo} eine Liste der offenen Aufgaben erstellt.
%    \begin{macrocode}
\newcommand*\@ToDo{}
\NewDocumentCommand\ToDo{somo}{%
  \ifbool{@tud@todo}{%
    \begingroup%
%    \end{macrocode}
% Die boolschen Schlüssel.
%    \begin{macrocode}
      \define@boolkey{todonotes}{doc}[true]{%
        \ifbool{KV@todonotes@doc}{\setkeys{todonotes}{color=HKS41!10}}{}%
      }%
      \define@boolkey{todonotes}{rls}[true]{%
        \ifbool{KV@todonotes@rls}{\setkeys{todonotes}{color=HKS44!50}}{}%
      }%
      \define@boolkey{todonotes}{imp}[true]{%
        \ifbool{KV@todonotes@imp}{\setkeys{todonotes}{color=HKS07!50}}{}%
      }%
      \define@boolkey{todonotes}{nxt}[true]{%
        \ifbool{KV@todonotes@nxt}{\setkeys{todonotes}{color=HKS57!50}}{}%
      }%
%    \end{macrocode}
% In \cs{@ToDo} wird das optionale Argument für \pkg{todonotes} gesichert.
%    \begin{macrocode}
      \def\@ToDo{}%
      \IfValueTF{#2}{%
        \IfBooleanTF{#1}{\edef\@ToDo{#2,nolist}}{\edef\@ToDo{#2}}%
      }{%
        \IfBooleanT{#1}{\edef\@ToDo{nolist}}%
      }%
%    \end{macrocode}
% Damit die Randnotiz nicht verrutscht, wird \cs{marginnote} anstelle von 
% \cs{marginpar} verwendet. Außerdem ist eine Verschiebung um den durch 
% \pkg{todonotes} definierten Leerraum notwendig.
%    \begin{macrocode}
      \renewcommand*\marginpar[2][]{\marginnote[##1]{##2}[\dimexpr-1.6ex+1pt]}%
      \vskip.8ex%
%    \end{macrocode}
% hier erfolgt die Ausgabe.
%    \begin{macrocode}
      \IfValueT{#4}{%
        \settowidth\marginparwidth{#4}%
        \addtolength\marginparwidth{\dimexpr1.6ex+1pt}%
        \let\par\relax\noindent%
        \edef\@tempa{\noexpand\todo[\@ToDo,noline,nolist]}%
        \@tempa{#4}%
      }%
      \edef\@tempa{\noexpand\todo[\@ToDo,inline]}%
      \@tempa{#3}%
    \endgroup%
    \par\noindent%
  }{}%
  \ignorespaces%
}
%    \end{macrocode}
% Zum Schluss wird der Befehl \cs{ListOfToDo} definiert, der die Liste der noch 
% zu erledigenden Punkte nur ausgeführt ausgibt, wenn die Option \opt{ToDo}
% aktiviert ist. Außerdem werden die Randnotizen auf den linken~-- weil 
% größeren~-- Rand gesetzt.
%    \begin{macrocode}
\newcommand*\ListOfToDo{\if@tud@todo\listoftodos\fi}
\reversemarginpar
%    \end{macrocode}
% \end{macro}^^A \ListOfToDo
% \end{macro}^^A \@ToDo
% \end{macro}^^A \ToDo
%
% \subsubsection{Kleinkram}
% 
% \begin{macro}{\bsc}
% \changes{v2.02}{2014/07/22}{\cs{DeclareRobustCommand} ersetzt mit
%   \cs{newrobustcmd} aus \pkg{etoolbox}}%^^A
% Eine einfacher zu verwendende Kurzform.
%    \begin{macrocode}
\newrobustcmd*\bsc{\@backslashchar}
%    \end{macrocode}
% \end{macro}^^A \bsc
% \begin{length}{\baselineskipglue}
% Diese Länge wird in der Dokumentation für alle möglichen stauch- und 
% dehnbaren Einfügen genutzt.
%    \begin{macrocode}
\newlength\baselineskipglue
\setlength\baselineskipglue{%
  .4\baselineskip plus .4\baselineskip minus .2\baselineskip%
}
%    \end{macrocode}
% \end{length}^^A \baselineskipglue
% \begin{macro}{\tud@shellescape@wrn}
% \changes{v2.02}{2014/10/14}{neu}%^^A
% Dieses Makro wird verwendet, wenn eine gesuchte Datei nicht gefunden wurde, 
% weil das Dokument noch nicht mit der Option \opt{--shell-escape} kompiliert 
% wurde.
%    \begin{macrocode}
\newcommand*\tud@shellescape@wrn{%
  \ClassWarning{\tudcls@name}{%
    You have to recompile this document with\MessageBreak%
    activated shell escape option%
  }%
  \global\let\tud@shellescape@wrn\relax%
}
%    \end{macrocode}
% \end{macro}^^A \tud@shellescape@wrn
% \begin{macro}{\pdfexpandableoutline}
% \changes{v2.02}{2014/11/04}{neu}%^^A
% \begin{macro}{\@TUDScript}
% \changes{v2.02}{2014/08/16}{neu}%^^A
% Für die PDF-Outline-Einträge müssen einige Befehle durch eine expandierbare
% Version ersetzt werden. Der Befehl \cs{pdfexpandableoutline} wird definiert, 
% um dies möglichst einfach zu gestalten.
%    \begin{macrocode}
\newcommand*\pdfexpandableoutline[1]{%
  \AfterPackage*{hyperref}{\pdfstringdefDisableCommands{\csletcs{#1}{@#1}}}
}
%    \end{macrocode}
% Den Anfang mach gleich \cs{TUDScript}.
%    \begin{macrocode}
\newcommand*\@TUDScript{TUD-KOMA-Script}
\pdfexpandableoutline{TUDScript}
%    \end{macrocode}
% \end{macro}^^A \@TUDScript
% \end{macro}^^A \pdfexpandableoutline
%
% \subsubsection{Markup von Klassen, Paketen, Optionen und weiteren Elementen}
% 
% Im Folgenden werden allerhand Befehle mit Hilfe des Paketes \pkg{xparse} 
% definiert, um bestimmte Begriffe, Klassen, Pakete, Optionen, Umgebungen, 
% Befehle, Parameter, Bezeichner, Längen, Schriftelemente und Farben speziell
% auszuzeichnen. Diese Befehle lauten für Klasse und Paket nutzen aus Gründen
% der Konsistenz zwar gleich, unterschieden sich jedoch in der Implementierung.
%
% Für die Klasse gilt, dass die Sternversion all dieser Befehlen nichts in den
% Index einträgt, wenn diese denn im Fließtext Verwendung finden. Wird die
% Sternversion jedoch in einer Änderungsnotiz genutzt, so wird die für diese
% normalerweise angehängte Beschreibung des Elementes unterdrückt. Für (fast)
% alle der folgenden Befehle gilt, dass diese mit zwei optionalen Befehlen am
% Ende genutzt werden können. Mit \val{'refformat'} kann angegeben werden, ob 
% der automatisch erzeugte Hyperlink um einen textuellen Querverweis ergänzt
% werden soll. Mit \val{|idxformat|} kann die Erscheinung im Index angepasst
% werden. Die eigentliche Behandlung der Eingabe und die Eintragungen in den
% Index erfolgen dabei mit dem Befehl \cs{@ProcessOutput}, für einen Eintrag 
% in die Änderungsliste wird der Befehl \cs{@ProcessChangedAt} genutzt.
%
% Die Befehle für das Paket \pkg{tudscrman} sind in ihrer Funktionalität um
% einiges reduziert. Die meisten besitzen nur ein obligatorisches Argument für 
% die formatierte Ausgabe sowie evtl. eine Sternversion, die einen Querverweis
% auf das Handbuch erzeugt.
% \begin{macro}{\Application}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@Application}
% Die Auszeichnung und der Indexeintrag einer Anwendungssoftware.
%    \begin{macrocode}
%<*class>
\NewDocumentCommand\Application{smd||}{%
  \ifdin{#2}{%
    \mbox{\textsbs{#2}}%
    \CheckIndexFormat{#1}{#3}%
    \IfBooleanF{#1}{%
      \index{\textsbs{#2}~{\idxfont(Anwendungssoftware)}\IfValueT{#3}{|#3}}%
    }%
  }%
}
\DeclareExpandableDocumentCommand\@Application{sm}{#2}
\pdfexpandableoutline{Application}
%</class>
%<*package>
\newcommand*\Application[1]{\ifdin{#1}{\mbox{\textsbs{#1}}}}
%</package>
%    \end{macrocode}
% \end{macro}^^A \@Application
% \end{macro}^^A \Application
% \begin{macro}{\Distribution}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% Die Auszeichnung und der Indexeintrag einer \LaTeX-Distribution.
%    \begin{macrocode}
%<*class>
\NewDocumentCommand\Distribution{smod||}{%
  \ifdin{#2\IfValueT{#3}{~#3}}{%
    \mbox{\textsbn{#2\IfValueT{#3}{~#3}}}%
    \CheckIndexFormat{#1}{#4}%
    \IfBooleanF{#1}{%
      \index{\textsbn{#2}~{\idxfont(Distribution)}\IfValueT{#4}{|#4}}%
    }%
  }%
}
%</class>
%<*package>
\newcommand*\Distribution[1]{\ifdin{#1}{\mbox{\textsbn{#1}}}}
%</package>
%    \end{macrocode}
% \end{macro}^^A \Distribution
% \begin{macro}{\Path}
% \changes{v2.02}{2014/07/22}{\cs{DeclareRobustCommand} ersetzt durch
%   \cs{newrobustcmd} aus \pkg{etoolbox}}%^^A
% Die Auszeichnung eines Dateipfades.
%    \begin{macrocode}
\newrobustcmd*\Path[1]{\mbox{\texttt{#1}}}
%    \end{macrocode}
% \end{macro}^^A \Path
% \begin{macro}{\File}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% Die Auszeichnung und der Indexeintrag einer Datei.
%    \begin{macrocode}
%<*class>
\NewDocumentCommand\File{smd||}{%
  \ifdin{#2}{%
    \mbox{\textsbn{#2}}%
    \CheckIndexFormat{#1}{#3}%
    \IfBooleanF{#1}{%
      \index[files]{\textsbn{#2}~{\idxfont(Datei)}\IfValueT{#3}{|#3}}%
    }%
  }%
}
%</class>
%<*package>
\newcommand*\File[1]{\ifdin{#1}{\mbox{\textsbn{#1}}}}
%</package>
%    \end{macrocode}
% \end{macro}^^A \File
% \begin{macro}{\Class}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@Class}
% \begin{macro}{\@TempClass}
% \changes{v2.02}{2014/10/08}{entfernt}%^^A
% \begin{macro}{\DeclareClass}
% \changes{v2.02}{2014/10/09}{entfernt}%^^A
% Die Auszeichnung und der Indexeintrag einer Klasse. Sollte gerade DIN~Bold 
% verwendet werden~-- der Befehl wird innerhalb einer Überschrift genutzt~-- 
% wird lediglich das Hauptargument ausgegeben. Das optionale Argument zwischen 
% Apostrophen kann für die Formatierung eines Querverweises im Text genutzt 
% werden, das optionale Argument zwischen senkrechten Strichen dient der 
% Formatierung des Indexeintrages. Außerdem wird für Einträge mit dem Paket
% \pkg{hyperref} mit \cs{@Class} eine expandierbare Version definiert.
%    \begin{macrocode}
%<*class>
\NewDocumentCommand\Class{smd''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{files}{\protect\sbnfont}{#2}{Klasse}%
  \else%
    \ifdin{#2}{%
      \SetIndexFormat{#1}{#4}%
      \@ProcessOutput{\textsbn{#2}}'#3'%
        {files}[\protect\sbnfont]{#2}[~{\idxfont(Klasse)}]%
    }%
  \fi%
}
%</class>
%<*package>
\NewDocumentCommand\Class{sm}{%
  \ifdin{#2}{%
    \IfBooleanTF{#1}{%
      \manualhyperref{files:#2}{\textsbn{#2}}%
    }{%
      \textsbn{#2}%
    }%
    \index[files]{\begingroup\protect\sbnfont#2\endgroup~{\idxfont(Klasse)}}%
  }%
}
%</package>
\DeclareExpandableDocumentCommand\@Class{sm}{#2}
\pdfexpandableoutline{Class}
%    \end{macrocode}
% \end{macro}^^A \DeclareClass
% \end{macro}^^A \@TempClass
% \end{macro}^^A \@Class
% \end{macro}^^A \Class
% \begin{macro}{\Package}
% \changes{v2.02}{2014/07/10}{Ausgabe für ChangeLog hinzugefügt}%^^A
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@Package}
% \begin{macro}{\@TempPackage}
% \begin{macro}{\DeclarePackage}
% \changes{v2.02}{2014/10/09}{entfernt}%^^A
% Für die Auszeichnungen von Paketen gelten vorherigen Aussagen äquivalent. 
% Für Pakete wird ergänzend ein Hyperlink auf CTAN erzeugt, wenn für dieses 
% kein Label im Dokument besteht, wo dieses genauer erläutert wird. Mit dem 
% optionalen Argument in runden Klammern lässt sich der Paketname für den Link, 
% welcher normalerweise aus obligatorischen Argument entnommen wird, anpassen.
% Zusätzlich wird ein Befehl für Tutorials erstellt, welcher auf das Handbuch 
% verweist.
%    \begin{macrocode}
%<*class>
\newcommand*\@TempPackage{}
\NewDocumentCommand\Package{smd''d()d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{files}{\protect\sbnfont}{#2}{Paket}%
  \else%
    \ifdin{#2}{%
      \IfValueTF{#4}{\def\@TempPackage{#4}}{\def\@TempPackage{#2}}%
      \SetIndexFormat{#1}{#5}%
      \@ProcessOutput{\textsbn{#2}}'#3'(\@TempPackage)%
        {files}[\protect\sbnfont]{#2}[~{\idxfont(Paket)}]%
    }%
  \fi%
}
%</class>
%<*package>
\NewDocumentCommand\Package{smd()}{%
  \ifdin{#2}{%
    \IfBooleanTF{#1}{%
      \manualhyperref{files:#2}{\textsbn{#2}}%
    }{%
      \IfValueTF{#3}{%
        \href{http://www.ctan.org/pkg/#3}{\textsbn{#2}}%
      }{%
        \href{http://www.ctan.org/pkg/#2}{\textsbn{#2}}%
      }%
    }%
    \index[files]{\begingroup\protect\sbnfont#2\endgroup~{\idxfont(Paket)}}%
  }%
}
%</package>
\DeclareExpandableDocumentCommand\@Package{sm}{#2}
\pdfexpandableoutline{Package}
%    \end{macrocode}
% \end{macro}^^A \DeclarePackage
% \end{macro}^^A \@TempPackage
% \end{macro}^^A \@Package
% \end{macro}^^A \Package
% \begin{macro}{\Option}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@Option}
% \changes{v2.02}{2014/11/02}{neu}%^^A
% \begin{macro}{\@TempOption}
% Im Gegensatz zu den vorherigen Befehlen gibt es ein ordinäres optionales 
% Argument nach dem Hauptargument. Damit kann der Option im Handbuch ein Wert
% zugewiesen werden. Für Tutorials wird ein Befehl definiert, der auf das
% Handbuch verweist.
%    \begin{macrocode}
%<*class>
\newcommand*\@TempOption{}
\NewDocumentCommand\Option{smod''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{options}{\ttfamily}{#2}{Option}%
  \else%
    \IfValueTF{#3}{\gdef\@TempOption{\texttt{=#3}}}{\gdef\@TempOption{}}%
    \SetIndexFormat{#1}{#5}%
    \@ProcessOutput{\texttt{#2}}[\@TempOption]'#4'{options}[\ttfamily]{#2}%
  \fi%
}
%</class>
%<*package>
\NewDocumentCommand\Option{smo}{%
  \ifdin{#2}{%
    \IfBooleanTF{#1}{%
      \manualhyperref{options:#2}{\texttt{#2}}\IfValueT{#3}{\texttt{=#3}}%
    }{%
      \texttt{#2}\IfValueT{#3}{\texttt{=#3}}%
    }%
    \index[options]{\begingroup\ttfamily#2\endgroup}%
  }%
}
%</package>
\DeclareExpandableDocumentCommand\@Option{sm}{#2}
\pdfexpandableoutline{Option}
%    \end{macrocode}
% \end{macro}^^A \@TempOption
% \end{macro}^^A \@Option
% \end{macro}^^A \Option
% \begin{macro}{\Environment}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@Environment}
% \changes{v2.02}{2014/11/02}{neu}%^^A
% \begin{macro}{\@TempEnvironment}
% Auch hier wird für die Änderungsliste unterschieden und für Tutorials ein 
% Befehl definiert, welcher auf das Handbuch referenziert.
%    \begin{macrocode}
%<*class>
\newcommand*\@TempEnvironment{}
\NewDocumentCommand\Environment{smod''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{macros}{\ttfamily}{#2}{Umgebung}%
  \else%
%    \end{macrocode}
% Außerdem wird für den Fall, dass der \cs{Environment}-Befehl innerhalb der
% Umgebung \env{Declaration} verwendet wird, eine spezielle Ausgabe erzeugt. Nur
% hier kommt das optionale Argument nach dem Hauptargument zum Tragen. Damit
% können etwaige obligatorische und optionale Argumente angegeben werden.
%    \begin{macrocode}
    \if@declare%
      \gdef\@TempEnvironment{%
        \texttt{\bsc{}begin\{#2\}\IfValueT{#3}{#3}}\tabularnewline%
        \texttt{\dots}\tabularnewline%
        \texttt{\bsc{}end\{#2\}}%
      }%
    \else%
      \gdef\@TempEnvironment{\texttt{#2}}%
    \fi%
    \SetIndexFormat{#1}{#5}%
    \@ProcessOutput{\@TempEnvironment}'#4'{macros}[\ttfamily]{#2}%
  \fi%
}
%</class>
%<*package>
\NewDocumentCommand\Environment{sm}{%
  \ifdin{#2}{%
    \IfBooleanTF{#1}{%
      \manualhyperref{macros:#2}{\texttt{#2}}%
    }{%
      \texttt{#2}%
    }%
    \index[macros]{\begingroup\ttfamily#2\endgroup}%
  }%
}
%</package>
\DeclareExpandableDocumentCommand\@Environment{sm}{#2}
\pdfexpandableoutline{Environment}%
%    \end{macrocode}
% \end{macro}^^A \@TempEnvironment
% \end{macro}^^A \@Environment
% \end{macro}^^A \Environment
% \begin{macro}{\Macro}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@Macro}
% \changes{v2.02}{2014/11/02}{neu}%^^A
% Die Auszeichnung und der Indexeintrag eines Befehls sowie für das Paket 
% \pkg{tudscrman} der Hyperlink auf das Handbuch.
%    \begin{macrocode}
%<*class>
\NewDocumentCommand\Macro{smd''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{macros}{\ttfamily\bsc}{#2}{Befehl}%
  \else%
    \SetIndexFormat{#1}{#4}%
    \@ProcessOutput{\texttt{\bsc#2}}'#3'{macros}[\ttfamily\bsc]{#2}%
  \fi%
}
%</class>
%<*package>
\NewDocumentCommand\Macro{sm}{%
  \ifdin{\bsc#2}{%
    \IfBooleanTF{#1}{%
      \manualhyperref{macros:#2}{\texttt{\bsc#2}}%
    }{%
      \texttt{\bsc#2}%
    }%
    \index[macros]{\begingroup\ttfamily\bsc#2\endgroup}%
  }%
}
%</package>
\DeclareExpandableDocumentCommand\@Macro{sm}{#2}
%    \end{macrocode}
% \end{macro}^^A \@Macro
% \end{macro}^^A \Macro
% \begin{macro}{\Length}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@TempLength}
% \changes{v2.02}{2014/10/08}{entfernt}%^^A
% Die Auszeichnung und der Indexeintrag einer \LaTeX-Länge.
%    \begin{macrocode}
%<*class>
\NewDocumentCommand\Length{smd''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{macros}{\ttfamily\bsc}{#2}{L\"ange}%
  \else%
    \SetIndexFormat{#1}{#4}%
    \@ProcessOutput{\texttt{\bsc#2}}[\if@declare~{\idxfont(L\"ange)}\fi]'#3'%
      {macros}[\ttfamily\bsc]{#2}[~{\idxfont(L\"ange)}]%
  \fi%
}
%</class>
%<*package>
\NewDocumentCommand\Length{sm}{%
  \ifdin{\bsc#2}{%
    \IfBooleanTF{#1}{%
      \manualhyperref{macros:#2}{\texttt{\bsc#2}}%
    }{%
      \texttt{\bsc#2}%
    }%
    \index[macros]{\begingroup\ttfamily\bsc#2\endgroup~{\idxfont(L\"ange)}}%
  }%
}
%</package>
%    \end{macrocode}
% \end{macro}^^A \@TempLength
% \end{macro}^^A \Length
%
% \iffalse
%<*class>
% \fi
%
% \minisec{Exklusive Auszeichnungen für die Klasse}
% Alle weiteren Befehle werden ausschließlich für die Klasse \cls{tudscrman}
% definiert.
%
% \begin{macro}{\Key}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@TempKey}
% Die Auszeichnung und der Indexeintrag eines Parameters für Umgebungen und 
% Befehle. Das erste Argument ist die Umgebung oder der Befehl, wofür der 
% Parameter gültig ist. Das zweite Argument ist der Parameter selbst. Dafür 
% werden die Befehle \cs{Environment} und \cs{Macro} lokal umdefiniert. Das 
% ordinäre obligatorische Argument danach dient der Zuweisung eines Wertes im
% Fließtext.
%    \begin{macrocode}
\newcommand*\@TempKey{}
\NewDocumentCommand\Key{smmod''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{macros}(#2){\ttfamily}{#3}{Parameter}%
  \else%
    \begingroup%
      \let\Environment\@firstofone%
      \let\Macro\@firstofone%
      \IfValueTF{#4}{%
        \gdef\@TempKey{\texttt{=#4}\if@declare~{\idxfont(Parameter)}\fi}%
      }{%
        \gdef\@TempKey{\if@declare~{\idxfont(Parameter)}\fi}%
      }%
      \SetIndexFormat{#1}{#6}%
      \@ProcessOutput{\texttt{#3}}[\@TempKey]'#5'{macros}(#2)[\ttfamily]{#3}%
    \endgroup%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \@TempKey
% \end{macro}^^A \Key
% \begin{macro}{\PageStyle}
% \changes{v2.02}{2014/07/25}{neu}%^^A
% Die Auszeichnung und der Indexeintrag eines Seitenstils.
%    \begin{macrocode}
\NewDocumentCommand\PageStyle{smd''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{macros}{\ttfamily}{#2}{Seitenstil}%
  \else%
    \SetIndexFormat{#1}{#4}%
    \@ProcessOutput{\texttt{#2}\if@declare~{\idxfont(Seitenstil)}\fi}'#3'%
      {macros}[\ttfamily]{#2}[~{\idxfont(Seitenstil)}]%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \PageStyle
% \begin{macro}{\Counter}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@TempCounter}
% \changes{v2.02}{2014/10/08}{entfernt}%^^A
% Die Auszeichnung und der Indexeintrag einer \LaTeX-Zählers.
%    \begin{macrocode}
\NewDocumentCommand\Counter{smd''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{macros}{\ttfamily}{#2}{Z\"ahler}%
  \else%
    \SetIndexFormat{#1}{#4}%
    \@ProcessOutput{\texttt{#2}}[\if@declare~{\idxfont(Z\"ahler)}\fi]%
      {macros}[\ttfamily]{#2}[~{\idxfont(Z\"ahler)}]%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \@TempCounter
% \end{macro}^^A \Counter
% \begin{macro}{\Term}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@TempTerm}
% \changes{v2.02}{2014/10/08}{entfernt}%^^A
% Die Auszeichnung und der Indexeintrag eines sprachabhängigen Bezeichners.
%    \begin{macrocode}
\NewDocumentCommand\Term{smd''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{terms}{\ttfamily\bsc}{#2}{Bezeichner}%
  \else%
    \SetIndexFormat{#1}{#4}%
    \@ProcessOutput{\texttt{\bsc#2}}[\if@declare~{\idxfont(Bezeichner)}\fi]'#3'%
      {terms}[\ttfamily\bsc]{#2}%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \@TempTerm
% \end{macro}^^A \Term
% \begin{macro}{\TermTable}
% \begin{macro}{\@TermTable}
% \begin{macro}{\@@TermTable}
% \begin{macro}{\@termlist}
% Für sprachabhängige Bezeichner wird zusätzlich der Befehl \cs{TermTable} 
% definiert, dem eine kommaseparierte Liste übergeben werden kann. Anhand 
% dieser Liste werden die enthalten Begriffe für die Sprachen Deutsch und
% English in einer Tabelle ausgegeben. Die Sternversion dieses Befehls nutzt
% dafür die \env{tabularx}-Umgebung. Für diese kann ein zweites Argument
% angegeben werden, welches die gewünschte Breite der Tabelle angibt.
%    \begin{macrocode}
\newcommand\@termlist{}
\let\@termlist\relax
\NewDocumentCommand\TermTable{smg}{%
  \forcsvlist{\listadd\@termlist}{#2}%
  \ifvmode\else\par\fi%
  \vskip\baselineskipglue%
  \@afterindentfalse\@afterheading%
  \IfBooleanTF{#1}{%
    \IfValueTF{#3}{\setlength\@tempdima{#3}}{\setlength\@tempdima{\linewidth}}%
    \setlength{\@tempdimc}{-.7\baselineskip}%
    \begin{tabularx}{\@tempdima}{lXX}\@TermTable\end{tabularx}%
  }{%
    \setlength{\@tempdimc}{\z@}%
    \begin{tabular}{lll}\@TermTable\end{tabular}%
  }%
  \let\@termlist\relax%
}
\newcommand*\@TermTable{%
  \toprule%
  \textbf{Bezeichner} & \textbf{Deutsch} & \textbf{Englisch}\tabularnewline%
  \midrule%
  \forlistloop\@@TermTable{\@termlist}%
  \bottomrule%
}
\newcommand*\@@TermTable[1]{%
  \Term{#1} & %
  \ifstr{\@nameuse{#1}}{}{\PName{leer}}{\@nameuse{#1}} & %
  \selectlanguage{english}\vspace*{\@tempdimc}%
  \ifstr{\@nameuse{#1}}{}{\PName{empty}}{\@nameuse{#1}}\tabularnewline%
}
%    \end{macrocode}
% \end{macro}^^A \@termlist
% \end{macro}^^A \@@TermTable
% \end{macro}^^A \@TermTable
% \end{macro}^^A \TermTable
% \begin{macro}{\Font}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@TempFont}
% \changes{v2.02}{2014/10/08}{entfernt}%^^A
% Die Auszeichnung und der Indexeintrag eines Schriftelementes.
%    \begin{macrocode}
\NewDocumentCommand\Font{smd''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{fonts}{\ttfamily}{#2}{Schriftelement}%
  \else%
    \SetIndexFormat{#1}{#4}%
    \@ProcessOutput{\texttt{#2}\if@declare~{\idxfont(Schriftelement)}\fi}%
      {fonts}[\ttfamily]{#2}%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \@TempFont
% \end{macro}^^A \Font
% \begin{macro}{\Color}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% \begin{macro}{\@TempColor}
% \changes{v2.02}{2014/10/08}{entfernt}%^^A
% Die Auszeichnung und der Indexeintrag einer Farbe des \CDs.
%    \begin{macrocode}
\NewDocumentCommand\Color{smod''d||}{%
  \if@changelog%
    \@ProcessChangedAt{#1}{colors}{\ttfamily}{#2}{Farbe}%
  \else%
    \SetIndexFormat{#1}{#5}%
    \@ProcessOutput{\texttt{#2}}[%
      \IfValueT{#3}{~\texttt{(#3)}}\if@declare~{\idxfont(Farbe)}\fi%
    ]'#4'{colors}[\ttfamily]{#2}%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \@TempColor
% \end{macro}^^A \Color
% Damit ist das Intermezzo mit Auszeichnungsbefehlen speziell für die Klasse 
% beendet.
%
% \iffalse
%</class>
% \fi
%
% \iffalse
%<*class>
% \fi
%
% \subsection{Befehle und Umgebungen für die Klasse}
%
% Hier taucht alles auf, was lediglich für die Klasse \cls{tudscrman} und nicht 
% für das Paket benötigt wird.
%
% \begin{macro}{\CheckIndexFormat}
% \changes{v2.02}{2014/10/08}{neu}%^^A
% \begin{macro}{\SetIndexFormat}
% \changes{v2.02}{2014/10/08}{neu}%^^A
% \begin{macro}{\@IndexFormat}
% \changes{v2.02}{2014/10/08}{neu}%^^A
% Zuerst werden jedoch einige Hilfsmakros erstellt mit denen überprüft wird, ob
% die Sternversion der zuvor definierten Auszeichnung"=Befehle zusammen mit
% einer Indexformatierung \val{|idxformat|} genutzt wurde, was sich natürlich
% widerspricht. In diesem Fall erfolgt eine Warnung.
%    \begin{macrocode}
\newcommand*\@IndexFormat{}
\let\@IndexFormat\relax
\newcommand*\CheckIndexFormat[2]{%
  \IfBooleanT{#1}{%
    \IfValueT{#2}{%
      \ClassWarning{\tudcls@name}{%
        You've used the starred version so no entry for\MessageBreak%
        the index is created and the optional argument\MessageBreak%
        |#2| will be ignored%
      }%
    }%
  }%
}
%    \end{macrocode}
% Der Befehl \cs{SetIndexFormat} setzt das gewünschte Format für den jeweilgen
% Indexeintrag.
%    \begin{macrocode}
\newcommand*\SetIndexFormat[2]{%
  \CheckIndexFormat{#1}{#2}%
  \IfBooleanTF{#1}{%
    \def\@IndexFormat{#1}%
  }{%
    \IfValueTF{#2}{\def\@IndexFormat{#2}}{\def\@IndexFormat{}}%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \@IndexFormat
% \end{macro}^^A \SetIndexFormat
% \end{macro}^^A \CheckIndexFormat
% \begin{macro}{\if@declare}
% \begin{macro}{\if@stareddeclare}
% \changes{v2.02}{2014/10/09}{neu}%^^A
% \begin{macro}{\if@openindex}
% \begin{macro}{\if@noindex}
% Dies sin ein paar Hilfsmakros zur Steuerung des Markup sowie der Ausgabe von
% Deklarationen, Index und Änderungsliste, welche bei den nächsten Befehlen und 
% Umgebungen genutzt werden.
%    \begin{macrocode}
\newif\if@declare
\newif\if@stareddeclare
\newif\if@openindex
\newif\if@noindex
%    \end{macrocode}
% \end{macro}^^A \if@noindex
% \end{macro}^^A \if@openindex
% \end{macro}^^A \if@stareddeclare
% \end{macro}^^A \if@declare
%
% \subsubsection{Abarbeitung der Markup-Befehle}
%
% In der Klasse \cls{tudscrman} werden die Markup-Befehle entweder im Fließtext 
% verwendet und dabei automatisch Einträge in den Index erzeugt oder aber diese 
% werden als Argument der Umgebung \env{Declaration} genutzt.
%
% \begin{macro}{\@ProcessOutput}
% \changes{v2.02}{2014/10/08}{Markup für Index und Fließtext getrennt}%^^A
% \changes{v2.02}{2014/10/09}{Anpassung für Umgebung \env{Declaration*}}%^^A
% Der Befehl \cs{@ProcessOutput} ist das Herzstück der Auszeichnungen aller
% Elemente. Das erste obligatorische Argument ist der übergebene Wert, welcher 
% in einer bestimmten Form ausgezeichnet werden soll. Darauf folgen die ein 
% möglicher \oarg{Anhang} sowie ggf. das \val{'}\meta{Kürzel}\val{'} für die
% Erweiterung der Referenzierunug im Fließtext. Danach wird der Zielindex 
% \marg{Index} und~-- für Parameter~-- der \parg{Haupteintrag} übergeben. Es 
% folgt der zu erstellende Indexeintrag mit \oarg{Vorsatz}, \marg{Eintrag} und
% \oarg{Anhang}. Die Formatierung für den Indexbefehl wurde zuvor durch
% \cs{SetIndexFormat} in \cs{@IndexFormat} gespeichert. Der vollständige 
% Funktionsaufruf lautet:
% \newline\begingroup\scriptsize
% \cs{@ProcessOutput}*
% \marg{Ausgabe}\oarg{Anhang}\val{'}\meta{Kürzel}\val{'}\ignorespaces%
% \marg{Index}\parg{Haupteintrag}\oarg{Vorsatz}\marg{Eintrag}\oarg{Anhang}
% \endgroup
%    \begin{macrocode}
\NewDocumentCommand\@ProcessOutput{mod''d()md()omo}{%
%    \end{macrocode}
% Mit dem Schalter \cs{if@declare} wird unterschieden, ob ein beliebiger
% Auszeichnungsbefehl innerhalb der Umgebung~\env{Declaration} verwendet wird.
% Ist dies der Fall wird ein Label und mit \cs{@HyperIndex} ein spezieller
% Indexeintrag für die Deklaration erstellt. Eine Ausgabe der Auszeichnung
% erfolgt in diesem Fall nicht, dafür ist der Befehl \cs{printdeclarationlist} 
% verantwortlich. Außerdem wird mit Hilfe der \env{Declaration}-Umgebung der
% Anfang und das Ende der Deklaration für den Indexeintrag mit \cs{@HyperIndex}
% exakt festgelegt. Der Schalter \cs{if@openindex} wird zu Beginn der Umgebung
% auf \cs{@openindextrue} gesetzt, am Ende dieser auf \cs{@openindexfalse}.
%    \begin{macrocode}
  \if@declare%
    \if@openindex%
      \IfValueT{#3}{%
        \ClassWarning{\tudcls@name}{%
          It is not possible to use any cross-reference\MessageBreak%
          shorthand like '#3' within the arguments of\MessageBreak% 
          the environment `Declaration'%
        }%
      }%
      \ifx\@IndexFormat\@empty\else%
        \ClassWarning{\tudcls@name}{%
            It is not possible to use any indexing format\MessageBreak%
            like |\@IndexFormat| within the arguments of the\MessageBreak%
            environment `Declaration'%
        }%
      \fi%
      \if@noindex\else%
        \IfValueTF{#6}{\edef\@tempa{#5:#6:#8}}{\edef\@tempa{#5:#8}}%
%    \end{macrocode}
% Wird zur Deklaration die Umgebung \env{Declaration*} genutzt, so wird der 
% Hyperlink ein ganzes Stück nach oben verschoben. Hintergrund ist, dass diese 
% Umgebung eigentlich nur zum Deklarieren von Klassen und Paketen gedacht ist 
% und direkt nach einer Gliederungsüberschrift folgen sollte.
%    \begin{macrocode}
        \if@stareddeclare%
          \manualhyperdef'{\@tempa}%
        \else%
%    \end{macrocode}
% Andernfalls wird der normale Hyperlink gesetzt. Das Label zum Prüfen wird 
% implizit durch \cs{manualhyperdef} gesetzt.
%    \begin{macrocode}
          \manualhyperdef{\@tempa}%
        \fi%
        \@HyperIndex{#5}{#6}{#7}{#8}{#9}{(declare}%
      \fi%
%    \end{macrocode}
% Die \env{Declaration*}"=Umgebung erzeugt keine direkte Ausgabe sondern nur 
% die Hyperlinks und Indexeinträge. Die Nennung der Klasse bzw. des Paketes
% oder der Pakete sollte in der Überschrift davor erfolgen.
%    \begin{macrocode}
      \if@stareddeclare\else%
        #1\IfValueT{#2}{#2}%
      \fi%
    \else%
      \if@noindex\else%
        \@HyperIndex{#5}{#6}{#7}{#8}{#9}{declare)}%
      \fi%
    \fi%
  \else%
%    \end{macrocode}
% Findet der Auszeichnungsbefehl außerhalb der \env{Declaration}-Umgebung im
% Fließtext Verwendung, wird für den Fall, dass keine Sternversion genutzt
% wurde, mit \cs{@HyperIndex} ein Eintrag im dazugehörigen Index erzeugt.
%    \begin{macrocode}
    \ifx\@IndexFormat\relax%
      \ClassError{\tudcls@name}{\string\SetIndexFormat\space unused}{%
        It seems you have forgotten to use \string\SetIndexFormat%
      }%
    \else%
      \expandafter\IfBooleanF\expandafter{\@IndexFormat}{%
        \@HyperIndex{#5}{#6}{#7}{#8}{#9}{\@IndexFormat}%
      }%
    \fi%
%    \end{macrocode}
% Danach erfolgt die Ausgabe der Auszeichnung. Sollte für diesen ein Label 
% durch eine Deklaration innerhalb der \env{Declaration}-Umgebung definiert 
% worden sein, so wird auf dieses ein Hyperlink gesetzt. Ansonsten erfolgt die 
% normale textuelle Ausgabe. Für Parameter muss der Hyperlink dabei aufgrund 
% des definierten Haupteintrag etwas anders ausgeführt werden (\cs{@tempa}). 
%    \begin{macrocode}
    \IfValueTF{#6}{\edef\@tempa{#5:#6:#8}}{\edef\@tempa{#5:#8}}%
    \ifcsdef{r@\@tempa}{%
%    \end{macrocode}
% Wurde ein Format für den Querverweis gesetzt, muss dieses validiert werden. 
% Gültige Kürzel sind 'auto', 'page' und 'full'. Damit werden die erzeugten 
% Querverweise um den Gliederungsabschnitt, die Seite oder beides ergänzt. 
% Außerdem kann mit 'none' der Hyperlink selbst unterbunden werden.
%    \begin{macrocode}
      \let\@tempb\relax%
      \def\@tempc{\mbox{\hyperref{}{\jobname}{\@tempa}{#1}\IfValueT{#2}{#2}}}%
      \IfValueT{#3}{%
        \def\@tempb{%
          \ClassWarning{\tudcls@name}{%
            You've used the unknown cross-reference\MessageBreak%
            shorthand '#3'. Only 'auto', 'page'\MessageBreak%
            and 'full' as well as 'none' are valid%
          }%
        }%
        \ifstr{#3}{auto}{\def\@tempb{ in \autoref{\@tempa}}}{}%
        \ifstr{#3}{page}{\def\@tempb{ \vpageref{\@tempa}}}{}%
        \ifstr{#3}{full}{\def\@tempb{ in \fullref{\@tempa}}}{}%
        \ifstr{#3}{none}{%
          \let\@tempb\relax%
          \def\@tempc{\mbox{#1\IfValueT{#2}{#2}}}%
        }{}%
      }%
      \@tempc\@tempb%
    }{%
%    \end{macrocode}
% Wurde ein Format für den Querverweis gesetzt und es existiert kein passendes
% Label, wird eine Warnung ausgegeben.
%    \begin{macrocode}
      \IfValueT{#3}{%
        \ClassWarning{\tudcls@name}{%
          No cross-reference created, label \@tempa\space is missing%
        }%
      }%
%    \end{macrocode}
% Sollte ein Paket mit \cs{Package} angegeben worden sein, so wurde das erste
% optionale Argument in runden Klammern verwendet. Dieses wird genutzt, um 
% einen Hyperlink auf CTAN zu generieren. Die Ausgabe selbst besteht in jedem 
% Fall aus dem ersten obligatorischen und ggf. dem ersten optionalen Argument.
%    \begin{macrocode}
      \IfValueTF{#4}{%
        \href{http://www.ctan.org/pkg/#4}{\mbox{#1\IfValueT{#2}{#2}}}%
      }{%
        \mbox{#1\IfValueT{#2}{#2}}%
      }%
    }%
  \fi%
%    \end{macrocode}
% Zum Schluss wird \cs{@IndexFormat} zurückgesetzt.
%    \begin{macrocode}
  \let\@IndexFormat\relax%
}
%    \end{macrocode}
% \end{macro}^^A \@ProcessOutput
% \begin{macro}{\hyperidx}
% \changes{v2.02}{2014/08/16}{neu}%^^A
% Aufgrund der Nichtbeachtung von RegExp"=Ausdrücken durch den Indexprozessor
% \texttt{texindy} (\url{http://sourceforge.net/p/xindy/bugs/22/}) muss hierfür
% etwas getrickst werden. Der Befehl \cs{hyperidx} hat ein optionales Argument, 
% in welchem das für \cs{manualhyperref} obligatorische Label enthalten ist.
% Das führt dazu, dass \texttt{texindy} dieses beim internen Filtern in eckigen 
% Klammern beibehält und es anschließend über eine in \texttt{tudscrman.xdy} 
% eigens definierte \texttt{merge-rule} verworfen werden kann.
%    \begin{macrocode}
\newrobustcmd*\hyperidx[2][]{\manualhyperref{#1}{#2}}
%    \end{macrocode}
% \end{macro}^^A hyperidx
% \begin{macro}{\@HyperIndex}
% \changes{v2.02}{2014/10/08}{überarbeitet}%^^A
% Dieser Befehl sorgt für die eigentlichen Indexeinträge. Dabei werden für 
% Einträge, welche innerhalb der \env{Declaration}-Umgebung deklariert wurden, 
% ein Hyperlink im Index erstellt. Das erste Argument \marg{Index} enthält den 
% gewünschten Zielindex. Danach folgt~-- für Parameter~-- der Haupteintrag. 
% Daran schließt der Indexeintrag selbst mit \marg{Vorsatz}, \marg{Eintrag},
% \marg{Anhang} und zum Abschluss \oarg{Formatierung} an. Der vollständige 
% Funktionsaufruf lautet:
% \newline\begingroup\scriptsize
% \cs{@HyperIndex}\marg{Index}\marg{Haupteintrag}\ignorespaces%
% \marg{Vorsatz}\marg{Eintrag}\marg{Anhang}\marg{Formatierung}
% \endgroup
%    \begin{macrocode}
\NewDocumentCommand\@HyperIndex{mmmmmm}{%
  \IfValueTF{#3}{\def\@tempa{#3}}{\def\@tempa{}}%
  \IfValueTF{#5}{\def\@tempb{#5}}{\def\@tempb{}}%
  \IfValueTF{#6}{\edef\@tempc{|#6}}{\def\@tempc{}}%
%    \end{macrocode}
% Auch hier wird unterschieden, ob es sich um einen Parameter (keys) handelt. 
% Wurde für einen Parameter eine Umgebung oder ein Befehl bereits definiert, 
% werden zwei Indexeinträge generiert. Einer beim Befehl selber als 
% Untereintrag für den jeweiligen Parameter und einer im Index für Parameter
% selbst mit der dazugehörigen Umgebung bzw. dem dazugehörigen Befehl. Beide
% erhalten einen entsprechenden Hyperlink zur Deklaration.
%    \begin{macrocode}
  \IfValueTF{#2}{%
    \ifcsdef{r@#1:#2:#4}{%
      \edef\@tempb{#1:#2:#4}%
      \index[#1]{%
        #2!\hyperidx[\@tempb]{\begingroup\expandonce\@tempa#4\endgroup}%
        ~{\idxfont(Parameter)}\expandonce\@tempc%
      }%
      \begingroup%
        \let\Environment\@firstofone%
        \def\Macro##1{\bsc##1}%
        \index[keys]{%
          \hyperidx[\@tempb]{%
            \begingroup\expandonce\@tempa#4\endgroup~{\idxfont(\texttt{#2})}%
          }%
          \expandonce\@tempc%
        }%
      \endgroup%
    }{%
      \index[#1]{%
        #2!\begingroup\expandonce\@tempa#4\endgroup%
        ~{\idxfont(Parameter)}\expandonce\@tempc%
      }%
      \index[keys]{%
        \begingroup\expandonce\@tempa#4\endgroup~{\idxfont(\texttt{#2})}%
        \expandonce\@tempc%
      }%
    }%
%    \end{macrocode}
% Falls es sich nicht um einen Parameter handelt, wird lediglich der Eintrag im 
% speziellen Index vorgenommen und ggf. ein Hyperlink erzeugt.
%    \begin{macrocode}
  }{%
    \ifcsdef{r@#1:#4}{%
      \index[#1]{%
        \hyperidx[#1:#4]{%
          \begingroup\expandonce\@tempa#4\endgroup\expandonce\@tempb%
        }%
        \expandonce\@tempc%
      }%
    }{%
      \index[#1]{%
        \begingroup\expandonce\@tempa#4\endgroup%
        \expandonce\@tempb\expandonce\@tempc%
      }%
    }%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \@HyperIndex
%
% \subsubsection{Deklarationen}
%
% Die Umgebungen \env{Declaration} und \env{Declaration*} werden beide für die 
% Auszeichnung von Optionen, Umgebungen und Befehlen verwendet, die \TUDScript 
% dem Anwender zur Verfügung stellt.
%
% \begin{environment}{Declaration}
% \begin{macro}{\printdeclarationlist}
% \begin{macro}{\@declarationlist}
% \begin{macro}{\@presetlist}
% \begin{macro}{\if@presetlist}
% \begin{macro}{\@additionallist}
% \begin{macro}{\if@additionallist}
% \begin{macro}{\@gobbleparameters}
% \changes{v2.02}{2014/10/09}{neu}%^^A
% Es werden einige Hilfsmakros für die Ausgabe einer Deklaration sowie der 
% dazugehörigen Änderungsliste initialisiert.
%    \begin{macrocode}
\newcommand*\@declarationlist{}
\let\@declarationlist\relax
\newcommand*\@presetlist{}
\let\@presetlist\relax
\newif\if@presetlist
\newcommand*\@additionallist{}
\let\@additionallist\relax
\newif\if@additionallist
\newcommand*\@gobbleparameters{%
  \let\PName\@gobble%
  \let\PBoolean\relax%
  \let\PBName\@gobble%
  \let\PSet\relax%
  \let\PValue\@gobble%
  \let\Parameter\@gobble%
  \let\OParameter\@gobble%
  \let\LParameter\relax%
  \let\OLParameter\@gobble%
  \let\PParameter\@gobble%
  \let\POParameter\@gobble%
}
%    \end{macrocode}
% Die \env{Declaration}-Umgebung dient zur Deklaration von Optionen, Umgebungen,
% Befehlen, Parametern, Bezeichnern, Längen, Schriftelementen und Farben. Diese 
% werden mit den entsprechenden Auszeichnungsbefehlen als obligatorisches 
% Argument übergeben. Zuvor kann noch vorher im ersten optionalen Argument eine
% Beschreibung für die Änderungsliste in der Form \oarg{Verison!Beschreibung}
% angegeben werden. Danach kann im dritten Argument~-- das zweite optionale~-- 
% die Voreinstellung für eine Option oder dergleichen angegeben werden. Das
% nächste optionale Argument erlaubt die Angabe einer bedingten Voreinstellung, 
% also einer anderen Voreinstellung als der zuerst angegeben unter bestimmten
% Voraussetzungen. Diese wird in der Form \oarg{Bedingung:Voreinstellung}
% angegeben. Das letzte Argument ist ebenfalls optional, wird aber in der Form
% \marg{Zusatz} angegeben und enthält ggf. zusätzliche Informationen.
%
% Die Umgebung selbst gibt zu Beginn nichts weiter aus sondern sammelt 
% lediglich alle übergebenen Argumente in jeweiligen Listen. Die eigentliche
% Ausgabe erfolgt mit dem Befehl \cs{printdeclarationlist}.
%    \begin{macrocode}
\NewDocumentEnvironment{Declaration}{omoog}{%
  \listadd\@declarationlist{#2}%
%    \end{macrocode}
% Die optional angegebenen Änderungen werden später mit \cs{ChangedAt@Process} 
% verarbeitet und für die Änderungsliste sowie die Randnotiz mit
% \cs{@changedatdeclare} in der Liste \cs{@changedatdeclarelist} gesichert.
%    \begin{macrocode}
  \@changedatdeclare{#1}{#2}% 
%    \end{macrocode}
% Hier noch die Listen für Voreinstellungen\dots
%    \begin{macrocode}
  \IfValueTF{#3}{%
    \@presetlisttrue%
    \IfValueTF{#4}{%
      \def\@tempa[##1:##2]{##1:\,##2}%
      \listeadd\@presetlist{preset:\,#3\,|\,\expandonce{\@tempa[#4]}}%
    }{%
      \listadd\@presetlist{preset:\,#3}%
    }%
  }{%
    \listadd\@presetlist{\relax}%
  }%
%    \end{macrocode}
% \dots sowie zusätliche Informationen.
%    \begin{macrocode}
  \IfValueTF{#5}{%
    \@additionallisttrue%
    \listadd\@additionallist{\hspace*{\tabcolsep}\small(#5)}%
    \in@{\Environment}{#2}%
    \ifin@ \listadd\@additionallist{\tabularnewline}\fi%
  }{%
    \listadd\@additionallist{\relax}%
  }%
}{%
%    \end{macrocode}
% Am Ende der Umgebung wird das übergebenen Hauptargument erneut ausgeführt,
% was zum Beenden der Indexeinträge für die jeweilige Deklaration führt
% (\cs{@openindexfalse}, siehe \cs{@ProcessOutput}). Dafür werden die Makros für
% die Angabe obligatorischer und optionaler Parameter lokal umdefiniert.
%    \begin{macrocode}
  \ifx\@declarationlist\relax\else%
    \ClassError{\tudcls@name}{\string\printdeclarationlist\space is missing}{%
      \string\@declarationlist\space is not empty. Did you forget\MessageBreak%
      to print this list with \string\printdeclarationlist?%
    }%
  \fi%
  \@gobbleparameters%
  \vskip-\lastskip%
  \@declaretrue\@openindexfalse#2\@declarefalse%
  \pagebreak[0]%
}
%    \end{macrocode}
% Mit dem Befehl \cs{printdeclarationlist} erfolgt die eingentliche Ausgabe 
% aller Deklarationen. Zweck ist es, mehrere \env{Declaration}-Umgebungen 
% ineinander verschachteln zu können und eine Ausgabe aller auf einmal zu 
% erzeugen. Die durch die ggf. nacheinander folgenden Deklarationen wurden in 
% entsprechenden Listen gesammelt und werden hier jetzt formatiert ausgegben.
%    \begin{macrocode}
\NewDocumentCommand\printdeclarationlist{sod()}{%
  \ifx\@declarationlist\relax\else%
    \ifvmode\else\par\fi%
    \addpenalty{\@beginparpenalty}%
    \addvspace{1.5\baselineskipglue}%
%    \end{macrocode}
% Die Sternversion erzeugt die Ausgabe ohne Deklarationsindexbefehle. Das 
% optionale Argument kann genutzt werden, um das standardmäßige Atrribut für 
% die Änderungsliste, welches in \cs{@changedatdeclaredefault} hinterlegt ist,
% zu ändern. Dies ist für die normale Version auf \emph{neu} und für die
% Sternversion auf \emph{entfällt} voreingestellt.
%    \begin{macrocode}
    \IfBooleanTF{#1}{%
      \global\@noindextrue%
      \renewcommand*\@changedatdeclaredefault{\emph{entf\"allt}}%
    }{%
      \global\@noindexfalse%
    }%
    \IfValueT{#2}{\renewcommand*\@changedatdeclaredefault{\emph{#2}}}%
    \@declaretrue\@openindextrue%
    \@afterindentfalse\@afterheading%
%    \end{macrocode}
% Die deklarierten Optionen, Umgebungen, Befehle etc. werden umrahmt. Dabe
% erfolgt die Ausgabe mithilfe einer Box, um die Größe des Deklarationsrahmens
% zu speichern und die Änderungsmarkierung am Seitenrand auf die richtige Höhe
% zu platzieren. Da innerhalb von Tabellen der Wert von \cs{baselineskip} auf
% \makeatletter\the\z@\makeatother~gesetzt wird, muss für einen richtig
% platzierten Link dieser in \cs{HyperRaiseLinkDefault} gesichert werden.
%    \begin{macrocode}
    \def\@tempa##1{\ignorespaces##1\tabularnewline}%
    \edef\HyperRaiseLinkDefault{\the\baselineskip}%
    \setbox0\hbox{%
      \begin{tabular}{|l|}%
        \hline%
        \forlistloop\@tempa{\@declarationlist}%
        \hline%
      \end{tabular}%
    }\usebox0%
    \@declarefalse%
%    \end{macrocode}
% Danach werden ggf. die Voreinstellungen und Zusatzinformationen gesetzt.
%    \begin{macrocode}
    \ifboolexpr{bool {@presetlist} or bool {@additionallist}}{%
      \if@presetlist%
        \qquad%
        \texttt{%
          \begin{tabular}{l}%
            \forlistloop\@tempa{\@presetlist}%
          \end{tabular}%
        }%
      \fi%
      \if@additionallist%
        \begin{tabular}{@{}l@{}}%
          \forlistloop\@tempa{\@additionallist}%
        \end{tabular}%
      \fi%
    }{}%
%    \end{macrocode}
% Alle für die Deklaration verwendeten Listen werden nach ihrer Abarbeitung 
% zurückgesetzt.
%    \begin{macrocode}
    \global\let\@declarationlist\relax%
    \global\let\@presetlist\relax%
    \global\@presetlistfalse%
    \global\let\@additionallist\relax%
    \global\@additionallistfalse%
%    \end{macrocode}
% Die Einträge in der Änderungsliste sowie die dazugehörige Randnotiz werden
% innerhalb der Deklaration mit \cs{printchangedatlist} erzeugt. Das optionale 
% Argument sorgt für die Verschiebung der Randnotiz auf die richtige Höhe, um 
% den Höhenversatz zwischen Randnotiz und Deklarationsrahmen auszugleichen.
%    \begin{macrocode}
    \printchangedatlist*[%
      \dimexpr.5\ht\strutbox+.5\dp\strutbox-.5\ht0-.5\dp0\relax%
    ]%
%    \end{macrocode}
% Zum Schluss wird das optionale Argument (in runden Klammern) neben der
% Deklarationsbox ausgegeben.
%    \begin{macrocode}
    \IfValueT{#3}{#3}%
    \par\nobreak%
    \vskip 1.5\baselineskipglue%
    \@afterindentfalse\@afterheading%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \@gobbleparameters
% \end{macro}^^A \if@additionallist
% \end{macro}^^A \@additionallist
% \end{macro}^^A \if@presetlist
% \end{macro}^^A \@presetlist
% \end{macro}^^A \@declarationlist
% \end{macro}^^A \printdeclarationlist
% \end{environment}^^A Declaration
% \begin{environment}{Declaration*}
% \changes{v2.02}{2014/10/09}{neu}%^^A
% Die Sternversion der Umgebung \env{Declaration*} ist für die vereinfachte 
% Deklaration von Klassen, Paketen etc. gedacht, bei denen keine Ausgabe 
% sondern lediglich Hyperlink, Indexeintrag und Änderungsnotiz erzeugt werden 
% sollen. Dabei sollte diese direkt nach einer Gliederungsüberschrift genutzt 
% werden, in welcher das zu deklarierende ELement (Klasse, Paket etc.) genannt 
% wird.
%    \begin{macrocode}
\NewDocumentEnvironment{Declaration*}{om}{%
  \@changedatdeclare{#1}{#2}%
  \@stareddeclaretrue%
  \global\@noindexfalse%
  \@declaretrue\@openindextrue#2\@declarefalse%
  \@stareddeclarefalse%
}{%
  \ifx\@changedatdeclarelist\relax\else%
    \ClassError{\tudcls@name}{\string\printchangedatlist\space is missing}{%
      \string\@changedatdeclarelist\space is not empty. Did you\MessageBreak%
      forget to print this list with \string\printchangedatlist?%
    }%
  \fi%
  \@gobbleparameters%
  \@declaretrue\@openindexfalse#2\@declarefalse%
}
%    \end{macrocode}
% \end{environment}^^A Declaration*
% \begin{environment}{tabularm}
% \begin{macro}{\allcolumnpar}
% \begin{macro}{\@allcolumnpar}
% \begin{macro}{\tabularm@box}
% \begin{macro}{\tabularm@num}
% \begin{length}{\tabularm@wd}
% Die Umgebung \env{tabularm} ist eine Erweiterung der \env{tabularm}-Umgebung.
% In dieser wird die Breite der zu setzenden Tabelle mit Hilfe der Box 
% \cs{tabularm@box} in \cs{tabularm@wd} gespeichert. Anschließend kann mit dem
% Befehl \cs{allcolumnpar} eine Zeile über alle Spalten der Tabelle 
% ausgegeben werden. Dabei ist das zu übergebende Argument die Anzahl der zu 
% erzeugenden, linksbündigen Spalten.
%    \begin{macrocode}
\newsavebox\tabularm@box
\newlength\tabularm@wd
\newcommand*\tabularm@num{1}
\NewEnviron{tabularm}[1]{%
  \begin{lrbox}{\tabularm@box}%
    \let\allcolumnpar\@gobble%
    \begin{tabular}{*{#1}l}\BODY\end{tabular}%
  \end{lrbox}%
  \setlength{\tabularm@wd}{\wd\tabularm@box}%
  \def\tabularm@num{#1}%
  \let\allcolumnpar\@allcolumnpar%
  \begin{tabular}{*{#1}l}\BODY\end{tabular}%
}
\newcommand*\@allcolumnpar[1]{%
  \multicolumn{\tabularm@num}{@{}p{\tabularm@wd}@{}}{#1}%
}
%    \end{macrocode}
% \end{length}^^A \tabularm@wd
% \end{macro}^^A \tabularm@box
% \end{macro}^^A \tabularm@num
% \end{macro}^^A \@allcolumnpar
% \end{macro}^^A \allcolumnpar
% \end{environment}^^A tabularm
% \begin{environment}{values}
% \begin{macro}{\before@values}
% \begin{macro}{\item@values}
% \begin{macro}{\itemtrue}
% \begin{macro}{\itemfalse}
% \begin{macro}{\tud@item@val}
% \begin{macro}{\tud@item@add}
% \begin{macro}{\tud@item@format}
% \begin{macro}{\tud@item}
% \begin{macro}{\tud@@item}
% \begin{macro}{\tud@@@item}
% Die Liste \env{values} dient zum Benennen der möglichen Werte für einen 
% bestimmten Schlüssel. Im Handbuch kommt diese Liste vorallem bei Optionen 
% aber auch bei bestimmten Befehls- und Optionsparametern zum Einsatz.
%    \begin{macrocode}
\newlist{values}{description}{1}
\setlist[values]{%
  topsep=.5\baselineskipglue,labelwidth=\columnwidth,labelsep=0pt,%
  font=\normalfont\ttfamily,before*=\before@values%
}
%    \end{macrocode}
% Zu Beginn der Umgebung wird die Definition des \cs{item}-Befehls gesichert 
% und anschließend geändert.
%    \begin{macrocode}
\newcommand*\before@values{%
  \let\item@values\item%
  \let\item\tud@item%
}
%    \end{macrocode}
% Die folgenden beiden Befehle enthalten die Standardwerte für boolsche 
% Schalter.
%    \begin{macrocode}
\newcommand*\itemfalse{\def\tud@item@val{false/off/no}\item}
\newcommand*\itemtrue{\def\tud@item@val{true/on/yes}\item}
%    \end{macrocode}
% Mit der neuen Definition kann der Säumniswert mit \cs{item*} explizit in der 
% Liste hervorgehoben werden.
%    \begin{macrocode}
\newcommand*\item@values{}
\newcommand*\tud@item@val{}
\newcommand*\tud@item@add{}
\newcommand*\tud@item@format{}
\newcommand*\tud@item{%
  \@ifstar{%
    \def\tud@item@add{(S\"aumniswert)}%
    \let\tud@item@format\emph%
    \tud@@item%
  }{%
    \let\tud@item@add\relax%
    \let\tud@item@format\relax%
    \tud@@item%
  }%
}
%    \end{macrocode}
% In der zweiten Instanz wird das optionale Argument von \cs{item} ausgewertet.
% Dabei wird das Hilfsmakro \cs{tud@item@val} beachtet, welches evtl. mit den 
% Befehlen \cs{itemtrue} oder \cs{itemfalse} gesetzt wurde und vor dem 
% optionalen Argument aufgeführt wird. 
%    \begin{macrocode}
\newcommand*\tud@@item[1][]{%
  \ifstrempty{#1}%
    {\edef\@tempa{\tud@item@val}}%
    {\ifstr{\tud@item@val}{}%
      {\edef\@tempa{#1}}%
      {\edef\@tempa{\tud@item@val/#1}}%
    }%
  \def\tud@item@val{}%
%    \end{macrocode}
% Wurde weder \cs{tud@item@val} gesetzt noch ein Wert im optionalen Argument 
% von \cs{item} angegeben, so wird der gesicherte Befehl ausgeführt. Ansonsten 
% folgt die dritte Instanz.
%    \begin{macrocode}
  \ifstr{\@tempa}{}{\item@values}{\tud@@@item}%
}
%    \end{macrocode}
% Der gesicherte Befehl wird mit den aufbereiteten Formatierungen genutzt.
%    \begin{macrocode}
\newcommand*\tud@@@item[1][]{%
  \ifstrempty{#1}{}{%
    \ifx\tud@item@add\relax%
      \def\tud@item@add{#1}%
    \else%
      \apptocmd{\tud@item@add}{~#1}{}{}%
    \fi%
  }%
  \item@values[%
    \tud@item@format{\@tempa:}%
    \ifx\tud@item@add\relax\else%
      {\normalfont\space\footnotesize\tud@item@add}%
    \fi%
  ]%
}
%    \end{macrocode}
% \end{macro}^^A \tud@@@item
% \end{macro}^^A \tud@@item
% \end{macro}^^A \tud@item
% \end{macro}^^A \tud@item@format
% \end{macro}^^A \tud@item@add
% \end{macro}^^A \tud@item@val
% \end{macro}^^A \itemfalse
% \end{macro}^^A \itemtrue
% \end{macro}^^A \item@values
% \end{macro}^^A \before@values
% \end{environment}^^A values
%
% \subsubsection{Erläuterungen und weiterführende Ergänzungen im Handbuch}
%
% Es folgen einige Umgebungen, mit welchen bestimmte Aspekte oder Pakete im
% Handbuch erläutert werden.
%
% \begin{environment}{Example}
% \begin{environment}{Example*}
% Diese Umgebung wird für die exemplarische Erläuterung von bestimmten Aspekten 
% im Handbuch verwendet. Wenn dafür ein Quelltextauszug nötig ist, kann 
% innerhalb dieser die \env{Code}-Umgebung genutzt werden. Die Sternversion 
% unterdrückt dabei das Zurücksetzen des eigentlich entfernten vertikalen 
% Abstandes.
%    \begin{macrocode}
\newenvironment{Example}{\@nameuse{Example*}}{%
  \@nameuse{endExample*}%
  \addvspace{-\topsep}%
}
\newenvironment{Example*}{%
  \labeling{{\usekomafont{disposition}Beispiel:\ }}%
  \item[{\usekomafont{disposition}Beispiel:\ }]%
}{%
  \endlabeling%
}
%    \end{macrocode}
% \end{environment}^^A Example*
% \end{environment}^^A Example
% \begin{environment}{Code}
% \begin{macro}{\tud@currentHref}
% Folgend werden Befehle und Umgebungen für die Darstellung von Quelltexten im 
% Handbuch definiert. Mit dieser Umgebung können kurze Quelltextbeispiele im
% Handbuch ausgegeben werden. Sicherlich sinnvoll ist, die \env{Code}-Umgebung
% innerhalb von \env{Example} oder \env{quoting} zu verwenden, um den
% Quelltext etwas abzuheben.
%    \begin{macrocode}
\lstnewenvironment{Code}[1][]{\lstset{style=tudscr,#1}}{}
%    \end{macrocode}
% Innerhalb der Umgebung \env{Code} wird \cs{@currentHref} unerwünschter Weise
% geändert. Um dies zu vermeiden, wird dieser Befehl gesichert und anschließend
% zurückgesetzt.
%    \begin{macrocode}
\newcommand*\tud@currentHref{}
\BeforeBeginEnvironment{Code}{\global\let\tud@currentHref\@currentHref}
\AfterEndEnvironment{Code}{\global\let\@currentHref\tud@currentHref}
%    \end{macrocode}
% \end{macro}^^A \tud@currentHref
% \end{environment}^^A Code
% \begin{environment}{packages}
% \begin{macro}{\itempackages}
% \begin{macro}{\tud@item@pkg}
% \changes{v2.02}{2014/10/08}{\cs{DeclarePackage} entfernt}%^^A
% \changes{v2.02}{2014/10/09}{optionales Argument für CTAN-Link}%^^A
% \begin{macro}{\before@packages}
% Ähnlich wie für die Auflistung von Werten eines Schlüssels wird auch mit der 
% Charakterisierung von Paketen verfahren. Diese werden in der Auflistung 
% speziell gekennzeichnet und mit \cs{DeclarePackage} im Index eingetragen.
%    \begin{macrocode}
\newlist{packages}{description}{2}
\setlist[packages]{%
  topsep=\medskipamount,labelwidth=\linewidth,labelsep=0pt,font=\normalfont,%
  parsep=\parskip,listparindent=\parindent,before=\before@packages%
}
\newcommand*\itempackages{}
\newcommand*\before@packages{%
  \ifdefvoid{\itempackages}{%
    \let\itempackages\item%
    \let\item\tud@item@pkg%
  }{}%
}
\NewDocumentCommand\tud@item@pkg{od()}{%
  \itempackages[{%
    \IfValueT{#1}{%
      \manualhyperdef{files:#1}%
      \IfValueTF{#2}{%
        \def\@tempa{http://www.ctan.org/pkg/#2}%
      }{%
        \def\@tempa{http://www.ctan.org/pkg/#1}%
      }%
      \href{\@tempa}{\Package{#1}'none'|!|}%
    }%
  }]%
}
%    \end{macrocode}
% \end{macro}^^A \before@packages
% \end{macro}^^A \tud@item@pkg
% \end{macro}^^A \itempackages
% \end{environment}^^A packages
%
% \subsubsection{Änderungsliste}
%
% Um dem Anwender einen schnellen Überblick zu Änderungen der aktuellen Verison 
% bereitstellen zu können, werden Befehle zur automatisierten Erzeugung  einer 
% solchen Liste definiert.
%
% \begin{macro}{\printchangedatlist}
% \changes{v2.02}{2014/10/09}{neu}%^^A
% \begin{macro}{\@changedatdeclare}
% \changes{v2.02}{2014/10/09}{neu}%^^A
% \begin{macro}{\@changedatdeclaredefault}
% \changes{v2.02}{2014/10/09}{neu}%^^A
% \begin{macro}{\@changedatdeclarelist}
% \changes{v2.02}{2014/07/25}{neu}%^^A
% Um für Änderungsnotizen die dazugehörige Option, Befehl etc. bei einer 
% Deklaration kenntlich zu machen, wird das deklarierte Element zusammen mit 
% der Notiz in einer Liste gespeichert. Da mehrere kommaseparierte Werte
% angegeben werden können, muss das optionale Argument der Umgebung
% \env{Declaration} dahingehend abgearbeitet werden. Wenn keine weitere
% Erklärung angegeben wurde, wird der entspredchende Eintrag mit dem Attribut
% versehen, welches in \cs{@changedatdeclaredefault} gespeichert ist.
%    \begin{macrocode}
\newcommand*\@changedatdeclarelist{}
\let\@changedatdeclarelist\relax
\newcommand*\@changedatdeclaredefault{\emph{neu}}
\newcommand*\@changedatdeclare[2]{%
  \IfValueT{#1}{%
    \@for\@tempa:=#1\do{%
      \protected@expandtwoargs\in@{!}{\@tempa}%
      \ifin@%
        \expandafter\listadd\expandafter\@changedatdeclarelist%
          \expandafter{\@tempa!#2}%
      \else%
        \expandafter\listadd\expandafter\@changedatdeclarelist%
          \expandafter{\@tempa!\@changedatdeclaredefault!#2}%
      \fi%
    }%
  }%
}
%    \end{macrocode}
% Die Einträge in der Änderungsliste sowie die dazugehörige Randnotiz werden 
% mit dem Makro \cs{ChangedAt@Process} abgearbeitet, sortiert und erstellt. Bei
% \cs{printchangedatlist} wird mit dem optionalen Argument der Versatz für die 
% Randnotiz gesetzt. Dieser wird wie auch die Liste an \cs{ChangedAt@Process}
% übergeben, womit diese und die Randnotiz letztendlich erzeugt werden.
%    \begin{macrocode}
\NewDocumentCommand\printchangedatlist{sO{\z@}}{%
  \ifx\@changedatdeclarelist\relax\else%
    \ChangedAt@Process{#2}{\@changedatdeclarelist}%
    \global\let\@changedatdeclarelist\relax%
    \IfBooleanF{#1}{%
      \par\nobreak\vskip\dimexpr-\parskip-\baselineskip%
      \@afterindentfalse\@afterheading%
    }%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \@changedatdeclarelist
% \end{macro}^^A \@changedatdeclaredefault
% \end{macro}^^A \@changedatdeclare
% \end{macro}^^A \printchangedatlist
% \begin{macro}{\ChangedAt}
% \changes{v2.02}{2014/07/25}{erweitert}%^^A
% \changes{v2.02}{2014/10/15}{Sternversion neu (keine Randnotiz)}%^^A
% An den Befehl \cs{ChangedAt} kann eine kommagetrente Liste mit verschiedenen
% Versionsnummern und dazugehörigen Änderungen übergeben werden. Er wird in der 
% Form: \cs{ChangedAt}\marg{Version!Definition,Version!Erweiterung} genutzt.
% Der Prozess selbst wird mit \cs{ChangedAt@Process} durchgeführt. Es wird
% zu der angegebenen Versionsnummer ein Eintrag in die Änderungsliste erstellt,
% wenn mit einem Ausrufezeichen getrennt der gewünschte Inhalt gegeben wurde.
%
% Alle übergegebenen Versionsnummern werden als Liste mit einmaligen Einträgen 
% in einer Randnotiz gesetzt. Mit dem optionalen Argument kann ein vertikaler 
% dieser angegeben werden. Die Sternversion von \cs{ChangedAt} unterdrückt die
% Ausgabe dieser Randnotiz.
%    \begin{macrocode}
\NewDocumentCommand\ChangedAt{sO{\z@}m}{\ChangedAt@Process[#1]{#2}{#3}}
%    \end{macrocode}
% \end{macro}^^A \ChangedAt
% \begin{macro}{\ChangedAt@Process}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% \begin{macro}{\ChangedAt@@Process}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% \begin{macro}{\ChangedAt@@@Process}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% \changes{v2.02}{2014/10/16}{Unterteilung Änderungsliste in Bereiche}%^^A
% \begin{macro}{\ChangedAt@Default}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% \begin{macro}{\ChangedAt@Split}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% \begin{macro}{\@changedatlist}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% \begin{macro}{\@changedatversionlist}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% Mit diesen Befehlen wird die Änderungshistorie in Form eines Index erstellt. 
% Der Befehl \cs{ChangedAt@Process} setzt eine kommagetrennte Liste in eine 
% im Format von \pkg{etoolbox} um. Anschließend wird diese für die Liste der
% Änderungen mit \cs{ChangedAt@Split} aufgespalten. Die einzelnen Einträge
% werden mit \cs{ChangedAt@@Process} weiter verarbeitet.
%    \begin{macrocode}
\newcommand*\@changedatlist{}
\newcommand*\ChangedAt@Default{}
\newcommand*\@changedatversionlist{}
\let\@changedatversionlist\relax
\newcommand*\ChangedAt@Process[3][]{%
  \let\@changedatlist\relax%
  \let\@changedatversionlist\relax%
  \@for\@tempa:=#3\do{\listeadd{\@changedatlist}{\expandonce\@tempa}}%
  \forlistloop\ChangedAt@Split{\@changedatlist}%
%    \end{macrocode}
% Nach der Verarbeitung aller Einräge sind in \cs{@changedatlist} alle 
% angegebenen Versionsnummern genau einmal enthalten. Mit \cs{sortlist} werden 
% diese in die richtige Reihenfolge sortiert und anschließend als Randnotiz in
% einer Tabelle ausgegeben, falls nicht die Sternversion verwendet wurde.
%    \begin{macrocode}
  \IfBooleanF{#1}{%
    \sortlist{\@changedatversionlist}%
    \strut%
    \marginnote{%
      \def\@tempa####1{%
        \ignorespaces\manualhyperref{####1}{####1}\tabularnewline%
      }%
      \begin{tabular}{|l|}%
        \hline%
        \forlistloop\@tempa{\@changedatversionlist}%
        \hline%
      \end{tabular}%
    }[#2]%
    \ignorespaces%
  }%
}
%    \end{macrocode}
% Der Befehl \cs{ChangedAt@Split} teilt ein gegebenes Argument am Delimiter
% Ausrufezeichen (\enquote{!}) in drei Argumente auf und reicht diese an 
% \cs{ChangedAt@@Process} weiter. Sollte kein oder nur Ausrufezeichen gefunden 
% werden, so wird das zweite und/oder dritte Argument mit dem~-- vom Paket
% \pkg{xparse} definierten~-- leeren Wert \texttt{-NoValue-} an den Befehl
% \cs{ChangedAt@@Process} übergeben.
%    \begin{macrocode}
\NewDocumentCommand\ChangedAt@Split{>{\SplitArgument{2}{!}}m}{%
  \ChangedAt@@Process#1%
}
%    \end{macrocode}
% Hiermit wird der Eintrag in die Änderungshistorie erzeugt. Dabei ist zu 
% unterscheiden, ob der Befehl \cs{ChangedAt} direkt genutzt wurde oder aber 
% der Eintrag innerhalb der \env{Declaration}-Umgebung erfolgte. Dies wird 
% anhand von des dritten Argumentes erkannt. Für den ersten Fall erfolgt ein
% Eintrag lediglich, wenn neben der Versionsnummer selbst auch eine Erklärung
% angegben wurde~-- eine Randnotiz wird aber in jedem Fall gesetzt. Im zweiten
% Fall wird der Erklärung \emph{immer} \cs{ChangedAt@Default} vorangestellt.
% Sollte keine Erklärung direkt angegeben worden sein, so wird in der
% Änderungsliste vermerkt, dass es sich um eine \emph{neue} Option, Befehl etc.
% handelt. Der eigentliche Eintrag selbst erfolgt mit \cs{ChangedAt@@@Process}.
%    \begin{macrocode}
\newcommand*\ChangedAt@@Process[3]{%
  \IfValueTF{#3}{%
%    \end{macrocode}
% Bei der Deklaration von Optionen, Befehlen etc. werden diese automatisch in 
% der Liste der Änderungen im Bereich \enquote{Implementierung} vor der
% gegebenen Erklärung selbst ausgegeben. Hierfür wird das dritte Argument
% genutzt. Damit lediglich diese und nicht noch die dazugehörigen Argumente
% eingetragen werden, werden die relevanten Befehle deaktiviert und das
% optionale Argument in \cs{ChangedAt@Default} expandiert.
%    \begin{macrocode}
    \begingroup%
      \@gobbleparameters%
      \xdef\ChangedAt@Default{#3}%
    \endgroup%
    \ChangedAt@@@Process{#1}{Implementierung}{\ChangedAt@Default: #2}%
  }{%
%    \end{macrocode}
% Wurde \cs{ChangedAt} direkt und nicht über das optionale Argument der 
% Umgebungen \env{Declaration} genutzt, erscheint der gewünschte Eintrag im
% Bereich \enquote{Allgemein}.
%    \begin{macrocode}
    \IfValueT{#2}{\ChangedAt@@@Process{#1}{Allgemein}{#2}}%
  }%
%    \end{macrocode}
% Außerdem wird der Liste \cs{changedatversionlist} die aktuelle Version
% einmalig hinzugefügt, um alle in einer Randnotiz ausgeben zu können.
%    \begin{macrocode}
  \xifinlist{#1}{\@changedatversionlist}{}{\listeadd\@changedatversionlist{#1}}%
}
%    \end{macrocode}
% Mit \cs{ChangedAt@@@Process} Erfolgen die Einträge in die Änderungsliste.
%    \begin{macrocode}
\newcommand*\ChangedAt@@@Process[3]{%
  \begingroup%
%    \end{macrocode}
% Für geänderte Parameter wird als Haupteintrag das dazugehörige Makro bzw. die
% entsprechende Umgebung verwendet. Der geänderte Parameter folgt danach.
% Zuerst muss ggf. das Makro \cs{ChangedAt@Default} expandiert werden.
%    \begin{macrocode}
    \def\@tempa{#3}%
    \in@{\ChangedAt@Default}{#3}%
    \ifin@%
      \expandafter\def\expandafter\@tempa\expandafter{\ChangedAt@Default}%
    \fi%
%    \end{macrocode}
% Danach wird geprüft, ob das Makro \cs{Key} übergeben wurde. Außerdem wird ein 
% Anker in der Änderungsliste für die Referenzierung auf die einzelnen Bereiche 
% (\enquote{Allgemein}, \enquote{Implementierung} und \enquote{Umbenennungen}) 
% gesetzt.
%    \begin{macrocode}
    \expandafter\in@\expandafter\Key\expandafter{\@tempa}%
    \ifin@%
      \begingroup%
        \RenewDocumentCommand\Key{sommo}{\xdef\@TempKey{##3:}}%
        \setbox0\hbox{#3}%
      \endgroup%
      \index[changelog]{%
        #1 \manualhyperdef*{#1}!\manualhyperdef*{#1:#2}{#2}!\@TempKey\ #3%
      }%
    \else%
      \index[changelog]{%
        #1 \manualhyperdef*{#1}!\manualhyperdef*{#1:#2}{#2}!#3%
      }%
    \fi%
  \endgroup%
}
%    \end{macrocode}
% \end{macro}^^A \@changedatversionlist
% \end{macro}^^A \@changedatlist
% \end{macro}^^A \ChangedAt@Split
% \end{macro}^^A \ChangedAt@Default
% \end{macro}^^A \ChangedAt@@@Process
% \end{macro}^^A \ChangedAt@@Process
% \end{macro}^^A \ChangedAt@Process
% \begin{macro}{\Rename}
% \changes{v2.02}{2014/07/25}{neu}%^^A
% Der Befehl \cs{Rename} erzeugt einen Eintrag in der Änderungshistorie sowie 
% einen Eintrag im gewünschten Index mit einem Verweis auf den neuen Befehl.
%    \begin{macrocode}
\newcommand*\Rename[4][]{%
  \ChangedAt@@@Process{#2}{Umbenennungen}{%
    #3: \emph{umbenannt}~\textrightarrow~siehe #4%
  }%
  \ChangedAt@@@Process{#2}{Implementierung}{%
    #4: \emph{neu}~\textrightarrow~ersetzt #3%
  }%
  \listeadd\@changedatdeclarelist{#2}%
  \index[#1]{#3|see{#4}}%
}
%    \end{macrocode}
% \end{macro}^^A \Rename
% \begin{macro}{\@ProcessChangedAt}
% \changes{v2.02}{2014/07/25}{erweitert}%^^A
% \changes{v2.02}{2014/10/08}{Sternversion ergänzt}%^^A
% Die Änderungsliste erhält ebenfalls einen Hyperlink zur Deklaration. Für
% Umgebungs- und Befehlsparameter wird mit dem zweiten optionalen Argument ein
% Untereintrag für die dazugehörige Umgebung beziehungsweise den dazugehörigen
% Befehl erzeugt.
%    \begin{macrocode}
\NewDocumentCommand\@ProcessChangedAt{mmd()mmm}{%
  \begingroup%
    \let\texttt\@firstofone%
    \let\textsbn\@firstofone%
    \let\textsbs\@firstofone%
    \let\Environment\@firstofone%
    \let\Macro\@firstofone%
    \IfValueTF{#3}{\xdef\@tempa{#2:#3:#5}}{\xdef\@tempa{#2:#5}}%
  \endgroup%
  \IfBooleanTF{#1}{%
    \def\@tempb{\begingroup#4#5\endgroup}%
  }{%
    \def\@tempb{\begingroup#4#5\endgroup~{\idxfont(#6)}}%
  }%
  \ifcsdef{r@\@tempa}{\hyperidx[\@tempa]{\@tempb}}{\@tempb}%
}
%    \end{macrocode}
% \end{macro}^^A \@ProcessChangedAt
% \begin{macro}{\sortlist}
% \changes{v2.02}{2014/07/25}{neu}%^^A
% \begin{macro}{\@sortlist}
% \changes{v2.02}{2014/07/25}{neu}%^^A
% \begin{macro}{\@sortedlist}
% \changes{v2.02}{2014/07/25}{neu}%^^A
% \begin{macro}{\if@listsorted}
% \changes{v2.02}{2014/07/25}{neu}%^^A
% Der Befehl \cs{sortlist} erwartet eine \pkg{etoolbox}-Liste und sortiert diese
% mit \cs{@sortlist} in alphabetischer Reihenfolge in eine kommagetrennte 
% Auflistung. Diese wird anschließend wieder in eine \pkg{etoolbox}-Liste 
% umgewandelt.
%    \begin{macrocode}
\newif\if@listsorted
\newcommand*\@sortedlist{}
\newcommand*\sortlist[1]{%
  \let\@sortedlist\relax%
  \forlistloop\@sortlist{#1}%
  \let#1\relax%
  \@for\@tempa:=\@sortedlist\do{\listeadd{#1}{\@tempa}}%
}
%    \end{macrocode}
% Hier erfolgt die eigentliche Sortierung der Liste.
%    \begin{macrocode}
\newcommand*\@sortlist[1]{%
%    \end{macrocode}
% Der erste Eintrag wird direkt der Liste hinzugefügt.
%    \begin{macrocode}
  \ifx\@sortedlist\relax%
    \def\@sortedlist{#1}%
%    \end{macrocode}
% Weitere Einräge werden mit \cs{pdfstrcmp} an der richtigen Stelle eingefügt.
% Dabei wird die kommagetrennte Liste \cs{@sortedlist} mit \cs{@for} durchlaufen
% und \cs{@tempb} als Hilfsmakro verwendet, in welches die aktuelle Liste 
% innerhalb der \cs{@for}-Schelife stückweise expandiert wird. Der Schalter
% \cs{if@listsorted} wird gesetzt, wenn das aktuelle Element an der richtigen
% Stelle eingesetzt wurde.
%    \begin{macrocode}
  \else%
    \@listsortedfalse%
    \let\@tempb\@empty%
    \@for\@tempa:=\@sortedlist\do{%
%    \end{macrocode}
% Ist der Eintrag bereits erfolgt, wird der verbliebene Teil der Liste 
% angehängt.
%    \begin{macrocode}
      \if@listsorted%
        \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,\@tempa}%
      \else%
%    \end{macrocode}
% Liegt der Eintrag in alphabetischer Reihenfolge vor dem aktuellen der 
% durchlaufenenen Liste, so wird dieser davor eingefügt. Dabei muss der Fall, 
% dass das Element der erste Eintrag in der temporären Liste \cs{@tempb} ist, 
% eine Sonderbehandlung erfolgen. Anschließend wird \cs{@listsortedtrue} 
% gesetzt.
%    \begin{macrocode}
        \expandafter\ifnum\pdfstrcmp{#1}{\@tempa}<0\relax%
          \ifx\@tempb\@empty%
            \expandafter\edef\expandafter\@tempb\expandafter{%
              #1,\@tempa%
            }%
          \else%
            \expandafter\edef\expandafter\@tempb\expandafter{%
              \@tempb,#1,\@tempa%
            }%
          \fi%
          \@listsortedtrue%
        \else%
%    \end{macrocode}
% Ist Eintrag in alphabetischer Reihenfolge nach dem aktuellen der geprüften 
% Liste, so wird dieser (noch) nicht eingefügt. Der Sonderfall des ersten
% Elementes wird abgedeckt.
%    \begin{macrocode}
          \ifx\@tempb\@empty%
            \expandafter\edef\expandafter\@tempb\expandafter{\@tempa}%
          \else%
            \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,\@tempa}%
          \fi%
        \fi%
      \fi%
    }%
%    \end{macrocode}
% Wurde der Eintrag nach dem Durchlaufen der Liste nicht eingefügt, so erfolgt 
% dies hier am Ende der Liste.
%    \begin{macrocode}
    \if@listsorted\else%
      \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,#1}%
    \fi%
%    \end{macrocode}
% Die temporäre Liste \cs{@tempb} wird auf \cs{@sortedlist} überschrieben.
%    \begin{macrocode}
    \let\@sortedlist\@tempb%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \if@listsorted
% \end{macro}^^A \@sortedlist
% \end{macro}^^A \@sortlist
% \end{macro}^^A \sortlist
%
% \iffalse
%</class>
%<*package>
% \fi
%
% \subsection{Befehle und Umgebungen für das Paket}
%
% Hier taucht alles auf, was lediglich für das Paket \pkg{tudscrman} und nicht 
% für die Klasse benötigt wird.
%
% Für den Anwender werden im \TUDScript-Bundle einige Tutorials für die Nutzung 
% von \LaTeXe bereitgestellt. Innerhalb dieser werden Auszüge von Quelltexten 
% verwendet und erläutert. Zum einen soll die Möglichkeit geschaffen werden, 
% diese gesammelt am Ende eines Tutorials für ein Copy"~\&"~Paste"~Beispiel zu 
% verwenden. Andererseits soll auch das sofortige Ausführen des beschriebenen 
% Quelltextauszuges direkt im Tutorial möglich sein. Dafür werden im Folgenden 
% die Umgebungen \env{Preamble}, \env{Trunk} und \env{Hint} sowie daraus 
% abgeleitet Varianten definiert, womit sich die Angabe und Erläuterung der 
% Quelltexte im Tutorial logisch strukturieren lässt und dennoch die notwendige 
% Ordnung dieser für das Copy"~\&"~Paste"~Beispiel aufrechterhalen werden kann.
% Hierfür zeichnen die beiden Umgebungen \env{Preamble} und \env{Trunk} und
% deren Derivate verantwortlich. Die Umgebung \env{Hint} steht für zusätzliche 
% Erläuterungen bereit, welche jedoch nicht in das Copy"~\&"~Paste"~Beispiel 
% übernommen werden.
% 
% Damit die Umgebungen nicht doppelt implementiert werden müssen, werden die
% Hilfsmakros \cs{tud@tut@pre} und \cs{tud@tut@post} definiert. Diese nutzen 
% die \env{filecontents}"=Umgebung, welche den Inhalt in die temporäre Datei 
% \val{\string\jobname-temp.tex} schreibt. Zusätzlich wird dieser Inhalt mit
% \cs{tud@tut@append} der Datei \val{\string\jobname-preamble-temp.tex} oder 
% \val{\string\jobname-trunk-temp.tex}~-- abhängig vom gegebenen Argument~--
% hinzugefügt. So werden die im Dokumentes gesetzten Quelltextauszüge für ein 
% Copy"~\&"~Paste"~Beispiel gesammelt und mit \cs{FinishTutorial} ausgegeben.
% \begin{environment}{Preamble}
% \changes{v2.02}{2014/11/02}{neu}%^^A
% \begin{environment}{Preamble*}
% \changes{v2.02}{2014/11/03}{neu}%^^A
% \begin{environment}{Preamble+}
% \changes{v2.02}{2014/11/03}{neu}%^^A
% Die Umgebung \env{Preamble} dient für die Ausgabe von Quelltexten, welche in 
% einem \LaTeXe-Dokument in der Präambel verwendet werden müssen oder sollten. 
% Die in ihr gesetzten Inhalte werden für das Copy"~\&"~Paste-Beispiel vor den 
% Inhalten aus der Umgebung \env{Trunk} ausgegeben. Die Sternversion führt
% den Inhalt zusätzlich im Dokument aus. Die Pluszechen"=Version fügt dem
% Ausgabestream ihren Inhalt hinzu, ohne das dieser ausgegeben oder ausgeführt
% wird.
%    \begin{macrocode}
\newenvironment{Preamble}{\tud@tut@pre}{%
  \tud@tut@post%
  \tud@tut@append{\tud@write@i}%
  \gdef\@tempa{%
    \tud@tut@lst%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
\newenvironment{Preamble*}{\tud@tut@pre}{%
  \tud@tut@post%
  \tud@tut@append{\tud@write@i}%
  \gdef\@tempa{%
    \tud@tut@lst%
    \tud@tut@input%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
\newenvironment{Preamble+}{\tud@tut@pre}{%
  \tud@tut@post%
  \tud@tut@append{\tud@write@i}%
  \gdef\@tempa{%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
%    \end{macrocode}
% \end{environment}^^A Preamble+
% \end{environment}^^A Preamble*
% \end{environment}^^A Preamble
% \begin{environment}{Trunk}
% \changes{v2.02}{2014/08/16}{neu}%^^A
% \begin{environment}{Trunk*}
% \changes{v2.02}{2014/08/19}{neu}%^^A
% \begin{environment}{Trunk+}
% \changes{v2.02}{2014/11/03}{neu}%^^A
% \begin{environment}{Trunk!}
% \changes{v2.02}{2014/10/07}{neu}%^^A
% Die Umgebung \env{Trunk} dient zur Ausgabe von exemplarischen Quelltexten, 
% welche in einem \LaTeXe-Dokument innerhalb der \env{document}-Umgebung
% verwendet werden müssen oder sollten. Für das Copy"~\&"~Paste-Beispiel werden 
% die gegebenen Inhalte nach den Inhalten aus der Umgebung \env{Preamble} 
% ausgegeben. Die Sternversion der Umgebung führt ihren Inhalt zusätzlich im
% Dokument aus. Die Pluszeichen"=Version fügt dem Ausgabestream ihren Inhalt
% hinzu, ohne diesen auszugeben oder auszuführen. Die Ausrufezeichen"=Version
% fügt den Quelltext im Dokument ein und führt diesen zusätzlich in einer
% separaten Datei mit einem minimalen Dokumentkörper aus, um daraus eine
% PDF-Datei zu erzeugen, welche im Nachhinein mit \cs{IncludeStandalone} als
% Grafik eingebunden werden kann. Dies ist für Quelltextabschnitte gedacht,
% deren Ausgabe zu groß ist, um diese direkt anzuzeigen und dennoch dargestellt
% werden sollen.
%    \begin{macrocode}
\newenvironment{Trunk}{\tud@tut@pre}{%
  \tud@tut@post%
  \tud@tut@append{\tud@write@ii}%
  \gdef\@tempa{%
    \tud@tut@lst%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
\newenvironment{Trunk*}{\tud@tut@pre}{%
  \tud@tut@post%
  \tud@tut@append{\tud@write@ii}%
  \gdef\@tempa{%
    \tud@tut@lst%
    \tud@tut@input%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
\newenvironment{Trunk+}{\tud@tut@pre}{%
  \tud@tut@post%
  \tud@tut@append{\tud@write@ii}%
  \gdef\@tempa{%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
\newenvironment{Trunk!}[1]{%
  \gdef\@StandaloneFile{#1}%
  \tud@tut@pre%
}{%
  \tud@tut@post%
  \tud@tut@append{\tud@write@ii}%
  \gdef\@tempa{%
    \tud@tut@lst%
    \tud@tut@pdf%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
%    \end{macrocode}
% \end{environment}^^A Trunk!
% \end{environment}^^A Trunk+
% \end{environment}^^A Trunk*
% \end{environment}^^A Trunk
% \begin{environment}{Hint}
% \changes{v2.02}{2014/09/16}{neu}%^^A
% \begin{environment}{Hint*}
% \changes{v2.02}{2014/10/13}{neu}%^^A
% \begin{environment}{Hint?}
% \changes{v2.02}{2014/12/09}{neu}%^^A
% \begin{environment}{Hint!}
% \changes{v2.02}{2014/11/13}{neu}%^^A
% Um Quelltextausschnitte zur weiterführenden Information anzugeben, wird die
% Umgebung \env{Hint} definiert. Der Inhalt wird ausgegben und~-- falls die
% Sternversion genutzt wurde~-- auch ausgeführt, allerdings nicht in das 
% Copy"~\&"~Paste"~Beispiel übernommen. Ansonsten entsprechen alle Umgebungen 
% in ihren Eigenschaften den äquivalenten \env{Trunk}-Umgebungen. Die Version 
% mit Fragezeichen ist für Quelltextauszüge gedacht, die ungeprüft \emph{vor}
% dessen Ausgabe ausgeführt werden sollen. 
%    \begin{macrocode}
\newenvironment{Hint}{\tud@tut@pre}{%
  \tud@tut@post%
  \gdef\@tempa{%
    \tud@tut@lst%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
\newenvironment{Hint*}{\tud@tut@pre}{%
  \tud@tut@post%
  \gdef\@tempa{%
    \tud@tut@lst%
    \tud@tut@input%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
\newenvironment{Hint?}{\tud@tut@pre}{%
  \tud@tut@post%
  \gdef\@tempa{%
    \InputCode%
    \tud@tut@lst%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
\newenvironment{Hint!}[1]{%
  \gdef\@StandaloneFile{#1}%
  \tud@tut@pre%
}{%
  \tud@tut@post%
  \gdef\@tempa{%
    \tud@tut@lst%
    \tud@tut@pdf%
    \global\let\@CodePreamble\relax%
  }%
  \aftergroup\@tempa%
}
%    \end{macrocode}
% \end{environment}^^A Hint!
% \end{environment}^^A Hint?
% \end{environment}^^A Hint*
% \end{environment}^^A Hint
% \begin{macro}{\@StandaloneFile}
% \changes{v2.02}{2014/08/19}{neu}%^^A
% Die Umgebungen \env{Trunk!} und \env{Hint!} erzeugen nach der Ausgabe des
% Quelltextes mit dem Makro \cs{tud@tut@pdf} eine PDF-Datei, welche mit
% \cs{IncludeStandalone} in das Tutorial eingebunden werden kann.
%    \begin{macrocode}
\newcommand*\@StandaloneFile{}
\let\@StandaloneFile\relax
%    \end{macrocode}
% \end{macro}^^A \@StandaloneFile
% \begin{macro}{\tud@tut@pre}
% \changes{v2.02}{2014/08/19}{neu}%^^A
% \begin{macro}{\tud@tut@post}
% \changes{v2.02}{2014/08/19}{neu}%^^A
% Dies sind die Hilfsmakros, welche zu Beginn und Ende der Quelltextumgebungen 
% \env{Preamble}, \env{Trunk} und \env{Hint} für das Sichern der Inhalte in
% eine Hilfsdatei verantwortlich zeichnen.
%    \begin{macrocode}
\newcommand*\tud@tut@pre{%
  \ActivateWarningFilters[Tutorial]%
  \@nameuse{filecontents*}{\jobname-temp.tex}%
}
\newcommand*\tud@tut@post{%
  \@nameuse{endfilecontents*}%
  \DeactivateWarningFilters[Tutorial]%
}
%    \end{macrocode}
% \end{macro}^^A \tud@tut@post
% \end{macro}^^A \tud@tut@pre
% \begin{macro}{\tud@tut@lst}
% \changes{v2.02}{2014/10/07}{neu}%^^A
% Damit wird der Quelltext eingezogen ausgegeben.
%    \begin{macrocode}
\newcommand*\tud@tut@lst{%
  \begin{quoting}[rightmargin=0pt]%
  \lstinputlisting[style=tudscr]{\jobname-temp.tex}%
  \end{quoting}%
}
%    \end{macrocode}
% \end{macro}^^A \tud@tut@lst
% \begin{macro}{\tud@tut@input}
% \changes{v2.02}{2014/10/13}{neu}%^^A
% \begin{macro}{\CodePreamble}
% \changes{v2.02}{2014/08/20}{neu}%^^A
% \begin{macro}{\@CodePreamble}
% \changes{v2.02}{2014/10/22}{neu}%^^A
% \begin{macro}{\CodeHook}
% \changes{v2.02}{2014/10/11}{neu}%^^A
% \begin{macro}{\@CodeHook}
% \changes{v2.02}{2014/10/11}{neu}%^^A
% Bereitstellung von Hilfsmakros für die formatierte Ausgabe von Quelltexten.
%    \begin{macrocode}
\newcommand\@CodePreamble{}
\let\@CodePreamble\relax
\newcommand\CodePreamble[1]{\long\gdef\@CodePreamble{#1}}
\newcommand*\@CodeHook{}
\let\@CodeHook\relax
\newcommand*\CodeHook[1]{\gdef\@CodeHook{#1}}%
%    \end{macrocode}
% Für die Ausgabe des Quelltextergebnisses erfolgt ein linker Einzug. Außerdem 
% werden unter anderem abhängig von der Verwendung eines erklärenden Textes die 
% eingefügten vertikalen Abstände angepasst.
%    \begin{macrocode}
\newcommand*\tud@tut@input{%
%    \end{macrocode}
% Nach dem Ausführen des ersten Argumentes von \cs{@tempa} wird geprüft, ob
% dieses überhaupt eine sichtbare Ausgabe erzeugt hat. Nur für diesen Fall wird
% nach dieser vertikaler Leerraum eingefügt. Der Anfang entspricht prinzipiell
% dem Standardbefehl \cs{settoheight}, jedoch wird im Inneren zusätzlich eine
% \cs{vbox} verwendet, um damit auch mathematische Umgebungen testen zu können. 
% Das Ganze findet innerhalb einer Gruppierung statt, um keine Änderungen zu
% erzeugen.
%    \begin{macrocode}
  \def\@tempa##1##2{%
    ##1%
    \begingroup%
      ##2%
      \setbox\@tempboxa\hbox{\vbox{##1}}%
      \@tempdima=\ht\@tempboxa%
      \setbox\@tempboxa\box\voidb@x%
      \ifdim\@tempdima>\z@\relax%
        \endgraf%
        \vspace{\baselineskipglue}%
        \noindent\ignorespaces%
      \fi%
    \endgroup%
  }%
%    \end{macrocode}
% Da aufgrund der Verwendung der \env{filecontents}"=Umgebung ein optionales
% Argument für alle Abwandlungen der Quelltextumgebungen nicht möglich ist,
% wird \cs{CodePreamble} bereitgestellt, womit der Ausgabe ein erläuternder
% Text vorangestellt werden kann.
%    \begin{macrocode}
  \@tempa{\@CodePreamble}{}%
  \setlength{\@tempdimc}{\leftskip}%
  \setlength{\leftskip}{\leftmargin}%
%    \end{macrocode}
% Durch die zweimalige Verwendung von \val{\string\jobname-temp.tex}~-- einmal 
% dirket und einmal innerhalb einer Box~-- können darin verwendete Befehle wie
% \cs{newcommand} zu Fehler führen. Mit dem Makro \cs{CodeHook} lassen sich 
% diese Konflikte durch eine lokale Redefinition ebensoclher Befehle auflösen
% (bspw. \cs{let}\cs{newcommand}\cs{renewcommand}).
%    \begin{macrocode}
  \ActivateWarningFilters[Tutorial]%
  \@tempa{\input{\jobname-temp.tex}}{\@CodeHook}%
  \DeactivateWarningFilters[Tutorial]%
  \global\let\@CodeHook\relax%
  \setlength{\leftskip}{\@tempdimc}%
  \noindent\ignorespaces%
}
%    \end{macrocode}
% \end{macro}^^A \@CodeHook
% \end{macro}^^A \CodeHook
% \end{macro}^^A \@CodePreamble
% \end{macro}^^A \CodePreamble
% \end{macro}^^A \tud@tut@input
% \begin{macro}{\InputCode}
% \changes{v2.02}{2014/10/21}{neu}%^^A
% Mit \cs{InputCode} kann der Inhalt der letzen \env{Trunk}"=Umgebung 
% direkt ausgeführt werden, ohne diesen zuvor mit \cs{tud@tut@input} zu prüfen 
% und zu formatieren.
%    \begin{macrocode}
\newcommand*\InputCode{\input{\jobname-temp.tex}}
%    \end{macrocode}
% \end{macro}^^A \InputCode
% \begin{macro}{\tud@tut@pdf}
% \changes{v2.02}{2014/10/22}{neu}%^^A
% Die Umgebung \env{Trunk!} verwendet nach der Ausgabe des Quelltextes diesen
% abermals, um daraus eine PDF-Datei zu erzeugen. Dafür wird mithilfe einer
% \env{filecontents}"=Umgebung eine temporäre \LaTeX-Datei erzeugt. Diese 
% bindet die mit \env{Trunk!} erzeugte Datei ein und wird anschließende via 
% \cs{write18} kompiliert. Dabei sollte man sich nicht von der doppelten
% Verwendung von \cs{jobname} verwirren lassen. Der Dateiname der temporär
% erzeugten \LaTeX-Datei ist abhängig vom gesetzten Tutorial. Beim Aufruf
% dieser wird über die Optionen von pdf\LaTeX{} der verwendete \cs{jobname}
% angepasst (siehe \cs{tud@tut@pdf}).
%    \begin{macrocode}
\ifnum\pdfshellescape=1\relax%
\ActivateWarningFilters[Tutorial]%
\begin{filecontents*}{tutorial-temp.tex}
\RequirePackage[ngerman=ngerman-x-latest]{hyphsubst}
\documentclass[english,ngerman]{tudscrreprt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{tudscrsupervisor}
\usepackage{isodate}
\usepackage{enumitem}
\setlist{noitemsep}
\begin{document}
\input{\jobname.tex}
\end{document}
\end{filecontents*}
\DeactivateWarningFilters[Tutorial]%
\fi
%    \end{macrocode}
% Der Quelltext aus der \env{Trunk!}"=Umgebung wird~-- wie bei allen anderen
% Derivaten der Umgebungen \env{Trunk}~-- in \val{\string\jobname-temp.tex}
% gesichert. Beim Aufruf von pdf\LaTeX{} wird durch die Verwendung der Option 
% \opt{-jobname=\string\jobname-temp} die eigentliche Definition des Makros 
% \cs{jobname} in der aufgerufenen Datei \val{tutorial-temp.tex} überschrieben
% und der Inhalt von \val{\string\jobname-temp.tex} wie gewünscht eingebunden
% und kompiliert. Damit die so erstellte PDF-Datei mit \cs{IncludeStandalone} 
% im weiteren Verlauf in das Tutorial eingebunden werden kann, wird diese noch
% in \cs{\meta{Argument}-temp.pdf} umbenannt.
%    \begin{macrocode}
\newcommand*\tud@tut@pdf{%
  \ifnum\pdfshellescape=1\relax%
    \immediate\write18{%
      pdflatex -jobname=\jobname-temp tutorial-temp.tex
      pdflatex -jobname=\jobname-temp tutorial-temp.tex
      pdflatex -jobname=\jobname-temp tutorial-temp.tex
    }%
    \ifwindows%
      \immediate\write18{rename \jobname-temp.pdf \@StandaloneFile-temp.pdf}%
    \else%
      \immediate\write18{mv \jobname-temp.pdf \@StandaloneFile-temp.pdf}%
    \fi%
  \fi%
  \global\let\@StandaloneFile\relax%
}
%    \end{macrocode}
% \end{macro}^^A \tud@tut@pdf
% \begin{macro}{\IncludeStandalone}
% \changes{v2.02}{2014/09/10}{neu}%^^A
% Der Befehl \cs{IncludeStandalone} bindet die durch \env{Trunk!} generierten
% PDF-Dateien ein. Das angehängte optionale Argument dient zur Angabe der
% einzubindenden Seiten der PDF-Datei, wobei diese automatisch auf die passende
% Breite skaliert werden.
%    \begin{macrocode}
\NewDocumentCommand\IncludeStandalone{omO{1}}{%
  \IfFileExists{#2-temp.pdf}{%
    \@tempcnta\z@%
    \@for\@tempa:=#3\do{\advance\@tempcnta\@ne}%
    \ifnum\@tempcnta>\z@%
      \setlength{\@tempdima}{\textwidth}%
      \divide\@tempdima\@tempcnta%
      \advance\@tempcnta\m@ne%
      \multiply\@tempcnta 2%
      \addtolength{\@tempdima}{-\@tempcnta\tabcolsep}%
      \@for\@tempa:=#3\do{%
        \advance\@tempcnta\m@ne%
        \edef\@tempb{%
          keepaspectratio,page=\@tempa,width=\the\@tempdima,%
          \IfValueT{#1}{#1}%
        }
        \fbox{\expandafter\includegraphics\expandafter[\@tempb]{#2-temp.pdf}}%
        \ifnum\@tempcnta>\z@\hfill\fi%
      }%
    \fi%
  }{%
    \tud@shellescape@wrn%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \IncludeStandalone
% \begin{macro}{\StartTutorial}
% \changes{v2.02}{2014/08/21}{neu}%^^A
% \begin{macro}{\FinishTutorial}
% \changes{v2.02}{2014/08/21}{neu}%^^A
% Mit \cs{StartTutorial} wird ein Hyperlink für den Querverweis aus dem 
% Handbuch definiert. Außerdem wird gleich der Titel und ein einleitender Satz 
% gesetzt.
%    \begin{macrocode}
\newcommand\StartTutorial[1][%
  Bevor das eigentliche Tutorial beginnt, werden sowohl eine Dokumentklasse 
  als auch die f\"ur jedes \hologo{pdfLaTeX}-Dokument meiner Meinung nach 
  sinnvollen Pakete geladen.
]{%
  \Hy@raisedlink{\hyperdef{\jobname}{tutorials:\jobname}{}}%
  \faculty{}%
  \setlength\headingsvskip{-15mm}%
  \maketitle\noindent#1%
  \immediate\openout\tud@write@i=\jobname-preamble-temp.tex\relax
  \immediate\openout\tud@write@ii=\jobname-trunk-temp.tex\relax
  \immediate\write\tud@write@ii{^^J\string\begin{document}^^J}
}
%    \end{macrocode}
% Der Befehl \cs{FinishTutorial} schleißt den noch offenen Ausgabestream und
% gibt den vorgestellten Quelltext vollständig aus.
%    \begin{macrocode}
\newcommand\FinishTutorial[1][]{%
  \immediate\write\tud@write@ii{^^J\string\end{document}^^J}
  \immediate\closeout\tud@write@ii%
  \immediate\closeout\tud@write@i%
  \tud@tut@collect%
  \clearpage%
  \addsec{Copy~\&~Paste}%
  \pagestyle{empty}%
  Zum Ende des Dokumentes wird das vorgestellte Tutorial als \"ubersetzbarer 
  Quelltext ausgegeben, um dieses via Copy~\&~Paste verwenden und alle Punkte
  nachvollziehen zu k\"onnen. Bitte beachten Sie, dass~-- abh\"angig vom 
  genutzten PDF-Betrachter~-- beim Kopieren die dargestellten Einz\"uge und 
  Abs\"atze m\"oglicherweise verloren gehen k\"onnen. Dies kann insbesondere 
  aufgrund fehlender Leerzeilen zu einem unvorteilhaften Ausgabeergebnis 
  f\"uhren. Alternativ finden Sie den folgenden \hologo{LaTeX}-Quelltext auch 
  im Pfad \Path{texmf/source/latex/tudscr/doc/examples/} als Datei  
  \File{\jobname-example.tex}. \par #1
  \begin{quoting}[rightmargin=0pt]%
  \lstinputlisting[style=tudscr]{\jobname-example-temp.tex}%
  \end{quoting}%
}
%    \end{macrocode}
% \end{macro}^^A \FinishTutorial
% \end{macro}^^A \StartTutorial
% \begin{macro}{\tud@tut@readtostream}
% \changes{v2.02}{2014/12/16}{neu}%^^A
% \begin{macro}{\tud@tut@line}
% \changes{v2.02}{2014/08/19}{neu}%^^A
% \begin{macro}{\tud@tut@append}
% \changes{v2.02}{2014/08/19}{neu}%^^A
% \begin{macro}{\tud@tut@collect}
% \changes{v2.02}{2014/12/16}{neu}%^^A
% Bei den Tutorials soll zum Schluss ein komplett kompilierbares Beispiel für
% Copy~\&~Paste gegeben werden. Um dieses zusammenzubauen, werden alle im 
% Dokument innerhalb der Varianten der \env{Trunk}"=Umgebungen gegebenen
% Codefragmente zusammengesetzt. Um die Quelltexte einlesen und verarbeiten zu
% können, werden zwei Eingabe- sowie ein Ausgabestream benötigt, welche bereits 
% zuvor initilaisiert wurden.
%
% Mit \cs{tud@tut@readtostream} wird der Inhalt der Datei im ersten Argument 
% in den Ausgabestream des zweiten Argumentes geschrieben. Dies wird durch die
% Makros \cs{tud@tut@append} und \cs{tud@tut@collect} genutzt.
%    \begin{macrocode}
\newcommand*\tud@tut@line{}
\newcommand*\tud@tut@readtostream[2]{%
  \begingroup%
  \endlinechar=-1\relax%
  \openin\tud@read=#1%
%    \end{macrocode}
% Der Schalter \cs{if@tempswa} wird verwendet, um unnötige Leerzeilen in der
% Ausgabedatei zu entfernen. Wurde eine nicht leere Zeile gefunden, wird diese 
% auf jeden Fall geschrieben, indem \cs{@tempswatrue} gesetzt wird. Eine leere 
% Zeile wird~-- bis auf den Sonderfall, dass es sich um die letzte Zeile in der
% Datei handelt~-- zunächst nicht weiter beachtet. Im Zweifelsfall wird diese
% (erste) Leerzeile geschrieben. 
%    \begin{macrocode}
  \@tempswafalse%
  \loop\unless\ifeof\tud@read%
    \readline\tud@read to\tud@tut@line%
    \ifx\tud@tut@line\@empty%
      \ifeof\tud@read\@tempswafalse\fi%
    \else%
      \@tempswatrue%
    \fi%
%    \end{macrocode}
% Hier erfolgt das eigentliche Schreiben im selektierten Stream.
%    \begin{macrocode}
    \if@tempswa%
      \immediate\write#2{\unexpanded\expandafter{\tud@tut@line}}%
    \fi%
%    \end{macrocode}
% Im Nachgang wird überprüft, ob die aktuell geschriebene Zeile leer war. Ist 
% dies der Fall, so wird \cs{@tempswafalse} gesetzt, um eine etwaig folgende 
% Leerzeile nicht in die Ausgabedatei zu schrieben.
%    \begin{macrocode}
    \ifx\tud@tut@line\@empty\@tempswafalse\fi%
  \repeat%
  \closein\tud@read%
  \endgroup%
}
%    \end{macrocode}
% Der innerhalb der Umgebungen \env{Preamble} und \env{Trunk}~-- sowie deren 
% Derivaten~-- angegeben Inhalt wird beim Beenden dieser in die Hilfsdatei
% \cs{jobname-temp.tex} zwischengespeichert. Mit dem Befehl \cs{tud@tut@append}
% wird der Inhalt dieser Datei ausgelesen und den zusätzlichen Hilfsdateien
% \cs{jobname-preamble-temp.tex} beziehungsweise  \cs{jobname-trunk-temp.tex} 
% angehangen und damit gesichert, um Quelltextauszüge aus dem Tutorial für die
% Präambel sowie den Dokumentteil trennen beziehungsweise sortieren zu können.
%    \begin{macrocode}
\newcommand*\tud@tut@append[1]{\tud@tut@readtostream{\jobname-temp.tex}{#1}}
%    \end{macrocode}
% Das Makro \cs{tud@tut@collect} fügt alle Quelltexte des Tutorials, welche 
% nach Präambel und Dokumentteil sortiert wurden, in einer Datei zusammen. 
% Diese wird zum einen am Ende des Tutorials mit \cs{FinishTutorial} ausgeben, 
% zum anderen wird diese als Beispiel in den Ordner für Beispiele beim Erzeugen 
% eines Release kopiert.
%    \begin{macrocode}
\newcommand*\tud@tut@collect{%
  \immediate\openout\tud@write@ii\jobname-example-temp.tex\relax%
  \tud@tut@readtostream{\jobname-preamble-temp.tex}{\tud@write@ii}%
  \tud@tut@readtostream{\jobname-trunk-temp.tex}{\tud@write@ii}%
  \immediate\closeout\tud@write@ii
}
%    \end{macrocode}
% \end{macro}^^A \tud@tut@collect
% \end{macro}^^A \tud@tut@append
% \end{macro}^^A \tud@tut@line
% \end{macro}^^A \tud@tut@readtostream
%
% \iffalse
%</package>
% \fi
%
% \subsection{Ausgabe von Index und Änderungsliste}
%
% Ein Index kann sowhol mit dem Paket als auch mit der Klasse erzeugt werden, 
% die Änderungsliste ist der Klasse vorbehalten.
% \begin{macro}{\idxfont}
% Für zusätzliche Informationen im Index nach dem eigentlichen Eintrag wird 
% eine etwas kleinere Schrift verwendet.
%    \begin{macrocode}
\newcommand*\idxfont{}
\let\idxfont\footnotesize
\robustify{\idxfont}
%    \end{macrocode}
% \end{macro}^^A \idxfont
% \begin{macro}{\PrintIndex}
% \begin{macro}{\PrintIndexPrologue}
% \changes{v2.02}{2014/08/20}{neu}%^^A
% \begin{macro}{\@printindexprologue}
% \changes{v2.02}{2014/08/20}{neu}%^^A
% \begin{macro}{\@printindexskip}
% \changes{v2.02}{2014/09/02}{neu}%^^A
% \begin{macro}{\Index}
% \begin{macro}{\seeidx}
% \begin{macro}{\@printindex}
% \changes{v2.02}{2014/07/25}{neu}%^^A
% Der Befehl \cs{PrintIndex} ist die Zusammenfassung für die Ausgabe aller 
% Indexe.
%    \begin{macrocode}
\newcommand*\PrintIndex{%
  \begingroup%
%<*class>
    \@printindex%
%</class>
    \@printindex[options]%
    \@printindex[macros]%
%<*class>
    \@printindex[keys]%
    \@printindex[terms]%
    \begingroup%
      \let\lettergroup\@gobble%
      \let\indexspace\par%
      \@printindex[fonts]%
      \@printindex[colors]%
    \endgroup%
%</class>
    \@printindex[files]%
  \endgroup%
}
%    \end{macrocode}
% Hiermit kann der einleitende Teil für den allgemeinen Index gesetzt werden.
%    \begin{macrocode}
%<*class>
\newcommand*\PrintIndexPrologue[1]{\long\gdef\@printindexprologue{#1}}
\newcommand*\@printindexprologue{}
%</class>
%    \end{macrocode}
% Durch die Verwendung der \env{multicols}"=Umgebung werden zu große vertikale 
% Abstände gesetzt. Dies wird mit diesem Befehl rückgängig gemacht.
%    \begin{macrocode}
\newcommand*\@printindexskip{\ifnum\imki@columns>\@ne\vspace{-\multicolsep}\fi}
%    \end{macrocode}
% Der Befehl \cs{@printindex} setzt vor jedem Unterindex ein referenzierbares
% Label und gibt diesen danach aus.
%    \begin{macrocode}
\newcommand*\@printindex[1][]{%
  \pagebreak[3]%
  \apptocmd{\prepare@multicols}{\hbadness10000}{}{}%
%<*class>
  \ifblank{#1}{%
    \ifx\@printindexprologue\@empty%
      \indexprologue[\@printindexskip]{\manualhyperdef'{idx:main}}%
    \else%
      \indexprologue{%
        \manualhyperdef'{idx:main}%
        \@printindexprologue%
      }%
    \fi%
    \printindex\@printindexskip%
    \let\@printindexprologue\@empty%
  }{%
    \indexprologue[\@printindexskip]{\manualhyperdef'{idx:#1}}%
    \printindex[#1]\@printindexskip%
  }%
%</class>
%<*package>
  \indexprologue[\@printindexskip]{}%
  \printindex[#1]\@printindexskip%
%</package>
}
%    \end{macrocode}
% Der Befehl \cs{Index} dient zum Eintragen eines Schlagwortes im allgemeinen
% Index und verweist auf den speziellen, zum Schlagwort gehörigen Index. Das
% optionale Argument kann verwendet werden, um ggf. den Eintrag in den
% allgemeinen Index anders zu benennen, als den Verweis.
%    \begin{macrocode}
%<*class>
\newcommand*\seeidx[2]{\pageref{idx:#1}}
\NewDocumentCommand\Index{mom}{%
  \index{%
    #1!\textrightarrow{}\space%
    \manualhyperref{idx:#3}{Index der \IfValueTF{#2}{#2}{#1}}|seeidx{#3}%
  }%
}
%</class>
%    \end{macrocode}
% \end{macro}^^A \@printindex
% \end{macro}^^A \seeidx
% \end{macro}^^A \Index
% \end{macro}^^A \@printindexskip
% \end{macro}^^A \@printindexprologue
% \end{macro}^^A \PrintIndexPrologue
% \end{macro}^^A \PrintIndex
%
% \iffalse
%<*class>
% \fi
%
% \begin{macro}{\PrintChangelog}
% \begin{macro}{\if@changelog}
% \begin{macro}{\Changelog}
% \changes{v2.02}{2014/08/20}{neu}%^^A
% Ähnlich wie für den Index wird auch für die Änderungsliste verfahren.
%    \begin{macrocode}
\newif\if@changelog
\newcommand*\PrintChangelog{%
  \begingroup%
    \let\lettergroup\@gobble%
    \@changelogtrue%
    \@printindex[changelog]%
  \endgroup%
}
\NewDocumentCommand\Changelog{m}{%
  \index{%
    #1!\textrightarrow{}\space%
    \manualhyperref{idx:changelog}{\"Anderungsliste}|seeidx{changelog}%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \Changelog
% \end{macro}^^A \if@changelog
% \end{macro}^^A \PrintChangelog
%
% \iffalse
%</class>
%</body>
% \fi
%
% \Finale
%
\endinput
