% \iffalse meta-comment
%/GitFileInfo=tudscr-doc.dtx
%
%  TUD-Script -- Corporate Design of Technische Universität Dresden
% ----------------------------------------------------------------------------
%
%  Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2012-2022
%
% ----------------------------------------------------------------------------
%
%  This work may be distributed and/or modified under the conditions of the
%  LaTeX Project Public License, either version 1.3c of this license or
%  any later version. 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 2008-05-04 or later.
%
%  This work has the LPPL maintenance status "maintained".
%
%  The current maintainer and author of this work is Falk Hanisch.
%
% ----------------------------------------------------------------------------
%
% \fi
%
% \iffalse ins:batch + dtx:driver
%<*ins>
\ifx\documentclass\undefined
  \input docstrip.tex
  \ifToplevel{\batchinput{tudscr.ins}}
\else
  \let\endbatchfile\relax
\fi
\endbatchfile
%</ins>
%<*dtx>
\ProvidesFile{tudscr-doc.dtx}[2022/08/09]
\RequirePackage{tudscr-gitinfo}
\documentclass[english,ngerman,xindy]{tudscrdoc}
\iftutex
  \usepackage{fontspec}
\else
  \usepackage[T1]{fontenc}
  \usepackage[ngerman=ngerman-x-latest]{hyphsubst}
\fi
\usepackage{babel}
\usepackage{tudscrfonts}
\usepackage[babel]{microtype}

\GitHubBase{\TUDScriptRepository}
\begin{document}
  \author{Falk Hanisch\TUDScriptContactTitle}
  \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}.
