summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/koma-script/scrkernel-typearea.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/koma-script/scrkernel-typearea.dtx')
-rw-r--r--macros/latex/contrib/koma-script/scrkernel-typearea.dtx3239
1 files changed, 3239 insertions, 0 deletions
diff --git a/macros/latex/contrib/koma-script/scrkernel-typearea.dtx b/macros/latex/contrib/koma-script/scrkernel-typearea.dtx
new file mode 100644
index 0000000000..382727cdd2
--- /dev/null
+++ b/macros/latex/contrib/koma-script/scrkernel-typearea.dtx
@@ -0,0 +1,3239 @@
+% \iffalse meta-comment
+% ======================================================================
+% scrkernel-typearea.dtx
+% Copyright (c) Markus Kohm, 2002-2022
+%
+% 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.md.
+% ======================================================================
+%%% From File: $Id: scrkernel-typearea.dtx 3889 2022-06-09 12:11:14Z kohm $
+%<identify>%%% (run: identify)
+%<init>%%% (run: init)
+%<options>%%% (run: options)
+%<body>%%% (run: body)
+%<final>%%% (run: final)
+%<package&identify>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\begingroup
+ \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
+ \filedate$Date: 2022-06-09 14:11:14 +0200 (Do, 09. Jun 2022) $
+ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
+ \filerevision$Revision: 3889 $
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\ProvidesFile{scrkernel-typearea.dtx}[%
+ \filedate\space\filerevision\space
+ KOMA-Script
+ }
+\reserved@a
+%</dtx>
+%<*dtx|(package&typearea&identify)>
+%<package>\ProvidesPackage{typearea}[%
+%!KOMAScriptVersion
+ package
+%<*dtx>
+ source
+%</dtx>
+ (type area)]
+%</dtx|(package&typearea&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,typearea,identify}%
+ \from{scrkernel-basics.dtx}{load}%
+ \from{scrkernel-compatibility.dtx}{package,typearea,init}%
+ \from{scrkernel-typearea.dtx}{package,typearea,init}%
+ \from{scrkernel-compatibility.dtx}{package,typearea,option}%
+ \from{scrkernel-typearea.dtx}{package,typearea,options}%
+ \from{scrkernel-compatibility.dtx}{package,typearea,body}%
+ \from{scrkernel-typearea.dtx}{package,typearea,body}%
+ \from{scrkernel-typearea.dtx}{package,typearea,final}%
+ \from{scrlogo.dtx}{logo}%
+ }%
+ }
+ \@@input scrstrop.inc
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
+\documentclass[USenglish]{koma-script-source-doc}
+\usepackage{babel}
+\setcounter{StandardModuleDepth}{2}
+\begin{document}
+\DocInput{scrkernel-typearea.dtx}
+\end{document}
+%</dtx>
+% \fi^^A meta-comment
+%
+% \changes{v2.95}{2002/06/20}{first version after splitting \file{scrclass.dtx}}
+% \changes{v3.24}{2017/07/23}{reorganization of code into semantic portions}
+% \changes{v3.24}{2017/07/23}{start of English translation}
+% \changes{v3.36}{2022/02/11}{switch over from \cls*{scrdoc} to
+% \cls*{koma-script-source-doc}}
+% \changes{v3.36}{2022/02/11}{whole implementation documentation in English}
+%
+% \GetFileInfo{scrkernel-typearea.dtx}
+% \title{Calculation of the Typeing Area with
+% \href{https://komascript.de}{\KOMAScript} Package \pkg*{typearea}
+% and Additional Commands for the \href{https://komascript.de}{\KOMAScript}
+% Classes}
+% \author{\href{mailto:komascript@gmx.info}{Markus Kohm}}
+% \date{Revision \fileversion{} of \filedate}
+% \maketitle
+% \begin{abstract}
+% \filename{} contains macros for the typing area. These result not only in
+% the package \pkg*{typearea} but also provide features for the
+% \KOMAScript{} classes.
+% \end{abstract}
+% \tableofcontents
+%
+% \section{User Manual}
+%
+% You can find the user documentation of package \pkg*{typearea} and the
+% commands implemented here in the \KOMAScript{} manual, either the German
+% \file{scrguide} or the English \file{scrguien}.
+%
+% \MaybeStop{\PrintIndex}
+%
+% \section{Implementation of Package \pkg*{typearea} and Additional Class
+% Features}
+%
+%
+% \subsection{Loading packages}
+%
+% Package \pkg*{typearea} needs package \pkg*{scrkbase}. But this will
+% be loaded by \file{scrkernel-basics.dtx} just after the identify run of this
+% file. It does not need other packages.
+%
+% The \KOMAScript{} classes need package \pkg*{typearea}. This will be
+% loaded here as an early body action. Nevertheless, at this state the typing
+% area option code for the classes has already been loaded. So before loading
+% the almost identical option code of the package, some macros have to be
+% reset:
+% \begin{macrocode}
+%<*class&body>
+\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}
+% Now we can load \pkg*{typearea}:
+% \changes{v2.95}{2002/06/22}{Use \cs{KOMAScriptVersion} while loading
+% \pkg*{typearea}}
+% We use \cs{KOMAScriptVersion} to verify the identical versions of
+% \KOMAScript{} and the package. See \file{scrkernel-version.dtx} for more
+% information about this verification.
+% \begin{macrocode}
+\RequirePackage{typearea}[\KOMAScriptVersion]
+%</class&body>
+% \end{macrocode}
+%
+% \subsection{Selection of paper size}
+%
+% Before we can define page margins and a typing area, we have to define the
+% paper size. Beside \pkg*{typearea} also \pkg*{scrletter} uses some of
+% this code, because it needs the paper size, too.
+%
+% \begin{command}{\PaperNameToSize}
+% \changes{v3.23}{2017/02/22}{added}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}
+% This command sets \cs{paperheight} and \cs{paperwidth} depending on
+% the name of a paper size. It currently supports the ISO formats of the
+% series A, B, C and D and the American formats letter, legal and
+% executive. The command is defined using \cs{providecommand} so a class
+% can define it different before loading \pkg*{typearea}. The first
+% optional argument is the error class. Error classes will be defined using
+% \cs{ProvideUnknownPaperSizeError} later. The second argument is the name
+% of the paper size.
+% \begin{macrocode}
+%<*package&options>
+\providecommand*{\PaperNameToSize}[2][warning]{%
+ \Ifstr{#2}{letter}{%
+ \setlength\paperheight{11in}%
+ \setlength\paperwidth {8.5in}%
+ }{%
+ \Ifstr{#2}{legal}{%
+ \setlength\paperheight{14in}%
+ \setlength\paperwidth {8.5in}%
+ }{%
+ \Ifstr{#2}{executive}{%
+ \setlength\paperheight{10.5in}%
+ \setlength\paperwidth {7.25in}%
+ }{%
+ \Ifstr{#2}{}{%
+ \ISO@PaperNameToSize[#1]{}{}\@nil
+ }{%
+ \edef\reserved@a{\noexpand\ISO@PaperNameToSize[#1]#2 \noexpand\@nil}%
+ \reserved@a
+ }%
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\ISO@PaperNameToSize}
+% \changes{v3.23}{2017/02/22}{new (internal)}
+% \changes{v3.28}{2019/11/18}{\cs{ifnumber} umbenannt in \cs{Ifnumber}}
+% For ISO paper sizes a sub-macro is used. It has to split the series and the
+% root.
+% \begin{macrocode}
+\scr@ifundefinedorrelax{ISO@PaperNameToSize}{%
+ \def\ISO@PaperNameToSize[#1]#2#3\@nil{%
+ \lowercase{\edef\reserved@a{#2}}%
+ \@tempswafalse
+ \if \reserved@a a%
+ \Ifnumber{#3}{%
+ \setlength{\paperwidth}{841sp}%
+ \setlength{\paperheight}{1189sp}%
+ \@tempswatrue
+ }{}%
+ \else
+ \if \reserved@a b%
+ \Ifnumber{#3}{%
+ \setlength{\paperwidth}{1000sp}%
+ \setlength{\paperheight}{1414sp}%
+ \@tempswatrue
+ }{}%
+ \else
+ \if \reserved@a c%
+ \Ifnumber{#3}{%
+ \setlength{\paperwidth}{917sp}%
+ \setlength{\paperheight}{1297sp}%
+ \@tempswatrue
+ }{}%
+ \else
+ \if \reserved@a d%
+ \Ifnumber{#3}{%
+ \setlength{\paperwidth}{771sp}%
+ \setlength{\paperheight}{1090sp}%
+ \@tempswatrue
+ }{}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \if@tempswa
+ \@tempcnta=#3\relax
+ \@whilenum\@tempcnta>\z@
+ \do{\setlength{\@tempdima}{\paperwidth}%
+ \setlength{\paperwidth}{.5\paperheight}%
+ \setlength{\paperheight}{\@tempdima}%
+ \advance\@tempcnta by\m@ne
+ }%
+ \multiply\paperwidth by186468
+ \multiply\paperheight by186468
+ \else
+% \end{macrocode}
+% The paper size is not a supported ISO format. If
+% \cs{scr@UnknownPaperSize@}\meta{errorclass} is defined, use it to show
+% the error. If not, use \cs{scr@UnknownPaperSize@error}. This means,
+% \meta{errorclass} \texttt{error} has to be defined.
+% \begin{macrocode}
+ \scr@ifundefinedorrelax{scr@UnknownPaperSize@#1}{%
+ \scr@UnknownPaperSize@error{#2#3}%
+ }{%
+ \@nameuse{scr@UnknownPaperSize@#1}{#2#3}%
+ }%
+ \fi
+ }%
+}{}
+% \end{macrocode}
+% \begin{command}{\ProvideUnknownPaperSizeError}
+% \changes{v3.23}{2017/02/22}{added}
+% Define a new error class for unknown paper formats. The argument is the new
+% error class. Each error class is represented by a command
+% \cs{scr@UnknownPaperSize@}\meta{errorclass}. That command also has
+% exactly one argument, the unknown paper size.
+% \begin{macrocode}
+\providecommand*{\ProvideUnknownPaperSizeError}[1]{%
+ \expandafter\providecommand\expandafter*%
+ \csname scr@UnknownPaperSize@#1\endcsname[1]%
+}
+% \end{macrocode}
+% \begin{macro}{\scr@UnkownPaperSize@error,\scr@UnkownPaperSize@warning,
+% \scr@UnkownPaperSize@info,\scr@UnkownPaperSize@ignore}
+% \changes{v3.23}{2017/02/22}{new (internal)}
+% Error handling (error classes) for \cs{PaperNameToSize}.
+% \begin{macrocode}
+\ProvideUnknownPaperSizeError{error}{%
+ \PackageError{%
+%<typearea> typearea%
+%<letter> scrletter%
+ }{Unknown paper size #1}{%
+ \string\paperwidth\space and \string\paperheight\space stay unchanged,
+ because of unknown paper size.%
+ }%
+}
+%<*typearea>
+\ProvideUnknownPaperSizeError{warning}{%
+ \PackageWarning{%
+ typearea%
+ }{%
+ \string\paperwidth\space and \string\paperheight\space stay
+ unchanged, because\MessageBreak
+ of unknown paper size #1%
+ }%
+}
+\ProvideUnknownPaperSizeError{info}{%
+ \PackageInfo{%
+ typearea
+ }{%
+ \string\paperwidth\space and \string\paperheight\space stay
+ unchanged, because\MessageBreak
+ of unknown paper size #1%
+ }%
+}
+\ProvideUnknownPaperSizeError{ignore}{}
+%</typearea>
+%</package&options>
+% \end{macrocode}
+% \end{macro}^^A \scr@UnknownPaperSize@error … \scr@UnknownPaperSize@ignore
+% \end{command}^^A \ProvideUnknownPaperSizeError
+% \end{macro}^^A \ISO@PaperNameToSize
+% \end{command}^^A \PaperNameToSize
+%
+% \begin{option}{a4paper,a5paper,b5paper,letterpaper,legalpaper,executivepaper,
+% landscape,portrait}
+% \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by \cs{PackageInfoNoLine}}
+% \changes{v3.01a}{2008/11/21}{the option is standard but not deprecated}
+% The paper sizes of the standard classes are a special case. For
+% compatibility they are declared explicitly. Note: There is still a pattern
+% matching implementation for other paper size options, but the usage of those
+% is hardly deprecated.
+% \begin{macrocode}
+%<*package&typearea&options>
+\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}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}^^A a4paper … portrait
+%
+% \begin{option}{paper}
+% \changes{v2.95}{2002/12/03}{added}
+% \changes{v3.01b}{2008/12/09}{height and width swapped}
+% \changes{v3.02c}{2009/02/12}{new \opt{paper\quotechar=seascape}}
+% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}
+% \changes{v3.22}{2016/07/29}{paper orientation depends on format name}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% Normally, the paper size should be set using this option. It provides the
+% ISO series A, B, C, D, value pairs
+% \opt{(\meta{width},\meta{height})} and the orientations
+% \opt{portrait}, \opt{landscape} and \opt{seascape}.
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@key{paper}{%
+ \Ifstr{#1}{seascape}{%
+ \@seascapetrue
+ \expandafter\ifnum\scr@ta@v@is@ge{3.22}\relax
+ \@landscapetrue
+ \scr@setpaperorientation
+ \else
+ \if@landscape\else\scr@switchpapersizes\@landscapetrue\fi
+ \fi
+ \FamilyKeyStateProcessed
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{landscape}%
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{portrait}%
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{seascape}%
+ \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{seascape}%
+ }{%
+ \Ifstr{#1}{landscape}{%
+ \@seascapefalse
+ \expandafter\ifnum\scr@ta@v@is@ge{3.22}\relax
+ \@landscapetrue
+ \scr@setpaperorientation
+ \else
+ \if@landscape\else\scr@switchpapersizes\@landscapetrue\fi
+ \fi
+ \FamilyKeyStateProcessed
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{landscape}%
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{portrait}%
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{seascape}%
+ \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{landscape}%
+ }{%
+ \Ifstr{#1}{portrait}{%
+ \expandafter\ifnum\scr@ta@v@is@ge{3.22}\relax
+ \@landscapefalse
+ \scr@setpaperorientation
+ \else
+ \if@landscape\scr@switchpapersizes\@landscapefalse\fi
+ \fi
+ \FamilyKeyStateProcessed
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{landscape}%
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{portrait}%
+ \KOMA@kav@remove{.typearea.\scr@pkgextension}{paper}{seascape}%
+ \KOMA@kav@add{.typearea.\scr@pkgextension}{paper}{portrait}%
+ }{%
+ \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}%
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{%
+ \if@seascape seascape\else
+ \if@landscape landscape\else portrait\fi\fi
+ }%
+ }{%
+ \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}%
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{%
+ \if@seascape seascape\else
+ \if@landscape landscape\else portrait\fi\fi
+ }%
+ }{%
+ \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}%
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{%
+ \if@seascape seascape\else
+ \if@landscape landscape\else portrait\fi\fi
+ }%
+ }{%
+ \iso@paper{#1}%
+ \if@tempswa
+ \FamilyKeyStateProcessed
+ \KOMA@kav@removekey{.typearea.\scr@pkgextension}{paper}%
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{#1}%
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{%
+ \if@seascape seascape\else
+ \if@landscape landscape\else portrait\fi\fi
+ }%
+ \else
+ \expandafter\maybe@pair#1::\@nil
+ \if@tempswa
+ \FamilyKeyStateProcessed
+ \KOMA@kav@removekey{.typearea.\scr@pkgextension}{paper}%
+ \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\paperwidth{\@tempb}%
+ \setlength\paperheight{\@tempa}%
+ \else
+ \setlength\paperwidth{\@tempa}%
+ \setlength\paperheight{\@tempb}%
+ \fi
+ \expandafter\ifnum \scr@ta@v@is@lt{3.22}\relax
+ \if@landscape
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{\@tempa:\@tempb}%
+ \else
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{\@tempb:\@tempa}%
+ \fi
+ \else
+ \scr@setpaperorientation
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{%
+ \the\paperwidth:\the\paperheight}%
+ \fi
+ \KOMA@kav@xadd{.typearea.\scr@pkgextension}{paper}{%
+ \if@seascape seascape\else
+ \if@landscape landscape\else portrait\fi\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
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\if@seascape,\@seascapetrue,\@seascapefalse}
+% \changes{v3.02c}{2009/02/12}{added}
+% This switch stores only whether or not the landscape orientation should be
+% up-side-down. Currently this makes sense only using \file{dvips}.
+% \begin{macrocode}
+\newif\if@seascape
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\if@landscape,\@landscapetrue,\@landscapefalse}
+% This switch stores whether using portrait or landscape orientation.
+% \begin{macrocode}
+\newif\if@landscape
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\maybe@pair}
+% \changes{v2.95}{2002/12/03}{added}
+% \changes{v2.97e}{2007/11/26}{works really}
+% Test whether the following parameter is of kind \texttt{\meta{first
+% argument}:\meta{second argument}}. If so \cs{@tempa} will become \meta{first
+% argument} and \cs{@tempb} will become \meta{second argument} and
+% \cs{if@tempswa} will become \cs{iftrue}. Otherwise \cs{if@tempswa} is
+% \cs{iffalse} and \cs{@tempa} and \cs{@tempb} are not specified.
+% \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
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{macro}^^A \maybe@pair
+% \end{option}^^A paper
+%
+% \subsection{Special handling of \pkg*{geometry}}
+%
+% \begin{option}{usegeometry}
+% \changes{v3.17}{2015/02/07}{added}
+% \pkg*{typearea} optionally can pass several settings to package
+% \pkg{geometry}. The user decides whether or not to use this.
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@ifkey{usegeometry}{@ta@usegeometry}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}
+%
+%
+% \subsection{Setting the output paper size}
+%
+% The document paper format of option \opt{paper} is one thing. It is used
+% only for calculation of the dimensions used by \TeX{}. Originally
+% \textsc{dvi} does not know something like a paper size. It just contained
+% relative movements from the current position starting with the
+% origin. Setting up a page size depends on the output driver or back-end.
+%
+% \begin{option}{pagesize}
+% \changes{v2.7g}{2001/04/17}{added}
+% \changes{v2.95}{2002/08/27}{new implementation}
+% \changes{v3.02c}{2009/02/14}{new \opt{pagesize\quotechar=false}}
+% \changes{v3.05a}{2010/03/18}{new \opt{pagesize\quotechar=dvipdfmx}}
+% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}
+% \changes{v3.17a}{2015/05/03}{logic redesigned}
+% \changes{v3.20}{2015/07/10}{\file{luatex} as a synonym of \file{pdftex}}
+% This option is the main element for telling pdf\TeX, \file{dvips} or V\TeX{}
+% which paper size to use. It is also used by some deprecated options. Here
+% are the values and their meanings:
+% \begin{labeling}[~--]{\opt{automedia}}
+% \item[\opt{auto}] combination of options \opt{pdftex} and
+% \opt{dvips}.
+% \item[\opt{automedia}] like \opt{auto} with additional setting of
+% \cs{mediawidth} and \cs{mediaheight} if available.
+% \item[\opt{dvips}] adds a \file{dvips} \cs{special} to set the paper
+% size. This should be done only once in the document preamble. Usage inside
+% the document body is not fully supported and will raise a warning.
+% \item[\opt{dvipdfmx}] adds a \file{dvipdfmx} \cs{special} to set the
+% paper size.
+% \item[\opt{false}] switch of the automatic driver page size setting,
+% i.e., if there are changes inside the document.
+% \item[\opt{pdftex}] set \cs{pdfpagewidth} and \cs{pdfpageheight} if
+% available.
+% \end{labeling}
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@key{pagesize}[auto]{%
+ \KOMA@set@ncmdkey{pagesize}{@pagesizelast}{%
+ {off}{-1},{no}{-1},{false}{-1},%
+ {auto}{0},{automedia}{1},{dvips}{2},{pdftex}{3},{luatex}{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@pdftexpagesize
+ \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}
+% This internal macro stores the current value of option \opt{pagesize} and
+% is needed to use the correct signalling if option \opt{paper} is used
+% inside the document and the initial setup in |\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}{added}
+% \changes{v3.20}{2015/07/10}{if \cs{pdfpage\dots} does not exist
+% \cs{page\dots} will be tried (needed for lua\TeX{}~0.80.1)}
+% \begin{macro}{\set@dvipspagesize}
+% \changes{v2.95}{2002/08/27}{added}
+% \changes{v3.02c}{2009/02/13}{respecting \opt{seascape}}
+% \changes{v3.02c}{2009/02/14}{can be used inside the document}
+% \changes{v3.12}{2012/02/06}{not expanded
+% \cs{let}\cs{if@tempswa}\cs{if@dvips} does even work is the later is not
+% yet defined}
+% \changes{v3.28}{2019/11/18}{\cs{ifnotundefined} renamed into
+% \cs{Ifnotundefined}}
+% \begin{macro}{\setnot@dvipspagesize}
+% \changes{v2.95}{2002/08/27}{added}
+% \begin{macro}{\set@dvipdfmxpagesize}
+% \changes{v3.05a}{2010/03/18}{added}
+% \begin{macro}{\set@vtexpagesize}
+% \changes{v2.95}{2002/08/27}{added}
+% \changes{v3.28}{2019/11/18}{\cs{ifnotundefined} renamed into
+% \cs{Ifnotundefined}}
+% \begin{macro}{\scr@updatedvipspagesize}
+% \changes{v3.02c}{2009/02/14}{added}
+% \changes{v3.12}{2013/05/10}{deactivated, if \cs{XeTeXversion} exists}
+% Option \opt{pagesize} needs some internal macros.
+% \begin{description}
+% \item{Attention:} The definition of these macros may change at usage of
+% themselves or at |\begin{document}|.
+% \end{description}
+% First of all the definition from |\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}{use paper size update only for DVI and PS}
+% \changes{v3.12}{2012/02/06}{not expanded
+% \cs{let}\cs{if@tempswa}\cs{if@dvips} does even work if the later is not
+% yet defined}
+% Test whether unspecified \textsc{dvi} output or specified \textsc{ps} output
+% is used. Only in that cases the \textsc{ps} code for paper size updates will
+% be used.
+% \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}
+% If \cs{AtBeginShipoutNext} is available (mostly because of loading package
+% \pkg{atbegshi}) use it so execute the code at least before other code
+% that has been added to \cs{shipout}. Unfortunately this is not reliable. If
+% \cs{AtBeginShipout} is used after \cs{set@dvipspagesize} (this means the
+% recalculation of the typing area and the margins) but before the current
+% page has been shipped out the code of such \cs{AtBeginShipout} will be lost!
+% \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}
+% If \cs{AtNextShipout} is available (mostly because of loading package
+% \pkg{everyshi} use it to execute the code at least before other code
+% that has been added to \cs{shipout}. Unfortunately this is not reliable. If
+% \cs{AtNextShipout} or \cs{EveryShipout} is used after \cs{set@dvipspagesize}
+% (this means the recalculation of the typing area and the margins) but before
+% the current page has been shipped out the code of such \cs{AtNextShipout} or
+% \cs{EveryShipout} will be lost!
+% \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 this case (neither \textsc{DVI} nor \textsc{PS} output) we only have to
+% finish the group that has been used to keep changes of \cs{if@tempswa}
+% local.
+% \begin{macrocode}
+ \endgroup
+ \fi
+ }%
+ \else
+ \let\set@dvipspagesize=\setnot@dvipspagesize
+ \fi
+ \renewcommand*{\set@dvipdfmxpagesize}{%
+ \scr@ifdvioutput{%
+ \special{papersize=\the\paperwidth,\the\paperheight}%
+ }{}%
+ }%
+}
+% \end{macrocode}
+% And now the definition that is used before |\begin{document}| but executed
+% the first time inside |\begin{document}|.
+% \changes{v3.21}{2016/05/27}{two missing backslashs added}
+% \begin{macrocode}
+\newcommand*{\set@pdftexpagesize}{%
+ \scr@ifundefinedorrelax{pdfpagewidth}{%
+ \scr@ifundefinedorrelax{pagewidth}{}{\pagewidth=\paperwidth}%
+ }{\pdfpagewidth=\paperwidth}%
+ \scr@ifundefinedorrelax{pdfpageheight}{%
+ \scr@ifundefinedorrelax{pageheight}{}{\pageheight=\paperheight}%
+ }{\pdfpageheight=\paperheight}%
+}
+\newcommand*{\set@dvipspagesize}{%
+ \begingroup
+ \@tempswafalse
+ \scr@ifdvioutput{\@tempswatrue}{%
+ \Ifnotundefined{if@dvips}{%
+ \expandafter\let\csname if@tempswa\expandafter\endcsname
+ \csname if@dvips\endcsname
+ }{}%
+ }{}%
+% \end{macrocode}
+% \changes{v3.22}{2016/08/04}{\pkg{preview} workaround}
+% If package \pkg{preview} has been loaded with option \opt{tightpage},
+% which can be recognized by a defined macro \cs{pr@nextbb}, and if the
+% package is active, we do not add \textsc{dvi} specials, because it would
+% disturb Xe\LaTeX.
+% \begin{macrocode}
+ \scr@ifundefinedorrelax{pr@nextbb}{}{%
+ \expandafter\ifx\csname ifPreview\expandafter\endcsname
+ \csname iftrue\endcsname
+ \PackageInfo{typearea}{%
+ package `preview' with option `tightpage' detected.\MessageBreak
+ initial page size special deactivated%
+ }%
+ \@tempswafalse
+ \fi
+ }%
+ \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}%
+ }{}%
+}
+%</package&typearea&options>
+% \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}{added}
+% \changes{v2.95}{2002/08/27}{new implementation}
+% \changes{v2.98c}{2008/04/09}{replacement changed}
+% \changes{v2.98c}{2008/04/09}{info instead of warning}
+% \changes{v3.01a}{2008/11/21}{it's a standard option not deprecated}
+% This option is a kind of obsolete. It is now implemented using
+% \opt{pagesize}. But because this is a standard option using several other
+% packages we only show a standard option information instead of a deprecated
+% option warning. Note: Usage of \opt{pagesize=automedia} can still result
+% in a warning message!
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@DeclareStandardOption[typearea]{dvips}{%
+ pagesize=automedia%
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}
+%
+% \begin{option}{pdftex}
+% \changes{v2.7g}{2001/04/17}{added}
+% \changes{v2.95}{2002/08/27}{new implementation}
+% \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by \cs{PackageInfoNoLine}}
+% \changes{v3.01a}{2008/11/21}{it's a standard option not deprecated}
+% This option is a kind of obsolete. It is now implemented using
+% \opt{pagesize}. But because this is a standard option using several other
+% packages we only show a standard option information instead of a deprecated
+% option warning.
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@DeclareStandardOption[typearea]{pdftex}{%
+ pagesize=pdftex%
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}
+%
+% \subsection{Influencing left and right margin proportions}
+%
+% Options like \opt{twoside} or \opt{twocolumn} influence the
+% proportions of the left and right margin and indirectly also the top and the
+% bottom margin. They are also very important for the document classes.
+%
+% \begin{option}{oneside}
+% \changes{v2.97e}{2007/11/23}{pass option from class to \pkg*{typearea}}
+% \changes{v3.01a}{2008/11/21}{it's a standard option not deprecated}
+% \begin{option}{twoside}
+% \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by \cs{PackageInfoNoLine}}
+% \changes{v2.97e}{2007/11/23}{pass option from class to \pkg*{typearea}}
+% \changes{v3.00}{2008/07/09}{new option \opt{twoside\quotechar=semi}}
+% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}
+% \changes{v3.13a}{2014/04/09}{the class also uses status signaling with
+% \cs{FamilyKeyStateProcessed}}
+% \changes{v3.17}{2015/03/17}{automatic usage of \cs{flushbottom} and
+% \cs{raggedbottom}}
+% \changes{v3.17}{2015/03/17}{early setting of default}
+% \changes{v3.17}{2015/03/18}{use \cs{cleardoubleoddpage} if available}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{macro}{\if@semitwoside,\@semitwosidetrue,\@semitwosidefalse}
+% \changes{v3.00}{2008/07/09}{new boolean switch (intern)}
+% \begin{macro}{\if@twoside,\@twosidetrue,\@twosidefalse}
+% \changes{v3.00}{2008/07/09}{switch also sets \cs{if@semitwoside}}
+% Do we have a single sided or double sided layout?
+% \begin{macrocode}
+%<*package&typearea&options>
+\newif\if@semitwoside
+\g@addto@macro\@twosidetrue\@semitwosidefalse
+\g@addto@macro\@twosidefalse\@semitwosidefalse
+%</package&typearea&options>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+%<*(class|(package&typearea))&options>
+\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}{%
+% \end{macrocode}
+% \changes{v3.20}{2015/11/02}{not existing order dependency of
+% \opt{twocolumn} and \opt{twoside} fixed}
+% \changes{v3.27}{2019/03/05}{no special treatment for letters}
+% \changes{v3.27}{2019/03/05}{missing \cs{sloppy} in twocolumn mode added}
+% From v3.17 until 3.19a the classes used a local switch
+% \cs{if@tempswa}. As a result of this option \opt{twocolumn} was not
+% able to recognize double sided layout. Because of this it was essential to
+% handle option \opt{twocolumn} before option \opt{twoside}. This has
+% been solved using \cs{if@twoside} in the classes too. Another solution
+% could have been to move the implementation and execution of
+% \opt{twocolumn} before \opt{twoside}. But I don't know whether or not
+% this would have been reliable and the solution here is more simple.
+% \begin{macrocode}
+ @twoside%
+ }{#1}%
+ }%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+%<*class>
+ \expandafter\ifnum\scr@v@is@ge{3.17}%
+ \if@twoside\flushbottom
+ \else
+ \if@twocolumn\sloppy\flushbottom\else\raggedbottom\fi
+ \fi
+ \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}
+%</(class|(package&typearea))&options>
+% \end{macrocode}
+% \end{option}^^A twoside
+% \end{option}^^A oneside
+%
+% \begin{option}{onecolumn}
+% \changes{v2.95}{2002/12/04}{option moved to package \pkg*{typearea}}
+% \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by \cs{PackageInfoNoLine}}
+% \changes{v2.97e}{2007/11/23}{the classes pass the option to \pkg*{typearea}}
+% \changes{v3.01a}{2008/11/21}{standard option but not deprecated}
+% \begin{option}{twocolumn}
+% \changes{v2.95}{2002/12/04}{option moved to package \pkg*{typearea}}
+% \changes{v2.97e}{2007/11/23}{the classes pass the option to \pkg*{typearea}}
+% \changes{v2.98a}{2007/01/08}{passing the correct option}
+% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}
+% \changes{v3.13a}{2014/04/09}{the class also uses status signaling with
+% \cs{FamilyKeyStateProcessed}}
+% \changes{v3.20}{2016/02/16}{\cs{sloppy}, \cs{raggedbottom} and
+% \cs{flushbottom} delayed}
+% \changes{v3.27}{2019/03/05}{no extra treatment for letters}
+% Do we have a single column or two columns layout?
+% \begin{macrocode}
+%<*(class|(package&typearea))&options>
+\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>
+ \if@atdocument\expandafter\@firstofone
+ \else\@ifpackageloaded{typearea}{\expandafter\@firstofone}
+ {\expandafter\AtEndOfClass}\fi
+ {\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}
+%</(class|(package&typearea))&options>
+% \end{macrocode}
+% \end{option}^^A twocolumn
+% \end{option}^^A onecolumn
+%
+%
+% \subsection{Influencing size of head and foot and margins}
+%
+% We have several options to influence the head hight and the foot height and
+% whether or not these are part of the typing area or the margins. We have also
+% an option to decide whether or not the margin notes are part of the typing
+% area or not.
+%
+% \begin{option}{headlines}
+% \changes{v2.95}{2002/12/06}{new implementation using \pkg{keyval}}
+% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}
+% \begin{option}{footlines}
+% \changes{v3.12}{2013/03/26}{added}
+% These are two of the recommended options to set the height of the page head
+% and footer. Here we set the height by the number of base lines. The number
+% is a factor to \cs{baselineskip} and therefore a real number.
+% \begin{macrocode}
+%<*package&typearea&options>
+\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}%
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}
+% \end{option}
+%
+% \begin{option}{headheight}
+% \changes{v2.98c}{2008/04/06}{added}
+% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}
+% \begin{option}{footheight}
+% \changes{v3.12}{2013/03/26}{added}
+% Instead of setting the height of the page head or footer by the number of
+% base lines, we can set it also using a length or length value. Note, via
+% \cs{documenclass} or \cs{usepackage} only length values are supported
+% (due to an expansion problem by the \LaTeX{} kernel with both commands).
+% \begin{macrocode}
+%<*package&typearea&options>
+\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}%
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}
+% \end{option}
+%
+% \begin{option}{headinclude}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% This options determines whether or not the head is part of the typing
+% area.
+% \begin{option}{headexclude}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by \cs{PackageInfoNoLine}}
+% \changes{v3.01a}{2008/11/21}{deprecated}
+% \begin{macro}{\if@hincl,\@hincltrue,\@hinclfalse}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% \changes{v2.97c}{2007/04/19}{direct initialization via \cs{if@hsl},
+% if already defined}
+% We use a boolean switch to store the decision.
+% \begin{macrocode}
+%<*package&typearea&options>
+\newif\if@hincl\@ifundefined{if@hsl}{}{\let\if@hincl\if@hsl}
+\KOMA@ifkey{headinclude}{@hincl}
+\KOMA@DeclareDeprecatedOption[typearea]{headexclude}{headinclude=false}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{macro}
+% \end{option}
+% \end{option}
+%
+% \begin{option}{headsepline}
+% \changes{v3.20}{2015/12/12}{\pkg*{typearea} itself reacts on \opt{headsepline}}
+% Until \KOMAScript{} v3.20 \pkg*{typearea} was not able to handle
+% sequences of options \opt{headsepline} and \opt{headinclude} to get
+% always a correct result. Until v3.18a \opt{headinclude} was prioritized
+% against \opt{headsepline} if used as global options but not if used via
+% \cs{KOMAoptions}. In v3.18a a bug has been fixed with the result that
+% \opt{headsepline} was prioritized against \opt{headinclude} if used
+% as global options. But intentionally
+% \opt{headinclude=false,}\opt{headsepline} or
+% \opt{headinclude=true,}\opt{headsepline=false} always should use the
+% setting of option \opt{headsepline} independent of setting this as
+% global options or using \cs{KOMAoptions}. Similar with
+% \opt{headsepline,}\opt{headinclude=false} or
+% \opt{headsepline=false,},\opt{headinclude} the setting of
+% \opt{headinclude} should be used. To achieve this \pkg*{typearea}
+% itself has to interpret not only \opt{headinclude} but also
+% \opt{headsepline} (as an alias of \opt{headinclude}).
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@key{headsepline}[true]{%
+ \KOMA@set@ifkey{headinclude}{@hincl}{#1}%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+ \KOMA@kav@replacebool{.typearea.\scr@pkgextension}{headinclude}{@hincl}%
+ \fi
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}^^A headsepline
+%
+% \begin{option}{footinclude}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% \begin{option}{footexclude}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by \cs{PackageInfoNoLine}}
+% \changes{v3.01a}{2008/11/21}{deprecated}
+% This options determines whether or not the page footer is part of the typing
+% area.
+% \begin{macro}{\if@fincl,\@fincltrue,\@finclfalse}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% \changes{v2.97c}{2007/04/19}{direct initialization via \cs{if@fsl},
+% if already defined}
+% We use a boolean switch to store the decision.
+% \begin{macrocode}
+%<*package&typearea&options>
+\newif\if@fincl\@ifundefined{if@fsl}{}{\let\if@fincl\if@fsl}
+\KOMA@ifkey{footinclude}{@fincl}
+\KOMA@DeclareDeprecatedOption[typearea]{footexclude}{footinclude=false}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{macro}
+% \end{option}
+% \end{option}
+%
+% \begin{option}{footsepline}
+% \changes{v3.23}{2017/03/03}{has to set \cs{if@fincl} instead of \cs{if@hincl}}
+% \changes{v3.20}{2015/12/12}{\pkg*{typearea} itself reacts on \opt{footsepline}}
+% Until \KOMAScript{} v3.20 \pkg*{typearea} was not able to handle
+% sequences of options \opt{footsepline} and \opt{footinclude} to get
+% always a correct result. Until v3.18a \opt{footinclude} was prioritized
+% against \opt{footsepline} if used as global options but not if used via
+% \cs{KOMAoptions}. In v3.18a a bug has been fixed with the result that
+% \opt{footsepline} was prioritized against \opt{footinclude} if used
+% as global options. But intentionally
+% \opt{footinclude=false,}\opt{footsepline} or
+% \opt{footinclude=true,}\opt{footsepline=false} always should use the
+% setting of option \opt{footsepline} independent of setting this as
+% global options or using \cs{KOMAoptions}. Similar with
+% \opt{footsepline,}\opt{footinclude=false} or
+% \opt{footsepline=false,},\opt{footinclude} the setting of
+% \opt{footinclude} should be used. To achieve this \pkg*{typearea}
+% itself has to interpret not only \opt{footinclude} but also
+% \opt{footsepline} (as an alias of \opt{footinclude}).
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@key{footsepline}[true]{%
+ \KOMA@set@ifkey{footinclude}{@fincl}{#1}%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+ \KOMA@kav@replacebool{.typearea.\scr@pkgextension}{footinclude}{@fincl}%
+ \fi
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}^^A footsepline
+%
+% \begin{option}{mpinclude}
+% \changes{v2.8q}{2002/03/28}{added}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% \begin{option}{mpexclude}
+% \changes{v2.8q}{2002/03/28}{added}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by \cs{PackageInfoNoLine}}
+% \changes{v3.01a}{2008/11/21}{deprecated}
+% Some documents have a lot of large margin notes. Optical these margin notes
+% are more part of the typing area than the margin. This options determines
+% whether or not margin notes should be part of the typing area.
+% \begin{macro}{\if@mincl,\@mincltrue,\@minclfalse}
+% \changes{v2.95}{2002/07/08}{new implementation using \pkg{keyval}}
+% We use a boolean switch to store the decision. Note, if the margin notes are
+% part of the typing area, you should increase the divisor.
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@ifkey{mpinclude}{@mincl}
+\KOMA@DeclareDeprecatedOption[typearea]{mpexclude}{mpinclude=false}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{macro}
+% \end{option}
+% \end{option}
+%
+%
+% \subsection{Typing area for the emulation of the standard classes}
+%
+% For the emulation of the standard classes we need a dedicated size of the
+% typing area, if and only if no explicit \opt{DIV} has been given by
+% option. The emulation of the standard classes is a class feature. We could
+% do it before \pkg*{typearea} and then deactivate initial setting of
+% margins and typing area. But it is more easy to use \cs{areaset} after
+% loading \pkg*{typearea}. The standard letter class cannot be emulated.
+% \begin{macrocode}
+%<*class&body&!letter>
+\if@scr@emulatestandardclasses
+ \Ifstr{\@lastdiv}{areaset}{}{%
+ \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
+%</class&body&!letter>
+% \end{macrocode}
+%
+% \subsection{Using a predefined divisor depending on the font size}
+%
+% Some years ago \pkg*{typearea} provides the feature to use a hard coded
+% or user defined divisor depending on the document font size. The feature to
+% define such predefined divisors is deprecated, because it can be used only
+% for integer font sizes in pt. Nevertheless, for compatibility reasons it is
+% still implemented.
+%
+% \begin{macro}{\ta@divlist}
+% \changes{v2.0e}{1994/10/28}{added}
+% \changes{v2.6}{2000/01/04}{the list provides values from font size 1\,pt}
+% \begin{macro}{\ta@divlistelse}
+% \changes{v2.6}{2000/01/04}{added}
+% We need a default settings for 10\,pt, 11\,pt and 12\,pt. But we define it
+% only if they has not been defined before. So classes could define other
+% defaults before loading \pkg*{typearea}.
+% \begin{macrocode}
+%<*package&typearea&init>
+\providecommand\ta@divlist{{}{}{}{}{}{}{}{}{}{8}{10}{12}}
+% \end{macrocode}
+% \end{macro}
+% If a font size does not have a predefined divisor, the following default
+% will be used:
+% \begin{macrocode}
+\providecommand\ta@divlistelse{1}
+%</package&typearea&init>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ta@divfor}
+% We also need a macro to get one of the values stored at \cs{ta@divlist}
+% depending on the font size given by the real number argument. The real
+% number will be rounded to the nearest integer.
+% \changes{v2.4g}{1996/11/04}{usage of the default value list}
+% \changes{v2.6}{2000/01/04}{usage of the extended list}
+% \changes{v2.8q}{2002/03/28}{respect option \opt{mpinclude}}
+% \changes{v2.96}{2006/08/11}{font size does not need to be an integer}
+% \changes{v3.25}{2018/03/05}{paper size test added}
+% \begin{macrocode}
+%<*package&typearea&body>
+\newcommand*{\ta@divfor}[1]{%
+ \ta@div=\z@
+ \expandafter\ifnum\scr@ta@v@is@ge{3.25}\relax
+ \ifnum \z@=\ifdim \paperwidth<207mm \z@\else\ifdim \paperwidth>213mm \z@
+ \else\ifdim \paperheight<294mm \z@\else
+ \ifdim \paperheight>300mm \z@\else \@ne\fi\fi\fi\fi
+ \PackageInfoNoLine{typearea}{%
+ With paper sizes other than (almost) `A4' predefined\MessageBreak
+ DIV values do not exist. Using DIV calculation for good\MessageBreak
+ line width (unless using `version=3.24` or prior)%
+ }%
+ \ta@div=\tw@
+ \fi
+ \fi
+ \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@
+ \fi
+ \ifnum \ta@div=\z@
+ \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}
+% If there is not default in the list we use the general default.
+% \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=\ifnum\number\ta@divlistelse>\m@ne
+ \ifcase \ta@divlistelse default%
+ \or calc%
+ \or calc%
+ \or classic%
+ \else\ta@divlistelse\fi\else\ta@divlistelse\fi
+ }%
+ \ta@div=\ta@divlistelse\relax
+ \else
+% \end{macrocode}
+% Otherwise we use the default of the list.
+% \begin{macrocode}
+ \xdef\@tempa{\expandafter\@car\@tempa\@nil}%
+ \ifx\@tempa\empty
+ \ta@div=\ta@divlistelse\relax
+ \else
+ \ta@div=\@tempa\relax
+ \fi
+ \fi
+ \fi
+}
+%</package&typearea&body>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{command}{\SetDIVList}
+% \changes{v2.1a}{1994/10/28}{new}
+% \changes{v2.6}{2000/01/04}{\cs{ta@divlist} holds values for font sizes from 1\,pt}
+% \changes{v3.24}{2017/07/23}{deprecated}
+% The command is deprecated. Don't use it any longer.
+% \begin{macrocode}
+%<*package&typearea&body>
+\newcommand*\SetDIVList[1]{%
+ \PackageWarning{typearea}{\string\SetDIVList\space is
+ deprecated!\MessageBreak
+ This command supports only integer font sizes\MessageBreak
+ in pt equal or greater than 10pt.\MessageBreak
+ Since version 2.6 the command is implemented\MessageBreak
+ for compatibility only. You should not use it\MessageBreak
+ any longer}%
+ \def\ta@divlist{{}{}{}{}{}{}{}{}{}#1}}
+% \end{macrocode}
+% \end{command}^^A \SetDIVList
+%
+% \begin{command}{\SetXDIVList}
+% \changes{v2.6}{2000/01/04}{neu}
+% \changes{v3.24}{2017/07/23}{deprecated}
+% The command is deprecated. Don't use it any longer.
+% \begin{macrocode}
+\newcommand*\SetXDIVList[1]{%
+ \PackageWarning{typearea}{\string\SetXDIVList\space is
+ deprecated!\MessageBreak
+ This command supports only integer font sizes\MessageBreak
+ in pt equal or greater than 10pt.\MessageBreak
+ Since version 3.0 the command is implemented\MessageBreak
+ for compatibility only. You should not use it\MessageBreak
+ any longer}%
+ \def\ta@divlist{#1}}
+%</package&typearea&body>
+% \end{macrocode}
+% \end{command}^^A \SetXDIVList
+%
+%
+% \subsection{Calculation of typing area and margins}
+%
+% The main purpose of the package is the calculation of the size of the
+% typeing area and the margins depending on a divisor. As an addition a
+% binding correction is included.
+%
+% The parameters and the calculation is needed before the options can be
+% processed.
+%
+% \begin{ilength}{\ta@bcor}
+% \changes{v2.2a}{1995/01/25}{definition of the dimension before option
+% \opt{BCOR}}
+% \changes{v2.7g}{2001/04/17}{definition using \cs{newlength} instead of
+% \cs{newdimen}}
+% We need a length to store the binding correction. It is initializes to 0\,pt
+% implicitly by \cs{newlength}.
+% \begin{macrocode}
+%<*package&typearea&options>
+\newlength{\ta@bcor}
+% \end{macrocode}
+% \end{ilength}
+%
+% \begin{macro}{\ta@div}
+% \changes{v2.2a}{1995/01/25}{definition of the dimension before option
+% \opt{BCOR}}
+% We need a counter for the divisor (aka \emph{DIV}). It is initializes to
+% 0\,pt implicitly by \cs{newcount}. So it is not a \LaTeX{} counter but a
+% \TeX{} counter.
+% \begin{macrocode}
+\newcount\ta@div
+%</package&typearea&options>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{ilength}{\ta@hblk,\ta@vblk}
+% Width of one horizontal resp. height of one vertical block.
+% \begin{macrocode}
+%<*package&typearea&body>
+\newlength{\ta@hblk}
+\newlength{\ta@vblk}
+%</package&typearea&body>
+% \end{macrocode}
+% \end{ilength}
+%
+% \begin{ilength}{\ta@temp}
+% Used several times instead of \cs{@tempdima}, \cs{@tempdimb} or another
+% temporary dimension or glue of the LaTeX{} kernel. Nevertheless I should
+% think about not using this temporary length any longer.
+% \begin{macrocode}
+%<*package&typearea&body>
+\newlength{\ta@temp}
+%</package&typearea&body>
+% \end{macrocode}
+% \end{ilength}
+%
+% \begin{option}{BCOR}
+% \changes{v2.2a}{1995/01/25}{added}
+% \changes{v2.95}{2002/12/04}{new implementation using \pkg{keyval}}
+% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% The value is written into the length \cs{ta@bcor}. Several symbolic values
+% are supported that have to be converted into a length. Note, while loading
+% the package symbolic values are nonsense.
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@key{BCOR}{%
+ \Ifstr{#1}{current}{}{%
+ \setlength{\ta@bcor}{#1}%
+ }%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}{BCOR}{#1}%
+}
+% \end{macrocode}
+% After loading the package we have to do a little bit more, because we need
+% to recalculate the areas.
+% \changes{v3.13}{2014/06/30}{\cs{FamilyKeyStateProcessed} added}
+% \changes{v3.24}{2017/07/23}{\cs{KOMA@kav@xreplacevalue} added}
+% \begin{macrocode}
+\AtEndOfPackage{%
+ \KOMA@key{BCOR}{%
+ \typearea[{#1}]{last}
+ \FamilyKeyStateProcessed
+ \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}{BCOR}{#1}%
+ }%
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}
+%
+% \begin{option}{DIV}
+% \changes{v2.2a}{1995/01/25}{new option}
+% \changes{v2.95}{2002/12/04}{new implementation using \pkg{keyval}}
+% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}
+% The value is written into the counter \cs{ta@div}. Several symbolic values
+% are supported and have to be converted into a counter. Note, while loading
+% the package symbolic values are nonsense.
+% \begin{macro}{\@lastdiv}
+% \changes{v3.30}{2020/03/24}{init the internal macro}
+% This internal macro stores the last value to option \opt{DIV}. It is
+% initialized with \cs{relax}.
+% \begin{macrocode}
+%<package&typearea&init>\newcommand*{\@lastdiv}{\z@}\let\@lastdiv\relax
+% \end{macrocode}
+% \end{macro}^^A \@lastdiv
+% \begin{macrocode}
+%<*package&typearea&options>
+\def\movet@reserved@a@to@nnil#1\@nnil{\def\reserved@a{#1}}%
+\KOMA@key{DIV}[calc]{%
+ \edef\@tempa{#1}%
+ \def\@tempb{last}\ifx\@tempa\@tempb\let\@tempa=\@lastdiv
+ \ifx\@tempa\relax\def\@tempa{current}\fi
+ \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
+ \expandafter\def\expandafter\@tempa\expandafter{\expandafter0\@tempa}%
+ \afterassignment\movet@reserved@a@to@nnil
+ \@tempcnta=\@tempa\relax\@nnil
+ \def\@tempb{\relax}\ifx\reserved@a\@tempb
+ \ta@div=\@tempcnta
+ \edef\@tempa{\the\ta@div}%
+ \else
+ \let\@tempa\relax
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifx\@tempa\relax
+ \FamilyKeyStateUnknownValue
+ \else
+ \FamilyKeyStateProcessed
+ \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}{DIV}{\@tempa}%
+ \fi
+}
+% \end{macrocode}
+% After loading the package we have to do a little bit more, because we need
+% to recalculate the areas.
+% \changes{v3.13}{2014/06/30}{\cs{FamilyKeyStateProcessed} added}
+% \changes{v3.24}{2017/07/23}{\cs{KOMA@kav@xreplacevalue} added}
+% \begin{macrocode}
+\AtEndOfPackage{%
+ \KOMA@key{DIV}{%
+ \typearea[current]{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}{DIV}{#1}%
+ }%
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}
+%
+% \begin{command}{\typearea}
+% This is the real reason for the package: calculation of typing area and
+% margins providing an optional binding correction and depending on a
+% divisor.
+% \begin{macro}{\@typearea}
+% \changes{v2.4n}{1997/05/28}{moved main calculation into \cs{@typearea}}
+% \changes{v2.95}{2002/08/20}{\cs{selectfont} added}
+% The calculation itself is done in \cs{@typearea}. This command does not need
+% any parameters because it uses \cs{ta@div} and \cs{ta@bcor}.
+% \begin{macrocode}
+%<*package&typearea&body>
+\newcommand*\@typearea{%
+% \end{macrocode}
+% First of all we have to take care to select the correct font. Because
+% otherwise we cannot depend on, e.g., \cs{baselineskip}.
+% \begin{macrocode}
+ \selectfont
+% \end{macrocode}
+% First calculation is about the horizontal block element size:
+% \begin{macrocode}
+ \ta@hblk=\paperwidth
+ \advance \ta@hblk by-\ta@bcor
+ \divide\ta@hblk by\ta@div
+% \end{macrocode}
+% The with of the margin note column depends in the horizontal block size,
+% whether or not is should be part of the typing area and whether of not we
+% have a double sided document.
+% \changes{v2.8q}{2002/03/28}{\cs{marginparwidth} depends on
+% \opt{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}
+% The left and right margin resp. the left margin of odd and even pages
+% depends also on the horizontal block width. The relation depends on whether
+% or not the document is double sided.
+% \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 \opt{BCOR} with
+% \opt{twoside\quotechar=semi}}
+% From v3.12 the binding correction is part of the inner margin also for
+% \opt{twoside=semi}. If compatibility to earlier release is selected the
+% binding correction with \opt{twoside=semi} is always added to the left
+% margin.
+% \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}
+% The width of the typing area is the paper width without the three blocks
+% used for the margins and without the binding correction.
+% \begin{macrocode}
+ \textwidth=\paperwidth
+ \advance\textwidth by-\ta@bcor
+ \advance\textwidth by-3\ta@hblk
+% \end{macrocode}
+% But, if the margin note column should be part of the typing area, it's width
+% has to be subtracted from the width of the typing area. We assume to place
+% the margin notes at the outer margin. But if the typing area is to narrow
+% for the margin note column, the width of margin note column will be
+% reduced. This can be done easily be swapping the two lengths.
+% \changes{v3.30}{2020/02/25}{orphan line break at end of warning message
+% removed}
+% \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%
+ }%
+ \@tempskipa=\marginparwidth
+ \marginparwidth=\textwidth
+ \textwidth=\@tempskipa
+ \fi
+ \fi
+% \end{macrocode}
+% Next the vertical size of a block.
+% \begin{macrocode}
+ \ta@vblk=\paperheight
+ \divide\ta@vblk by\ta@div
+% \end{macrocode}
+% The top margin depends on this vertical block size. But note, \TeX{} will
+% increase it by 1\,in.
+% \begin{macrocode}
+ \topmargin=-1in
+ \advance\topmargin by\ta@vblk
+% \end{macrocode}
+% And if head is not part of the typing area, the top margin has to be reduced
+% by the head size.
+% \begin{macrocode}
+ \if@hincl \else
+ \advance\topmargin by-\headheight
+ \advance\topmargin by-\headsep
+ \fi
+% \end{macrocode}
+% For the height of the typing area we use the paper size without the height
+% of head and footer. The head and footer may be part of the typing area or
+% not. If they are part of the typing area they reduce the height of it.
+% \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}
+% Last but not least we have take care that the typing area consists of an
+% integer number of text lines.
+% \changes{v2.96}{2006/09/12}{setting \cs{topskip}}
+% \changes{v2.97c}{2007/07/04}{setting \cs{maxdepth}}
+% \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}^^A \@typearea
+%
+% \begin{macro}{\ta@modiv}
+% Needed by \cs{typearea}. The first parameter will be divided by the second
+% one. \cs{ta@div} is set to the rounded result. Internally \cs{@tempdima} and
+% \cs{@tempdimb} are used.
+% \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} instead of \cs{ifnum}}
+% \begin{macrocode}
+ \ifdim \@tempdima<\@tempdimb
+ \advance\ta@div by\m@ne
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}^^A \ta@modiv
+%
+% \begin{macro}{\ta@temp@goodwidth}
+% Sets \cs{ta@temp} to the heuristic optimal line width depending on the
+% current font. An optimal line width has 66 up to 72 characters. Here we use
+% a value of 69 characters. We assume that such a line consists of 66 lower
+% case letters (minors) and three upper case letters (majors). Normally the
+% weight of a letter depends on the language but we use same weight for each
+% letter.
+% \changes{v2.7i}{2001/05/17}{avoid overflows if a very large font is used}
+% \changes{v2.8q}{2002/03/06}{\cs{normalfont} \cs{normalsize} added}
+% \changes{v2.95a}{2006/07/20}{fix of large font calculation}
+% \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}^^A \ta@temp@goodwidth
+%
+% \begin{command}{\AfterCalculatingTypearea}
+% \changes{v2.96a}{2006/11/29}{added}
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} replaced by
+% \cs{kernel@ifstar}}
+% Users can influence the behaviour of \cs{typearea} by a hook. The star
+% variation adds the code locally the non-star variation globally.
+% \begin{macrocode}
+\newcommand*{\AfterCalculatingTypearea}{%
+ \kernel@ifstar \l@addto@macro \g@addto@macro \@typearea@end
+}
+% \end{macrocode}
+% \begin{macro}{\@typearea@end}
+% \changes{v2.96a}{2006/11/29}{defined again but completely different}
+% Macro \cs{@typearea@end} is a hook that is executed at the end of
+% \cs{typearea} but before the activation of the new settings. So you can
+% change the result of \cs{typearea}.
+% \begin{macrocode}
+\newcommand*{\@typearea@end}{}
+% \end{macrocode}
+% \end{macro}^^A \@typearea@end
+% \end{command}^^A \AfterCalculatingTypearea
+%
+% \begin{command}{\activateareas}
+% \changes{v2.96a}{2006/11/29}{new name for old macro}
+% \changes{v3.17}{2015/02/07}{respect option \opt{usegeometry}}
+% This macro is used to activate the new typing area and margin settings
+% inside the document body. It is a hack, because is uses internal \LaTeX{}
+% kernel code.
+% \begin{macrocode}
+\newcommand*{\activateareas}{%
+% \end{macrocode}
+% First of all test, whether or not we are inside the document body. If not do
+% nothing.
+% \begin{macrocode}
+ \if@atdocument
+% \end{macrocode}
+% \changes{v3.23}{2017/04/03}{info instead of warning if used inside the
+% document body}
+% But if, we show an info, because it is a hack. It depends in the \LaTeX{}
+% release. Nevertheless, it seems to be stable from the very first \LaTeXe{}
+% release. So we use an info only. Before v3.23 we have used a warning.
+% \begin{macrocode}
+ \PackageInfo{typearea}{%
+ Using dirty hack to recalculate internal output\MessageBreak
+ dimensions of LaTeX%
+ }%
+% \end{macrocode}
+% Now, set several internal and none internal \LaTeX{}lengths to the new
+% dimensions.
+% \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}{adapt the \opt{parskip} settings}
+% From v3.17 changes of the typing area can immediately change some of the
+% \opt{parskip} settings. Before |\begin{document}| the change will be done
+% automatically at |\begin{document}| and therefore adding it here is correct.
+% \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}{new code for option \opt{usegeometry}}
+% If option \opt{usegeometry} is active we need to setup several options of
+% package \pkg{geometry}. We use \cs{scr@geometryargs} to store them. And
+% we either have to pass these options to \pkg{geometry} or define a new
+% geometry. In the second case we also need some hacks to make the new paper
+% size available for \pkg{geometry}.
+% \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)}
+% The initialization of the \pkg{geometry} options is empty. It will be
+% filled automatically by \cs{activateareas}.
+% \begin{macrocode}
+\newcommand*{\scr@geometryargs}{}
+% \end{macrocode}
+% \end{macro}^^A \scr@geometryargs
+% \end{command}^^A \activateareas
+%
+% \changes{v2.4g}{1996/11/04}{waste comments removed}
+% \changes{v2.7g}{2001/04/17}{new symbolic values \opt{current},
+% \opt{default}, \opt{calc}, \opt{classic}}
+% \changes{v2.8q}{2001/11/06}{new symbolic value \opt{last}}
+% \changes{v2.96}{2006/08/21}{warn if \cs{typearea} is used inside a group}
+% \changes{v3.10}{2011/09/13}{using \cs{scr@grouplevel@test}}
+% \changes{v3.12}{2013/03/26}{page footer height configurable}
+% \changes{v3.30}{2020/03/24}{\opt{current} after \cs{areaset} is \opt{areaset}}
+%
+% The symbolic values of the obligatory argument of \cs{typearea}:
+% \begin{center}\begin{tabular}{lll}
+% Symbol & Value & Meaning \\\hline\\[-2ex]
+% \opt{calc} & 2 & calculate a good value \\
+% \opt{classic} & 3 & \emph{mittelalterlicher Buchseitenkanon} \\
+% \opt{current} & --- & use the current value \\
+% \opt{default} & 0 & use a value from the list \\
+% \opt{last} & --- & use the value from the last usage of
+% \cs{typearea} \\
+% \opt{areaset} & --- & replace the current typing area \\
+% \end{tabular}\end{center}
+%
+% There is only one symbolic value that can be used as the optional argument:
+% \opt{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\@tempa\relax \def\@tempa{current}\fi
+ \fi
+ \Ifstr{\@tempa}{current}{%
+ \Ifstr{\@lastdiv}{areaset}{\let\@tempa\@lastdiv}{}%
+ }{}%
+ \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}
+% Before we do the calculation we need to start a new page if we are inside
+% the document's body.
+% \changes{v3.37}{2022/06/09}{fix for \LaTeX's build in two-column mode}%
+% Unfortunately a simple \cs{newpage} maybe not enough, because this only
+% starts a new page in \LaTeX's one-column mode. In \LaTeX's two-column mode
+% it only starts a new column, which could be a new page or not.
+% \begin{description}
+% \item[ToDo:] Maybe a simple \cs{clearpage} would be better, but less
+% compatible with \KOMAScript{} before version 3.37.
+% \end{description}
+% \begin{macrocode}
+ \if@atdocument
+ \newpage
+ \if@twocolumn\ifnum\@colnum=\z@\else\null\newpage\fi\fi
+ \fi
+% \end{macrocode}
+% \changes{v2.95a}{2006/07/20}{select document font size}%
+% And we need to select the document font size.
+% \begin{macrocode}
+ \normalsize
+% \end{macrocode}
+% Is the height of the page head already given or do we need to calculate
+% it. If we need to calculate it we use 1.25 of the base lines distance. This
+% gives enough room for optional separation lines (which are set outside if
+% use \pkg*{scrlayer-scrpage}).
+% \changes{v2.4n}{1997/05/28}{page head height depends on base line
+% distance}
+% \begin{macrocode}
+ \@ifundefined{ta@hh}{%
+ \headheight=1.25\baselineskip
+ }{%
+ \headheight=\ta@hh
+ }%
+% \end{macrocode}
+% The distance between the head and the text is always the same. Different
+% typographers recommend different values. A good value would result in a grid
+% that would be used for all lines of the page. But the distance should not to
+% large. Supposedly a good value would be the height of one text line. But
+% with head separation rule this wouldn't be a good value. So we use a
+% compromise.
+% \begin{macrocode}
+ \headsep=1.5\baselineskip
+% \end{macrocode}
+% The foot is a similar problem. But we have to setup also \len{footskip} not
+% only \len{footheight}.
+% \begin{macrocode}
+ \@ifundefined{footheight}{%
+ \newlength\footheight
+ }{}%
+ \@ifundefined{ta@fh}{%
+ \footheight=1.25\baselineskip
+ }{%
+ \footheight=\ta@fh
+ }%
+ \footskip=\dimexpr\footheight+2.25\baselineskip
+% \end{macrocode}
+% Some values also independent from the divisor and the binding correction.
+% \begin{macrocode}
+ \marginparsep=1cc
+ \marginparpush=0.45\baselineskip
+% \end{macrocode}
+% \changes{v2.4g}{1996/11/04}{\opt{DIV\quotechar=0} tries to use a value from the
+% default list}
+% Before we do the calculation we test, whether the resulting divisor is
+% 0. Values from 0 up to 3 are not possible because we use three parts for the
+% margins. So we can use 0 to get a value from the default value list if
+% available.
+% \changes{v2.5h}{1999/12/29}{warning message changed}
+% \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}{optional \emph{klassischer Buchseitenkanon}}
+% Another special case is if the divisor is 3. In this case we calculate a
+% divisor near to the \emph{klassischer Buchseitenkanon}. This means we try to
+% have the height of the typing area is as near as possible the width of the
+% paper. For classic paper size this should be a harmonious result.
+% \begin{macrocode}
+ \ifnum\ta@div=3
+ \typeout{DIV calculation for classic typearea.}%
+ \setlength{\ta@temp}{\paperwidth}%
+ \addtolength{\ta@temp}{-\ta@bcor}%
+% \end{macrocode}
+% Here we also need to take care for whether the head is part of the typing
+% area or the margin.
+% \begin{macrocode}
+ \if@hincl\else
+ \addtolength{\ta@temp}{\headheight}%
+ \addtolength{\ta@temp}{\headsep}%
+ \fi
+ \if@fincl\else
+ \addtolength{\ta@temp}{\footskip}%
+ \fi
+% \end{macrocode}
+% Sometimes we need more vertical space than available. In this case we use
+% another calculation. This will be defined later.
+% \changes{v2.5a}{1997/06/22}{\cs{ifdim} instead of \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}
+% Otherwise we can calculate the height of all vertical margins by the height
+% of the paper width (without binding correction)
+% \begin{macrocode}
+ \else
+ \setlength{\ta@temp}{\paperheight}%
+ \addtolength{\ta@temp}{-\paperwidth}%
+ \addtolength{\ta@temp}{\ta@bcor}%
+% \end{macrocode}
+% and from this the height of one block
+% \begin{macrocode}
+ \divide\ta@temp by3
+% \end{macrocode}
+% and this will result in a divisor.
+% \begin{macrocode}
+ \ta@modiv{\paperheight}{\ta@temp}%
+ \fi
+% \end{macrocode}
+% Here we do not need to respect \opt{mpinclude} because we do not use the
+% width of the typing area but the height of the paper.
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% If we did not found a good value until this point, we try to calculate the
+% optimal divisor.
+% \changes{v2.4n}{1997/05/28}{improved optimal divisor calculation}
+% \begin{macrocode}
+ \ifnum\ta@div <4
+ \typeout{DIV calculation for typearea with good linewidth.}%
+% \end{macrocode}
+% The width of the typing area could at most be the width of the paper without
+% the binding correction.
+% \begin{macrocode}
+ \setlength{\textwidth}{\paperwidth}%
+ \addtolength{\textwidth}{-\ta@bcor}%
+% \end{macrocode}
+% The optimal width would be the optimal line width.
+% \begin{macrocode}
+ \ta@temp@goodwidth
+% \end{macrocode}
+% In two column mode each text line has two such columns plus the column
+% separation width.
+% \changes{v2.8q}{2001/12/13}{\opt{DIVcalc} uses wider columns in two
+% column mode}
+% \begin{macrocode}
+ \if@twocolumn
+ \addtolength{\ta@temp}{\ta@temp}%
+ \addtolength{\ta@temp}{\columnsep}%
+ \fi
+% \end{macrocode}
+% Former releases used an iterative approach to get the best
+% divisor. Depending on the \TeX{} implementation and the paper size this
+% could be more or less slow. So we do a direct calculation starting with the
+% width of the left and right margin.
+% \begin{macrocode}
+ \setlength{\ta@hblk}{\paperwidth}%
+ \addtolength{\ta@hblk}{-\ta@temp}%
+% \end{macrocode}
+% This can be used to calculate the width of a block.
+% \begin{macrocode}
+ \divide\ta@hblk by3
+% \end{macrocode}
+% If this width is negative, we use a minimum width of 5\,mm.
+% \changes{v2.5a}{1997/06/22}{\cs{ifdim} instead of \cs{ifnum}.}
+% \begin{macrocode}
+ \ifdim \ta@hblk <\z@
+ \setlength{\ta@hblk}{5mm}%
+ \fi
+% \end{macrocode}
+% The width of block and the width of the paper can be used to calculate the
+% divisor.
+% \changes{v2.8q}{2002/03/28}{respect \opt{mpinclude} at the calculation
+% of the best divisor}
+% If option \opt{mpinclude} is active, we have to multiply the divisor with
+% $\frac{3}{3+m}$. $m$ is the number of blocks used for the margin notes. If
+% $m=1$ we have an factor of $\frac{3}{4}=0.75$. More difficult would be not
+% to use a number of blocks for the margin note column but a dedicated value
+% for the width of the margin note column.
+% \begin{macrocode}
+ \if@mincl
+ \setlength{\ta@temp}{.75\ta@hblk}%
+ \else
+ \setlength{\ta@temp}{\ta@hblk}%
+ \fi
+ \ta@modiv{\paperwidth}{\ta@temp}%
+% \end{macrocode}
+% Another difficulty would be, if the divisor now is optimal for the width but
+% result in a to large height. To find this out, we first calculate the typing
+% area and margins with the found divisor.
+% \begin{macrocode}
+ \@typearea
+% \end{macrocode}
+% Now, we test the vertical sizes. Again a minimum block size is of 5\,mm will
+% be used. But we have to take care the 1\,in of \TeX!
+% \changes{v2.5a}{1997/06/22}{\cs{ifdim} instead of \cs{ifnum}}
+% \begin{macrocode}
+ \setlength{\ta@temp}{-1in}%
+ \addtolength{\ta@temp}{5mm}%
+ \ifdim\topmargin <\ta@temp
+% \end{macrocode}
+% This would be the minimum top margin. If the margin is less, we need another
+% divisor. In this case we also have to recognize whether the page head and
+% footer are part of the margins or the typing area.
+% \changes{v2.5b}{1997/06/29}{take care for \opt{headinclude} and
+% \opt{footinclude} while calculating the divisor for minimum top
+% margin}
+% \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}
+% A solution for this difficulty has been found.
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% So now we have the final divisor and can do the final calculation.
+% \begin{macrocode}
+ \@typearea
+% \end{macrocode}
+% \changes{v2.0e}{1994/10/28}{write layout values to the \file{log} file}
+% \changes{v2.4i}{1996/11/11}{write to the \file{log} file later}
+% \changes{v2.4i}{1996/11/11}{execute \cs{@typearea@end} at the end of \cs{typearea}}
+% \changes{v2.4j}{1996/12/04}{\file{log} output with only one
+% \cs{textheight} but additional \cs{baselineskip}}
+% \changes{v2.5}{1997/06/17}{"`arithmetic overflow"' with \opt{landscape} fixed}
+% \changes{v2.95}{2004/01/30}{warning in two column mode fixed}
+% \changes{v3.00}{2008/10/08}{use \cs{ta@layoutinfo} to write the layout
+% values into the \file{log} file}
+% \changes{v3.01b}{2008/12/09}{warning for sub-optimal settings changed}
+% \changes{v3.26}{2018/07/16}{warning about long lines changed}
+% \changes{v3.26}{2018/07/16}{warning about small lines changed and
+% replaced by an info}
+% Last but not least we write some layout values into the \file{log} file. For
+% some of the information we need additional calculations, e.g., of a good
+% line width.
+% \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 estimated maximum\MessageBreak
+ limit of typographical good line width.\MessageBreak
+ You should e.g.
+ \ifnum\ta@div >6 decrease DIV, \fi
+ \ifdim\f@size\p@<\@xiipt\p@ increase fontsize\else
+ (increase fontsize)\fi\MessageBreak
+ or change papersize%
+ }%
+ \@tempcnta=-\@tempcnta
+ \else
+ \ifnum\@tempcnta>15
+ \PackageInfoNoLine{typearea}{%
+ Maybe no optimal type area settings!\MessageBreak
+ The detected line width is about
+ \the\@tempcnta\@percentchar\MessageBreak
+ smaller than the heuristically estimated maximum\MessageBreak
+ limit of typographical good line width.\MessageBreak
+ You could e.g. increase DIV%
+ \ifdim\f@size\p@>\@xpt\p@, decrease fontsize\fi\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}
+%
+% \begin{macro}{\ta@layoutinfo}
+% \changes{v3.00}{2008/10/08}{added}
+% Write several layout information into the \file{log} file. The first
+% argument is the current divisor and the second the discrepancy from the
+% optimal divisor or empty or \cs{relax}.
+% \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}^^A \ta@layoutinfo
+% \end{command}^^A \typearea
+%
+% \begin{command}{\recalctypearea}
+% \changes{v2.95}{2002/12/04}{added}
+% This command can be used to recalculate the typing area and the margins with
+% the divisor and the binding correction that has been used last. The command
+% is available only after loading the package. So it is an indicator if we
+% are in the load or the run-time phase of the package.
+% \begin{macrocode}
+\AtEndOfPackage{\newcommand*{\recalctypearea}{\typearea[current]{last}}}
+%</package&typearea&body>
+% \end{macrocode}
+% \end{command}
+%
+% Initially \cs{ta@bcor} and \cs{ta@div} are zero if is has not been set using
+% one of the options. The 0 divisor stands for using a value from the default
+% list. So the final initialization of the typing area and margins is very
+% easy.
+% \changes{v2.8q}{2001/11/06}{initialization using symbolic values \opt{current}}
+% \begin{macrocode}
+%<*package&typearea&final>
+\typearea[current]{current}
+%</package&typearea&final>
+% \end{macrocode}
+%
+% \subsection{Storage and reactivation of typing area and margin settings}
+%
+% \begin{command}{\storeareas}
+% \changes{v3.10}{2011/09/13}{added}
+% \changes{v3.18}{2015/05/20}{Hooks at the beginning and end of the defined macro}
+% You can store the current settings of the typing area and the margins in a
+% macro. If you use the macro later the stored settings will be restored.
+% \begin{macro}{\scr@grouplevel@test}
+% \changes{v3.10}{2011/09/13}{added}
+% Warn if restoring the settings is used inside a group.
+% \begin{macrocode}
+%<*package&typearea&body>
+\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\csname scr@storeareas@before@hook\noexpand\endcsname
+ \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@storeareas@before@current@hook\endcsname}%
+ \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}%
+ }%
+ \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@storeareas@after@current@hook\endcsname}%
+ \noexpand\csname scr@storeareas@after@hook\noexpand\endcsname
+ }%
+ }%
+ \reserved@a
+}
+% \end{macrocode}
+% \begin{command}{\BeforeRestoreareas,\AfterRestoreareas}
+% \changes{v3.18}{2015/05/20}{added}
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} replaced by \cs{kernel@ifstar}}
+% \begin{macro}{\scr@storeareashook,\scr@storeareas@before@hook,
+% \scr@storeareas@before@current@hook,\scr@storeareas@after@hook,
+% \scr@storeareas@after@current@hook}
+% \changes{v3.18}{2015/05/20}{added}
+% Adds code to one of the hooks of the macros defined by \cs{storeareas}.
+% The star variants adds code only to not yet defined macros. The non-star
+% variant also changes already defined macros.
+% \begin{macrocode}
+\newcommand*{\BeforeRestoreareas}{%
+ \kernel@ifstar{\scr@storeareashook{before@current}}%
+ {\scr@storeareashook{before}}%
+}
+\newcommand*{\AfterRestoreareas}{%
+ \kernel@ifstar{\scr@storeareashook{after@current}}%
+ {\scr@storeareashook{after}}%
+}
+\newcommand*{\scr@storeareashook}[2]{%
+ \expandafter\l@addto@macro\csname scr@storeareas@#1@hook\endcsname{#2}%
+}
+\newcommand*{\scr@storeareas@before@hook}{}
+\newcommand*{\scr@storeareas@before@current@hook}{}
+\newcommand*{\scr@storeareas@after@hook}{}
+\newcommand*{\scr@storeareas@after@current@hook}{}
+%</package&typearea&body>
+% \end{macrocode}
+% \end{macro}^^A \scr@storeareashook … \scr@storeareas@after@current@hook
+% \end{command}^^A \BeforeRestoreareas,\AfterRestoreareas
+% \end{macro}^^A \scr@grouplevel@test
+% \end{command}^^A \storeareas
+%
+% \subsection{Calculation of margins for a given typing area}
+%
+% Beside the calculation of the typing area and the margins by a divisor
+% \pkg*{typearea} also provides the calculation of margins for a given
+% typing area.
+%
+% \begin{option}{areasetadvanced}
+% \changes{v3.11}{2012/04/17}{added}
+% 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}
+%<*package&typearea&options>
+\KOMA@ifkey{areasetadvanced}{@areasetadvanced}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}
+%
+% \begin{command}{\areaset}
+% \changes{v2.1b}{1994/12/31}{\cs{headheight} depends on \cs{@ptsize}}
+% \changes{v2.6}{2000/01/04}{\cs{headheight} depends on \cs{f@size} instead
+% of \cs{@ptsize}}
+% \changes{v2.7g}{2001/04/17}{symbolic value \opt{current} for the
+% optional argument}
+% \changes{v2.95}{2002/12/05}{execute \cs{@typearea@end} at the end of
+% \cs{areaset}}
+% If we have given width and height of the typing area we still can calculate
+% the margins. Again we want to use this not only in the document preamble but
+% also in the document body.
+% \begin{macrocode}
+%<*package&typearea&body>
+\newcommand*\areaset[3][\z@]{%
+ \edef\@tempa{#1}\edef\@tempb{current}\ifx\@tempa\@tempb\else
+ \setlength{\ta@bcor}{#1}%
+ \fi
+% \end{macrocode}
+% We have to start a new page if we are inside the document body.
+% \begin{macrocode}
+ \if@atdocument\newpage\fi
+% \end{macrocode}
+% Then we do the calculation.
+% \changes{v2.96}{2006/09/12}{set \cs{topskip}}
+% \changes{v3.00}{2008/10/08}{use \cs{ta@layoutinfo} to write layout
+% information into the \file{log} file}
+% \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 v3.11 we will have an advanced version of \cs{areaset}. This
+% version takes care to option \opt{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 \opt{BCOR} with
+% \opt{twoside\quotechar=semi}}
+% If \opt{twoside=semi} is used, form v3.12 we add the binding correction
+% to the inner margin. If compatibility to version less than 3.12 has been
+% selected the binding correction will be added to the left margin.
+% \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 v3.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}
+% \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 \opt{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}}
+% \changes{v3.16a}{2015/02/11}{using \cs{footheight} for calculation of
+% page usage}
+% Since v3.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{command}
+%
+% \begin{command}{\AfterSettingArea}
+% \changes{v3.11}{2012/04/17}{added}
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} replaced by \cs{kernel@ifstar}}
+% 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}{%
+ \kernel@ifstar \l@addto@macro \g@addto@macro \@areaset@end
+}
+% \end{macrocode}
+% \begin{macro}{\@areaset@end}
+% \changes{v3.11}{2012/04/17}{added}
+% 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}{}
+%</package&typearea&body>
+% \end{macrocode}
+% \end{macro}
+% \end{command}
+%
+% \subsection{Deprecated options}
+%
+% Former versions of \KOMAScript{} had some options that are completely
+% deprecated since \KOMAScript{} 3.00. Most of them but not all are pattern
+% matching options.
+%
+% \begin{option}{DIVcalc,DIVclassic}
+% \changes{v2.4g}{1996/11/04}{added}
+% \changes{v2.95}{2002/12/04}{implemented using option \opt{DIV}}
+% \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by \cs{PackageInfoNoLine}}
+% \changes{v3.01a}{2008/11/21}{deprecated}
+% The former form of \opt{DIV=}\opt{calc} and \opt{DIV=}\opt{classic}.
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMA@DeclareDeprecatedOption[typearea]{DIVcalc}{DIV=calc}
+\KOMA@DeclareDeprecatedOption[typearea]{DIVclassic}{DIV=classic}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{option}^^A DIVcalc,DIVclassic
+%
+% \begin{option}{a...paper,b...paper,c...paper,d...paper}
+% Formerly \opt{a}\meta{integer}\opt{paper},
+% \opt{b}\meta{integer}\opt{paper},
+% \opt{c}\meta{integer}\opt{paper},
+% \opt{d}\meta{integer}\opt{paper} has been documented. Since
+% \KOMAScript{} v3.00 most of them are deprecated and has been replaced by
+% option \opt{paper}. Nevertheless, for compatibility these options and the
+% commands needed to recognize and handle them are still implemented.
+%
+%
+% \begin{macro}{\x@paper}
+% \begin{macro}{\x@@paper}
+% \changes{v2.5}{1997/06/17}{pattern matching of paper sizes}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \changes{v3.28}{2019/11/18}{\cs{ifnumber} renamed to \cs{Ifnumber}}
+% This macros will be needed when the paper size will be generated.
+% \begin{command}{\isopaper}
+% \changes{v2.5}{1997/06/17}{new}
+% \changes{v2.95}{2002/12/03}{upper case letters are also allowed}
+% \changes{v3.23}{2017/02/22}{using \cs{ISO@PaperNameToSize}}
+% Because \cs{isopaper} is used inside the paper size detection by pattern
+% matching to select a specific ISO/DIN paper size, it has to be defined
+% before the pattern matching will be done.
+% \begin{macrocode}
+%<*package&typearea&options>
+\newcommand\isopaper[2][a]{%
+% \end{macrocode}
+% The command has to parameters. The first one is optional and the basic size
+% given by one of the letters:
+% \begin{description}
+% \item[a] -- ISO/DIN A sizes
+% \item[b] -- ISO/DIN B sizes
+% \item[c] -- ISO/DIN C sizes
+% \item[d] -- ISO/DIN D sizes
+% \end{description}
+% The second and mandatory argument is the scale number
+% \begin{macrocode}
+ \ISO@PaperNameToSize[typearea]#1#2\@nil
+% \end{macrocode}
+% Select either landscape or portrait:
+% \changes{v2.97e}{2007/10/23}{landscape or portrait}
+% \changes{v3.22}{2016/07/29}{adapting paper orientation}
+% \begin{macrocode}
+ \expandafter\ifnum\scr@ta@v@is@ge{3.22}\relax
+ \scr@setpaperorientation
+ \else
+ \if@landscape\scr@switchpapersizes\fi
+ \fi
+}
+% \end{macrocode}
+% \pkg*{typearea} uses its own error message.
+% \begin{macro}{\scr@UnknownPaperSize@typearea}
+% \changes{v3.23}{2017/02/22}{new}
+% \begin{macrocode}
+\ProvideUnknownPaperSizeError{typearea}{%
+ \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}%
+}
+% \end{macrocode}
+% \end{macro}^^A \scr@UnknownPaperSize@typearea
+% \end{command}^^A \isopaper
+% \begin{macro}{\scr@setpaperorientation}
+% \changes{v3.22}{2016/07/29}{new}
+% Setup the paper orientation depending on \cs{if@landscape}.
+% \begin{macrocode}
+\newcommand*\scr@setpaperorientation{%
+ \ifdim\paperheight>\paperwidth
+ \if@landscape\scr@switchpapersizes\fi
+ \else
+ \if@landscape\else\scr@switchpapersizes\fi
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{\scr@switchpapersizes}
+% \changes{v3.22}{2016/07/29}{new}
+% Switches the two lengths \len{paperwidth} and \len{paperheight}.
+% \begin{macrocode}
+\newcommand*\scr@switchpapersizes{%
+ \@tempdima\paperwidth\paperwidth\paperheight\paperheight\@tempdima
+}
+% \end{macrocode}
+% \end{macro}^^A \scr@switchlength
+% \end{macro}^^A \scr@setpaperorientation
+% \begin{macro}{\iso@paper}
+% \changes{v2.95}{2002/12/03}{new}
+% Similar to \cs{isopaper} but with only one argument for the base size and
+% the scale number.
+% \begin{macro}{\iso@@paper}
+% \changes{v2.95}{2002/12/03}{new}
+% \changes{v3.28}{2019/11/18}{\cs{ifnumber} renamed to \cs{Ifnumber}}
+% The single argument is split into base size letter and scale number by
+% pattern matching.
+% \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
+}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{macro}^^A \iso@@paper
+% \end{macro}^^A \iso@paper
+%
+% \begin{option}{DIV...}
+% \begin{option}{BCOR...}
+% Formerly \opt{DIV}\meta{integer}, \opt{BCOR}\meta{length},
+% \opt{headlines}\meta{real} has been documented as options. Since
+% \KOMAScript{} 3.00 these have been replaced by \opt{DIV=}\meta{integer},
+% \opt{BCOR=}\meta{length} and
+% \opt{headlines=}\meta{real}. Nevertheless, for compatibility the
+% deprecated options are still handled by \cs{DeclareOption*} and so we
+% need several helper macros to recognize them.
+%
+%
+% \begin{macro}{\@BCOR}
+% \begin{macro}{\@@BCOR}
+% \changes{v2.5}{1997/06/17}{Single letter scanner replaced by pattern matching}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% Macro \cs{@BCOR} it needed to handle option \opt{BCOR\emph{BCOR}}. The
+% option is recognized by pattern matching.
+% \begin{macrocode}
+%<*(class|(package&typearea))&options>
+\newcommand*{\@BCOR}{\expandafter\@@BCOR\CurrentOption BCORBCOR\@@BCOR}
+\newcommand*{\@@BCOR}{}
+\def\@@BCOR #1BCOR#2BCOR#3\@@BCOR{%
+% \end{macrocode}
+% If it is option \opt{BCOR} the first argument is empty.
+% \begin{macrocode}
+ \Ifstr{#1}{}{%
+% \end{macrocode}
+% Additionally the third argument is |BCOR|.
+% \begin{macrocode}
+ \Ifstr{#3}{BCOR}{%
+% \end{macrocode}
+% Now, the second argument should be the size. If this is not the case, an
+% error has to be reported.
+% \changes{v3.22}{2016/07/29}{missing deprecated option warning added}
+% \changes{v3.28}{2019/11/18}{\cs{ifdimen} renamed to \cs{Ifdimen}}
+% \changes{v3.30}{2020/03/24}{avoid error message for unknown \opt{BCOR}
+% value to \cs{documentclass}}
+% \changes{v3.31}{2020/04/27}{improved valid value recognization}
+% \begin{macrocode}
+%<*class>
+ \Ifstrstart{#2}{=}{%
+ \edef\reserved@a{\noexpand\Ifdimen{\@gobble#2}}%
+ \reserved@a{\PassOptionsToPackage{BCOR#2}{typearea}}{\OptionNotUsed}%
+ }{%
+ \Ifdimen{#2}{\PassOptionsToPackage{BCOR#2}{typearea}}{\OptionNotUsed}%
+ }%
+%</class>
+%<*package>
+ \Ifdimen{#2}{%
+ \KOMA@UseDeprecatedOption{%
+ \PackageWarningNoLine{typearea}}{BCOR#2}{BCOR=#2}%
+ }{\scr@pti@nerr@r}%
+%</package>
+% \end{macrocode}
+% In all other cases it is not this option. So we report an error. Instead of
+% the error another option could be tested.
+% \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}{Single letter scanner replaced by pattern matching}
+% \changes{v3.22}{2016/07/29}{missing deprecated option warning added}
+% \changes{v3.28}{2019/11/18}{\cs{ifnumber} renamed to \cs{Ifnumber}}
+% \changes{v3.30}{2020/03/24}{avoid error message for unknown \opt{DIV}
+% value to \cs{documentclass}}
+% \changes{v3.31}{2020/04/27}{improved valid value recognization}
+% Here we use more or less the same functionality as with \cs{@BCOR} and \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>
+ \Ifstrstart{#2}{=}{%
+ \edef\reserved@a{\noexpand\Ifnumber{\@gobble#2}}%
+ \reserved@a{\PassOptionsToPackage{DIV#2}{typearea}}{\OptionNotUsed}%
+ }{%
+ \Ifnumber{#2}{\PassOptionsToPackage{DIV#2}{typearea}}{\OptionNotUsed}%
+ }%
+%</class>
+%<*package>
+ \Ifnumber{#2}{%
+ \KOMA@UseDeprecatedOption{%
+ \PackageWarningNoLine{typearea}}{DIV#2}{DIV=#2}%
+ }{\scr@pti@nerr@r}%
+%</package>
+ \else\scr@pti@nerr@r\fi
+% \end{macrocode}
+% The only difference is, that we do not report an error but also test for
+% \opt{BCOR}.
+% \begin{macrocode}
+ \else\@BCOR\fi
+}
+% \end{macrocode}
+% \end{macro}^^A \@@DIV
+% \end{macro}^^A \@DIV
+%
+% \begin{option}{headlines...}
+% \begin{macro}{\@headlines}
+% \begin{macro}{\@@headlines}
+% \changes{v2.7g}{2001/04/17}{neW pattern matching for the number of headlines}
+% The macros are needed to recognize the deprecated option
+% \opt{headlines\meta{integer}}.
+% \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
+}
+%</(class|(package&typearea))&options>
+% \end{macrocode}
+% \end{macro}^^A \@headlines
+% \end{macro}^^A \@@headlines
+%
+% Starting point for all the deprecated pattern matching options is
+% \cs{DeclareOption*} for command \cs{x@paper} that uses pattern
+% matching with \cs{x@@paper} to recognize the deprecated options. These
+% are needed not only for package \pkg*{typearea} but also for the classes.
+%
+% Back to the pattern matching. This one is the most simple of all.
+% \changes{v2.97e}{2007/10/23}{passing options \pkg*{typearea} using the new syntax}
+% \begin{macrocode}
+%<*(class|(package&typearea))&options>
+\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}
+%
+% \begin{macro}{\scr@pti@nerr@r}
+% \changes{v2.95}{2002/06/20}{\cs{OptionNotUsed} instead of \cs{PackageError}}
+% If the addition option is neither \opt{BCOR\dots} nor \opt{DIV\dots} nor
+% \opt{headlines} nor a known paper size, it is still unused.
+% \begin{macrocode}
+\newcommand*{\scr@pti@nerr@r}{
+%<class> \OptionNotUsed
+%<package> \@unknownoptionerror
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.97c}{2007/09/12}{\cs{lco@test} added to before pattern matching
+% of options}
+% \begin{macrocode}
+\DeclareOption*{%
+%<letter> \lco@test
+ \x@paper}
+%</(class|(package&typearea))&options>
+% \end{macrocode}
+% \end{option}^^A headline...
+% \end{option}^^A DIV...
+% \end{option}^^A BCOR...
+% \end{macro}^^A \x@paper
+% \end{macro}^^A \x@@paper
+% \end{option}^^A a...paper … d...paper
+%
+%
+% ^^A This part should stay at the end of the source file!
+% \subsection{Configuration file}
+%
+% At the very ending of the option section just before executing and
+% processing the options you can add additional options the
+% \pkg*{typearea}. This is a very seldom used feature and I recommend to
+% not use it any longer. If you need additional options use
+% |\BeforeFamilyProcessOptions[.typearea.sty]{KOMA}{...}|.
+%
+% \changes{v2.0e}{1994/10/28}{configuration file \file{typearea.cfg}}
+% \begin{macrocode}
+%<*package&typearea&options>
+\InputIfFileExists{typearea.cfg}{%
+ \typeout{%
+ ***************************************^^J%
+ * Local config file typearea.cfg used^^J%
+ ***************************************%
+ }
+}{}
+%</package&typearea&options>
+% \end{macrocode}
+%
+% \subsection{Option execution}
+%
+% The paper size and telling the back-end driver information about the paper
+% size are default. The default for the default paper size will be \opt{A4}
+% if nothing else was defined by a class. Execution of option \opt{twoside}
+% depends already on the setting of \cs{if@twoside} and
+% \cs{if@semitwoside}. This may be surprising but nevertheless is correct.
+% \changes{v2.3h}{1995/01/19}{\cs{relax} after \cs{ProcessOptions} added}
+% \changes{v2.96}{2006/08/18}{processing options in order of usage instead of
+% order of declaration}
+% \changes{v2.97c}{2007/04/19}{Usage of \cs{KOMAExecuteOptions} instead of
+% \cs{KOMAoptions}}
+% \changes{v2.97c}{2007/04/19}{Usage of \cs{KOMAProcessOptions} instead of
+% \cs{ProcessOptions}}
+% \changes{v2.97c}{2007/04/19}{set only options that are not an implicit
+% default}
+% \changes{v2.97c}{2007/07/18}{explicit setting of a valid value to
+% \opt{twoside}}
+% \changes{v3.12}{2013/11/11}{the default paper size is given by
+% \cs{defaultpagesize}}
+% \changes{v3.17}{2015/03/02}{\opt{pagesize} is default}
+% \begin{macro}{\defaultpapersize}
+% \changes{v3.12}{2013/11/11}{added}
+% The default paper size. Defined using \cs{providecommand} so it can be
+% changed by a class or wrapper package or \file{typearea.cfg} or somewhere
+% else before loading \pkg*{typearea}.
+% \begin{macrocode}
+%<*package&typearea&options>
+\providecommand*{\defaultpapersize}{A4}
+%</package&typearea&options>
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%<*package&typearea&options>
+\KOMAExecuteOptions{paper=\defaultpapersize,pagesize}
+\if@twoside
+ \if@semitwoside
+ \KOMAExecuteOptions{twoside=semi}
+ \else
+ \KOMAExecuteOptions{twoside}
+ \fi
+\else
+ \KOMAExecuteOptions{twoside=false}
+\fi
+\KOMAProcessOptions\relax
+%</package&typearea&options>
+% \end{macrocode}
+%
+% \Finale
+% \PrintChanges
+%
+\endinput
+% Local Variables:
+% mode: doctex
+% ispell-local-dictionary: "en_US"
+% eval: (flyspell-mode 1)
+% TeX-master: t
+% TeX-engine: luatex-dev
+% eval: (setcar (or (cl-member "Index" (setq-local TeX-command-list (copy-alist TeX-command-list)) :key #'car :test #'string-equal) (setq-local TeX-command-list (cons nil TeX-command-list))) '("Index" "mkindex %s" TeX-run-index nil t :help "makeindex for dtx"))
+% End: