% \CheckSum{2094}
% \iffalse meta-comment
%
%  TUD-Script -- Corporate Design of Technische Universität Dresden
% ----------------------------------------------------------------------------
%
%  Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2012-2020
%
% ----------------------------------------------------------------------------
%
%  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 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
%  in der Version 1.3c, verteilt und/oder verändert werden. Die aktuelle
%  Version dieser Lizenz ist http://www.latex-project.org/lppl.txt und
%  Version 1.3c oder später ist Teil aller Verteilungen von LaTeX 2005/12/01
%  oder später und dieses Werks. Dieses Werk hat den LPPL-Verwaltungs-Status
%  "author-maintained", wird somit 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-doc.dtx
%<*dtx>
% \fi
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\ProvidesFile{tudscr-doc.dtx}[2019/07/18 v2.06c TUD-Script\space%
  (source code documentation based on scrartcl/scrdoc)%
]
%
% \iffalse
\documentclass[english,ngerman,xindy]{tudscrdoc}
\iftutex
  \usepackage{fontspec}
\else
  \usepackage[T1]{fontenc}
  \usepackage[ngerman=ngerman-x-latest]{hyphsubst}
\fi
\usepackage{babel}
\usepackage{tudscrfonts}
\KOMAoptions{parskip=half-}
\usepackage{bookmark}
\usepackage[babel]{microtype}

\CodelineIndex
\RecordChanges
\GetFileInfo{tudscr-doc.dtx}
\title{\file{\filename}}
\author{Falk Hanisch\qquad\expandafter\mailto\expandafter{\tudscrmail}}
\date{\fileversion\nobreakspace(\filedate)}

\begin{document}
  \maketitle
  \tableofcontents
  \DocInput{\filename}