%
% \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,parskip=half-}{scrartcl}
\AfterClass{scrartcl}{\let\scr@maketitle\@maketitle}
\AfterClass{ltxdoc}{\let\@maketitle\scr@maketitle}
%    \end{macrocode}
% Der folgende Quelltext ist 1:1 aus \cls{scrdoc} kopiert.
%    \begin{macrocode}
\newcommand*\tud@saved@LoadClass{}
\let\tud@saved@LoadClass=\LoadClass
\renewcommand*\LoadClass[2][]{%
  \begingroup%
    \edef\@tempc{#2}\def\@tempb{article}%
    \ifx\@tempc\@tempb%
      \let\LoadClass\tud@saved@LoadClass%
      \def\@tempc{scrartcl}%
    \fi%
    \edef\@tempc{%
      \endgroup%
      \noexpand\tud@saved@LoadClass[{#1}]{\@tempc}%
    }%
  \@tempc%
}
\newcommand*\tud@saved@PassOptionsToClass{}
\let\tud@saved@PassOptionsToClass=\PassOptionsToClass
\renewcommand*\PassOptionsToClass[2]{%
  \begingroup%
    \edef\@tempc{#2}\def\@tempb{article}%
    \ifx\@tempc\@tempb%
      \def\@tempc{scrartcl}%
    \fi%
    \edef\@tempc{%
      \endgroup%
      \noexpand\tud@saved@PassOptionsToClass{#1}{\@tempc}%
    }%
  \@tempc%
}
\LoadClassWithOptions{ltxdoc}[2015/03/26]
\setcounter{IndexColumns}{2}
\setcounter{StandardModuleDepth}{2}
%    \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, müssen mit \cs{DoNotIndex angegeben werden.}
%
% \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
%
% \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}
%
% \iffalse
%</class&option>
%<*class&body>
% \fi
%
% \subsection{Standardwerte für Titelei, Absatzauszeichnung und Index}
%
% Folgende Werte sind standardmäßig für den Titel eingestellt, können aber 
% jederzeit überschrieben werden.
%    \begin{macrocode}
\AtEndOfClass{%
  \@ifpackageloaded{tudscr-gitinfo}{%
    \GetFileInfo{\jobname}%
    \title{\file{\filename}}%
    \date{%
      \filedate%
      \ifdefvoid{\fileversion}{}{\nobreakspace\fileversion}%
      \ifdefvoid{\filerevision}{}{\nobreakspace\texttt{\filerevision}}%
    }%
  }{}%
  \CodelineIndex%
  \RecordChanges%
}
%    \end{macrocode}
% Wurde in der Präambel \cs{GetFileInfo} nicht aufgerufen, dann erfolgt dies zu 
% Beginn des Dokumentes.
%    \begin{macrocode}
\AtBeginDocument{%
  \ifdefvoid{\filename}{%
    \IfFileExists{\jobname.dtx}{%
      \edef\filename{\jobname.dtx}%
    }{%
      \edef\filename{\jobname.tex}%
    }%
    \undef\filedate%
    \undef\fileversion%
    \undef\filerevision%
    \undef\fileinfo%
    \expandafter\GetFileInfo\expandafter{\filename}%
  }{}%
  \ifdefvoid{\filerevision}{\let\filerevision\@empty}{}%
}
%    \end{macrocode}
%
% \subsection{Seitenstil}
%
% \begin{macro}{\@docinclude}
% \begin{macro}{\ps@tudscrdoc}
% Die Auswahl des Seitenstils wird im Vergleich zur Klasse \cls{ltxdoc}
% verbessert und an das Paket \pkg{tudscr-gitinfo} angepasst.
%    \begin{macrocode}
\pretocmd\@docinclude{%
  \GetFileInfo{#1}\pagestyle{tudscrdoc}%
}{}{\tud@patch@wrn{@docinclude}}
\def\ps@tudscrdoc{%
  \let\@mkboth\@gobbletwo%
  \let\@oddhead\@empty%
  \let\@evenhead\@empty%
  \def\@oddfoot{%
    File\ifnum\c@part>\z@\nobreakspace\thepart\fi:%
    \nobreakspace\texttt{\ifdefvoid{\filename}{?}{\filename}}%
    \enskip Version:\nobreakspace\ifdefvoid{\filedate}{?}{\filedate}%
    \ifdefvoid{\fileversion}{}{\nobreakspace\fileversion}%
    \ifdefvoid{\filerevision}{}{\enskip\texttt{\filerevision}}%
    \hfill\thepage%
  }%
  \def\@evenfoot{\@oddfoot}%
}
\pagestyle{tudscrdoc}%
\let\ps@titlepage\ps@tudscrdoc%
%    \end{macrocode}
% \end{macro}^^A \ps@tudscrdoc
% \end{macro}^^A \@docinclude
%
% \subsection{Definition und Erscheinungsbild von Deklarationselementen}
%
% Das Paket~\pkg{doc} stellt die Funktionalitäten zur Quelltextdokumentation 
% innerhalb von \file{.dtx}-Dateien bereit. Mit \pkg{doc}~|v3.0| ist es 
% zusätzlich möglich, mit \cs{NewDocElement} weitere Deklarationselemente zu 
% erstellen. Allerdings wird für die Anpassung des Erscheinungsbildes der
% Indexeinträge keine Schnittstelle bereitgestellt, weshalb im Folgenden einige
% Patches notwendig sind.
%
% \subsubsection{Randnotizen und multiple Erläuterungen}
%
% Das Paket~\pkg{doc} stellt mit |\Describe|\meta{Typ} Befehle für die 
% Erläuterung einzelner Deklarationselemente bereit. Sollen gleich mehrere 
% Elemente in einem Abschnitt erläutert werden, fehlt jedoch die entsprechende
% Schnittstelle, weshalb zusätzlich die Befehle |\Describe|\meta{Typ}|s| 
% darauf aufbauend definiert werden.
%
% \begin{length}{\tud@dim@marginnotevskip}
% \changes{v2.05i}{2017/03/09}{neu}^^A
% \begin{macro}{\marginpar}
% Da die Befehle |\Describe|\meta{Typ} zur Erzeugung einer Randnotiz für 
% jeden Eintrag \cs{marginpar} verwenden, müssen diese mit einem vertikalen 
% Versatz gesetzt werden, falls gleich mehrere auf einmal zu erzeugen sind. 
% Hierfür wird das Paket~\pkg{marginnote} genutzt.
%    \begin{macrocode}
\tud@newdim\tud@dim@marginnotevskip
\AfterPackage*{marginnote}{%
  \renewcommand*\marginpar[2][]{%
    \IfArgIsEmpty{#1}{%
      \marginnote{#2}[\tud@dim@marginnotevskip]%
    }{%
      \marginnote[{#1}]{#2}[\tud@dim@marginnotevskip]%
    }%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \marginpar
% \end{length}^^A \tud@dim@marginnotevskip
% \begin{macro}{\doc@createdescribes}
% \changes{v2.05i}{2017/03/09}{neu}^^A
% Die Definition für |\Describe|\meta{Typ}|s|. Die so erzeugten Befehle passen
% für jeden neuen Eintrag die Länge \cs{marginnotevskip} selbstständig an. Für
% jeden angegebenen Eintrag |\Describe|\meta{Typ}|s|\oarg{...}\marg{Element(e)}
% wird an |\Describe|\meta{Typ}\oarg{...}\marg{Element} das optionale Argument 
% durchgereicht. Erzeugt werden Befehle via \cs{@NewDocElement}.
%    \begin{macrocode}
\newcommand*\doc@createdescribes[1]{%
  \expandafter\newcommand\expandafter*\csname Describe#1s\endcsname[2][]{%
    \tud@setdim\tud@dim@marginnotevskip{\z@}%
    \def\@tempc{##2}%
    \@for\@tempa:=\@tempc\do{%
      \trim@spaces@in\@tempa%
      \ifx\@tempa\@empty\else%
        \def\@tempb{\@nameuse{Describe#1}[{##1}]}%
        \expandafter\@tempb\expandafter{\@tempa}%
        \tud@addtodim\tud@dim@marginnotevskip{1\baselineskip}%
      \fi%
    }%
    \tud@setdim\tud@dim@marginnotevskip{\z@}%
    \ignorespaces%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \doc@createdescribes
% \begin{macro}{\tud@idx@typemarkup}
% \changes{v2.05g}{2016/11/10}{neu}^^A
% \changes{v2.06o}{2022/07/20}{Anpassungen für \pkg{doc}}^^A
% Dieses Makro dient zur Formatierung des Typen der Deklarationselemente in 
% Index, Änderungsliste und Randnotizen.
%    \begin{macrocode}
\NewDocumentCommand{\tud@idx@typemarkup}{r()}{%
  \begingroup%
  \normalfont\scriptsize\space(#1)%
  \endgroup%
}
%    \end{macrocode}
% \end{macro}^^A \tud@idx@typemarkup
% \begin{macro}{\@NewDocElement}
% \changes{v2.06o}{2022/07/20}{neu}^^A
% Erzeugen der Befehle von |\Describe|\meta{Typ}|s|\oarg{...}\marg{Element(e)}.
% Weiterhin werden für die Verwendung von \cls{ltxdoc} und \pkg{hypdoc}
% \hrfn{https://github.com/latex3/latex2e/issues/900}{einige Bugs} gefixt.
%    \begin{macrocode}
\AtBeginDocument{\let\PrintMacroName\@@PrintMacroName}
\apptocmd\@NewDocElement{%
  \doc@createdescribes{#2}%
  \csletcs{@@PrintDescribe#2}{PrintDescribe#2}%
  \csletcs{@@Print#2Name}{Print#2Name}%
  \csletcs{@@SpecialMain#2Index}{SpecialMain#2Index}%
  \csletcs{@@Special#2Index}{Special#2Index}%
}{}{\tud@patch@wrn{@NewDocElement}}
%    \end{macrocode}
% Hiermit wird die Formatierung des Elementtyps bei Deklarationen angepasst.
% Zu beachten ist, das zusätzlich zur ursprünglichen Definition \cs{strut} zum 
% Schluss (nochmals) ausgeführt wird. Somit lassen sich potenzielle Probleme 
% mit dem Paket \pkg{microtype} vermeiden.
%    \begin{macrocode}
\patchcmd\@NewDocElement{%
  \@temptokena\expandafter{%
    \expandafter\textnormal\expandafter{%
      \expandafter\space\expandafter(\doc@printtype)%
    }%
  }%
}{%
  \@temptokena\expandafter{%
    \expandafter\textnormal\expandafter{%
      \expandafter\tud@idx@typemarkup\expandafter(\doc@printtype)\strut%
    }%
  }%
}{}{\tud@patch@wrn{@NewDocElement}}
%    \end{macrocode}
% \end{macro}^^A \@NewDocElement
%
% \subsubsection{Erweiterte Einträge für Index und Änderungsliste}
%
% \begin{macro}{\tud@idx@sortkey}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@idx@format}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@idx@element}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@idx@parent}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \changes{v2.06o}{2022/07/20}{Anpassungen für \pkg{doc}}^^A
% Mit diesen Befehlen kann beim Erzeugen von Einträgen für die Änderungsliste 
% auf die zuvor bereits erzeugten Indexeinträge zurückggegriffen werden. Ein 
% zuvor erzeugter Elterneintrag wird mit Sortierschlüssel und der eigentlichen
% Formatierung in zwei Token in \cs{tud@idx@parent} expandiert, um später
% darauf zurückgreifen zu können~-- dies ist insbesondere für Parameter nötig.
%    \begin{macrocode}
\newcommand*\tud@idx@sortkey{}
\let\tud@idx@sortkey\relax
\newcommand*\tud@idx@format{}
\let\tud@idx@format\relax
\newcommand*\tud@idx@element{}
\let\tud@idx@element\relax
\newcommand*\tud@idx@parent{}
\let\tud@idx@parent\relax
%    \end{macrocode}
% \end{macro}^^A \tud@idx@parent
% \end{macro}^^A \tud@idx@element
% \end{macro}^^A \tud@idx@format
% \end{macro}^^A \tud@idx@sortkey
% \begin{macro}{\doc@createspecialindexes}
% \changes{v2.06o}{2022/07/20}{neu}^^A
% \begin{macro}{\doc@createspecialmacrolikeindexes}
% \changes{v2.06o}{2022/07/20}{neu}^^A
% 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 gleichnamige Umgebungen und Optionen) 
% gibt, unterschlagen werden. Deshalb wird den erzeugten Sortierschlüsseln die 
% Ausgabe des Deklarationstyps aus |#2| respektive |\@temptokena| hinzugefügt. 
% Außerdem wird der Markupbefehl \cs{tud@idx@typemarkup} für diese eingehangen.
%
% Weiterhin werden das Deklarationselement in \cs{tud@idx@element} sowie der 
% Sortierschlüssel in \cs{tud@idx@sortkey} und der formatierte Indexeintrag in
% \cs{tud@idx@format} gesichert, um diese sowohl in der Änderungsliste als auch
% für eigens definierte Elterneinträge (\cs{tud@idx@parent}) nutzen zu können.
%    \begin{macrocode}
\CheckCommand*\doc@createspecialindexes[3]{%
  \@temptokena{\space (#2)}%
  \@temptokenb{#3:}%
  \@nameedef{SpecialMain#1Index}##1{%
    \noexpand\@bsphack
    \ifdoc@toplevel
      \noexpand\special@index{%
        ##1\noexpand\actualchar{\string\ttfamily\space##1}%
        \ifx\@nil#2\@nil\else\the\@temptokena\fi
        \noexpand\encapchar main%
      }%
    \fi
    \ifx\@nil#3\@nil\else
      \noexpand\special@index{%
        \the\@temptokenb\noexpand\levelchar
        ##1\noexpand\actualchar{\string\ttfamily\space##1}%
        \noexpand\encapchar main%
      }%
    \fi
    \noexpand\@esphack%
  }%
  \@nameedef{Special#1Index}##1{%
    \noexpand\@bsphack
    \ifdoc@toplevel
      \noexpand\doc@providetarget
      \noexpand\index{%
        ##1\noexpand\actualchar{\string\ttfamily\space##1}%
        \ifx\@nil#2\@nil\else\the\@temptokena\fi
        \noexpand\doc@handleencap{usage}%
      }%
    \fi
    \ifx\@nil#3\@nil\else
      \noexpand\index{%
        \the\@temptokenb\noexpand\levelchar
        ##1\noexpand\actualchar{\string\ttfamily\space##1}%
        \noexpand\doc@handleencap{usage}%
      }%
    \fi
    \noexpand\@esphack%
  }%
}
\renewcommand*\doc@createspecialindexes[3]{%
  \@temptokena{\space (#2)}%
  \@temptokenb{#3:}%
  \@nameedef{SpecialMain#1Index}##1{%
    \noexpand\@bsphack
    \ifdoc@toplevel
      \noexpand\special@index{%
        % PATCH: add `\the\@temptokena' to sorting argument
        ##1\ifx\@nil#2\@nil\else\the\@temptokena\fi
        \noexpand\actualchar{\string\ttfamily\space##1}%
        % PATCH: add `\tud@idx@typemarkup' for markup
        \ifx\@nil#2\@nil\else\noexpand\tud@idx@typemarkup\the\@temptokena\fi
        \noexpand\encapchar main%
      }%
    \fi
    \ifx\@nil#3\@nil\else
      \noexpand\special@index{%
        \the\@temptokenb\noexpand\levelchar
        % PATCH: add `\the\@temptokena' to sorting argument
        ##1\ifx\@nil#2\@nil\else\the\@temptokena\fi
        \noexpand\actualchar{\string\ttfamily\space##1}%
        \noexpand\encapchar main%
      }%
    \fi
    \noexpand\@esphack%
%    \end{macrocode}
% Bei allen Varianten der Indexeinträge werden diese nach dem Erstellen
% gesichert, um diese in der richtigen Formatierung als Elterneinträge
% für Parameter im Index sowie für die Änderungsliste nutzen zu können.
%    \begin{macrocode}
    % PATCH: assign used sort key and formatted entry to dedicated macros
    \gdef\noexpand\tud@idx@sortkey{##1\ifx\@nil#2\@nil\else\the\@temptokena\fi}%
    \gdef\noexpand\tud@idx@format{%
      {\string\ttfamily\space##1}%
      \ifx\@nil#2\@nil\else\noexpand\tud@idx@typemarkup\the\@temptokena\fi
    }%
    % PATCH: reset settings for nested index and changelog entries
    \gdef\noexpand\tud@idx@element{#1}%
    \global\let\noexpand\tud@idx@parent\relax%
  }%
  \@nameedef{Special#1Index}##1{%
    \noexpand\@bsphack
    \ifdoc@toplevel
      \noexpand\doc@providetarget
      \noexpand\index{%
        % PATCH: add `\the\@temptokena' to sorting argument
        ##1\ifx\@nil#2\@nil\else\the\@temptokena\fi
        \noexpand\actualchar{\string\ttfamily\space##1}%
        % PATCH: add `\tud@idx@typemarkup' for markup
        \ifx\@nil#2\@nil\else\noexpand\tud@idx@typemarkup\the\@temptokena\fi
        \noexpand\doc@handleencap{usage}%
      }%
    \fi
    \ifx\@nil#3\@nil\else
      \noexpand\index{%
        \the\@temptokenb\noexpand\levelchar
        % PATCH: add `\the\@temptokena' to sorting argument
        ##1\ifx\@nil#2\@nil\else\the\@temptokena\fi
        \noexpand\actualchar{\string\ttfamily\space##1}%
        \noexpand\doc@handleencap{usage}%
      }%
    \fi
    \noexpand\@esphack%
    % PATCH: assign used sort key and formatted entry to dedicated macros
    \gdef\noexpand\tud@idx@sortkey{##1\ifx\@nil#2\@nil\else\the\@temptokena\fi}%
    \gdef\noexpand\tud@idx@format{%
      {\string\ttfamily\space##1}%
      \ifx\@nil#2\@nil\else\noexpand\tud@idx@typemarkup\the\@temptokena\fi
    }%
    % PATCH: reset settings for nested index and changelog entries
    \gdef\noexpand\tud@idx@element{#1}%
    \global\let\noexpand\tud@idx@parent\relax%
  }%
}
\CheckCommand*\doc@createspecialmacrolikeindexes[3]{%
  \@temptokena{\space (#2)}%
  \@temptokenb{#3:}%
  \@nameedef{Code#1Index}##1##2{%
    \noexpand\@SpecialIndexHelper@##2\noexpand\@nil
    \noexpand\@bsphack
    \noexpand\ifdoc@noindex\noexpand\else
      \ifdoc@toplevel
        \noexpand\special@index{%
          \noexpand\@gtempa\noexpand\actualchar
          \string\verb% % to fool emacs highlighting
          \noexpand\quotechar*\noexpand\verbatimchar
          \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
          \ifx\@nil#2\@nil\else \the\@temptokena \fi
          \noexpand\encapchar ##1%
        }%
      \fi
      \ifx\@nil#3\@nil\else
        \noexpand\special@index{%
          \the\@temptokenb\noexpand\levelchar
          \noexpand\@gtempa\noexpand\actualchar
          \string\verb% % to fool emacs highlighting
          \noexpand\quotechar*\noexpand\verbatimchar
          \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
          \noexpand\encapchar ##1%
        }%
      \fi
    \noexpand\fi
    \noexpand\@esphack%
  }%
  \@nameedef{SpecialMain#1Index}##1{%
    \expandafter\noexpand\csname Code#1Index\endcsname{main}{##1}%
  }%
  \@nameedef{Special#1Index}##1{%
    \noexpand\@SpecialIndexHelper@##1\noexpand\@nil
    \noexpand\@bsphack
    \noexpand\ifdoc@noindex\noexpand\else
      \ifdoc@toplevel
        \noexpand\doc@providetarget
        \noexpand\index{%
          \noexpand\@gtempa\noexpand\actualchar
          \string\verb% % to fool emacs highlighting
          \noexpand\quotechar*\noexpand\verbatimchar
          \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
          \ifx\@nil#2\@nil\else \the\@temptokena \fi
          \noexpand\doc@handleencap{usage}%
        }%
      \fi
      \ifx\@nil#3\@nil\else
        \noexpand\index{%
          \the\@temptokenb\noexpand\levelchar
          \noexpand\@gtempa\noexpand\actualchar
          \string\verb% % to fool emacs highlighting
          \noexpand\quotechar*\noexpand\verbatimchar
          \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
          \noexpand\doc@handleencap{usage}%
        }%
      \fi
    \noexpand\fi
    \noexpand\@esphack%
  }%
}
\renewcommand*\doc@createspecialmacrolikeindexes[3]{%
  \@temptokena{\space (#2)}%
  \@temptokenb{#3:}%
  \@nameedef{Code#1Index}##1##2{%
    \noexpand\@SpecialIndexHelper@##2\noexpand\@nil
    \noexpand\@bsphack
    \noexpand\ifdoc@noindex\noexpand\else
      \ifdoc@toplevel
        \noexpand\special@index{%
          % PATCH: add `\the\@temptokena' to sorting argument
          \noexpand\@gtempa\ifx\@nil#2\@nil\else\the\@temptokena\fi
          \noexpand\actualchar
          \string\verb% % to fool emacs highlighting
          \noexpand\quotechar*\noexpand\verbatimchar
          \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
          % PATCH: add `\tud@idx@typemarkup' for markup
          \ifx\@nil#2\@nil\else\noexpand\tud@idx@typemarkup\the\@temptokena\fi
          \noexpand\encapchar ##1%
        }%
      \fi
      \ifx\@nil#3\@nil\else
        \noexpand\special@index{%
          \the\@temptokenb\noexpand\levelchar
          % PATCH: add `\the\@temptokena' to sorting argument
          \noexpand\@gtempa\ifx\@nil#2\@nil\else\the\@temptokena\fi
          \noexpand\actualchar
          \string\verb% % to fool emacs highlighting
          \noexpand\quotechar*\noexpand\verbatimchar
          \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
          \noexpand\encapchar ##1%
        }%
      \fi
    \noexpand\fi
    \noexpand\@esphack%
  }%
%    \end{macrocode}
% Für das Sichern der Indexeinträge muss ein bisschen mit der Expansion der 
% Makros gezaubert werden. Der in \cs{@gtempa} relevante Teil für den Index
% ist erst nach der Expansion (via \cs{doc@expr}) verfügbar, muss aber in einer
% zweiten Expansion aus eben diesem Makro expandiert werden. Wiederum muss der 
% Teil aus |\ifx\@nil#2\@nil\else\the\@temptokena\fi| hier direkt expandiert 
% werden und wird danach vor weiterer Expansion geschützt!
%    \begin{macrocode}
  \@nameedef{SpecialMain#1Index}##1{%
    \expandafter\noexpand\csname Code#1Index\endcsname{main}{##1}%
    % PATCH: assign used sort key and formatted entry to dedicated macros
    \xdef\noexpand\tud@idx@sortkey{% 
      \noexpand\expandonce\noexpand\@gtempa%
      \ifx\@nil#2\@nil\else\noexpand\unexpanded{\the\@temptokena}\fi%
    }%
    \xdef\noexpand\tud@idx@format{%
      \unexpanded{\noexpand\string\noexpand\verb}%
      \unexpanded{\noexpand\quotechar*\noexpand\verbatimchar}%
      \unexpanded{\noexpand\bslash}\noexpand\expandonce\noexpand\@gtempa%
      \unexpanded{\noexpand\verbatimchar}%
      \ifx\@nil#2\@nil\else
        \noexpand\unexpanded{\noexpand\tud@idx@typemarkup\the\@temptokena}%
      \fi
    }%
    % PATCH: reset settings for nested index and changelog entries
    \gdef\noexpand\tud@idx@element{#1}%
    \global\let\noexpand\tud@idx@parent\relax
  }%
  \@nameedef{Special#1Index}##1{%
    \noexpand\@SpecialIndexHelper@##1\noexpand\@nil
    \noexpand\@bsphack
    \noexpand\ifdoc@noindex\noexpand\else
      \ifdoc@toplevel
        \noexpand\doc@providetarget
        \noexpand\index{%
          % PATCH: add `\the\@temptokena' to sorting argument
          \noexpand\@gtempa\ifx\@nil#2\@nil\else\the\@temptokena\fi
          \noexpand\actualchar
          \string\verb% % to fool emacs highlighting
          \noexpand\quotechar*\noexpand\verbatimchar
          \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
          % PATCH: add `\tud@idx@typemarkup' for markup
          \ifx\@nil#2\@nil\else\noexpand\tud@idx@typemarkup\the\@temptokena\fi
          \noexpand\doc@handleencap{usage}%
        }%
      \fi
      \ifx\@nil#3\@nil\else
        \noexpand\index{%
          \the\@temptokenb\noexpand\levelchar
          % PATCH: add `\the\@temptokena' to sorting argument
          \noexpand\@gtempa\ifx\@nil#2\@nil\else\the\@temptokena\fi
          \noexpand\actualchar
          \string\verb% % to fool emacs highlighting
          \noexpand\quotechar*\noexpand\verbatimchar
          \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
          \noexpand\doc@handleencap{usage}%
        }%
      \fi
    \noexpand\fi
    \noexpand\@esphack%
%    \end{macrocode}
% Zur Sicherung der Indexeinträge das selbe Spiel für die Expansion wie zuvor.
%    \begin{macrocode}
    % PATCH: assign used sort key and formatted entry to dedicated macros
    \xdef\noexpand\tud@idx@sortkey{% 
      \noexpand\expandonce\noexpand\@gtempa%
      \ifx\@nil#2\@nil\else\noexpand\unexpanded{\the\@temptokena}\fi%
    }%
    \xdef\noexpand\tud@idx@format{%
      \unexpanded{\noexpand\string\noexpand\verb}%
      \unexpanded{\noexpand\quotechar*\noexpand\verbatimchar}%
      \unexpanded{\noexpand\bslash}\noexpand\expandonce\noexpand\@gtempa%
      \unexpanded{\noexpand\verbatimchar}%
      \ifx\@nil#2\@nil\else
        \noexpand\unexpanded{\noexpand\tud@idx@typemarkup\the\@temptokena}%
      \fi
    }%
    % PATCH: reset settings for nested index and changelog entries
    \gdef\noexpand\tud@idx@element{#1}%
    \global\let\noexpand\tud@idx@parent\relax
  }%
}
%    \end{macrocode}
% \end{macro}^^A \doc@createspecialmacrolikeindexes
% \end{macro}^^A \doc@createspecialindexes
%
% \subsubsection{Erstellen aller Deklarationselemente}
%
% Nachdem nun die Anpassungen für die Änderungsliste erfolgt sind, können nun 
% die für die Dokumentation notwendigen Umgebungen mit \cs{NewDocElement} 
% erstellt werden, wobei die Lokalisierungsvariablen |\tud@|\meta{\dots}|@name| 
% zum Tragen kommen.
%    \begin{macrocode}
\def\tud@res@a#1{%
  \kernel@ifnextchar[%]
  {\tud@res@b{#1}}{\tud@res@b{#1}[]}%
}
\def\tud@res@b#1[#2]#3#4{%
  #1[{%
    idxgroup=\csname tud@#4s@name\endcsname,%
    idxtype=\csname tud@#4@name\endcsname,%
    printtype=\csname tud@#4@name\endcsname,%
    #2%
  }]{#3}{#4}%
}
\tud@res@a\RenewDocElement[macrolike,idxgroup,idxtype,printtype]{Macro}{macro}
\tud@res@a\RenewDocElement{Env}{environment}
\tud@res@a\NewDocElement{Option}{option}
\tud@res@a\NewDocElement{LayerPageStyle}{layerpagestyle}
\tud@res@a\NewDocElement{Layer}{layer}
\tud@res@a\NewDocElement[macrolike]{Length}{length}
\tud@res@a\NewDocElement{Counter}{counter}
\tud@res@a\NewDocElement{Color}{TUDcolor}
\tud@res@a\NewDocElement[macrolike]{Localization}{localization}
\tud@res@a\NewDocElement[macrolike]{Field}{field}
\tud@res@a\NewDocElement{Font}{KOMAfont}
\tud@res@a\NewDocElement{Parameter}{parameter}
%    \end{macrocode}
%
% \subsubsection{Besonderheiten des Deklarationselementes \emph{Parameter}}
%
% \begin{macro}{\DescribeMacroParameters}
% \changes{v2.06o}{2022/07/20}{neu}^^A
% \begin{macro}{\DescribeEnvParameters}
% \changes{v2.06o}{2022/07/20}{neu}^^A
% \begin{macro}{\Describe@Parameters}
% \changes{v2.06o}{2022/07/20}{neu}^^A
% Hiermit können Parameter für Befehle und Umgebungen beschrieben werden. Mit 
% |\Describe|\meta{Typ}|Parameters|\oarg{...}\marg{Element(e)}\marg{Parameter}
% erfolgt der Aufruf, wobei das optionale Argument an \cs{DescribeParameter} 
% durchgereicht wird.
%    \begin{macrocode}
\newcommand*\DescribeMacroParameters{}
\def\DescribeMacroParameters{%
  \kernel@ifnextchar[%]
  {\Describe@Parameters{Macro}}{\Describe@Parameters{Macro}[]}%
}
\newcommand*\DescribeEnvParameters{}
\def\DescribeEnvParameters{%
  \kernel@ifnextchar[%]
  {\Describe@Parameters{Env}}{\Describe@Parameters{Env}[]}%
}
%    \end{macrocode}
% Für eine möglichst einfache Schnittstelle wird ein bisschen getrickst. Das 
% optionale Argument wird zunächst dahingehend ausgewertet, ob Indexeinträge
% überhaupt erzeugt werden sollen. In diesem Fall wird die Ausgabe unterdrückt, 
% um diese bei der Angabe mehrerer \marg{Element(e)} nicht mehrfach zu erhalten.
%    \begin{macrocode}
\newcommand*\Describe@Parameters{}
\def\Describe@Parameters#1[#2]#3#4{%
  \begingroup%
    \csname keys_set:nn\endcsname{doc}{#2}%
    \ifdoc@noindex%
      \aftergroup\@gobble%
    \else%
      \aftergroup\@firstofone%
    \fi%
  \endgroup{%
    \def\@tempc{#3}%
    \@for\@tempa:=\@tempc\do{%
      \trim@spaces@in\@tempa%
      \ifx\@tempa\@empty\else%
        \begingroup%
%    \end{macrocode}
% Durch den Aufruf von |\Describe|\meta{Typ} wird der Elterneintrag erzeugt. 
% Dieser muss durch \pkg{doc} zwar erstellt, jedoch nicht in den Index 
% eingetragen werden, weshalb \prm{noindex} nicht möglich ist und stattdessen
% \cs{index} hier das Argument verschluckt.
%    \begin{macrocode}
          \let\index\@gobble%
          \def\@tempb{\@nameuse{Describe#1}[noprint]}%
          \expandafter\@tempb\expandafter{\@tempa}%
          \xdef\tud@idx@parent{%
            {\expandonce\tud@idx@sortkey}{\expandonce\tud@idx@format}%
          }%
        \endgroup%
        \DescribeParameters[{#2,noprint}]{#4}%
      \fi%
    }%
  }%
%    \end{macrocode}
% Nach dem Erstellen der Indexeinträge erfolgt die \emph{einmalige} Ausgabe 
% aller genannten Parameter.
%    \begin{macrocode}
  \begingroup%
    \csname keys_set:nn\endcsname{doc}{#2}%
    \ifdoc@noprint%
      \aftergroup\@gobble%
    \else%
      \aftergroup\@firstofone%
    \fi%
  \endgroup{%
    \DescribeParameters[{#2,noindex}]{#4}%
  }%
  \global\let\tud@idx@parent\relax%
}
%    \end{macrocode}
% \end{macro}^^A \Describe@Parameters
% \end{macro}^^A \DescribeEnvParameters
% \end{macro}^^A \DescribeMacroParameters
% \begin{macro}{\SpecialMainParameterIndex}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \changes{v2.06o}{2022/07/20}{Anpassungen für \pkg{doc}}^^A
% \begin{macro}{\SpecialParameterIndex}
% \changes{v2.05i}{2017/02/20}{neu}^^A
% \changes{v2.06o}{2022/07/20}{Anpassungen für \pkg{doc}}^^A
% Die Gestalt der Parameter als Haupteinträge wird hier definiert.
%    \begin{macrocode}
\renewcommand*\SpecialMainParameterIndex[1]{%
  \ifx\tud@idx@parent\relax%
    \@expandtwoargs\in@{\tud@idx@element}{Macro,Env}%
    \ifin@%
      \xdef\tud@idx@parent{%
        {\expandonce\tud@idx@sortkey}{\expandonce\tud@idx@format}%
      }%
    \else%
      \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%
  \fi%
  \ifx\tud@idx@parent\relax\else%
    \gdef\tud@idx@sortkey{#1\space(\tud@parameter@name)}%
    \gdef\tud@idx@format{%
      {\string\ttfamily\space#1}%
      \tud@idx@typemarkup\space(\tud@parameter@name)%
    }%
    \@bsphack%
    \special@index{%
      \expandafter\@firstoftwo\tud@idx@parent\actualchar%
      \expandafter\@secondoftwo\tud@idx@parent\levelchar%
      \tud@idx@sortkey\actualchar\tud@idx@format%
      \encapchar main%
    }%
    \@esphack%
  \fi%
}
%    \end{macrocode}
% Hier wird die Gestalt der Indexeinträge für Parameter festgelegt, wenn diese 
% durch \cs{Describe@Parameters} erzeugt werden.
%    \begin{macrocode}
\renewcommand*\SpecialParameterIndex[1]{%
  \ifx\tud@idx@parent\relax%
    \ClassError{\TUD@Class@Name}{No macro or environment given}{%
      Since parameters can only be used for macros or\MessageBreak%
      environments, you have to use an appropriate command like\MessageBreak%
      `\string\DescribeMacroParameters' or `\string\DescribeEnvParameters'.%
    }%
  \else%
    \gdef\tud@idx@sortkey{#1\space(\tud@parameter@name)}%
    \gdef\tud@idx@format{%
      {\string\ttfamily\space#1}%
      \tud@idx@typemarkup\space(\tud@parameter@name)%
    }%
    \@bsphack%
    \index{%
      \expandafter\@firstoftwo\tud@idx@parent\actualchar%
      \expandafter\@secondoftwo\tud@idx@parent\levelchar%
      \tud@idx@sortkey\actualchar\tud@idx@format%
      \encapchar usage%
    }%
    \@esphack%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \SpecialParameterIndex
% \end{macro}^^A \SpecialMainParameterIndex
%
% \subsection{Index und Änderungsliste}
% Sollte \app{texindy} zum Einsatz kommen, wird die Gestalt von Index und 
% Änderungsliste angepasst, was eine Anpassung der erzeugten Einträge bedingt.
% Die notwendigen Befehle werden zunächst nachfolgenddefiniert. Über den Hook
% |begindocument/before| erfolgt später die Zuweisung.
%
% \begin{macro}{\tud@xdy@reference}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% \begin{macro}{\tud@xdy@destination}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% \begin{macro}{\tud@xdy@filesep}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% \begin{macro}{\tud@xdy@mapping}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% \begin{macro}{\tud@xdy@@mapping}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% Für die verwendeten Referenzen von Einträgen für Index und Änderungsliste 
% gibt es im Zusammenspiel von \pkg{doc} und \pkg{hypdoc} mehrere Varianten.
% Das Paket \pkg{doc} unterscheidet zwischen Verweisen auf Seitenzahlen und 
% Codezeilen. Das Paket \pkg{hypdoc} stellt für beide Varianten jeweils eine 
% eigene Implentierung für das Erzeugen von Hyperlinks bereit. Mit dem Befehl 
% \cs{tud@xdy@reference} wird für die Verwendung von \app{texindy} für alle
% Varianten eine einheitliche Form definiert. Alle Einträge für Index und 
% Änderungsliste verwenden das Format 
% \meta{Target}|:|\meta{Dateischlüssel}|-|\meta{Codezeile}|:|\meta{Seitenzahl}
% für Referenzen. Es wird über \cs{tud@xdy@filesep} sichergestellt, dass für 
% den Dateischlüssel immer ein definierter Zustand besteht.
%
% An \cs{tud@xdy@reference} wird als einziges Argument die aktuelle Codezeile
% \cs{c@CodelineNo} des Paketes \pkg{doc} übergeben, das Target für Link zur
% Codezeile wird ggf. automatisch durch \pkg{hypdoc} gesetzt. Die Auswetung der 
% so erzeugten Referenz erfolgt mit \cs{tud@xdy@@mapping}. War das an 
% \cs{tud@xdy@reference} übergebene Argument größer 0, wird die Ausgabe für 
% eine Codezeile erzeugt, andernfalls für eine Seitenangabe.
%    \begin{macrocode}
\ifdefined\tudxdyflag
\newcommand*\tud@xdy@filesep{?-}
\newcommand*\tud@xdy@reference[1]{0:\filesep#1:\thepage}
%    \end{macrocode}
% Mit \cs{tud@xdy@destination} erfolgt die Formatierung bei der Ausgabe. Sollte 
% kein Dateischlüssel gesetzt sein, erfolgt dennoch eine Ausgabe. Der Zustand 
% besteht dann, wenn \cs{DocInclude} nicht verwendet wurde.
%    \begin{macrocode}
\newcommand*\tud@xdy@destination[3]{%
  #1\if#2\expandafter\@car\tud@xdy@filesep\@nil\else\mbox{--}#2\fi%
  \ifnum#3>\z@\textsubscript{\kern.1em#3}\fi%
}
%    \end{macrocode}
% Neben der Refernz wird an \cs{tud@xdy@mapping} noch ein Attribut für die 
% Formatierung der Ausgabe übergeben. Gültige Werte sind |main|, |usage|, 
% |code| und |change| (siehe \file{tudscr-texindy.dtx}). Die erzeugte Ausgabe 
% der Referenz wird dann mit \cs{main}, \cs{usage}, \cs{code} oder \cs{change}
% formatiert, falls vorhanden. Diese Befehle müssen genau ein obligatorisches 
% Argument verarbeiten.
%    \begin{macrocode}
\newcommand*\tud@xdy@mapping[2]{\tud@xdy@@mapping{#1}#2\@nil}
\newcommand*\tud@xdy@@mapping{}
%    \end{macrocode}
% Ohne \pkg{hypdoc} werden für die Ausgabe Links auf die entsprechenden Seiten
% erzeugt, falls zumindes \pkg{hyperref} geladen wurde.
%    \begin{macrocode}
\def\tud@xdy@@mapping#1#2:#3-#4:#5\@nil{%
  \begingroup%
    \ifundef{\hyperlink}{\let\tud@res@a\@gobble}{\let\tud@res@a\@firstofone}%
    \csname\ifx\\#1\\relax\else#1\fi\endcsname{%
      \tud@res@a{\hyperlink{page.#5}}{\tud@xdy@destination{#5}{#3}{#4}}%
    }%
  \endgroup%
}
%    \end{macrocode}
% Mit \pkg{hypdoc} werden via \cs{c@HD@hypercount} Sprungmarken ins Dokument 
% sowie auf Codezeilen generiert. Diese werden durch \cs{tud@xdy@@mapping}
% an die korrespondierenden Befehle von \pkg{hypdoc} durchgereicht.
%    \begin{macrocode}
\AfterPackage*{hypdoc}{%
  \renewcommand*\tud@xdy@reference[1]{\the\c@HD@hypercount:\filesep#1:\thepage}%
  \def\tud@xdy@@mapping#1#2:#3-#4:#5\@nil{%
    \ifnum#2>\z@\relax
      \hdclindex{#2}{#1}{\tud@xdy@destination{#5}{#3}{#4}}%
    \else
        \csname\ifx\\#1\\relax\else#1\fi\endcsname{%
          \hyperlink{page.#5}{\tud@xdy@destination{#5}{#3}{#4}}%
        }%
    \fi
  }%
}
\fi
%    \end{macrocode}
% \end{macro}^^A \tud@xdy@@mapping
% \end{macro}^^A \tud@xdy@mapping
% \end{macro}^^A \tud@xdy@filesep
% \end{macro}^^A \tud@xdy@destination
% \end{macro}^^A \tud@xdy@reference
%
% \subsubsection{Erzeugen von Indexeinträgen}
%
% Nachdem die Form der Referenzierung für \app{texindy} definiert wurde, müssen
% die Einträge im Index auch entsprechend erstellt werden.
%
% \begin{macro}{\tud@xdy@wrindex}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% \begin{macro}{\tud@xdy@page@wrindex}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% \begin{macro}{\tud@xdy@codeline@wrindex}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% Mit \cs{PageIndex} respektive \cs{CodelineIndex} aus dem Paket \pkg{doc} 
% wird festgelegt, ob Index und Änderungsliste Seitenzahlen oder Codezeilen 
% als Referenz verwenden. Dementsprechend werden \cs{tud@xdy@page@wrindex} und 
% \cs{tud@xdy@codeline@wrindex} definiert, die sich grundsätzlich nur darin
% unterscheiden, ob \cs{tud@xdy@reference} mit |0| oder der aktuellen
% Codezeile |\number\c@CodelineNo| als Argument genutzt wird.
%    \begin{macrocode}
\ifdefined\tudxdyflag
\newcommand*\tud@xdy@wrindex[1]{%
    \protected@write\@indexfile{}{%
      \string\indexentry{#1}{\tud@xdy@reference{0}}%
    }%
  \endgroup%
  \@esphack%
}
\newcommand*\tud@xdy@page@wrindex[1]{%
  \begingroup
    \let\@wrindex\tud@xdy@wrindex%
    \index{#1}%
  \endgroup
}
\AfterPackage*{hypdoc}{%
  \renewcommand*\tud@xdy@page@wrindex[1]{%
    \begingroup
      \let\@wrindex\tud@xdy@wrindex%
      \HDorg@index{#1}%
    \endgroup
  }
}
\newcommand*\tud@xdy@codeline@wrindex[1]{%
  \if@filesw
    \begingroup
      \let\protect\noexpand
      \immediate\write\@indexfile{%
        \string\indexentry{#1}{\tud@xdy@reference{\number\c@CodelineNo}}%
      }%
    \endgroup
  \fi
}
\fi
%    \end{macrocode}
% \end{macro}^^A \tud@xdy@codeline@wrindex
% \end{macro}^^A \tud@xdy@page@wrindex
% \end{macro}^^A \tud@xdy@wrindex
%
% \subsubsection{Erzeugen von Änderungseinträgen}
%
% \begin{macro}{\changehistoryname}
% \begin{macro}{\changes@}
% \changes{v2.06o}{2022/07/20}{Anpassungen für \pkg{doc}}^^A
% \changes{v2.06o}{2022/07/25}{Prüfen falscher Datumsangaben}^^A
% \begin{macro}{\changes@@}
% Vor den Änderungen wird geprüft, ob sich an der Definition aus dem Paket 
% \pkg{doc} etwas geändert hat. Der Befehl \cs{changehistoryname} wird vom 
% Paket \pkg{hypdoc} verwendet.
%    \begin{macrocode}
\def\changehistoryname{\tud@changes@name}
\CheckCommand*\changes@[3]{%
  \protected@edef\@tempa{%
    \noexpand\glossary{%
      #1%
      \ifdoc@reportchangedates\space -- #2\fi
      \levelchar
      \ifx\saved@macroname\@empty
        \quotechar!%
        \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 in |#2| angegebene Datum zur 
% Sortierung genutzt.
%    \begin{macrocode}
\renewcommand*\changes@[3]{%
  \ifnum\@parse@version@1993/01/01\@nil<\expandafter\@parse@version@#2//00\@nil%
    \expandafter\@gobble%
  \else%
    \expandafter\@firstofone%
  \fi{\ClassWarning{\TUD@Class@Name}{The given date `#2' seems to be invalid}}%
  \changes@@{#1}{#2}{#3}%
}
\ifdefined\tudxdyflag
  \newcommand*\changes@@[3]{%
    \protected@edef\@tempa{%
      \noexpand\glossary{%
        #1\ifdoc@reportchangedates\space -- #2\fi
        \levelchar
%    \end{macrocode}
% Das an die vorderster Stelle sortierte Zeichen ist |~| bei \app{texindy}.
%    \begin{macrocode}
        \ifx\saved@macroname\@empty
          \string~\actualchar\tud@general@name%
%    \end{macrocode}
% Gilt der Änderungseintrag einem Parameter wird eine zusätzliche Ebene vor dem
% eigentlichen Eintrag des Parameters erzeugt und der in \cs{tud@idx@parent}
% zuvor gesicherte Elterneintrag~-- Befehl oder Umgebung~-- eingefügt. Weil
% ohnehin eine Stildatei für \app{texindy} erzeugt wird, ist das Erzeugen 
% zusätzlicher Ebenen in der Änderungsliste einfach machbar. Prinzipiell wäre
% das mit einer entsprechenden Stildatei auch für \app{makeindex} machbar.
%    \begin{macrocode}
        \else
          \ifx\tud@idx@parent\relax\else
            \expandafter\@firstoftwo\tud@idx@parent\actualchar
            \expandafter\@secondoftwo\tud@idx@parent:\levelchar
          \fi
          \tud@idx@sortkey\actualchar\tud@idx@format%
        \fi
        :\levelchar
        #2\space\protecting{#3}\actualchar\protecting{#3}%
      }%
    }%
    \@tempa\endgroup\@esphack%
  }%
\else
%    \end{macrocode}
% Für \app{makeindex} wird der Befehl insbesondere für das Listen der Parameter 
% angepasst.
%    \begin{macrocode}
  \renewcommand*\changes@[3]{%
    \protected@edef\@tempa{%
      \noexpand\glossary{%
        #1\ifdoc@reportchangedates\space -- #2\fi
        \levelchar
        \ifx\saved@macroname\@empty
          \quotechar!\actualchar\tud@general@name%
        \else
          \ifx\tud@idx@parent\relax\else
            \expandafter\@firstoftwo\tud@idx@parent\space--\space%
          \fi
          \tud@idx@sortkey\actualchar
          \ifx\tud@idx@parent\relax\else
            \expandafter\@secondoftwo\tud@idx@parent\noexpand\,--\noexpand\,%
          \fi
          \tud@idx@format%
        \fi
        :\levelchar
        #2\space\protecting{#3}\actualchar\protecting{#3}%
      }%
    }%
    \@tempa\endgroup\@esphack%
  }%
\fi
%    \end{macrocode}
% \end{macro}^^A \changes@@
% \end{macro}^^A \changes@
% \end{macro}^^A \changehistoryname
% \begin{macro}{\tud@xdy@wrglossary}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% Die Referenzierung für \app{texindy} wird auch für Änderungseinträge genutzt.
%    \begin{macrocode}
\ifdefined\tudxdyflag
\newcommand*\tud@xdy@wrglossary[1]{%
%    \end{macrocode}
% Zunächst wird geprüft, ob eine Eintrag mit Refernz auf eine Seitenzahl oder 
% eine Codezeile erzeugt werden soll. Letztere werden nur erstellt, wenn im 
% Index überhaupt Codezeilen verwendet werden und der Änderungseintrag sich 
% auf ein zuletzt deklariertes Element (\cs{saved@macroname}) bezieht.
%    \begin{macrocode}
    \@tud@res@swafalse%
    \ifx\special@index\@gobble\else\ifcodeline@index
      \ifx\saved@macroname\@empty\else\@tud@res@swatrue\fi
    \fi\fi
    \global\advance\c@CodelineNo\@ne%
    \protected@write\@glossaryfile{}{%
      \string\glossaryentry{#1|change}%
        {\tud@xdy@reference{\if@tud@res@swa\number\c@CodelineNo\else0\fi}}%
    }%
    \global\advance\c@CodelineNo\m@ne%
  \endgroup%
  \@esphack%
}
\fi
%    \end{macrocode}
% \end{macro}^^A \tud@xdy@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@@sub}
% \changes{v2.05g}{2016/11/02}{neu}^^A
% \begin{macro}{\tud@lst@@@sub}
% \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@@sub{}
\newcommand*\tud@lst@@@sub{}
\newcommand*\efil{\hfil\nopagebreak}%
\newcommand*\tud@lst@def{%
  \newcommand*\tud@lst@values{}%
  \tud@newif\if@tud@lst@multi%
  \newcommand*\tud@lst@init{%
    \let\tud@lst@values\relax%
    \let\tud@lst@@sub\relax%
    \@tud@lst@multifalse%
  }%
  \newcommand*\tud@lst@add[1]{%
    \ifx\tud@lst@values\relax\else%
      \@tud@lst@multitrue%
      \def\tud@lst@@sub{\subitem}%
    \fi%
    \listadd\tud@lst@values{\tud@lst@@sub ##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{}%
  \tud@newif\if@tud@lst@@multi%
  \newcommand*\tud@lst@@init{%
    \let\tud@lst@@values\relax%
    \def\tud@lst@@sub{\subitem}%
    \def\tud@lst@@@sub{\space}%
    \@tud@lst@@multifalse%
  }%
  \newcommand*\tud@lst@@add[1]{%
    \@tud@lst@multitrue%
    \ifx\tud@lst@@values\relax\else%
      \@tud@lst@@multitrue%
      \def\tud@lst@@@sub{\subsubitem}%
    \fi%
    \listadd\tud@lst@@values{##1}%
  }%
  \newcommand*\tud@lst@@process{%
    \if@tud@lst@@multi%
      \appto\tud@lst@values{\efill}%
    \fi%
    \protected@edef\tud@reserved####1{%
      \noexpand\listadd\noexpand\tud@lst@values{%
        \expandonce\tud@lst@@@sub####1%
      }%
    }%
    \forlistloop{\tud@reserved}{\tud@lst@@values}%
    \tud@lst@@init%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \efil
% \end{macro}^^A \tud@lst@@@sub
% \end{macro}^^A \tud@lst@@sub
% \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{Setzen der Anpassungen für Index und Änderungsliste}
%
% Über den Hook |begindocument/before| erfolgt nun die Zuweisung der zuvor 
% gemachten Anpassungen an die jeweiligen Befehle, wobei zuvor die Definitionen 
% der relevanten Befehle geprüft wird. Mit \cs{DeclareHookRule} für das durch 
% \pkg{doc} verwendete Label |doc/hyperref| wird sichergestellt, dass die
% Anpassungen erst nach \pkg{doc} angewendet werden.
%    \begin{macrocode}
\DeclareHookRule{begindocument/before}{doc/hyperref}{<}{.}
\AddToHook{begindocument/before}{%
  \CheckCommand*\@wrindex[1]{%
    \protected@write\@indexfile{}{\string\indexentry{#1}{\thepage}}%
    \endgroup
    \@esphack%
  }
  \CheckCommand*\codeline@wrindex[1]{% ltxdoc
    \if@filesw
      \begingroup
        \let\protect\noexpand
        \immediate\write\@indexfile{%
          \string\indexentry{#1}{\filesep\number\c@CodelineNo}%
        }%
      \endgroup
    \fi
  }
  \@ifpackageloaded{hypdoc}{%
    \CheckCommand*\filesep{}
    \CheckCommand*\doc@handleencap[1]{%
      \encapchar hdclindex{\the\c@HD@hypercount}{#1}%
    }
    \CheckCommand*\HD@codeline@wrindex[1]{%
      \begingroup
        \let\HDorg@encapchar\encapchar
        \def\encapchar##1\encapchar##2\@nil{%
          \HDorg@encapchar
          hdclindex{\the\c@HD@hypercount}{##1}%
        }%
        \codeline@wrindex{#1\encapchar\encapchar\@nil}%
      \endgroup
    }
    \CheckCommand*\HD@page@wrindex[1]{%
      \begingroup
        \let\HDorg@encapchar\encapchar
        \def\encapchar##1\encapchar##2\@nil{%
          \HDorg@encapchar
          hdpindex{##1}%
        }%
        \HDorg@index{#1\encapchar\encapchar\@nil}%
      \endgroup
    }
    \CheckCommand*\@wrglossary[1]{%
      \let\HDorg@encapchar\encapchar
      \def\encapchar##1\encapchar##2\@nil{%
        \HDorg@encapchar
        hdpindex{##1}%
      }%
      \HDorg@wrglossary{#1\encapchar\encapchar\@nil}%
    }
    \CheckCommand*\HDorg@wrglossary[1]{%
      \protected@write\@glossaryfile{}%
      {\string\glossaryentry{#1}{\thepage}}%
      \endgroup
      \@esphack%
    }
  }{%
    \CheckCommand*\@wrglossary[1]{%
      \protected@write\@glossaryfile{}%
      {\string\glossaryentry{#1}{\thepage}}%
      \endgroup
      \@esphack%
    }
  }
%    \end{macrocode}
% Prüfung beendet, jetzt erfolgt die eigentliche Zuweisung.
%    \begin{macrocode}
  \ifdefined\tudxdyflag
    \ifx\special@index\@gobble\else
      \ifcodeline@index
        \let\special@index\tud@xdy@codeline@wrindex
      \else
        \let\special@index\tud@xdy@page@wrindex
      \fi
      \@ifpackageloaded{hypdoc}{%
        \let\HD@codeline@wrindex\tud@xdy@codeline@wrindex
        \let\HD@page@wrindex\tud@xdy@page@wrindex
      }{}%
    \fi
    \let\filesep\tud@xdy@filesep
    \def\doc@handleencap#1{\encapchar #1}
    \let\@wrindex\tud@xdy@wrindex
    \let\@wrglossary\tud@xdy@wrglossary
  \fi
}
%    \end{macrocode}
%
% \subsubsection{Verarbeiten der Hilfsdateien von Index und Änderungsliste}
%
% \begin{macro}{\tud@xdy@write}
% \changes{v2.05}{2016/04/21}{neu}^^A
% \begin{macro}{\tud@xdy@read}
% \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}
% \ToDo{äquivalent zu tudscrmanual.cls; shell-escape raus, via makefile}[v2.07]
%    \begin{macrocode}
%^^A\BeforeClosingMainAux{%
%^^A\immediate\closeout\@indexfile%
%^^A\immediate\closeout\@glossaryfile%
%    \end{macrocode}
% 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
  \tud@newwrite\tud@xdy@write%
  \tud@newread\tud@xdy@read%
%    \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@xdy@read=\jobname.#1\relax%
        \immediate\openout\tud@xdy@write=\jobname-xdy.#1\relax%
        \@tempswafalse%
        \loop\unless\ifeof\tud@xdy@read%
          \readline\tud@xdy@read to\tud@line@replace%
%    \end{macrocode}
% Um potenzielle Dopplungen zu vermeiden, wird \cs{quotechar} vor Zeichen 
% entfernt, die ohnehin gegebenenfalls manuell behandelt werden müssen.
%    \begin{macrocode}
          \expandafter\tud@replace@@in\expandafter\tud@line@replace%
            \expandafter{\quotechar"}{"}%
          \expandafter\tud@replace@@in\expandafter\tud@line@replace%
            \expandafter{\quotechar!}{!}%
          \expandafter\tud@replace@@in\expandafter\tud@line@replace%
            \expandafter{\quotechar:}{:}%
          \expandafter\tud@replace@@in\expandafter\tud@line@replace%
            \expandafter{\quotechar @}{@}%
%    \end{macrocode}
% Jetzt die manuellen Anpassungen für Zeichen, die eigentlich zur Steuerung
% der Indexeinträge genutzt werden.
%    \begin{macrocode}
          \tud@replace@@in\tud@line@replace{"}{""}%
          \tud@replace@@in\tud@line@replace{!}{"!}%
          \tud@replace@@in\tud@line@replace{:}{":}%
          \tud@replace@@in\tud@line@replace{@}{"@}%
          \tud@replace@@in\tud@line@replace{\"@}{"\"@}%
%    \end{macrocode}
% Abschließend erfolgt das Einsetzen der Steuerzeichen.
%    \begin{macrocode}
          \expandafter\tud@replace@@in\expandafter\tud@line@replace%
            \expandafter{\actualchar}{@}%
          \expandafter\tud@replace@@in\expandafter\tud@line@replace%
            \expandafter{\quotechar}{"}%
          \expandafter\tud@replace@@in\expandafter\tud@line@replace%
            \expandafter{\levelchar}{!}%
          \tud@replace@@in\tud@line@replace{" @}{}%
          \ifeof\tud@xdy@read\else%
            \immediate\write\tud@xdy@write{%
              \unexpanded\expandafter{\tud@line@replace}%
            }%
            \@tempswatrue%
          \fi%
        \repeat%
        \immediate\closein\tud@xdy@read%
        \immediate\closeout\tud@xdy@write%
        \ifnum\pdf@shellescape=\@ne\relax%
          \if@tempswa%
            \ShellEscape{%
              texindy\space%
              -M \@currname-#2.xdy\space%
              \ifdefvoid{\inputencodingname}{%
                -C\space utf8%
              }{%
                -C\space\inputencodingname%
              }\space%
              -t \jobname-#2.xlg\space%
              -o \jobname.#2\space%
              \jobname-xdy.#1%
            }%
%    \end{macrocode}
% Falls nichts geschrieben wurde, wird eine leere Ausgabedatei erzeugt.
%    \begin{macrocode}
          \else%
            \immediate\openout\tud@xdy@write=\jobname.#2\relax%
            \immediate\closeout\tud@xdy@write%
          \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}
% \ToDo{äquivalent zu tudscrmanual.cls}[v2.07]
%    \begin{macrocode}
%^^A}
%    \end{macrocode}
% \end{macro}^^A \levelchar
% \end{macro}^^A \quotechar
% \end{macro}^^A \actualchar
% \end{macro}^^A \tud@line@replace
% \end{macro}^^A \tud@xdy@read
% \end{macro}^^A \tud@xdy@write
%
% \subsection{Liste anstehender Aufgaben}
%
% \begin{macro}{\PrintToDos}
% \changes{v2.05}{2016/05/19}{neu}^^A
% Für ToDo-Notizen wird eine Liste aller anstehender Aufgaben definiert.
%    \begin{macrocode}
\DeclareNewTOC[%
  listname={\tud@todo@name},%
  owner=\@currname,%
]{tdo}
\setuptoc{tdo}{totoc,noindent}
\newcommand*\PrintToDos{\ifdefined\tudfinalflag\else\listoftoc{tdo}\fi}
%    \end{macrocode}
% \end{macro}^^A \PrintToDos
% \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}
\ifdefined\tudfinalflag
\NewDocumentCommand\ToDo{mo}{}
\else%
\NewDocumentCommand\ToDo{mo}{%
  \begingroup%
    \csuse{phantomsection}%
    \IfValueTF{#2}{%
      \def\tud@reserved{#2}%
    }{%
      \def\tud@reserved{??}%
    }%
    \endgraf\ifdim\parskip>\z@\else\smallskip\fi\noindent%
    \hfuzz0.8pt%
    \leavevmode%
    \def\@tempa{\raggedleft\fbox{ToDo:\space\tud@reserved\strut}}%
    \ifundef{\marginnote}{%
      \expandafter\marginpar\expandafter{\@tempa}%
    }{%
      \expandafter\marginnote\expandafter{\@tempa}[%
        \dimexpr-\fboxsep-\fboxrule\relax%
      ]%
    }%
    \fbox{\parbox{\dimexpr\linewidth-\fboxsep*2\relax}{#1\strut}}%
    \endgraf\ifdim\parskip>\z@\else\bigskip\fi\noindent%
%    \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%
    \ifdefvoid{\currentfile}{}{%
      \def\@tempa{\,--\,\texttt{\currentfile}}%
    }%
    \addxcontentsline{tdo}{subsection}{\tud@reserved\@tempa:\space#1}%
  \endgroup%
  \ignorespaces%
}
\fi
%    \end{macrocode}
% \end{macro}^^A \ToDo
%
%
% \subsection{Ausgabe des Schlussteils}
%
% \begin{macro}{\PrintBackMatter}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% \begin{macro}{\tud@index@heading}
% \changes{v2.06o}{2022/07/24}{neu}^^A
% Hiermit lassen sich Index, Änderungsliste und die Liste offener Aufgaben
% gemeinsam ausgegeben. Dafür werden die Einleitungen für Index und 
% Änderungsliste angepasst und \cs{tud@index@heading} definiert. Somit lässt 
% sich das Level der Überschriften dynamisch anpassen ohne die bei der 
% Verarbeitung des Dokumentes durch \cls{ltxdoc} applizierten Anpassungen 
% zu beeinflussen. Die Sternversion von \cs{PrintBackMatter} setzt die 
% Überschriften mit \cs{addpart}, die Standardvariante via \cs{addsec}.
%    \begin{macrocode}
\newcommand*\tud@index@heading{\addsec}
\IndexPrologue{\tud@index@heading{\indexname}\tud@index@text}
\GlossaryPrologue{\tud@index@heading{\tud@changes@name}}
\NewDocumentCommand\PrintBackMatter{s}{%
  \begingroup%
    \@ifpackageloaded{bookmark}{\bookmarksetup{startatroot,open=false}}{}%
    \IfBooleanT{#1}{\renewcommand*\tud@index@heading{\addpart}}%
    \deftocheading{tdo}{\tud@index@heading{##1}}%
    \IfBooleanT{#1}{\cleardoublepage}\PrintIndex%
    \IfBooleanT{#1}{\cleardoublepage}\PrintChanges%
    \IfBooleanT{#1}{\cleardoublepage}\PrintToDos%
  \endgroup%
}
%    \end{macrocode}
% \end{macro}^^A\tud@index@heading
% \end{macro}^^A\PrintBackMatter
% \begin{macro}{\@docinclude}
% Damit die Liste der anstehenden Aufgaben bei der Erzeugung der gesamten 
% Dokumentation des Quelltextes einmalig sowie vollständig und nicht nach jeder
% Quelldatei einzeln ausgegeben wird, muss \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
%
% \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\shapedefault%
    \small%
  }%
  \renewcommand*\MacroFont{%
    \fontencoding\encodingdefault%
    \fontfamily\ttdefault%
    \fontseries\mdseries@tt%
    \fontshape\shapedefault%
    \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}
% \end{macro}^^A \AltMacroFont
% \end{macro}^^A \MacroFont
%
% \iffalse
%</class&body>
%<*class&option>
% \fi
%
% 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}
%
% \iffalse
%</class&option>
%<*class&body>
% \fi
%
% 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}{\labelsep}
% \begin{length}{\marginparsep}
% \begin{length}{\marginparwidth}
% \begin{length}{\oddsidemargin}
% Hiermit wird der Satzspiegel berechnet, wobei \length{labelsep} als Maß für
% die Seitenränder sowie den Abstand von Randnotizen und Textkörper dient.
%    \begin{macrocode}
\newcommand*\tud@setarea{%
  \tud@setdim\topmargin{-1in}%
  \tud@setdim\headheight{0pt}%
  \tud@setdim\headsep{3em}%
  \tud@setdim\footskip{\headsep}%
  \tud@setdim\textheight{\paperheight-\headsep*5/2-\footskip*3/2}%
  \@colht=\textheight%
  \@colroom=\textheight%
  \vsize=\textheight%
  \settowidth\MacroIndent{\rmfamily\scriptsize 0000\ }%
  \begingroup%
    \MacroFont\selectfont%
    \settowidth\@tempdima{\space}%
    \tud@setdim\@tempdima{80\@tempdima}%
    \tud@addtodim\@tempdima{\MacroIndent}%
    \edef\@tempa{%
      \endgroup%
      \unexpanded{\tud@setdim\textwidth}{\the\@tempdima}%
    }%
  \@tempa%
  \columnwidth=\textwidth%
  \hsize=\columnwidth%
  \linewidth=\hsize%
  \tud@setdim\columnsep{1em}%
  \tud@setdim\labelsep{1em}%
  \tud@setdim\marginparsep{\labelsep}%
  \tud@setdim\oddsidemargin{\paperwidth-\textwidth-\labelsep-1in}%
  \tud@setdim\marginparwidth{\oddsidemargin+1in-\labelsep-\marginparsep}%
}
\AtBeginDocument{\tud@setarea}
%    \end{macrocode}
% \end{length}^^A \oddsidemargin
% \end{length}^^A \marginparwidth
% \end{length}^^A \marginparsep
% \end{length}^^A \labelsep
% \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
%
% 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}
\TUD@UnwindPackage{tudscrfonts}{%
  \RequirePackage{lmodern}
  \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}
%
% \subsection{Zusätzliche Markup-Befehle}
%
% \begin{macro}{\app}
% \begin{macro}{\bdl}
% \begin{macro}{\cls}
% \begin{macro}{\pkg}
% \begin{macro}{\opt}
% \begin{macro}{\val}
% \begin{macro}{\default}
% \changes{v2.06o}{2022/07/25}{neu}^^A
% \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.
% \ToDo{Befehl \cs{notebox}: siehe \file{svg.dtx}}[v2.07]
%    \begin{macrocode}
\newrobustcmd*\app[1]{\mbox{\textsl{\textbf{#1}}}}
\newrobustcmd*\bdl[1]{\mbox{\textsf{\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*\default[1]{\val{\textit{#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\bdl\@firstofone%
    \let\cls\@firstofone%
    \let\pkg\@firstofone%
    \let\opt\@firstofone%
    \let\val\@firstofone%
    \let\default\@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 \default
% \end{macro}^^A \val
% \end{macro}^^A \opt
% \end{macro}^^A \pkg
% \end{macro}^^A \cls
% \end{macro}^^A \bdl
% \end{macro}^^A \app
%
% \iffalse
%</class&body>
% \fi
%
% \PrintBackMatter
%
\endinput
