% \CheckSum{2307}
% \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-area.dtx
%<*dtx>
% \fi%
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\ProvidesFile{tudscr-area.dtx}[2020/06/18 v2.06g TUD-Script\space%
  (type or page area)%
]
%
% \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-area.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.02}{2014/06/23}{Paket \pkg{titlepage} nicht weiter unterstützt}^^A
% \changes{v2.02}{2014/07/08}{\cs{FamilyKeyState} wird von Optionen genutzt}^^A
% \changes{v2.05}{2015/07/06}{Seitenstil für Poster}^^A
% \changes{v2.05}{2016/04/03}{Unterstützung von Schnittmarken mit den Paketen
%   \pkg{geometry} und \pkg{crop}}^^A
%
% \section{Der Satzspiegel für \TUDScript}
%
% Das \CD verlangt (eigentlich) einen fest vorgegebenen Satzspiegel. Für das
% Setzen längerer wissenschaftlicher Abhandlungen ist dieser jedoch alles
% andere als glücklich gewählt. Insbesondere für den doppelseitigen Satz ist
% das Standardlayout nicht gut nutzbar. Für die \TUDScript-Klassen wird 
% deshalb die Abweichung vom sonst fest vorgegebenen Satzspiegel ermöglicht.
% \ToDo{%
%   Unterstützung von PDF-Boxen für die Druckausgabe
%^^A\url{https://groups.google.com/forum/#!topic/de.comp.text.tex/1gouJ0Zov6o}
%^^A\url{http://tex.stackexchange.com/questions/248902/}
%^^A\url{https://wiki.scribus.net/canvas/PDF_Boxes_:_mediabox,_cropbox,_bleedbox,_trimbox,_artbox}
%^^A\url{http://www.prepressure.com/pdf/basics/page-boxes}
% }[v2.07]
%
% \StopEventually{\PrintIndex\PrintChanges\PrintToDos}
%
% \iffalse
%<*class&body>
% \fi
%
% \subsection{Kompatibilität der Satzspiegeleinstellungen mit weiteren Paketen}
% \subsubsection{Unterstützung von Schnittmarken mit dem Paket \pkg{crop}}
%
% Insbesondere für das Erstelen von Postern sollen häufig Schnittmarken auf dem 
% ausgegebenen Papierbogen erscheinen. Dies lässt sich entweder mit den Mitteln 
% des Paketes \pkg{geometry} oder aber durch das Paket \pkg{crop} realisieren. 
% Für letzteres ist dafür ein kleiner Patch notwendig. 
%
% \begin{macro}{\if@tud@x@crop@center}
% \changes{v2.05}{2016/04/03}{neu}^^A
% \begin{macro}{\CROP@center}
% \changes{v2.05}{2016/04/03}{neu}^^A
% Das Paket \pkg{crop} bietet die Option, den Satzspiegel auf dem Papierbogen 
% zu zentrieren. Diese Einstellung geht beim Laden eines neuen Satzspiegels mit 
% \cs{loadgeometry} verloren. Hiermit wird das Problem behoben.
%    \begin{macrocode}
\newif\if@tud@x@crop@center
\AfterPackage{crop}{%
  \CheckCommand*\CROP@center{%
    \voffset\stockheight
    \advance\voffset-\paperheight
    \voffset.5\voffset
    \hoffset\stockwidth
    \advance\hoffset-\paperwidth
    \hoffset.5\hoffset
  }%
  \pretocmd{\CROP@center}{%
    \@tud@x@crop@centertrue%
  }{}{\tud@patch@wrn{CROP@center}}%
}
%    \end{macrocode}
% \end{macro}^^A \CROP@center
% \end{macro}^^A \if@tud@x@crop@center
%
% \subsubsection{Unterstützung der Klasse \cls{standalone}}
%
% \changes{v2.02}{2014/07/25}{Unterstützung der \cls{standalone}-Klasse}^^A
%
% Mit der Klasse~\cls{standalone} können insbesondere Grafiken als separate 
% (PDF-)Dateien erzeugt und später im Dokument eingebunden werden. Diese Klasse 
% ändert allerhand an den Einstellungen der Seitenränder. Damit sich diese bei
% der Verwendung mit den \TUDScript-Klassen nicht in die Quere kommen, müssen 
% für einige Einstellungen unterdrückt werden.
%
% \begin{macro}{\if@tud@x@standalone@crop}
% \changes{v2.02}{2014/09/08}{neu}^^A
% Mit diesem Makro kann die Verwendung der Option \opt{crop} mit der Klasse 
% \cls{standalone} geprüft werden. Das erste Argument wird ausgeführt, wenn 
% die Klasse geladen und die Option aktiv ist. Das zweite Argument wird 
% ausgeführt, wenn entweder die Option \opt{crop} deaktiviert ist oder die 
% Klasse \cls{standalone} gar nicht geladen wurde.
%    \begin{macrocode}
\newif\if@tud@x@standalone@crop
\AfterClass*{standalone}{\let\if@tud@x@standalone@crop\ifsa@crop}
%    \end{macrocode}
% \end{macro}^^A \if@tud@x@standalone@crop
%
% \subsection{Definition der Größen und Maße in abhängig vom Papierformat}
%
% Die \TUDScript-Klassen sollen neben den vom \CD vorgegebenen Seitenrändern 
% weitere Satzspiegel ermöglichen und u.\,a. auch die Nutzung des Paketes
% \pkg{typearea} erlauben. Damit ein einheitliches Verfahren zur Wahl bzw.
% Umschaltung des Satzspiegels genutzt werden kann, wird momentan das Paket
% \pkg{geometry} genutzt. Dabei werden entweder die gewünschten Maße der
% Seitenränder direkt gewählt oder aber die mit \pkg{typearea} berechneten Maße
% an \pkg{geometry} durchgereicht.
%
% \begin{length}{\tud@len@widemargin}
% \begin{length}{\tud@len@slimmargin}
% \begin{length}{\tud@len@both}
% Die Seitenränder für links und rechts sowie deren Summe, welche später für
% weitere Satzspiegeleinstelungen dazu verwendet wird, diese anteilig zu 
% verteilen.
%    \begin{macrocode}
\newlength\tud@len@widemargin
\newlength\tud@len@slimmargin
\newlength\tud@len@both
%    \end{macrocode}
% \end{length}^^A \tud@len@both
% \end{length}^^A \tud@len@slimmargin
% \end{length}^^A \tud@len@widemargin
% \begin{length}{\tud@len@topmargin}
% \begin{length}{\tud@len@barheight}
% \begin{length}{\tud@len@headsep}
% \begin{length}{\tud@len@footsep}
% Es folgen die speziellen Maße für die Seiten mit dem TUD-Kopf, also die Höhe
% oberhalb des Querbalkens, die Höhe des Querbalkens selbst sowie der vertikale
% (Mindest"~)Abstand zwischen Querbalken und Textkörper sowie der Fußzeile.
%    \begin{macrocode}
\newlength\tud@len@topmargin
\newlength\tud@len@barheight
\newlength\tud@len@headsep
\newlength\tud@len@footsep
%    \end{macrocode}
% \end{length}^^A \tud@len@footsep
% \end{length}^^A \tud@len@headsep
% \end{length}^^A \tud@len@barheight
% \end{length}^^A \tud@len@topmargin
% \begin{length}{\tud@len@logox}
% \begin{length}{\tud@len@logoy}
% \begin{length}{\tud@len@logowidth}
% Außerdem müssen Abmessungen und Position des TUD-Logos definiert werden,
% genauer der horizontale (Soll"~)Abstand zwischen linkem Seitenrand und Logo,
% der vertikale (Soll"~)Abstand zwischen oberem Seitenrand und Logo sowie die
% Breite und Höhe\footnote{Proportionen sind durch die Grafik vorgegeben} des 
% Logos.
%    \begin{macrocode}
\newlength\tud@len@logox
\newlength\tud@len@logoy
\newlength\tud@len@logowidth
%    \end{macrocode}
% \end{length}^^A \tud@len@logowidth
% \end{length}^^A \tud@len@logoy
% \end{length}^^A \tud@len@logox
% \begin{length}{\tud@len@line}
% \changes{v2.02}{2014/06/23}{neu}^^A
% \begin{length}{\tud@len@heavyline}
% \begin{length}{\tud@len@thinline}
% Die Linienstärke der Outline im Kopf ist für ein monochromes Layout schmaler
% als im Layout mit farbigem Hintergrund.\footnote{monochrom 
% \cs{tud@len@thinline}, koloriert \cs{tud@len@heavyline}} Da im Dokument beide 
% Varianten vorkommen können, wird die Breite \cs{tud@len@line} durch den
% Seitenstil situativ entweder auf den Wert von \cs{tud@len@thinline} oder aber
% \cs{tud@len@heavyline} gesetzt.
%    \begin{macrocode}
\newlength\tud@len@line
\newlength\tud@len@heavyline
\newlength\tud@len@thinline
%    \end{macrocode}
% \end{length}^^A \tud@len@thinline
% \end{length}^^A \tud@len@heavyline
% \end{length}^^A \tud@len@line
% \begin{length}{\tud@len@areaheadvskip}
% \changes{v2.02}{2014/06/23}{neu}^^A
% \begin{length}{\tud@len@areadiff}
% \begin{length}{\tud@len@areavskip}
% Die Längen für den vertikalen Standardversatz der Überschriften sowie die 
% Differenz der Kopfhöhen von normalem und TUD-Kopf-Satzspiegel. Die Differenz 
% zwischen den unterschiedlichen Kopfhöhen der Satzspiegelvarianten wird durch
% \cs{tud@cdgeometry@@process} berechnet und dabei in \cs{tud@len@areadiff} 
% gespeichert. Dabei muss unterschieden werden, ober der Satzspiegel des \CDs 
% oder der durch \pkg{typearea} berechnete respektive durch den Anwender mit 
% \pkg{geometry} vorgegebene genutzt wird. Davon abhängig wird zum Ausgleich 
% die Länge \cs{tud@len@areavskip} definiert.
%    \begin{macrocode}
\newlength\tud@len@areaheadvskip
\newlength\tud@len@areadiff
\newlength\tud@len@areavskip
%    \end{macrocode}
% \end{length}^^A \tud@len@areavskip
% \end{length}^^A \tud@len@areadiff
% \end{length}^^A \tud@len@areaheadvskip
% \begin{length}{\tud@len@ddcdiff}
% \changes{v2.02}{2014/06/23}{neu}^^A
% Zu guter Letzt noch die Länge \cs{tud@len@ddcdiff} für den Höhenausgleich des 
% Seitenfußes, welcher bei der Verwendung des \DDC-Logos in der Fußzeile bei 
% Version~v2.02 für den Satzspiegel notwendig war. Dieser etwas verschrobene
% Satzspiegel wird im Kompatibilitätsmodus weiterhin angeboten.
%    \begin{macrocode}
\tud@if@v@lower{2.03}{\newlength\tud@len@ddcdiff}{}
%    \end{macrocode}
% \end{length}^^A \tud@len@ddcdiff
% \begin{macro}{\tud@head@fontsize}
% Für den Querbalken wird außerdem die zu verwendende Schriftgröße definiert.
%    \begin{macrocode}
\newcommand*\tud@head@fontsize{}
%    \end{macrocode}
% \end{macro}^^A \tud@head@fontsize
% \begin{macro}{\tud@cdgeometry@set}
% \changes{v2.03}{2015/01/23}{Längenberechnung für den Satzspiegel an 
%   Referenzlänge \cs{tud@len@widemargin} gekoppelt}^^A
% \changes{v2.05}{2015/07/15}{Fallunterscheidung an DIN-B-Reihe angepasst}^^A
% \changes{v2.05}{2016/04/03}{Option \opt{layout} von \pkg{geometry} möglich}^^A
% \begin{macro}{\if@tud@cdgeometry@adjust}
% \changes{v2.05}{2015/11/29}{neu}^^A
% \begin{macro}{\tud@cdgeometry@assignlayout}
% \changes{v2.06}{2018/08/13}{neu}^^A
% \begin{macro}{\tud@cdgeometry@resetlayout}
% \changes{v2.06g}{2020/06/18}{neu, Bugfix für Änderung des Papierformates}^^A
% \begin{macro}{\tud@cdgeometry@papersize@store}
% \changes{v2.06g}{2020/06/18}{neu}^^A
% \begin{macro}{\tud@cdgeometry@papersize@last}
% \changes{v2.06g}{2020/06/18}{neu}^^A
% \begin{length}{\tud@len@layoutwidth}
% \changes{v2.05}{2016/04/03}{neu}^^A
% \begin{length}{\tud@len@layoutheight}
% \changes{v2.05}{2016/04/03}{neu}^^A
% \begin{length}{\tud@len@layouthoffset}
% \changes{v2.05}{2016/04/03}{neu}^^A
% \begin{length}{\tud@len@layoutvoffset}
% \changes{v2.05}{2016/04/03}{neu}^^A
% Hiermit werden in Abhängigkeit der gewählten Papiergröße die Maße für die
% Größe der Kopfzeile, die Position des Logos, die Seitenränder sowie die
% Schriftgröße in der Kopfzeile definiert. Aufgerufen wird der Befehl durch
% \cs{tud@cdgeometry@@process}. Dabei fungiert \cs{tud@len@widemargin} als 
% Bezugslänge. Die maßgebliche Papiergröße ist DIN~A4 bzw. DIN~B4. Die Längen
% für alle anderen Papiermaße unterscheiden sich um den Faktor~$\sqrt{2}$,
% wobei das Format DIN~A5 nach den Vorgaben des \CDs übersprungen wird. 
%
% Um die Überschriften und den Satzspiegel auch in diesem Fall vertikal richtig
% zu positionieren, wird der Schalter \cs{if@tud@cdgeometry@adjust} benötigt.
% Mit der Einstellung \opt{cdgeometry}|=|\val{adapted} wird auch das Format 
% DIN~A5 mit den skalierten Seitenrändern erstellt.
%    \begin{macrocode}
\newif\if@tud@cdgeometry@adjust
\newlength\tud@len@layoutwidth
\newlength\tud@len@layoutheight
\newlength\tud@len@layouthoffset
\newlength\tud@len@layoutvoffset
\newcommand*\tud@cdgeometry@set{%
  \tud@cdgeometry@assignlayout%
  \tud@if@v@lower{2.05}{%
    \ifdim\tud@len@layoutheight<\dimexpr105mm+1.5mm\relax%
      \def\@tempa{0}%
    \else\ifdim\tud@len@layoutheight<\dimexpr148mm+1.5mm\relax%
      \def\@tempa{1}%
    \else\ifdim\tud@len@layoutheight<\dimexpr229mm+2mm\relax%
      \def\@tempa{2}%
    \else\ifdim\tud@len@layoutheight<\dimexpr297mm+2mm\relax%
      \def\@tempa{3}%
    \else\ifdim\tud@len@layoutheight<\dimexpr420mm+2mm\relax%
      \def\@tempa{4}%
    \else\ifdim\tud@len@layoutheight<\dimexpr594mm+2mm\relax%
      \def\@tempa{5}%
    \else\ifdim\tud@len@layoutheight<\dimexpr841mm+3mm\relax%
      \def\@tempa{6}%
    \else\ifdim\tud@len@layoutheight<\dimexpr1189mm+3mm\relax%
      \def\@tempa{7}%
    \else%
      \def\@tempa{8}%
    \fi\fi\fi\fi\fi\fi\fi\fi%
  }{%
    \ifdim\tud@len@layoutheight<\dimexpr125mm+1.5mm\relax%
      \def\@tempa{0}%
    \else\ifdim\tud@len@layoutheight<\dimexpr176mm+2mm\relax%
      \def\@tempa{1}%
    \else\ifdim\tud@len@layoutheight<\dimexpr250mm+2mm\relax%
      \def\@tempa{2}%
    \else\ifdim\tud@len@layoutheight<\dimexpr353mm+2mm\relax%
      \def\@tempa{3}%
    \else\ifdim\tud@len@layoutheight<\dimexpr500mm+2mm\relax%
      \def\@tempa{4}%
    \else\ifdim\tud@len@layoutheight<\dimexpr707mm+3mm\relax%
      \def\@tempa{5}%
    \else\ifdim\tud@len@layoutheight<\dimexpr1000mm+3mm\relax%
      \def\@tempa{6}%
    \else\ifdim\tud@len@layoutheight<\dimexpr1414mm+3mm\relax%
      \def\@tempa{7}%
    \else%
      \def\@tempa{8}%
    \fi\fi\fi\fi\fi\fi\fi\fi%
  }%
%    \end{macrocode}
% In Abhängigkeit von der gefundenen Gestaltungshöhe wird nun der Satzspiegel 
% definiert. Dabei wird geprüft, ob dieser im entweder innerhalb des durch das 
% \CD vorgegebenen Rasters erzeugt oder anhand der Gestaltungshöhe berechnet
% werden soll. 
%    \begin{macrocode}
  \@tud@cdgeometry@adjustfalse%
%    \end{macrocode}
% Eine Berechnung des Satzspiegels findet in jedem Fall außerhalb des Rasters 
% statt. Ansonsten wird DIN~A4 als Referenzformat ausgewählt.
%    \begin{macrocode}
  \ifnum\tud@cdgeometry@calc@num=\tw@\relax%
    \ifnum\@tempa>\z@\relax%
      \ifnum\@tempa<8\relax%
        \def\@tempa{3}%
      \fi%
    \fi%
  \fi%
%    \end{macrocode}
% Bei Formaten, welche kleiner als das Raster sind, wird die Gestaltungshöhe 
% für DIN~A6 als Referenz genommen, um den Satzspiegel zu brechnen.
%    \begin{macrocode}
  \ifcase\@tempa\relax% <=A7/B7
    \ifnum\tud@cdgeometry@calc@num=\tw@\relax\else%
      \ClassWarning{\TUD@Class@Name}{%
        There's no type area defined for such a\MessageBreak%
        small paper height. It is recommended to increase\MessageBreak%
        the paper size. Nevertheless, it will be tried to\MessageBreak%
        calculate a proper type area%
      }%
    \fi%
    \tud@divide\@tempa{\tud@len@layoutheight}{148mm}%
    \setlength\tud@len@widemargin{15mm}%
    \setlength\tud@len@widemargin{\@tempa\tud@len@widemargin}%
    \setlength\tud@len@heavyline{0.5pt}%
    \setlength\tud@len@heavyline{\@tempa\tud@len@heavyline}%
    \setlength\tud@len@thinline{0.25pt}%
    \setlength\tud@len@thinline{\@tempa\tud@len@thinline}%
    \setlength\@tempdima{4.5pt}%
    \setlength\@tempdima{\@tempa\@tempdima}%
    \edef\tud@head@fontsize{\strip@pt\@tempdima}%
  \or% <=A6/B6
    \setlength\tud@len@widemargin{15mm}%
    \setlength\tud@len@heavyline{0.5pt}%
    \setlength\tud@len@thinline{0.25pt}%
    \renewcommand*\tud@head@fontsize{4.5}%
%    \end{macrocode}
% Für Formate der Klasse~5 gibt es zwei Varianten. Entweder, es wird sich an 
% das Raster des \CDs geahtlen oder es wird ein eigener Satzspiegel für das 
% Papierformat definiert. Wird das Raster gehalten, muss bei den Überschriften
% etwas getrickst werden, weshalb der Schalter \cs{if@tud@cdgeometry@adjust} 
% gesetzt wird.
%    \begin{macrocode}
  \or% <=A5/B5
    \ifnum\tud@cdgeometry@calc@num=\z@\relax% restricted
      \@tud@cdgeometry@adjusttrue%
      \setlength\tud@len@widemargin{30mm}%
      \setlength\tud@len@heavyline{1pt}%
      \setlength\tud@len@thinline{0.5pt}%
      \renewcommand*\tud@head@fontsize{9}%
    \else%
      \setlength\tud@len@widemargin{21.213203mm}%
      \setlength\tud@len@heavyline{0.707107pt}%
      \setlength\tud@len@thinline{0.353553pt}%
      \renewcommand*\tud@head@fontsize{6.363961}%
    \fi%
  \or% <=A4/B4
    \setlength\tud@len@widemargin{30mm}%
    \setlength\tud@len@heavyline{1pt}%
    \setlength\tud@len@thinline{0.5pt}%
    \renewcommand*\tud@head@fontsize{9}%
  \or% <=A3/B3
    \setlength\tud@len@widemargin{42.426407mm}%
    \setlength\tud@len@heavyline{1.414214pt}%
    \setlength\tud@len@thinline{0.707107pt}%
    \renewcommand*\tud@head@fontsize{12.727922}%
  \or% <=A2/B2
    \setlength\tud@len@widemargin{60mm}%
    \setlength\tud@len@heavyline{2pt}%
    \setlength\tud@len@thinline{1pt}%
    \renewcommand*\tud@head@fontsize{18}%
  \or% <=A1/B1
    \setlength\tud@len@widemargin{84.852814mm}%
    \setlength\tud@len@heavyline{2.828427pt}%
    \setlength\tud@len@thinline{1.414214pt}%
    \renewcommand*\tud@head@fontsize{25.455844}%
  \or% <=A0/B0
    \setlength\tud@len@widemargin{120mm}%
    \setlength\tud@len@heavyline{4pt}%
    \setlength\tud@len@thinline{2pt}%
    \renewcommand*\tud@head@fontsize{36}%
  \else% >A0/B0
%    \end{macrocode}
% Wei bei zu kleinen Formaten wird auch bei Formaten oberhalb des Rasters die
% der Satzspiegel aus der Gestaltungshöhe berechnet, wobei hier DIN~A0 als 
% Referenz verwendet wird.
%    \begin{macrocode}
    \ifnum\tud@cdgeometry@calc@num=\tw@\relax\else%
      \ClassWarning{\TUD@Class@Name}{%
        There's no type area defined for such a\MessageBreak%
        huge paper height. It is recommended to reduce\MessageBreak%
        the paper size. Nevertheless, it will be tried to\MessageBreak%
        calculate a proper type area%
      }%
    \fi%
    \tud@divide\@tempa{\tud@len@layoutheight}{1189mm}%
    \setlength\tud@len@widemargin{120mm}%
    \setlength\tud@len@widemargin{\@tempa\tud@len@widemargin}%
    \setlength\tud@len@heavyline{4pt}%
    \setlength\tud@len@heavyline{\@tempa\tud@len@heavyline}%
    \setlength\tud@len@thinline{2pt}%
    \setlength\tud@len@thinline{\@tempa\tud@len@thinline}%
    \setlength\@tempdima{36pt}%
    \setlength\@tempdima{\@tempa\@tempdima}%
    \edef\tud@head@fontsize{\strip@pt\@tempdima}%
  \fi%
%    \end{macrocode}
% Wurde die Berechnung aktiviert, dann erfolgt diese anhand der Referenz im 
% Format DIN~A4.
%    \begin{macrocode}
  \ifnum\tud@cdgeometry@calc@num=\tw@\relax%
    \tud@divide\@tempa{\tud@len@layoutheight}{297mm}%
    \setlength\tud@len@widemargin{\@tempa\tud@len@widemargin}%
    \setlength\tud@len@heavyline{\@tempa\tud@len@heavyline}%
    \setlength\tud@len@thinline{\@tempa\tud@len@thinline}%
    \setlength\@tempdima{\tud@head@fontsize pt}%
    \setlength\@tempdima{\@tempa\@tempdima}%
    \edef\tud@head@fontsize{\strip@pt\@tempdima}%
  \fi%
%    \end{macrocode}
% Zum Schluss werden die restlichen Längen aus der Referenzlänge berechnet und 
% das Erstellen der Kopfzeile aufgrund der möglichen Änderung der Schriftgröße
% forciert.
%    \begin{macrocode}
  \global\@tud@head@font@settrue%
  \setlength\tud@len@slimmargin{\dimexpr2\tud@len@widemargin/3\relax}%
  \setlength\tud@len@both{\dimexpr5\tud@len@widemargin/3\relax}%
  \setlength\tud@len@topmargin{\dimexpr7\tud@len@widemargin/6\relax}%
  \setlength\tud@len@barheight{\dimexpr\tud@len@widemargin/6\relax}%
  \setlength\tud@len@headsep{\dimexpr2\tud@len@widemargin/5\relax}%
  \setlength\tud@len@logox{\dimexpr1.1\tud@len@widemargin/3\relax}%
  \setlength\tud@len@logoy{\dimexpr0.45\tud@len@widemargin\relax}%
  \setlength\tud@len@logowidth{\dimexpr1.9\tud@len@widemargin\relax}%
  \setlength\tud@len@footsep{%
    \dimexpr\tud@len@widemargin-.6\tud@len@topmargin\relax%
  }%
%    \end{macrocode}
% Wird die Gestaltungshöhe DIN~A5 im Raster verwendet, werden die Abstände 
% zwischen Kopf- unf Fußzeile angepasst.
%    \begin{macrocode}
  \if@tud@cdgeometry@adjust%
    \setlength\tud@len@headsep{\dimexpr.707107\tud@len@headsep\relax}%
    \setlength\tud@len@footsep{\dimexpr.707107\tud@len@footsep\relax}%
  \fi%
  \tud@cdgeometry@papersize@store%
}
%    \end{macrocode}
% Mit \cs{tud@cdgeometry@assignlayout} wird die Layoutgröße, welche ggf. mit 
% dem Paket \pkg{geometry} angegeben wurde, entsprechend gesetzt.
%    \begin{macrocode}
\newcommand*\tud@cdgeometry@assignlayout{%
  \ifdim\tud@len@layoutwidth<\p@\relax%
    \setlength\tud@len@layoutwidth{\paperwidth}%
  \fi%
  \ifdim\tud@len@layoutheight<\p@\relax%
    \setlength\tud@len@layoutheight{\paperheight}%
  \fi%
}
%    \end{macrocode}
% Das Verarbeiten des Parameters \prm{layout} von \pkg{geometry} ist etwas 
% komplizierter. Normalerweise werden dessen Einstellungen bei einer einfachen
% Änderung des Satzspiegels beibehalten. Bei einer Änderung des Papierformates 
% sind die damit gemachten Einstellungen nur bedingt weiterhin nutzbar. Die
% Offset-Werte bleiben in diesem Fall erhalten, das Layoutformat allerdings 
% wird zurückgesetzt. Das aktuelle Papierformat wird nach der Prüfung auf eine 
% Änderung in \cs{tud@cdgeometry@papersize@last} gesichert.
%    \begin{macrocode}
\newcommand*\tud@cdgeometry@papersize@last{}
\newcommand*\tud@cdgeometry@papersize@store{%
  \edef\tud@cdgeometry@papersize@last{\the\paperheight:\the\paperwidth}%
}
\newcommand*\tud@cdgeometry@resetlayout{%
  \begingroup%
    \edef\tud@res@a{\the\paperheight:\the\paperwidth}%
    \def\tud@res@b{%
      \endgroup%
      \tud@cdgeometry@papersize@store%
    }%
    \ifx\tud@res@a\tud@cdgeometry@papersize@last\else%
      \appto\tud@res@b{%
        \setlength\tud@len@layoutwidth{\z@}%
        \setlength\tud@len@layoutheight{\z@}%
        \tud@x@geometry@fixmargins%
      }%
    \fi%
  \tud@res@b%
}
%    \end{macrocode}
% \end{length}^^A \tud@len@layoutvoffset
% \end{length}^^A \tud@len@layouthoffset
% \end{length}^^A \tud@len@layoutheight
% \end{length}^^A \tud@len@layoutwidth
% \end{macro}^^A \tud@cdgeometry@papersize@last
% \end{macro}^^A \tud@cdgeometry@papersize@store
% \end{macro}^^A \tud@cdgeometry@resetlayout
% \end{macro}^^A \tud@cdgeometry@assignlayout
% \end{macro}^^A \if@tud@cdgeometry@adjust
% \end{macro}^^A \tud@cdgeometry@set
%
% \iffalse
%</class&body>
%<*class&option>
% \fi
%
% \begin{macro}{\tud@cdgeometry@reset}
% \changes{v2.06}{2018/08/17}{neu}^^A
% \begin{macro}{\if@tud@cdgeometry@reset}
% \changes{v2.06}{2018/08/17}{neu}^^A
% Mit diesem Befehl wird das Laden von zuvor definierte Satzspiegeln durch die 
% Option \opt{cdgeometry} temporär deaktiviert. Dies geschieht, um lediglich 
% die im Hintergrund verwendeten Makros neu zu setzen.
%    \begin{macrocode}
\newif\if@tud@cdgeometry@reset
\newcommand*\tud@cdgeometry@reset[1]{%
  \@tud@cdgeometry@resettrue%
  \TUDoptions{cdgeometry=#1}%
  \@tud@cdgeometry@resetfalse%
}
%    \end{macrocode}
% \end{macro}^^A \if@tud@cdgeometry@reset
% \end{macro}^^A \tud@cdgeometry@reset
% \subsection{Optionen für den Satzspiegel}
% \begin{option}{cdgeometry}
% \changes{v2.05}{2016/03/06}{\val{custom} neu}^^A
% \begin{macro}{\tud@cdgeometry@num}
% \begin{macro}{\if@tud@cdgeometry@num@locked}
% \begin{macro}{\tud@cdgeometry@calc@num}
% \changes{v2.05}{2015/11/29}{neu}^^A
% Für das \CD sind standardmäßig feste Seitenränder vorgegeben. Diese sind
% jedoch leider nur aus gestalterischen Motiven und ohne die Beachtung
% typographischer Belange gewählt und festgelegt worden. Beispielweise ist ein
% doppelseitiger Satz einer Abschlussarbeit im \CD nur mit einem grauenhaften
% Satzspiegel möglich. Um dem Anwender einen gewissen Spielraum zu geben, wird
% alternativ zum asymmetrischen (\opt{geometry}|=|\val{on}) ein symmetrischer
% Satzspiegel bereitgestellt (\opt{geometry}|=|\val{normal}), welcher bei 
% einseitigem Satz zentriert ist und bei zweiseitigem Satz den inneren Rand
% kleiner setzt als den äußeren. Des Weiteren kann die Satzspiegelberechnung
% auch direkt durch das Paket \pkg{typearea} aus dem \KOMAScript-Paket erfolgen 
% (\opt{geometry}|=|\val{no}). Mit \cs{tud@cdgeometry@@process} werden alle
% getroffenen Satzspiegeloptionen umgesetzt und nachfolgend definiert.
%    \begin{macrocode}
\tud@locked@newnum{tud@cdgeometry@num}{0}
\newcommand*\tud@cdgeometry@calc@num{0}
\TUD@key{cdgeometry}[true]{%
  \TUD@set@numkey{cdgeometry}{@tempa}{%
    \TUD@bool@numkey,%
    {typearea}{0},%
    {cd}{1},{tud}{1},{asymmetric}{1},%
    {symmetric}{2},{centred}{2},{centered}{2},%
    {normal}{2},{standard}{2},{std}{2},%
    {twoside}{3},{balanced}{3},%
    {oneside}{4},%
    {restricted}{5},%
    {adapted}{6},{adapt}{6},{adapting}{6},{unrestricted}{6},%
    {calculated}{7},{calc}{7},{calculate}{7},{calculating}{7},%
    {custom}{8},{user}{8},{package}{8}%
  }{#1}%
  \ifx\FamilyKeyState\FamilyKeyStateProcessed%
    \ifcase\@tempa\relax% false/typearea
      \tud@locked@num@set{tud@cdgeometry@num}{0}%
    \or% true/cd
      \tud@locked@num@set{tud@cdgeometry@num}{2}%
    \or% symmetric
      \tud@locked@num@set{tud@cdgeometry@num}{3}%
    \or% twoside
      \tud@locked@num@set{tud@cdgeometry@num}{4}%
      \TUD@KOMAoptions{twoside=true}%
    \or% oneside
      \ifnum\tud@cdgeometry@num>\thr@@\relax%
        \tud@locked@num@set{tud@cdgeometry@num}{3}%
      \fi%
      \TUD@KOMAoptions{twoside=false}%
    \or% restricted
      \tud@locked@num@preset{tud@cdgeometry@num}{2}%
      \renewcommand*\tud@cdgeometry@calc@num{0}%
    \or% adapted
      \tud@locked@num@preset{tud@cdgeometry@num}{2}%
      \renewcommand*\tud@cdgeometry@calc@num{1}%
    \or% calculated
      \tud@locked@num@preset{tud@cdgeometry@num}{2}%
      \renewcommand*\tud@cdgeometry@calc@num{2}%
    \or% custom
      \tud@locked@num@set{tud@cdgeometry@num}{1}%
    \fi%
%    \end{macrocode}
% Innerhalb des Dokumentes kann die Option genutzt werden, um zwischen den 
% unterschiedlichen Satzspiegeln zu wechseln. Da bei der Konstruktion dieser 
% die internen Längen verwendet werden, welche von \pkg{typearea} respektive 
% \pkg{geometry} definiert werden, muss beim Umschalten der jeweils zuletzt 
% definierte Satzspiegel geladen werden. Falls jedoch eine Neuberechnung 
% erfolgte, wird auf das Laden verzichtet (\cs{if@tud@cdgeometry@reset}).
%    \begin{macrocode}
    \if@atdocument%
      \if@tud@cdgeometry@reset\else% false
        \ifcase\tud@cdgeometry@num\relax%
          \tud@loadgeometry{current@typearea}%
          \@tud@x@geometry@fixmarginstrue%
        \or% custom
          \tud@loadgeometry{current@custom}%
          \@tud@x@geometry@fixmarginstrue%
        \fi%
        \TUD@SpecialOptionAtDocument{tud@cdgeometry@process}%
      \fi%
    \fi%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \tud@cdgeometry@calc@num
% \end{macro}^^A \if@tud@cdgeometry@num@locked
% \end{macro}^^A \tud@cdgeometry@num
% \end{option}^^A cdgeometry
% \begin{option}{extrabottommargin}
% \begin{macro}{\tud@dim@extrabottommargin}
% Diese Option dient dazu, die Höhe des Fußes anzupassen. Dies ist jedoch nur 
% möglich, wenn der Satzspiegel des \CDs verwendet wird. Kommt \pkg{typearea} 
% zum Einsatz, ist die Option wirkungslos. Da für die Länge ggf. auch Werte 
% angegeben werden können, die abhängig von der Schriftgröße sind, wird die 
% Ausführung dieser Option verzögert.
%    \begin{macrocode}
\newcommand*\tud@dim@extrabottommargin{\z@}
\TUD@key{extrabottommargin}{%
  \TUD@set@dimenkey{extrabottommargin}{\tud@dim@extrabottommargin}{#1}%
  \ifx\FamilyKeyState\FamilyKeyStateProcessed%
    \TUD@SpecialOptionAtDocument{tud@cdgeometry@process}%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \tud@dim@extrabottommargin
% \begin{option}{bleedmargin}
% \changes{v2.05}{2016/06/14}{neu}^^A
% \begin{macro}{\tud@dim@bleedmargin}
% \changes{v2.05}{2016/04/03}{neu}^^A
% Wird entweder das Paket \pkg{crop} oder aber die Option \opt{layout} des 
% Paketes \pkg{geometry} für Schnittmarken verwendet, werden alle farbigen 
% Elemente des Layouts dahingehend vergrößert, dass beim Zuschneiden des 
% Papierbogens \emph{in die Farbe} geschnitten wird. Verantwortlich hierfür ist 
% das Makro \cs{tud@dim@bleedmargin}, welches natürlich auch vom Anwender mit
% der Option \opt{bleedmargin} beliebig gesetzt werden kann. Als Standardwert 
% werden 5\% der größten Randbreite gesetzt.
%    \begin{macrocode}
\newcommand*\tud@dim@bleedmargin{.2in}
\TUD@key{bleedmargin}{%
  \TUD@set@dimenkey{bleedmargin}{\tud@dim@bleedmargin}{#1}%
%    \end{macrocode}
% Negative Werte sind nicht möglich, diese werden automatisch korrigiert.
%    \begin{macrocode}
  \ifx\FamilyKeyState\FamilyKeyStateProcessed%
    \ifdim\dimexpr\tud@dim@bleedmargin\relax<\z@\relax%
      \def\@tempa-##1\@nil{\def\tud@dim@bleedmargin{##1}}%
      \@tempa#1\@nil%
    \fi%
  \fi%
}
%    \end{macrocode}
% \end{macro}^^A \tud@dim@bleedmargin
% \end{option}^^A bleedmargin
% \end{option}^^A extrabottommargin
% \begin{option}{twoside}
% \begin{option}{twocolumn}
% Sollte einer der beiden \KOMAScript-Optionen im Dokument nach der Präambel 
% verwendet werden, erfolgt die Anpassung des Satzspiegels.
%    \begin{macrocode}
\DefineFamilyMember{KOMA}
\DefineFamilyKey{KOMA}{twoside}{%
  \TUD@SpecialOptionAtDocument{tud@cdgeometry@process}%
  \FamilyKeyStateProcessed%
}
\DefineFamilyKey{KOMA}{twocolumn}{%
  \TUD@SpecialOptionAtDocument{tud@cdgeometry@process}%
  \FamilyKeyStateProcessed%
}
%    \end{macrocode}
% \end{option}^^A twocolumn
% \end{option}^^A twoside
%
% \iffalse
%</class&option>
%<*class&body>
% \fi
%
% \subsection{Realisierung der Satzspiegeleinstellungen}
% Das Paket \pkg{geometry} erlaubt eine genaue Vorgabe des Satzspiegels und
% der Seitenränder, wie es vom \CD der \TnUD verlangt wird.
% \ToDo{Satzspiegel ohne \pkg{geometry}; besser über \cs{storeareas}?!}[v2.07]%
% \ToDo{Benutzerschnittstelle äquivalent zu \pkg{geometry}}[v2.07]%
% \begin{macro}{\tud@cdgeometry@process}
% \changes{v2.05}{2015/11/29}{neu}^^A
% Mit \cs{tud@cdgeometry@process} bzw. \cs{tud@cdgeometry@@process} erfolgt die
% Festlegung des Satzspiegels. Für die Erstellung des Satzspiegels wird das
% Paket \pkg{geometry} verwendet. Mit der Option (\opt{cdgeometry}|=|\val{no}) 
% wird jedoch der von \pkg{typearea} berechnete Satzspiegel an \pkg{geometry}
% weitergereicht. Somit wird es möglich, unabhängig vom genutzten Paket
% (\pkg{typearea} oder \pkg{geometry}) zur Festlegung des Satzspiegels, diesen
% innerhalb des Dokumentes zu ändern.
%    \begin{macrocode}
\newcommand*\tud@cdgeometry@process{%
  \tud@cdgeometry@@process%
  \KOMAoptions{pagesize=\@pagesizelast}%
%    \end{macrocode}
% Nachder Änderung des Satzspiegels werden alle Logoboxen neu erstellt.
%    \begin{macrocode}
  \global\@tud@mainlogo@settrue%
%    \end{macrocode}
% Damit Änderungen am Satzspiegel im Dokument sicher übernommen werden, wird 
% das Setzen des Satzspiegels forciert. Dafür wird \cs{tud@currentgeometry} 
% zurückgesetzt und anschließend der aktuelle Seitenstil erneut geladen, um das 
% erneute Ausführen von \cs{tud@BeforeSelectAnyPageStyle} zu erzwingen.
%    \begin{macrocode}
  \gdef\tud@currentgeometry{}%
  \expandafter\pagestyle\expandafter{\currentpagestyle}%
}
%    \end{macrocode}
% \end{macro}^^A \tud@cdgeometry@process
% Wurde die \cls{standalone}-Klasse mit der Option \opt{crop} geladen, werden 
% sämtliche Einstellungen für den Satzspiegel unterdrückt.
%    \begin{macrocode}
\if@tud@x@standalone@crop
  \PreventPackageFromLoading{geometry}%
  \let\tud@cdgeometry@process\relax%
\else
  \RequirePackage{geometry}[2010/09/12]%
\fi%
\AfterPackage*{geometry}{%
  \CheckCommand*\Gm@initnewgm{%
    \Gm@passfalse
    \Gm@swap@papersizefalse
    \Gm@dimlist={}
    \Gm@hbodyfalse
    \Gm@vbodyfalse
    \Gm@heightroundedfalse
    \Gm@includeheadfalse
    \Gm@includefootfalse
    \Gm@includempfalse
    \let\Gm@width\@undefined
    \let\Gm@height\@undefined
    \let\Gm@textwidth\@undefined
    \let\Gm@textheight\@undefined
    \let\Gm@lines\@undefined
    \let\Gm@hscale\@undefined
    \let\Gm@vscale\@undefined
    \let\Gm@hmarginratio\@undefined
    \let\Gm@vmarginratio\@undefined
    \let\Gm@lmargin\@undefined
    \let\Gm@rmargin\@undefined
    \let\Gm@tmargin\@undefined
    \let\Gm@bmargin\@undefined
    \Gm@layoutfalse
    \Gm@layouthoffset\z@
    \Gm@layoutvoffset\z@
    \Gm@bindingoffset\z@
  }%
  \expandafter\CheckCommand%
  \csname\expandafter\@gobble\string\Gm@changelayout\space\endcsname{%
    \setlength{\@colht}{\textheight}
    \setlength{\@colroom}{\textheight}%
    \setlength{\vsize}{\textheight}
    \setlength{\columnwidth}{\textwidth}%
    \if@twocolumn%
      \advance\columnwidth-\columnsep
      \divide\columnwidth\tw@%
      \@firstcolumntrue%
    \fi%
    \setlength{\hsize}{\columnwidth}%
    \setlength{\linewidth}{\hsize}%
  }%
  \CheckCommand*\Gm@@process{%
    \Gm@expandlengths
    \Gm@adjustpaper
    \addtolength\Gm@layoutwidth{-\Gm@bindingoffset}%
    \Gm@adjustmp
    \Gm@adjustbody
    \Gm@detall{h}{width}{lmargin}{rmargin}%
    \Gm@detall{v}{height}{tmargin}{bmargin}%
    \setlength\textwidth{\Gm@width}%
    \setlength\textheight{\Gm@height}%
    \setlength\topmargin{\Gm@tmargin}%
    \setlength\oddsidemargin{\Gm@lmargin}%
    \addtolength\oddsidemargin{-1\Gm@truedimen in}%
    \ifGm@includemp
      \advance\textwidth-\Gm@wd@mp
      \advance\oddsidemargin\Gm@odd@mp
    \fi
    \if@mparswitch
      \setlength\evensidemargin{\Gm@rmargin}%
      \addtolength\evensidemargin{-1\Gm@truedimen in}%
      \ifGm@includemp
        \advance\evensidemargin\Gm@even@mp
      \fi
    \else
      \evensidemargin\oddsidemargin
    \fi
    \advance\oddsidemargin\Gm@bindingoffset
    \addtolength\topmargin{-1\Gm@truedimen in}%
    \ifGm@includehead
      \addtolength\textheight{-\headheight}%
      \addtolength\textheight{-\headsep}%
    \else
      \addtolength\topmargin{-\headheight}%
      \addtolength\topmargin{-\headsep}%
    \fi
    \ifGm@includefoot
      \addtolength\textheight{-\footskip}%
    \fi
    \ifGm@heightrounded
      \setlength\@tempdima{\textheight}%
      \addtolength\@tempdima{-\topskip}%
      \@tempcnta\@tempdima
      \@tempcntb\baselineskip
      \divide\@tempcnta\@tempcntb
      \setlength\@tempdimb{\baselineskip}%
      \multiply\@tempdimb\@tempcnta
      \advance\@tempdima-\@tempdimb
      \multiply\@tempdima\tw@
      \ifdim\@tempdima>\baselineskip
        \addtolength\@tempdimb{\baselineskip}%
      \fi
      \addtolength\@tempdimb{\topskip}%
      \textheight\@tempdimb
    \fi
    \advance\oddsidemargin\Gm@layouthoffset%
    \advance\evensidemargin\Gm@layouthoffset%
    \advance\topmargin\Gm@layoutvoffset%
    \addtolength\Gm@layoutwidth{\Gm@bindingoffset}%
  }%
  \CheckCommand\geometry[1]{%
    \Gm@clean
    \setkeys{Gm}{#1}%
    \Gm@process%
  }%
  \CheckCommand\newgeometry[1]{%
    \clearpage
    \Gm@restore@org
    \Gm@initnewgm
    \Gm@newgmtrue
    \setkeys{Gm}{#1}%
    \Gm@newgmfalse
    \Gm@process
    \ifnum\mag=\@m\else\Gm@magtooffset\fi
    \Gm@changelayout
    \Gm@showparams{newgeometry}%
  }%
  \CheckCommand\restoregeometry{%
    \clearpage
    \Gm@restore@pkg
    \Gm@changelayout%
  }%
  \CheckCommand*\savegeometry[1]{%
    \Gm@save
    \expandafter\edef\csname Gm@restore@@#1\endcsname{\Gm@restore}%
  }%
  \CheckCommand*\loadgeometry[1]{%
    \clearpage
    \@ifundefined{Gm@restore@@#1}{%
      \PackageError{geometry}{%
      \string\loadgeometry : name `#1' undefined}{%
      The name `#1' should be predefined with \string\savegeometry}%
    }{\@nameuse{Gm@restore@@#1}%
    \Gm@changelayout}%
  }%
%    \end{macrocode}
% \begin{macro}{\geometry}
% \begin{macro}{\newgeometry}
% \begin{macro}{\restoregeometry}
% \begin{macro}{\Gm@changelayout}
% \begin{macro}{\if@tud@x@geometry@enabled}
% \changes{v2.05}{2016/03/06}{neu}^^A
% \begin{macro}{\tud@x@geometry@fixmargins}
% \changes{v2.06}{2018/08/13}{neu}^^A
% \begin{macro}{\if@tud@x@geometry@fixmargins}
% \changes{v2.06}{2018/08/13}{neu}^^A
% Für einen benutzerdefinierten Satzspiegel ist es notwendig, die durch den 
% Anwender in der Präambel getätigten Einstellungen zu sichern und am Ende der
% Präambel für die unterschiedlichen, durch die Klasse benötigten Satzspiegel
% der einzelnen Seitenstile umzusetzen. Dabei werden auch etwaige Optionen von
% \KOMAScript{} beachtet. Hierfür werden die originalen Befehle \cs{geometry}
% und \cs{newgeometry} angepasst, weshalb diese vorher gesichert werden.
% \ToDo{erweiterte Möglichkeiten von \cs{newgeometry} dokumentieren}[v2.07]
%    \begin{macrocode}
  \newif\if@tud@x@geometry@enabled%
  \@tud@x@geometry@enabledtrue%
  \tud@cs@store{geometry}%
  \tud@cs@store{newgeometry}%
  \renewcommand*\geometry[1]{%
    \tud@x@geometry@user{#1}{geometry}%
  }%
  \renewcommand*\newgeometry[1]{%
    \tud@cs@store{Gm@restore@org}%
    \tud@x@geometry@user{#1}{newgeometry}%
    \tud@cs@restore{Gm@restore@org}%
  }%
%    \end{macrocode}
% Bei der Verwendung von \cs{restoregeometry} wird der am Ende der Präambel 
% der passend zur entsprechende Einstellung von \opt{cdgeometry} gesicherte 
% Satzspiegel geladen. Über das optinale Argument kann der gewünschte Wert für 
% die Option \opt{cdgeometry} angegeben werden.
%    \begin{macrocode}
  \renewcommand*\restoregeometry[1][custom]{%
    \tud@cdgeometry@reset{#1}%
    \if@atdocument%
      \ifcase\tud@cdgeometry@num\relax% false
        \tud@loadgeometry{init@typearea}%
        \@tud@x@geometry@fixmarginstrue%
      \or% custom
        \tud@loadgeometry{init@custom}%
        \@tud@x@geometry@fixmarginstrue%
      \fi%
      \tud@cdgeometry@process%
    \fi%
  }%
%    \end{macrocode}
% Sollte im Dokument durch den Anwender der Satzspiegel manuell geändert 
% werden, muss darauf reagiert und die unterschiedlichen Satzspiegel der Klasse 
% angepasst werden. Hierfür wird am Ende von \cs{Gm@changelayout} ein Patch 
% eingehängt.
%    \begin{macrocode}
  \apptocmd{\Gm@changelayout}{%
    \if@tud@x@geometry@enabled%
      \if@atdocument%
        \@tud@x@geometry@fixmarginstrue%
        \ifcase\tud@cdgeometry@num\relax% false
          \tud@cdgeometry@reset{typearea}%
        \or% custom
          \tud@cdgeometry@reset{custom}%
        \fi%
        \tud@cdgeometry@process%
      \fi%
    \fi%
  }{}{\tud@patch@wrn{Gm@changelayout}}%
%    \end{macrocode}
% Das Paket \pkg{geometry} bietet die Möglichkeit, den kompletten Satzspiegel 
% bzw. das Layout mit einem Offset zu beaufschlagen. Dieser wird den Längen 
% \cs{oddsidemargin} und \cs{evensidemargin} bzw. \cs{topmargin} zugeschlagen. 
% Da intern jedoch diese Längen nach der einmaligen Anwendung der Nutzerbefehle 
% mehrmals wiederverwendet werden, müssen diese u.U. korrigert bzw. auf ihren 
% ursprünglichen Wert zurückgesetzt werden.
%    \begin{macrocode}
  \newif\if@tud@x@geometry@fixmargins%
  \newcommand*\tud@x@geometry@fixmargins{%
    \ifGm@pass\else%
      \addtolength\oddsidemargin{-\tud@len@layouthoffset}%
      \addtolength\evensidemargin{-\tud@len@layouthoffset}%
      \addtolength\topmargin{-\tud@len@layoutvoffset}%
      \@tud@x@geometry@fixmarginsfalse%
    \fi%
  }%
%    \end{macrocode}
% \end{macro}^^A \if@tud@x@geometry@fixmargins
% \end{macro}^^A \tud@x@geometry@fixmargins
% \end{macro}^^A \if@tud@x@geometry@enabled
% \end{macro}^^A \Gm@changelayout
% \end{macro}^^A \restoregeometry
% \end{macro}^^A \newgeometry
% \end{macro}^^A \geometry
% \begin{macro}{\tud@x@geometry@user}
% \changes{v2.05}{2016/03/06}{neu}^^A
% \changes{v2.06g}{2020/06/18}{Bugfix für Änderung des Papierformates}^^A
% \begin{parameter}{paper}
% \begin{parameter}{papername}
% \begin{parameter}{paperwidth}
% \begin{parameter}{paperheight}
% \begin{parameter}{papersize}
% \begin{parameter}{layout}
% \begin{parameter}{layoutname}
% \begin{parameter}{layoutwidth}
% \begin{parameter}{layoutheight}
% \begin{parameter}{layoutsize}
% \begin{parameter}{bleedmargin}
% \begin{macro}{\tud@x@geometry@area@def}
% \changes{v2.05}{2016/03/06}{neu}^^A
% \begin{macro}{\tud@x@geometry@area@set}
% \changes{v2.05}{2016/03/06}{neu}^^A
% \begin{macro}{\tud@x@geometry@paper}
% \changes{v2.05}{2016/07/20}{neu}^^A
% \begin{macro}{\tud@x@geometry@layout}
% \changes{v2.05}{2016/07/20}{neu}^^A
% \begin{macro}{\tud@x@geometry@parameter}
% \changes{v2.05}{2016/07/20}{neu}^^A
% \begin{macro}{\tud@x@geometry@init}
% \changes{v2.05}{2016/03/06}{neu}^^A
% Bei der Redefinition der Befehle \cs{geometry} und \cs{newgeometry} kommt
% intern das Makro \cs{tud@x@geometry@user} zum Einsatz, womit kleinere
% Feinheiten zwischen den beiden Befehlen unterschieden werden können.
%    \begin{macrocode}
  \newcommand*\tud@x@geometry@paper{}%
  \newcommand*\tud@x@geometry@layout{}%
  \newcommand*\tud@x@geometry@parameter{}%
  \newcommand*\tud@x@geometry@init{}%
  \newcommand*\tud@x@geometry@user[2]{%
    \let\tud@x@geometry@paper\@empty%
    \let\tud@x@geometry@layout\@empty%
    \let\tud@x@geometry@parameter\@empty%
    \TUD@parameter@set{geometry}{#1}%
%    \end{macrocode}
% Bei einer Änderung des Papierformates wird das Layoutformat zurückgesetzt.
%    \begin{macrocode}
    \tud@x@geometry@area@set{paper}%
    \tud@cdgeometry@resetlayout%
    \ifx\tud@x@geometry@layout\@empty\else%
      \begingroup%
        \tud@x@geometry@area@set{layout}%
        \tud@cdgeometry@assignlayout%
        \edef\tud@res@a{%
          \endgroup%
            \noexpand\setlength\noexpand\tud@len@layoutwidth{\the\paperwidth}%
            \noexpand\setlength\noexpand\tud@len@layoutheight{\the\paperheight}%
        }%
      \tud@res@a%
    \fi%
    \ifstr{#2}{newgeometry}{%
      \eappto\Gm@restore@org{%
        \noexpand\paperwidth=\the\paperwidth\relax%
        \noexpand\paperheight=\the\paperheight\relax%
      }%
%    \end{macrocode}
% Wird der Befehl verwendet, wenn eigentlich \pkg{typearea} aktiv ist, so 
% werden lediglich die Einstellungen zu \prm{paper} und \prm{layout} beachtet. 
% Dies wird über die gepatchte Version von \cs{typearea} realisert. Siehe dazu 
% \cs{tud@x@typearea@before} und \cs{tud@x@typearea@after} für Details.
%    \begin{macrocode}
      \ifcase\tud@cdgeometry@num\relax%
        \typearea[current]{current}%
        \ifx\tud@x@geometry@parameter\@empty\else%
          \ClassWarning{\TUD@Class@Name}{%
            It isn't possible to use \string\newgeometry with any\MessageBreak%
            key except `paper' or `layout' when package `typearea'\MessageBreak%
            is used with`cdgeometry=typearea'%
          }%
        \fi%
%    \end{macrocode}
% Die Abarbeitung der gegebenen Parameter wird mit \cs{tud@cdgeometry@process}
% innerhalb von \cs{Gm@changelayout} realisiert. Letzteres Makro wird wiederum 
% von der originalen Definition von \cs{newgeometry} aufgerufen.
%    \begin{macrocode}
      \else%
        \def\tud@res@a{\tud@cs@use{newgeometry}}%
        \expandafter\tud@res@a\expandafter{\tud@x@geometry@parameter}%
        \edef\tud@x@geometry@init{\tud@x@geometry@parameter}%
      \fi%
    }{%
      \eappto\tud@x@geometry@init{\tud@x@geometry@parameter}%
    }%
  }%
%    \end{macrocode}
% Das folgende Konstrukt ist aus der Idee entstanden, die Parameter \val{paper} 
% sowie \val{layout} des Paketes \pkg{geometry} auf die passenden Optionen von 
% \KOMAScript{} abbilden zu können und insbesondere Schnittmarken für alle 
% Seitenstile bereitzustellen.%
% \ToDo{%
%   Leider ist aus der dem Versuch, eine halbwegs einheitliche Schnittstelle 
%   zwischen den Paketen \pkg{typearea} und \pkg{geometry} zu schaffen, ein
%   ziemlich unübersichtliches Konstrukt geworden, weshalb das Ganze in einer
%   folgenden Version mit \KOMAScript-Mitteln neu implementiert werden soll.
% }[v2.07]
% \ToDo{Orientierung automatisch aus paperwidth/paperheight}[v2.07]
%    \begin{macrocode}
  \TUD@parameter@family{geometry}{%
    \TUD@parameter@def{paper}{\tud@x@geometry@area@def{paper}{#1}}%
    \TUD@parameter@let{papername}{paper}%
    \TUD@parameter@def{papersize}{%
      \def\@tempa##1,##2,##3\@nil{%
        \IfArgIsEmpty{##2}{%
          \tud@x@geometry@area@def{paper}{##1:##1}%
        }{%
          \tud@x@geometry@area@def{paper}{##1:##2}%
        }%
      }%
      \@tempa#1,,\@nil%
    }%
    \TUD@parameter@def{paperwidth}{%
      \tud@x@geometry@area@def{paper}{#1:\paperheight}%
    }%
    \TUD@parameter@def{paperheight}{%
      \tud@x@geometry@area@def{paper}{\paperwidth:#1}%
    }%
    \TUD@parameter@def{layout}{%
      \ifstr{#1}{false}{%
        \setlength\tud@len@layoutwidth{\z@}%
        \setlength\tud@len@layoutheight{\z@}%
        \setlength\tud@len@layouthoffset{\z@}%
        \setlength\tud@len@layoutvoffset{\z@}%
      }{%
        \tud@x@geometry@area@def{layout}{#1}%
      }%
    }%
    \TUD@parameter@let{layoutname}{layout}%
    \TUD@parameter@def{layoutsize}{%
      \def\@tempa##1,##2,##3\@nil{%
        \IfArgIsEmpty{##2}{%
          \tud@x@geometry@area@def{layout}{##1:##1}%
        }{%
          \tud@x@geometry@area@def{layout}{##1:##2}%
        }%
      }%
      \@tempa#1,,\@nil%
    }%
    \TUD@parameter@def{layoutwidth}{%
      \tud@x@geometry@area@def{layout}{#1:\tud@len@layoutheight}%
    }%
    \TUD@parameter@def{layoutheight}{%
      \tud@x@geometry@area@def{layout}{\tud@len@layoutwidth:#1}%
    }%
    \TUD@parameter@def{layoutoffset}{%
      \def\@tempa##1,##2,##3\@nil{%
        \IfArgIsEmpty{##2}{%
          \setlength\tud@len@layouthoffset{##1}%
          \setlength\tud@len@layoutvoffset{##1}%
        }{%
          \setlength\tud@len@layouthoffset{##1}%
          \setlength\tud@len@layoutvoffset{##2}%
        }%
      }%
      \@tempa#1,,\@nil%
    }%
    \TUD@parameter@def{layouthoffset}{\setlength\tud@len@layouthoffset{#1}}%
    \TUD@parameter@def{layoutvoffset}{\setlength\tud@len@layoutvoffset{#1}}%
    \TUD@parameter@def{bleedmargin}{\TUDoption{bleedmargin}{#1}}%
    \TUD@parameter@handler@macro{%
      \eappto\tud@x@geometry@parameter{%
        \expandonce\kv@key=\expandonce\kv@value,%
      }%
    }{%
      \tud@x@geometry@area@def{paper}{#2}%
    }%
  }%
%    \end{macrocode}
% Wenig Kommentar dazu, weil eigentlich schon wieder obsolet! Die möglichen 
% Werte für \val{paper} und \val{layout} werden abgefangen und für die beiden 
% Befehle \cs{geometry} und \cs{newgeometry} aufgearbeitet. Alle anderen werden 
% einfach an \pkg{geometry} durchgereicht. Dies geschieht über die jeweiligen
% Hilfsmakros \cs{tud@x@geometry@\dots} für \val{paper}, \val{layout} sowie
% \val{parameter} für alles Übrige.
%    \begin{macrocode}
  \newcommand*\tud@x@geometry@area@def[2]{%
    \tud@lowerstring{\@tempa}{#2}%
    \def\@tempb##1paper##2\@nil{%
      \ifstr{##2}{paper}{\def\@tempa{##1}}{}%
    }%
    \expandafter\@tempb\@tempa paper\@nil%
    \@tempswafalse%
    \ifstr{\@tempa}{seascape}{\@tempswatrue}{}%
    \ifstr{\@tempa}{landscape}{\@tempswatrue}{}%
    \ifstr{\@tempa}{portrait}{\@tempswatrue}{}%
    \ifstr{\@tempa}{letter}{\@tempswatrue}{}%
    \ifstr{\@tempa}{executive}{\@tempswatrue}{}%
    \ifstr{\@tempa}{legal}{\@tempswatrue}{}%
    \if@tempswa\else%
      \ifx\@tempa\@empty\relax\else%
        \def\@tempb##1##2\@nil{%
          \if ##1a\@tempswatrue%
            \else\if ##1b\@tempswatrue%
              \else\if ##1c\@tempswatrue%
                \else\if ##1d\@tempswatrue%
          \fi\fi\fi\fi%
          \if@tempswa%
            \@tempswafalse%
            \IfArgIsEmpty{##2}{}{\ifnumber{##2}{\@tempswatrue}{}}%
          \fi%
        }%
        \expandafter\@tempb\@tempa\@nil%
        \if@tempswa\else%
          \def\@tempb##1:##2:##3\@nil{%
            \IfArgIsEmpty{##2}{}{%
              \@tempswatrue%
              \def\@tempa{##1:##2}%
            }%
          }%
          \expandafter\@tempb\@tempa::\@nil%
        \fi%
        \if@tempswa\else%
          \def\tud@reserved##1:##2:##3:##4\@nil{%
            \if@tempswa\else%
              \ifstr{\@tempa}{##1}{%
                \@tempswatrue%
                \def\@tempa{##2##4:##3##4}%
              }{}%
            \fi%
          }%
          \tud@reserved b0j:1030:1456:mm\@nil%
          \tud@reserved b1j:728:1030:mm\@nil%
          \tud@reserved b2j:515:728:mm\@nil%
          \tud@reserved b3j:364:515:mm\@nil%
          \tud@reserved b4j:257:364:mm\@nil%
          \tud@reserved b5j:182:257:mm\@nil%
          \tud@reserved b6j:128:182:mm\@nil%
          \tud@reserved ansia:8.5:11:in\@nil%
          \tud@reserved ansib:11:17:in\@nil%
          \tud@reserved ansic:17:22:in\@nil%
          \tud@reserved ansid:22:34:in\@nil%
          \tud@reserved ansie:34:44:in\@nil%
          \tud@reserved screen:225:180:mm\@nil%
        \fi%
      \fi%
    \fi%
    \if@tempswa%
      \cseappto{tud@x@geometry@#1}{\@tempa,}%
    \else%
      \appto\tud@x@geometry@parameter{#2,}%
    \fi%
  }%
%    \end{macrocode}
% Der Befehl \cs{tud@x@geometry@area@set} bewerkstelligt die sequentielle 
% Abarbeitung der zuvor gesammelten Schlüssel.
%    \begin{macrocode}
  \newcommand*\tud@x@geometry@area@set[1]{%
    \letcs{\@tempa}{tud@x@geometry@#1}%
    \ifdefvoid{\@tempa}{}{%
      \def\@tempb##1:##2:##3\@nil{%
        \IfArgIsEmpty{##2}{%
          \KOMAoption{paper}{##1}%
        }{%
%    \end{macrocode}
% \KOMAScript{} stellt sich ziemlich clever an und setzt das Papierformat in 
% dieser Notation immer korrekt im Quer- oder Hochformat, unabhängig von der 
% Reihenfolge der angegebenen Längen. Für den Parameter \prm{layout} ist dies 
% jedoch unerwünscht, weshalb der verantwortliche Befehl deaktiviert wird.
% \emph{Dies geschieht hier direkt und nicht in einer Gruppe,} weil der Aufruf 
% von \cs{tud@x@geometry@area@set}|{layout}| lokal erfolgt.
%    \begin{macrocode}
          \ifstr{#1}{layout}{\let\scr@setpaperorientation\relax}{}%
          \KOMAoption{paper}{##1:##2}%
        }%
      }%
      \def\@tempc##1{\@tempb##1::\@nil}%
      \expandafter\forcsvlist\expandafter\@tempc\expandafter{\@tempa}%
    }%
  }%
%    \end{macrocode}
% \end{macro}^^A \tud@x@geometry@init
% \end{macro}^^A \tud@x@geometry@parameter
% \end{macro}^^A \tud@x@geometry@layout
% \end{macro}^^A \tud@x@geometry@paper
% \end{macro}^^A \tud@x@geometry@area@set
% \end{macro}^^A \tud@x@geometry@area@def
% \end{parameter}^^A bleedmargin
% \end{parameter}^^A layoutsize
% \end{parameter}^^A layoutheight
% \end{parameter}^^A layoutwidth
% \end{parameter}^^A layoutname
% \end{parameter}^^A layout
% \end{parameter}^^A papersize
% \end{parameter}^^A paperheight
% \end{parameter}^^A paperwidth
% \end{parameter}^^A papername
% \end{parameter}^^A paper
% \end{macro}^^A \tud@x@geometry@user
% \begin{macro}{\tud@x@geometry@getlayout}
% \changes{v2.06}{2018/08/13}{neu}^^A
%    \begin{macrocode}
  \newcommand*\tud@x@geometry@getlayout[1]{%
%    \end{macrocode}
% Unabhängig von der gewählten Option \opt{cdgeometry} für den Satzspiegel 
% sollen die von \pkg{geometry} bereitgestellten Möglichkieten für den 
% Papierbogen nutzbar bleiben. Die zu setzenden Einstellungen für das Layout 
% werden in das im Argument übergebene Makro geschrieben.
%    \begin{macrocode}
    \ifGm@pass%
      \let#1\@empty%
    \else%
      \begingroup%
%    \end{macrocode}
% Das Setzen des Layouts erfolgt nur, wenn die dazugehörigen Längen \emph{nicht}
% denen des Papierbogens entsprechen.
%    \begin{macrocode}
        \tud@cdgeometry@assignlayout%
        \@tud@res@swafalse%
        \ifdim\tud@len@layoutwidth=\paperwidth\relax\else\@tud@res@swatrue\fi%
        \ifdim\tud@len@layoutheight=\paperheight\relax\else\@tud@res@swatrue\fi%
        \edef\tud@res@a{%
          \endgroup%
          \etex@unexpanded{\def#1}{%
            layoutoffset={%
              \the\tud@len@layouthoffset,\the\tud@len@layoutvoffset%
            }%
            \if@tud@res@swa%
              ,layoutsize={\the\tud@len@layoutwidth,\the\tud@len@layoutheight}%
            \fi%
          }%
        }%
      \tud@res@a%
    \fi%
  }%
%    \end{macrocode}
% \end{macro}^^A \tud@x@geometry@getlayout
% \begin{macro}{\tud@x@geometry@set}
% \changes{v2.04}{2015/03/12}{neu}^^A
% \begin{macro}{\tud@savegeometry}
% \changes{v2.05}{2016/04/03}{neu}^^A
% \begin{macro}{\tud@loadgeometry}
% \changes{v2.05}{2016/03/06}{neu}^^A
% Mit dem Befehl \cs{tud@x@geometry@set} wird abhängig davon, ob dieser in der
% Präambel oder im Dokument von \cs{tud@cdgeometry@@process} verwendet wird,
% entweder \cs{geometry} oder \cs{newgeometry} aufgerufen. Mit dem Schalter 
% \cs{if@tud@x@geometry@enabled} wird im Fall, dass ein der Satzspiegel durch 
% den Anwender eingestellt wurde, das rekursive Aufrufen von \cs{geometry} bzw.
% \cs{newgeometry} und einer daraus resultierenden Endlosschleife unterbunden.
%    \begin{macrocode}
  \newcommand*\tud@x@geometry@set[1]{%
    \@tud@x@geometry@enabledfalse%
%    \end{macrocode}
% Um etwaige Änderungen am Papierformat innerhalb des Dokumentes beachten zu 
% können, werden die aktuellen Maße für das Papierformat an \cs{Gm@restore@org} 
% angehangen.
%    \begin{macrocode}
    \if@atdocument%
      \edef\@tempa{#1}%
      \tud@cs@store{Gm@restore@org}%
      \eappto\Gm@restore@org{%
        \noexpand\paperwidth=\the\paperwidth\relax%
        \noexpand\paperheight=\the\paperheight\relax%
      }%
      \def\@tempc{\tud@cs@use{newgeometry}}%
      \expandafter\@tempc\expandafter{\@tempa}%
      \tud@cs@restore{Gm@restore@org}%
    \else%
%    \end{macrocode}
% Zu Beginn des Dokumentes werden mit \cs{Gm@initnewgm} vor jedem Satzspiegel
% die zuvor gemachten Einstellungen zurückgesetzt.
%    \begin{macrocode}
      \Gm@initnewgm%
      \edef\@tempa{%
        paperwidth=\the\paperwidth,paperheight=\the\paperheight,#1%
      }%
      \def\@tempc{\tud@cs@use{geometry}}%
      \expandafter\@tempc\expandafter{\@tempa,driver=none}%
    \fi%
    \@tud@x@geometry@enabledtrue%
  }%
%    \end{macrocode}
% Beim Speichern eines Satzspiegels sichert \pkg{geometry} tatsächlich nicht 
% alle notwendigen Einstellungen und Befehle. Deshalb wird etwas nachgeholfen.
%    \begin{macrocode}
  \newcommand*\tud@savegeometry[1]{%
    \let\Gm@restore\@empty%
    \savegeometry{#1}%
    \csepreto{Gm@restore@@#1}{%
      \noexpand\Gm@bindingoffset=\the\Gm@bindingoffset%
      \ifGm@includehead%
        \noexpand\Gm@includeheadtrue%
      \else%
        \noexpand\Gm@includeheadfalse%
      \fi%
      \ifGm@includefoot%
        \noexpand\Gm@includefoottrue%
      \else%
        \noexpand\Gm@includefootfalse%
      \fi%
      \ifGm@includemp%
        \noexpand\Gm@includemptrue%
      \else%
        \noexpand\Gm@includempfalse%
      \fi%
      \ifGm@layout%
        \noexpand\Gm@layouttrue%
      \else%
        \noexpand\Gm@layoutfalse%
      \fi%
    }%
  }%
  \newcommand*\tud@loadgeometry[1]{%
    \@tud@x@geometry@enabledfalse%
    \loadgeometry{#1}%
%    \end{macrocode}
% Die nächsten beiden Makros müssen nach der Satzspiegeländerung des ausgeführt 
% werden, um den Durchschuss und eine etwaige Zentrierung durch das Paket 
% \pkg{crop} wiederherzustellen.
%    \begin{macrocode}
    \@currsize%
    \if@tud@x@crop@center\CROP@center\fi%
    \@tud@x@geometry@enabledtrue%
  }%
%    \end{macrocode}
% \end{macro}^^A \tud@loadgeometry
% \end{macro}^^A \tud@savegeometry
% \end{macro}^^A \tud@x@geometry@set
% \begin{macro}{\tud@cdgeometry@@process}
% \changes{v2.02}{2014/06/23}{geändert für das Paket \pkg{scrlayer-scrpage}}^^A
% \changes{v2.03}{2015/01/09}{Satzspiegel des \CDs angepasst}^^A
% \changes{v2.03}{2015/01/09}{intiale Festlegung der Länge \cs{marginpar}}^^A
% \changes{v2.03}{2015/01/13}{Satzspiegel kompatibilitätsabhängig}^^A
% \begin{macro}{\tud@cdgeometry@@@process}
% \begin{macro}{\tud@cdgeometry@layout}
% \changes{v2.06}{2018/08/13}{neu}^^A
% \begin{macro}{\tud@cdgeometry@hmargin}
% \begin{macro}{\tud@cdgeometry@vmargin}
% \begin{macro}{\tud@cdgeometry@tudmargin}
% \begin{macro}{\tud@cdgeometry@ddcmargin}
% Dies sind Hilfsmakros für die Definition der unterschiedichen Seitenlayouts
% (horizontale und vertikale Ränder). Es handelt sich dabei um die Seitenränder 
% für den normalen Textbereich sowie die angepassten vertikalen Einstellungen
% für die Seitenstilvarianten mit TUD-Kopf. Im Kompatibilitätsmodus für die 
% Version~v2.02 gibt es außerdem einen separaten Satzspiegel für den \DDC-Fuß.
% Gesetzt werden diese in Abhängigkeit von der Option \opt{cdgeometry} im
% Makro \cs{tud@cdgeometry@@process} bzw. \cs{tud@cdgeometry@@@process}.
%    \begin{macrocode}
  \newcommand*\tud@cdgeometry@layout{}%
  \newcommand*\tud@cdgeometry@hmargin{}%
  \newcommand*\tud@cdgeometry@vmargin{}%
  \newcommand*\tud@cdgeometry@tudmargin{}%
  \tud@if@v@lower{2.03}{\newcommand*\tud@cdgeometry@ddcmargin{}}{}%
%    \end{macrocode}
% Das Makro \cs{tud@cdgeometry@@process} setzt die Option für den gewünschten
% Satzspiegel um, sowohl für die Seitenränder als auch zur Einberechnung der
% Kopf- und/oder Fußzeile. Um mehrere Satzspiegel verwenden zu können~-- was
% für die unterschiedlichen Höhen für Kopf- und Fußzeile nötig ist~-- wird das
% Paket \pkg{geometry} verwendet. Soll \pkg{typearea} zur Satzspiegelerstellung
% genutzt werden, so werden die damit berechneten Werte an \pkg{geometry}
% weitergereicht.
% Es werden drei Layouts erstellt: normaler Satzspiegel, nur TUD-Kopf sowie
% TUD-Kopf und "~Fuß und mit \cs{savegeometry}\marg{Stil} gesichert. Damit kann
% innerhalb des Dokumentes mit dem Befehl \cs{loadgeometry}\marg{Stil} oberer
% sowie ggf. untere Seitenrand geändert werden.
%    \begin{macrocode}
  \newcommand*\tud@cdgeometry@@process{%
    \csuse{@ta@usegeometryfalse}%
%    \end{macrocode}
% Die Maßvorgaben werden entsprechend der Seitengröße gesetzt.
%    \begin{macrocode}
    \tud@cdgeometry@set%
%    \end{macrocode}
% Für den Fall, dass \pkg{typearea} die Satzspiegelberechnung übernimmt oder 
% dieser durch den Benutzer definiert wurde, werden die Ergebnisse aus der
% Berechnung respektive die aktiven Einstellungen direkt an \pkg{geometry}
% weitergereicht. Dazu werden die berechneten Werte in die entsprechenden 
% Hilfsmakros für die Erstellung der \pkg{geometry}-Satzspiegel übergeben.
% Gegebenenfalls werden die Offsets für das Layout korrigiert.
%    \begin{macrocode}
    \ifnum\tud@cdgeometry@num<\tw@\relax% false/custom
      \if@tud@x@geometry@fixmargins%
        \tud@x@geometry@fixmargins%
      \fi%
%    \end{macrocode}
% Die von \pkg{typearea} berechneten Seitenränder werden an \pkg{geometry}
% weitergereicht.
%    \begin{macrocode}
      \ifcase\tud@cdgeometry@num\relax%
        \edef\tud@cdgeometry@hmargin{%
          left=\the\dimexpr\oddsidemargin+1in-\ta@bcor\relax,%
          textwidth=\the\textwidth,%
          \tud@cdgeometry@mpincl,%
          marginparwidth=\the\marginparwidth,%
          marginparsep=\the\marginparsep,%
          \if@reversemargin%
            reversemarginpar=true,%
          \else%
            reversemarginpar=false,%
          \fi%
          bindingoffset=\the\ta@bcor%
        }%
        \edef\tud@cdgeometry@vmargin{%
          \if@hincl%
            includehead=true,%
            top=\the\dimexpr\topmargin+1in\relax,%
          \else%
            includehead=false,%
            top=\the\dimexpr\topmargin%
              +\headheight+\headsep+1in\relax,%
          \fi%
          headheight=\the\headheight,%
          headsep=\the\headsep,%
          textheight=\the\textheight,%
          \tud@cdgeometry@fincl,%
          footskip=\the\footskip%
        }%
%    \end{macrocode}
% Und nun für den benutzerdefinierten Satzspiegel.
%    \begin{macrocode}
      \else% custom
        \ifGm@pass\else%
          \edef\tud@cdgeometry@hmargin{%
            left=\the\dimexpr\oddsidemargin+1in-\Gm@bindingoffset\relax,%
            textwidth=\the\textwidth,%
            \ifGm@includemp%
              includemp=true,%
            \else%
              includemp=false,%
            \fi%
            marginparwidth=\the\marginparwidth,%
            marginparsep=\the\marginparsep,%
            \if@reversemargin%
              reversemarginpar=true,%
            \else%
              reversemarginpar=false,%
            \fi%
            bindingoffset=\the\Gm@bindingoffset%
          }%
          \edef\tud@cdgeometry@vmargin{%
            \ifGm@includehead%
              includehead=true,%
              top=\the\dimexpr\topmargin+1in\relax,%
            \else%
              includehead=false,%
              top=\the\dimexpr\topmargin%
                +\headheight+\headsep+1in\relax,%
            \fi%
            headheight=\the\headheight,%
            headsep=\the\headsep,%
            textheight=\the\textheight,%
            \ifGm@includefoot%
              includefoot=true,%
            \else%
              includefoot=false,%
            \fi%
            footskip=\the\footskip%
          }%
        \fi%
      \fi%
%    \end{macrocode}
% Es wird die Höhendifferenz zwischen TUD-Kopf und Standardkopfzeile für den
% benutzerdefnierten bzw. \pkg{typearea}-Satzspiegel berechnet. Für den 
% Satzspiegel mit TUD-Kopf muss unterschieden werden, ob der Abstand zwischen
% Kopf und Textbereich vergrößert wurde. Ist dies der Fall, wird die Höhe des
% Textbereiches über \cs{@tempdima} entsprechend verkleinert. Sollte der
% benutzerdefinierten bzw. \pkg{typearea}-Satzspiegel noch unterhalb des
% TUD-Kopfes liegen, wird der Abstand zum Kopf vergrößert.
%    \begin{macrocode}
      \setlength\tud@len@areadiff{%
        \dimexpr\tud@len@topmargin+\tud@len@barheight+\tud@len@headsep%
          -\topmargin-\headheight-\headsep-1in\relax%
      }%
      \ifdim\tud@len@areadiff<\z@\relax%
        \addtolength\tud@len@headsep{-\tud@len@areadiff}%
        \setlength\@tempdima{\z@}%
      \else%
        \setlength\@tempdima{\tud@len@areadiff}%
      \fi%
      \edef\tud@cdgeometry@tudmargin{%
        ignorehead=true,%
        top=\the\dimexpr\tud@len@topmargin+\tud@len@barheight%
          +\tud@len@headsep\relax,%
        headheight=\the\dimexpr\tud@len@topmargin+\tud@len@barheight%
          -\tud@len@logoy\relax,%
        headsep=\the\tud@len@headsep,%
        textheight=\the\dimexpr\textheight-\@tempdima\relax%
      }%
%    \end{macrocode}
% Für den Kompatibilitätsmodus der Version~v2.02 gibt es für den \DDC-Fuß einen 
% separaten Satzspiegel.
%    \begin{macrocode}
      \tud@if@v@lower{2.03}{%
        \setlength\tud@len@ddcdiff{%
          \dimexpr.6\tud@len@topmargin-\footskip+\tud@len@headsep%
            +\footheight-1.25\baselineskip\relax%
        }%
        \edef\tud@cdgeometry@ddcmargin{%
          textheight=\the\dimexpr\textheight-\tud@len@areadiff%
            -\tud@len@ddcdiff\relax,%
          footskip=\the\dimexpr\footskip+\tud@len@ddcdiff\relax%
        }%
      }{}%
%    \end{macrocode}
% Sollte die Option \opt{extrabottommargin} verwendet worden sein, wird eine 
% Warnung ausgegeben, dass diese für den \pkg{typearea}-Satzspiegel wirkungslos
% ist.
%    \begin{macrocode}
      \ifdim\dimexpr\tud@dim@extrabottommargin\relax=\z@\relax\else%
        \begingroup%
          \edef\tud@res@a{%
            The key `extrabottommargin' is ineffective\MessageBreak%
            when\space%
            \ifcase\tud@cdgeometry@num%
              package `typearea' is used for layout with\MessageBreak%
              `cdgeometry=typearea'%
            \else%
              a user-defined layout is used with\MessageBreak%
              `cdgeometry=custom'%
            \fi%
          }%
          \edef\tud@res@a{%
            \endgroup%
            \noexpand\ClassWarning{\noexpand\TUD@Class@Name}{\tud@res@a}%
          }%
        \tud@res@a%
      \fi%
%    \end{macrocode}
% Hier erfolgt die Definition der Hilfsmakros für das CD-konforme asymmetrische
% bzw. an das \CD angelehnte Layout für einseitigen und zweiseitigen Satz.
% Zuerst werden die verschiedenen unterschiedlichen horizontalen Ränder für die
% unterschiedlichen Optionen definiert. Dies betrifft im einzelnen den äußeren 
% Seitenrand (\cs{@tempdima}), die Textbreite (\cs{@tempdimb}) sowie die Breite 
% der Randnotizen (\cs{@tempdimc}). Danach kommt der Gleichanteil.
%    \begin{macrocode}
    \else%  true/symmetric/twoside
      \ifcase\tud@cdgeometry@num\relax\or\or%  true
        \setlength\@tempdima{\tud@len@widemargin}%
        \if@reversemargin%
          \setlength\@tempdimc{\tud@len@widemargin}%
        \else%
          \setlength\@tempdimc{\tud@len@slimmargin}%
        \fi%
%    \end{macrocode}
% Die zweite Variante ist eigentlich nicht konform mit dem \CD. Sie ist sowohl
% im einseitigen als auch im zweiseitgigen Satz symmetrisch.
%    \begin{macrocode}
      \or% symmetric
        \setlength\@tempdima{.5\tud@len@both}%
        \setlength\@tempdimc{.5\tud@len@both}%
%    \end{macrocode}
% Eigentlich ist auch die dritte Variante nach dem \CD nicht zulässig. Sie ist
% im einseitigen Satz symmetrisch, im zweiseitgigen Satz wird die innere Seite
% schmaler gesetzt als die äußere, wobei hier auf das in den Seitenrand ragende
% TUD-Logo geachtet werden muss.
%    \begin{macrocode}
      \or% twoside
        \if@twoside%
          \setlength\@tempdima{.4\tud@len@both}%
        \else%
          \setlength\@tempdima{.5\tud@len@both}%
        \fi%
        \setlength\@tempdimc{.5\tud@len@both}%
        \if@twoside%
          \if@reversemargin%
            \setlength\@tempdimc{.4\tud@len@both}%
          \else%
            \setlength\@tempdimc{.6\tud@len@both}%
          \fi%
        \fi%
      \fi%
%    \end{macrocode}
% Die \emph{Berechnung} der Textbreite ist für alle Varainten identisch. Danach 
% erfolgt die Zuweisung zum Makro.
%    \begin{macrocode}
      \addtolength\@tempdimc{-\headsep}%
      \setlength\@tempdimb{%
        \dimexpr\tud@len@layoutwidth-\tud@len@both-\ta@bcor\relax%
      }%
      \if@mincl%
        \addtolength\@tempdimb{-\@tempdimc}%
      \fi%
      \edef\tud@cdgeometry@hmargin{%
        left=\the\@tempdima,%
        textwidth=\the\@tempdimb,%
        \tud@cdgeometry@mpincl,%
        marginparwidth=\the\@tempdimc,%
        marginparsep=\the\dimexpr.5\headsep\relax,%
        \if@reversemargin%
          reversemarginpar=true,%
        \else%
          reversemarginpar=false,%
        \fi%
        bindingoffset=\the\ta@bcor%
      }%
      \if@twoside%
        \ifcase\tud@cdgeometry@num\relax\or\or% true
          \appto\tud@cdgeometry@hmargin{,asymmetric}%
        \else% symmetric/twoside
          \appto\tud@cdgeometry@hmargin{,twoside}%
        \fi%
      \fi%
      \if@twocolumn%
        \appto\tud@cdgeometry@hmargin{,twocolumn}%
      \fi%
%    \end{macrocode}
% Für alle drei Varianten der vertikale Gleichanteil. Der Satzspiegel der 
% Version~v2.02 wird aus Gründen der Kompatibilität weiterhin vorgehalten.
%    \begin{macrocode}
      \tud@if@v@lower{2.03}{%
        \edef\tud@cdgeometry@vmargin{%
          \tud@cdgeometry@hincl,%
          top=\the\dimexpr.5\tud@len@both\relax,%
          headheight=\the\headheight,%
          headsep=\the\tud@len@headsep,%
          bottom=\the\dimexpr.5\tud@len@both+\tud@dim@extrabottommargin\relax,%
          \tud@cdgeometry@fincl,%
          footskip=\the\dimexpr\tud@len@headsep+\footheight%
            -1.25\baselineskip\relax%
        }%
      }{%
        \edef\tud@cdgeometry@vmargin{%
          \tud@cdgeometry@hincl,%
          top=\the\tud@len@slimmargin,%
          headheight=\the\headheight,%
          headsep=\the\headsep,%
          bottom=\the\dimexpr\tud@len@widemargin%
            +\tud@dim@extrabottommargin\relax,%
          \tud@cdgeometry@fincl,%
          footskip=\the\dimexpr\tud@len@footsep+\footheight\relax%
        }%
      }%
      \edef\tud@cdgeometry@tudmargin{%
        ignorehead=true,%
        top=\the\dimexpr\tud@len@topmargin+\tud@len@barheight%
          +\tud@len@headsep\relax,%
        headheight=\the\dimexpr\tud@len@topmargin+\tud@len@barheight%
          -\tud@len@logoy\relax,%
        headsep=\the\tud@len@headsep%
      }%
%    \end{macrocode}
% Es wird die Differenz der Höhen zwischen TUD-Kopf und Standardkopfzeile
% für den Satzspiegel des \CDs berechnet.
%    \begin{macrocode}
      \setlength\tud@len@areadiff{%
        \dimexpr\tud@len@topmargin+\tud@len@barheight+\tud@len@headsep%
          -\tud@len@slimmargin\relax%
      }%
%    \end{macrocode}
% Für die Kompatibilitätsvariante wieder mal die Extrawurst.
%    \begin{macrocode}
      \tud@if@v@lower{2.03}{%
        \setlength\tud@len@areadiff{%
          \dimexpr\tud@len@topmargin+\tud@len@barheight+\tud@len@headsep%
            -.5\tud@len@both\relax%
        }%
%    \end{macrocode}
% Wird die Fußzeile zum Satzspiegel gerechnet, ist für Seiten mit \DDC-Fuß 
% etwas Handarbeit notwendig, damit dieser nicht allzu weit nach oben ragt.
%    \begin{macrocode}
        \setlength\tud@len@ddcdiff{.6\tud@len@topmargin}%
        \edef\tud@cdgeometry@ddcmargin{%
          \if@fincl%
            bottom=\the\dimexpr.5\tud@len@both+\tud@dim@extrabottommargin%
              +\tud@len@ddcdiff+\tud@len@headsep+\footheight%
              -1.25\baselineskip\relax,%
          \else%
            bottom=\the\dimexpr.5\tud@len@both+\tud@dim@extrabottommargin%
              +\tud@len@ddcdiff\relax,%
          \fi%
          footskip=\the\dimexpr\tud@len@headsep+\footheight%
            -1.25\baselineskip+\tud@len@ddcdiff\relax,%
        }%
      }{}%
    \fi%
%    \end{macrocode}
% Es wird die Differenz der Höhen zwischen TUD-Kopf und Standardkopfzeile
% für den Satzspiegel des \CDs berechnet. Außerdem wird die standardmäßige
% vertikale Verschiebung der Überschriften festgelegt, wobei hier insbesondere 
% auf die Gestaltungshöhe DIN~A5 geachtet werden muss.
%    \begin{macrocode}
    \ifdim\tud@len@areadiff<\z@\relax\setlength\tud@len@areadiff{\z@}\fi%
    \global\tud@len@areadiff=\tud@len@areadiff%
%<*book|report|article>
    \setlength\tud@len@areaheadvskip{.22\tud@len@topmargin}%
    \if@tud@cdgeometry@adjust%
      \setlength\tud@len@areaheadvskip{.5\tud@len@areaheadvskip}%
    \fi%
    \global\tud@len@areaheadvskip=\tud@len@areaheadvskip%
%</book|report|article>
%    \end{macrocode}
% Für den Satzspiegel der Version~v2.02 wird außerdem die Länge für den höheren 
% Seitenfuß gesetzt.
%    \begin{macrocode}
    \tud@if@v@lower{2.03}{%
      \ifdim\tud@len@ddcdiff<\z@\relax\setlength\tud@len@ddcdiff{\z@}\fi%
      \global\tud@len@ddcdiff=\tud@len@ddcdiff%
    }{}%
%    \end{macrocode}
% Es wird \cs{tud@cdgeometry@@@process} aufgerufen, was die zuvor definierten
% Hilfsmakros nutzt, um alle benötigten Seitenlayouts optionsabhängig zu
% erstellen.
%    \begin{macrocode}
    \tud@cdgeometry@@@process%
  }%
%    \end{macrocode}
% Der Befehl \cs{tud@cdgeometry@@@process} setzt mit den zuvor definierten
% Hilfsmakros die \pkg{geometry}-Optionen für sowohl die seitlichen als auch
% die oberen sowie unteren Seitenränder und inkludiert ggf. Kopf- und Fußzeile
% in den Satzspiegel. Die unterschiedlichen Layouts sind dabei \val{tudareaddc} 
% für TUD-Kopf und \DDC-Fuß, \val{tudarea} für den alleinigen TUD-Kopf sowie
% \val{stdarea} für den normalen bzw. mit \pkg{typearea} berechneten
% Satzspiegel.
%    \begin{macrocode}
  \newcommand*\tud@cdgeometry@@@process{%
    \tud@x@geometry@getlayout{\tud@cdgeometry@layout}%
%    \end{macrocode}
% Für den Satzspiegel der Version~v2.02 wird als erstes der Satzspiegel für den
% TUD-Kopf zusammen mit dem \DDC-Fuß erstellt. Das Einbeziehen der Fußzeile in
% den Satzspiegel erfolgt nicht ggf. über die Option \opt{includefoot} sondern 
% manuell bei der Definition von \cs{tud@cdgeometry@ddcmargin}.
%    \begin{macrocode}
    \tud@if@v@lower{2.03}{%
      \tud@x@geometry@set{%
        \tud@cdgeometry@layout,%
        \tud@cdgeometry@hmargin,%
        \tud@cdgeometry@vmargin,%
        \tud@cdgeometry@tudmargin,%
        \tud@cdgeometry@ddcmargin,%
        ignorehead,ignorefoot%
      }%
      \tud@savegeometry{tudareaddc}%
    }{}%
%    \end{macrocode}
% Danach folgt der Seitenstil, mit dem TUD-Kopf und der Standardfußzeile.
%    \begin{macrocode}
    \tud@x@geometry@set{%
      \tud@cdgeometry@layout,%
      \tud@cdgeometry@hmargin,%
      \tud@cdgeometry@vmargin,%
      \tud@cdgeometry@tudmargin%
    }%
    \tud@savegeometry{tudarea}%
%    \end{macrocode}
% Als letztes wird der Standardsatzspiegel erstellt.
%    \begin{macrocode}
    \tud@x@geometry@set{%
      \tud@cdgeometry@layout,%
      \tud@cdgeometry@hmargin,%
      \tud@cdgeometry@vmargin%
    }%
    \tud@savegeometry{stdarea}%
%    \end{macrocode}
% Je nach gewählter Option wird der aktuelle Satzspiegel für \pkg{typearea} 
% oder \pkg{geometry} gesichert.
%    \begin{macrocode}
    \ifcase\tud@cdgeometry@num\relax% false
      \tud@savegeometry{current@typearea}%
    \or% custom
      \tud@savegeometry{current@custom}%
    \fi%
%    \end{macrocode}
% Falls die (abermalige) Erstellung der Satzspiegel im Dokument erfolgt, sollte 
% anschließend auch der richtige Satzspiegel wieder ausgewählt werden.
%    \begin{macrocode}
    \if@atdocument%
      \ifstr{\tud@currentgeometry}{stdarea}{}{%
        \expandafter\tud@loadgeometry\expandafter{\tud@currentgeometry}%
      }%
    \fi%
  }%
%    \end{macrocode}
% \end{macro}^^A \tud@cdgeometry@ddcmargin
% \end{macro}^^A \tud@cdgeometry@tudmargin
% \end{macro}^^A \tud@cdgeometry@vmargin
% \end{macro}^^A \tud@cdgeometry@hmargin
% \end{macro}^^A \tud@cdgeometry@layout
% \end{macro}^^A \tud@cdgeometry@@@process
% \end{macro}^^A \tud@cdgeometry@@process
% \begin{macro}{\tud@cdgeometry@hincl}
% \changes{v2.02}{2014/06/23}{geändert für das Paket \pkg{scrlayer-scrpage}}^^A
% \begin{macro}{\tud@cdgeometry@fincl}
% \begin{macro}{\tud@cdgeometry@mpincl}
% \changes{v2.04}{2015/03/09}{neu}^^A
% Diese Hilfsmakros werten die Optionen für das Einbeziehen von Kopf- und
% Fußzeile sowie der Randnotizen aus.
%    \begin{macrocode}
  \newcommand*\tud@cdgeometry@hincl{%
    \if@hincl%
      includehead=true%
    \else%
      includehead=false%
    \fi%
  }%
  \newcommand*\tud@cdgeometry@fincl{%
    \if@fincl%
      includefoot=true%
    \else%
      includefoot=false%
    \fi%
  }%
  \newcommand*\tud@cdgeometry@mpincl{%
    \if@mincl%
      includemp=true%
    \else%
      includemp=false%
    \fi%
  }%
%    \end{macrocode}
% \end{macro}^^A \tud@cdgeometry@mpincl
% \end{macro}^^A \tud@cdgeometry@fincl
% \end{macro}^^A \tud@cdgeometry@hincl
% \begin{macro}{\tud@cdgeometry@@init}
% \changes{v2.04}{2015/03/10}{neu}^^A
% Damit alle Satzspiegeleinstellungen korrekt vorgenommen und auch alle
% Klassenoptionen korrekt verarbeitet werden, wird die Berechnung erstmalig mit
% \cs{AtEndPreamble} am Ende der Präambel ausgeführt. Dabei werden sowohl der
% benutzerdefinierte Satzspiegel als auch die durch \pkg{typearea} berechneten
% Einstellungen gesichert.
%    \begin{macrocode}
  \newcommand*\tud@cdgeometry@@init{%
    \csuse{@ta@usegeometryfalse}%
    \tud@x@geometry@getlayout{\tud@cdgeometry@layout}%
    \tud@cs@store{tud@cdgeometry@num}%
%    \end{macrocode}
% Bei der Initialisierung der zusätzlichen Satzspiegel soll keine Warnung 
% bezüglich der Angabe eines vergrößerten Fußbereichs erscheinen.
%    \begin{macrocode}
    \tud@cs@store{tud@dim@extrabottommargin}%
    \def\tud@dim@extrabottommargin{\z@}%
%    \end{macrocode}
% Zunächst werden die benutzerdefinierten Einstellungen für den Satzspiegel 
% gesichert.
%    \begin{macrocode}
    \tud@cdgeometry@reset{custom}%
    \begingroup%
      \epreto\tud@x@geometry@init{%
        paperwidth=\the\paperwidth,paperheight=\the\paperheight,%
        \tud@cdgeometry@layout,%
        \tud@cdgeometry@mpincl,%
        \if@reversemargin%
          reversemarginpar=true,%
        \else%
          reversemarginpar=false,%
        \fi%
        bindingoffset=\the\ta@bcor,%
        \tud@cdgeometry@hincl,%
        \tud@cdgeometry@fincl,%
      }%
      \edef\tud@res@a{%
        \endgroup%
        \noexpand\tud@cs@use{geometry}{\tud@x@geometry@init,driver=none}%
        \noexpand\@tud@x@geometry@fixmarginstrue%
      }%
    \tud@res@a%
    \tud@cdgeometry@@process%
    \tud@savegeometry{init@custom}%
%    \end{macrocode}
% Und nun der Teil für \pkg{typearea}. Bei der Initialisierung werden mögliche 
% Warnungen des Paketes deaktiviert. Diese werden nur ausgegeben, wenn der 
% Schlüssel \opt{cdgeometry=typearea} angegeben wurde oder im Dokument mit 
% \cs{restoregeometry[typearea]} auf den initialen Satzspiegel umgestellt wird.
%    \begin{macrocode}
    \tud@cdgeometry@reset{typearea}%
    \tud@x@typearea@warnings@off[\tud@res@a]%
    \tud@x@typearea@init%
    \tud@x@typearea@warnings@on%
    \tud@cdgeometry@@process%
    \tud@savegeometry{init@typearea}%
%    \end{macrocode}
% Alle gesammelten Warnungen von \pkg{typearea} werden dem initialisierten
% Satzspiegel hinzugefügt.
%    \begin{macrocode}
    \def\tud@res@b##1{%
      \eappto\Gm@restore@@init@typearea{%
        \noexpand\PackageWarningNoLine{typearea}{##1}%
      }%
    }%
    \forlistloop\tud@res@b{\tud@res@a}%
%    \end{macrocode}
% Hier werden die temporär geäanderten Einstellungen zurückgesetzt.
%    \begin{macrocode}
    \tud@cs@restore{tud@cdgeometry@num}%
    \tud@cs@restore{tud@dim@extrabottommargin}%
%    \end{macrocode}
% Der Kopf im \CD der \TnUD erfordert einen eigenen Satzspiegel, der ggf. durch 
% \cs{tud@BeforeSelectAnyPageStyle} aktiviert bzw. deaktiviert wird.
%    \begin{macrocode}
    \BeforeSelectAnyPageStyle{\tud@BeforeSelectAnyPageStyle{##1}}%
%    \end{macrocode}
% Ganz zum Schluss wird der Satzspiegel für die aktuelle Einstellung von 
% \opt{cdgeometry} gesetzt.
%    \begin{macrocode}
    \ifcase\tud@cdgeometry@num\relax% typearea
      \tud@loadgeometry{init@typearea}%
    \or% custom
      \tud@loadgeometry{init@custom}%
    \fi%
    \@tud@x@geometry@fixmarginstrue%
    \tud@cdgeometry@process%
    \let\tud@cdgeometry@@init\relax%
  }%
%    \end{macrocode}
% \end{macro}^^A \tud@cdgeometry@@init
% \begin{macro}{\tud@BeforeSelectAnyPageStyle}
% \changes{v2.02}{2014/06/23}{neu}^^A
% \changes{v2.04}{2015/04/21}{Auswahl der Schriften für Fußbereich ergänzt}^^A
% \begin{macro}{\tud@currentgeometry}
% \changes{v2.02}{2014/06/23}{neu}^^A
% Mit \cs{tud@BeforeSelectAnyPageStyle} wird beim Umschalten des Seitenstils
% ggf. der Satzspiegel geändert. Es wird der aktivierte Satzspiegel in dem
% Makro \cs{tud@currentgeometry} gesichert, um darauf zu einem späteren 
% Zeitpunkt prüfen zu können.
%
% Für den Fall, dass das Dokument nicht ausschließlich mit dem Kopf im \CD
% auf jeder Seite gesetzt wird, muss der komplette vertikale Satzspiegel
% angepasst werden, sonst wäre der obere Rand optisch viel zu groß. Hierfür
% wird das Paket \pkg{geometry} genutzt. Durch \cs{tud@cdgeometry@@process} 
% werden zwei~-- für die KOmpatibilitätsvariante drei~-- Layouts erstellt.
% Diese können mit \cs{loadgeometry}\marg{Stil} geladen werden.
%    \begin{macrocode}
  \newcommand*\tud@currentgeometry{}
  \newcommand*\tud@BeforeSelectAnyPageStyle[1]{%
%    \end{macrocode}
% Der \pgs{tudheadings}-Seitenstil wird mit dem Befehl \cs{newpairofpagestyles}
% derart definiert, dass zwischen \pgs{tudheadings} und \pgs{plain.tudheadings}
% auch mit \LaTeX-Standardseitenstilen \pgs{headings} bzw. \pgs{plain} 
% umgeschaltet werden kann. Dies wird hiermit beachtet.
%    \begin{macrocode}
    \ifstr{#1}{\GetRealPageStyle{#1}}{%
%    \end{macrocode}
% Für den Fall, das ein \pgs{tudheadings}-Seitenstil geladen werden soll, muss 
% der dazugehörige Satzspiegel ausgewählt werden\dots
%    \begin{macrocode}
      \tud@if@tudheadings{#1}{%
%    \end{macrocode}
% \dots wobei in der Version~v2.02 zwei unterschiedliche existierten, und 
% abhängig von der Verwendung des \DDC-Logos im Fuß waren.
%    \begin{macrocode}
        \tud@if@v@lower{2.03}{%
%    \end{macrocode}
% In diesem Fall werden die Seitenfußeinstellungen mit \cs{tud@ddc@check} in
% \cs{@tempb} geschrieben und abhängig davon der richtige Satzspiegel geladen. 
% Dabei wird zuvor mit dem Wert aus \cs{tud@currentgeometry} geprüft, ob dies 
% überhaupt notwendig ist.
%    \begin{macrocode}
          \tud@ddc@check%
%    \end{macrocode}
% Das \DDC-Logo im Fuß ist nicht aktiviert.
%    \begin{macrocode}
          \ifcase\@tempb\relax% \tud@ddc@foot@num=false
            \ifstr{\tud@currentgeometry}{tudarea}{}{%
              \tud@loadgeometry{tudarea}%
              \gdef\tud@currentgeometry{tudarea}%
            }%
%    \end{macrocode}
% Das \DDC-Logo im Fuß ist aktiviert.
%    \begin{macrocode}
          \else% \tud@ddc@foot@num!=false
            \ifstr{\tud@currentgeometry}{tudareaddc}{}{%
              \tud@loadgeometry{tudareaddc}%
              \gdef\tud@currentgeometry{tudareaddc}%
            }%
          \fi%
%    \end{macrocode}
% Ab der Version~v2.03 ist nur noch ein Satzspiegel vonnöten.
%    \begin{macrocode}
        }{%
          \ifstr{\tud@currentgeometry}{tudarea}{}{%
            \tud@loadgeometry{tudarea}%
            \gdef\tud@currentgeometry{tudarea}%
          }%
        }%
%    \end{macrocode}
% Die Länge \cs{tud@len@areavskip} gibt an, wie groß die Differenz zwischen 
% Kopfhöhe zwischen aktuellem und dem speziellen \pgs{tudheadings}-Seitenstil 
% ist. Da diese in diesem Fall identisch sind, wird die Länge zu \cs{z@} 
% gesetzt.
%    \begin{macrocode}
        \setlength\tud@len@areavskip{\z@}%
%    \end{macrocode}
% Im Seitenfuß wird für die Seitenzahl und ggf. die Kolumnentitel die passende 
% Schrift verwendet.
%    \begin{macrocode}
        \tud@komafont@set{pagenumber}{\usekomafont{tudheadings}}%
        \tud@komafont@set{pagefoot}{\usekomafont{tudheadings}}%
%    \end{macrocode}
% Dies ist der Fall, wenn kein \pgs{tudheadings}-Seitenstil geladen werden soll.
% Zusätzlich zum Satzspeigel wird außerdem der Seitenstil \pgs{empty} 
% zurückgesetzt.
%    \begin{macrocode}
      }{%
        \ifstr{\tud@currentgeometry}{stdarea}{}{%
          \tud@loadgeometry{stdarea}%
          \gdef\tud@currentgeometry{stdarea}%
        }%
%    \end{macrocode}
% Die Länge \cs{tud@len@areavskip} wird auf den berechneten Wert gesetzt. 
% Nur für den Fall, dass die Kopfzeile zum Satzspiegel gerechnet wird und 
% dieser nicht durch \pkg{typearea} berechnet wurde, muss diese Länge etwas
% angepasst werden.
%    \begin{macrocode}
        \setlength\tud@len@areavskip{\tud@len@areadiff}%
        \ifnum\tud@cdgeometry@num>\@ne\relax% true/symmetric/twoside
          \if@hincl%
            \addtolength\tud@len@areavskip{%
              \dimexpr-\headheight-\tud@len@headsep\relax%
            }%
          \fi%
        \fi%
%    \end{macrocode}
% Die Schriften für Seitenzahl und Kolumnentitel werden zurückgesetzt.
%    \begin{macrocode}
        \tud@komafont@unset{pagenumber}%
        \tud@komafont@unset{pagefoot}%
      }%
%    \end{macrocode}
% Die Länge \cs{tud@len@areavskip} wird vorsichtshalber global gesetzt.
%    \begin{macrocode}
      \global\tud@len@areavskip=\tud@len@areavskip%
    }{}%
  }
%    \end{macrocode}
% \end{macro}^^A \tud@currentgeometry
% \end{macro}^^A \tud@BeforeSelectAnyPageStyle
% Damit sind alle notwendigen Satzspiegel für die unterschiedlichen Seitenstile 
% definiert. Im Normalfall werden durch \cs{tud@cdgeometry@@process} alle
% benötigten Satzspiegel erstellt. Mit dem Setzen des Seitenstils wird der
% jeweils richtige bzw. benötigte Satzspiegel ausgewählt.
%    \begin{macrocode}
}
%    \end{macrocode}
% \begin{macro}{\typearea}
% \begin{macro}{\areaset}
% \begin{macro}{\storereareas}
% \changes{v2.06g}{2020/06/18}{Sichern der Längen für \prm{layout}}^^A
% \begin{macro}{\tud@x@typearea@before}
% \changes{v2.06}{2018/08/13}{neu}^^A
% \begin{macro}{\tud@x@typearea@after}
% \changes{v2.06}{2018/08/13}{neu}^^A
% \begin{macro}{\tud@x@typearea@init}
% \changes{v2.06}{2018/08/13}{neu}^^A
% Für die Verwendung von \pkg{typearea} ist eine Sonderbehandlung notwendig, 
% falls mit \cs{geometry} eine Größe für den Druckbereich/das Layout angegeben 
% wurde. Dafür wird das Papierformat temporär auf die Größe des angegebenen 
% Layouts geändert bevor der Satzspiegel berechnet wird. Die Einstellungen in
% der Präambel werden in \cs{tud@x@typearea@init} gesichert.
%    \begin{macrocode}
\newcommand*\tud@x@typearea@before{%
  \tud@cdgeometry@resetlayout%
  \tud@skip@store{paperheight}%
  \tud@skip@store{paperwidth}%
  \begingroup%
    \tud@cdgeometry@assignlayout%
    \edef\tud@res@a{%
      \endgroup%
      \etex@unexpanded{\setlength\paperheight}{\the\tud@len@layoutheight}%
      \etex@unexpanded{\setlength\paperwidth}{\the\tud@len@layoutwidth}%
    }%
  \tud@res@a%
}
\newcommand*\tud@x@typearea@after{%
  \tud@skip@restore{paperheight}%
  \tud@skip@restore{paperwidth}%
  \if@atdocument%
    \tud@cdgeometry@reset{typearea}%
    \tud@cdgeometry@process%
  \else%
    \TUD@key@preset{cdgeometry}{false}%
  \fi%
}
\newcommand*\tud@x@typearea@init{\recalctypearea}%
%    \end{macrocode}
% Die notwendigen Patches für die Befehle aus \pkg{typearea}.
%    \begin{macrocode}
\xpretocmd{\typearea}{%
  \tud@x@typearea@before%
  \def\tud@x@typearea@init{\typearea[#1]{#2}}%
}{}{\tud@patch@wrn{typearea}}
\xapptocmd{\typearea}{\tud@x@typearea@after}{}{\tud@patch@wrn{typearea}}
\xpretocmd{\areaset}{%
  \tud@x@typearea@before%
  \begingroup%
    \setlength\@tempdima{#2}%
    \setlength\@tempdimb{#3}%
    \edef\tud@res@a{%
      \endgroup%
      \noexpand\def\noexpand\tud@x@typearea@init{%
        \noexpand\areaset[#1]{\the\@tempdima}{\the\@tempdimb}%
      }%
    }%
  \tud@res@a%
}{}{\tud@patch@wrn{areaset}}
\xapptocmd{\areaset}{\tud@x@typearea@after}{}{\tud@patch@wrn{areaset}}
%    \end{macrocode}
% Nach einer Wiederherstellung gespeicherter Satzspiegel durch \pkg{typearea} 
% werden die für die Seitenstile benötigten Satzspiegel mit \pkg{geometry} neu
% erstellt.
%    \begin{macrocode}
\tud@cs@store{storeareas}
\renewcommand*\storeareas[1]{%
  \begingroup
    \tud@x@geometry@fixmargins%
    \tud@cs@use{storeareas}{#1}%
    \def\tud@res@b##1{\unexpanded{\setlength##1}{\the##1}}%
    \edef\tud@res@a{%
      \endgroup%
      \etex@unexpanded{\def#1}{%
        \tud@res@b{\tud@len@layoutwidth}%
        \tud@res@b{\tud@len@layoutheight}%
        \tud@res@b{\tud@len@layouthoffset}%
        \tud@res@b{\tud@len@layoutvoffset}%
        \expandonce#1%
        \def\noexpand\tud@cdgeometry@num{\tud@cdgeometry@num}%
      }%
    }%
  \tud@res@a%
}
\AfterRestoreareas{\tud@cdgeometry@process}%
%    \end{macrocode}
% \end{macro}^^A \tud@x@typearea@init
% \end{macro}^^A \tud@x@typearea@after
% \end{macro}^^A \tud@x@typearea@before
% \end{macro}^^A \storereareas
% \end{macro}^^A \areaset
% \end{macro}^^A \typearea
%
% \iffalse
%</class&body>
%<*class&option>
% \fi
%
% \begin{macro}{\tud@x@typearea@warnings@off}
% \changes{v2.06}{2018/08/22}{neu}^^A
% \begin{macro}{\tud@x@typearea@warnings@on}
% \changes{v2.06}{2018/08/22}{neu}^^A
% Das Paket \pkg{typearea} meldet schlechte Einstellungen für den Satzspiegel 
% mittels Warnungen an den Anwender. Diese sind allerdings~-- abhängig von der 
% gewählten Option opt{cdgeometry} für den Satzspiegel~-- gegebenefalls nicht 
% relevant. Da \TUDScript innerhalb von \cs{tud@cdgeometry@@init} am Ende der
% Präambel ohnehin anhand von \cs{tud@x@typearea@init} den Satzspiegel von 
% \pkg{typearea} neu berechnet, werden alle relevanten Warnungen beim Laden des 
% Paketes deaktivert.
%
% Dem Befehl \cs{tud@x@typearea@warnings@off} kann im optionalen Argument ein
% Makro übergeben werden, für welches eine \pkg{etoolbox}-Liste erzeugt wird, 
% in der alle Inhalte der ignorierten Warnungen gepseichert wird, um später auf 
% diese zurückgreifen zu können.
%    \begin{macrocode}
\newcommand*\tud@x@typearea@warnings@off[1][]{%
  \IfArgIsEmpty{#1}{}{\let#1\@empty}%
  \tud@cs@store{PackageWarningNoLine}%
  \renewcommand*\PackageWarningNoLine[2]{%
    \@tud@res@swatrue%
    \ifstr{##1}{typearea}{%
      \ifstrstart{##2}{Bad type area settings!}{\@tud@res@swafalse}{}%
      \ifstrstart{##2}{%
        Maybe no optimal type area settings!%
      }{\@tud@res@swafalse}{}%
      \ifstrstart{##2}{Very low DIV value!}{\@tud@res@swafalse}{}%
    }{}%
    \if@tud@res@swa%
      \tud@cs@use{PackageWarning}{##1}{##2}%
    \else%
      \IfArgIsEmpty{#1}{}{\listeadd#1{##2}}%
    \fi%
  }%
}
\newcommand*\tud@x@typearea@warnings@on{%
  \tud@cs@restore{PackageWarningNoLine}%
}
\BeforePackage{typearea}{%
  \tud@x@typearea@warnings@off%
}
\AfterPackage{typearea}{%
  \tud@x@typearea@warnings@on%
}
%    \end{macrocode}
% \end{macro}^^A \tud@x@typearea@warnings@on
% \end{macro}^^A \tud@x@typearea@warnings@off
%
% \iffalse
%</class&option>
%<*class&body>
% \fi
%
% Die Seitenstile und Satzspiegel korrelieren sehr stark, weshalb das Paket 
% \pkg{scrlayer-scrpage} geladen sein muss und auch alle darauf aufbauenden 
% Einstellungen abgeschlossen sein müssen, um die Satzspiegel zu definieren.
% Deshalb wird \cs{tud@cdgeometry@init} erst nach besagtem Paket aufgerufen.
% Sollte das Laden des Paketes \pkg{geometry} verhindert werden, sind einige
% wenige Befehle vorzuhalten.
% \ToDo{Abhängigkeiten Satzspiegel<>Seitenstil beseitigen}[v2.07]
%    \begin{macrocode}
\TUD@UnwindPackage{geometry}{%
  \newcommand*\tud@cdgeometry@@init{%
    \tud@cdgeometry@process%
    \let\tud@cdgeometry@@init\relax%
  }%
  \newcommand*\tud@cdgeometry@@process{%
    \setlength\tud@len@layoutwidth{\paperwidth}%
    \setlength\tud@len@layoutheight{\paperheight}%
    \tud@cdgeometry@set%
  }%
  \newcommand*\tud@x@geometry@fixmargins{}%
}
%    \end{macrocode}
% \begin{macro}{\tud@cdgeometry@@init}
% \changes{v2.04}{2015/03/10}{neu}^^A
% Wird das Paket \pkg{svg-extract} für das Erzeugen einer solitären Grafik 
% genutzt, so sollen keinerlei Einstellungen für den Satzspiegel vorgenommen 
% werden.
%    \begin{macrocode}
\newcommand*\tud@cdgeometry@init{\tud@cdgeometry@@init}%
\AfterPackage{svg-extract}{%
  \renewcommand*\tud@cdgeometry@init{%
    \if@svgx@standalone%
      \@tud@x@scr@fontsize@settrue%
    \else%
      \tud@cdgeometry@@init%
    \fi%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \tud@cdgeometry@@init
% \begin{macro}{\cleardoubleoddpageusingstyle}
% \begin{macro}{\cleardoubleevenpageusingstyle}
% \begin{macro}{\cleardoublepageusingstyle}
% Damit die Satzspiegelumstellungen nicht durchgeführt werden, wenn durch die 
% folgenden \KOMAScript-Befehle Leerseiten erzeugt werden, müssen diese minimal
% angepasst werden.
%    \begin{macrocode}
\patchcmd{\cleardoubleoddpageusingstyle}{\pagestyle}{%
  \let\tud@BeforeSelectAnyPageStyle\@gobble\pagestyle%
}{}{\tud@patch@wrn{cleardoubleoddpageusingstyle}}
\patchcmd{\cleardoubleevenpageusingstyle}{\pagestyle}{%
  \let\tud@BeforeSelectAnyPageStyle\@gobble\pagestyle%
}{}{\tud@patch@wrn{cleardoubleevenpageusingstyle}}
\patchcmd{\cleardoublepageusingstyle}{\pagestyle}{%
  \let\tud@BeforeSelectAnyPageStyle\@gobble\pagestyle%
}{}{\tud@patch@wrn{cleardoublepageusingstyle}}
%    \end{macrocode}
% \end{macro}^^A \cleardoublepageusingstyle
% \end{macro}^^A \cleardoubleevenpageusingstyle
% \end{macro}^^A \cleardoubleoddpageusingstyle
% \begin{macro}{\tud@ddc@enlargepage}
% \changes{v2.02}{2014/06/23}{neu}^^A
% Der Befehl wird nur für den Kompatibilitätsmodus zur Version~v2.02 benötigt 
% und für die Titelkopf- und Kapitelseiten verwendet. Er verkleinert die
% entsprechenden Seiten, wenn für diese mit dem Befehl \cs{thispagestyle} einer
% der \pgs{tudheadings}-Seitenstile gewählt wird \emph{und} das \DDC-Logo im
% Fuß gesetzt werden soll. Der entsprechende Seitenstil kann im optionalen
% Argument angegeben werden, wenn der Befehl bedingt ausgeführt werden soll.
%    \begin{macrocode}
\tud@if@v@lower{2.03}{%
  \newcommand*\tud@ddc@enlargepage[1][]{%
    \tud@if@tudheadings{#1}{%
      \ifstr{\tud@currentgeometry}{tudareaddc}{}{%
        \tud@ddc@check%
        \ifcase\@tempb\relax\else% \tud@ddc@foot@num!=false
          \enlargethispage{-\tud@len@ddcdiff}%
        \fi%
      }%
    }{}%
  }%
}{}
%    \end{macrocode}
% \end{macro}^^A \tud@ddc@enlargepage
%
% \iffalse
%</class&body>
% \fi
%
% \Finale
%
\endinput