\end{document}
%</dtx>
% \fi
%
% \selectlanguage{ngerman}
%
% \changes{v2.03}{2015/01/09}{\cls{tudscrdoc}: Indextyp Seitenstilebene}^^A
% \changes{v2.05}{2016/04/21}{Verwendung von \app{texindy} möglich}^^A
%
% \section{Die Klasse \cls{tudscrdoc} -- Erweiterte Quelltextdokumentation}
%
% Mit dieser Klasse erfolgt die Quelltextdokumentation des \TUDScript-Bundles. 
% Sie lädt standarmäßig die Klasse \cls{ltxdoc}, ersetzt allerdings im Stile 
% von \cls{scrdoc} im Hintergrund \cls{article} durch \cls{scrartcl}.
%
% \StopEventually{\PrintIndex\PrintChanges\PrintToDos}
%
% \iffalse
%<*class&option>
% \fi
%
% Damit der zu \cls{scrartcl} gehörige Titel genutzt werden kann, wird dieser
% temporär gesichert.
%    \begin{macrocode}
\newcommand*\scr@maketitle{}%
\PassOptionsToClass{toc=left,fontsize=10pt}{scrartcl}%
\AfterClass{scrartcl}{\let\scr@maketitle\@maketitle}%
%    \end{macrocode}
% Der folgende Quelltext ist 1:1 aus \cls{scrdoc} kopiert.
%    \begin{macrocode}
\newcommand*\sd@saved@LoadClass{}
\let\sd@saved@LoadClass=\LoadClass
\renewcommand*\LoadClass[2][]{%
  \begingroup%
    \edef\@tempc{#2}\def\@tempb{article}%
    \ifx\@tempc\@tempb%
      \let\LoadClass\sd@saved@LoadClass%
      \def\@tempc{scrartcl}%
    \fi%
    \edef\@tempc{%
      \noexpand\endgroup\noexpand\sd@saved@LoadClass[{#1}]{\@tempc}}%
  \@tempc%
}
\newcommand*\sd@saved@PassOptionsToClass{}
\let\sd@saved@PassOptionsToClass=\PassOptionsToClass
\renewcommand*\PassOptionsToClass[2]{%
  \begingroup%
    \edef\@tempc{#2}\def\@tempb{article}%
    \ifx\@tempc\@tempb%
      \def\@tempc{scrartcl}%
    \fi%
    \edef\@tempc{%
      \noexpand\endgroup\noexpand\sd@saved@PassOptionsToClass{#1}{%
        \@tempc}}%
  \@tempc%
}
\LoadClassWithOptions{ltxdoc}[2015/03/26]
\setcounter{IndexColumns}{2}
\setcounter{StandardModuleDepth}{2}
%    \end{macrocode}
%
% \subsection{Klassenoptionen}
%
% \begin{option}{final}
% \begin{macro}{\tudfinalflag}
% Option bzw. Flag für das automatisierte Erzeugen der Quelltextdokumentation
% mit einem Skript ohne ToDo-Befehle.
%    \begin{macrocode}
\DeclareOption{final}{\let\tudfinalflag\relax}
%    \end{macrocode}
% \end{macro}^^A \tudfinalflag
% \end{option}^^A final
% \begin{option}{texindy}
% \changes{v2.05}{2016/04/21}{neu}^^A
% \begin{option}{xindy}
% \changes{v2.05}{2016/04/21}{neu}^^A
% \begin{option}{xdy}
% \changes{v2.05}{2016/04/21}{neu}^^A
% \begin{macro}{\tudxdyflag}
% \changes{v2.05}{2016/04/21}{neu}^^A
% Option(en) für das Erstellen der Indexdateien im Stil von \app{texindy}.
%    \begin{macrocode}
\DeclareOption{texindy}{\let\tudxdyflag\relax}
\DeclareOption{xindy}{\let\tudxdyflag\relax}
\DeclareOption{xdy}{\let\tudxdyflag\relax}
%    \end{macrocode}
% \end{macro}^^A \tudxdyflag
% \end{option}^^A xdy
% \end{option}^^A xindy
% \end{option}^^A texindy
% Die beiden Optionen werden abgearbeitet
%    \begin{macrocode}
\ProcessOptions\relax
%    \end{macrocode}
%
% \subsection{Ignorierte Makros bei der Nutzung von zusätzlichen Indexeinträgen}
%
% Befehle, welche bei der Verwendung von \cs{EnableCrossrefs} dennoch nicht im 
% Index erscheinen sollen.
%
% \begin{macro}{\DisableCrossrefsForced}
% \changes{v2.05i}{2017/03/02}{neu}^^A
% Deaktivieren von Makroeinträgen im Index nach der Verwendung von
% \cs{EnableCrossrefs}. Sollte in einer Gruppe genutzt werden!
%    \begin{macrocode}
\newcommand*\DisableCrossrefsForced{}
\let\DisableCrossrefsForced\DisableCrossrefs
%    \end{macrocode}
% \end{macro}^^A \DisableCrossrefsForced
%
% \begingroup%
% \DisableCrossrefsForced%
%    \begin{macrocode}
%^^A\DoNotIndex{\ ,\",\.,\@,\\,\{,\}}
%^^A\DoNotIndex{\@abstrtfalse,\@abstrttrue,\@addtoreset}
%^^A\DoNotIndex{\@afterheading,\@afterindentfalse}
%^^A\DoNotIndex{\@Alph,\@alph,\@arabic}
%^^A\DoNotIndex{\@beginparpenalty}
%^^A\DoNotIndex{\@car,\@cdr,\@centercr}
%^^A\DoNotIndex{\@dblfloat,\@dotsep,\@dottedtocline}
%^^A\DoNotIndex{\@empty,\@endparpenalty}
%^^A\DoNotIndex{\@float,\@fontswitch}
%^^A\DoNotIndex{\@gobbletwo}
%^^A\DoNotIndex{\@hangfrom,\@highpenalty}
%^^A\DoNotIndex{\@ifnextchar,\@ifundefined,\@itempenalty}
%^^A\DoNotIndex{\@latex@warning}
%^^A\DoNotIndex{\@M,\@m,\@medpenalty,\@minus,\@mkboth}
%^^A\DoNotIndex{\@mparswitchfalse,\@mparswitchtrue}
%^^A\DoNotIndex{\@ne,\@nil,\@nobreakfalse,\@nobreaktrue,\@nomath}
%^^A\DoNotIndex{\@plus}
%^^A\DoNotIndex{\@Roman,\@roman}
%^^A\DoNotIndex{\@tempa,\@tempb,\@tempc}
%^^A\DoNotIndex{\@tempcnta,\@tempcntb,\@tempcntc}
%^^A\DoNotIndex{\@tempdima,\@tempdimb,\@tempdimc}
%^^A\DoNotIndex{\@tempskipka,\@tempskipkb,\@tempskipkc}
%^^A\DoNotIndex{\@tempswafalse,\@tempswatrue,\@tempswbfalse,\@tempswbtrue}
%^^A\DoNotIndex{\@tocrmarg,\@topnewpage,\@topnum}
%^^A\DoNotIndex{\@twocolumnfalse,\@twocolumntrue,\@twosidefalse,\@twosidetrue}
%^^A\DoNotIndex{\@undefined,\@whiledim,\@whilenum}
%^^A\DoNotIndex{\addcontentsline,\addpenalty,\addtocontents}
%^^A\DoNotIndex{\addtolength,\addvspace,\advance}
%^^A\DoNotIndex{\begin,\begingroup,\bfseries,\box,\bullet}
%^^A\DoNotIndex{\c@figure,\c@page,\c@secnumdepth,\c@table,\c@tocdepth,\cdot}
%^^A\DoNotIndex{\centering,\changes,\cleardoublepage,\clearpage,\cmd}
%^^A\DoNotIndex{\CodelineIndex,\col@number,\cs,\CurrentOption}
%^^A\DoNotIndex{\dblfloatpagefraction,\dbltopfraction,\def,\divide,\DoNotIndex}
%^^A\DoNotIndex{\DeclareOldFontCommand,\DeclareOption,\DisableCrossrefs}
%^^A\DoNotIndex{\else,\em,\empty,\EnableCrossrefs,\end,\end@dblfloat,\end@float}
%^^A\DoNotIndex{\endgroup,\endlist,\endquotation,\endtitlepage,\everypar}
%^^A\DoNotIndex{\ExecuteOptions,\expandafter}
%^^A\DoNotIndex{\fboxrule,\fboxsep,\fi}
%^^A\DoNotIndex{\gdef,\global}
%^^A\DoNotIndex{\hangindent,\hbox,\hfil,\hrule,\hsize,\hskip,\hspace,\hss}
%^^A\DoNotIndex{\if,\if@tempswa,\ifcase,\ifdim,\ifnum,\ifodd,\ifx,\include}
%^^A\DoNotIndex{\input,\InputIfFileExists,\item,\itshape}
%^^A\DoNotIndex{\kern}
%^^A\DoNotIndex{\leavevmode,\leftmark,\leftskip,\let,\lineskip,\list,\long}
%^^A\DoNotIndex{\m@ne,\m@th,\marginpar,\markboth,\markright}
%^^A\DoNotIndex{\mathbf,\mathcal,\mathit,\mathnormal,\mathrm,\mathsf,\mathtt}
%^^A\DoNotIndex{\MessageBreak,\month}
%^^A\DoNotIndex{\newblock,\newcommand,\newcount,\newcounter,\newdimen}
%^^A\DoNotIndex{\newenvironment,\newlength,\newpage,\nobreak,\noindent}
%^^A\DoNotIndex{\normalcolor,\normalfont,\normallineskip,\normalsize}
%^^A\DoNotIndex{\null,\number,\numberline}
%^^A\DoNotIndex{\OldMakeindex,\OnlyDescription,\or,\overfullrule}
%^^A\DoNotIndex{\p@,\PackageError,\PackageInfo,\PackageWarningNoLine}
%^^A\DoNotIndex{\pagenumbering,\pagestyle,\par,\paragraph,\parbox}
%^^A\DoNotIndex{\PassOptionsToPackage,\pcal,\penalty,\protect,\providecommand}
%^^A\DoNotIndex{\PrintIndex,\PrintChanges,\ProcessOptions,\ProvidesClass}
%^^A\DoNotIndex{\raggedbottom,\raggedleft,\raggedright,\refstepcounter,\relax}
%^^A\DoNotIndex{\renewcommand,\RequirePackage,\reset@font,\rightmargin}
%^^A\DoNotIndex{\rightmark,\rightskip,\rmfamily}
%^^A\DoNotIndex{\scshape,\secdef,\setbox,\setcounter,\setlength,\settowidth}
%^^A\DoNotIndex{\sfcode,\sffamily,\skip,\sloppy,\slshape,\space,\string}
%^^A\DoNotIndex{\the,\thispagestyle,\ttfamily,\twocolumn,\typeout}
%^^A\DoNotIndex{\undefined,\usecounter}
%^^A\DoNotIndex{\vfil,\vfill,\vspace}
%^^A\DoNotIndex{\wd}
%^^A\DoNotIndex{\xdef}
%^^A\DoNotIndex{\year}
%^^A\DoNotIndex{\z@}
%    \end{macrocode}
% \endgroup%
%
% \iffalse
%</class&option>
%<*class&body>
% \fi
%
% \subsection{Definition und Erscheinungsbild von Deklarationselementen}
%
% Mit dem Paket~\pkg{dox} können weitere Deklarationselemente erstellt werden.
% Dieses lädt außerdem das Paket~\pkg{doc}, welches die Grundfunktionalitäten
% für die Erstellung von \file{.dtx}-Dateien bereitstellt. In der momentanen
% Version unterstützt das Paket~\pkg{dox} die aktuellen Anpassungen an die
% Erstellung von Änderungsnotizen durch \pkg{doc} nicht, weshalb im Folgenden
% einige Patches notwendig sind.
%    \begin{macrocode}
\RequirePackage{dox}[2010/12/16]
\@ifpackagelater{dox}{2017/12/07}{%
  \ClassWarning{\TUD@Class@Name}{%
    Package `dox' was updated so some patches\MessageBreak%
    are maybe outdated%
  }%
}{}%
%    \end{macrocode}
% \begin{macro}{\m@cro@}
% Nach dem Laden des Paketes werden die Definitionen einiger Makros überprüft.
%    \begin{macrocode}
\CheckCommand\m@cro@[2]{%
  \endgroup \topsep\MacroTopsep \trivlist
  \edef\saved@macroname{\string#2}%
  #1
    \let\saved@indexname\saved@macroname
  \else
    \edef\saved@indexname{\expandafter\@gobble\string#2}%
  \fi
  \def\makelabel##1{\llap{##1}}%
  \if@inlabel
    \let\@tempa\@empty \count@\macro@cnt
    \loop \ifnum\count@>\z@
      \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
    \edef\makelabel##1{\llap{\vtop to\baselineskip
                               {\@tempa\hbox{##1}\vss}}}%
    \advance \macro@cnt \@ne
  \else  \macro@cnt\@ne  \fi
  \edef\@tempa{\noexpand\item[%
     #1%
       \noexpand\PrintMacroName
     \else
       \noexpand\PrintEnvName
     \fi
     {\string#2}]}%
  \@tempa
  \global\advance\c@CodelineNo\@ne
   #1%
      \SpecialMainIndex{#2}\nobreak
      \DoNotIndex{#2}%
   \else
      \SpecialMainEnvIndex{#2}\nobreak
   \fi
  \global\advance\c@CodelineNo\m@ne
  \ignorespaces
}
%    \end{macrocode}
% \end{macro}^^A \m@cro@
%
% \subsubsection{Erweiterte Einträge für Index und Änderungsliste}
%
% \begin{macro}{\doxitem}
% Mit dem Befehl \cs{doxitem} werden beliebige Deklarationselemente erstellt. 
% das Makro wird für das Hinzufügen des Eintragstyps für Index, Änderungsliste 
% und Randnotiz angepasst.
%    \begin{macrocode}
\CheckCommand\doxitem[4][]{%
  \@nameuse{dox@macrolike\dox@macrolikedefault}%
  \def\dox@idxtype{#3}%
  \setkeys{dox}{#1}
  \@ifundefined{Print#2Name}{%
    \ifdox@macrolike
      \expandafter\def\csname Print#2Name\endcsname##1{%
        \strut\MacroFont\string ##1\ }
    \else
      \expandafter\def\csname Print#2Name\endcsname##1{%
        \strut\MacroFont ##1\ }
    \fi}{}
  \ifdox@macrolike
    \def\@doxexpr{\@doxcreatespecialmainmacrolikeindex{#2}}%
  \else
    \def\@doxexpr{\@doxcreatespecialmainindex{#2}}%
  \fi
  \expandafter\@doxexpr\expandafter{\dox@idxtype}{#4}%
  \@ifundefined{PrintDescribe#2}{%
    \ifdox@macrolike
      \expandafter\def\csname PrintDescribe#2\endcsname##1{%
        \strut\MacroFont\string ##1\ }
    \else
      \expandafter\def\csname PrintDescribe#2\endcsname##1{%
        \strut\MacroFont ##1\ }
    \fi}{}
  \ifdox@macrolike
    \def\@doxexpr{\@doxcreatespecialmacrolikeindex{#2}}%
  \else
    \def\@doxexpr{\@doxcreatespecialindex{#2}}%
  \fi
  \expandafter\@doxexpr\expandafter{\dox@idxtype}{#4}%
  \@doxcreatedescribe{#2}
  \@doxcreateenv{#2}{#3}
  \ifdox@macrolike
    \expandafter\let\csname @Save#2IndexName\endcsname%
      \@doxsavemacrolikeindexname%
  \else
    \expandafter\let\csname @Save#2IndexName\endcsname\@doxsaveindexname%
  \fi
}
%    \end{macrocode}
% Das Makro wird dahingehend angepasst, dass alle für die Ausgabe erzeugten 
% Befehle der Form  \cs{Print\meta{Typ}Name} und \cs{PrintDescribe\meta{Typ}}
% um den Eintragstyp ergänzt werden, erstellt durch \cs{doxcreateprintname} 
% bzw. \cs{doxcreatemacrolikeprintname}. Zusätzlich werden für die Klasse
% \cls{tudscrdoc} Befehle in der Form \cs{@Save\meta{Typ}IndexName} mit den 
% neuen Makros \cs{doxcreateindexname} bzw. \cs{doxcreatemacrolikeindexname} 
% erstellt. Mit diesen wird beim Aufruf einer Deklarationsumgebung der aktuelle
% Name und Eintragstyp des jeweiligen Deklarationselementes gesichert, um diese
% Informationen in der Änderungsliste nutzen zu können. Außerdem werden mit dem 
% Makro \cs{@doxcreatedescribes} Befehle erzeugt, mit denen eine Liste von zu 
% beschreibenden Elementen via \cs{DescribeOption\meta{Typ}s} erzeugt werden 
% kann. Dies dient insbesondere zum Erzeugen der Randnotizen mit \cs{marginnote}
% aus dem glecihnamigen Paket.
%    \begin{macrocode}
\renewcommand*\doxitem[4][]{%
  \@nameuse{dox@macrolike\dox@macrolikedefault}%
  \def\dox@idxtype{#3}%
  \setkeys{dox}{#1}%
  \ifdox@macrolike%
    \def\@doxexpr{\@doxcreatespecialmainmacrolikeindex{#2}}%
  \else%
    \def\@doxexpr{\@doxcreatespecialmainindex{#2}}%
  \fi%
  \expandafter\@doxexpr\expandafter{\dox@idxtype}{#4}%
  \ifdox@macrolike%
    \def\@doxexpr{\@doxcreatespecialmacrolikeindex{#2}}%
  \else%
    \def\@doxexpr{\@doxcreatespecialindex{#2}}%
  \fi%
  \expandafter\@doxexpr\expandafter{\dox@idxtype}{#4}%
  \ifdox@macrolike%
    \def\@doxexpr{\@doxcreatemacrolikeprintname{#2}}%
  \else%
    \def\@doxexpr{\@doxcreateprintname{#2}}%
  \fi%
  \expandafter\@doxexpr\expandafter{\dox@idxtype}%
  \ifdox@macrolike%
    \def\@doxexpr{\@doxcreatemacrolikeindexname{#2}}%
  \else%
    \def\@doxexpr{\@doxcreateindexname{#2}}%
  \fi%
  \expandafter\@doxexpr\expandafter{\dox@idxtype}%
  \@doxcreatedescribe{#2}%
  \@doxcreatedescribes{#2}%
  \@doxcreateenv{#2}{#3}%
}
%    \end{macrocode}
% \end{macro}^^A \doxitem
% \begin{macro}{\@doxcreatedescribes}
% \changes{v2.05i}{2017/03/09}{neu}^^A
% \begin{length}{\marginnotevskip}
% \changes{v2.05i}{2017/03/09}{neu}^^A
% \begin{macro}{\marginpar}
% Hiermit werden Befehle der Form \cs{DescribeOption\meta{Typ}s} erzeugt, mit 
% welchen mehrere Eintragstypen erzeugt werden können. Gleichzeitig werden die 
% Randnotizen via \cs{marginnote} mit den passenden vertikalen Abständen 
% erstellt.
%    \begin{macrocode}
\newlength\marginnotevskip
\newcommand*\@doxcreatedescribes[1]{%
  \expandafter\def\csname Describe#1s\endcsname##1{%
    \setlength\marginnotevskip{\z@}%
    \def\@tempc{##1}%
    \@for\@tempa:=\@tempc\do{%
      \expandafter\ifblank\expandafter{\@tempa}{}{%
        \edef\@tempb{%
          \expandonce{\csname Describe#1\endcsname}{\expandonce{\@tempa}}%
        }%
        \@tempb%
        \addtolength\marginnotevskip{\baselineskip}%
      }%
    }%
    \setlength\marginnotevskip{\z@}%
    \ignorespaces%
  }%
}
\@doxcreatedescribes{Macro}
\AfterPackage*{marginnote}{%
  \renewcommand*\marginpar[2][]{%
    \IfArgIsEmpty{#1}{%
      \marginnote{#2}[\marginnotevskip]%
    }{%
      \marginnote[{#1}]{#2}[\marginnotevskip]%
    }%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \marginpar
% \end{length}^^A \marginnotevskip
% \end{macro}^^A \@doxcreatedescribes
% \begin{macro}{\index@type}
% \changes{v2.05g}{2016/11/10}{neu}^^A
% Dieses Makro dient zur Formatierung des Typen der Deklarationselemente in 
% Index und Änderungsliste.
%    \begin{macrocode}
\newrobustcmd*\index@type[1]{%
  \begingroup%
  \normalfont\scriptsize\space(#1)%
  \endgroup%
}
%    \end{macrocode}
% \end{macro}^^A \index@type
% \begin{macro}{\@doxcreatespecialmainmacrolikeindex}
% \begin{macro}{\@doxcreatespecialmainindex}
% \begin{macro}{\@doxcreatespecialmacrolikeindex}
% \begin{macro}{\@doxcreatespecialindex}
% Für den Index muss bei diesen Makros eine Anpassung erfolgen, damit die
% Sortierung auch bei der Verwendung von \app{texindy} richtig erfolgt und 
% keine Einträge, welche es trotz gleicher Bezeichnung für unterschiedliche
% Deklarationselemente (beispielsweise Umgebung \env{abstract} und Option
% \opt{abstract}) gibt, unterschlagen werden. Außerdem wird hier die Definition
% der Quelltextanker eingehangen und die Elterneinträge für Parameteränderungen 
% zurückgesetzt.
%    \begin{macrocode}
\CheckCommand*\@doxcreatespecialmainmacrolikeindex[3]{%
  \expandafter\def\csname SpecialMain#1Index\endcsname##1{%
    \@SpecialIndexHelper@##1\@nil
    \@bsphack%
    \special@index{\@gtempa\actualchar
      \string\verb\quotechar*\verbatimchar\bslash\@gtempa\verbatimchar
      \space(#2)\encapchar main}%
    \special@index{#3:\levelchar\@gtempa\actualchar%
      \string\verb\quotechar*\verbatimchar\bslash\@gtempa\verbatimchar
      \encapchar main}%
    \@esphack%
  }%
}
%    \end{macrocode}
% Um den Typ der Deklarationselemente in den Index einzutragen, wird der Typ
% geschützt expandiert, um beispielsweise Umlaute problemlos nutzen zu können.
%    \begin{macrocode}
\renewcommand*\@doxcreatespecialmainmacrolikeindex[3]{%
  \expandafter\def\csname SpecialMain#1Index\endcsname##1{%
    \@SpecialIndexHelper@##1\@nil%
    \@bsphack%
    \protected@edef\tud@reserved{#2}%
    \special@index{%
      \@gtempa\space\expandonce\tud@reserved\actualchar%
      \string\verb\quotechar*\verbatimchar\bslash\@gtempa\verbatimchar%
      \index@type{\expandonce\tud@reserved}\encapchar main%
    }%
    \protected@edef\tud@reserved{#3}%
    \special@index{%
      \expandonce\tud@reserved:\levelchar\@gtempa\actualchar%
      \string\verb\quotechar*\verbatimchar\bslash\@gtempa\verbatimchar%
      \encapchar main%
    }%
    \@esphack%
    \let\parameter@parent@changes\relax%
    \hypersourcedef{\filesep\number\c@CodelineNo}%
  }%
}
\CheckCommand*\@doxcreatespecialmainindex[3]{%
  \expandafter\def\csname SpecialMain#1Index\endcsname##1{%
    \@bsphack%
    \special@index{##1\actualchar{\string\ttfamily\space##1} (#2)%
      \encapchar main}%
    \special@index{#3:\levelchar##1\actualchar{\string\ttfamily\space##1}%
      \encapchar main}%
    \@esphack%
  }%
}
\renewcommand*\@doxcreatespecialmainindex[3]{%
  \expandafter\def\csname SpecialMain#1Index\endcsname##1{%
    \@bsphack%
    \protected@edef\tud@reserved{#2}%
    \special@index{%
      ##1\space\expandonce\tud@reserved\actualchar%
      {\string\ttfamily\space##1}\index@type{\expandonce\tud@reserved}%
      \encapchar main%
    }%
    \protected@edef\tud@reserved{#3}%
    \special@index{%
      \expandonce\tud@reserved:\levelchar##1\actualchar%
      {\string\ttfamily\space##1}\encapchar main%
    }%
    \@esphack%
    \let\parameter@parent@changes\relax%
    \hypersourcedef{\filesep\number\c@CodelineNo}%
  }%
}
\CheckCommand*\@doxcreatespecialmacrolikeindex[3]{%
  \expandafter\def\csname Special#1Index\endcsname##1{%
    \@SpecialIndexHelper@##1\@nil
    \@bsphack%
    \index{\@gtempa\actualchar
      \string\verb\quotechar*\verbatimchar\bslash\@gtempa\verbatimchar
      \space(#2)\encapchar usage}%
    \index{#3:\levelchar\@gtempa\actualchar
      \string\verb\quotechar*\verbatimchar\bslash\@gtempa\verbatimchar
      \encapchar usage}%
    \@esphack%
  }%
}
\renewcommand*\@doxcreatespecialmacrolikeindex[3]{%
  \expandafter\def\csname Special#1Index\endcsname##1{%
    \@SpecialIndexHelper@##1\@nil%
    \@bsphack%
    \protected@edef\tud@reserved{#2}%
    \index{%
      \@gtempa\space\expandonce\tud@reserved\actualchar%
      \string\verb\quotechar*\verbatimchar\bslash\@gtempa\verbatimchar%
      \index@type{\expandonce\tud@reserved}\encapchar usage%
    }%
    \protected@edef\tud@reserved{#3}%
    \index{%
      \expandonce\tud@reserved:\levelchar\@gtempa\actualchar%
      \string\verb\quotechar*\verbatimchar\bslash\@gtempa\verbatimchar%
      \encapchar usage%
    }%
    \@esphack%
  }%
}
\CheckCommand*\@doxcreatespecialindex[3]{%
  \expandafter\def\csname Special#1Index\endcsname##1{%
    \@bsphack%
    \index{##1\actualchar{\protect\ttfamily##1} (#2)\encapchar usage}%
    \index{#3:\levelchar##1\actualchar{\protect\ttfamily##1}%
      \encapchar usage}%
    \@esphack%
  }%
}
\renewcommand*\@doxcreatespecialindex[3]{%
  \expandafter\def\csname Special#1Index\endcsname##1{%
    \@bsphack%
    \protected@edef\tud@reserved{#2}%
    \index{%
      ##1\space\expandonce\tud@reserved\actualchar%
      {\protect\ttfamily##1}\index@type{\expandonce\tud@reserved}%
      \encapchar usage%
    }%
    \protected@edef\tud@reserved{#3}%
    \index{%
      \expandonce\tud@reserved:\levelchar##1\actualchar%
      {\protect\ttfamily##1}\encapchar usage%
    }%
    \@esphack%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \@doxcreatespecialindex
% \end{macro}^^A \@doxcreatespecialmacrolikeindex
% \end{macro}^^A \@doxcreatespecialmainindex
% \end{macro}^^A \@doxcreatespecialmainmacrolikeindex
% \begin{macro}{\@doxcreatemacrolikeprintname}
% \begin{macro}{\@doxcreateprintname}
% \begin{macro}{\@doxcreatemacrolikeindexname}
% \begin{macro}{\@doxcreateindexname}
% \begin{macro}{\saved@indextype}
% Hiermit werden die Makros zur Ausgabe als Randnotiz definiert. Mit diesen
% wird dem eigentlichen Eintrag der Eintragstyp angehängt. Zu beachten ist, das 
% entgegen der ursprünglichen Definition \cs{strut} erst zum Schluss ausgeführt 
% wird. Somit lassen sich potenzielle Probleme mit dem Paket \pkg{microtype} 
% vermeiden.
%    \begin{macrocode}
\def\@doxcreatemacrolikeprintname#1#2{%
  \ifcsundef{Print#1Name}{%
    \expandafter\def\csname Print#1Name\endcsname##1{%
      \MacroFont\string##1\index@type{#2}\strut\ %
    }%
  }{}%
  \ifcsundef{PrintDescribe#1}{%
    \expandafter\def\csname PrintDescribe#1\endcsname##1{%
      \MacroFont\string##1\index@type{#2}\strut\ %
    }%
  }{}%
}
\def\@doxcreateprintname#1#2{%
  \ifcsundef{Print#1Name}{%
    \expandafter\def\csname Print#1Name\endcsname##1{%
      \MacroFont##1\index@type{#2}\strut\ %
    }%
  }{}%
  \ifcsundef{PrintDescribe#1}{%
    \expandafter\def\csname PrintDescribe#1\endcsname##1{%
      \MacroFont##1\index@type{#2}\strut\ %
    }%
  }{}%
}
%    \end{macrocode}
% Ziel ist es, in den 
% Makros \cs{saved@indexname} und \cs{saved@indextype} den Namen und den Typ 
% des aktuellen Deklarationselementes zu speichern.
%    \begin{macrocode}
\newcommand*\saved@indextype{}
\def\@doxcreatemacrolikeindexname#1#2{%
  \expandafter\def\csname @Save#1IndexName\endcsname##1{%
    \edef\saved@indexname{\expandafter\@gobble##1}%
    \protected@edef\saved@indextype{#2}%
  }%
}
\def\@doxcreateindexname#1#2{%
  \expandafter\def\csname @Save#1IndexName\endcsname##1{%
    \let\saved@indexname##1%
    \protected@edef\saved@indextype{#2}%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \saved@indextype
% \end{macro}^^A \@doxcreateindexname
% \end{macro}^^A \@doxcreatemacrolikeindexname
% \end{macro}^^A \@doxcreateprintname
% \end{macro}^^A \@doxcreatemacrolikeprintname
% \begin{macro}{\@SaveMacroIndexName}
% \begin{macro}{\@SaveEnvIndexName}
% \begin{macro}{\SpecialMainMacroIndex}
% Da für Makros die notwendigen Befehle für die Anpassungen der Änderungsliste
% nicht über \cs{doxitem} kreiert werden, erfolgt dies hier direkt.
%    \begin{macrocode}
\CheckCommand*\@SaveMacroIndexName[1]{%
  \edef\saved@indexname{\expandafter\@gobble#1}%
}
\CheckCommand*\@SaveEnvIndexName[1]{\let\saved@indexname#1}
\apptocmd{\@SaveMacroIndexName}{%
  \let\saved@indextype\@empty%
}{}{\tud@patch@wrn{@SaveMacroIndexName}}
\CheckCommand*\SpecialMainMacroIndex[1]{%
  \SpecialMainIndex{#1}\nobreak%
  \DoNotIndex{#1}%
}
\apptocmd{\SpecialMainMacroIndex}{%
  \let\parameter@parent@changes\relax%
  \hypersourcedef{\filesep\number\c@CodelineNo}%
}{}{\tud@patch@wrn{SpecialMainMacroIndex}}
%    \end{macrocode}
% \end{macro}^^A \SpecialMainMacroIndex
% \end{macro}^^A \@SaveEnvIndexName
% \end{macro}^^A \@SaveMacroIndexName
%
% \subsubsection{Erstellen aller Deklarationselemente}
%
% Nachdem nun die Anpassungen für die Änderungsliste erfolgt sind, können nun 
% die für die Dokumentatiton notwendigen Umgebungen mit \cs{docitem} erstellt
% werden. Dabei kommen die Lokalisierungsvariablen \cs{tud@\dots{}@name} zum 
% Tragen.
%    \begin{macrocode}
\renewcommand*\tud@reserved[3][]{%
  \doxitem[#1,idxtype=\csname tud@#3@name\endcsname]{#2}{#3}{%
    \csname tud@#3s@name\endcsname%
  }%
}
\undef\PrintEnvName
\undef\PrintDescribeEnv
\tud@reserved{Env}{environment}
\tud@reserved{Option}{option}
\tud@reserved{LayerPageStyle}{layerpagestyle}
\tud@reserved{Layer}{layer}
\tud@reserved[macrolike]{Length}{length}
\tud@reserved{Counter}{counter}
\tud@reserved{Color}{TUDcolor}
\tud@reserved[macrolike]{Localization}{localization}
\tud@reserved[macrolike]{Field}{field}
\tud@reserved{Font}{KOMAfont}
\tud@reserved{Parameter}{parameter}
%    \end{macrocode}
%
% \subsubsection{Besonderheiten des Deklarationselementes \emph{Parameter}}
%
% \begin{macro}{\parameter@parent@changes}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\parameter@parent@indexname}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\parameter@parent@indexformat}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% Um für Parameter sowohl im Index als auch in der Änderungsliste eine weitere 
% Ebene zu definieren, werden diese Befehle eigens definiert. 
%    \begin{macrocode}
\newcommand*\parameter@parent@changes{}
\let\parameter@parent@changes\relax
\newcommand*\parameter@parent@indexname{}
\let\parameter@parent@indexname\relax
\newcommand*\parameter@parent@indexformat{}
\let\parameter@parent@indexformat\relax
%    \end{macrocode}
% \end{macro}^^A \parameter@parent@indexformat
% \end{macro}^^A \parameter@parent@indexname
% \end{macro}^^A \parameter@parent@changes
% \begin{macro}{\@SaveMacroIndexName}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\@SaveEnvIndexName}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% Bei der Ausführung einer dieser beiden Befehle bei der Definition von einem 
% Makro oder einer Umgebung werden diese für evtl. nachfolgende Parameter als 
% Elterneinträge definiert. Hierfür werden die Einträge zur Sortierung sowohl 
% für den Index als auch die Änderungsliste in \cs{parameter@parent@indexname} 
% und für die Formatierung in \cs{parameter@parent@indexformat} gespeichert.
%    \begin{macrocode}
\apptocmd{\@SaveMacroIndexName}{%
  \edef\parameter@parent@indexname{\expandafter\@gobble#1}%
  \edef\parameter@parent@indexformat{%
    \string\verb\quotechar*\verbatimchar#1\verbatimchar%
  }%
}{}{\tud@patch@wrn{@SaveMacroIndexName}}
\apptocmd{\@SaveEnvIndexName}{%
  \protected@edef\parameter@parent@indexname{#1\space\saved@indextype}%
  \protected@edef\parameter@parent@indexformat{%
    \string\verb\quotechar*\verbatimchar#1\verbatimchar%
    \index@type{\saved@indextype}%
  }%
}{}{\tud@patch@wrn{@SaveEnvIndexName}}
%    \end{macrocode}
% \end{macro}^^A \@SaveEnvIndexName
% \end{macro}^^A \@SaveMacroIndexName
% \begin{macro}{\SpecialMainParameterIndex}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% Hier wird nun die Gestalt der Einträge für Parameter als Haupteintrag 
% festgelegt.
%    \begin{macrocode}
\renewcommand*\SpecialMainParameterIndex[1]{%
  \ifx\parameter@parent@indexname\relax%
    \ClassError{\TUD@Class@Name}{No previous macro or environment}{%
      Since parameters can only be used for macros or\MessageBreak%
      environments, you have to use `parameter' within\MessageBreak%
      `macro' or `environment'.%
    }%
  \fi%
  \protected@edef\parameter@parent@changes{%
    \parameter@parent@indexname\actualchar%
    \parameter@parent@indexformat:\levelchar%
  }%
  \@bsphack%
  \special@index{%
    \parameter@parent@indexname\actualchar%
    \parameter@parent@indexformat\levelchar%
    #1\space\tud@parameter@name\actualchar%
    {\string\ttfamily\space#1}\index@type{\tud@parameter@name}%
    \encapchar main%
  }%
  \special@index{%
    \tud@parameters@name:\levelchar%
    #1\space\parameter@parent@indexname%
    \actualchar{\string\ttfamily\space#1}%
    \noexpand\,--\noexpand\,\parameter@parent@indexformat%
    \encapchar main%
  }%
  \@esphack%
  \hypersourcedef{\filesep\number\c@CodelineNo}%
}
%    \end{macrocode}
% \end{macro}^^A \SpecialMainParameterIndex
% \begin{environment}{DescribeParameterParent}
% \changes{v2.05i}{2017/02/20}{neu}^^A
% \begin{macro}{\SpecialParameterIndex}
% \changes{v2.05i}{2017/02/20}{neu}^^A
% Selbiges für die Verwendung durch \cs{Describe\dots}
%    \begin{macrocode}
\newenvironment{DescribeParameterParent}[2]{%
  \@nameuse{@Save#1IndexName}{\string#2}%
}{}
\renewcommand*\SpecialParameterIndex[1]{%
  \ifx\parameter@parent@indexname\relax%
    \ClassError{\TUD@Class@Name}{No previous macro or environment}{%
      Since parameters can only be used for macros or\MessageBreak%
      environments, you have to use macro\MessageBreak%
      `\string\DescribeParameter' only within the environment\MessageBreak%
      `DescribeParameterParent'.%
    }%
  \fi%
  \@bsphack%
  \index{%
    \parameter@parent@indexname\actualchar%
    \parameter@parent@indexformat\levelchar%
    #1\space\tud@parameter@name\actualchar%
    {\protect\ttfamily#1}\index@type{\tud@parameter@name}%
    \encapchar usage%
  }%
  \index{%
    \tud@parameters@name:\levelchar#1\space\parameter@parent@indexname%
    \actualchar{\protect\ttfamily#1}%
    \noexpand\,--\noexpand\,\parameter@parent@indexformat%
    \encapchar usage%
  }%
  \@esphack%
}
%    \end{macrocode}
% \end{macro}^^A \SpecialParameterIndex
% \end{environment}^^A DescribeParameterParent
%
% \subsubsection{Erzeugen von Änderungseinträgen}
%
% \begin{macro}{\changes@}
% Bei der Erstellung der Änderungsliste fehlt bei Makros in der aktuellen 
% Version von \pkg{doc} ein Leerzeichen. Das Problem ist bereits gemeldet. 
%    \begin{macrocode}
\CheckCommand*\changes@[3]{%
  \protected@edef\@tempa{%
    \noexpand\glossary{%
      #1\levelchar
      \ifx\saved@macroname\@empty
        \space
        \actualchar
        \generalname
      \else
        \saved@indexname
        \actualchar
        \string\verb\quotechar*%
        \verbatimchar\saved@macroname
        \verbatimchar
      \fi
      :\levelchar #3%
    }%
  }%
  \@tempa\endgroup\@esphack%
}
%    \end{macrocode}
% Bei der Erzeugung der Änderungseinträge wird zwischen der Verwendung von 
% \app{makeindex} und \app{texindy} unterschieden. Für die Reihenfolge des 
% Erscheinens der einzelnen Einträge wird das angegebene Datum zur Sortierung 
% genutzt.
%    \begin{macrocode}
\ifdefined\tudxdyflag%
  \renewcommand*\changes@[3]{%
%    \end{macrocode}
% Einträge sollen nur erzeugt werden, wenn diese vollständig sind.
%    \begin{macrocode}
    \@tempswatrue%
    \ifblank{#1}{\@tempswafalse}{}%
    \ifblank{#3}{\@tempswafalse}{}%
    \if@tempswa%
%    \end{macrocode}
% Es wird dabei unterschieden, ob der Änderungseintrag einem Parameter gilt. 
% Ist dies nicht der Fall, so wird der Eintrag mehr oder weniger standardmäßig 
% erzeugt.
%    \begin{macrocode}
      \ifx\parameter@parent@changes\relax%
        \protected@edef\@tempb{%
          \saved@indexname%
          \ifx\saved@indextype\@empty\else%
            \space\saved@indextype%
          \fi%
          \actualchar%
          \string\verb\quotechar*%
          \verbatimchar\saved@macroname%
          \verbatimchar%
          \ifx\saved@indextype\@empty\else%
            \index@type{\saved@indextype}%
          \fi%
          :\levelchar%
        }%
%    \end{macrocode}
% Andernfalls wird eine zusätzliche Ebene vor dem eigentlichen Eintrag des
% Parameters erzeugt und der zuvor in \cs{parameter@parent@changes} gesicherte 
% Elterneintrag~-- Befehl oder Umgebung~-- dafür eingefügt.
%    \begin{macrocode}
      \else%
        \protected@edef\@tempb{%
          \parameter@parent@changes%
          \saved@indexname%
          \ifx\saved@indextype\@empty\else%
            \space\saved@indextype%
          \fi%
          \actualchar%
%    \end{macrocode}
% Der so erzeugte Änderungseintrag soll durch \app{texindy} bei der Erzeugung 
% der Änderungsliste noch speziell sortiert werden. Daher wird nicht \cs{verb} 
% sondern lediglich \cs{ttfamily} verwendet.
%    \begin{macrocode}
          {\noexpand\ttfamily\saved@macroname}%
          \ifx\saved@indextype\@empty\else%
            \index@type{\saved@indextype}%
          \fi%
          :\levelchar%
        }%
      \fi%
      \protected@edef\@tempa{%
        \noexpand\glossary{%
          #1\levelchar%
          \ifx\saved@macroname\@empty%
            \tud@general@name%
          \else%
            \tud@implementation@name%
          \fi%
          \levelchar%
          \ifx\saved@macroname\@empty\else%
            \@tempb%
          \fi%
          #2 #3%
          \actualchar%
          #3% (#2)%
        }%
      }%
    \else%
      \let\@tempa\relax%
    \fi%
    \@tempa\endgroup\@esphack%
  }%
\else%
%    \end{macrocode}
% Für \app{makeindex} wird der Befehl insebsondere für das Listen der Parameter 
% angepasst.
%    \begin{macrocode}
  \renewcommand*\changes@[3]{%
    \protected@edef\@tempa{%
      \noexpand\glossary{%
        #1\levelchar%
        \ifx\saved@macroname\@empty%
          \quotechar!%
          \actualchar%
          \tud@general@name%
          :\levelchar%
        \else%
          \ifx\parameter@parent@changes\relax\else%
            \parameter@parent@changes zzz\space%
          \fi%
          \saved@indexname%
          \ifx\saved@indextype\@empty\else%
            \space\saved@indextype%
          \fi%
          \actualchar%
          \string\verb\quotechar*%
          \verbatimchar\saved@macroname%
          \verbatimchar%
          \ifx\saved@indextype\@empty\else%
            \index@type{\saved@indextype}%
          \fi%
          \ifx\parameter@parent@changes\relax%
            :\levelchar%
          \else%
            :\space%
          \fi%
        \fi%
        #3%
      }%
    }%
    \@tempa\endgroup\@esphack%
  }%
\fi%
%    \end{macrocode}
% \end{macro}^^A \changes@
% \begin{macro}{\@wrglossary}
% Für die Ausgabe der Änderungsliste soll nicht einfach nur die Seitenzahl 
% sondern zumindest für die Implementierungen die Codezeile ausgegeben werden.
%    \begin{macrocode}
\CheckCommand*\@wrglossary[1]{%
  \protected@write\@glossaryfile{}%
  {\string\glossaryentry{#1}{\thepage}}%
  \endgroup
  \@esphack%
}
%    \end{macrocode}
% Allgemeine Einträge werden mit Seitenzahlenerzeugt. Für Einträge bzgl. einer 
% Implementierungen werden Codezeilen als Basis verwendet, falls aktiv.
%    \begin{macrocode}
\def\@wrglossary#1{%
  \ifx\saved@macroname\@empty%
    \protected@write\@glossaryfile{}{%
      \string\glossaryentry{#1|usage}{\thepage}%
    }%
  \else%
    \ifcodeline@index%
      \global\advance\c@CodelineNo\@ne%
      \protected@write\@glossaryfile{}{%
        \string\glossaryentry{#1|main}{\filesep\number\c@CodelineNo}%
      }%
      \global\advance\c@CodelineNo\m@ne%
    \else%
      \protected@write\@glossaryfile{}{%
        \string\glossaryentry{#1|main}{\thepage}%
      }%
    \fi%
  \fi%
  \endgroup%
  \@esphack%
}
%    \end{macrocode}
% \end{macro}^^A \@wrglossary
%
% \subsubsection{Erscheinung von Einträgen in der Änderungsliste}
%
% \begin{macro}{\tud@lst@def}
% \changes{v2.05}{2016/04/25}{neu}^^A
% \begin{macro}{\tud@lst@values}
% \changes{v2.05}{2016/04/25}{neu}^^A
% \begin{macro}{\if@tud@lst@multi}
% \changes{v2.05}{2016/04/25}{neu}^^A
% \begin{macro}{\tud@lst@init}
% \changes{v2.05}{2016/04/25}{neu}^^A
% \begin{macro}{\tud@lst@add}
% \changes{v2.05}{2016/04/25}{neu}^^A
% \begin{macro}{\tud@lst@process}
% \changes{v2.05}{2016/04/25}{neu}^^A
% \begin{macro}{\tud@lst@@values}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\if@tud@lst@@multi}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@lst@@init}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@lst@@add}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@lst@@process}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@lst@subsub}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@lst@subsubsub}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\subsubsubitem}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\efil}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% Falls für die Sortierung der Änderungsliste in \cls{tudscrdoc} \app{texindy}
% zum Einsatz kommt, wird bei der Beschreibung von Einträgen oder Parametern
% nur dann eine Unterebene verwendet, wenn zu einem Eintrag mehrere Angaben
% existieren. Sollte nur eine Anmerkung vorhanden sein, wird diese direkt in
% der dazugehörigen Ebene nach dem Eintrag selbst ausgegeben.
%    \begin{macrocode}
\newcommand*\tud@lst@subsub{}
\newcommand*\tud@lst@subsubsub{}
\newcommand*\subsubsubitem{\@idxitem\hspace*{35\p@}}
\newcommand*\efil{\hfil\nopagebreak}%
\newcommand*\tud@lst@def{%
  \newcommand*\tud@lst@values{}%
  \newif\if@tud@lst@multi%
  \newcommand*\tud@lst@init{%
    \let\tud@lst@values\relax%
    \let\tud@lst@subsub\relax%
    \@tud@lst@multifalse%
  }%
  \newcommand*\tud@lst@add[1]{%
    \ifx\tud@lst@values\relax\else%
      \@tud@lst@multitrue%
      \def\tud@lst@subsub{\subsubitem}%
    \fi%
    \listadd\tud@lst@values{\tud@lst@subsub ##1}%
  }%
  \newcommand*\tud@lst@process{%
    \if@tud@lst@multi%
      \preto\tud@lst@values{\efill}%
    \fi%
    \forlistloop{}{\tud@lst@values}%
    \tud@lst@init%
  }%
  \newcommand*\tud@lst@@values{}%
  \newif\if@tud@lst@@multi%
  \newcommand*\tud@lst@@init{%
    \let\tud@lst@@values\relax%
    \def\tud@lst@subsub{\subsubitem}%
    \def\tud@lst@subsubsub{\space}%
    \@tud@lst@@multifalse%
  }%
  \newcommand*\tud@lst@@add[1]{%
    \@tud@lst@multitrue%
    \ifx\tud@lst@@values\relax\else%
      \@tud@lst@@multitrue%
      \def\tud@lst@subsubsub{\subsubsubitem}%
    \fi%
    \listadd\tud@lst@@values{##1}%
  }%
  \newcommand*\tud@lst@@process{%
    \if@tud@lst@@multi%
      \appto\tud@lst@values{\efill}%
    \fi%
    \edef\tud@reserved####1{%
      \noexpand\listadd\noexpand\tud@lst@values{%
        \expandonce\tud@lst@subsubsub####1%
      }%
    }%
    \forlistloop{\tud@reserved}{\tud@lst@@values}%
    \tud@lst@@init%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \efil
% \end{macro}^^A \subsubsubitem
% \end{macro}^^A \tud@lst@subsubsub
% \end{macro}^^A \tud@lst@subsub
% \end{macro}^^A \tud@lst@@process
% \end{macro}^^A \tud@lst@@add
% \end{macro}^^A \tud@lst@@init
% \end{macro}^^A \if@tud@lst@@multi
% \end{macro}^^A \tud@lst@@values
% \end{macro}^^A \tud@lst@process
% \end{macro}^^A \tud@lst@add
% \end{macro}^^A \tud@lst@init
% \end{macro}^^A \if@tud@lst@multi
% \end{macro}^^A \tud@lst@values
% \end{macro}^^A \tud@lst@def
%
% \subsubsection{Erzeugen von Index und Änderungsliste}
%
% \begin{macro}{\tud@write@replace}
% \changes{v2.05}{2016/04/21}{neu}^^A
% \begin{macro}{\tud@read@replace}
% \changes{v2.05}{2016/04/21}{neu}^^A
% \begin{macro}{\tud@line@replace}
% \changes{v2.05}{2016/04/21}{neu}^^A
% \begin{macro}{\actualchar}
% \begin{macro}{\quotechar}
% \begin{macro}{\levelchar}
% Damit die erzeugten Dateien für Index und Änderungsliste von \app{texindy} 
% verarbeitet werden können, müssen einige Steuerzeichen in der originalen 
% \file{.ind}-Datei getauscht werden. Dafür wird diese zeilenweise eingelesen, 
% die fraglichen Zeichen ersetzt und in eine weitere Hilfsdatei geschrieben.
%    \begin{macrocode}
\ifdefined\tudxdyflag
  \newcommand*\tud@write@replace{}%
  \newwrite\tud@write@replace%
  \newcommand*\tud@read@replace{}%
  \newread\tud@read@replace%
%    \end{macrocode}
% Die Makros für die fraglichen Steuerzeichen werden so angepasst, dass die
% Wahrscheinlichkeit für eine Verwendung dieser Kombination in einem Makro- 
% oder Umgebungsnamen sehr gering ist. Anschließend werden die erzeugten 
% Hilfsdateien für Index und Änderungsliste für \app{texindy} angepasst. Dabei 
% werden diese automatisch erzeugt, falls dies möglich ist.
%    \begin{macrocode}
  \def\actualchar{<|1|>}%
  \def\quotechar{<|2|>}%
  \def\levelchar{<|3|>}%
  \begingroup%
    \endlinechar=\m@ne\relax%
    \def\tud@reserved#1#2{%
      \IfFileExists{\jobname.#1}{%
        \immediate\openin\tud@read@replace=\jobname.#1\relax%
        \immediate\openout\tud@write@replace=\jobname-xdy.#1\relax%
        \@tempswafalse%
        \loop\unless\ifeof\tud@read@replace%
          \readline\tud@read@replace to\tud@line@replace%
          \tud@replace\tud@line@replace{"}{""}%
          \tud@replace\tud@line@replace{!}{"!}%
          \tud@replace\tud@line@replace{:}{":}%
          \tud@replace\tud@line@replace{@}{"@}%
          \tud@replace\tud@line@replace{\"@}{"\@backslashchar"@}%
          \expandafter\tud@replace\expandafter\tud@line@replace%
            \expandafter{\actualchar}{@}%
          \expandafter\tud@replace\expandafter\tud@line@replace%
            \expandafter{\quotechar}{"}%
          \expandafter\tud@replace\expandafter\tud@line@replace%
            \expandafter{\levelchar}{!}%
          \tud@replace\tud@line@replace{" @}{}%
          \ifeof\tud@read@replace\else%
            \immediate\write\tud@write@replace{%
              \unexpanded\expandafter{\tud@line@replace}%
            }%
            \@tempswatrue%
          \fi%
        \repeat%
        \immediate\closein\tud@read@replace%
        \immediate\closeout\tud@write@replace%
        \ifnum\pdf@shellescape=\@ne\relax%
          \if@tempswa%
            \ShellEscape{%
              texindy\space%
                -o \jobname.#2\space%
                -M \@currname-#2.xdy\space%
                -t \jobname-#2.xlg\space%
              \jobname-xdy.#1%
            }%
%    \end{macrocode}
% Falls nichts geschrieben wurde, wird eine leere Ausgabedatei erzeugt.
%    \begin{macrocode}
          \else%
            \immediate\openout\tud@write@replace=\jobname.#2\relax%
            \immediate\closeout\tud@write@replace%
          \fi%
        \fi%
      }{}%
    }%
    \tud@reserved{idx}{ind}%
    \tud@reserved{glo}{gls}%
  \endgroup%
%    \end{macrocode}
% Sollte \app{texindy} nicht aktiv sein, werden Index und Änderungsliste mit 
% \app{makeindex} automatisch erzeugt.
%    \begin{macrocode}
\else
  \ifnum\pdf@shellescape=\@ne\relax%
    \ShellEscape{%
      makeindex -s gglo.ist -t \jobname.glg -o \jobname.gls \jobname.glo%
    }%
    \ShellEscape{%
      makeindex -s gind.ist -t \jobname.ilg -o \jobname.ind \jobname.idx%
    }%
  \fi%
\fi
%    \end{macrocode}
% \end{macro}^^A \levelchar
% \end{macro}^^A \quotechar
% \end{macro}^^A \actualchar
% \end{macro}^^A \tud@line@replace
% \end{macro}^^A \tud@read@replace
% \end{macro}^^A \tud@write@replace
% Jetzt werden noch die Einleitungen für Index und Änderungsliste angepasst.
%    \begin{macrocode}
\IndexPrologue{\addsec{\indexname}\tud@index@text}
\GlossaryPrologue{\addsec{\tud@changes@name}}
%    \end{macrocode}
%
% \subsection{ToDo-Liste}
%
% \begin{macro}{\PrintToDos}
% \changes{v2.05}{2016/05/19}{neu}^^A
% \begin{macro}{\@docinclude}
% Für ToDo-Notizen wird am Ende eine Liste aller offenen Punkte ausgegeben.
%    \begin{macrocode}
\DeclareNewTOC[%
  type=todo,%
  listname={\tud@todo@name},%
  name=ToDo,%
  tocentryindent=\z@,%
  owner=\@currname,%
]{tdo}
\setuptoc{tdo}{totoc}
\newcommand*\PrintToDos{\ifdefined\tudfinalflag\else\listoftodos\fi}
%    \end{macrocode}
% Damit die Liste der ToDo-Notizen bei der Erzeugung der gesamten Dokumentation 
% des Quelltextes einmalig sowie vollständig und nicht nach jeder Quelldatei 
% einzeln ausgegeben wird, muss der Befehl \cs{@docinclude} angepasst werden.
%    \begin{macrocode}
\patchcmd{\@docinclude}{%
  \let\@ltxdoc@PrintIndex\PrintIndex
  \let\PrintIndex\relax
  \let\@ltxdoc@PrintChanges\PrintChanges
  \let\PrintChanges\relax
}{%
  \let\@ltxdoc@PrintIndex\PrintIndex
  \let\PrintIndex\relax
  \let\@ltxdoc@PrintChanges\PrintChanges
  \let\PrintChanges\relax
  \let\@ltxdoc@PrintToDos\PrintToDos
  \let\PrintToDos\relax
}{}{\tud@patch@wrn{@docinclude}}
\patchcmd{\@docinclude}{%
  \let\PrintIndex\@ltxdoc@PrintIndex
  \let\PrintChanges\@ltxdoc@PrintChanges
}{%
  \let\PrintIndex\@ltxdoc@PrintIndex
  \let\PrintChanges\@ltxdoc@PrintChanges
  \let\PrintToDos\@ltxdoc@PrintToDos
}{}{\tud@patch@wrn{@docinclude}}
%    \end{macrocode}
% \end{macro}^^A \@docinclude
% \end{macro}^^A \PrintToDos
% \begin{macro}{\ToDo}
% \changes{v2.02}{2014/07/25}{neu}^^A
% \begin{macro}{\@ToDo}
% \changes{v2.02}{2014/07/25}{neu}^^A
% Die Befehle für die ToDo-Notizen. Um in der gleichen Nomenklatur wie beim
% Handbuch bleiben zu können, wird die Randnotizmarke als optionales Argument
% hinter dem eigentlichen Text angegeben.
%    \begin{macrocode}
\newcommand*\ToDo[2][]{%
  \kernel@ifnextchar[{\@ToDo{#2}}{\@ToDo{#2}[]}%
}
\newcommand*\@ToDo{}
\def\@ToDo#1[#2]{%
  \ifdefined\tudfinalflag\else%
    \begingroup%
      \csuse{phantomsection}%
      \IfArgIsEmpty{#2}{%
        \def\tud@reserved{??}%
      }{%
        \def\tud@reserved{#2}%
      }%
      \endgraf%
      \hfuzz0.8pt%
      \leavevmode%
      \def\@tempa{\raggedleft\fbox{ToDo:\space\tud@reserved\strut}}%
      \ifdefined\marginnote%
        \expandafter\marginnote\expandafter{\@tempa}[%
          \dimexpr-\fboxsep-\fboxrule\relax%
        ]%
      \else%
        \expandafter\marginpar\expandafter{\@tempa}%
      \fi%
      \fbox{\parbox{\dimexpr\textwidth-2\fboxsep\relax}{#1\strut}}%
      \endgraf%
%    \end{macrocode}
% Werden mit \cs{DocInclude} mehrere Dateien in das Dokument eingefügt, so 
% erhält die ToDo-Notiz einen entsprechenden Hinweis.
%    \begin{macrocode}
      \let\@tempa\@empty%
      \ifdefined\currentfile%
        \def\@tempa{\,--\,\texttt{\currentfile}}%
      \fi%
      \addxcontentsline{tdo}{todo}{\tud@reserved\@tempa:\space#1}%
    \endgroup%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \@ToDo
% \end{macro}^^A \ToDo
%
% \subsection{Schriften und Satzspiegel}
%
% \begin{macro}{\MacroFont}
% \begin{macro}{\AltMacroFont}
% Wird das Paket \pkg{mweights} geladen, so soll der passende Schriftschnitt 
% für die ausgewählten TypeWriter-Schriften genutzt werden. Damit dies mit dem 
% Paket \pkg{doc} funktioniert, muss der Befehl \cs{MacroFont} angepasst werden.
%    \begin{macrocode}
\AfterPackage{mweights}{%
  \CheckCommand*\MacroFont{%
    \fontencoding\encodingdefault%
    \fontfamily\ttdefault%
    \fontseries\mddefault%
    \fontshape\updefault%
    \small%
  }%
  \renewcommand*\MacroFont{%
    \fontencoding\encodingdefault%
    \fontfamily\ttdefault%
    \fontseries\mdseries@tt%
    \fontshape\updefault%
    \small%
  }%
  \CheckCommand*\AltMacroFont{%
    \fontencoding\encodingdefault%
    \fontfamily\ttdefault%
    \fontseries\mddefault%
    \fontshape\sldefault%
    \small%
  }%
  \renewcommand*\AltMacroFont{%
    \fontencoding\encodingdefault%
    \fontfamily\ttdefault%
    \fontseries\mdseries@tt%
    \fontshape\sldefault%
    \small%
  }%
%    \end{macrocode}
% Am Ende der Präambel wird dafür gesorgt, dass der Befehl \cs{mdseries@tt} in 
% jedem Fall definiert ist.
%    \begin{macrocode}
  \AtEndPreamble{%
    \ifundef{\mdseries@tt}{\edef\mdseries@tt{\mddefault}}{}%
  }%
}
%    \end{macrocode}
% Wird das Paket \pkg{tudscrfonts} genutzt, erscheinen die TypeWriter-Schriften
% zur Quelltextdokumentation sowohl für Latin~Modern als auch Roboto etwas zu 
% schlank. 
%    \begin{macrocode}
\PassOptionsToPackage{ttfont=lmtt}{tudscrfonts}
\AfterPackage{tudscrfonts}{%
  \AtEndPreamble{%
    \ifnum\tud@ttfont@num>\z@\relax%
      \edef\mdseries@tt{\tud@ttfont@bf}%
    \fi%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \AltMacroFont
% \end{macro}^^A \MacroFont
%
% Um den zur Verfügung stehenden Platz möglichst effektiv zu nutzen, soll der 
% Satzspiegel dahingehend aufgeteilt werden, dass für die Darstellung jeder
% Quelltextzeile genau 80~Zeichen zur Verfügung stehen. Dies ist allerdings 
% abhängig von der geladenen TypeWriter-Schrift. Deshalb wird die Berechnung 
% des Satzspiegels erst zum Beginn des Dokumentes ausgeführt, um auf etwaige 
% Pakete zur Schriftauswahl reagieren zu können.
%
% \begin{macro}{\tud@setarea}
% \changes{v2.05g}{2016/11/10}{neu}^^A
% \begin{length}{\topmargin}
% \begin{length}{\headheight}
% \begin{length}{\headsep}
% \begin{length}{\footskip}
% \begin{length}{\textheight}
% \begin{length}{\textwidth}
% \begin{length}{\columnsep}
% \begin{length}{\marginparsep}
% \begin{length}{\marginparwidth}
% \begin{length}{\oddsidemargin}
% Hiermit wird die Berechnung des Satzspiegels ausgeführt.
%    \begin{macrocode}
\newcommand*\tud@setarea{%
  \setlength\topmargin{-1in}%
  \setlength\headheight{0pt}%
  \setlength\headsep{3em}%
  \setlength\footskip{1.5\headsep}%
  \setlength\textheight{\dimexpr\paperheight-2.5\headsep-\footskip\relax}%
  \@colht=\textheight%
  \@colroom=\textheight%
  \vsize=\textheight%
  \settowidth\MacroIndent{\rmfamily\scriptsize 0000\ }%
  \begingroup%
    \MacroFont\selectfont%
    \settowidth\@tempdima{\space}%
    \setlength\@tempdima{80\@tempdima}%
%^^A    \addtolength\@tempdima{\dimexpr\MacroIndent+.1\p@\relax}%
    \addtolength\@tempdima{\MacroIndent}%
    \edef\@tempa{%
      \endgroup%
      \noexpand\setlength\noexpand\textwidth{\the\@tempdima}%
    }%
  \@tempa%
  \columnwidth=\textwidth%
  \hsize=\columnwidth%
  \linewidth=\hsize%
  \setlength\columnsep{1em}%
  \setlength\marginparsep{1em}%
  \setlength\marginparwidth{%
    \dimexpr\paperwidth-\textwidth-2\marginparsep\relax%
  }%
  \setlength\oddsidemargin{\dimexpr\marginparwidth+\marginparsep-1in\relax}%
}
\AtBeginDocument{\tud@setarea}
%    \end{macrocode}
% \end{length}^^A \oddsidemargin
% \end{length}^^A \marginparwidth
% \end{length}^^A \marginparsep
% \end{length}^^A \columnsep
% \end{length}^^A \textwidth
% \end{length}^^A \textheight
% \end{length}^^A \footskip
% \end{length}^^A \headsep
% \end{length}^^A \headheight
% \end{length}^^A \topmargin
% \end{macro}^^A \tud@setarea
%
% \subsection{Zusätzliche Markup-Befehle}
%
% \begin{macro}{\app}
% \begin{macro}{\cls}
% \begin{macro}{\pkg}
% \begin{macro}{\opt}
% \begin{macro}{\val}
% \begin{macro}{\pgs}
% \begin{macro}{\env}
% \begin{macro}{\prm}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\cnt}
% \changes{v2.05i}{2017/02/23}{neu}^^A
% \begin{macro}{\file}
% Zusätzliche Auszeichnungsbefehle.
%    \begin{macrocode}
\newrobustcmd*\app[1]{\mbox{\textsl{\textbf{#1}}}}
\newrobustcmd*\cls[1]{\mbox{\textsf{\textbf{#1}}}}
\newrobustcmd*\pkg[1]{\mbox{\textsf{\textbf{#1}}}}
\newrobustcmd*\opt[1]{\mbox{\texttt{#1}}}
\newrobustcmd*\val[1]{\mbox{\texttt{#1}}}
\newrobustcmd*\pgs[1]{\mbox{\texttt{#1}}}
\newrobustcmd*\env[1]{\mbox{\texttt{#1}}}
\newrobustcmd*\prm[1]{\mbox{\texttt{#1}}}
\newrobustcmd*\cnt[1]{\mbox{\texttt{#1}}}
\newrobustcmd*\file[1]{\mbox{\texttt{#1}}}
\AfterPackage{hyperref}{%
  \pdfstringdefDisableCommands{%
    \let\app\@firstofone%
    \let\cls\@firstofone%
    \let\pkg\@firstofone%
    \let\opt\@firstofone%
    \let\val\@firstofone%
    \let\pgs\@firstofone%
    \let\env\@firstofone%
    \let\prm\@firstofone%
    \let\file\@firstofone%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \file
% \end{macro}^^A \cnt
% \end{macro}^^A \prm
% \end{macro}^^A \env
% \end{macro}^^A \pgs
% \end{macro}^^A \val
% \end{macro}^^A \opt
% \end{macro}^^A \pkg
% \end{macro}^^A \cls
% \end{macro}^^A \app
%
% \subsection{Rückfalloptionen bei fehlenden Paketen}
%
% Zum Schluss erfolgen einige Anpassungen mit \cs{AtEndPreamble}, um abhängig 
% vom Ladezustand einiger Pakete reagieren zu können.
%    \begin{macrocode}
\AtEndPreamble{%
%    \end{macrocode}
% \begin{macro}{\selectlanguage}
% \begin{macro}{\glqq}
% \begin{macro}{\grqq}
% Etwas Kleinkram für \pkg{babel}\dots
%    \begin{macrocode}
  \@ifpackageloaded{babel}{}{%
    \ClassWarning{\TUD@Class@Name}{Package `babel' not loaded}%
    \providecommand*\selectlanguage[1]{}%
    \providecommand*\glqq{}%
    \providecommand*\grqq{}%
  }%
%    \end{macrocode}
% \end{macro}^^A \grqq
% \end{macro}^^A \glqq
% \end{macro}^^A \selectlanguage
% \begin{macro}{\enquote}
% \dots und \pkg{csquotes}.
%    \begin{macrocode}
  \@ifpackageloaded{csquotes}{}{%
    \ClassWarning{\TUD@Class@Name}{Package `csquotes' not loaded}%
    \providecommand\enquote[1]{\emph{#1}}%
  }%
%    \end{macrocode}
% \end{macro}^^A \enquote
% Sollte das Paket \pkg{tudscrfonts} nicht geladen worden sein, so wird das
% Paket \pkg{lmodern} geladen und die fehlenden Befehle zur Schriftauswahl
% rudimentär definiert.
%    \begin{macrocode}
  \@ifpackageloaded{tudscrfonts}{}{%
    \RequirePackage{lmodern}[2009/10/30]%
    \providecommand*\textcdln[1]{\textsf{#1}}%
    \providecommand*\textcdrn[1]{\textcdln{#1}}%
    \providecommand*\textcdsn[1]{\textcdln{#1}}%
    \providecommand*\textcdbn[1]{\textbf{\textcdln{#1}}}%
    \providecommand*\textcdxn[1]{\textcdbn{#1}}%
    \providecommand*\textcdli[1]{\textsl{\textcdln{#1}}}%
    \providecommand*\textcdri[1]{\textcdli{#1}}%
    \providecommand*\textcdsi[1]{\textcdli{#1}}%
    \providecommand*\textcdbi[1]{\textbf{\textcdli{#1}}}%
    \providecommand*\textcdxi[1]{\textcdbi{#1}}%
  }%
}
%    \end{macrocode}
%
% \iffalse
%</class&body>
% \fi
%
% \Finale
%
\endinput
