% \CheckSum{2578}
% \iffalse meta-comment
% ======================================================================
% scrkernel-typearea.dtx
% Copyright (c) Markus Kohm, 2002-2015
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c of the license.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX 
% version 2005/12/01 or later and of this work.
%
% This work has the LPPL maintenance status "author-maintained".
%
% The Current Maintainer and author of this work is Markus Kohm.
%
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-typearea.dtx
% Copyright (c) Markus Kohm, 2002-2015
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
% Die neuste Version dieser Lizenz ist
%   http://www.latex-project.org/lppl.txt
% und Version 1.3c ist Teil aller Verteilungen von LaTeX
% Version 2005/12/01 oder spaeter und dieses Werks.
%
% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
% (allein durch den Autor verwaltet).
%
% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
% 
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
% \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: $Id: scrkernel-typearea.dtx 2088 2015-05-03 09:09:14Z kohm $
%<package&identify>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
%<*driver>
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
  \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
  \filedate$Date: 2015-05-03 11:09:14 +0200 (Sun, 03 May 2015) $
  \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
  \filerevision$Revision: 1872 $
  \edef\reserved@a{%
    \noexpand\endgroup
    \noexpand\ProvidesFile{scrkernel-typearea.dtx}[%
                            \filedate\space\filerevision\space
                            KOMA-Script source
  }
\reserved@a
%</driver>
%<*driver|(package&identify)>
%<package>\ProvidesPackage{typearea}[%
%!KOMAScriptVersion
  package (type area)]
%</driver|(package&identify)>
%<*dtx>
\ifx\documentclass\undefined
  \input scrdocstrip.tex
  \@@input scrkernel-version.dtx
  \@@input scrstrip.inc
  \generate{\usepreamble\defaultpreamble
    \file{typearea.sty}{%
      \from{scrkernel-version.dtx}{package,typearea}%
      \from{scrkernel-typearea.dtx}{package,identify}%
      \from{scrkernel-basics.dtx}{load}%
      \from{scrkernel-typearea.dtx}{package,option}%
      \from{scrkernel-compatibility.dtx}{package,typearea,option}%
      \from{scrkernel-typearea.dtx}{package,body}%
      \from{scrkernel-compatibility.dtx}{package,typearea,body}%
      \from{scrlogo.dtx}{logo}%
    }%
  }
  \@@input scrstrop.inc
\else
  \let\endbatchfile\relax
\fi
\endbatchfile
%</dtx>
%<*driver>
\documentclass{scrdoc}
\usepackage[english,ngerman]{babel}
\usepackage[latin1]{inputenc}
\CodelineIndex
\RecordChanges
\GetFileInfo{scrkernel-typearea.dtx}
\title{\KOMAScript{} \partname\ \texttt{\filename}%
  \footnote{Dies ist Version \fileversion\ von Datei \texttt{\filename}.}}
\date{\filedate}
\author{Markus Kohm}

\begin{document}
  \maketitle
  \tableofcontents
  \DocInput{\filename}
\end{document}
%</driver>
% \fi
%
% \selectlanguage{ngerman}
%
% \changes{v2.95}{2002/06/20}{%
%   erste Version aus der Aufteilung von \texttt{scrclass.dtx}}
%
%
% \section{Satzspiegel Makros}
%
% Dieser Abschnitt beinhaltet alle Makros, die für den Satzspiegel
% benötigt werden. Dies betrifft sowohl das Paket \textsf{typearea}
% als auch die Klassen.
%
% \StopEventually{\PrintIndex\PrintChanges}
%
%
% \subsection{Präambel}
%
% \iffalse
%<*class|package>
%<*package&identify>
% \fi
%
% Zuerst einmal zeigen, was das Paket ist:
%    \begin{macrocode}
\typeout{%
  Package typearea, \csname ver@typearea.\@pkgextension\endcsname^^J%
  \@spaces\@spaces\@spaces\@spaces\space\space 
  Copyright (C) Frank Neukam, 1992-1994^^J%
  \@spaces\@spaces\@spaces\@spaces\space\space
  Copyright (C) Markus Kohm, 1994-^^J%
}
%    \end{macrocode}
%
% \iffalse
%</package&identify>
%<*option>
% \fi
%
% \subsection{Von den Optionen benötigte Befehle}
%
% Für das Paket
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% Zur Auswertung der Optionen werden einige Makros benötigt. Diese
% sind natürlich vor der Deklaration der Optionen bzw. vor der
% Auswertung der Optionen zu definieren. Ich mache das hier vor der
% Deklaration der Optionen.
%
% \begin{macro}{\SetDIVList}
%   \changes{v2.1a}{1994/10/28}{neu}^^A
%   \changes{v2.6}{2000/01/04}{\cs{ta@divlist} enthält Werte für
%      Schriftgrößen ab 1pt}
% Der Befehl \cs{SetDIVList} tut nichts weiter als die innere Variable
% für die schriftgrößenabhängige \emph{DIV}-Liste \cs{ta@divlist} neu
% zu definieren. Dabei können \emph{DIV}-Werte für Größen ab 10\,pt
% gesetzt werden. 
%    \begin{macrocode}
\newcommand*\SetDIVList[1]{\def\ta@divlist{{}{}{}{}{}{}{}{}{}#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\SetXDIVList}
%   \changes{v2.6}{2000/01/04}{neu}^^A
% Da mit \cs{SetDIVList} aus Kompatibilitätsgründen nur Werte für
% Größen ab 10\,pt gesetzt werden können, wird für Werte ab 1\,pt
% ein neuer Befehl benötigt.
%    \begin{macrocode}
\newcommand*\SetXDIVList[1]{\def\ta@divlist{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{Length}{\ta@bcor}
%  \changes{v2.2a}{1995/01/25}{Definition der Dimension wegen der
%    Option \texttt{BCOR} vorgezogen}
%  \changes{v2.7g}{2001/04/17}{\cs{newlength} and Stelle von
%    \cs{newdimen} für die Definition verwendet}
% Dimension für die Bindekorrektur reservieren. Diese wird implizit
% zu 0\,pt initialisiert.
%    \begin{macrocode}
\newlength{\ta@bcor}
%    \end{macrocode}
% \end{Length}
%
% \begin{macro}{\ta@div}
%   \changes{v2.2a}{1995/01/25}{Definition wegen der Option
%      \texttt{DIV} vorgezogen}
% Zähler für \emph{DIV} reservieren. Dieser wird implizit zu 0
% initialisiert. 
%    \begin{macrocode}
\newcount\ta@div
%    \end{macrocode}
% \end{macro}
%
% Ab hier nun Teile für Klassen und Paket:
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \begin{macro}{\@BCOR}
% \begin{macro}{\@@BCOR}
%   \changes{v2.5}{1997/06/17}{Einzelzeichenscanner durch
%      Mustererkennung ersetzt}^^A
% Das Makro \cs{@BCOR} wird später benötigt, um die Option
% \texttt{BCOR\emph{BCOR}} zu erkennen. Die Option wird über ihr
% Muster erkannt. 
%    \begin{macrocode}
\newcommand*{\@BCOR}{\expandafter\@@BCOR\CurrentOption BCORBCOR\@@BCOR}
\newcommand*{\@@BCOR}{}
\def\@@BCOR #1BCOR#2BCOR#3\@@BCOR{%
%    \end{macrocode}
% Handelt es sich um die Option \texttt{BCOR}, so ist der erste
% Parameter leer.
%    \begin{macrocode}
  \ifstr{#1}{}{%
%    \end{macrocode}
% Außerdem ist der dritte Parameter dann \texttt{BCOR}.
%    \begin{macrocode}
    \ifstr{#3}{BCOR}{%
%    \end{macrocode}
% Der zweite Parameter sollte dann die Größe enthalten. Ist dies
% nicht der Fall, wird ein Fehler gemeldet (Fehlerzeile ist dann
% \cs{ProcessOptions}).
%    \begin{macrocode}
%<class>      \PassOptionsToPackage{BCOR#2}{typearea}%
%<package>      \ifdimen{#2}{\setlength{\ta@bcor}{#2}}{\scr@pti@nerr@r}%
%    \end{macrocode}
% In allen anderen Fällen ist es nicht diese Option, dann wird ein
% Fehler ausgegeben. Stattdessen könnte hier auch auf weitere Optionen
% getestet werden.
%    \begin{macrocode}
    }{\scr@pti@nerr@r}%
  }{\scr@pti@nerr@r}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@DIV}
% \begin{macro}{\@@DIV}
%   \changes{v2.5}{1997/06/17}{Einzelzeichenscanner durch
%      Mustererkennung ersetzt}^^A
% Die grundsätzliche Funktion ist die gleiche wie bei \cs{@BCOR},
% \cs{@@BCOR}.
%    \begin{macrocode}
\newcommand*{\@DIV}{\expandafter\@@DIV\CurrentOption DIVDIV\@@DIV}
\newcommand*{\@@DIV}{}
\def\@@DIV #1DIV#2DIV#3\@@DIV{%
  \edef\@tempa{#1}\ifx\@tempa\@empty
    \edef\@tempa{#3}\def\@tempb{DIV}\ifx\@tempa\@tempb
%<class>      \PassOptionsToPackage{DIV#2}{typearea}%
%<package>      \ifnumber{#2}{\ta@div=#2\relax}{\scr@pti@nerr@r}%
    \else\scr@pti@nerr@r\fi
%    \end{macrocode}
% Der Unterschied liegt darin, dass bei einem Fehlschlag der
% Mustererkennung kein Fehler vorliegt, sondern u.\,U. noch auf
% \texttt{BCOR} getestet werden muss.
%    \begin{macrocode}
  \else\@BCOR\fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@headlines}
% \begin{macro}{\@@headlines}
%   \changes{v2.7g}{2001/04/17}{neue Mustererkennung für die Anzahl
%      der Kopfzeilen}^^A
% Das Macro \cs{@headlines} wird benötigt, um die Option
% \texttt{headlines} zu erkennen.
%    \begin{macrocode}
\newcommand{\@headlines}{%
  \expandafter\@@headlines\CurrentOption headlines\@@headlines%
}
\newcommand*{\@@headlines}{}
\def\@@headlines #1headlines#2\@@headlines{
  \edef\@tempa{#2}\edef\@tempb{headlines}\ifx\@tempa\@tempb
%<class>    \PassOptionsToPackage{#1headlines}{typearea}
%<package>    \setlength{\@tempdima}{#1\baselineskip}%
%<package>    \def\ta@hh{#1\baselineskip}%
  \else\@DIV\fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% Jetzt kommt ein Stück, das nur im Paket benötigt wird.
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% \begin{macro}{\x@paper}
% \begin{macro}{\x@@paper}
%   \changes{v2.5}{1997/06/17}{neue Mustererkennung für die
%      Papiergröße}^^A
% Diese Makros werden ebenfalls später benötigt, wenn die Papiergröße
% festgelegt wird.
% \begin{macro}{\isopaper}
%   \changes{v2.5}{1997/06/17}{neu}^^A
%   \changes{v2.95}{2002/12/03}{es sind auch Großbuchstaben erlaubt}^^A
% Da das Makro \cs{isopaper} zur Berechnung unterschiedlicher
% ISO/DIN-Papierformate in der Mustererkennung für die Papiergröße
% benötigt wird, wurde dieses Makro ebenfalls vorgezogen.
%    \begin{macrocode}
\newcommand\isopaper[2][a]{%
%    \end{macrocode}
% Das Makro kennt zwei Parameter, von denen der erste und optionale
% die Grundgröße angibt. Die Angabe erfolgt über einen
% Buchstaben. Möglich sind
% \begin{description}
% \item[a] -- ISO/DIN-A-Format
% \item[b] -- ISO/DIN-B-Format
% \item[c] -- ISO/DIN-C-Format
% \item[d] -- ISO/DIN-D-Format
% \end{description}
% Der zweite Paremeter gibt dann die Skalierung an.
%
% Als Grundgröße wird jeweils die 0-Größe eingesetzt.
%    \begin{macrocode}
  \ifx a#1
    \setlength{\paperwidth}{841sp}%
    \setlength{\paperheight}{1189sp}%
  \else\ifx A#1
      \setlength{\paperwidth}{841sp}%
      \setlength{\paperheight}{1189sp}%
    \else\ifx b#1
        \setlength{\paperwidth}{1000sp}%
        \setlength{\paperheight}{1414sp}%
      \else\ifx B#1
          \setlength{\paperwidth}{1000sp}%
          \setlength{\paperheight}{1414sp}%
        \else\ifx c#1
            \setlength{\paperwidth}{917sp}%
            \setlength{\paperheight}{1297sp}%
          \else\ifx C#1
              \setlength{\paperwidth}{917sp}%
              \setlength{\paperheight}{1297sp}%
            \else\ifx d#1
                \setlength{\paperwidth}{771sp}%
                \setlength{\paperheight}{1090sp}%
              \else\ifx D#1
                  \setlength{\paperwidth}{771sp}%
                  \setlength{\paperheight}{1090sp}%
%    \end{macrocode}
% Wurde ein anderer Buchstabe angegeben, ist ein Fehler auszugeben.
%   \changes{v2.5a}{1997/06/22}{Ausgabe der gewählten Papiergröße
%     entfernt} 
%    \begin{macrocode}
                \else
                  \PackageError{typearea}{%
                    Unknown ISO/DIN-papersize-letter #1%
                  }{%
                    There are only four defined paper scalings:\MessageBreak
                    a = ISO/DIN-A, b = ISO/DIN-B, c = ISO/DIN-C, 
                    d = ISO/DIN-D\MessageBreak
                    Read KOMA-Script-documentation for further information.%
                  }%
                  \setlength{\paperwidth}{841sp}%
                  \setlength{\paperheight}{1189sp}%
                \fi
              \fi
            \fi
          \fi
        \fi
      \fi
    \fi
  \fi
%    \end{macrocode}
% Es dürfte aufgefallen sein, dass bei der Größenfestlegung statt
% der Einheit "`mm"' die Einheit "`sp"' geschrieben wurde. Die Maße
% sind also um ein Vielfaches zu klein und müssen später noch mit
% 186468 multiplitziert werden, um auf Millimeter zu kommen. Dieser
% Trick ist jedoch notwendig, weil die Norm vorschreibt, dass bei der
% nun folgenden $n$-fachen Halbierung der Seiten ($n =
% \mathrm{Skalierung} + 1$) jeweils auf ganze Millimeter abgerundet
% werden muss. 
%    \begin{macrocode}
  \@tempcnta=#2\relax
  \@whilenum\@tempcnta>0
  \do{\setlength{\@tempdima}{\paperwidth}
    \setlength{\paperwidth}{.5\paperheight}
    \setlength{\paperheight}{\@tempdima}
    \advance\@tempcnta by\m@ne
  }
%    \end{macrocode}
% Zum Schluß muss nun die genannte Multiplitkation erfolgen. Da
% "`mm"' kein ganzzahliges Vielfaches von "`sp"' ist, beinhaltet diese
% Multiplikation eigentlich einen Fehler und eine Abweichung von der
% Norm. Da jedoch "`sp"' die Rechengenauigkeit von {\TeX} darstellt,
% stellt auch die Angabe eines ganzzahligen Millimeterwertes bereits
% einen solchen Fehler dar. 
%    \begin{macrocode}
  \multiply\paperwidth by186468
  \multiply\paperheight by186468
%    \end{macrocode}
% Jetzt noch die gewünschte Ausrichtung beachten.
%   \changes{v2.97e}{2007/10/23}{gewünschte Papierausrichtung wird beachtet}^^A
%    \begin{macrocode}
  \if@landscape
    \setlength{\@tempdima}{\paperwidth}%
    \setlength{\paperwidth}{\paperheight}%
    \setlength{\paperheight}{\@tempdima}%
  \fi
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\iso@paper}
%   \changes{v2.95}{2002/12/03}{neu (intern)}^^A
% Ein ganz ähnlicher interner Befehl erhält den gesamten Namen des
% ISO-Papierformats als einziges Argument.
% \begin{macro}{\iso@@paper}
%   \changes{v2.95}{2002/12/03}{neu (intern)}^^A
% Dieses Argument wird dann über einen weiteren internen Befehl per
% Mustererkennung in den Kennbuchstaben und eine Zahl zerlegt.
%    \begin{macrocode}
\newcommand*{\iso@paper}[1]{\expandafter\iso@@paper#1\@nil}
\newcommand*{\iso@@paper}{}
\def\iso@@paper#1#2\@nil{%
  \@tempswafalse
  \if #1a\@tempswatrue
  \else\if #1A\@tempswatrue
    \else\if #1b\@tempswatrue
      \else\if #1B\@tempswatrue
        \else\if #1c\@tempswatrue
          \else\if #1C\@tempswatrue
            \else\if #1d\@tempswatrue
              \else\if #1D\@tempswatrue
  \fi\fi\fi\fi\fi\fi\fi\fi
  \if@tempswa
    \ifnumber{#2}{\isopaper[#1]{#2}}{\@tempswafalse}%
  \fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% Jetzt wird es wieder für alle interessant:
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% Zurück zur Mustererkennung. Diese ist tatsächlich etwas einfacher
% als die in den beiden Fällen zuvor.
% \changes{v2.97e}{2007/10/23}{Optionen werden nach der neuen Syntax an
%   typearea weitergeleitet}^^A
%    \begin{macrocode}
\newcommand*{\x@paper}{%
  \expandafter\x@@paper\CurrentOption paper\x@@paper%
}
\newcommand*{\x@@paper}{}
\def\x@@paper #1#2paper#3\x@@paper{%
  \ifstr{#3}{paper}{%
    \ifnumber{#2}{%
      \ifstr{#1}{a}{%
%<class>        \PassOptionsToPackage{#3=#1#2}{typearea}%
%<package>        \isopaper[a]{#2}%
      }{%
        \ifstr{#1}{b}{%
%<class>          \PassOptionsToPackage{#3=#1#2}{typearea}%
%<package>          \isopaper[b]{#2}%
        }{%
          \ifstr{#1}{c}{%
%<class>            \PassOptionsToPackage{#3=#1#2}{typearea}%
%<package>            \isopaper[c]{#2}%
          }{%
            \ifstr{#1}{d}{%
%<class>              \PassOptionsToPackage{#3=#1#2}{typearea}%
%<package>              \isopaper[d]{#2}%
            }{\scr@pti@nerr@r}%
          }%
        }%
      }%
    }{\scr@pti@nerr@r}%
  }{%
%<class>    \@pt@scan
%<package>    \@headlines
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\scr@pti@nerr@r}
%   \changes{v2.95}{2002/06/20}{\cs{OptionNotUsed} statt
%      \cs{PackageError}} 
% Falls die zuätzliche Option nicht \texttt{BCOR}, \texttt{DIV},
% \texttt{headlines} oder eine bekannte Papiergröße ist, ist die
% Option nicht verwendet.
%    \begin{macrocode}
\newcommand*{\scr@pti@nerr@r}{
%<class>  \OptionNotUsed
%<package>  \@unknownoptionerror
}
%    \end{macrocode}
% \end{macro}
%
% Jetzt wieder nur für Pakete:
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% \subsection{Optionen mit \textsf{keyval}}
%
% \subsubsection{Kopf-, Fuß-, Rand- und Textbereich}
%
% \begin{option}{headlines}
%   \changes{v2.95}{2002/12/06}{mit \textsf{keyval} neu implementiert}
%   \changes{v3.12}{2013/03/05}{Verwendung der Status-Signalisierung mit
%     \cs{FamilyKeyState}}
% \begin{option}{footlines}
%   \changes{v3.12}{2013/03/26}{neue Option}^^A
% Neben der Auswertung der \meta{Wert}\texttt{headlines} Form über
% Pattern Matching wird hier auch noch eine \textsf{keyval}-Option
% definiert, die bevorzugt zu verwenden ist. Für den Fuß wird überhaupt nur
% diese Form bereit gestellt.
%    \begin{macrocode}
\KOMA@key{headlines}{%
  \begingroup
    \setlength{\@tempdima}{#1\baselineskip}%
  \endgroup
  \def\ta@hh{#1\baselineskip}%
  \FamilyKeyStateProcessed
  \KOMA@kav@replacevalue{.typearea.\scr@pkgextension}{headlines}{#1}%
  \KOMA@kav@replacevalue{.typearea.\scr@pkgextension}{headheight}{#1\baselineskip}%
}
\KOMA@key{footlines}{%
  \begingroup
    \setlength{\@tempdima}{#1\baselineskip}%
  \endgroup
  \def\ta@fh{#1\baselineskip}%
  \FamilyKeyStateProcessed
  \KOMA@kav@replacevalue{.typearea.\scr@pkgextension}{footlines}{#1}%
  \KOMA@kav@replacevalue{.typearea.\scr@pkgextension}{footheight}{#1\baselineskip}%
}
%    \end{macrocode}
% \end{option}
% \end{option}
%
% \begin{option}{headheight}
%   \changes{v2.98c}{2008/04/06}{neue Option}^^A
%   \changes{v3.12}{2013/03/05}{Verwendung der Status-Signalisierung mit
%     \cs{FamilyKeyState}}
% \begin{option}{footheight}
%   \changes{v3.12}{2013/03/26}{neue Option}^^A
% Manchmal ist es nützlicher, wenn man die Höhe direkt setzen kann, statt sie
% über die Anzahl der Grundlinien zu setzen. In dem Fall nimmt man einfach
% diese Optionen.
%    \begin{macrocode}
\KOMA@key{headheight}{%
  \begingroup
    \setlength{\@tempdima}{#1}%
  \endgroup
  \def\ta@hh{#1}%
  \FamilyKeyStateProcessed
  \KOMA@kav@replacevalue{.typearea.\scr@pkgextension}{headheight}{#1}%
  \KOMA@kav@removekey{.typearea.\scr@pkgextension}{headlines}%
}
\KOMA@key{footheight}{%
  \begingroup
    \setlength{\@tempdima}{#1}%
  \endgroup
  \def\ta@fh{#1}%
  \FamilyKeyStateProcessed
  \KOMA@kav@replacevalue{.typearea.\scr@pkgextension}{footheight}{#1}%
  \KOMA@kav@removekey{.typearea.\scr@pkgextension}{footlines}%
}
%    \end{macrocode}
% \end{option}
% \end{option}
%
% \begin{option}{headinclude}
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
% \begin{option}{headexclude}
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{deprecated}^^A
% Diese Optionen bestimmen, ob der Seitenkopf bereits zum Textbereich
% gehört.
% \begin{macro}{\if@hincl}
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
%   \changes{v2.97c}{2007/04/19}{direkte Initialisierung über \cs{if@hsl},
%     falls definiert}
% \begin{macro}{\@hincltrue}
% \begin{macro}{\@hinclfalse}
% Der Zustand selbst wird in einem Schalter gespeichert.
%    \begin{macrocode}
\newif\if@hincl\@ifundefined{if@hsl}{}{\let\if@hincl\if@hsl}
\KOMA@ifkey{headinclude}{@hincl}
\KOMA@DeclareDeprecatedOption[typearea]{headexclude}{headinclude=false}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{option}
% \end{option}
%
% \begin{option}{footinclude}
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
% \begin{option}{footexclude}
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{deprecated}^^A
% Diese Optionen bestimmen, ob die Fußzeilen noch zum Textbereich
% gehören.
% \begin{macro}{\if@fincl}
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
%   \changes{v2.97c}{2007/04/19}{direkte Initialisierung über \cs{if@fsl},
%      falls definiert}
% \begin{macro}{\@fincltrue}
% \begin{macro}{\@finclfalse}
% Der Zustand selbst wird in einem Schalter gespeichert.
%    \begin{macrocode}
\newif\if@fincl\@ifundefined{if@fsl}{}{\let\if@fincl\if@fsl}
\KOMA@ifkey{footinclude}{@fincl}
\KOMA@DeclareDeprecatedOption[typearea]{footexclude}{footinclude=false}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{option}
% \end{option}
%
% \begin{option}{mpinclude}
%   \changes{v2.8q}{2002/03/28}{neue Option}^^A
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
% \begin{option}{mpexclude}
%   \changes{v2.8q}{2002/03/28}{neue Option}^^A
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{deprecated}^^A
% Es gibt Dokumente mit sehr ausführlichen Randnotizen, bei denen die
% Randnotizen bei der Satzspiegelberechnung in den Satzspiegel
% eingerechnet werden sollten. Diese Optionen bestimmen, ob dies der
% Fall ist.
% \begin{macro}{\if@mincl}
%   \changes{v2.95}{2002/07/08}{Verwendung von \textsf{scrkeyvl}}
% \begin{macro}{\@mincltrue}
% \begin{macro}{\@minclfalse}
% Der Zustand wird in einem Schalter gespeichert. \textbf{Achtung:}
% Bei Verwendung dieser Option müssen größere DIV-Werte verwendet
% werden. Siehe dazu weiter unten.
%    \begin{macrocode}
\KOMA@ifkey{mpinclude}{@mincl}
\KOMA@DeclareDeprecatedOption[typearea]{mpexclude}{mpinclude=false}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{option}
% \end{option}
%
% \begin{option}{BCOR}
%   \changes{v2.2a}{1995/01/25}{neue Option}^^A
%   \changes{v2.95}{2002/12/04}{als \textsf{keyval}-Option
%     implementiert}
%   \changes{v3.12}{2013/03/05}{Verwendung der Status-Signalisierung mit
%     \cs{FamilyKeyState}}
% Der Wert wird einfach an die Länge \cs{ta@bcor} verfüttert, wobei
% symbolische Werte speziell behandelt werden, auch wenn sie beim
% Laden des Pakets absolut keinen Sinn ergeben!
%    \begin{macrocode}
\KOMA@key{BCOR}{%
  \ifstr{#1}{current}{}{%
    \setlength{\ta@bcor}{#1}%
  }%
  \FamilyKeyStateProcessed
  \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}{BCOR}{#1}%
}
%    \end{macrocode}
% Wenn allerdings der Satzspiegel bereits berechnet ist, dann muss er
% hier stattdessen neu berechnet werden.
%   \changes{v3.13}{2014/06/30}{fehlendes \cs{FamilyKeyStateProcessed}^^A
%     ergänzt}^^A
%    \begin{macrocode}
\AtEndOfPackage{%
  \KOMA@key{BCOR}{\typearea[{#1}]{last}\FamilyKeyStateProcessed}%
}
%    \end{macrocode}
% \end{option}
%
% \begin{option}{DIV}
%   \changes{v2.2a}{1995/01/25}{neue Option}^^A
%   \changes{v2.95}{2002/12/04}{als \textsf{keyval}-Option
%     implementiert}
%   \changes{v3.12}{2013/03/05}{Verwendung der Status-Signalisierung mit
%     \cs{FamilyKeyState}}
% Der Wert wird einfach an den Zähler \cs{ta@div} verfüttert, wobei
% symbolische Werte speziell behandelt werden. Dabei werden auch die
% Werte "`\texttt{last}"' und "`\texttt{current}"' ausgewertet, auch
% wenn diese beim Laden des Pakets absolut keinen Sinn ergeben!
%    \begin{macrocode}
\KOMA@key{DIV}[calc]{%
  \edef\@tempa{#1}%
  \def\@tempb{last}\ifx\@tempa\@tempb\let\@tempa=\@lastdiv\fi
  \def\@tempb{current}\ifx\@tempa\@tempb\else
    \def\@tempb{default}\ifx\@tempa\@tempb\ta@div=\z@ \else
      \def\@tempb{calc}\ifx\@tempa\@tempb\ta@div=\tw@ \else
        \def\@tempb{classic}\ifx\@tempa\@tempb\ta@div=\thr@@ \else
          \ta@div=\@tempa
        \fi
      \fi
    \fi
  \fi
  \FamilyKeyStateProcessed
  \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}{DIV}{#1}%
}
%    \end{macrocode}
% Wenn allerdings der Satzspiegel bereits berechnet ist, dann muss er
% hier stattdessen neu berechnet werden.
%   \changes{v3.13}{2014/06/30}{fehlendes \cs{FamilyKeyStateProcessed}^^A
%     ergänzt}^^A
%    \begin{macrocode}
\AtEndOfPackage{%
  \KOMA@key{DIV}{\typearea[current]{#1}\FamilyKeyStateProcessed}%
}
%    \end{macrocode}
% \end{option}
%
% \begin{option}{DIVcalc}
%   \changes{v2.4g}{1996/11/04}{neue Option}^^A
%   \changes{v2.95}{2002/12/04}{über Option \texttt{DIV} reimplementiert}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{DIVclassic}
%   \changes{v2.4n}{1997/05/28}{neue Option}^^A
%   \changes{v2.95}{2002/12/04}{über Option \texttt{DIV} reimplementiert}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% Dann gibt es da noch zwei alte Sonderfälle.
%    \begin{macrocode}
\KOMA@DeclareDeprecatedOption[typearea]{DIVcalc}{DIV=calc}
\KOMA@DeclareDeprecatedOption[typearea]{DIVclassic}{DIV=classic}
%    \end{macrocode}
% \end{option}
% \end{option}
%
%
% \begin{option}{areasetadvanced}
%   \changes{v3.11}{2012/04/17}{new internal option}^^A
% Switch to advanced version of \cs{areaset}. This does calculate margins
% more like \cs{typearea}. Nevertheless, there's still a difference at the top
% margin, because \cs{typerea} doesn't balance differences in calculated
% height of margins and resulting height of margins but reduces only the
% bottom margin.
%    \begin{macrocode}
\KOMA@ifkey{areasetadvanced}{@areasetadvanced}
%    \end{macrocode}
% \end{option}
%
%
% \subsubsection{Sonstige Satzspiegel-Optionen}
%
% \begin{option}{oneside}
%   \changes{v2.97e}{2007/11/23}{auf vielfachen Wunsch reicht die Klasse die
%     Option an das Paket weiter}^^A
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{twoside}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}^^A
%   \changes{v2.97e}{2007/11/23}{auf vielfachen Wunsch reicht die Klasse die
%     Option an das Paket weiter}^^A
%   \changes{v3.00}{2008/07/09}{die Option kennt zusätzlich den Wert
%     \texttt{semi}}^^A
%   \changes{v3.12}{2013/03/05}{Verwendung der Status-Signalisierung mit
%     \cs{FamilyKeyState}}^^A
%   \changes{v3.13a}{2014/04/09}{Die Klasse setzt signalisiert ebenfalls
%     \cs{FamilyKeyStateProcessed}}^^A
%   \changes{v3.17}{2015/03/17}{ab dieser Version werden \cs{flushbottom} und
%     \cs{raggedbottom} automatisch gesetzt}^^A
%   \changes{v3.17}{2015/03/17}{Voreinstellungen werden bereits hier
%     gesetzt}^^A
%   \changes{v3.17}{2015/03/18}{wenn möglich \cs{cleardoubleoddpage}
%     verwenden}^^A
% \begin{macro}{\if@semitwoside}
%   \changes{v3.00}{2008/07/09}{neuer Schalter (intern)}^^A
% \begin{macro}{\if@twoside}
%   \changes{v3.00}{2008/07/09}{Schalter setzt auch \cs{if@semitwoside}}^^A
% Einseitiger oder zweiseitiger Satzspiegel?
%    \begin{macrocode}
\newif\if@semitwoside
\g@addto@macro\@twosidetrue\@semitwosidefalse
\g@addto@macro\@twosidefalse\@semitwosidefalse
%</package>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%    \begin{macrocode}
\KOMA@key{twoside}[true]{%
%<class>  \if@atdocument\else\PassOptionsToPackage{twoside=#1}{typearea}\fi%
%<*package>
  \if@atdocument\if@twoside
      \scr@ifundefinedorrelax{cleardoubleoddpage}{%
        \cleardoublepage
      }{%
        \cleardoubleoddpage
      }%
  \else\clearpage\fi\fi
%</package>
  \ifstr{#1}{semi}{%
    \@twosidetrue
%<package>    \@semitwosidetrue
    \FamilyKeyStateProcessed
  }{%
    \def\FamilyElseValue{, `semi'}%
    \KOMA@set@ifkey{twoside}{%
%<package>      @twoside%
%<class>      @tempswa%
    }{#1}%
  }%
  \ifx\FamilyKeyState\FamilyKeyStateProcessed
%<*class>
    \expandafter\ifnum\scr@v@is@ge{3.17}%
%<*!letter>
      \if@tempswa\flushbottom
      \else\if@twocolumn\flushbottom\else\raggedbottom\fi\fi
%</!letter>
%<letter>    \raggedbottom
    \fi
%</class>
    \KOMA@kav@xreplacevalue{.%
%<class>      \KOMAClassFileName
%<package>      typearea.\scr@pkgextension
    }{twoside}{#1}%
%<*package>
    \if@twoside
      \if@semitwoside
        \@mparswitchfalse
      \else
        \@mparswitchtrue
      \fi
    \else
      \@mparswitchfalse
    \fi%
    \csname recalctypearea\endcsname
%</package>
  \fi
}
%<*class>
%<book>\KOMAExecuteOptions{twoside=true}
%<!book>\KOMAExecuteOptions{twoside=false}
%</class>
%<*package>
\KOMA@kav@xadd{.typearea.\scr@pkgextension}{twoside}{%
  \if@twoside true\else false\fi
}
%</package>
\KOMA@DeclareStandardOption%
%<package>  [typearea]%
  {oneside}{twoside=false}
%<*package>
%    \end{macrocode}
% \end{option}
% \end{option}
%
% \begin{option}{onecolumn}
%   \changes{v2.95}{2002/12/04}{Option in das \textsf{typearea}-Paket
%     verlagert}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v2.97e}{2007/11/23}{auf vielfachen Wunsch reicht die Klasse die
%     Option an das Paket weiter}^^A
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{twocolumn}
%   \changes{v2.95}{2002/12/04}{Option in das \textsf{typearea}-Paket
%     verlagert}
%   \changes{v2.97e}{2007/11/23}{auf vielfachen Wunsch reicht die Klasse die
%     Option an das Paket weiter}^^A
%   \changes{v2.98a}{2007/01/08}{es wird die richtige Option an das Paket
%     weitergereicht}^^A
%   \changes{v3.12}{2013/03/05}{Verwendung der Status-Signalisierung mit
%     \cs{FamilyKeyState}}
%   \changes{v3.13a}{2014/04/09}{Signallisierung korrigiert}^^A
% Einspaltiger oder zweispaltiger Satz?
%    \begin{macrocode}
%</package>
\KOMA@key{twocolumn}[true]{%
%<class>  \if@atdocument\else\PassOptionsToPackage{twocolumn=#1}{typearea}\fi%
%<*package>
  \if@atdocument\clearpage\fi
%</package>
  \KOMA@set@ifkey{twocolumn}{@twocolumn}{#1}%
  \ifx\FamilyKeyState\FamilyKeyStateProcessed
    \KOMA@kav@replacebool{.%
%<class>      \KOMAClassFileName
%<package>      typearea.\scr@pkgextension
    }{twocolumn}{@twocolumn}%
%<package>    \csname recalctypearea\endcsname
%<*class>
    \expandafter\ifnum\scr@v@is@ge{3.17}%
      \if@twocolumn\twocolumn\sloppy\flushbottom
      \else\onecolumn\if@twoside\flushbottom\else\raggedbottom\fi\fi
    \fi
%</class>
  \fi
}
%<*class>
\AtEndOfClass{%
  \expandafter\ifnum\scr@v@is@lt{3.17}%
%<*!letter>
    \if@twocolumn\twocolumn\sloppy\flushbottom
    \else\onecolumn\if@twoside\flushbottom\else\raggedbottom\fi\fi
%</!letter>
%<letter>    \raggedbottom
  \fi
}
\KOMAExecuteOptions{twocolumn=false}
%</class>
%<*package>
\KOMA@kav@xadd{.typearea.\scr@pkgextension}{twocolumn}{%
  \if@twocolumn true\else false\fi
}
%</package>
\KOMA@DeclareStandardOption%
%<package>  [typearea]%
  {onecolumn}{twocolumn=false}
%    \end{macrocode}
% \end{option}
% \end{option}
%
%
% \subsubsection{Ausgabeformat-Optionen}
%
% Diese Optionen arbeiten in Abhänigkeit des Ausgabeformats.
%
% \begin{option}{pagesize}
%   \changes{v2.7g}{2001/04/17}{neue Option}^^A
%   \changes{v2.95}{2002/08/27}{neu implementiert}^^A
%   \changes{v3.02c}{2009/02/14}{neuer Wert \texttt{false}}^^A
%   \changes{v3.05a}{2010/03/18}{neuer Wert \texttt{dvipdfmx}}^^A
%   \changes{v3.12}{2013/03/05}{Verwendung der Status-Signalisierung mit
%     \cs{FamilyKeyState}}^^A
%   \changes{v3.17a}{2015/05/03}{Logik komplett neu geschrieben}^^A
% Diese Option ist nun das zentrale Element für die Übermittlung der
% Seitengröße an pdf\TeX, \texttt{dvips} oder V\TeX. Sie wird auch von
% den obsoleten Optionen verwendet. Die Werte und ihre Bedeutung:
% \begin{labeling}[~--]{\texttt{automedia}}
% \item[\texttt{auto}] Kombination aus den Optionen \texttt{pdftex}
%   und \texttt{dvips}.
% \item[\texttt{automedia}] wie \texttt{auto} allerdings werden
%   zusätzlich \cs{mediawidth} und \cs{mediaheight} gesetzt, falls
%   sie definiert sind.
% \item[\texttt{dvips}] das \cs{special} für \texttt{dvips} wird
%   ausgegeben, falls \texttt{dvi}-Ausgabe erwartet wird oder
%   \cs{if@dvips} erfüllt ist. Führt zu einer Warnung, wenn sie mehr
%   als einmal oder nach der Präambel verwendet wird.
% \item[\texttt{dvipdfmx}] das \cs{special} für \texttt{dvipdfmx} wird
%   ausgegeben, falls \texttt{dvi}-Ausgabe erwartet wird.
% \item[\texttt{false}] die automatische Anpassung bei Änderungen innerhalb
%   des Dokuments abschalten.
% \item[\texttt{pdftex}] \cs{pdfpagewidth} und \cs{pdfpageheight}
%   werden gesetzt, falls sie definiert sind.
% \end{labeling}
%    \begin{macrocode} 
%<*package>
\KOMA@key{pagesize}[auto]{%
  \KOMA@set@ncmdkey{pagesize}{@pagesizelast}{%
    {off}{-1},{no}{-1},{false}{-1},%
    {auto}{0},{automedia}{1},{dvips}{2},{pdftex}{3},{dvipdfmx}{4}%
  }{#1}%
  \ifx\FamilyKeyState\FamilyKeyStateProcessed
    \ifcase\number\@pagesizelast\relax
      \edef\@pagesizelast{auto}%
      \if@atdocument
        \set@pdftexpagesize
        \set@dvipspagesize
      \fi
    \or
      \edef\@pagesizelast{automedia}%
      \if@atdocument
        \set@pdftextpagesize
        \set@vtexpagesize
        \set@dvipspagesize
      \fi
    \or
      \edef\@pagesizelast{dvips}%
      \if@atdocument
        \set@dvipspagesize
      \fi
    \or
      \edef\@pagesizelast{pdftex}%
      \if@atdocument
        \set@pdftexpagesize
      \fi
    \or
      \edef\@pagesizelast{dvipdfmx}%
      \if@atdocument
        \set@dvipdfmxpagesize
      \fi
    \else
      \edef\@pagesizelast{false}%
    \fi
    \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}%
                           {pagesize}{\@pagesizelast}%
  \fi
}
%    \end{macrocode}
% \begin{macro}{\@pagesizelast}
% Das interne Makro speichert die aktuelle Einstellung von \texttt{pagesize}
% und wird nicht nur für das neu Setzen derselben in Option \texttt{paper},
% sondern auch für die Parametereinstellung innerhalb von
% \texttt{\cs{begin}\{document\}}.
%    \begin{macrocode}
\newcommand\@pagesizelast{auto}
\AtBeginDocument{%
  \KOMAExecuteOptions[.typearea.\scr@pkgextension]{pagesize=\@pagesizelast}%
%    \end{macrocode}
% \end{macro}^^A \@pagesizelast
%
% \begin{macro}{\set@pdftexpagesize}
%   \changes{v2.95}{2002/08/27}{neu (intern)}^^A
% \begin{macro}{\set@dvipspagesize}
%   \changes{v2.95}{2002/08/27}{neu (intern)}^^A
%   \changes{v3.02c}{2009/02/13}{\texttt{seascape} wird beachtet}
%   \changes{v3.02c}{2009/02/14}{funktioniert auch im Dokument}^^A
%   \changes{v3.12}{2012/02/06}{nicht ausgeführtes
%     \cs{let}\cs{if@tempswa}\cs{if@dvips} funktioniert auch noch, wenn
%     letzteres nicht definiert ist}
% \begin{macro}{\setnot@dvipspagesize}
%   \changes{v2.95}{2002/08/27}{neu (intern)}^^A
% \begin{macro}{\set@dvipdfmxpagesize}
%   \changes{v3.05a}{2010/03/18}{neu (intern)}^^A
% \begin{macro}{\set@vtexpagesize}
%   \changes{v2.95}{2002/08/27}{neu (intern)}^^A
% \begin{macro}{\scr@updatedvipspagesize}
%   \changes{v3.02c}{2009/02/14}{neu (intern)}^^A
%   \changes{v3.12}{2013/05/10}{deaktiviert, wenn \cs{XeTeXversion} existiert}
% Damit die Option \texttt{pagesize} überhaupt funktionieren kann,
% werden einige interne Makros benötigt.
% \begin{description}
% \item{Achtung:} die Definition dieser Makros ändert sich teilweise
%   bei ihrem Aufruf und insgesamt bei
%   \texttt{\cs{begin}\{document\}}.
% \end{description}
% Hier zunächst ihre ggf. geänderte Definition nach
% \texttt{\cs{begin}\{document\}}:
%    \begin{macrocode}
  \expandafter\ifnum\scr@ta@v@is@gt{3.02b}\relax
    \renewcommand*{\set@dvipspagesize}{%
%    \end{macrocode}
% \changes{v3.12}{2012/11/23}{nur im DVI- und PS-Fall das Papierformatupdate
%   durchführen}^^A
% \changes{v3.12}{2012/02/06}{nicht ausgeführtes 
%   \cs{let}\cs{if@tempswa}\cs{if@dvips} funktioniert auch noch, wenn
%   letzteres nicht definiert ist}
% Es wird getestet, ob unspezfizierte DVI-Ausgabe oder spezifizierte
% PS-Ausgabe verwendet wird.  Nur in diesen Fällen wird der PS-Code für das
% Papierformatupdate eingefügt.
%    \begin{macrocode}
      \begingroup
        \@tempswafalse
        \scr@ifdvioutput{\@tempswatrue}{%
          \ifnotundefined{if@dvips}{%
            \expandafter\let\csname if@tempswa\expandafter\endcsname
            \csname if@dvips\endcsname
          }{}%
        }%
        \if@tempswa
          \endgroup
          \scr@ifundefinedorrelax{AtNextShipout}{%
            \scr@ifundefinedorrelax{AtBeginShipoutNext}{%
              \begingroup
                \protected@edef\reserved@a{\endgroup
                  \scr@updatedvipspagesize}%
              \reserved@a
            }{%
%    \end{macrocode}
% Wenn \textsf{atbegshi} geladen wurde, bzw. \cs{AtBeginShipoutNext} zur
% Verfügung steht, dann soll dieser Code noch vor Code ausgeführt werden, der
% eventuell in \cs{shipout} eingeschleust wurde. Das funktioniert leider nicht
% wirklich zuverlässig. Sollte zwischen dem Aufruf von \cs{set@dvipspagesize}
% (also der Neuberechnung des Satzspiegels) und der Ausgabe der Seite doch
% noch etwas per \cs{AtBeginShipout} oder \cs{AtBeginShipoutNext} eingefügt
% werden, dann gehen diese Teile verloren!
%    \begin{macrocode}
              \begingroup
                \protected@edef\reserved@a{\endgroup
                  \protect\AtBeginShipoutNext{%
                    \protect\bgroup
                    \protect\global\protect\setbox\AtBeginShipoutBox
                    \protect\vbox{%
                      \scr@updatedvipspagesize
                      \protect\box\AtBeginShipoutBox
                    }%
                    \protect\egroup
                  }}%
              \reserved@a
            }%
          }{%
%    \end{macrocode}
% Wenn \textsf{everyshi} geladen wurde, bzw. \cs{AtNextShipout} zur
% Verfügung steht, dann soll dieser Code noch vor Code ausgeführt werden, der
% eventuell in \cs{shipout} eingeschleust wurde. Das funktioniert leider nicht
% wirklich zuverlässig. Sollte zwischen dem Aufruf von \cs{set@dvipspagesize}
% (also der Neuberechnung des Satzspiegels) und der Ausgabe der Seite doch
% noch etwas per \cs{AtNextShipout} oder \cs{EveryShipout} eingefügt
% werden, dann gehen diese Teile verloren!
%    \begin{macrocode}
            \begingroup
              \protected@edef\reserved@a{\endgroup
                \protect\AtNextShipout{%
                  \protect\bgroup
                  \protect\global\protect\setbox\protect\@cclv\protect\vbox{%
                    \scr@updatedvipspagesize
                    \protect\box\protect\@cclv
                  }%
                  \protect\egroup
                }}%
            \reserved@a
          }%
        \else
%    \end{macrocode}
% In diesem Fall (nämlich weder DVI- noch PS-Ausgabe) muss nur die Gruppe, die
% eingefügt wurde, um die Änderung von \cs{if@tempswa} lokal zu halten,
% geschlossen werden.
%    \begin{macrocode}
          \endgroup
        \fi
    }%
  \else
    \let\set@dvipspagesize=\setnot@dvipspagesize
  \fi
  \renewcommand*{\set@dvipdfmxpagesize}{%
    \scr@ifdvioutput{%
      \special{papersize=\the\paperwidth,\the\paperheight}%
    }{}%
  }%
}
%    \end{macrocode}
% Und jetzt die Definitionen bevor \texttt{\cs{begin}\{document\}}, die
% allerdings erst innerhalb von \texttt{\cs{begin}\{document\}} das erste Mal
% ausgeführt werden:
%    \begin{macrocode}
\newcommand{\set@pdftexpagesize}{%
  \ifnotundefined{pdfpagewidth}{\pdfpagewidth=\paperwidth}{}%
  \ifnotundefined{pdfpageheight}{\pdfpageheight=\paperheight}{}%
}
\newcommand{\set@dvipspagesize}{%
  \begingroup
    \@tempswafalse
    \scr@ifdvioutput{\@tempswatrue}{%
      \ifnotundefined{if@dvips}{%
        \expandafter\let\csname if@tempswa\expandafter\endcsname
        \csname if@dvips\endcsname
      }{}%
    }%
    \if@tempswa
      \endgroup
      \AtBeginDvi{%
        \special{papersize=\the\paperwidth,\the\paperheight}%
        \if@seascape\special{! TeXDict begin /landplus90{true}store end }\fi
      }%
      \expandafter\ifnum\scr@ta@v@is@gt{3.02b}\relax
        \let\set@dvipspagesize=\@empty
      \else
        \let\set@dvipspagesize=\setnot@dvipspagesize
      \fi
    \else
    \endgroup
  \fi
}
\newcommand{\setnot@dvipspagesize}{%
  \scr@ifdvioutput{%
    \PackageWarning{%
      typearea%
    }{%
      With dvi output option `pagesize=auto',\MessageBreak
      `pagesize=automedia' or `pagesize=dvips'\MessageBreak
      may be used only once at preamble.\MessageBreak
      Option ignored%
    }%
  }{}%
}
\newcommand*{\set@dvipdfmxpagesize}{%
  \scr@ifdvioutput{%
    \AtBeginDvi{%
      \special{papersize=\the\paperwidth,\the\paperheight}%
    }%
  }{}%
}
\newcommand{\set@vtexpagesize}{%
  \ifnotundefined{mediawith}{\mediawidth=\paperwidth}{}%
  \ifnotundefined{mediaheight}{\mediaheight=\paperheight}{}%
}
\newcommand*{\scr@updatedvipspagesize}{%
  \scr@ifundefinedorrelax{XeTeXversion}{%
    \special{ps::\@percentchar\@percentchar 
      PageBoundingBox: 0 0 \the\numexpr\paperwidth/\dimexpr 1bp\relax\relax
      \space \the\numexpr\paperheight/\dimexpr 1bp\relax\relax^^J%
      \@percentchar\@percentchar BeginPageSetup^^J%
      << /PageSize [\the\numexpr\paperwidth/\dimexpr 1bp\relax\relax\space
      \the\numexpr\paperheight/\dimexpr 1bp\relax\relax] 
      >> setpagedevice^^J%<<
      0 0 bop^^J%
      \@percentchar\@percentchar EndPageSetup}%
  }{}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{option}
%
%
% \begin{option}{dvips}
%   \changes{v2.7g}{2001/04/17}{neue Option}^^A
%   \changes{v2.95}{2002/08/27}{neu implementiert}^^A
%   \changes{v2.98c}{2008/04/09}{Ersatz geändert}^^A
%   \changes{v2.98c}{2008/04/09}{Info statt Warnung}^^A
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% Die Option ist obsolete und wird nun über die Option
% \texttt{pagesize} implementiert. Obwohl die Verwendung von
% \texttt{pagesize=automedia} zu einer Warnung führen kann, wird hier nur
% informiert.
%    \begin{macrocode}
\KOMA@DeclareStandardOption[typearea]{dvips}{%
  pagesize=automedia%
}
%    \end{macrocode}
% \end{option}
%
% \begin{option}{pdftex}
%   \changes{v2.7g}{2001/04/17}{neue Option}^^A
%   \changes{v2.95}{2002/08/27}{neu implementiert}^^A
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% Die Option ist obsolete und wird nun über die Option
% \texttt{pagesize} implementiert.
%    \begin{macrocode}
\KOMA@DeclareStandardOption[typearea]{pdftex}{%
  pagesize=pdftex%
}
%    \end{macrocode}
% \end{option}
%
%
% \subsubsection{Papiergrößen-Optionen}
%
% Die folgende Option bestimmt die Papiergröße und -ausrichtung. Aus
% der Papiergröße wird später mit \cs{typearea} der Satzspiegel
% berechnet. Darüber hinaus wäre das eine passende Gelegenheit
% \cs{SetDIVList} anzuwenden, darauf wird aber verzichtet, da die
% Verwendung der Liste ohnehin als veraltete Methode betrachtet werden
% kann.
%
% \begin{option}{a4paper}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{a5paper}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{b5paper}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{letterpaper}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{legalpaper}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{executivepaper}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{landscape}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% \begin{option}{portrait}
%   \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} durch \cs{PackageInfoNoLine}
%     ersetzt}
%   \changes{v3.01a}{2008/11/21}{standard statt obsolet}^^A
% Die Formate, die auch bei den Standardklassen definiert sind, werden
% als Sonderfall explizit definiert. Dadurch ist ein Wechsel der
% Klasse bzw. die Verwendung von \textsf{typearea} mit den
% Standardklassen einfacher. Aus Kompatibilitätsgründen werden auch
% die übrigen Papiergrößenoptionen später noch per Mustererkennung
% verarbeitet.
%    \begin{macrocode}
\KOMA@DeclareStandardOption[typearea]{a4paper}{paper=a4}
\KOMA@DeclareStandardOption[typearea]{a5paper}{paper=a5}
\KOMA@DeclareStandardOption[typearea]{b5paper}{paper=b5}
\KOMA@DeclareStandardOption[typearea]{letterpaper}{paper=letter}
\KOMA@DeclareStandardOption[typearea]{legalpaper}{paper=legal}
\KOMA@DeclareStandardOption[typearea]{executivepaper}{paper=executive}
\KOMA@DeclareStandardOption[typearea]{landscape}{paper=landscape}
\KOMA@DeclareStandardOption[typearea]{portrait}{paper=portrait}
%    \end{macrocode}
% \end{option}
% \end{option}
% \end{option}
% \end{option}
% \end{option}
% \end{option}
% \end{option}
% \end{option}
%
% \begin{option}{paper}
%   \changes{v2.95}{2002/12/03}{neu implementiert}^^A
%   \changes{v3.01b}{2008/12/09}{Höhe und Breite vertauscht}^^A
%   \changes{v3.02c}{2009/02/12}{neuer Wert \texttt{seascape}}
%   \changes{v3.12}{2013/03/05}{Verwendung der Status-Signalisierung mit
%     \cs{FamilyKeyState}}
% Im Normalfall wird die Papiergröße jedoch über diese Option
% gesetzt. Dabei sind neben den Standard- und den ISO-Reihen A, B, C
% und D auch Wertepaare der Form
% "`\texttt{(\meta{Breite},\meta{Höhe})}"' und die Angaben
% "`\texttt{portrait}"' und "`\texttt{landscape}"' erlaubt.
%    \begin{macrocode}
\KOMA@key{paper}{%
  \ifstr{#1}{seascape}{%
    \@seascapetrue
    \if@landscape\else
      \setlength{\@tempdima}{\paperwidth}%
      \setlength{\paperwidth}{\paperheight}%
      \setlength{\paperheight}{\@tempdima}%
      \@landscapetrue
    \fi
    \FamilyKeyStateProcessed
  }{%      
    \ifstr{#1}{landscape}{%
      \@seascapefalse
      \if@landscape\else
        \setlength{\@tempdima}{\paperwidth}%
        \setlength{\paperwidth}{\paperheight}%
        \setlength{\paperheight}{\@tempdima}%
        \@landscapetrue
      \fi
      \FamilyKeyStateProcessed
    }{%
      \ifstr{#1}{portrait}{%
        \if@landscape
          \setlength{\@tempdima}{\paperwidth}%
          \setlength{\paperwidth}{\paperheight}%
          \setlength{\paperheight}{\@tempdima}%
          \@landscapefalse
        \fi
        \FamilyKeyStateProcessed
      }{%
        \ifstr{#1}{letter}{%
          \if@landscape
            \setlength\paperheight{8.5in}%
            \setlength\paperwidth {11in}%
          \else
            \setlength\paperheight{11in}%
            \setlength\paperwidth {8.5in}%
          \fi
          \FamilyKeyStateProcessed
          \KOMA@kav@removekey{.typearea.\scr@pkgextension}{paper}%
          \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{letter}%
        }{%
          \ifstr{#1}{legal}{%
            \if@landscape
              \setlength\paperheight{8.5in}%
              \setlength\paperwidth {14in}%
            \else
              \setlength\paperheight{14in}%
              \setlength\paperwidth {8.5in}%
            \fi
            \FamilyKeyStateProcessed
            \KOMA@kav@removekey{.typearea.\scr@pkgextension}{paper}%
            \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{legal}%
          }{%
            \ifstr{#1}{executive}{%
              \if@landscape
                \setlength\paperheight{7.25in}%
                \setlength\paperwidth {10.5in}%
              \else
                \setlength\paperheight{10.5in}%
                \setlength\paperwidth {7.25in}%
             \fi
             \FamilyKeyStateProcessed
             \KOMA@kav@removekey{.typearea.\scr@pkgextension}{paper}%
             \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{executive}%
            }{%
              \iso@paper{#1}%
              \if@tempswa
                \FamilyKeyStateProcessed
                \KOMA@kav@removekey{.typearea.\scr@pkgextension}{paper}%
                \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{#1}%
              \else
                \expandafter\maybe@pair#1::\@nil
                \if@tempswa
                  \expandafter\ifnum \scr@ta@v@is@lt{3.01b}\relax
                    \PackageWarningNoLine{typearea}{%
                      You may have to exchange height and width!\MessageBreak
                      Until KOMA-Script version 3.01b the semantic\MessageBreak
                      of option `paper' was `paper=height:width'\MessageBreak
                      instead of `paper=width:height'.\MessageBreak
                      I've switched back to that old interpretation\MessageBreak
                      because of the given compatiblity settings}%
                    \setlength\paperheight{\@tempa}%
                    \setlength\paperwidth{\@tempb}%
                  \else
                    \setlength\paperwidth{\@tempa}%
                    \setlength\paperheight{\@tempb}%
                  \fi
                  \FamilyKeyStateProcessed
                  \KOMA@kav@removekey{.typearea.\scr@pkgextension}{paper}%
                  \if@landscape
                    \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{\@tempa:\@tempb}%
                  \else
                    \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{\@tempb:\@tempa}%
                  \fi
               \else
                  \KOMA@unknown@keyval{paper}{#1}{%
                    `letter', `legal', `executive', `a'<nr>, `b'<nr>,
                    `c'<nr>, `d'<nr>,\MessageBreak
                    <width>`:'<height>, `landscape' and `portrait'%
                  }%
                \fi
              \fi
            }%
          }%
        }%
        \ifx\FamilyKeyState\FamilyKeyStateProcessed
          \if@landscape
            \if@seascape
              \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{seascape}%
            \else
              \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{landscape}%
            \fi
          \else
            \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{portrait}%
          \fi
        \fi
      }%
    }%
  }%
}
%    \end{macrocode}
% \begin{macro}{\if@seascape}
%   \changes{v3.02c}{2009/02/12}{neu}^^A
% \begin{macro}{\@seascapetrue}
%   \changes{v3.02c}{2009/02/12}{neu}^^A
% \begin{macro}{\@seascapefalse}
%   \changes{v3.02c}{2009/02/12}{neu}^^A
% In diesem Schalter wird nur gespeichert, ob Breitformat ggf. umgekehrt
% verwendet werden soll. Dies macht derzeit nur bei Verwendung von dvips einen
% Unterschied!
%    \begin{macrocode}
\newif\if@seascape
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\if@landscape}
% \begin{macro}{\@landscapetrue}
% \begin{macro}{\@landscapefalse}
% In diesem Schalter wird gespeichert, ob Hoch- oder Breitformat
% verwendet wird.
%    \begin{macrocode}
\newif\if@landscape
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\maybe@pair}
%   \changes{v2.95}{2002/12/03}{neu (intern)}^^A
%   \changes{v2.97e}{2007/11/26}{funktioniert zum ersten Mal}^^A
% Testet, ob der nachfolgende Parameter die Form
% "`\meta{erstes Argument}:\meta{zweites Argument}"' hat.
% Wenn ja, wird \cs{@tempa} mit dem ersten und \cs{@tempb} mit dem
% zweiten Argument definiert.
%    \begin{macrocode}
\newcommand*{\maybe@pair}{}
\def\maybe@pair#1:#2:#3\@nil{%
  \edef\@tempa{#1}\edef\@tempb{#2}%
  \ifx\@tempa\@empty\@tempswafalse\else
    \ifx\@tempb\@empty\@tempswafalse\else\@tempswatrue\fi
  \fi
}
%    \end{macrocode}
% \end{macro}
% \end{option}
%
% \subsubsection{\textsf{geometry} Berücksichtigung]}
%
% \begin{option}{usegeometry}
%   \changes{v3.17}{2015/02/07}{neue Option}^^A
% Mit dieser Option kann eingestellt werden, dass \cs{activateareas} die
% Einstellungen außerdem an das Paket \textsf{geometry} übergeben soll.
%    \begin{macrocode}
\KOMA@ifkey{usegeometry}{@ta@usegeometry}
%    \end{macrocode}
% \end{option}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
%
% \subsubsection{Geparste Optionen}
%
% Die Behandlung für \texttt{BCOR\emph{Wert}}, \texttt{DIV\emph{Wert}} und
% \texttt{a\emph{Wert}paper}, \texttt{b\emph{Wert}paper},
% \texttt{c\emph{Wert}paper} sowie \texttt{d\emph{Wert}paper} und
% \texttt{\emph{Wert}headlines}.
% \changes{v2.97c}{2007/09/12}{\cs{lco@test} bei den geparsten Optionen
%   eingefügt}
%    \begin{macrocode}
\DeclareOption*{%
%<letter>  \lco@test
  \x@paper}
%    \end{macrocode}
%
% \iffalse
% Der Rest gehört nicht mehr zu den Optionen.
%</option>
%<*body>
%<*package>
% \fi
%
%
% \subsubsection{Konfigurationsdatei}
%
% \changes{v2.0e}{1994/10/28}{Konfigurationsdatei
%   \texttt{typearea.cfg} zur Definition weiterer Optionen
%   bzw. Papiergrößen}
% Es ist möglich in einer Datei \texttt{typearea.cfg} z.\,B. weitere
% Optionen zu definieren, die dann automatisch eingeladen werden.
%    \begin{macrocode}
\InputIfFileExists{typearea.cfg}{%
  \typeout{%
    ***************************************^^J%
    * Local config file typearea.cfg used^^J%
    ***************************************%
  }
}{}
%    \end{macrocode}
%
%
% \subsubsection{Standardoptionen}
%
% Als Standardoptionen sind \texttt{headinclude=false},
% \texttt{footinclude=false} und die Papiergröße \texttt{paper=A4}
% eingestellt. Diese Optionen können selbstverständlich durch
% explizite Angaben überladen werden.
% \changes{v2.3h}{1995/01/19}{\cs{relax} nach \cs{ProcessOptions}
%   ergänzt.}^^A
% \changes{v2.96}{2006/08/18}{Optionen werden in Reihenfolge der Angabe statt
%   in Reihenfolge der Deklaration abgearbeitet.}^^A
% \changes{v2.97c}{2007/04/19}{Verwendung von \cs{KOMAExecuteOptions} an
%   Stelle von \cs{KOMAoptions} und \cs{KOMAProcessOptions} an Stelle von
%   \cs{ProcessOptions}}^^A
% \changes{v2.97c}{2007/04/19}{Optionen, die der Voreinstellung ohnehin
%   entsprechen, werden nicht explizit gesetzt}^^A
% \changes{v2.97c}{2007/07/18}{Option \texttt{twoside} wird explizit passend
%   gesetzt}^^A
% \changes{v3.12}{2013/11/11}{die voreingestellte Papiergröße kann via
%   \cs{defaultpagesize} auch in \texttt{typearea.cfg} verändert werden}^^A
% \changes{v3.17}{2015/03/02}{Defaulteinstellung \texttt{pagesize}}^^A
% \begin{macro}{\defaultpapersize}
%   \changes{v3.12}{2013/11/11}{Neue Anweisung}^^A
%    \begin{macrocode}
\providecommand*{\defaultpapersize}{A4}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\KOMAExecuteOptions{paper=\defaultpapersize,pagesize}
\if@twoside
  \if@semitwoside
    \KOMAExecuteOptions{twoside=semi}
  \else
    \KOMAExecuteOptions{twoside}
  \fi
\else
  \KOMAExecuteOptions{twoside=false}
\fi
\KOMAProcessOptions\relax
%    \end{macrocode}
%
%
% \subsection{Schriftgrößenabhängige Voreinstellungen für \emph{DIV}}
%
% \begin{macro}{\ta@divlist}
%   \changes{v2.0e}{1994/10/28}{neu (intern)}^^A
%   \changes{v2.6}{2000/01/04}{die Liste umfasst nun Werte ab 1\,pt
%      statt ab 10\,pt.}^^A
% \begin{macro}{\ta@divlistelse}
%   \changes{v2.6}{2000/01/04}{neu (intern)}^^A
% An dieser Stelle muss noch für die Standardeinstellung der
% \textit{DIV}-Liste gesorgt werden, falls eine solche noch nicht
% definiert wurde.
%    \begin{macrocode}
\providecommand\ta@divlist{{}{}{}{}{}{}{}{}{}{8}{10}{12}}
%    \end{macrocode}
% \end{macro}
% Wenn kein Defaultwert definiert ist, wird dieser Wert verwendet:
%    \begin{macrocode}
\providecommand\ta@divlistelse{1}
%    \end{macrocode}
% \end{macro}
%
%
% Das waren die Optionen für das Paket oder im ersten Durchlauf der
% Klassen.
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
%
% \subsection{Laden des Pakets}
%
% Das Folgende wird nur in einem zweiten Durchlauf in die Klassen
% eingefügt und sorgt für das Laden des \textsf{typearea} Pakets.
%    \begin{macrocode}
%<*class>
%    \end{macrocode}
% Vor dem Laden müssen noch diverse Makros zurückgesetzt werden, damit
% sie überhaupt in \textsf{typearea} definiert werden können:
%    \begin{macrocode}
\let\@BCOR                =\relax
\let\@@BCOR               =\relax
\let\@DIV                 =\relax
\let\@@DIV                =\relax
\let\@headlines           =\relax
\let\@@headlines          =\relax
\let\x@paper              =\relax
\let\x@@paper             =\relax
\let\scr@pti@nerr@r       =\relax
%    \end{macrocode}
% Jetzt kann geladen werden:
% \changes{v2.95}{2002/06/22}{Beim Laden von \textsf{typearea} wird
%   \cs{KOMAScriptVersion} verwendet}
% Die Überprüfung auf die korrekte \KOMAScript-Version geschieht in
% dem Paket (siehe dazu \texttt{scrkernel-version.dtx}).
%    \begin{macrocode}
\RequirePackage{typearea}[\KOMAScriptVersion]
%    \end{macrocode}
% Auf diese Art ist sichergestellt, dass immer die Version von
% \textsf{typearea} verlangt wird, die zur gleichen Release wie 
% die Klassen gehört. Wobei die Warnungen je nach Zusammentreffen der
% Versionen unterschiedlich ausfallen können.
%
% Für die Kompatibilität mit den Standardklassen muss jetzt ggf. noch der
% Seitenspiegel angepasst werden. Dies geschieht aber nur, wenn ein
% vordefinierter Wert verwendet wurde:
%    \begin{macrocode}
%<*!letter>
\if@scr@emulatestandardclasses
  \ifnum\@lastdiv=\z@
    \setlength{\textwidth}{\dimexpr \paperwidth-2in\relax}
    \ifdim \f@size\p@<10.5\p@
        \setlength{\@tempdimb}{345\p@}
    \else\ifdim \f@size\p@<11.5\p@
        \setlength{\@tempdimb}{360\p@}
      \else
        \setlength{\@tempdimb}{390\p@}
      \fi
    \fi
    \if@twocolumn
      \ifdim\@textwidth>2\@tempdimb\relax
        \setlength{\textwidth}{2\@tempdimb}
      \fi
    \else
      \ifdim\textwidth>\@tempdimb
        \setlength{\textwidth}{\@tempdimb}
      \fi
    \fi
    \@settopoint\textwidth
    \setlength{\@tempdima}{\dimexpr \paperheight-3.5in\relax}
    \divide\@tempdima\baselineskip
    \@tempcnta=\@tempdima
    \setlength{\textheight}{\@tempcnta\baselineskip}
    \addtolength{\textheight}{\topskip}
    \edef\reserved@a{%
      \noexpand\@areasetadvancedtrue
      \noexpand\areaset[current]{\noexpand\textwidth}{\noexpand\textheight}%
      \if@areasetadvanced\else\noexpand\@areasetadvancedfalse\fi
    }\reserved@a
  \fi
\fi
%</!letter>
%    \end{macrocode}
%
%    \begin{macrocode}
%</class>
%    \end{macrocode}
%
%
% Ab hier ist alles nur noch für das Paket.
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% \subsection{Einige interne Register}
%
% \begin{Length}{\ta@hblk}
% \begin{Length}{\ta@vblk}
% \begin{Length}{\ta@temp}
% Diese Größsenparameter und werden intern für verschiedene Befehle
% benötigt. (Die Zähler \cs{ta@bcor} und \cs{ta@div} werden bereits
% bei der Optionenauswertung benötigt und sind deshalb vorgezogen.)
%    \begin{macrocode}
\newlength{\ta@hblk}
\newlength{\ta@vblk}
\newlength{\ta@temp}
%    \end{macrocode}
% \end{Length}
% \end{Length}
% \end{Length}
%
%
% \subsection{Die Berechnung des Satzspiegels}
%
% \begin{macro}{\typearea}
% Die Berechnung des Satzspiegels, wie sie in der Anleitung
% beschrieben ist, findet mit Hilfe des Befehls \cs{typearea} statt,
% der hier definiert wird. Die Berechnung selbst benötigt mehreren
% Stufen.
%
% \begin{macro}{\@typearea}
%   \changes{v2.4n}{1997/05/28}{eigentliche Satzspiegelberechnung in
%      \cs{@typearea} ausgegliedert}
%   \changes{v2.95}{2002/08/20}{\cs{selectfont} eingefügt}
% Die eigentliche Satzspiegelberechnung geschieht über das Hilfsmakro
% \cs{@typearea}, das dann auch von \cs{typearea} genutzt wird. Dieses
% Hilfsmakro benötigt keine Parameter, da diese bereits zuvor von
% \cs{typearea} in die entsprechenden Variablen geschrieben wurden.
%    \begin{macrocode}
\newcommand*\@typearea{%
%    \end{macrocode}
% Bevor irgend etwas anderes gemacht wird, sogen wir dafür, dass die
% gewählte Schrift auch gesetzt wird. Dies ist notwendig, falls jemand
% vor \cs{typearea} einen Befehl wie \cs{linespread} verwendet.
%    \begin{macrocode}
  \selectfont
%    \end{macrocode}
% Zunächst werden die horizontalen Maße berechnet. Dazu wird als
% erstes die Größe einer horizontalen Längeneinheit (\emph{HLE})
% ermittelt:
%    \begin{macrocode}
  \ta@hblk=\paperwidth
  \advance \ta@hblk by-\ta@bcor
  \divide\ta@hblk by\ta@div
%    \end{macrocode}
% Die Größe des Bereichs für die Randnotizen ist ebenfalls von der
% Streifenbreite abhängig.
%   \changes{v2.8q}{2002/03/28}{Textbreite berücksichtigt Option 
%      \texttt{mpinclude}}
%    \begin{macrocode}
  \if@mincl
    \marginparwidth=\ta@hblk
    \advance\marginparwidth by-\marginparsep
  \else
    \if@twoside
      \if@semitwoside
        \marginparwidth=\ta@hblk
      \else
        \marginparwidth=1.5\ta@hblk
      \fi
    \else
      \marginparwidth=\ta@hblk
    \fi
  \fi
%    \end{macrocode}
% Der linke und rechte Rand wird relativ zur benutzbaren Seitenbreite
% berechnet. Dabei muss auch der Rand berücksichtigt werden, der vom
% Druckertreiber standardmäßig hinzugefügt wird. Außerdem ist der
% Rand abhängig davon, ob es sich um ein einseitiges oder beidseitiges
% Layout handelt. Bei Option \texttt{mpinclude} sind im beidseitigen
% Satz zusätzlich die Randnotizen zu beachten.
%    \begin{macrocode}
  \oddsidemargin=-1in
  \evensidemargin=-1in
  \if@twoside
    \if@semitwoside
      \advance\oddsidemargin by1.5\ta@hblk
      \advance\oddsidemargin by\ta@bcor
%    \end{macrocode}
% \changes{v3.12}{2013/10/15}{use alternating \texttt{BCOR} with
%    \texttt{twoside!=semi}}
% Wenn \texttt{twoside=semi} verwendet wird, wird der Binderand ab
% \KOMAScript~3.12 dem inneren Rand zugeschlagen. Bei Kompatibilität zu
% älteren Versionen wird hingegen immer der linke Rand verwendet.
%    \begin{macrocode}
      \expandafter\ifnum\scr@ta@v@is@lt{3.12}\relax
        \evensidemargin=\oddsidemargin
      \else
        \advance\evensidemargin by1.5\ta@hblk
      \fi
    \else
      \advance\oddsidemargin by\ta@hblk
      \advance\oddsidemargin by\ta@bcor
      \advance\evensidemargin by2\ta@hblk
      \if@mincl
        \advance\evensidemargin by\marginparwidth
        \advance\evensidemargin by\marginparsep
      \fi
    \fi
  \else
    \advance\oddsidemargin by1.5\ta@hblk
    \advance\oddsidemargin by\ta@bcor
    \evensidemargin=\oddsidemargin
  \fi
%    \end{macrocode}
% Der Rest steht nun für den Textbereich zur Verfügung:
%    \begin{macrocode}
  \textwidth=\paperwidth
  \advance\textwidth by-\ta@bcor
  \advance\textwidth by-3\ta@hblk
%    \end{macrocode}
% Falls die Randnotizen für die Satzspiegelberechnung zum Textbereich
% gehören, müssen sie zusammen mit ihrem Abstand vom Text nun von
% diesem abgezogen werden. Es wird dabei davon ausgegangen, dass die
% Randnotizen immer außen gesetzt werden. Sollte der Textbereich für
% Randnotizen zu schmal sein, so wird der Bereich der Randnotizen so
% lange verkleinert, bis dies nicht mehr der Fall ist. Am einfachsten
% geht dies, indem gegebenfalls die Breiten vertauscht werden.
%    \begin{macrocode}
  \if@mincl
    \advance\textwidth by-\marginparwidth
    \advance\textwidth by-\marginparsep
    \ifdim\textwidth <\marginparwidth
      \PackageWarningNoLine{typearea}{%
        Width of text (\the\textwidth) less than width of\MessageBreak
        marginpar (\the\marginparwidth) while using option\MessageBreak
        `mpinclude'.\MessageBreak
        Because of this, I'm exchanging the values.\MessageBreak
        You should increase DIV to avoid such problems.\MessageBreak
      }%
      \@tempskipa=\marginparwidth
      \marginparwidth=\textwidth
      \textwidth=\@tempskipa
    \fi
  \fi
%    \end{macrocode}
% Danach folgen die vertikalen Maße. Auch dafür wird zunächst die Höhe
% eines Streifens benötigt.
%    \begin{macrocode}
  \ta@vblk=\paperheight
  \divide\ta@vblk by\ta@div
%    \end{macrocode}
% Davon ausgehend kann der obere Rand berechnet werden, wobei zu
% berücksichtigen ist, dass {\TeX} diesen selbständig um ein Inch
% vergrößert.
%    \begin{macrocode}
  \topmargin=-1in
  \advance\topmargin by\ta@vblk
%    \end{macrocode}
% Außerdem ist zu berücksichtigen, ob der Kopf zum Textbereich oder
% zum Rand gehört.
%    \begin{macrocode}
  \if@hincl \else
    \advance\topmargin by-\headheight
    \advance\topmargin by-\headsep
  \fi
%    \end{macrocode}
% Bei der Berechnung des Textbereichs sind von der Papierhöhe die
% Ränder abzuziehen und es ist ebenfalls zu berücksichtigen, ob Kopf-
% und Fuß zu den Rändern oder zum Textbereich selbst gezählt werden.
%    \begin{macrocode}
  \ta@temp=\paperheight
  \advance\ta@temp by-3\ta@vblk
  \if@hincl
    \advance\ta@temp by-\headheight
    \advance\ta@temp by-\headsep
  \fi
  \if@fincl
    \advance\ta@temp by-\footskip
  \fi
%    \end{macrocode}
% Als Sonderbedingung ist dann noch zu beachten, dass die Größse des
% Textbereichs nicht zu einer vertikalen Aufweitung führt.
%   \changes{v2.96}{2006/09/12}{\cs{topskip} wird gesetzt}
%   \changes{v2.97c}{2007/07/04}{\cs{maxdepth} wird gesetzt}
%    \begin{macrocode}
  \scr@ifundefinedorrelax{@ptsize}{%
    \topskip=\f@size\p@
  }{%
    \topskip=\@ptsize\p@
    \advance\topskip by 10\p@
  }%
  \maxdepth=.5\topskip
  \textheight=\topskip
  \@whiledim\textheight <\ta@temp
  \do{\advance\textheight by\baselineskip}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ta@modiv}
% Dieses Hilfsmakro wird weiter unten benötigt. Es dividiert den
% ersten  Parameter durch den zweiten und liefert das gerundete
% Ergebnis in \cs{ta@div} zurück. Für die Berechnung werden
% \cs{@tempdima} und \cs{@tempdimb} verwendet.
%    \begin{macrocode}
\newcommand*\ta@modiv[2]{
  \setlength{\@tempdima}{#1}
  \divide\@tempdima by#2
  \ta@div\@tempdima
  \ifnum \ta@div<4
    \ta@div=4
  \else
    \setlength{\@tempdimb}{#1}%
    \divide\@tempdimb by\ta@div
    \addtolength{\@tempdima}{\@tempdima}%
    \addtolength{\@tempdima}{-\@tempdimb}%
    \advance\ta@div by\@ne
    \setlength{\@tempdimb}{#1}%
    \divide\@tempdimb by\ta@div
%    \end{macrocode}
%   \changes{v2.5a}{1997/06/22}{\cs{ifdim} statt \cs{ifnum}}
%    \begin{macrocode}
    \ifdim \@tempdima<\@tempdimb
      \advance\ta@div by\m@ne
    \fi
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ta@temp@goodwidth}
% Dieses Makro setzt die Hilfdimension \cs{ta@temp} auf den Wert einer
% optimalen Zeilenbreite in der aktuellen Schrift. Voraussetzung für
% diese Berechnung ist, dass Zeilenbreiten von ca. 66 bis 72 Zeichen
% optimal sind. Zur Vereinfachung wird mit dem Mittelwert 69
% gerechnet. Eine solche Zeile besteht dann aus 66 durchschnittlichen
% Klein- und 3 durchschnittlichen Großbuchstaben.
%   \changes{v2.7i}{2001/05/17}{Berechnung ist robuster gegen
%      arithmetischen Überlauf bei sehr großen Schriften}  
%   \changes{v2.8q}{2002/03/06}{\cs{normalfont} \cs{normalsize} 
%      hinzugefügt}
%   \changes{v2.95a}{2006/07/20}{Berechnung für große Schriften korrigiert}^^A
%    \begin{macrocode}
\newcommand*\ta@temp@goodwidth{%
  \settowidth{\ta@temp}{\normalfont\normalsize 
    abcdefghijklmnopqrstuvwxyz}%
  \ifdim\ta@temp >200\p@
    \setlength{\ta@temp}{2.53846\ta@temp}%
    \settowidth{\@tempdima}{\normalfont\normalsize
      ABCDEFGHIJKLMNOPQRSTUVWXYZ}%
    \setlength{\@tempdima}{.11538\@tempdima}%
    \addtolength{\ta@temp}{\@tempdima}%
  \else
    \multiply\ta@temp by66
    \settowidth{\@tempdima}{\normalfont\normalsize
      ABCDEFGHIJKLMNOPQRSTUVWXYZ}%
    \multiply\@tempdima by3
    \addtolength{\ta@temp}{\@tempdima}%
    \divide\ta@temp by26
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AfterCalculatingTypearea}
%   \changes{v2.96a}{2006/11/29}{neu}^^A
% Neuerdings besteht die Möglichkeit, auf Benutzerebene das Verhalten von
% \cs{typearea} zu beeinflussen. In der Sternvariante wird dabei lokal
% gearbeitet.
%    \begin{macrocode}
\newcommand*{\AfterCalculatingTypearea}{%
  \@ifstar \l@addto@macro \g@addto@macro \@typearea@end
}
%    \end{macrocode}
% \begin{macro}{\@typearea@end}
%   \changes{v2.96a}{2006/11/29}{wird wieder immer aber mit neuer Bedeutung
%      definiert}^^A
% Das Makro \cs{@typearea@end} dient als Hook, um am Ende von \cs{typearea}
% noch irgendwelche Änderungen vornehmen zu können. Dies geschieht ggf. noch
% vor der Aktivierung der Einstellungen innerhalb eines Dokuments.
%    \begin{macrocode}
\newcommand*{\@typearea@end}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\AfterSettingArea}
%   \changes{v3.11}{2012/04/17}{new}^^A
% The user may influence the result of \cs{areaset}. The star version works
% local while the non-star version is global.
%    \begin{macrocode}
\newcommand*{\AfterSettingArea}{%
  \@ifstar \l@addto@macro \g@addto@macro \@areaset@end
}
%    \end{macrocode}
% \begin{macro}{\@areaset@end}
%   \changes{v3.11}{2012/04/17}{new}^^A
% Macro \cs{@areaset@end} is a hook to make it possible to add some
% instructions to the end of the \cs{areaset} command. This will be executed
% before the activation of the settings inside a document.
%    \begin{macrocode}
\newcommand*{\@areaset@end}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\activateareas}
%   \changes{v2.96a}{2006/11/29}{Neuer Name für alte Anweisung}^^A
%   \changes{v3.17}{2015/02/07}{Beachte Option \texttt{usegeometry}}^^A
% Dieses Makro wird verwendet, um mit einem gewaltigen Hack die Änderung des
% Satzspiegels innerhalb eines Dokuments zu ermöglichen. Es stellt selbst
% sicher, dass es nur innerhalb des Dokuments ausgeführt wird.
%    \begin{macrocode}
\newcommand*{\activateareas}{%
%    \end{macrocode}
% Als erstes wird getestet, ob wir überhaupt innerhalb des Dokuments sind und
% nur dann wird etwas getan.
%    \begin{macrocode}
  \if@atdocument
%    \end{macrocode}
% Wenn dem so ist,  wird jedoch eine Warnung ausgegeben, weil es wirklich sehr
% unsauber ist, so zu verfahren. Das ganze ist absolut abhängig von der
% \LaTeX-Version.
%    \begin{macrocode}
    \PackageWarning{typearea}{%
      Typearea changed!\MessageBreak
      You should do this only at preamble, because only\MessageBreak
      \protect\begin{document} calculates output dimensions!\MessageBreak
      Trying to calculate new output dimensions, but\MessageBreak
      this is only a dirty hack}%
%    \end{macrocode}
% Dann können endlich die Dimensionen, die z.\,B. von der Ausgaberoutine
% benötigt werden, neu berechnet werden.
%    \begin{macrocode}
    \@colht=\textheight
    \@colroom=\textheight 
    \vsize=\textheight
    \columnwidth=\textwidth
    \if@twocolumn
      \advance\columnwidth by-\columnsep
      \divide\columnwidth by\tw@ 
      \hsize=\columnwidth
      \@firstcolumntrue
    \fi
    \hsize=\columnwidth 
    \linewidth\hsize
    \scr@ifundefinedorrelax{@pagesizelast}{}{%
      \KOMAoptions{pagesize=\@pagesizelast}%
    }%
%    \end{macrocode}
% \changes{v3.17}{2015/03/18}{Anpassung der \texttt{parskip}-Einstellungen}^^A
% Ab Version~3.17 wird bei Änderung des Satzspiegels auch Absatzabstand,
% -Einzug und Endzeilenfreiraum angepasst. Dies geschieht hier, weil es erst
% nach \cs{begin{document}} notwendig ist. Zuvor erfolgt dies noch automatisch.
%    \begin{macrocode}
    \expandafter\ifnum\scr@ta@v@is@ge{3.17}%
      \csname par@updaterelative\endcsname
    \fi
  \fi
%    \end{macrocode}
% \changes{v3.17}{2015/02/07}{neuer Code für Option \texttt{usegeometry}}
%    \begin{macrocode}
  \edef\scr@geometryargs{%
    bindingoffset=\the\ta@bcor,
    lmargin=\the\dimexpr 1in+\oddsidemargin-\ta@bcor\relax,
    textwidth=\the\textwidth,
    \if@hincl
      includehead,%
      top=\the\dimexpr 1in+\topmargin\relax,
    \else
      includehead=false,%
      top=\the\dimexpr 1in+\topmargin+\headheight+\headsep\relax,
    \fi
    headheight=\the\headheight,
    headsep=\the\headsep,
    textheight=\the\textheight,
    \if@fincl
      includefoot,
    \else
      includefoot=false,
    \fi
    footskip=\the\footskip,
    \if@mincl
      includemp,
    \else
      includemp=false,
    \fi
    marginparwidth=\the\marginparwidth,
    marginparsep=\the\marginparsep
  }%
  \if@ta@usegeometry
    \@ifundefined{Gm@save}{%
      \if@atdocument\else
        \edef\scr@geometryargs{%
          paperwidth=\the\paperwidth,paperheight=\the\paperheight,%
          \scr@geometryargs
        }%
        \PassOptionsToPackage{\scr@geometryargs}{geometry}%
      \fi
    }{%
      \edef\Gm@restore@org{\Gm@restore}%
      \if@atdocument
        \expandafter\newgeometry\expandafter{\scr@geometryargs}%
      \else
        \edef\scr@geometryargs{%
          paperwidth=\the\paperwidth,paperheight=\the\paperheight,%
          \scr@geometryargs
        }%
        \expandafter\geometry\expandafter{\scr@geometryargs}%
      \fi
    }%
  \fi
}
%    \end{macrocode}
% \begin{macro}{scr@geometryargs}
%   \changes{v3.16}{2015/02/07}{neu (intern)}^^A
% Dieses Makro nimmt innerhalb von \cs{activateareas} die Optionen für
% \textsf{geometry} auf. Initialisiert wird es einfach leer.
%    \begin{macrocode}
\newcommand*{\scr@geometryargs}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\storeareas}
%   \changes{v3.10}{2011/09/13}{neue Anweisung}%
%   Die aktuellen Einstellungen können in einem Makro gespeichert
%   werden. Dieses Makro kann anschließend genutzt werden, um die
%   Einstellungen wieder her zu stellen.
% \begin{macro}{\scr@grouplevel@test}
%   \changes{v3.10}{2011/09/13}{neu (intern)}^^A
%    \begin{macrocode}
\newcommand*{\scr@grouplevel@test}[1]{%
  \ifcase\currentgrouptype\else
    \PackageWarning{typearea}{%
      \string#1\space used at group level
      \the\currentgrouplevel.\MessageBreak
      Using \string#1\space inside any group, e.g.\MessageBreak
      environments, math mode, boxes, etc. may result in\MessageBreak
      many type setting problems.\MessageBreak
      You should move the command \string#1\MessageBreak
      outside all groups%
    }%
  \fi
}
\newcommand*{\storeareas}[1]{%
  \edef\reserved@a{%
    \noexpand\newcommand*{\unexpanded{#1}}{%
      \noexpand\scr@grouplevel@test\unexpanded{#1}%
      \noexpand\paperheight=\the\paperheight\space
      \noexpand\paperwidth=\the\paperwidth\space
      \noexpand\topmargin=\the\topmargin\space
      \noexpand\headheight=\the\headheight\space
      \noexpand\headsep=\the\headsep\space
      \noexpand\textheight=\the\textheight\space
      \noexpand\vsize=\the\vsize\space
      \noexpand\footskip=\the\footskip\space
      \noexpand\@colht=\the\@colht\space
      \noexpand\@colroom=\the\@colroom\space
      \noexpand\textwidth=\the\textwidth\space
      \noexpand\columnwidth=\the\columnwidth\space
      \noexpand\hsize=\the\hsize\space
      \noexpand\oddsidemargin=\the\oddsidemargin\space
      \noexpand\evensidemargin=\if@twoside
        \the\evensidemargin
      \else
        \the\oddsidemargin
      \fi\space
      \noexpand\linewidth=\the\linewidth\space
      \noexpand\maxdepth=\the\maxdepth\space
      \scr@ifundefinedorrelax{@pagesizelast}{}{%
        \noexpand\KOMAoptions{pagesize=\@pagesizelast}}%
      \noexpand\ta@div=\the\ta@div\space
      \noexpand\ta@bcor=\the\ta@bcor\space
      \noexpand\def\noexpand\@lastdiv{\@lastdiv}%
      \noexpand\marginparsep=\the\marginparsep\space
      \noexpand\marginparwidth=\the\marginparwidth\space
      \noexpand\def
      \expandafter\noexpand\csname scr@kav@KOMA.typearea.\scr@pkgextension\endcsname{%
        \unexpanded\expandafter\expandafter\expandafter{%
          \csname scr@kav@KOMA.typearea.\scr@pkgextension\endcsname}%
      }%
    }%
  }%
  \reserved@a
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ta@divfor}
% Der Standardseitenspiegel ist abhängig von den mit \cs{SetDIVList}
% vorgegebenen Einstellungen. Dazu muss aus einer eventuell
% vorhandenen inneren Liste \cs{ta@divlist} der von der Schriftgröße
% abhängige \textit{DIV}-Wert ausgelesen werden. Dies geschieht mit
% Hilfe des \cs{ta@divfor}-Befehls, der sich wiederum einiger interner
% Befehle zur Listenbearbeitung bedient.
%   \changes{v2.4g}{1996/11/04}{Satzspiegel wird nicht mehr direkt
%      berechnet, sondern nur der \textit{DIV}-Wert aus der
%      Defaultliste ermittelt} 
%   \changes{v2.6}{2000/01/04}{Berücksichtigung der erweiterten
%      Liste}^^A
%   \changes{v2.8q}{2002/03/28}{Berücksichtigung der Option
%      `mpinclude'}^^A
%   \changes{v2.96}{2006/08/11}{Schriftgröße muss nicht in ganzen pt sein}^^A
%    \begin{macrocode}
\newcommand*{\ta@divfor}[1]{%
  \if@mincl
    \PackageInfo{typearea}{%
      With option `mpinclude' there are no predefined\MessageBreak
      DIV values. Using DIV calculation for good line\MessageBreak
      width%
    }%
    \ta@div=\tw@
  \else
    \xdef\@tempa{\ta@divlist{}}%
    \@tempdima=#1pt
    \addtolength{\@tempdima}{.5\p@}%
    \divide\@tempdima by\p@
    \setlength{\@tempdimb}{\@tempdima}%
    \multiply\@tempdimb by\p@
    \ifdim \@tempdimb=#1pt
      \ta@div=#1\relax
      \@whilenum \ta@div >-9 \do {%
        \ifx\@tempa\empty
        \else \xdef\@tempa{\expandafter\@cdr\@tempa\@nil}\fi
        \advance\ta@div by-1
      }%
    \else
      \let\@tempa\empty
    \fi
    \ifx\@tempa\empty
%    \end{macrocode}
% Wenn keine Voreinstellung gefunden werden konnte, so wird immer
% der Optimalwert berechnet. Mit einer Warnung wird darauf
% hingewiesen.
%    \begin{macrocode}
      \setlength{\@tempdima}{#1\p@}%
      \addtolength{\@tempdima}{10\p@}%
      \PackageWarningNoLine{typearea}{%
        DIV for \the\@tempdima\space and used papersize\MessageBreak
        not defined!\MessageBreak
        Using DIV=\ta@divlistelse
      }%
      \ta@div=\ta@divlistelse\relax
    \else
%    \end{macrocode}
% Ansonsten wird der vorgegebene Wert verwendet.
%    \begin{macrocode}
      \xdef\@tempa{\expandafter\@car\@tempa\@nil}%
      \ifx\@tempa\empty
        \ta@div=\ta@divlistelse\relax
      \else
        \ta@div=\@tempa\relax
      \fi
    \fi
  \fi
}
%    \end{macrocode}
% \end{macro}
%
%   \changes{v2.4g}{1996/11/04}{überflüssigen Kommentar gelöscht}^^A
%   \changes{v2.7g}{2001/04/17}{die neuen Werte \texttt{current},
%     \texttt{default}, \texttt{calc}, \texttt{classic} werden
%     verstanden} 
%   \changes{v2.8q}{2001/11/06}{der Wert \texttt{last} wird
%     verstanden}
%   \changes{v2.96}{2006/08/21}{Warnung, wenn \cs{typearea} innerhalb einer
%     Gruppe verwendet wird}
%   \changes{v3.10}{2011/09/13}{Verwendung von \cs{scr@grouplevel@test}}
%   \changes{v3.12}{2013/03/26}{konfigurierbare Höhe des Fußes}^^A
%      
%   Die symbolischen Werte für das obligatorische Argument von
%   \cs{typearea} haben folgende Bedeutung:
%   \begin{center}\begin{tabular}{lll}
%       Symbol           & Wert & Bedeutung \\\hline\\[-2ex]
%       \texttt{calc}    & 2 & guten Wert berechnen \\
%       \texttt{classic} & 3 & mittelalterlicher Buchseitenkanon \\
%       \texttt{current} & --- & aktuellen Wert beibehalten \\
%       \texttt{default} & 0 & Wert aus der Liste verwenden \\
%       \texttt{last}    & --- & Argument des letzten Aufrufs verwenden \\
%       \texttt{areaset} & --- & Satzspiegel beibehalten nur neu anordnen \\
%     \end{tabular}\end{center}
%   Das optionale Argument kennt hingegen nur den symbolischen Wert
%   \texttt{current}.
%    \begin{macrocode}
\newcommand*\typearea[2][\z@]{%
  \scr@grouplevel@test\typearea
  \edef\@tempa{#1}\edef\@tempb{current}\ifx\@tempa\@tempb\else
    \setlength{\ta@bcor}{#1}%
  \fi
  \edef\@tempa{#2}%
  \def\@tempb{last}\ifx\@tempa\@tempb\let\@tempa=\@lastdiv
    \ifx\csname @tempa\endcsname\relax
      \def\@tempa{current}%
    \fi
  \fi
  \def\@tempb{areaset}\ifx\@tempa\@tempb
    \areaset[current]{\textwidth}{\textheight}%
  \else
    \def\@tempb{current}\ifx\@tempa\@tempb\else
      \def\@tempb{default}\ifx\@tempa\@tempb\ta@div=\z@ \else
        \def\@tempb{calc}\ifx\@tempa\@tempb\ta@div=\tw@ \else
          \def\@tempb{classic}\ifx\@tempa\@tempb\ta@div=\thr@@ \else
            \ta@div=\@tempa
          \fi
        \fi
      \fi
    \fi
    \edef\@lastdiv{\the\ta@div}%
%    \end{macrocode}
% Bevor nun irgendeine Berechnung durchgeführt wird, muss ggf. eine
% neue Seite begonnen werden. Außerdem wird sichergestellt, dass die aktuelle
% Schriftgröße die Grundschriftgröße ist und auch mit dem aktuellen
% Durchschuss gerechnet wird.
%   \changes{v2.95a}{2006/07/20}{Grundschriftgröße einstellen}^^A
%    \begin{macrocode}
    \if@atdocument\newpage\fi
    \normalsize
%    \end{macrocode}
% Nun muss festgestellt werden, ob die Höhe des Kopfbereichs bereits
% vorgegeben ist, oder ob diese selbst berechnet werden soll. Im Falle
% der Berechnung wird als Höhe für den Kopf das 1,25-Fache des
% Grundzeilenabstandes gewählt. Damit sollte auch noch genug Raum für die
% optionale Trennlinie vorhanden sein.
%   \changes{v2.4n}{1997/05/28}{berechnete Kopfhöhe vom
%      Grundzeilenabstand abhängig}^^A
%    \begin{macrocode}
    \@ifundefined{ta@hh}{%
      \headheight=1.25\baselineskip
    }{%
      \headheight=\ta@hh
    }%
%    \end{macrocode}
% Auch der Abstand zwischen Kopf und Text ist immer
% gleich. Verschiedene Typographen geben hier verschiedene Werte
% an. Ein guter Wert sollte erreicht werden, wenn dadurch eine
% Kopfzeile in das normale Zeilenraster eingepasst wird. Der Abstand
% soll aber auch nicht zu groß, werden. Optimal ist angeblich ein Wert
% von einer Zeile. Dies führt jedoch zu einem klaren Konflikt bei
% unterstrichenen Kopfzeilen. Deshalb wird ein Kompromiss gebildet.
%    \begin{macrocode}
    \headsep=1.5\baselineskip
%    \end{macrocode}
% Für den Fuß muss ähnlich verfahren werden. Dabei muss aber nicht nur
% ggf. \cs{footheight}, sondern auch \cs{footskip} angepasst werden.
%    \begin{macrocode}
    \@ifundefined{footheight}{%
      \newlength\footheight
    }{}%
    \@ifundefined{ta@fh}{%
      \footheight=1.25\baselineskip
    }{%
      \footheight=\ta@fh
    }%
    \footskip=\dimexpr\footheight+2.25\baselineskip
%    \end{macrocode}
% Es folgen die restlichen von \textit{DIV} und \textit{BCOR}
% unabhängigen Werte.
%    \begin{macrocode}
    \marginparsep=1cc
    \marginparpush=0.45\baselineskip
%    \end{macrocode}
%   \changes{v2.4g}{1996/11/04}{\textit{DIV}=0 versucht den Wert aus
%      der Default-Liste zu verwenden}
% Vor der eigentlichen Berechnung des Satzspiegels wird nun zunächst
% überprüft, ob der übergebene \textit{DIV}-Wert 0 ist. Da Werte von 0
% bis 3 nicht möglich sind (Minimum sind drei Teile Rand und ein Teil
% Text), wird der Wert 0 dafür verwendet, den Defaultwert aus der
% Liste zu ermitteln, falls ein solcher vorhanden ist.
%   \changes{v2.5h}{1999/12/29}{Text der Warnung korrigiert}^^A
%    \begin{macrocode}
    \ifnum\ta@div=\z@
      \@ifundefined{@ptsize}{%
        \@tempdima=\f@size\p@
        \advance\@tempdima by.5pt
        \ta@div=\@tempdima
        \divide\ta@div by65536
        \advance\ta@div by-10
        \xdef\@ptsize{\the\ta@div}%
        \PackageWarningNoLine{typearea}{%
          \string\@ptsize\space not defined!\MessageBreak
          Fontsize is \f@size pt.\MessageBreak
          Defining \string\@ptsize\space to \@ptsize%
        }%
      }{}%
      \ta@divfor{\@ptsize}%
    \fi
%    \end{macrocode}
%   \changes{v2.4n}{1997/05/28}{optionale, klassische Kreisberechnung
%     für \texttt{DIV}}
% Als zweiter Sonderfall wird für einen \textit{DIV}-Wert von 3 die
% \emph{Kreisberechnung} durchgeführt. Dabei wird versucht, den
% Textbereich genau so hoch zu wählen, wie das Papier breit ist. Ein
% solches Verhältnis wird bei klassischen Papierformaten als
% harmonisch betrachtet. 
%    \begin{macrocode}
    \ifnum\ta@div=3
      \typeout{DIV calculation for classic typearea.}%
      \setlength{\ta@temp}{\paperwidth}%
      \addtolength{\ta@temp}{-\ta@bcor}%
%    \end{macrocode}
% Bei der Berechnung des vertikal benötigten Platzes, ist zu
% beachten, ob Kopf und Fuß zum Textbereich oder zu den Rändern
% gehören. 
%    \begin{macrocode}
      \if@hincl\else
        \addtolength{\ta@temp}{\headheight}%
        \addtolength{\ta@temp}{\headsep}%
      \fi
      \if@fincl\else
        \addtolength{\ta@temp}{\footskip}%
      \fi
%    \end{macrocode}
% Wird vertikal mehr Platz benötigt, als vorhanden ist, wird eine
% andere Berechnung versucht, die weiter unten erfolgt.
%   \changes{v2.5a}{1997/06/22}{\cs{ifdim} statt \cs{ifnum}}
%    \begin{macrocode}
      \ifdim \ta@temp >\paperheight
        \PackageWarningNoLine{typearea}{%
          No classic typearea with this papersize!\MessageBreak
          Using calculated DIV%
        }%
        \ta@div=\@ne
%    \end{macrocode}
% Ansonsten wird mittels des belegten Textbereichs und der Papierhöhe
% der obere und untere Rand zusammen,
%    \begin{macrocode}
      \else
        \setlength{\ta@temp}{\paperheight}%
        \addtolength{\ta@temp}{-\paperwidth}%
        \addtolength{\ta@temp}{\ta@bcor}%
%    \end{macrocode}
% daraus die Streifenhöhe
%    \begin{macrocode}
        \divide\ta@temp by3
%    \end{macrocode}
% und schließlich erneut mit Hilfe der Papierhöhe der genaue
% \textit{DIV}-Wert berechnet.
%    \begin{macrocode}
        \ta@modiv{\paperheight}{\ta@temp}%
      \fi
%    \end{macrocode}
% An dieser Stelle muss \texttt{mpinclude} nicht berücksichtigt
% werden, da nicht die Breite des Textbereichs, sondern die Breite des
% Papiers als Kriterium verwendet wird.
%    \begin{macrocode}
    \fi
%    \end{macrocode}
% Wurde bisher kein Wert gefunden oder ein \textit{DIV}-Wert von 1 bis
% 2 angegeben, so wird nun ein möglichst optimaler \textit{DIV}-Wert
% ermittelt. 
%   \changes{v2.4n}{1997/05/28}{optimale \textit{DIV}-Berechnung
%      verbessert} 
%    \begin{macrocode}
    \ifnum\ta@div <4
      \typeout{DIV calculation for typearea with good linewidth.}%
%    \end{macrocode}
% Zunächst könnte die Textbreite die gesamte Sichtbare Papierbreite
% einnehmen:
%    \begin{macrocode}
      \setlength{\textwidth}{\paperwidth}%
      \addtolength{\textwidth}{-\ta@bcor}%
%    \end{macrocode}
% Als Sollbreite wird hier die ideale Zeilenfüllung verwendet:
%    \begin{macrocode}
      \ta@temp@goodwidth
%    \end{macrocode}
% Im Zweispaltenmodus besteht jede Zeile aus zwei solchen Spalten
% zuzüglich dem Spaltenabstand:
%   \changes{v2.8q}{2001/12/13}{\texttt{DIVcalc} liefert im
%      zweispaltigen Satz (wie dokumentiert) breitere Spalten}
%    \begin{macrocode}
      \if@twocolumn
        \addtolength{\ta@temp}{\ta@temp}%
        \addtolength{\ta@temp}{\columnsep}%
      \fi
%    \end{macrocode}
% In früheren Versionen erfolgte nun eine iterative Annäherung an den
% optimalen \textit{DIV}-Wert. Je nach {\TeX}-Implementierung und
% Papierformat, kann das aber recht lange dauern. Die obere Berechnung
% zum Vorbild nehmend, wird deshalb nun ebenfalls versucht, den
% optimalen Wert direkt zu berechnen. Dazu wird zunächst wie oben die
% Größe der horizontalen Ränder zusammen ermittelt:
%    \begin{macrocode}
      \setlength{\ta@hblk}{\paperwidth}%
      \addtolength{\ta@hblk}{-\ta@temp}%
%    \end{macrocode}
% Daraus dann die Breite eines Streifens.
%    \begin{macrocode}
      \divide\ta@hblk by3
%    \end{macrocode}
% Ist die Breite negativ, so wird die Mindestbreite von 5mm eingesetzt.
% \changes{v2.5a}{1997/06/22}{\cs{ifdim} statt \cs{ifnum}.}
%    \begin{macrocode}
      \ifdim \ta@hblk <\z@
        \setlength{\ta@hblk}{5mm}%
      \fi
%    \end{macrocode}
% Nun kann wieder der \textit{DIV}-Wert ermittelt werden.
%   \changes{v2.8q}{2002/03/28}{Berüchsichtigung von Option
%      \texttt{mpinclude} bei der \textit{DIV}-Berechnung}
% Im Falle der Option \texttt{mpinclude} gilt allgemein, dass
% der Nenner mit $\frac{3}{3+m}$ zu multiplizieren ist. Dabei ist $m$
% die Anzahl an Längeneinheiten, die für die Randnotizen verwendet
% werden sollen. Mit $m=1$ ist also der Faktor $\frac{3}{4}=0.75$ zu
% verwenden. Schwieriger wird es, wenn hier nicht die Anzahl
% Längeneinheiten, sondern ein konkreter Wert für die Breite der
% Randnotizen verwendet wird.
%    \begin{macrocode}
      \if@mincl
        \setlength{\ta@temp}{.75\ta@hblk}%
      \else
        \setlength{\ta@temp}{\ta@hblk}%
      \fi
      \ta@modiv{\paperwidth}{\ta@temp}%
%    \end{macrocode}
% Als Erschwernis kommt jetzt jedoch hinzu, dass nun zwar der
% \textit{DIV}-Wert für die Breite optimal ist, jedoch u.\,U. zu einer
% zu großen Höhe führt. Deshalb wird zunächst ein Satzspiegel für
% diesen \textit{DIV}-Wert berechnet.
%    \begin{macrocode}
      \@typearea
%    \end{macrocode}
% Nun wird überprüft, ob die vertikalen Ausmaße in Ordnung sind. Auch
% hier ist wieder eine minimale Streifenbreite vorteilhaft. Die
% Streifenbreite ergibt sich direkt aus dem oberen Rand. Wobei jedoch
% noch das {\TeX}-Offset von 1\,in zu berücksichtigen ist.
%   \changes{v2.5a}{1997/06/22}{\cs{ifdim} statt \cs{ifnum}}
%    \begin{macrocode}
      \setlength{\ta@temp}{-1in}%
      \addtolength{\ta@temp}{5mm}%
      \ifdim\topmargin <\ta@temp
%    \end{macrocode}
% Ist der Minimalrand nicht eingehalten, so wird für diesen ein neuer
% \textit{DIV}-Wert ermittelt. Dabei muss ebenfalls berücksichtigt
% werden, ob Kopf- und Fußbereich zum Text oder zum Rand gehören. 
%   \changes{v2.5b}{1997/06/29}{bei der Mindestrandbetrachtung
%      \texttt{headinclude} und \texttt{footinclude} berücksichtigen}
%    \begin{macrocode}
        \setlength{\ta@temp}{15mm}%
        \if@hincl\else
          \addtolength{\ta@temp}{\headheight}%
          \addtolength{\ta@temp}{\headsep}%
        \fi
        \if@fincl\else
          \addtolength{\ta@temp}{\footskip}%
        \fi
        \divide\ta@temp by3
        \ta@modiv{\paperheight}{\ta@temp}%
      \fi
%    \end{macrocode}
% Dieser Sonderfall ist somit abschließend behandelt.
%    \begin{macrocode}
    \fi
%    \end{macrocode}
% Damit steht jetzt also der \textit{DIV}-Wert fest, und die
% eigentliche Berechnung kann folgen.
%    \begin{macrocode}
    \@typearea
%    \end{macrocode}
%   \changes{v2.0e}{1994/10/28}{Seitenaufteilung wird in die log-Datei
%     geschrieben}^^A
%   \changes{v2.4i}{1996/11/11}{Seitenaufteilung wird etwas später in
%     die log-Datei geschrieben}^^A
%   \changes{v2.4i}{1996/11/11}{am Ende von \cs{typearea} wird noch
%     \cs{@typeare@end} ausgeführt}
%   \changes{v2.4j}{1996/12/04}{bei der Seitenaufteilung wird
%     \cs{textheight} nicht mehr doppelt, dafür zusätzlich
%     \cs{baselineskip} ausgegeben}
%   \changes{v2.5}{1997/06/17}{"`arithmetic overflow"' bei landscape
%     behoben}^^A
%   \changes{v2.95}{2004/01/30}{Warnung im Zweispaltenmodus korrigiert}^^A
%   \changes{v3.00}{2008/10/08}{Layout-Infos werden per \cs{ta@layoutinfo}^^A
%     in die \texttt{log}-Datei geschrieben}
%   \changes{v3.01b}{2008/12/09}{Warnungen vor ungünstigen Einstellungen
%     geändert}^^A
% Zum Schluss soll die Seitenaufteilung noch in die \texttt{log}-Datei
% geschrieben werden.
%    \begin{macrocode}
    \ta@temp@goodwidth
    \if@twocolumn
      \addtolength{\ta@temp}{\ta@temp}%
      \addtolength{\ta@temp}{\columnsep}%
    \fi
    \setlength{\@tempdima}{\ta@temp}%
    \addtolength{\ta@temp}{-\textwidth}%
    \divide\@tempdima by100
    \divide\ta@temp by\@tempdima
    \@tempcnta=\ta@temp
    \ifnum\@tempcnta <5
      \ifnum\@tempcnta >-5
        \@tempcnta=0
      \else
        \advance\@tempcnta by4
      \fi
    \else
      \advance\@tempcnta by-4
    \fi
    \ifnum\@tempcnta <-15
      \@tempcnta=-\@tempcnta
      \PackageWarningNoLine{typearea}{%
        Bad type area settings!\MessageBreak
        The detected line width is about
        \the\@tempcnta\@percentchar\MessageBreak
        larger than the heuristically detected line width.\MessageBreak
        You should e.g. decrease DIV, increase fontsize\MessageBreak
        or change papersize%
      }%
      \@tempcnta=-\@tempcnta
    \else
      \ifnum\@tempcnta>15
        \PackageWarningNoLine{typearea}{%
          Maybe no optimal type area settings!\MessageBreak
          The maximum limit of line width is about
          \the\@tempcnta\@percentchar\MessageBreak
          larger than the heuristically detected line width.\MessageBreak
          You may e.g. increase DIV, decrease fontsize\MessageBreak
          or change the papersize%
        }
    \fi\fi
    \ifnum\ta@div <6
      \PackageWarningNoLine{typearea}{%
        Very low DIV value!\MessageBreak
        DIV values less than 6 result in textwidth/-height\MessageBreak
        smaller than total marginwidth/-height.\MessageBreak
        You should e.g. increase DIV, increase fontsize or\MessageBreak
        change papersize%
      }
    \fi
    \ta@layoutinfo{\number\ta@div}{\the\@tempcnta}%
    \KOMA@kav@removekey{.typearea.\scr@pkgextension}{DIV}%
    \KOMA@kav@xadd{.typearea.\scr@pkgextension}{DIV}{\@lastdiv}%
    \KOMA@kav@removekey{.typearea.\scr@pkgextension}{BCOR}%
    \KOMA@kav@xadd{.typearea.\scr@pkgextension}{BCOR}{\the\ta@bcor}%
    \@typearea@end
    \activateareas
    \ifdim \dimexpr 1in+\topmargin
                   +\headheight+\headsep
                   +\textheight
                   +\footskip+\dp\strutbox\relax
           >\paperheight
      \PackageWarningNoLine{typearea}{%
        page content and margins higher than paper.\MessageBreak
        This may result in page footer out of paper.\MessageBreak
        You should decrease DIV, decrease foot height,\MessageBreak
        or include footer into type area%
      }%
    \fi
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ta@layoutinfo}
%   \changes{v3.00}{2008/10/08}{neu (intern)}^^A
% Schreibt die Layout-Information in die \texttt{log}-Datei. Dabei ist das
% erste Argument die Ausgabe für den DIV-Wert und das zweite Argument die
% DIV-Abweichung. Letztere wird nur ausgegeben, wenn das Argument nicht leer
% und nicht \cs{relax} ist.
%    \begin{macrocode}
\newcommand*{\ta@layoutinfo}[2]{%
  \PackageInfo{typearea}{%
    These are the values describing the layout:\MessageBreak
    DIV\space\space=\space#1\MessageBreak
    BCOR\space=\space\the\ta@bcor\MessageBreak
    \string\paperwidth\space\space\space\space\space\space=%
                         \space\the\paperwidth\MessageBreak
    \space\string\textwidth\space\space\space\space\space\space=%
                         \space\the\textwidth\MessageBreak
    \ifx\relax#2\relax\else
      \space DIV departure\space\space\space=%
                           \space#2\@percentchar\MessageBreak
    \fi
    \space\string\evensidemargin\space=%
                         \space\the\evensidemargin\MessageBreak
    \space\string\oddsidemargin\space\space=%
                           \space\the\oddsidemargin\MessageBreak
    \string\paperheight\space\space\space\space\space=%
                         \space\the\paperheight\MessageBreak
    \space\string\textheight\space\space\space\space\space=%
                         \space\the\textheight\MessageBreak
    \space\string\topmargin\space\space\space\space\space\space=%
                         \space\the\topmargin\MessageBreak
    \space\string\headheight\space\space\space\space\space=%
                         \space\the\headheight\MessageBreak
    \space\string\headsep\space\space\space\space\space\space\space\space=%
                         \space\the\headsep\MessageBreak
    \space\string\topskip\space\space\space\space\space\space\space\space=%
                         \space\the\topskip\MessageBreak
    \space\string\footskip\space\space\space\space\space\space\space=%
                         \space\the\footskip\MessageBreak
    \space\string\baselineskip\space\space\space=%
                         \space\the\baselineskip\MessageBreak
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\recalctypearea}
%   \changes{v2.95}{2002/12/04}{Neu}^^A
% Dieses Anweisung dient der Neuberechnung des Satzspiegels mit den
% zuletzt eingestellten Werten. Dieser Befehl existiert erst, nachdem
% das Paket geladen wurde.
%    \begin{macrocode}
\AtEndOfPackage{\newcommand*{\recalctypearea}{\typearea[current]{last}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\areaset}
%   \changes{v2.1b}{1994/12/31}{\cs{headheight} von \cs{@ptsize}
%     abhängig gemacht}
%   \changes{v2.6}{2000/01/04}{\cs{headheight} von \cs{f@size} statt
%     von \cs{@ptsize} abhängig gemacht}
%   \changes{v2.7g}{2001/04/17}{auch hier existiert der symbolische
%     Wert \texttt{current} für BCOR}
%   \changes{v2.95}{2002/12/05}{am Ende von \cs{areaset} wird noch
%     \cs{@typeare@end} ausgeführt}
% Zur Berechnung eines Satzspiegels mit fester Breite und Höhe dient
% der Befehl \cs{areaset}. Der Algorithmus ist ähnlich dem vorherigen
% Verfahren, aber einfacher. Auch hier soll ein Wechsel innerhalb des
% Dokuments ermöglicht werden.
%    \begin{macrocode}
\newcommand*\areaset[3][\z@]{%
  \edef\@tempa{#1}\edef\@tempb{current}\ifx\@tempa\@tempb\else
    \setlength{\ta@bcor}{#1}%
  \fi
%    \end{macrocode}
% Bevor nun irgendeine Berechnung durchgeführt wird, muss ggf. eine
% neue Seite begonnen werden.
%    \begin{macrocode}
  \if@atdocument\newpage\fi
%    \end{macrocode}
% Erst dann folgt die eigentlich Berechnung:
%   \changes{v2.96}{2006/09/12}{\cs{topskip} wird gesetzt}
%   \changes{v3.00}{2008/10/08}{Layout-Infos werden per \cs{ta@layoutinfo}^^A
%     in die \texttt{log}-Datei geschrieben}
%    \begin{macrocode}
  \setlength{\textwidth}{#2}%
  \setlength{\textheight}{#3}%
  \def\@lastdiv{areaset}%
  \KOMA@kav@removekey{.typearea.\scr@pkgextension}{DIV}%
  \KOMA@kav@add{.typearea.\scr@pkgextension}{DIV}{areaset}%
  \KOMA@kav@removekey{.typearea.\scr@pkgextension}{BCOR}%
  \KOMA@kav@add{.typearea.\scr@pkgextension}{BCOR}{\the\ta@bcor}%
  \ta@hblk=\paperwidth
  \advance\ta@hblk by-\ta@bcor
  \advance\ta@hblk by-\textwidth
%    \end{macrocode}
%   \changes{v3.11}{2012/04/17}{advanced version with different margin widths}%
% With version 3.11 we will have an advanced version of \cs{areaset}. This
% version takes care to option \texttt{mpinclude}.
%    \begin{macrocode}
  \if@areasetadvanced
    \if@mincl
      \divide\ta@hblk by4
    \else
      \divide\ta@hblk by3
    \fi
  \else
    \divide\ta@hblk by3
  \fi
  \oddsidemargin=-1in
  \evensidemargin=-1in
  \if@twoside
    \if@semitwoside
      \advance\oddsidemargin by1.5\ta@hblk
      \advance\oddsidemargin by\ta@bcor
%    \end{macrocode}
% \changes{v3.12}{2013/10/15}{use alternating \texttt{BCOR} with
%    \texttt{twoside!=semi}}
% Wenn \texttt{twoside=semi} verwendet wird, wird der Binderand ab
% \KOMAScript~3.12 dem inneren Rand zugeschlagen. Bei Kompatibilität zu
% älteren Versionen wird hingegen immer der linke Rand verwendet.
%    \begin{macrocode}
      \expandafter\ifnum\scr@ta@v@is@lt{3.12}\relax
        \evensidemargin=\oddsidemargin
      \else
        \advance\evensidemargin by1.5\ta@hblk
      \fi
    \else
      \advance\oddsidemargin by\ta@hblk
      \advance\oddsidemargin by\ta@bcor
      \advance\evensidemargin by2\ta@hblk
    \fi
  \else
    \advance\oddsidemargin by1.5\ta@hblk
    \advance\oddsidemargin by\ta@bcor
    \evensidemargin\oddsidemargin
  \fi
  \scr@ifundefinedorrelax{@ptsize}{%
    \topskip=\f@size\p@
  }{%
    \topskip=\@ptsize\p@
    \advance\topskip by 10\p@
  }%
%    \end{macrocode}
%   \changes{v3.11}{2012/04/17}{advanced version with different margin widths}%
% With version 3.11 we will have an advanced version of \cs{areaset}. This
% version uses the head height algorithm of \cs{typearea}.
%    \begin{macrocode}
  \if@areasetadvanced
    \normalsize
    \@ifundefined{ta@hh}{%
      \headheight=1.25\baselineskip
    }{%
      \headheight=\ta@hh
    }%
  \else
    \headheight=15\p@
    \advance\headheight by\f@size\p@
    \advance\headheight by-10\p@
  \fi
  \headsep=1.5\baselineskip
%    \end{macrocode}
%   \changes{v3.12}{2013/03/26}{changes for height of foot}^^A
%    \begin{macrocode}
  \@ifundefined{footheight}{\newlength\footheight}{}
  \if@areasetadvanced
    \@ifundefined{ta@fh}{%
      \footheight=1.25\baselineskip
      \footskip=3.5\baselineskip
    }{%
      \footheight=\ta@fh
      \footskip=\dimexpr \footheight+2.25\baselineskip\relax
    }%
  \else
    \footheight=1.25\baselineskip
    \footskip=3.5\baselineskip
  \fi
  \ta@vblk=\paperheight
  \advance\ta@vblk by-\textheight
  \divide\ta@vblk by3
  \if@hincl
    \advance\textheight by-\headheight
    \advance\textheight by-\headsep
  \fi
  \if@fincl
    \advance\textheight by-\footskip
  \fi
  \topmargin=-1in
  \advance\topmargin by\ta@vblk
  \if@hincl \else
    \advance\topmargin by-\headheight
    \advance\topmargin by-\headsep
  \fi
  \if@twoside
    \if@semitwoside
      \marginparwidth=\ta@hblk
    \else
      \marginparwidth=1.5\ta@hblk
    \fi
  \else
    \marginparwidth=\ta@hblk
  \fi
  \marginparsep=1cc
%    \end{macrocode}
%   \changes{v3.11}{2012/04/17}{advanced version with different
%     \cs{marginparwidth} and unchanged \cs{marginparsep}}%
% With version 3.11 we will have an advanced version of \cs{areaset}. This
% version supports \texttt{mpinclude} option like \cs{typearea}.
%    \begin{macrocode}
  \if@areasetadvanced
    \if@mincl
      \marginparwidth=\ta@hblk
      \if@twoside\if@semitwoside\else
          \advance\evensidemargin by\marginparwidth
      \fi\fi
      \advance\marginparwidth by-\marginparsep
    \fi
  \fi
  \marginparpush=0.45\baselineskip
  \ta@layoutinfo{areaset}{}%
%    \end{macrocode}
%   \changes{v3.11}{2012/04/17}{using \cs{@areaset@end}}^^A
%   \changes{v3.16a}{2015/02/11}{using \cs{footheight} for calculation of
%     page usage}^^A
% Since version~3.11 we also support \cs{AfterSettingArea} analogous to
% \cs{AfterCalculatingTypearea}:
%    \begin{macrocode}
  \@areaset@end
  \activateareas
  \ifdim \dimexpr 1in+\topmargin
                 +\headheight+\headsep
                 +\textheight
                 +\footskip+\footheight-\ht\strutbox\relax
         >\paperheight
    \PackageWarningNoLine{typearea}{%
      page content and margins higher than paper.\MessageBreak
      This may result in page footer out of paper.\MessageBreak
      You should decrease DIV, decrease foot height,\MessageBreak
      or decreate height of text area%
    }%
  \fi
}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Berechnung des Standardsatzspiegels}
%
% \changes{v2.8q}{2001/11/06}{Initialisierung mit Hilfe der
%   symbolischen Werte \texttt{current}}
% Nun fehlt nur noch die eigentliche Initialisierung. Dazu wird
% einfach der Satzspiegel mit den getroffenen Voreinstellungen
% berechnet. Da der \textit{DIV}-Wert 0 für einen Wert aus der
% Default-Liste steht, bleibt die Kompatibilität zu älteren Versionen
% erhalten. Der aktuelle Wert für \textit{DIV} und \textit{BCOR} wurde
% über die Optionen bereits gesetzt. Dabei kann abweichend zu sonst
% der aktuelle Wert auch 0, 1, 2 oder 3 sein. Die Initialisierung des
% Pakets ist damit sehr einfach. 
%    \begin{macrocode}
\typearea[current]{current}
%    \end{macrocode}
%
% \iffalse
%</package>
%</body>
%</class|package>
% \fi
%
% \Finale
%
\endinput
%
% end of file `scrkernel-typearea.dtx'
%%% Local Variables:
%%% mode: doctex
%%% TeX-master: t
%%% End:
