summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/koma-script/source/scrlayer.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/koma-script/source/scrlayer.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/koma-script/source/scrlayer.dtx')
-rw-r--r--macros/latex/contrib/koma-script/source/scrlayer.dtx4319
1 files changed, 4319 insertions, 0 deletions
diff --git a/macros/latex/contrib/koma-script/source/scrlayer.dtx b/macros/latex/contrib/koma-script/source/scrlayer.dtx
new file mode 100644
index 0000000000..0fc52a4e68
--- /dev/null
+++ b/macros/latex/contrib/koma-script/source/scrlayer.dtx
@@ -0,0 +1,4319 @@
+% \CheckSum{4042}
+% \iffalse^^A meta-comment
+% ======================================================================
+% scrlayer.dtx
+% Copyright (c) Markus Kohm, 2012-2018
+%
+% 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 and of this work.
+%
+% This work has the LPPL maintenance status "author-maintained".
+%
+% The Current Maintainer and author of this work is Markus Kohm.
+%
+% This work consists of all files listed in manifest.txt.
+% ----------------------------------------------------------------------
+% scrlayer.dtx
+% Copyright (c) Markus Kohm, 2012-2018
+%
+% Diese Datei ist Teil der LaTeX2e KOMA-Script-Sammlung.
+%
+% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
+% Version 1.3c.
+% Die neuste Version dieser Lizenz ist
+% http://www.latex-project.org/lppl.txt
+% und Version 1.3c ist Teil aller Verteilungen von LaTeX
+% Version 2005/12/01 und dieses Werks.
+%
+% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
+% (allein durch den Autor verwaltet).
+%
+% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
+%
+% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
+% ======================================================================
+% \fi^^A meta-comment
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \iffalse^^A meta-comment
+%%% From File: $Id: scrlayer.dtx 3015 2018-09-03 10:51:32Z kohm $
+%<identify>%%% (run: identify)
+%<init>%%% (run: init)
+%<options>%%% (run: options)
+%<body>%%% (run: body)
+%<final>%%% (run: final)
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\begingroup
+ \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
+ \filedate$Date: 2018-09-03 12:51:32 +0200 (Mon, 03 Sep 2018) $
+ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
+ \filerevision$Revision: 3015 $
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\ProvidesFile{scrlayer.dtx}%
+ [\filedate\space\filerevision\space
+ KOMA-Script package source
+ }%
+\reserved@a
+%</dtx>
+%<*identify|doc>
+%<package>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+%<package>\ProvidesPackage{scrlayer}[%
+%<doc>\ProvidesFile{scrlayer.tex}[%
+%!KOMAScriptVersion
+%<package> package
+%</identify|doc>
+%<*dtx|identify|doc>
+ (defining layers and page styles)]
+%</dtx|identify|doc>
+%<*dtx>
+\ifx\documentclass\undefined
+ \input scrdocstrip.tex
+ \@@input scrkernel-version.dtx
+ \@@input scrstrip.inc
+ \KOMAdefVariable{COPYRIGHTFROM}{2012}
+ \generate{\usepreamble\defaultpreamble
+ \file{scrlayer.sty}{%
+ \from{scrlayer.dtx}{package,trace,scrlayer,identify}%
+ \from{scrlayer.dtx}{package,trace,scrlayer,init}%
+ \from{scrlayer.dtx}{package,trace,scrlayer,options}%
+ \from{scrlayer.dtx}{package,trace,scrlayer,body}%
+ \from{scrlayer.dtx}{package,trace,scrlayer,final}%
+ \from{scrlogo.dtx}{logo}%
+ }%
+ }
+
+ \batchinput{scrlayer-scrpage.dtx}
+ \batchinput{scrlayer-notecolumn.dtx}
+ \@@input scrstrop.inc
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
+ \documentclass{scrdoc}
+ \addtolength{\textwidth}{-1em}
+ \addtolength{\marginparwidth}{2em}
+ \addtolength{\oddsidemargin}{2em}
+ \usepackage[ngerman,english]{babel}
+ \usepackage{url,babelbib}\bibliographystyle{babalpha-fl}
+ \usepackage{listings}
+ \usepackage{scrhack}
+ \usepackage{etoolbox}
+ \pretocmd\DescribeMacro{\ifhmode\else\bigskip\noindent\fi}{}{}
+ \pretocmd\DescribeEnv{\ifhmode\else\bigskip\noindent\fi}{}{}
+ \pretocmd\DescribeOption{\ifhmode\else\bigskip\noindent\fi}{}{}
+
+ \CodelineIndex
+ \RecordChanges
+ \GetFileInfo{scrlayer.dtx}
+ \title{The \KOMAScript{} package \texttt{scrlayer}%
+ \footnote{This is version \fileversion\ of file \texttt{\filename}.}}
+ \date{\filedate}
+ \author{Markus Kohm}
+
+ \newenvironment{Explain}{\par}{\par}
+ \newcommand*{\length}{}
+ \let\length\Length
+ \let\endlength\endLength
+ \let\Macro\cs
+ \let\Length\Macro
+ \let\Package\textsf
+ \let\Class\Package
+ \let\File\texttt
+ \let\Option\texttt
+ \newcommand*{\KOption}[1]{\Option{#1}\texttt{=}}
+ \newcommand*{\OptionValue}[2]{\Option{#1}\texttt{=}\PValue{#2}}
+ \let\Counter\texttt
+ \let\Environment\texttt
+ \let\ShowOutput\quote
+ \let\endShowOutput\endquote
+ \let\Pagestyle\texttt
+ \newcommand*{\Parameter}[1]{\texttt{\marg{#1}}\linebreak[1]}
+ \newcommand*{\OParameter}[1]{\texttt{\oarg{#1}}\linebreak[1]}
+ \newcommand*{\MParameter}[2]{\texttt{(\meta{#1},\meta{#2})}\linebreak[1]}
+ \providecommand\PParameter[1]{\mbox{\texttt{\{#1\}}}\linebreak[1]}
+ \let\PName\meta
+ \let\PValue\texttt
+ \providecommand*{\autoref}[1]{\expandafter\AUTOREF#1:}
+ \providecommand*{\AUTOREF}{}
+ \makeatletter
+ \def\AUTOREF#1:#2:{%
+ \edef\@tempa{#1}%
+ \edef\@tempb{tab}\ifx\@tempa\@tempb table~\fi
+ \edef\@tempb{sec}\ifx\@tempa\@tempb section~\fi
+ \ref{#1:#2}%
+ }
+ \providecommand*{\IndexCmd}[2][]{}
+ \providecommand*{\textnote}[2][]{}
+ \providecommand*\eTeX{\leavevmode\hbox{$\varepsilon$}-\TeX}
+ \providecommand*\NTS{%
+ \leavevmode\hbox{$\cal N\kern-0.35em\lower0.5ex\hbox{$\cal T$}%
+ \kern-0.2emS$}}
+
+ \lstnewenvironment{lstcode}{\lstset{language=[LaTeX]TeX}}{}
+ \makeatother
+ \sloppy% YOU SHOULD NOT DO THIS!!!
+
+ \begin{document}
+ \maketitle
+ \DocInput{\filename}
+ \DocInput{scrlayer-scrpage.dtx}
+ \DocInput{scrlayer-notecolumn.dtx}
+ \bibliography{guide}
+ \PrintChanges
+ \PrintIndex
+ \end{document}
+%</dtx>
+% \fi^^A meta-comment
+%
+% \selectlanguage{english}
+%
+% \changes{v0.0}{2012/01/01}{Start of new package}
+% \changes{v0.9}{2014/07/25}{User documentation removed}
+%
+% \StopEventually{}
+%
+%
+% \section{Implementation of \Package{scrlayer}}
+%
+% This section if for developers only.
+%
+% \iffalse
+%<*package>
+%<*identify>
+% \fi
+%
+%\iffalse^^A meta-comment
+%</identify>
+%</package>
+%<*package|interface|class>
+%\fi^^A meta-comment
+%
+% \subsection{Initialising some Values before the Options}
+%
+% \iffalse^^A meta-comment
+%<*init>
+% \fi^^A meta-comment
+%
+% Initialisation before all options.
+%
+% While there are \KOMAScript{} options, we need \Package{scrkbase} to declare
+% them, but the interfaces also needs \Package{scrlayer} which already
+% includes \Package{scrkbase}.
+% \begin{macrocode}
+%<package>\RequirePackage{scrkbase}[2013/03/05]
+%<interface>\RequirePackage{scrlayer}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\scrlayer@AtEndOfPackage}
+% Initial \Macro{AtEndOfPackage}, but after end of package
+% \Macro{@firstofone}.
+% \begin{macrocode}
+\scr@ifundefinedorrelax{scrlayer@AtEndOfPackage}{%
+ \AtEndOfPackage{\let\scrlayer@AtEndOfPackage\@firstofone}%
+}{%
+ \ifx\scrlayer@AtEndOfPackage\@firstofone
+ \AtEndOfPackage{\let\scrlayer@AtEndOfPackage\@firstofone}%
+ \fi
+}
+\let\scrlayer@AtEndOfPackage\AtEndOfPackage
+% \end{macrocode}
+% \end{macro}^^A \sls@AtEndOfPackage
+%
+% \begin{macro}{\scrlayer@testunexpectedarg}
+% We'll have several \KOMAScript{} options, that didn't expect an
+% value. So we use this general helper to test the value and report an error
+% if it is not empty (or \Macro{relax}).
+% \begin{macrocode}
+%<*package>
+\newcommand*{\scrlayer@testunexpectedarg}[2]{%
+ \ifx\relax#2\relax\else
+ \PackageError{scrlayer}{unexpected value to `#1'}{%
+ Option `#1' doesn't expect any value.\MessageBreak
+ If you'll continue, the value `#2' will be ignored.%
+ }%
+ \fi
+}
+%</package>
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@testunexpectedarg
+%
+% \begin{macro}{\if@chapter}
+% We need this later. But it is something general. So we initialise it as
+% early as possible.
+% \begin{macrocode}
+%<*package>
+\scr@ifundefinedorrelax{if@chapter}{%
+ \newif\if@chapter
+ \scr@ifundefinedorrelax{chapter}{\@chapterfalse}{\@chaptertrue}%
+}{}
+% \end{macrocode}
+% \end{macro}^^A \if@chapter
+%
+% \begin{macro}{\if@mainmatter}
+% Some classes define \Macro{frontmatter} or \Macro{mainmatter}, but do not
+% define \Macro{if@mainmatter}. But we nee some information about the matter,
+% so in that case, we add it.
+% \begin{macrocode}
+\scr@ifundefinedorrelax{if@mainmatter}{%
+ \scr@ifundefinedorrelax{mainmatter}{%
+ \newif\if@mainmatter\@mainmattertrue
+ }{%
+ \PackageWarningNoLine{scrlayer}{%
+ \string\mainmatter\space defined without
+ \string\if@mainmatter!\MessageBreak
+ Note, that several packages need
+ \string\if@mainmatter\space\MessageBreak
+ to detect whether or no the main matter has been\MessageBreak
+ entered. So does scrlayer. Because of this\MessageBreak
+ it will extend \string\mainmatter, now%
+ }%
+ \newif\if@mainmatter\@mainmattertrue
+ \expandafter\def\expandafter\mainmatter\expandafter{%
+ \expandafter\@mainmattertrue\mainmatter}%
+ \scr@ifundefinedorrelax{frontmatter}{}{%
+ \expandafter\def\expandafter\frontmatter\expandafter{%
+ \expandafter\@mainmatterfalse\frontmatter}
+ }%
+ \scr@ifundefinedorrelax{backmatter}{}{%
+ \expandafter\def\expandafter\backmatter{%
+ \expandafter\@mainmatterfalse\backmattter}%
+ }%
+ }%
+}{}
+%</package>
+% \end{macrocode}
+% \end{macro}^^A \if@mainmatter
+%
+% \iffalse^^A meta-comment
+%</init>
+% \fi^^A meta-comment
+%
+%
+% \subsection{Process Options}
+%
+% \iffalse^^A meta-comment
+%<*body>
+% \fi^^A meta-comment
+%
+% The very first thing at the body is processing the options:
+% \begin{macrocode}
+%<*package|interface>
+\KOMAProcessOptions\relax
+%</package|interface>
+% \end{macrocode}
+%
+% \subsection{Body Initialisation}
+%
+% Currently not needed.
+%
+% \iffalse
+%</body>
+% \fi
+%
+%
+% \subsection{Extended Running Heads}
+%
+% Package \Package{scrpage2} changes and extends the running head mechanisms
+% of \LaTeX{} and the classes. Most of this are basic features an therefore
+% done already by \Package{scrlayer}. But not the deprecated options.
+%
+% \begin{option}{markcase}
+% \begin{description}
+% \item[\texttt{=\meta{setting}}] one of: \texttt{upper}, \texttt{lower},
+% \texttt{used}, or \texttt{ignoreuppercase}.
+% \end{description}\noindent
+% The two options \Option{markuppercase} and \Option{markusedcase} become
+% deprecated and are replace be the single option \Option{markcase}. Note,
+% that interface \Package{scrlayer-scrpage} has to delay this option to
+% overload case setting of option \Option{pagestyleset}.
+% \begin{macrocode}
+%<*options>
+\KOMA@key{markcase}{%
+%<interface&scrpage>\scrlayer@AtEndOfPackage{%
+ \begingroup
+ \KOMA@set@ncmdkey{markcase}{reserved@a}{%
+ {upper}{0},{lower}{1},{used}{2},%
+ {ignoreuppercase}{3},{nouppercase}{3},%
+ {ignoreupper}{3},{noupper}{3}%
+ }{#1}%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+ \aftergroup\FamilyKeyStateProcessed
+ \ifnum \reserved@a>\m@ne
+ \aftergroup\let\aftergroup\MakeMarkcase
+ \ifcase \reserved@a
+ \aftergroup\MakeUppercase
+ \aftergroup\scrlayer@forceignoreuppercasefalse
+ \or
+ \aftergroup\MakeLowercase
+ \aftergroup\scrlayer@forceignoreuppercasefalse
+ \or
+ \aftergroup\@firstofone
+ \aftergroup\scrlayer@forceignoreuppercasefalse
+ \else
+ \aftergroup\scrlayer@ignoreuppercase
+ \aftergroup\scrlayer@forceignoreuppercasetrue
+ \fi
+ \fi
+ \else
+ \aftergroup\FamilyKeyStateUnknownValue
+ \fi
+ \endgroup
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+ \KOMA@kav@removekey{.scrlayer.sty}{markcase}%
+ \KOMA@kav@xadd{.scrlayer.sty}{markcase}{#1}%
+ \fi
+%<interface&scrpage>}%
+}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @markcase\endcsname\relax
+%</interface&body>
+% \end{macrocode}
+% \begin{macro}{\MakeMarkcase}
+% We use this instead of, e.g., \Macro{MakeUppercase} for every layer! So the
+% name seams to be wrong, but it is common, so we use it here.
+% \begin{macrocode}
+%<*package&options>
+\@ifundefined{MakeMarkcase}{\let\MakeMarkcase\@firstofone}{}
+\ifx\MakeMarkcase\@firstofone
+ \KOMA@kav@replacevalue{.scrlayer.sty}{markcase}{used}%
+\else\ifx\MakeMarkcase\MakeUppercase
+ \KOMA@kav@replacevalue{.scrlayer.sty}{markcase}{upper}%
+ \else\ifx\MakeMarkcase\MakeLowercase
+ \KOMA@kav@replacevalue{.scrlayer.sty}{markcase}{lower}%
+ \else\ifx\MakeMarkcase\scr@ignoreuppercase
+ \KOMA@kav@replacevalue{.scrlayer.sty}{markcase}{ignoreuppercase}%
+\fi\fi\fi\fi
+% \end{macrocode}
+% \begin{macro}{\scrlayer@ignoreuppercase}
+% We span a group and set \Macro{uppercase} and \Macro{MakeUppercase} to
+% \Macro{@firstofone}.
+% \begin{macrocode}
+\DeclareRobustCommand*{\scrlayer@ignoreuppercase}[1]{%
+ \begingroup
+ \let\uppercase\@firstofone
+ \let\MakeUppercase\@firstofone
+ \expandafter\let\csname MakeUppercase \endcsname\@firstofone
+ #1%
+ \endgroup
+}
+% \end{macrocode}
+% This is almost enough, but standard classes still would show upper-case
+% letters at table of contents, list of figures, list of tables, index and
+% bibliography. So we need an additional workaround.
+% \begin{macro}{\ifscrlayer@forceignoreuppercase}
+% \begin{macrocode}
+\newif\ifscrlayer@forceignoreuppercase
+%</package&options>
+% \end{macrocode}
+% \end{macro}^^A \ifscrlayer@forceignoreuppercase
+% \end{macro}^^A \scrlayer@ignoreuppercase
+% \end{macro}^^A \MakeMarkcase
+% \end{option}^^A markcase
+%
+% \begin{macro}{\rightfirstmark}
+% \changes{v3.16}{2015/01/14}{new}
+% \begin{macro}{\rightbotmark}
+% \changes{v3.16}{2015/01/14}{new}
+% \begin{macro}{\righttopmark}
+% \changes{v3.16}{2015/01/14}{new}
+% \Macro{rightfirstmark} is simply the same like the \Macro{rightmark} of the
+% \LaTeX{} kernel. \Macro{rightbotmark} uses \Macro{botmark} instead of
+% \Macro{firstmark} and \Macro{righttopmark} uses \Macro{topmark}.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\rightfirstmark}{\expandafter\@rightmark\firstmark\@empty\@empty}
+\newcommand*{\rightbotmark}{\expandafter\@rightmark\botmark\@empty\@empty}
+\newcommand*{\righttopmark}{\expandafter\@rightmark\topmark\@empty\@empty}
+% \end{macrocode}
+% \end{macro}^^A \righttopmark
+% \end{macro}^^A \rightbotmark
+% \end{macro}^^A \rightfirstmark
+%
+% \begin{macro}{\leftfirstmark}
+% \changes{v3.16}{2015/01/14}{new}
+% \begin{macro}{\leftbotmark}
+% \changes{v3.16}{2015/01/14}{new}
+% \begin{macro}{\lefttopmark}
+% \changes{v3.16}{2015/01/14}{new}
+% \Macro{leftbotmark} is simply the same like the \Macro{leftmark} of the
+% \LaTeX{} kernel. \Macro{leftfirstmark} uses \Macro{firstmark} instead of
+% \Macro{botmark} and \Macro{lefttopmark} uses \Macro{topmark}.
+% \begin{macrocode}
+\newcommand*{\leftfirstmark}{\expandafter\@leftmark\firstmark\@empty\@empty}
+\newcommand*{\leftbotmark}{\expandafter\@leftmark\botmark\@empty\@empty}
+\newcommand*{\lefttopmark}{\expandafter\@leftmark\topmark\@empty\@empty}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \lefttopmark
+% \end{macro}^^A \leftbotmark
+% \end{macro}^^A \leftfirstmark
+%
+% \begin{macro}{\headmark}
+% Inside a page style, this macro is either \Macro{rightmark} or
+% \Macro{leftmark}. Outside its \LaTeX-undefined and therefore it's not an
+% interface command, but has to be undefined:
+% \begin{macrocode}
+%<*package&body>
+\@ifundefined{headmark}{}{%
+ \PackageWarningNoLine{scrlayer}{%
+ \string\headmark\space detected!\MessageBreak
+ \string\headmark\space will either be set to
+ \string\rightmark\MessageBreak
+ or \string\leftmark inside of page styles.\MessageBreak
+ This means, that \string\headmark\space will be overwritten\MessageBreak
+ at every page layer usage!\MessageBreak
+ Nevertheless it will stay unchanged outside\MessageBreak
+ of page layers.\MessageBreak
+ I hope, this won't break your document%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \headmark
+%
+% \begin{macro}{\pagemark}
+% The page number together with its font setting. It's robust and will never
+% be part of the interface.
+% \begin{macrocode}
+%<*package&body>
+\@ifundefined{pagemark}{%
+ \DeclareRobustCommand\pagemark{{\pnumfont{\thepage}}}%
+}{}%
+% \end{macrocode}
+% \begin{macro}{\pnumfont}
+% \begin{macro}{\scr@fnt@pagenumber}
+% The low-level page number font command. It is deprecated to redefine or use
+% this and it may already be defined. These commands will not become part of
+% the interface!
+% \begin{macrocode}
+\@ifundefined{pnumfont}{%
+ \newcommand{\pnumfont}{\normalfont}%
+}{}
+\@ifundefined{scr@fnt@pagenumber}{%
+ \newcommand{\scr@fnt@pagenumber}{\pnumfont}%
+}{}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scr@fnt@pagenumber
+% \end{macro}^^A \pnumfont
+% \end{macro}^^A \pagemark
+%
+% \begin{macro}{\partmarkformat}
+% \begin{macro}{\chaptermarkformat}
+% \begin{macro}{\sectionmarkformat}
+% \begin{macro}{\GenericMarkFormat}
+% All the \Macro{\dots markformat} macros of \KOMAScript{} are also
+% supported by \Package{scrlayer} and it uses them actively. The generic
+% definition has been moved from \Macro{@seccntmarkformat} to
+% \Macro{GenericMarkFormat}. This is one more difference to
+% \Package{scrpage2}. The defaults are compatible to the standard
+% classes. These commands will not become part of the interface and other
+% interfaces should redefine them only, if they are not already defined.
+% \begin{macrocode}
+%<*package&body>
+\providecommand*{\partmarkformat}{\partname\ \thepart. \ }%
+\if@chapter
+ \providecommand*{\@chapapp}{\chaptername}%
+ \providecommand*{\chaptermarkformat}{\@chapapp\ \thechapter. \ }%
+ \providecommand*{\sectionmarkformat}{\thesection. \ }%
+\else
+ \providecommand*{\sectionmarkformat}{\GenericMarkFormat{section}}%
+\fi
+\scr@ifundefinedorrelax{@seccntmarkformat}{%
+ \providecommand*{\GenericMarkFormat}{\@seccntformat}%
+}{%
+ \providecommand*{\GenericMarkFormat}[1]{\@seccntmarkformat{#1}}%
+}
+%</package&body>
+% \end{macrocode}
+% Note, that the other \Macro{\dots markformat} will be defined by
+% \Macro{scrlayer@level@init}.
+% \end{macro}^^A \GenericMarkFormat
+% \end{macro}^^A \sectionmarkformat
+% \end{macro}^^A \chaptermarkformat
+% \end{macro}^^A \partmarkformat
+%
+% \begin{macro}{\@mkleft}
+% \changes{v3.25}{2017/10/13}{added to the \KOMAScript{} classes}
+% \begin{macro}{\@mkright}
+% \changes{v3.25}{2017/10/13}{added to the \KOMAScript{} classes}
+% \begin{macro}{\@mkdouble}
+% \changes{v3.25}{2017/10/13}{added to the \KOMAScript{} classes}
+% These are new in \Package{scrlayer}. They may be updated, whenever
+% \Macro{@mkboth} will be updated. Otherwise they get a working default
+% definition. These commands will not become part of the interface and other
+% interfaces should redefine them only, if they are not already defined.
+% \begin{macrocode}
+%<*(package|class)&body>
+\providecommand*{\@mkleft}{%
+ \IfActiveMkBoth{\markleft}{\@gobble}%
+}%
+\providecommand*{\@mkright}{%
+ \IfActiveMkBoth{\markright}{\@gobble}%
+}%
+\providecommand*{\@mkdouble}[1]{%
+ \@mkboth{#1}{#1}%
+}
+%</(package|class)&body>
+% \end{macrocode}
+% \end{macro}^^A \@mkdouble
+% \end{macro}^^A \@mkright
+% \end{macro}^^A \@mkleft
+%
+% \begin{macro}{\markleft}
+% \begin{macro}{\@markleft}
+% \LaTeX{} itself provides \Macro{markboth} and \Macro{markright} but not
+% \Macro{markleft}. So we add it.
+% \begin{macrocode}
+%<*package&body>
+\providecommand*{\markleft}[1]{%
+ \begingroup
+ \let\label\relax \let\index\relax \let\glossary\relax
+ \expandafter\@markleft\@themark {#1}%
+ \@temptokena \expandafter{\@themark}%
+ \mark{\the\@temptokena}%
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi
+}
+\providecommand{\@markleft}[3]{%
+ \@temptokena {#2}%
+ \unrestored@protected@xdef\@themark{{#3}{\the\@temptokena}}%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@markleft
+% \end{macro}^^A \markleft
+%
+%
+% \begin{option}{autooneside}
+% \begin{macro}{\ifscrlayer@autooneside}
+% Decide whether or not use the optional argument of \Macro{automark} in
+% single-side layout.
+% \begin{macrocode}
+%<*options>
+%<*package>
+\KOMA@ifkey{autooneside}{scrlayer@autooneside}\scrlayer@autoonesidetrue
+\KOMA@kav@replacebool{.scrlayer.sty}{autooneside}{scrlayer@autooneside}
+%</package>
+%<*interface>
+\KOMA@key{autooneside}[true]{%
+ \KOMA@set@ifkey{autooneside}{scrlayer@autooneside}{#1}%
+ \KOMA@kav@replacebool{.scrlayer.sty}{autooneside}{scrlayer@autooneside}%
+}
+%</interface>
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @autooneside\endcsname\relax
+%</interface&body>
+% \end{macrocode}
+% \end{macro}^^A \ifscrlayer@autooneside
+% \end{option}^^A autooneside
+%
+%
+% \begin{option}{automark}
+% \begin{option}{manualmark}
+% Maybe we will extend these options later. Currently they do almost the
+% same they do at \Package{scrpage2}. The difference is, that single-side or
+% two-side doesn't matter here (but it does inside of the definitions of the
+% marks itself).
+%
+% ToDo: Maybe \Option{manualmark} should become deprecated and
+% \Option{automark} should have simple values or a new option, that also
+% handles \Option{autooneside}?
+% \changes{v3.22}{2016/12/07}{prepared for classes without \cs{section} or
+% \cs{subsection}}^^A
+% \begin{macrocode}
+%<*options>
+\KOMA@key{automark}[]{%
+ \scrlayer@testunexpectedarg{automark}{#1}%
+ \scrlayer@AtEndOfPackage{%
+ \if@chapter
+ \scr@ifundefinedorrelax{section}{%
+ \automark{chapter}%
+ }{%
+ \automark[section]{chapter}%
+ }%
+ \else
+ \scr@ifundefinedorrelax{section}{%
+ \automark{}%
+ }{%
+ \scr@ifundefinedorrelax{subsection}{%
+ \automark{section}%
+ }{%
+ \automark[subsection]{section}%
+ }
+ }%
+ \fi
+ }%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@removekey{.scrlayer.sty}{automark}%
+ \KOMA@kav@removekey{.scrlayer.sty}{manualmark}%
+ \KOMA@kav@add{.scrlayer.sty}{automark}{}%
+}
+%</options>
+%<*interface&body>
+\expandafter\let\csname KV@KOMA.\@currname.\@currext @automark\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @automark@default\endcsname\relax
+%</interface&body>
+%<*options>
+\KOMA@key{manualmark}[]{%
+ \scrlayer@testunexpectedarg{manualmark}{#1}%
+ \scrlayer@AtEndOfPackage{\manualmark}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@removekey{.scrlayer.sty}{automark}%
+ \KOMA@kav@removekey{.scrlayer.sty}{manualmark}%
+ \KOMA@kav@add{.scrlayer.sty}{manualmark}{}%
+}
+%</options>
+%<*interface&body>
+\expandafter\let\csname KV@KOMA.\@currname.\@currext @manualmark\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @manualmark@default\endcsname\relax
+%</interface&body>
+% \end{macrocode}
+% \end{option}^^A manualmark
+% \end{option}^^A automark
+%
+% \begin{macro}{\manualmark}
+% Switch to manual marks. This resets \Macro{@mkleft}, \Macro{@mkright},
+% \Macro{@mkdouble}, \Macro{@mkboth} and the \Macro{\dots mark} of all known
+% levels.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\manualmark}{%
+ \begingroup
+ \def\@elt##1{%
+ \aftergroup\let\expandafter\aftergroup\csname ##1mark\endcsname
+ \aftergroup\@gobble
+ }%
+ \scrlayer@level@list
+ \endgroup
+ \let\@mkleft\@gobble
+ \let\@mkright\@gobble
+ \let\@mkdouble\@gobble
+ \let\@mkboth\@gobbletwo
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\automark}
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
+% ersetzt}^^A
+% \begin{macro}{\@automark}
+% This is the brain knot of the game! I'll try to explain, what I'm doing:
+% First of all the new starred version of \Macro{automark} doesn't reset the
+% mark commands. So it works cumulatively. This may be useful e.g. to have
+% chapter marks as long as no section marks have been made etc.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\automark}{%
+ \kernel@ifstar{\@automark}{\manualmark\@automark}%
+}
+\newcommand*{\@automark}[2][]{%
+ \ifstr{#2}{}{%
+ \ifstr{#1}{}{%
+% \end{macrocode}
+% \Macro{automark[]{}} or \Macro{automark{}} has been used. This will activate
+% the low level mark commands, but doesn't change the high level commands. It
+% may be useful or may not, the user should know what he does:
+% \begin{macrocode}
+ \automark@basics
+ }{%
+% \end{macrocode}
+% \Macro{automark[\dots]{}} has been used. This will activate the higher level
+% mark commands and also set up the right mark
+% \begin{macrocode}
+ \automark@basics
+ \automark@righthigh{#1}%
+ }%
+ }{%
+ \ifstr{#1}{}{%
+% \end{macrocode}
+% \Macro{automark[]{\dots}} or \Macro{automark{\dots}} has been used. This
+% will activate the low level mark commands and also set up either the left or
+% both marks.
+% \begin{macrocode}
+ \automark@basics
+ \automark@leftlow{#2}%
+ }{%
+% \end{macrocode}
+% \Macro{automark[\dots]{\dots}} has been used. This will activate the low
+% level mark commands and also both high level marks.
+% \begin{macrocode}
+ \automark@basics
+ \automark@both{#1}{#2}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\automark@basics}
+% Activate all low level \Macro{@mk\dots} commands:
+% \begin{macrocode}
+\newcommand*{\automark@basics}{%
+ \let\@mkleft\markleft
+ \let\@mkright\markright
+ \let\@mkboth\markboth
+ \def\@mkdouble##1{\@mkboth{##1}{##1}}%
+}
+% \end{macrocode}
+% \end{macro}^^A \automark@basics
+% \begin{macro}{\automark@righthigh}
+% Set up the right mark of a higher level, but in single-side layout only if
+% \Option{autooneside} hasn't been used. Note, that with this definition no
+% special handling for \KOMAScript's \Macro{addchap} and \Macro{addsec} is
+% needed.
+% \begin{macrocode}
+\newcommand*{\automark@righthigh}[1]{%
+ \ifscrlayer@level@prepared{#1}{%
+ \expandafter\def\csname #1mark\endcsname##1{%
+ \begingroup
+ \@tempswafalse
+ \if@twoside\@tempswatrue
+ \else\ifscrlayer@autooneside\else\@tempswatrue\fi\fi
+ \expandafter\endgroup
+ \if@tempswa
+ \@mkright{%
+ \MakeMarkcase{%
+ \ifnum \c@secnumdepth<\numexpr \csname #1numdepth\endcsname +0\relax
+ \else\if@mainmatter \csname #1markformat\endcsname\fi\fi
+ ##1%
+ }%
+ }%
+ \fi
+ }%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}^^A \automark@righthigh
+% \begin{macro}{\automark@leftlow}
+% Set up the left mark of a low level, but in single-side layout the right
+% mark has to be used.
+% \begin{macrocode}
+\newcommand*{\automark@leftlow}[1]{%
+ \ifscrlayer@level@prepared{#1}{%
+ \expandafter\def\csname #1mark\endcsname ##1{%
+ \if@twoside
+% \end{macrocode}
+% In two-side mode the left high mark has also to clear the right low
+% mark. This would be unwanted, if the left mark is a low mark and the right
+% mark is a high mark. But we cannot detect this if no right mark level has
+% been given. So we simply use:
+% \begin{macrocode}
+ \expandafter\@mkboth
+ \else
+% \end{macrocode}
+% In single-side mode there's no left high mark without a right low mark. So
+% instead of only a left high mark, we set up both marks.
+% \begin{macrocode}
+ \expandafter\@mkdouble
+ \fi
+ {%
+ \MakeMarkcase{%
+ \ifnum \c@secnumdepth<\numexpr \csname #1numdepth\endcsname +0\relax
+ \else\if@mainmatter \csname #1markformat\endcsname\fi\fi
+ ##1%
+ }%
+ }\@empty
+ }%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}^^A \automark@leftlow
+% \begin{macro}{\automark@both}
+% Set up both marks, but in single-side layout depending on
+% \Option{autooneside}.
+% \begin{macrocode}
+\newcommand*{\automark@both}[2]{%
+ \ifscrlayer@level@prepared{#1}{%
+ \ifscrlayer@level@prepared{#2}{%
+ \ifnum \numexpr \csname #1numdepth\endcsname +0\relax
+ > \numexpr \csname #2numdepth\endcsname +0\relax
+% \end{macrocode}
+% Level of left mark is greater than level of right mark. e.g., section >
+% chapter. This is unusual. Nevertheless we'll handle it.
+% \begin{macrocode}
+ \automark@leftlow{#2}%
+ \automark@righthigh{#1}%
+ \else \ifnum \numexpr \csname #1numdepth\endcsname +0\relax
+ = \numexpr \csname #2numdepth\endcsname +0\relax
+% \end{macrocode}
+% Level of left mark is equal to level of right mark. This is
+% nice and very easy to handle.
+% \begin{macrocode}
+ \expandafter\def\csname #2mark\endcsname##1{%
+ \@mkdouble{%
+ \MakeMarkcase{%
+ \ifnum \c@secnumdepth<\numexpr
+ \csname #2numdepth\endcsname +0\relax
+ \else
+ \if@mainmatter \csname #2markformat\endcsname\fi
+ \fi
+ ##1%
+ }%
+ }%
+ }%
+ \else
+% \end{macrocode}
+% Level of left mark is less than level of right mark. This is
+% usual.
+% \begin{macrocode}
+ \expandafter\def\csname #1mark\endcsname##1{%
+ \begingroup
+ \@tempswafalse
+ \if@twoside\@tempswatrue
+ \else\ifscrlayer@autooneside\else\@tempswatrue\fi\fi
+ \expandafter\endgroup
+ \if@tempswa
+ \@mkleft{%
+ \MakeMarkcase{%
+ \ifnum \c@secnumdepth
+ < \numexpr\csname #1numdepth\endcsname +0\relax
+ \else
+ \if@mainmatter \csname #1markformat\endcsname\fi
+ \fi
+ ##1%
+ }%
+ }%
+ \fi
+ }%
+ \expandafter\def\csname #2mark\endcsname##1{%
+ \@mkboth{}{%
+ \MakeMarkcase{%
+ \ifnum \c@secnumdepth
+ < \numexpr \csname #2numdepth\endcsname +0\relax
+ \else\if@mainmatter \csname #2markformat\endcsname\fi\fi
+ ##1%
+ }%
+ }%
+ }%
+ \fi
+ \fi
+ }{}%
+ }{}%
+}
+% \end{macrocode}
+% \begin{macro}{\ifscrlayer@level@prepared}
+% Test, whether or not this level has been prepared.
+% \begin{macrocode}
+\newcommand*{\ifscrlayer@level@prepared}[1]{%
+ \typeout{1: \detokenize{#1}}%
+ \scr@ifundefinedorrelax{#1numdepth}{%
+ \PackageError{scrlayer}{numbering depth of `#1' unknown}{%
+ Someone told me to use a section mark for level `#1',\MessageBreak
+ but the numbering depth hasn't been declared before. You may solve this
+ using\MessageBreak
+ \string\DeclareSectionNumberDepth{#1}{NUMBER}.%
+ }%
+ \@secondoftwo
+ }{%
+ \@firstoftwo
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \ifscrlayer@level@prepared
+% \end{macro}^^A \automark@both
+% \end{macro}^^A \@automark
+% \end{macro}^^A \automark
+%
+% \begin{macro}{\DeclareSectionNumberDepth}
+% \begin{description}
+% \item[\Parameter{string}:] the name of the section level, e.g.,
+% part, chapter, section etc. (must be fully
+% expandable and expand to a string).
+% \item[\Parameter{numeric expression}:] the section number depth of the
+% level, e.g., -1 for part, 0 for chapter etc.
+% \end{description}
+% Note that levels part, chapter, section, subsection, sub\dots subsection,
+% paragraph, subparagraph, sub\dots subparagraph, minisec, subminisec,
+% sub\dots subminisec will be recognised either at load time or at
+% \Macro{begin}\PParameter{document} automatically if they have the usual
+% levels.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\DeclareSectionNumberDepth}[2]{%
+ \expandafter\edef\csname #1numdepth\endcsname{\the\numexpr #2\relax}%
+ \@ifundefined{#1mark}{%
+ \expandafter\let\csname #1mark\endcsname\@gobble
+ }{}%
+ \@ifundefined{#1markformat}{%
+ \@namedef{#1markformat}{\GenericMarkFormat{#1}}%
+ }{}%
+ \begingroup
+ \@tempswatrue
+ \def\@elt##1{\ifstr{#1}{##1}{\@tempswafalse}{}}%
+ \scrlayer@level@list
+ \if@tempswa
+ \aftergroup\@firstofone
+ \else
+ \aftergroup\@gobble
+ \fi
+ \endgroup
+ {%
+ \l@addto@macro\scrlayer@level@list{\@elt{#1}}%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\scrlayer@level@list}
+% \begin{macro}{\scrlayer@level@init}
+% Stores all the existing levels.
+% \begin{macrocode}
+\newcommand*{\scrlayer@level@list}{}
+% \end{macrocode}
+% Usually all levels are known on loading this package, but if a package
+% defines additional levels later we'll do an additional test at
+% \Macro{begin}\PParameter{document}. But we do not redo the part and the
+% chapter test.
+% \begin{macrocode}
+\scr@ifundefinedorrelax{part}{}{%
+ \DeclareSectionNumberDepth{part}{-1}%
+}
+\if@chapter
+ \DeclareSectionNumberDepth{chapter}{0}%
+\fi
+\newcommand*{\scrlayer@level@init}{%
+ \@tempcnta=1
+ \def\reserved@b##1{%
+ \@tempswatrue
+ \def\reserved@a{##1}%
+ \@whilesw \if@tempswa \fi {%
+ \scr@ifundefinedorrelax{\reserved@a}{%
+ \@tempswafalse
+ }{%
+ \@ifundefined{\reserved@a numdepth}{%
+ \expandafter\DeclareSectionNumberDepth
+ \expandafter{\reserved@a}{\@tempcnta}%
+ }{%
+ \expandafter\DeclareSectionNumberDepth
+ \expandafter{\reserved@a}{\csname \reserved@a numdepth\endcsname}%
+ }%
+ \advance \@tempcnta by \@ne
+ \edef\reserved@a{sub\reserved@a}%
+ }%
+ }%
+ }%
+ \reserved@b{section}%
+ \reserved@b{paragraph}%
+ \reserved@b{minisec}%
+}
+\scrlayer@level@init
+\AtBeginDocument{%
+ \scrlayer@level@init
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@level@init
+% \end{macro}^^A \scrlayer@level@list
+% \end{macro}^^A DeclareSectionNumberDepth
+%
+%
+% \subsection{Providing Layers}
+%
+% A layer is a virtual sheet of paper stacked behind or above the real sheet
+% of paper. All the virtual and real sheets of one page may been seen
+% simultanous, but material o one sheet may overlap material on sheets below.
+% Layers provided by \Package{scrlayer} will not be stacked below or above
+% real sheets unless they are used by a page style.
+%
+% While we use \meta{key}\texttt{=}\meta{value} arguments for several of the
+% layer commands we define a new family with a new member:
+% \begin{macrocode}
+%<*package&body>
+\DefineFamily{KOMAarg}
+\DefineFamilyMember[.definelayer]{KOMAarg}
+%</package&body>
+% \end{macrocode}
+%
+% \begin{macro}{\DeclareLayer}
+% \begin{description}
+% \item[\OParameter{option list}:] a comma separated list of
+% \texttt{\meta{key}=\meta{value}} pairs.
+% \item[\Parameter{string}:] the name of the layer (must be fully expandable
+% and expand to a string only).
+% \end{description}
+% Layers are the basic elements of page styles. A layer has a name and several
+% attributes. The attributes may be set as comma separated list at the first,
+% optional argument of \cs{DeclareLayer}. The name must be set by the second,
+% mandatory argument.
+% \begin{macro}{\def@scr@l@pos}
+% And a second helper macro to easily define $x, y, w, h$ of a layer.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\def@scr@l@pos}[4]{%
+ \@namedef{scr@l@\scr@current@layer @x}{#1}%
+ \@namedef{scr@l@\scr@current@layer @y}{#2}%
+ \@namedef{scr@l@\scr@current@layer @w}{#3}%
+ \@namedef{scr@l@\scr@current@layer @h}{#4}%
+}
+% \end{macrocode}
+% \end{macro}^^A \def@scr@l@pos
+%
+% There are basic, primitive attributes and compounding attributes. The basic
+% attributes are:
+% \begin{description}
+% \item[\texttt{mode=\meta{command sequence}}:] the mode that should be used
+% to output the \texttt{contents}. A command \cs{layer\meta{command
+% sequence}mode} with one argument need to be defined.
+% \changes{v3.19}{2015/07/30}{new layer attribute \texttt{mode}}^^A
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{mode}{%
+ \scr@ifundefinedorrelax{layer#1mode}{\FamilyKeyStateUnknownValue}{%
+ \@namedef{scr@l@\scr@current@layer @mode}{#1}%
+ \FamilyKeyStateProcessed
+ }%
+}
+% \end{macrocode}
+% \item[\texttt{hoffset=\meta{dimension expression}}:] offset from the left
+% edge of the paper.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{hoffset}{%
+ \@namedef{scr@l@\scr@current@layer @x}{\dimexpr #1\relax}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \item[\texttt{voffset=\meta{dimension expression}}:] offset from the top
+% edge of the paper.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{voffset}{%
+ \@namedef{scr@l@\scr@current@layer @y}{\dimexpr #1\relax}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \item[\texttt{width=\meta{dimension expression}}:] width of the layer.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{width}{%
+ \@namedef{scr@l@\scr@current@layer @w}{\dimexpr #1\relax}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \item[\texttt{height=\meta{dimension expression}}:] height of the layer.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{height}{%
+ \@namedef{scr@l@\scr@current@layer @h}{\dimexpr #1\relax}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \item[\texttt{align=\meta{specification}}:] horizontal and vertical
+% alignment of the layer. The \meta{specification} will interpreted
+% character by character with the following valid characters:
+% \begin{itemize}
+% \item[l] -- align the layer with its left edge to the given horizontal
+% offset. This means, that the layer's width will span right from the
+% given horizontal offset.
+% \item[r] -- align the layer with its right edge to the given horizontal
+% offset. This means, that the layer's width will span left from the given
+% horizontal offset.
+% \item[c] -- align the layer centered to the given horizontal and vertical
+% offset. This means, that the given offsets are at the middle of the
+% layer width and total height.
+% \item[t] -- align the layer with its top edge to the given vertical
+% offset. This means that the layer's contents will span below the given
+% vertical offset.
+% \item[b] -- align the layer with its bottom edge to the given vertical
+% offset. This means, that the layer's contents will span above the given
+% vertical offset.
+% \end{itemize}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{align}{%
+ \@namedef{scr@l@\scr@current@layer @align}{#1}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \item[\texttt{contents=\meta{output}}:] whatever should be printed by the
+% layer.
+% \changes{v3.14}{2014/10/20}{\texttt{contents} is \cs{long}}^^A
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{contents}{%
+ \long\@namedef{scr@l@\scr@current@layer @contents}{#1}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \item[\texttt{background}:] restrict the layer to the page
+% background. This means, that the main contents of the page may overprint
+% the contents of the layer. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{background}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{background}{#1}%
+ \csname @scr@l@\scr@current@layer @backgroundtrue\endcsname
+ \csname @scr@l@\scr@current@layer @foregroundfalse\endcsname
+}
+% \end{macrocode}
+% \item[\texttt{foreground}:] restrict the layer to the page
+% foreground. This means, that the layer's contents may overprint the main
+% contents of the page. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{foreground}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{foreground}{#1}%
+ \csname @scr@l@\scr@current@layer @backgroundfalse\endcsname
+ \csname @scr@l@\scr@current@layer @foregroundtrue\endcsname
+}
+% \end{macrocode}
+% \item[\texttt{backandforeground}:] not really useful, but the counterpart of
+% the restrictions above.
+% \changes{v3.18}{2015/05/14}{new layer feature \texttt{backandforeground}}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{backandforeground}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{backandforeground}{#1}%
+ \csname @scr@l@\scr@current@layer @backgroundtrue\endcsname
+ \csname @scr@l@\scr@current@layer @foregroundtrue\endcsname
+}
+% \end{macrocode}
+% \item[\texttt{oddpage}:] restrict the layer to odd pages only. At
+% two-sided layout only pages with odd page numbers are odd pages. At
+% single-sided layout all pages are odd pages. Note, that this attribute has
+% no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{oddpage}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{oddpage}{#1}%
+ \csname @scr@l@\scr@current@layer @oddtrue\endcsname
+ \csname @scr@l@\scr@current@layer @evenfalse\endcsname
+}
+% \end{macrocode}
+% \item[\texttt{evenpage}:] restrict the layer to even pages only. At
+% two-sided layout only pages with even page numbers are even pages. At
+% single-sided layout there aren't even pages. Note, that this attribute has
+% no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{evenpage}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{evenpage}{#1}%
+ \csname @scr@l@\scr@current@layer @oddfalse\endcsname
+ \csname @scr@l@\scr@current@layer @eventrue\endcsname
+}
+% \end{macrocode}
+% \item[\texttt{oddorevenpage}:] do not restrict the layer to odd or even
+% pages.
+% \changes{v3.18}{2015/05/14}{new layer feature \texttt{oddorevenpage}}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{oddorevenpage}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{oddorevenpage}{#1}%
+ \csname @scr@l@\scr@current@layer @oddtrue\endcsname
+ \csname @scr@l@\scr@current@layer @eventrue\endcsname
+}
+% \end{macrocode}
+% \item[\texttt{evenoroddpage}:] same as \texttt{oddorevenpage}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{evenoroddpage}[\relax]{%
+ \PackageWarning{scrlayer}{Option `evenoroddpage' unknown.\MessageBreak
+ Using `oddorevenpage' instead}%
+ \ExecuteFamilyOptions[.definelayer]{KOMAarg}{oddorevenpage=#1}
+}
+% \end{macrocode}
+% \item[\texttt{oddandevenpages}:] same as \texttt{oddorevenpage}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{oddandevenpages}[\relax]{%
+ \PackageWarning{scrlayer}{Option `oddandevenpages' unknown.\MessageBreak
+ Using `oddorevenpage' instead}%
+ \ExecuteFamilyOptions[.definelayer]{KOMAarg}{oddorevenpage=#1}
+}
+% \end{macrocode}
+% \item[\texttt{evenandoddpages}:] same as \texttt{oddorevenpage}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{evenandoddpages}[\relax]{%
+ \PackageWarning{scrlayer}{Option `evenandoddpages' unknown.\MessageBreak
+ Using `oddorevenpage' instead}%
+ \ExecuteFamilyOptions[.definelayer]{KOMAarg}{oddorevenpage=#1}
+}
+% \end{macrocode}
+% \item[\Option{floatpage}:] restrict the layer to float pages.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{floatpage}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{floatpage}{#1}%
+ \csname @scr@l@\scr@current@layer @nonfloatpagefalse\endcsname
+ \csname @scr@l@\scr@current@layer @floatpagetrue\endcsname
+}
+% \end{macrocode}
+% \item[\Option{nonfloatpage}:] restrict the layer to pages, which aren't
+% float pages.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{nonfloatpage}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{nonfloatpage}{#1}%
+ \csname @scr@l@\scr@current@layer @nonfloatpagetrue\endcsname
+ \csname @scr@l@\scr@current@layer @floatpagefalse\endcsname
+}
+% \end{macrocode}
+% \item[\Option{floatornonfloatpage}:] don't restrict the layer to float or
+% non-float pages.
+% \changes{v3.18}{2015/05/14}{new layer feature \texttt{floatornonfloatpage}}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{floatornonfloatpage}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{floatornonfloatpage}{#1}%
+ \csname @scr@l@\scr@current@layer @nonfloatpagetrue\endcsname
+ \csname @scr@l@\scr@current@layer @floatpagetrue\endcsname
+}
+% \end{macrocode}
+% \item[\Option{nonfloatorfloatpage}:] same as \Option{floatornonfloatpage}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{nonfloatorfloatpage}[\relax]{%
+ \PackageWarning{scrlayer}{Option `nonfloatorfloatpage' unknown.\MessageBreak
+ Using `floatornonfloatpage' instead}%
+ \FamilyExecuteOptions[.definelayer]{KOMAarg}{floatornonfloatpage=#1}%
+}
+% \end{macrocode}
+% \item[\Option{floatandnonfloatpages}:] same as \Option{floatornonfloatpage}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{floatandnonfloatpages}[\relax]{%
+ \PackageWarning{scrlayer}{Option `floatandnonfloatpages' unknown.\MessageBreak
+ Using `floatornonfloatpage' instead}%
+ \FamilyExecuteOptions[.definelayer]{KOMAarg}{floatornonfloatpage=#1}%
+}
+% \end{macrocode}
+% \item[\Option{nonfloatandfloatpages}:] same as \Option{floatornonfloatpage}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{nonfloatandfloatpages}[\relax]{%
+ \PackageWarning{scrlayer}{Option `nonfloatandfloatpages' unknown.\MessageBreak
+ Using `floatornonfloatpage' instead}%
+ \FamilyExecuteOptions[.definelayer]{KOMAarg}{floatornonfloatpage=#1}%
+}
+% \end{macrocode}
+% \item[\Option{everypage}:] remove all odd-, even-, float-, and
+% nonfloat-restrictions.
+% \changes{v3.18}{2015/05/14}{new layer feature \texttt{everypage}}^^A
+% \changes{v3.22}{2016/09/24}{foreground and background condition
+% removed}^^A
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{everypage}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{everypage}{#1}%
+ \csname @scr@l@\scr@current@layer @oddtrue\endcsname
+ \csname @scr@l@\scr@current@layer @eventrue\endcsname
+ \csname @scr@l@\scr@current@layer @nonfloatpagetrue\endcsname
+ \csname @scr@l@\scr@current@layer @floatpagetrue\endcsname
+}
+% \end{macrocode}
+% \item[\Option{oneside}:] restrict the layer to pages on single-sided
+% layouts.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{oneside}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{oneside}{#1}%
+ \csname @scr@l@\scr@current@layer @twosidefalse\endcsname
+ \csname @scr@l@\scr@current@layer @onesidetrue\endcsname
+}
+% \end{macrocode}
+% \item[\Option{twoside}:] restrict the layer to pages on two-sided
+% layouts.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{twoside}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{twoside}{#1}%
+ \csname @scr@l@\scr@current@layer @twosidetrue\endcsname
+ \csname @scr@l@\scr@current@layer @onesidefalse\endcsname
+}
+% \end{macrocode}
+% \item[\Option{everyside}:] remove all one- or two-side restrictions.
+% \changes{v3.18}{2015/05/14}{new layer feature \texttt{everyside}}
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{everyside}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{everyside}{#1}%
+ \csname @scr@l@\scr@current@layer @twosidetrue\endcsname
+ \csname @scr@l@\scr@current@layer @onesidetrue\endcsname
+}
+% \end{macrocode}
+% \item[\Option{unrestricted}:] remove all restrictions
+% \changes{v3.18}{2015/05/14}{new layer feature \texttt{unrestricted}}^^A
+% \changes{v3.22}{2016/09/24}{missing background and foreground
+% condition}^^A
+% \changes{v3.22}{2016/09/24}{nonfloatpage condition fixed}^^A
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{unrestricted}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{unrestricted}{#1}%
+ \csname @scr@l@\scr@current@layer @oddtrue\endcsname
+ \csname @scr@l@\scr@current@layer @eventrue\endcsname
+ \csname @scr@l@\scr@current@layer @backgroundtrue\endcsname
+ \csname @scr@l@\scr@current@layer @foregroundtrue\endcsname
+ \csname @scr@l@\scr@current@layer @nonfloatpagetrue\endcsname
+ \csname @scr@l@\scr@current@layer @floatpagetrue\endcsname
+ \csname @scr@l@\scr@current@layer @twosidetrue\endcsname
+ \csname @scr@l@\scr@current@layer @onesidetrue\endcsname
+}
+% \end{macrocode}
+% \changes{v3.26}{2018/07/14}{new attribute \texttt{beforecontents}}^^A
+% \item[\Option{beforecontents}:] code to be executed immediately before
+% setting the contents. See also modification attribute
+% \texttt{addbeforecontents}.
+% \begin{macrocode}
+\FamilyCSKey[.definelayer]{KOMAarg}{beforecontents}
+ {scr@l@\scr@current@layer @precontents@hook}
+% \end{macrocode}
+% \changes{v3.26}{2018/07/14}{new attribute \texttt{aftercontents}}^^A
+% \item[\Option{aftercontents}:] code to be executed immediately before
+% setting the contents. See also modification attribute
+% \texttt{addaftercontents}.
+% \begin{macrocode}
+\FamilyCSKey[.definelayer]{KOMAarg}{aftercontents}
+ {scr@l@\scr@current@layer @postcontents@hook}
+% \end{macrocode}
+% \changes{v3.26}{2018/07/14}{new attribute \texttt{artifact}}^^A
+% \item[\Option{artifact}:] reserved for tagging packages. The artifact can
+% either be a boolean or a general value. Boolean false will unset the
+% attribute. Boolean true is the same like empty. All other values will be
+% stored.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{artifact}[true]{%
+ \FamilySetBool{KOMAarg}{artifact}{@tempswa}{#1}%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+ \if@tempswa
+ \expandafter\let\csname scr@l@\scr@current@layer @artifact\endcsname
+ \@empty
+ \else
+ \expandafter\let\csname scr@l@\scr@current@layer @artifact\endcsname
+ \relax
+ \fi
+ \else
+ \FamilyKeyStateProcessed
+ \@namedef{scr@l@\scr@current@layer @artifact}{#1}%
+ \fi
+}
+% \end{macrocode}
+% \end{description}
+%
+% Attribute modifications are attributes, that modify existing basic
+% attributes:
+% \begin{description}
+% \changes{v3.16}{2015/01/26}{new layer attribute \texttt{addhoffset}}^^A
+% \item[\texttt{addhoffset=\meta{dimension expression}}:] add to offset from
+% the left edge of the paper.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{addhoffset}{%
+ \expandafter\edef\csname scr@l@\scr@current@layer @x\endcsname{%
+ \noexpand\dimexpr \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@l@\scr@current@layer @x\endcsname + (#1)\relax}}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \changes{v3.16}{2015/01/26}{new layer attribute \texttt{addvoffset}}^^A
+% \item[\texttt{addvoffset=\meta{dimension expression}}:] add to offset from
+% the top edge of the paper.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{addvoffset}{%
+ \expandafter\edef\csname scr@l@\scr@current@layer @y\endcsname{%
+ \noexpand\dimexpr \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@l@\scr@current@layer @y\endcsname + (#1)\relax}}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \changes{v3.16}{2015/01/26}{new layer attribute \texttt{addwidth}}^^A
+% \item[\texttt{addwidth=\meta{dimension expression}}:] add to width of the
+% layer.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{addwidth}{%
+ \expandafter\edef\csname scr@l@\scr@current@layer @w\endcsname{%
+ \noexpand\dimexpr \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@l@\scr@current@layer @w\endcsname + (#1)\relax}}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \changes{v3.16}{2015/01/26}{new layer attribute \texttt{addheight}}^^A
+% \item[\texttt{addheight=\meta{dimension expression}}:] add to height of the
+% layer.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{addheight}{%
+ \expandafter\edef\csname scr@l@\scr@current@layer @h\endcsname{%
+ \noexpand\dimexpr \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@l@\scr@current@layer @h\endcsname + (#1)\relax}}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \changes{v3.16}{2015/01/26}{new layer attribute \texttt{addcontents}}^^A
+% \item[\texttt{addcontents=\meta{output}}:] append to whatever should be
+% printed by the layer.
+% \changes{v3.14}{2014/10/20}{\texttt{contents} is \cs{long}}^^A
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{addcontents}{%
+ \expandafter\edef\csname scr@l@\scr@current@layer @contents\endcsname{%
+ \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@l@\scr@current@layer @contents\endcsname #1}}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \changes{v3.16}{2015/01/26}{new layer attribute \texttt{pretocontents}}^^A
+% \item[\texttt{pretocontents=\meta{output}}:] prefix whatever should be
+% printed by the layer.
+% \changes{v3.14}{2014/10/20}{\texttt{contents} is \cs{long}}^^A
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{pretocontents}{%
+ \expandafter\edef\csname scr@l@\scr@current@layer @contents\endcsname{%
+ \unexpanded{#1}\unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@l@\scr@current@layer @contents\endcsname}}%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \changes{v3.26}{2018/07/14}{new attribute \texttt{addbeforecontents}}^^A
+% \item[\Option{addbeforecontents}:] code to be executed immediately before
+% setting the contents. The new code will be added before the old code.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{addbeforecontents}{%
+ \scr@ifundefinedorrelax{scr@l@\scr@current@layer @precontents@hook}{%
+ \expandafter\def
+ \csname scr@l@\scr@current@layer @precontents@hook\endcsname{#1}%
+ }{%
+ \expandafter\edef
+ \csname scr@l@\scr@current@layer @precontents@hook\endcsname{%
+ \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@l@\scr@current@layer @precontents@hook\endcsname}%
+ \unexpanded{#1}
+ }%
+ }%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \changes{v3.26}{2018/07/14}{new attribute \texttt{addaftercontents}}^^A
+% \item[\Option{addaftercontents}:] code to be executed immediately before
+% setting the contents. The new code will be added after the old code.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{addaftercontents}{%
+ \scr@ifundefinedorrelax{scr@l@\scr@current@layer @postcontents@hook}{%
+ \expandafter\def
+ \csname scr@l@\scr@current@layer @postcontents@hook\endcsname{#1}%
+ }{%
+ \expandafter\edef
+ \csname scr@l@\scr@current@layer @postcontents@hook\endcsname{%
+ \unexpanded{#1}%
+ \unexpanded\expandafter\expandafter\expandafter{%
+ \csname scr@l@\scr@current@layer @postcontents@hook\endcsname}%
+ }%
+ }%
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \end{description}
+%
+% Compounding attributes are attributes, that set up several basic attributes
+% with a single compounding attribute:
+% \begin{description}
+% \item[\texttt{page}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values spanning the whole
+% page aligned by the default alignment \texttt{tl}. Note, that this
+% attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{page}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{page}{#1}%
+ \def@scr@l@pos{\z@}{\z@}{\paperwidth}{\paperheight}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{topmargin}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the top
+% margin of the page and horizontally spanning the whole page aligned by the
+% default alignment \texttt{tl}. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{topmargin}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{topmargin}{#1}%
+ \def@scr@l@pos{\z@}{\z@}{\paperwidth}{\dimexpr \topmargin+1in\relax}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{head}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the page
+% head and horizontally spanning the text area aligned by usual head
+% alignment \texttt{bl}. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{head}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{head}{#1}%
+ \def@scr@l@pos{%
+ \dimexpr
+ \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi
+ \else\oddsidemargin\fi
+ +1in
+ \relax
+ }{%
+ \dimexpr \topmargin+1in+\headheight\relax
+ }{\textwidth}{\headheight}%
+ \@namedef{scr@l@\scr@current@layer @align}{bl}%
+}
+% \end{macrocode}
+% \item[\texttt{headsep}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the area
+% between page head and text area and horizontally spanning the text area
+% aligned by the default alignment \texttt{t}. Note, that this attribute
+% has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{headsep}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{head}{#1}%
+ \def@scr@l@pos{%
+ \dimexpr
+ \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi
+ \else\oddsidemargin\fi
+ +1in
+ \relax
+ }{%
+ \dimexpr \topmargin+1in+\headheight\relax
+ }{\textwidth}{\headsep}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{textarea}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values spanning the text area of
+% the page aligned by the default alignment \texttt{t}. Note, that this
+% attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{textarea}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{textarea}{#1}%
+ \def@scr@l@pos{%
+ \dimexpr
+ \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi
+ \else\oddsidemargin\fi
+ +1in
+ \relax
+ }{%
+ \dimexpr \topmargin+1in+\headheight+\headsep\relax
+ }{\textwidth}{\textheight}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{foot}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the page
+% footer and horizontally spanning the text area aligned by the usual footer
+% alignment \texttt{t}. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{foot}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{foot}{#1}%
+ \def@scr@l@pos{%
+ \dimexpr
+ \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi
+ \else\oddsidemargin\fi
+ +1in
+ \relax
+ }{%
+ \dimexpr \topmargin+1in+\headheight+\headsep+\textheight
+ +\footskip+\dp\strutbox-\footheight\relax
+ }{\textwidth}{\footheight}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{footskip}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the
+% distance from the text area to the page
+% footer and horizontally spanning the text area aligned by the usual footer
+% alignment \texttt{t}. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{footskip}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{foot}{#1}%
+ \def@scr@l@pos{%
+ \dimexpr
+ \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi
+ \else\oddsidemargin\fi
+ +1in
+ \relax
+ }{%
+ \dimexpr \topmargin+1in+\headheight+\headsep+\textheight\relax
+ }{\textwidth}{\dimexpr\footskip+\dp\strutbox-\footheight\relax}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{bottommargin}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the
+% page's bottom margin below the footer and horizontally spanning the page
+% by the default alignment \texttt{t}. Note, that this attribute has no
+% value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{bottommargin}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{bottommargin}{#1}%
+ \def@scr@l@pos{\z@}{%
+ \dimexpr \topmargin+1in+\headheight+\headsep
+ +\textheight
+ +\footskip+\dp\strutbox\relax
+ }{\paperwidth}{\dimexpr\paperheight-\layeryoffset\relax}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{leftmargin}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the page
+% and horizontally spanning the left margin of the page by the default
+% alignment \texttt{t}. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{leftmargin}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{leftmargin}{#1}%
+ \def@scr@l@pos{\z@}{\z@}{%
+ \dimexpr
+ \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi
+ \else\oddsidemargin\fi
+ +1in
+ \relax
+ }{\paperheight}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{rightmargin}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the page
+% and horizontally spanning the right margin of the page by the default
+% alignment \texttt{t}. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{rightmargin}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{rightmargin}{#1}%
+ \def@scr@l@pos{\paperwidth}{\z@}{%
+ \dimexpr \paperwidth-1in-\textwidth
+ -\if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi
+ \else\oddsidemargin\fi\relax
+ }{\paperheight}%
+ \@namedef{scr@l@\scr@current@layer @align}{tr}%
+}
+% \end{macrocode}
+% \item[\texttt{innermargin}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the page
+% and horizontally spanning the right margin of even pages and the left
+% margin of odd pages by the default alignment \texttt{t}. See attributes
+% \texttt{oddpage} and \texttt{evenpage} for more information about odd and
+% even pages. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{innermargin}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{innermargin}{#1}%
+ \def@scr@l@pos{%
+ \if@twoside
+ \ifodd\value{page} \z@
+ \else \dimexpr \evensidemargin+1in+\textwidth\relax
+ \fi
+ \else \z@\fi
+ }{\z@}{%
+ \dimexpr
+ \if@twoside\ifodd\value{page} \oddsidemargin+1in
+ \else \paperwidth-\layerxoffset\fi
+ \else \oddsidemargin+1in\fi
+ \relax
+ }{\paperheight}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{outermargin}:] set up \texttt{hoffset}, \texttt{voffset},
+% \texttt{width}, and \texttt{height} to values vertically spanning the page
+% and horizontally spanning the left margin of even pages and the right
+% margin of odd pages by the default alignment \texttt{t}. See attributes
+% \texttt{oddpage} and \texttt{evenpage} for more information about odd and
+% even pages. Note, that this attribute has no value!
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{outermargin}[\relax]{%
+ \FamilyKeyStateProcessed
+ \scrlayer@testunexpectedarg{outermargin}{#1}%
+ \def@scr@l@pos{%
+ \dimexpr
+ \if@twoside\ifodd\value{page} \oddsidemargin+1in+\textwidth
+ \else \z@\fi
+ \else \oddsidemargin+1in+\textwidth\fi
+ \relax
+ }{\z@}{%
+ \dimexpr
+ \if@twoside\ifodd\value{page}\paperwidth-\layerxoffset
+ \else \evensidemargin+1in\fi
+ \else \paperwidth-\layerxoffset\fi
+ \relax
+ }{\paperheight}%
+ \@namedef{scr@l@\scr@current@layer @align}{tl}%
+}
+% \end{macrocode}
+% \item[\texttt{area=\{\meta{hoffset}\}\{\meta{voffset}\}^^A
+% \{\meta{width}\}\{\meta{height}\}}:] set up
+% \texttt{hoffset}, \texttt{voffset}, \texttt{width}, and \texttt{height} to
+% the given values.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{area}{%
+ \def@scr@l@pos#1
+ \FamilyKeyStateProcessed
+}
+% \end{macrocode}
+% \changes{v3.26}{2018/07/14}{clone code for \texttt{precontents@hook},
+% \texttt{postcontents@hook} and \texttt{artifact} added}^^A
+% \item[\texttt{clone=\meta{layer}}:] set up the new layer by the settings
+% of the given \meta{layer}.
+% \begin{macrocode}
+\DefineFamilyKey[.definelayer]{KOMAarg}{clone}{%
+ \scr@ifundefinedorrelax{scr@l@#1@x}{%
+ \FamilyKeyStateUnknownValue
+ \PackageError{scrlayer}{layer `#1' undefined}{%
+ You can clone only already defined layers.\MessageBreak
+ If you'll continue, `clone=#1' will be ignored.%
+ }%
+ }{%
+ \FamilyKeyStateProcessed
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{mode}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{x}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{y}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{w}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{h}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{align}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{contents}%
+ \scrlayer@clone@switch{\scr@current@layer}{#1}{background}%
+ \scrlayer@clone@switch{\scr@current@layer}{#1}{foreground}%
+ \scrlayer@clone@switch{\scr@current@layer}{#1}{odd}%
+ \scrlayer@clone@switch{\scr@current@layer}{#1}{even}%
+ \scrlayer@clone@switch{\scr@current@layer}{#1}{oneside}%
+ \scrlayer@clone@switch{\scr@current@layer}{#1}{twoside}%
+ \scrlayer@clone@switch{\scr@current@layer}{#1}{floatpage}%
+ \scrlayer@clone@switch{\scr@current@layer}{#1}{nonfloatpage}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{precontents@hook}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{postcontents@hook}%
+ \scrlayer@clone@attribute{\scr@current@layer}{#1}{artifact}%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\scrlayer@clone@attribute}
+% \begin{macro}{\scrlayer@clone@switch}
+% Two helpers used at option \texttt{clone} to clone either a macro-based
+% attribute or a if-based attribute.
+% \begin{macrocode}
+\newcommand*{\scrlayer@clone@attribute}[3]{%
+ \expandafter\let\csname scr@l@#1@#3\expandafter\endcsname
+ \csname scr@l@#2@#3\expandafter\endcsname
+}
+\newcommand*{\scrlayer@clone@switch}[3]{%
+ \expandafter\let\csname if@scr@l@#1@#3\expandafter\endcsname
+ \csname if@scr@l@#2@#3\expandafter\endcsname
+}
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@clone@switch
+% \end{macro}^^A \scrlayer@clone@attribute
+% \end{description}
+%
+% \changes{v0.9}{2014/08/31}{missing reset of \cs{scr@current@layer}
+% added}%^^A
+% \changes{v3.14}{2014/10/20}{\cs{long}}^^A
+% \begin{macrocode}
+\newcommand{\DeclareLayer}[2][]{%
+ \def\scr@current@layer{#2}%
+ \@namedef{scr@l@#2@mode}{text}%
+ \@namedef{scr@l@#2@x}{\z@}%
+ \@namedef{scr@l@#2@y}{\z@}%
+ \@namedef{scr@l@#2@w}{\paperwidth}%
+ \@namedef{scr@l@#2@h}{\paperheight}%
+ \@namedef{scr@l@#2@align}{tl}%
+ \@namedef{scr@l@#2@contents}{}%
+ \expandafter\newif\csname if@scr@l@#2@background\endcsname
+ \csname @scr@l@#2@backgroundtrue\endcsname
+ \expandafter\newif\csname if@scr@l@#2@foreground\endcsname
+ \csname @scr@l@#2@foregroundtrue\endcsname
+ \expandafter\newif\csname if@scr@l@#2@odd\endcsname
+ \csname @scr@l@#2@oddtrue\endcsname
+ \expandafter\newif\csname if@scr@l@#2@even\endcsname
+ \csname @scr@l@#2@eventrue\endcsname
+ \expandafter\newif\csname if@scr@l@#2@oneside\endcsname
+ \csname @scr@l@#2@onesidetrue\endcsname
+ \expandafter\newif\csname if@scr@l@#2@twoside\endcsname
+ \csname @scr@l@#2@twosidetrue\endcsname
+ \expandafter\newif\csname if@scr@l@#2@floatpage\endcsname
+ \csname @scr@l@#2@floatpagetrue\endcsname
+ \expandafter\newif\csname if@scr@l@#2@nonfloatpage\endcsname
+ \csname @scr@l@#2@nonfloatpagetrue\endcsname
+ \FamilyExecuteOptions[.definelayer]{KOMAarg}{#1}%
+ \let\scr@current@layer\@empty
+}
+% \end{macrocode}
+% \begin{macro}{\scr@current@layer}
+% Helper to hold the current layer and only valid in non recursive calls of
+% \Macro{DeclareLayer}.
+% \begin{macrocode}
+\newcommand*{\scr@current@layer}{}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scr@current@layer
+% \end{macro}^^A \DeclareLayer
+%
+% \begin{macro}{\IfLayerExists}
+% \begin{description}
+% \item[\Parameter{string}:] the name of the layer (must be fully expandable
+% and expand to a string only).
+% \item[\Parameter{then code}:] will be executed, if the layer exists.
+% \item[\Parameter{else code}:] will be executed, if the layer doesn't exist.
+% \end{description}
+% Note, that we don't known really whether or not a layer exists, but have a
+% heuristic.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\IfLayerExists}[1]{%
+ \scr@ifundefinedorrelax{scr@l@#1@mode}{%
+ \expandafter\@secondoftwo
+ }{%
+ \expandafter\@firstoftwo
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}%^^A \IfLayerExists
+%
+% \begin{macro}{\DeclareNewLayer}
+% \changes{v3.14}{2014/10/20}{\cs{long}}^^A
+% \begin{macro}{\ProvideLayer}
+% \changes{v3.14}{2014/10/20}{\cs{long}}^^A
+% \begin{macro}{\RedeclareLayer}
+% \changes{v3.14}{2014/10/20}{\cs{long}}^^A
+% \begin{macro}{\ModifyLayer}
+% \changes{v3.14}{2014/10/20}{\cs{long}}^^A
+% \changes{v0.9}{2014/08/31}{missing definition and reset of
+% \cs{scr@current@layer} added}%^^A
+% There are also two commands for declaration of layers, that haven't been
+% declared before, with or without error message for already declared layers,
+% and two commands for changing already declared layers, first one beginning
+% again from scratch, second one for only setting up attributes, that should
+% be changed.
+% \begin{macrocode}
+%<*package&body>
+\newcommand{\DeclareNewLayer}[2][]{%
+ \IfLayerExists{#2}{%
+ \PackageError{scrlayer}{layer `#2' already defined}{%
+ You may declare only layer, that haven't been declared previously
+ using\MessageBreak
+ \string\DeclareNewLayer. See also the alternatives
+ \string\RedeclareLayer,\MessageBreak
+ \string\ModifyLayer\space and \string\ProvideLayer.\MessageBreak
+ If you'll continue, declaration will be ignored.}%
+ }{\DeclareLayer[{#1}]{#2}}%
+}
+\newcommand{\ProvideLayer}[2][]{%
+ \IfLayerExists{#2}{%
+%<*trace>
+ \PackageInfo{scrlayer}{\string\ProvideLayer{#2} ignored,\MessageBreak
+ because of already defined layer}%
+%</trace>
+ }{\DeclareNewLayer[{#1}]{#2}}%
+}
+\newcommand{\RedeclareLayer}[2][]{%
+ \IfLayerExists{#2}{}{%
+ \PackageError{scrlayer}{layer `#2' not yet defined}{%
+ You may declare only already declared layers using
+ \string\RedeclareLayer.\MessageBreak
+ See also the alternatives
+ \string\DeclareLayer and \string\ProvideLayer.\MessageBreak
+ Nevertheless, if you'll continue, declaration will be done.}%
+ }%
+ \DeclareLayer[{#1}]{#2}%
+}
+\newcommand{\ModifyLayer}[2][]{%
+ \IfLayerExists{#2}{%
+ \def\scr@current@layer{#2}%
+ \edef\reserved@a{%
+ \unexpanded{%
+ \FamilyExecuteOptions[.definelayer]{KOMAarg}{#1}%
+ \ifstr{\csname scr@l@#2@mode\endcsname}%
+ }{\csname scr@l@#2@mode\endcsname}%
+ }\reserved@a{}{%
+ \PackageWarning{scrlayer}{%
+ change of layer mode could result in unexpected\MessageBreak
+ output and errors%
+ }%
+ }%
+ \let\scr@current@layer\@empty
+ }{%
+ \PackageError{scrlayer}{layer `#2' not yet defined}{%
+ You may modify only already declared layers using
+ \string\ModifyLayer.\MessageBreak
+ See also the alternatives
+ \string\DeclareLayer and \string\ProvideLayer.\MessageBreak
+ Nevertheless, if you'll continue, declaration will be done.}%
+ \DeclareLayer[{#1}]{#2}%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \ModifyLayer
+% \end{macro}^^A \RedeclareLayer
+% \end{macro}^^A \ProvideLayer
+% \end{macro}^^A \DeclareNewLayer
+%
+% \begin{macro}{\ModifyLayers}
+% \changes{v3.26}{2018/07/14}{new}^^A
+% \changes{v3.26}{2018/08/29}{\cs{scr@trim@spaces} added}^^A
+% Like \cs{ModifyLayer} but allows a list of layers instead of only one layer.
+% For the commands \cs{DeclareLayer}, \cs{ProvideLayer} and
+% \cs{RedeclareLayer} this does not make any sense, so there are not similar
+% list commands for these commands.
+% \begin{macrocode}
+%<*package&body>
+\newcommand{\ModifyLayers}[2][]{%
+ \edef\scr@current@layer{#2}%
+ \@for\scr@current@layer:=\scr@current@layer\do{%
+ \scr@trim@spaces\scr@current@layer
+ \ifx\scr@current@layer\@emtpy\else
+ \edef\scr@current@layer{%
+ \unexpanded{\ModifyLayer[{#1}]}{\scr@current@layer}%
+ }%
+ \scr@current@layer
+ \fi
+ }%
+ \let\scr@current@layer\@empty
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \ModifyLayers
+%
+% \begin{macro}{\GetLayerContents}
+% \changes{v3.16}{2015/01/26}{new}
+% \begin{description}
+% \item[\Parameter{string}:] the name of the layer
+% \end{description}
+% Get the contents of the given layer.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\GetLayerContents}[1]{%
+ \IfLayerExists{#1}{\@nameuse{scr@l@#1@contents}}{%
+ \PackageError{scrlayer}{unknown layer `#1'}{%
+ You can ask only for the contents of an existing layer.}%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DestroyLayer}
+% \changes{v3.26}{2018/07/14}{destroy pre-contents hook, post-contents hook
+% and artifact}^^A
+% \begin{description}
+% \item[\Parameter{string}:] the name of the layer, that should be
+% destroyed
+% \end{description}
+% Note: Nothing will be done to remove the layer from a page style, but this
+% shouldn't matter, because layers with, e.g.,
+% \Macro{if@scr@l@\dots@nonfloatpage}=\Macro{relax} and
+% \Macro{if@scr@l@\dots@floatpage}=\Macro{relax} won't be output ever. This
+% command may and should be used by interfaces via
+% \Macro{scrlayerOnAutoRemoveInterface} to remove the generated
+% layers. Therefore it only destroys existing layers and doesn't care for not
+% existing.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\DestroyLayer}[1]{%
+ \IfLayerExists{#1}{%
+ \expandafter\let\csname scr@l@#1@mode\endcsname\relax
+ \expandafter\let\csname scr@l@#1@x\endcsname\relax
+ \expandafter\let\csname scr@l@#1@y\endcsname\relax
+ \expandafter\let\csname scr@l@#1@w\endcsname\relax
+ \expandafter\let\csname scr@l@#1@h\endcsname\relax
+ \expandafter\let\csname scr@l@#1@align\endcsname\relax
+ \expandafter\let\csname scr@l@#1@contents\endcsname\relax
+ \expandafter\let\csname if@scr@l@#1@background\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@backgroundfalse\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@backgroundtrue\endcsname\relax
+ \expandafter\let\csname if@scr@l@#1@foreground\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@foregroundfalse\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@foregroundtrue\endcsname\relax
+ \expandafter\let\csname if@scr@l@#1@odd\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@oddfalse\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@oddtrue\endcsname\relax
+ \expandafter\let\csname if@scr@l@#1@even\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@evenfalse\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@eventrue\endcsname\relax
+ \expandafter\let\csname if@scr@l@#1@oneside\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@onesidefalse\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@onesidetrue\endcsname\relax
+ \expandafter\let\csname if@scr@l@#1@twoside\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@twosidefalse\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@twosidetrue\endcsname\relax
+ \expandafter\let\csname if@scr@l@#1@floatpage\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@floatpagefalse\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@floatpagetrue\endcsname\relax
+ \expandafter\let\csname if@scr@l@#1@nonfloatpage\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@nonfloatpagefalse\endcsname\relax
+ \expandafter\let\csname @scr@l@#1@nonfloatpagetrue\endcsname\relax
+ \expandafter\let\csname scr@l@#1@precontents@hook\relax
+ \expandafter\let\csname scr@l@#1@postcontents@hook\relax
+ \expandafter\let\csname scr@l@#1@artifact\relax
+ }{%
+%<*trace>
+ \PackageInfo{scrlayer}{\string\DestroyLayer{#1} ignored,\MessageBreak
+ because that layer doesn't exist\MessageBreak
+ (any longer)%
+ }%
+%</trace>
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \DestroyLayer
+%
+%
+% \begin{macro}{\layercontentsmeasure}
+% \changes{v3.19}{2015/07/27}{\cs{@gobble} eliminated}^^A
+% This may used by used as the only value of the layer option
+% \texttt{contents} to show measure lines around the layer. The left and the
+% top measure line will be in centimeter, the right and the bottom measure
+% line in inch. With option \texttt{draft=true} this also be used
+% automatically and additionally for every layer of a page style.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\layercontentsmeasure}{%
+ \smash{\begin{picture}(0,0)
+ (0,\LenToUnit{%
+ \if t\layervalign -\ht\strutbox
+ \else
+ \if b\layervalign -\dimexpr\layerheight-\dp\strutbox\relax
+ \else -.5\dimexpr\layerheight+\ht\strutbox-\dp\strutbox\relax
+ \fi
+ \fi})
+% \end{macrocode}
+% 1st horizontal cm
+% \begin{macrocode}
+ \setlength{\unitlength}{1mm}%
+ \put(0,0){\line(1,0){\LenToUnit{\layerwidth}}}%
+ \@tempcnta=\numexpr \dimexpr\layerwidth + .5mm\relax/\dimexpr 1mm\relax\relax
+ \multiput(0,0)(1,0){\@tempcnta}{%
+ \line(0,-1){1}%
+ }%
+ \@tempcnta=\numexpr \dimexpr\layerwidth + 2.5mm\relax/\dimexpr 5mm\relax\relax
+ \multiput(0,0)(5,0){\@tempcnta}{%
+ \line(0,-1){2}%
+ }%
+ \@tempcnta=\numexpr \dimexpr\layerwidth + .5cm\relax/\dimexpr 1cm\relax\relax
+ \multiput(0,0)(10,0){\@tempcnta}{%
+ \put(0,0){\line(0,-1){3}}%
+ \put(0,-3.5){%
+ \makebox(0,0)[ct]{\the\numexpr\@tempcnta-\@multicnt\relax}}%
+ }%
+% \end{macrocode}
+% 2nd horizontal in:
+% \begin{macrocode}
+ \put(0,\LenToUnit{-\layerheight}){\line(1,0){\LenToUnit{\layerwidth}}}%
+ \@tempcnta=\numexpr \dimexpr\layerwidth + .05in\relax/\dimexpr .1in\relax\relax
+ \multiput(0,\LenToUnit{-\layerheight})(2.54,0){\@tempcnta}{%
+ \line(0,1){1}%
+ }%
+ \@tempcnta=\numexpr \dimexpr\layerwidth + .25in\relax/\dimexpr .5in\relax\relax
+ \multiput(0,\LenToUnit{-\layerheight})(12.7,0){\@tempcnta}{%
+ \line(0,1){2}%
+ }%
+ \@tempcnta=\numexpr \dimexpr\layerwidth + .5in\relax/\dimexpr 1in\relax\relax
+ \multiput(0,\LenToUnit{-\layerheight})(25.4,0){\@tempcnta}{%
+ \put(0,0){\line(0,1){3}}%
+ \put(0,3.5){%
+ \makebox(0,0)[cb]{\the\numexpr\@tempcnta-\@multicnt\relax}}%
+ }%
+% \end{macrocode}
+% 3rd vertical cm:
+% \begin{macrocode}
+ \put(0,0){\line(0,-1){\LenToUnit{\layerheight}}}%
+ \@tempcnta\numexpr \dimexpr\layerheight + .5mm\relax/\dimexpr 1mm\relax\relax
+ \multiput(0,0)(0,-1){\@tempcnta}{%
+ \line(1,0){1}%
+ }%
+ \@tempcnta\numexpr \dimexpr\layerheight + 2.5mm\relax/\dimexpr 5mm\relax\relax
+ \multiput(0,0)(0,-5){\@tempcnta}{%
+ \line(1,0){2}%
+ }%
+ \@tempcnta\numexpr \dimexpr\layerheight + .5cm\relax/\dimexpr 1cm\relax\relax
+ \multiput(0,0)(0,-10){\@tempcnta}{%
+ \put(0,0){\line(1,0){3}}%
+ \put(3.5,0){%
+ \makebox(0,0)[cl]{\the\numexpr\@tempcnta-\@multicnt\relax}}%
+ }%
+% \end{macrocode}
+% 4th vertical in:
+% \begin{macrocode}
+ \put(\LenToUnit{\layerwidth},0){\line(0,-1){\LenToUnit{\layerheight}}}%
+ \@tempcnta\numexpr \dimexpr\layerheight + .05in\relax/\dimexpr .1in\relax\relax
+ \multiput(\LenToUnit{\layerwidth},0)(0,-2.54){\@tempcnta}{%
+ \line(-1,0){1}%
+ }%
+ \@tempcnta\numexpr \dimexpr\layerheight + .25in\relax/\dimexpr .5in\relax\relax
+ \multiput(\LenToUnit{\layerwidth},0)(0,-12.7){\@tempcnta}{%
+ \line(-1,0){2}%
+ }%
+ \@tempcnta\numexpr \dimexpr\layerheight + .5in\relax/\dimexpr 1in\relax\relax
+ \multiput(\LenToUnit{\layerwidth},0)(0,-25.4){\@tempcnta}{%
+ \put(0,0){\line(-1,0){3}}%
+ \put(-3.5,0){%
+ \makebox(0,0)[cr]{\the\numexpr\@tempcnta-\@multicnt\relax}}%
+ }%
+ \end{picture}}%
+}
+% \end{macrocode}
+% \begin{macro}{\LenToUnit}
+% \changes{v3.19}{2015/07/27}{new}
+% Due to an incompatibility of package \textsf{curve2e} I've eliminated
+% \cs{@gobble} in the definition of \cs{layercontentsmeasure} and replaced it
+% sometimes by \cs{LenToUnit} with the (not long) definition suggested by
+% \textsf{curve2e} itself.
+% \begin{macrocode}
+\providecommand*{\LenToUnit}[1]{\strip@pt\dimexpr#1*\p@/\unitlength}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \LenToUnit
+% \end{macro}^^A \layercontentsmeasure
+%
+%
+% \subsection{Providing Page Styles}
+%
+% Page styles in \LaTeX{} consist of the elements:
+% \begin{itemize}
+% \item a header for odd pages,
+% \item a header for even pages,
+% \item a footer for odd pages,
+% \item a footer for even pages,
+% \end{itemize}
+% and some optional additional commands, that will be expanded, whenever the
+% page style will be activated. Note, that header and footer for even pages
+% will be used only at two-sided mode. At one-sided mode the header and footer
+% for odd pages will be used for all pages.
+%
+% With package \Package{scrlayer} layers will be linked to package styles and
+% expanded at the four elements above. Background layers will expand only
+% at the headers. Foreground layers will expand only at the
+% footers. Layers, that haven't been restricted to background or foreground,
+% will expand at both, page headers and page footers.
+%
+% Similar to the expansion of background and foreground layers, odd page
+% layers will only expand in the headers or footers of odd pages and even page
+% layers will only expand in the headers or footers of even pages. Layers,
+% that haven't been restricted to odd or even pages, will expand in the
+% headers or footers of odd pages and also in the headers or footers of even
+% pages.
+%
+% One step more: Single-side layers will only expand in the headers or footers
+% of pages in single-side layouts and two-side layers only in the headers or
+% footers of pages in two-side layout.
+%
+% One more step: float page layers will only expand in the headers or footers
+% of pages, that consists of page floats only, while non-float page layers
+% will only expand in the headers of footers of pages, that doesn't have page
+% floats.
+%
+% \begin{length}{\footheight}
+% For the header \LaTeX{} already defines a length \Length{headheight} to be
+% the maximum height of the header. But for footer it only defines the
+% distance of the baseline of the footer from the last baseline of the text
+% area. \Package{scrlayer} changes this and also defines a new length
+% \Length{footheight}. This length will be initialised with magic value
+% -12345\,sp. But if it is still that magic value at
+% \Macro{begin}\PParameter{document} it will be reset to the value of
+% \Length{baselineskip}.
+% \begin{macrocode}
+%<*package&init>
+\@ifundefined{footheight}{%
+ \newlength{\footheight}%
+ \setlength{\footheight}{-12345sp}%
+}{%
+%<*trace>
+ \PackageInfo{scrlayer}{Using already defined \string\footheight\MessageBreak
+ hoping, that this is a length and\MessageBreak
+ not only a macro}%
+%</trace>
+}
+\AtBeginDocument{%
+ \ifdim\footheight=-12345sp
+%<*trace>
+ \PackageInfo{scrlayer}{Setting magic \string\footheight\space to
+ \string\baselineskip\space while\MessageBreak
+ \string\begin{document}}%
+%</trace>
+ \setlength{\footheight}{\baselineskip}
+ \fi
+}
+%</package&init>
+% \end{macrocode}
+% \end{length}^^A \footheight
+%
+%
+% Several of the following commands use \meta{key}=\meta{value} arguments. So
+% we define a family with a new member:
+% \begin{macrocode}
+%<*package&body>
+\DefineFamily{KOMAarg}
+\DefineFamilyMember[.definelayerpagestyle]{KOMAarg}
+%</package&body>
+% \end{macrocode}
+%
+% \begin{macro}{\DeclarePageStyleByLayers}
+% \begin{description}
+% \item[\OParameter{option list}:] comma separated list of named page
+% style options (see below).
+% \item[\Parameter{string}:] the name of the page style to be declared (must
+% be expandable and result in a string).
+% \item[\Parameter{string list}:] comma separated list of layer names (must
+% be expandable and result in strings); first in the list will be added
+% first.
+% \end{description}
+% Page styles may be declared using this command. It has one optional and
+% two mandatory arguments. The first mandatory one is the name of the page
+% style and the second one is a list of layers to be used for this page
+% style. The page style itself will expand all background layers for odd
+% pages in \cs{@oddhead}, all background layers for even pages on
+% \cs{@evenhead}, all foreground layers for odd pages in \cs{@oddfoot}, and
+% all foreground layers for even pages in \cs{@evenfoot}. This may be
+% restricted by additional attributes, e.g., \Option{oneside} and
+% \Option{twoside}.
+%
+% The optional argument may be used to define hooks. There are six named
+% optional arguments to set up six hooks. And there are also \KOMAScript{}
+% options for these, to define global pre-definitions. Note, that you may
+% remove the global pre-definitions by emptying the local hooks. The local
+% argument are named similar, but without ``\texttt{ps}'' after
+% ``\texttt{on}''.
+% \begin{option}{onpsselect}
+% \begin{macro}{\@ps@initialhook}
+% \begin{description}
+% \item[\texttt{=\meta{code}}:] executes \meta{code} whenever the
+% page style will be selected, e.g. using \Macro{pagestyle} or
+% \Macro{thispagestyle} or the low level command defining the page
+% style itself.
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsselect}{%
+ \l@addto@macro{\@ps@initialhook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsselect}{#1}%
+}
+%<package>\newcommand*{\@ps@initialhook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsselect}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsselect\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsselect@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onselect}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @initialhook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@initialhook
+% \end{option}^^A onpsselect
+% \begin{option}{onpsinit}
+% \begin{macro}{\@ps@hook}
+% \begin{description}
+% \item[\texttt{=\meta{code}}:] executes \meta{code} whenever the
+% output of a layer stack is initialised. Note, that \meta{code} must not
+% result in any page output. Otherwise the output of the layer stack will be
+% broken!
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsinit}{%
+ \l@addto@macro{\@ps@hook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsinit}{#1}%
+}
+%<package>\newcommand*{\@ps@hook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsinit}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsinit\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsinit@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{oninit}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @hook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@hook
+% \end{option}^^A onpsinit
+% \begin{option}{onpsoneside}
+% \begin{macro}{\@ps@onesidehook}
+% \begin{description}
+% \item[\Option{=\meta{code}}:] executes \meta{code} after
+% \Option{oninit}'s \meta{code} whenever the output of a layer stack of a
+% page in single-side layout is initialised. Note, that \meta{code} must not
+% result in any page output. Otherwise the output of the layer stack will be
+% broken!
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsoneside}{%
+ \l@addto@macro{\@ps@onesidehook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsoneside}{#1}%
+}
+%<package>\newcommand*{\@ps@onesidehook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsoneside}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsoneside\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsoneside@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{ononeside}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @onesidehook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@onesidehook
+% \end{option}^^A onpsoneside
+% \begin{option}{onpstwoside}
+% \begin{macro}{\@ps@twosidehook}
+% \begin{description}
+% \item[\Option{=\meta{code}}:] executes \meta{code} after
+% \Option{oninit}'s \meta{code} whenever the output of a layer stack of a
+% page in two-side layout is initialised. Note, that \meta{code} must not
+% result in any page output. Otherwise the output of the layer stack will be
+% broken!
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpstwoside}{%
+ \l@addto@macro{\@ps@twosidehook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpstwoside}{#1}%
+}
+%<package>\newcommand*{\@ps@twosidehook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpstwoside}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpstwoside\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpstwoside@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{ontwoside}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @twosidehook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@twosidehook
+% \end{option}^^A onpstwoside
+% \begin{option}{onpsoddpage}
+% \begin{macro}{\@ps@oddpagehook}
+% \begin{description}
+% \item[\texttt{=\meta{code}}:] executes \meta{code} after
+% \Option{ononeside}'s or \Option{ontwoside}'s \meta{code} whenever the
+% output of a layer stack of an odd page is initialised. Note, that
+% \meta{code} must not result in any page output. Otherwise the output of
+% the layer stack will be broken!
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsoddpage}{%
+ \l@addto@macro{\@ps@oddpagehook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsoddpage}{#1}%
+}
+%<package>\newcommand*{\@ps@oddpagehook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsoddpage}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsoddpage\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsoddpage@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onoddpage}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @oddpagehook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@oddpagehook
+% \end{option}^^A onpsoddpage
+% \begin{option}{onpsevenpage}
+% \begin{macro}{\@ps@evenpagehook}
+% \begin{description}
+% \item[\texttt{=\meta{code}}:] executes \meta{code} after
+% \Option{ononeside}'s or \Option{ontwoside}'s \meta{code} whenever the
+% output of a layer stack of an even page is initialised. Note, that
+% \meta{code} must not result in any page output. Otherwise the output of
+% the layer stack will be broken!
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsevenpage}{%
+ \l@addto@macro{\@ps@evenpagehook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsevenpage}{#1}%
+}
+%<package>\newcommand*{\@ps@evenpagehook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsevenpage}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsevenpage\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsevenpage@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onevenpage}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @evenpagehook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@evenpagehook
+% \end{option}^^A onpsevenpage
+% \begin{option}{onpsfloatpage}
+% \begin{macro}{\@ps@floatpagehook}
+% \begin{description}
+% \item[\Option{=\meta{code}}:] executes \meta{code} after
+% \Option{onoddpage}'s or \Option{onevenpage}'s \meta{code} whenever a float
+% column has been made (usually those pages are float pages).
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsfloatpage}{%
+ \l@addto@macro{\@ps@floatpagehook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsfloatpage}{#1}%
+}
+%<package>\newcommand*{\@ps@floatpagehook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsfloatpage}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsfloatpage\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsfloatpage@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onfloatpage}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @floatpagehook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@floatpagehook
+% \end{option}^^A onpsfloatpage
+% \begin{option}{onpsnonfloatpage}
+% \begin{macro}{\@ps@nonfloatpagehook}
+% \begin{description}
+% \item[\Option{=\meta{code}}:] executes \meta{code} after
+% \Option{onoddpage}'s or \Option{onevenpage}'s \meta{code} whenever no
+% float column has been made (usually those pages aren't float pages).
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsnonfloatpage}{%
+ \l@addto@macro{\@ps@nonfloatpagehook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsnonfloatpage}{#1}%
+}
+%<package>\newcommand*{\@ps@nonfloatpagehook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsnonfloatpage}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsnonfloatpage\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsnonfloatpage@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onnonfloatpage}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @nonfloatpagehook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@nonfloatpagehook
+% \end{option}^^A onpsnonfloatpage
+% \begin{option}{onpsbackground}
+% \begin{macro}{\@ps@backgroundhook}
+% \begin{description}
+% \item[\texttt{=\meta{code}}:] executes \meta{code} after
+% \Option{onfloatpage}'s or \Option{onnonfloatpage}'s \meta{code} whenever
+% the output of a background layer stack is initialised. Note, that
+% \meta{code} must not result in any page output. Otherwise the output of
+% the layer stack will be broken!
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsbackground}{%
+ \l@addto@macro{\@ps@backgroundhook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsbackground}{#1}%
+}
+%<package>\newcommand*{\@ps@backgroundhook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsbackground}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsbackground\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsbackground@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onbackground}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @backgroundhook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@ps@backgroundhook
+% \end{option}^^A onbackground
+% \begin{option}{onpsforeground}
+% \begin{macro}{\@ps@foregroundhook}
+% \begin{description}
+% \item[\texttt{=\meta{code}}:] executes \meta{code} after
+% \Option{onfloatpage}'s or \Option{onnonfloatpage}'s \meta{code} whenever
+% the output of a foreground layer stack is initialised. Note, that
+% \meta{code} must not result in any page output. Otherwise the output of
+% the layer stack will be broken!
+% \end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{onpsforeground}{%
+ \l@addto@macro{\@ps@foregroundhook}{#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@add{.scrlayer.sty}{onpsforeground}{#1}%
+}
+%<package>\newcommand*{\@ps@foregroundhook}{}
+%<package>\KOMA@kav@add{.scrlayer.sty}{onpsforeground}{}
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsforeground\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @onpsforeground@default\endcsname\relax
+%</interface&body>
+%<*package&body>
+\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onforeground}{%
+ \expandafter\l@addto@macro
+ \csname @ps@\scrlayer@current@pagestyle @foregroundhook\endcsname
+ {#1}%
+ \FamilyKeyStateProcessed
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \@psforegroundhook
+% \end{option}^^A onpsforeground
+% \begin{option}{singlespacing}
+% \changes{v3.24}{2017/05/22}{new option added}^^A
+% \begin{description}
+% \item[\texttt{=\meta{simple switch}}:] if activated, all page styles will be
+% set with line spread 1. This switch is global. If you want it for some
+% styles only, add \Macro{linespread}\PParameter{1}\Macro{selectfont} to
+% option \Option{oninit} of only those styles.
+%\end{description}
+% \begin{macrocode}
+%<*options>
+\KOMA@ifkey{singlespacing}{@ps@singlespacing}
+%</options>
+% \end{macrocode}
+% \end{option}
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\DeclarePageStyleByLayers}[3][]{%
+ \edef\scrlayer@current@pagestyle{\GetRealPageStyle{#2}}%
+ \expandafter\scrlayer@declare@ps@by@layers\expandafter{%
+ \scrlayer@current@pagestyle
+ }{#1}{#3}%
+}
+% \end{macrocode}
+% \begin{macro}{\scrlayer@declare@ps@by@layers}
+% \changes{v3.15}{2014/12/28}{fix: \cs{linewidth} replaced by
+% \cs{textwidth}}^^A
+% \changes{v3.18}{2015/06/09}{usage of \cs{parbox[b]} instead of
+% \cs{parbox[t]} because of strange effect with package
+% \textsf{multicol}}^^A
+% \changes{v3.24}{2017/05/22}{test for \cs{if@ps@singlespacing} added}^^A
+% \changes{v3.26}{2018/08/29}{\cs{scr@trim@spaces} added}^^A
+% Needed, because of page style aliases. Same arguments like
+% \cs{DeclarePageStyleByLayers} but, \#1 is the name of the page style, \#2 is
+% the list of options and \#3 is still the list of layers.
+% \begin{macrocode}
+\newcommand*{\scrlayer@declare@ps@by@layers}[3]{%
+ \@namedef{@ps@#1@initialhook}{\@ps@initialhook}%
+ \@namedef{@ps@#1@hook}{\@ps@hook}%
+ \@namedef{@ps@#1@backgroundhook}{\@ps@backgroundhook}%
+ \@namedef{@ps@#1@foregroundhook}{\@ps@foregroundhook}%
+ \@namedef{@ps@#1@oddpagehook}{\@ps@oddpagehook}%
+ \@namedef{@ps@#1@evenpagehook}{\@ps@evenpagehook}%
+ \@namedef{@ps@#1@onesidehook}{\@ps@onesidehook}%
+ \@namedef{@ps@#1@twosidehook}{\@ps@twosidehook}%
+ \@namedef{@ps@#1@floatpagehook}{\@ps@floatpagehook}%
+ \@namedef{@ps@#1@nonfloatpagehook}{\@ps@nonfloatpagehook}%
+ \FamilyExecuteOptions[.definelayerpagestyle]{KOMAarg}{#2}%
+ \@namedef{ps@#1}{%
+ \renewcommand*{\currentpagestyle}{#1}%
+ \@nameuse{@ps@@everystyle@@initialhook}%
+ \@nameuse{@ps@#1@initialhook}%
+ \renewcommand*{\currentpagestyle}{#1}%
+ \renewcommand*{\@oddhead}{%
+ \begingroup
+ \let\headmark\rightmark
+ \if@ps@singlespacing\linespread{1}\selectfont\fi
+ \@nameuse{@ps@@everystyle@@hook}%
+ \@nameuse{@ps@#1@hook}%
+ \@nameuse{@ps@@everystyle@@\if@twoside two\else one\fi sidehook}%
+ \@nameuse{@ps@#1@\if@twoside two\else one\fi sidehook}%
+ \@nameuse{@ps@@everystyle@@oddpagehook}%
+ \@nameuse{@ps@#1@oddpagehook}%
+ \@nameuse{@ps@@everystyle@@\if@fcolmade\else non\fi floatpagehook}%
+ \@nameuse{@ps@#1@\if@fcolmade\else non\fi floatpagehook}%
+ \@nameuse{@ps@@everystyle@@backgroundhook}%
+ \@nameuse{@ps@#1@backgroundhook}%
+ \parbox[b][\headheight][t]{\textwidth}{%
+ \vskip \dimexpr -\topmargin-1in
+ -\ht\strutbox\relax
+ \hskip \dimexpr -\oddsidemargin-1in\relax
+ \strut\makebox[\z@][l]{%
+ \ForEachLayerOfPageStyle{@everystyle@}{%
+ \scrlayer@do@page@style@element@layer{background}{odd}%
+ {########1}%
+ }%
+ \ForEachLayerOfPageStyle{#1}{%
+ \scrlayer@do@page@style@element@layer{background}{odd}%
+ {########1}%
+ }%
+ }%
+ }%
+ \endgroup
+ }%
+ \renewcommand*{\@evenhead}{%
+ \begingroup
+ \let\headmark\leftmark
+ \if@ps@singlespacing\linespread{1}\selectfont\fi
+ \@nameuse{@ps@@everystyle@@hook}%
+ \@nameuse{@ps@#1@hook}%
+ \@nameuse{@ps@@everystyle@@twosidehook}%
+ \@nameuse{@ps@#1@twosidehook}%
+ \@nameuse{@ps@@everystyle@@evenpagehook}%
+ \@nameuse{@ps@#1@evenpagehook}%
+ \@nameuse{@ps@@everystyle@@\if@fcolmade\else non\fi floatpagehook}%
+ \@nameuse{@ps@#1@\if@fcolmade\else non\fi floatpagehook}%
+ \@nameuse{@ps@@everystyle@@backgroundhook}%
+ \@nameuse{@ps@#1@backgroundhook}%
+ \parbox[b][\headheight][t]{\textwidth}{%
+ \vskip \dimexpr -\topmargin-1in
+ -\ht\strutbox\relax
+ \hskip \dimexpr-\evensidemargin-1in\relax
+ \strut\makebox[\z@][l]{%
+ \ForEachLayerOfPageStyle{@everystyle@}{%
+ \scrlayer@do@page@style@element@layer{background}{even}%
+ {########1}%
+ }%
+ \ForEachLayerOfPageStyle{#1}{%
+ \scrlayer@do@page@style@element@layer{background}{even}%
+ {########1}%
+ }%
+ }%
+ }%
+ \endgroup
+ }%
+ \renewcommand*{\@oddfoot}{%
+ \begingroup
+ \let\headmark\rightmark
+ \if@ps@singlespacing\linespread{1}\selectfont\fi
+ \@nameuse{@ps@@everystyle@@hook}%
+ \@nameuse{@ps@#1@hook}%
+ \@nameuse{@ps@@everystyle@@\if@twoside two\else one\fi sidehook}%
+ \@nameuse{@ps@#1@\if@twoside two\else one\fi sidehook}%
+ \@nameuse{@ps@@everystyle@@oddpagehook}%
+ \@nameuse{@ps@#1@oddpagehook}%
+ \@nameuse{@ps@@everystyle@@\if@fcolmade\else non\fi floatpagehook}%
+ \@nameuse{@ps@#1@\if@fcolmade\else non\fi floatpagehook}%
+ \@nameuse{@ps@@everystyle@@foregroundhook}%
+ \@nameuse{@ps@#1@foregroundhook}%
+ \parbox[t][\headheight][t]{\textwidth}{%
+ \vskip \dimexpr -\topmargin-1in
+ -\headheight
+ -\headsep
+ -\textheight
+ -\footskip
+ -\ht\strutbox\relax
+ \hskip \dimexpr -\oddsidemargin-1in\relax
+ \strut\makebox[\z@][l]{%
+ \ForEachLayerOfPageStyle{@everystyle@}{%
+ \scrlayer@do@page@style@element@layer{foreground}{odd}%
+ {########1}%
+ }%
+ \ForEachLayerOfPageStyle{#1}{%
+ \scrlayer@do@page@style@element@layer{foreground}{odd}%
+ {########1}%
+ }%
+ }%
+ }%
+ \endgroup
+ }%
+ \renewcommand*{\@evenfoot}{%
+ \begingroup
+ \let\headmark\leftmark
+ \if@ps@singlespacing\linespread{1}\selectfont\fi
+ \@nameuse{@ps@@everystyle@@hook}%
+ \@nameuse{@ps@#1@hook}%
+ \@nameuse{@ps@@everystyle@@twosidehook}%
+ \@nameuse{@ps@#1@twosidehook}%
+ \@nameuse{@ps@@everystyle@@evenpagehook}%
+ \@nameuse{@ps@#1@evenpagehook}%
+ \@nameuse{@ps@@everystyle@@\if@fcolmade\else non\fi floatpagehook}%
+ \@nameuse{@ps@#1@\if@fcolmade\else non\fi floatpagehook}%
+ \@nameuse{@ps@@everystyle@@foregroundhook}%
+ \@nameuse{@ps@#1@foregroundhook}%
+ \parbox[t][\headheight][t]{\textwidth}{%
+ \vskip \dimexpr -\topmargin-1in
+ -\headheight
+ -\headsep
+ -\textheight
+ -\footskip
+ -\ht\strutbox\relax
+ \hskip \dimexpr-\evensidemargin-1in\relax
+ \strut\makebox[\z@][l]{%
+ \ForEachLayerOfPageStyle{@everystyle@}{%
+ \scrlayer@do@page@style@element@layer{foreground}{even}%
+ {########1}%
+ }%
+ \ForEachLayerOfPageStyle{#1}{%
+ \scrlayer@do@page@style@element@layer{foreground}{even}%
+ {########1}%
+ }%
+ }%
+ }%
+ \endgroup
+ }%
+ }%
+ \@namedef{@ps@#1@layers}{}%
+ \@for \reserved@a:=#3\do {%
+ \scr@trim@spaces\reserved@a
+ \ifstr\reserved@a\@empty{}{%
+ \expandafter\@cons\csname @ps@#1@layers\endcsname{{\reserved@a}}%
+ }%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@declare@ps@by@layers
+%
+% \begin{macro}{\ForEachLayerOfPageStyle}
+% \changes{v3.18}{2015/05/14}{star version of the command}^^A
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
+% ersetzt}^^A
+% \begin{description}
+% \item[\Parameter{string}:] a valid page style (must be fully expandable
+% and expand to the name of a existing page style); note, that currently
+% no exists test will be done.
+% \item[\Parameter{code}:] any macro definition body with usage of at most
+% one argument (\texttt{\#1}), that will be replaced by the layer's name
+% \end{description}
+% Do the given \meta{code} for each layer of the page style
+% \meta{string}. Note, that the expansion of \meta{code} will be done inside
+% a group. There's also a star version of the command, that delays execution
+% of \meta{code} after the end of the group.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\ForEachLayerOfPageStyle}{%
+ \kernel@ifstar {\@s@ForEachLayerOfPageStyle}{\@ForEachLayerOfPageStyle}%
+}
+\newcommand*{\@ForEachLayerOfPageStyle}[2]{%
+ \begingroup
+ \edef\reserved@a{\GetRealPageStyle{#1}}%
+ \def\@elt##1{\ifscrlayer@deactivate@layers\else #2\fi}%
+ \@nameuse{@ps@\reserved@a @layers}%
+ \endgroup
+}
+\newcommand*{\@s@ForEachLayerOfPageStyle}[2]{%
+ \begingroup
+ \edef\reserved@a{\GetRealPageStyle{#1}}%
+ \def\reserved@b{\endgroup}%
+ \def\@elt##1{%
+ \l@addto@macro\reserved@b{%
+ \ifscrlayer@deactivate@layers\else #2\fi
+ }%
+ }%
+ \@nameuse{@ps@\reserved@a @layers}%
+ \reserved@b
+}
+%</package&body>
+% \end{macrocode}
+% \begin{option}{deactivatepagestylelayers}
+% \begin{macro}{\ifscrlayer@deactivate@layers}
+% \begin{description}
+% \item[\Parameter{simple switch}:] whether or not
+% \Macro{ForEachLayerOfPageStyle} should ignore the layers.
+% \end{description}
+% This is a global \KOMAScript{} options. Several other definitions and at
+% least the usage of the page style will ignore the layers if
+% \Macro{ForEachLayerOfPageStyle} ignores them. So this is something like:
+% hide the layers. It may also be useful inside the code for the hooks
+% described above, because hooks may used to deactivate the layers with this
+% option too.
+% \begin{macrocode}
+%<*options>
+%<*package>
+\KOMA@ifkey{deactivatepagestylelayers}{scrlayer@deactivate@layers}
+%</package>
+%<*interface>
+\KOMA@key{deactivatepagestylelayers}[true]{%
+ \KOMA@set@ifkey{deactivatepagestylelayers}{scrlayer@deactivate@layers}{#1}%
+ \KOMA@kav@replacebool{.scrlayer.sty}{deactivatepagestylelayers}
+ {scrlayer@deactivate@layers}%
+}
+%</interface>
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @deactivatepagestylelayers\endcsname
+ \relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @deactivatepagestylelayers@default\endcsname
+ \relax
+%</interface&body>
+% \end{macrocode}
+% \end{macro}^^A \ifscrlayer@deactivate@layers
+% \end{option}^^A deactivatepagestylelayers
+% \end{macro}^^A \ForEachLayerOfPageStyle
+%
+% \begin{macro}{\scrlayer@do@page@style@element@layer}
+% \changes{v3.26}{2018/07/14}{added hooks and artifact code}^^A
+% Helper macro to show one layer. First argument is either ``background'' or
+% ``foreground'', second argument is either ``odd'' or ``even'', and third
+% argument is the name of the layer. Note, that in draft mode for every layer
+% will be shown also a \cs{layercontentsmeasure}.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\scrlayer@do@page@style@element@layer}[3]{%
+ \begingroup
+ \expandafter\ifx\csname if@scr@l@#3@\if@fcolmade\else non\fi floatpage%
+ \expandafter\endcsname\csname iftrue\endcsname
+ \expandafter\ifx\csname if@scr@l@#3@\if@twoside two\else one\fi side%
+ \expandafter\endcsname\csname iftrue\endcsname
+ \expandafter
+ \ifx\csname if@scr@l@#3@#1\expandafter\endcsname
+ \csname iftrue\endcsname
+ \expandafter
+ \ifx\csname if@scr@l@#3@#2\expandafter\endcsname
+ \csname iftrue\endcsname
+ \ifscrlayer@draft
+ \scr@layerbox(\csname scr@l@#3@x\endcsname,%
+ \csname scr@l@#3@y\endcsname)%
+ (\csname scr@l@#3@w\endcsname,%
+ \csname scr@l@#3@h\endcsname)%
+ [\csname scr@l@#3@align\endcsname]%
+ {%
+ \scrlayer@predraftmeasure@hook
+ \scrlayer@beginartifact{}%
+ \layercontentsmeasure
+ \scrlayer@endartifact{}%
+ \scrlayer@postdraftmeasure@hook
+ }%
+ \fi
+ \scr@layerbox(\csname scr@l@#3@x\endcsname,%
+ \csname scr@l@#3@y\endcsname)%
+ (\csname scr@l@#3@w\endcsname,%
+ \csname scr@l@#3@h\endcsname)%
+ [\csname scr@l@#3@align\endcsname]%
+ {\csname layer\csname scr@l@#3@mode\endcsname
+ mode\expandafter\endcsname{%
+ \csname scr@l@#3@precontents@hook\endcsname
+ \scr@ifundefinedorrelax{scr@l@#3@artifact}{}{%
+ \expandafter\expandafter\expandafter
+ \scrlayer@beginartifact
+ \expandafter\expandafter\expandafter{%
+ \csname scr@l@#3@artifact\endcsname
+ }%
+ \csname scr@l@#3@contents\endcsname
+ \expandafter\expandafter\expandafter
+ \scrlayer@endartifact
+ \expandafter\expandafter\expandafter{%
+ \csname scr@l@#3@artifact\endcsname
+ }%
+ }{%
+ \csname scr@l@#3@contents\endcsname
+ }%
+ \csname scr@l@#3@postcontents@hook\endcsname
+ }%
+ }%
+ \fi
+ \fi
+ \fi
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \begin{macro}{\scrlayer@predraftmeasure@hook}
+% \changes{v3.26}{2018/07/14}{new (internal)}^^A
+% The hooks that will be executed before setting the draft measuring.
+% \begin{macrocode}
+\newcommand*{\scrlayer@predraftmeasure@hook}{}
+% \end{macrocode}
+% \begin{macro}{\BeforeDraftMeasuringLayer}
+% \changes{v3.26}{2018/07/14}{new}^^A
+% New code will be added in front of the hook.
+% \begin{macrocode}
+\newcommand*{\BeforeDraftMeasuringLayer}[1]{%
+ \edef\scrlayer@predraftmeasure@hook{%
+ \unexpanded{#1}\unexpanded\expandafter{\scrlayer@predraftmeasure@hook}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}^^A \BeforeDraftMeasuringLayer
+% \end{macro}^^A \scrlayer@predraftmeasure@hook
+% \begin{macro}{\scrlayer@postdraftmeasure@hook}
+% \changes{v3.26}{2018/07/14}{new (internal)}^^A
+% The hook that will be executed after setting the draft measuring.
+% \begin{macrocode}
+\newcommand*{\scrlayer@postdraftmeasure@hook}{}
+% \end{macrocode}
+% \begin{macro}{\AfterDraftMeasuringLayer}
+% \changes{v3.26}{2018/07/14}{new}^^A
+% New code will be added at the end of the hook.
+% \begin{macrocode}
+\newcommand*{\AfterDraftMeasuringLayer}[1]{%
+ \expandafter\def\expandafter\scrlayer@postdraftmeasure@hook\expandafter{%
+ \scrlayer@postdraftmeasure@hook #1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}^^A \AfterDraftMeasuringLayer
+% \end{macro}^^A \scrlayer@postdraftmeasure@hook
+% \begin{macro}{\scr@layerbox}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}^^A
+% \begin{macro}{\scr@@layerbox}
+% \changes{v3.24}{2017/05/08}{\cs{edef} replaced by \cs{protected@edef}}^^A
+% \changes{v3.24}{2017/05/08}{\cs{dimexpr} added to \cs{layer\dots}}^^A
+% \changes{v3.24}{2017/05/08}{\cs{dimexpr} removed from usage of
+% \cs{layer\dots}}^^A
+% The layer box is used to output a layer in \cs{@oddhead}, \cs{@evenhead},
+% \cs{@oddfoot}, or \cs{@evenfoot}. Is has two pairs of arguments: ($x,y$)
+% and ($w,h$), where $x$ is the distance from left paper edge, $y$ is the
+% distance from the topmost edge of paper, $w$ is the width of the box and $h$
+% is the height of the box. The fifth argument is an optional vertical and
+% horizontal alignment of the box. It may be a combination of the alignment
+% characters described above. The sixth and last argument is the contents of
+% the layer, to be placed into the last argument of the innermost
+% \cs{parbox}.
+% \begin{macrocode}
+\def\scr@layerbox(#1,#2)(#3,#4){%
+ \kernel@ifnextchar [%]
+ {\scr@@layerbox(#1,#2)(#3,#4)}{\scr@@layerbox(#1,#2)(#3,#4)[]}%
+}
+\def\scr@@layerbox(#1,#2)(#3,#4)[#5]#6{%
+ \begingroup
+ \protected@edef\layerxoffset{\noexpand\dimexpr #1\relax}%
+ \protected@edef\layeryoffset{\noexpand\dimexpr #2\relax}%
+ \protected@edef\layerwidth{\noexpand\dimexpr #3\relax}%
+ \protected@edef\layerheight{\noexpand\dimexpr #4\relax}%
+ \def\layervalign{t}%
+ \def\layerhalign{l}%
+ \edef\reserved@b{#5}%
+ \expandafter\@tfor\expandafter\reserved@a\expandafter:\expandafter=%
+ \reserved@b\do{%
+ \if t\reserved@a
+ \def\layervalign{t}%
+ \else
+ \if c\reserved@a
+ \def\layervalign{c}%
+ \def\layerhalign{c}%
+ \else
+ \if b\reserved@a
+ \def\layervalign{b}%
+ \else
+ \if l\reserved@a
+ \def\layerhalign{l}%
+ \else
+ \if r\reserved@a
+ \def\layerhalign{r}%
+ \else
+ \PackageWarning{scrlayer}{%
+ Unknown alignment `\reserved@a' ignored}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ }%
+ \parbox[t][\z@][t]{\z@}{%
+ \vskip\layeryoffset
+ \if b\layervalign\vskip-\layerheight\fi
+ \if c\layervalign\vskip-.5\layerheight\fi
+% \end{macrocode}
+% \changes{3.23a}{2017/04/22}{\textsf{bidi} code added}^^A
+% \changes{v3.24}{2017/05/04}{usage of \textsf{scrbase}'s \cs{IfRTL}}^^A
+% If we are in right-to-left mode of package \textsf{bidi} or
+% \textsf{xepersian} the horizontal output is in the opposite direction. So we
+% need the \cs{makebox} to the right instead of the left and to move the
+% contents additionally by its width.
+% \begin{macrocode}
+ \makebox[\z@][\IfRTL{r}{l}]{%
+ \hskip\layerxoffset
+ \IfRTL{\hskip\layerwidth}{}%
+ \makebox[\z@][\layerhalign]{%
+ \parbox[\layervalign][\layerheight][\layervalign]{\layerwidth}{%
+ \vskip\z@\strut{%
+ \ifscrlayer@forceignoreuppercase
+ \expandafter\let\csname MakeUppercase \endcsname\@firstofone
+ \let\MakeUppercase\@firstofone
+ \let\uppercase\@firstofone
+ \fi
+ #6%
+ }\strut\vskip\z@
+ }%
+ }%
+ }%
+ }%
+ \endgroup
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scr@@layerbox
+% \end{macro}^^A \scr@layerbox
+%
+% \begin{macro}{\layerrawmode}
+% \changes{v3.19}{2015/07/30}{new command}^^A
+% \begin{macro}{\layertextmode}
+% \changes{v3.19}{2015/07/30}{new command}^^A
+% This is the command to output layers in raw mode. This is very simple:
+% \begin{macrocode}
+%<*package&body>
+\newcommand{\layerrawmode}[1]{#1}
+\newcommand{\layertextmode}[1]{#1}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \layertextmode
+% \end{macro}^^A \layerrawmode
+%
+% \begin{macro}{\layerpicturemode}
+% \changes{v3.19}{2015/07/30}{new command}^^A
+% \changes{v3.24}{2017/05/08}{redundant \cs{dimexpr} removed}^^A
+% This is a bit more complicated. It is the layer output for \texttt{picture}
+% layers. In this case we use a picture environment and internally define some
+% additional commands.
+% \begin{macrocode}
+%<*package&body>
+\newcommand{\layerpicturemode}[1]{%
+ \begin{picture}(0,0)
+ (0,\LenToUnit{%
+ \if t\layervalign \dimexpr\layerheight-\ht\strutbox\relax
+ \else
+ \if b\layervalign \dp\strutbox
+ \else .5\dimexpr\layerheight-\ht\strutbox+\dp\strutbox\relax
+ \fi
+ \fi})
+ \long\def\putLL##1{\put(0,0){##1}}%
+ \long\def\putUL##1{\put(0,\LenToUnit{\layerheight}){##1}}%
+ \long\def\putLR##1{\put(\LenToUnit{\layerwidth},0){##1}}%
+ \long\def\putUR##1{\put(\LenToUnit{\layerwidth},%
+ \LenToUnit{\layerheight}){##1}}%
+ \long\def\putC##1{\put(\LenToUnit{.5\layerwidth},%
+ \LenToUnit{.5\layerheight}){##1}}%
+ #1%
+ \end{picture}%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \layerpicturemode
+%
+% \begin{option}{draft}
+% \begin{macro}{\ifscrlayer@draft}
+% \begin{description}
+% \item[\Parameter{simple switch}:] whether or not to use the draft mode,
+% that, i.e., activates visualisation of the layers.
+% \end{description}
+% When option is set, every layer is shown twice: one time with it's own
+% contents and one time with contents \Macro{layercontentsmeasure}.
+% \begin{macrocode}
+%<*options>
+%<*package>
+\KOMA@ifkey{draft}{scrlayer@draft}
+%</package>
+%<*interface>
+\KOMA@key{draft}[true]{%
+ \KOMA@set@ifkey{draft}{scrlayer@draft}{#1}%
+ \KOMA@kav@replacebool{.scrlayer.sty}{draft}{scrlayer@draft}%
+}
+%</interface>
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @draft\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @draft@default\endcsname\relax
+%</interface&body>
+% \end{macrocode}
+% \end{macro}^^A \ifscrlayer@draft
+% \end{option}^^A draft
+% \end{macro}^^A \scrlayer@do@page@style@element@layer
+% \end{macro}^^A \DeclarePageStyleByLayers
+%
+%
+% \begin{macro}{\DeclareNewPageStyleByLayers}
+% Arguments like \Macro{DeclarePageStyleByLayers}; results in error if the page
+% style has been defined (or declared) already.
+% \begin{macro}{\ProvidePageStyleByLayers}
+% Arguments like \Macro{DeclarePageStyleByLayers}; doesn't define anything it
+% the page style has been defined (or declared) already.
+% \begin{macro}{\RedeclarePageStyleByLayers}
+% Arguments like \Macro{DeclarePageStyleByLayers}; results in error if the page
+% style hasn't been defined (or declared) already.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\DeclareNewPageStyleByLayers}[2][]{%
+ \@ifundefined{ps@#2}{}{%
+ \PackageError{scrlayer}{%
+ Page style `#2' already defined%
+ }{%
+ You may use \string\DeclareNewPageStyleByLayers\space to declare a new
+ page style only\MessageBreak
+ if that page style hasn't been declared or defined before.\MessageBreak
+ You may use either \string\ProvidePageStyleByLayers\space to declare the
+ page style only\MessageBreak
+ if it hasn't been declared or defined before, or
+ \string\RedeclarePageStyleByLayers\MessageBreak
+ to overwrite the former
+ declaration or definition of the page style%
+ \@ifundefined{@ps@#2@layers}{}{,\MessageBreak
+ or \string\AddLayersToPageStyle\space to add further layers to the
+ already declared\MessageBreak
+ page style, or \string\RemoveLayersFromPageStyle\space to remove
+ layers from the\MessageBreak
+ already declared page style}.\MessageBreak
+ Nevertheless, if you'll continue, the page style will be
+ overwritten\MessageBreak
+ by the new declaration.%
+ }%
+ }%
+ \DeclarePageStyleByLayers[{#1}]{#2}%
+}
+\newcommand*{\ProvidePageStyleByLayers}[3][]{%
+ \@ifundefined{ps@#2}{%
+ \DeclarePageStyleByLayers[{#1}]{#2}{#3}%
+ }{%
+%<*trace>
+ \PackageInfo{scrlayer}{%
+ \string\ProvidePageStyleByLayers{#2}{#3} ignored,\MessageBreak
+ because page style `#2'\MessageBreak
+ already exists%
+ }%
+%</trace>
+ }%
+}
+\newcommand*{\RedeclarePageStyleByLayers}[2][]{%
+ \@ifundefined{ps@#2}{%
+ \PackageError{scrlayer}{%
+ Page style `#2' not yet defined%
+ }{%
+ You may use \string\RedeclarePageStyleByLayers\space to declare a page
+ style only\MessageBreak
+ if that page style has already been declared or defined.\MessageBreak
+ You may use either \string\DeclareNewPageStyleByLayers,
+ \string\DeclarePageStyleByLayers,\MessageBreak
+ or \string\ProvidePageStyleByLayers\space to declare that not yet
+ defined page style.\MessageBreak
+ Nevertheless, if you'll continue, the page style will be declared.%
+ }%
+ }{}%
+ \DeclarePageStyleByLayers[{#1}]{#2}%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \RedeclarePageStyleByLayers
+% \end{macro}^^A \ProvidePageStyleByLayers
+% \end{macro}^^A \DeclareNewPageStyleByLayers
+%
+% We also declare page style \Pagestyle{@everystyle@} by default. You should
+% not use this page style as an real page style (even not as the empty
+% one). The layers of this page style will be used by every other layer page
+% style. An we re-declare \Pagestyle{empty} to be a layer page style.
+% \begin{macrocode}
+%<*package&final>
+\DeclareNewPageStyleByLayers{@everystyle@}{}
+\RedeclarePageStyleByLayers{empty}{}
+%</package&final>
+% \end{macrocode}
+%
+% \begin{macro}{\AddLayersToPageStyle}
+% \changes{v3.26}{2018/08/29}{\cs{scr@trim@spaces} added}^^A
+% \begin{macro}{\AddLayersAtBeginOfPageStyle}
+% \begin{macro}{\AddLayersAtEndOfPageStyle}
+% \begin{macro}{\RemoveLayersFromPageStyle}
+% \changes{v3.26}{2018/08/29}{\cs{scr@trim@spaces} added}^^A
+% \begin{description}
+% \item[\Parameter{string}:] the name of the page style to be modified (must
+% be expandable and result in a string).
+% \item[\Parameter{string list}:] comma separated list of layer names (must
+% be expandable and result in strings); first in the list will be added
+% first.
+% \end{description}
+% Change the layer list of a given page style. The differences between the
+% commands are:
+% \begin{description}
+% \item[\Macro{AddLayersToPageStyle}:] first in the \meta{string list} will
+% be added first at the end.
+% \item[\Macro{AddLayersAtBeginOfPageStyle}:] first in the \meta{string list}
+% will be added first at the start. Note, that this will result in changing
+% the order of the layers in \meta{string list}.
+% \item[\Macro{AddLayerAtEndOfPageStyle}:] same like
+% \Macro{AddLayerToPageStyle}.
+% \item[\Macro{RemoveLayersFromPageStyle}:] remove the layers from the page
+% style's layer list.
+% \end{description}
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\AddLayersToPageStyle}[2]{%
+ \edef\reserved@b{\GetRealPageStyle{#1}}%
+ \IfLayerPageStyleExists{\reserved@b}{%
+ \@for \reserved@a:=#2\do {%
+ \scr@trim@spaces\reserved@a
+ \ifstr\reserved@a\@empty{}{%
+ \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname
+ {{\reserved@a}}%
+ }%
+ }%
+ }{%
+ \scrlayer@lpm@error{#1}{adding layers}%
+ }%
+}
+\newcommand*{\AddLayersAtEndOfPageStyle}{%
+ \AddLayersToPageStyle
+}
+\newcommand*{\AddLayersAtBeginOfPageStyle}[2]{%
+ \begingroup
+ \let\@cons\@snoc
+ \AddLayersToPageStyle{#1}{#2}%
+ \endgroup
+}
+% \end{macrocode}
+% \begin{macro}{\@snoc}
+% \cs{@snoc} is a helper macro similar to \cs{@cons} from \LaTeX{} kernel, but
+% it appends at the front instead of the end.
+% \begin{macrocode}
+\newcommand*{\@snoc}[2]{%
+ \begingroup\let\@elt\relax\xdef#1{\@elt #2#1}\endgroup
+}
+% \end{macrocode}
+% \end{macro}^^A \@snoc
+% \begin{macrocode}
+\newcommand*{\RemoveLayersFromPageStyle}[2]{%
+ \edef\reserved@b{\GetRealPageStyle{#1}}%
+ \IfLayerPageStyleExists{#1}{%
+ \@for \reserved@a:=#2\do {%
+ \scr@trim@spaces\reserved@a
+ \ifstr\reserved@a\@empty{}{%
+ \expandafter\remove@layer@from@page@style\expandafter{\reserved@a}%
+ {\reserved@b}%
+ }%
+ }%
+ }{%
+ \scrlayer@lpm@error{#1}{removing layers}%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\remove@layer@from@page@style}
+% \changes{v0.9}{2014/07/25}{cleaning of layer list must be global}
+% Helper macro to remove exactly one layer (arg 1) from a page style (arg 2).
+% \begin{macrocode}
+\newcommand*{\remove@layer@from@page@style}[2]{%
+ \begingroup
+ \expandafter\let\expandafter\reserved@a\csname @ps@#2@layers\endcsname
+ \expandafter\global\expandafter\let\csname @ps@#2@layers\endcsname\@empty
+ \def\@elt##1{%
+ \ifstr{#1}{##1}{}{%
+ \expandafter\@cons\csname @ps@#2@layers\endcsname{{##1}}%
+ }%
+ }\reserved@a
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}^^A \remoce@layer@from@page@style
+% \begin{macro}{\scrlayer@lpm@error}
+% \begin{description}
+% \item[\Parameter{string}:] the name of the page style to be modified (must
+% be expandable and result in a string).
+% \item[\Parameter{string}:] the kind of modification, that isn't allowed
+% (must be expandable and result in a string).
+% \end{description}
+% Show an error because of page style it either not a defined or not a layer
+% page style.
+% \begin{macrocode}
+\newcommand*{\scrlayer@lpm@error}[2]{%
+ \PackageError{scrlayer}{`#1' is not a layer page style}{%
+ \scr@ifundefinedorrelax{ps@#1}{%
+ Page style `#1' is not defined,
+ }{%
+ Page style `#1' is not a layer page style,
+ }%
+ but #2\MessageBreak
+ may be used only for layer page styles declared using\MessageBreak
+ \string\DeclarePageStyleByLayers,
+ \string\DeclareNewPageStyleByLayers,\MessageBreak
+ of \string\ProvidePageStyleByLayers.\MessageBreak
+ If you'll continue, your operation will be ignored.%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@lpm@error
+% \end{macro}^^A \RemoveLayersFromPageStyle
+% \end{macro}^^A \AddLayersAtEndOfPageStyle
+% \end{macro}^^A \AddLayersAtBeginOfPageStyle
+% \end{macro}^^A \AddLayersToPageStyle
+%
+% \begin{macro}{\AddLayersToPageStyleBeforeLayer}
+% \changes{v3.26}{2018/08/29}{\cs{scr@trim@spaces} added}^^A
+% \begin{macro}{\AddLayersToPageStyleAfterLayer}
+% \changes{v3.26}{2018/08/29}{\cs{scr@trim@spaces} added}^^A
+% \begin{description}
+% \item[\Parameter{string}:] the name of the page style to be modified (must
+% be expandable and result in a string).
+% \item[\Parameter{string list}:] comma separated list of layer names (must
+% be expandable and result in strings); first in the list will be added
+% first.
+% \item[\Parameter{string}:] the name of the layer before
+% (\Macro{AddLayersToPageStyleBeforeLayer}) or after
+% (\Macro{AddLayersToPageStyleAfterLayer}) that the layers of the list
+% should be added.
+% \end{description}
+% Note: If the layer from third argument is not part of the page style's layer
+% list, the new layers won't be added anywhere.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\AddLayersToPageStyleAfterLayer}[3]{%
+ \edef\reserved@b{\GetRealPageStyle{#1}}%
+ \IfLayerPageStyleExists{\reserved@b}{%
+ \begingroup
+ \expandafter\let\expandafter\reserved@a
+ \csname @ps@\reserved@b @layers\endcsname
+ \@namedef{@ps@\reserved@b @layers}{}%
+ \def\@elt##1{%
+ \ifstr{##1}\@empty{}{%
+ \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname{{##1}}%
+ \ifstr{##1}{#3}{%
+ \@for \reserved@a:=#2\do {%
+ \scr@trim@spaces\reserved@a
+ \ifstr\reserved@a\@empty{}{%
+ \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname
+ {{\reserved@a}}%
+ }%
+ }%
+ }{}%
+ }%
+ }%
+ \reserved@a
+ \endgroup
+ }{%
+ \scrlayer@lpm@error{#1}{adding layers}%
+ }%
+}
+\newcommand*{\AddLayersToPageStyleBeforeLayer}[3]{%
+ \edef\reserved@b{\GetRealPageStyle{#1}}%
+ \IfLayerPageStyleExists{\reserved@b}{%
+ \begingroup
+ \expandafter\let\expandafter\reserved@a
+ \csname @ps@\reserved@b @layers\endcsname
+ \@namedef{@ps@\reserved@b @layers}{}%
+ \def\@elt##1{%
+ \ifstr{##1}\@empty{}{%
+ \ifstr{##1}{#3}{%
+ \@for \reserved@a:=#2\do {%
+ \scr@trim@spaces\reserved@a
+ \ifstr\reserved@a\@empty{}{%
+ \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname
+ {{\reserved@a}}%
+ }%
+ }%
+ }{}%
+ \expandafter\@cons\csname @ps@#1@layers\endcsname{{##1}}%
+ }%
+ }%
+ \reserved@a
+ \endgroup
+ }{%
+ \scrlayer@lpm@error{#1}{adding layers}%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \AddLayersToPageStyleAfterLayer
+% \end{macro}^^A \AddLayersToPageStyleBeforeLayer
+%
+%
+% \begin{macro}{\UnifyLayersAtPageStyle}
+% \begin{description}
+% \item[\Parameter{string}:] the name of the page style to be unified (must
+% be expandable and result in a string).
+% \end{description}
+% Remove doublets of layers from a page style.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\UnifyLayersAtPageStyle}[1]{%
+ \edef\reserved@b{\GetRealPageStyle{#1}}%
+ \IfLayerPageStyleExists{\reserved@b}{%
+ \expandafter\let\expandafter\reserved@a
+ \csname @ps@\reserved@b @layers\endcsname
+ \@namedef{@ps@\reserved@b @layers}{}%
+ \begingroup
+ \def\@elt##1{%
+ \ifstr{##1}\@empty{}{%
+ \remove@layer@from@page@style{##1}{\reserved@b}%
+ \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname{{##1}}%
+ }%
+ }%
+ \reserved@a
+ \endgroup
+ }{%
+ \scrlayer@lpm@error{#1}{unifying}%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \UnifyLayersAtPageStyle
+%
+% \begin{macro}{\ModifyLayerPageStyleOptions}
+% \begin{macro}{\AddToLayerPageStyleOptions}
+% \begin{description}
+% \item[\Parameter{string}:] the name of the page style to be modified (must
+% be expandable and result in a string).
+% \item[\Parameter{option list}:] comma separated list of named page
+% style options. You may use any of the options provided for
+% \Macro{DeclarePageStyle}.
+% \end{description}
+% \Macro{ModifyLayerPageStyleOptions} replaces the options and only the
+% options from the list by their new
+% values. \Macro{AddToLayerPageStyleOptions} adds the new values to the
+% already given.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\ModifyLayerPageStyleOptions}[2]{%
+ \edef\reserved@a{\GetRealPageStyle{#1}}%
+ \IfLayerPageStyleExists{#1}{%
+ \expandafter\scrlayer@modify@layer@ps@options\expandafter{%
+ \reserved@a
+ }{#2}%
+ }{%
+ \scrlayer@lpm@error{#1}{modifying}%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\scrlayer@modify@layer@ps@options}
+% Helper needed because of alias page styles. Same parameters like
+% \cs{ModifyLayerPageStyleOptions}
+% \begin{macrocode}
+\newcommand*{\scrlayer@modify@layer@ps@options}[2]{%
+ \begingroup
+ \def\scrlayer@current@pagestyle{#1}%
+ \@namedef{@ps@#1@initialhook}{}%
+ \@namedef{@ps@#1@hook}{}%
+ \@namedef{@ps@#1@backgroundhook}{}%
+ \@namedef{@ps@#1@foregroundhook}{}%
+ \@namedef{@ps@#1@oddpagehook}{}%
+ \@namedef{@ps@#1@evenpagehook}{}%
+ \@namedef{@ps@#1@onesidehook}{}%
+ \@namedef{@ps@#1@twosidehook}{}%
+ \@namedef{@ps@#1@floatpagehook}{}%
+ \@namedef{@ps@#1@nonfloatpagehook}{}%
+ \FamilyExecuteOptions[.definelayerpagestyle]{KOMAarg}{#2}%
+ \def\reserved@a{\endgroup}%
+ \def\@sls@##1{%
+ \expandafter\let\expandafter\reserved@b\csname @ps@#1@##1hook\endcsname
+ \ifx\reserved@b\@empty\else
+ \l@addto@macro\reserved@a{\@namedef{@ps@#1@##1hook}}%
+ \expandafter\l@addto@macro\expandafter\reserved@a\expandafter{%
+ \expandafter{%
+ \reserved@b
+ }%
+ }%
+ \fi
+ }%
+ \@sls@{initial}%
+ \@sls@{}%
+ \@sls@{background}%
+ \@sls@{foreground}%
+ \@sls@{oddpage}%
+ \@sls@{evenpage}%
+ \@sls@{oneside}%
+ \@sls@{twoside}%
+ \@sls@{floatpage}%
+ \@sls@{nonfloatpage}%
+ \reserved@a
+}
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@modify@layer@ps@options
+% \begin{macrocode}
+\newcommand*{\AddToLayerPageStyleOptions}[2]{%
+ \IfLayerPageStyleExists{#1}{%
+ \def\scrlayer@current@pagestyle{#1}%
+ \FamilyExecuteOptions[.definelayerpagestyle]{KOMAarg}{#2}%
+ }{%
+ \scrlayer@lpm@error{#1}{modifying}%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \AddToLayerPageStyleOptions
+% \end{macro}^^A \ModifyLayerPageStyleOptions
+%
+% \begin{macro}{\scrlayer@beginartifact}
+% \changes{v3.26}{2018/07/14}{new (semi internal)}^^A
+% \begin{macro}{\scrlayer@endartifact}
+% \changes{v3.26}{2018/07/14}{new (semi internal)}^^A
+% These macros are reserved for tagging packages. The first one is executed
+% after the initial contents hook, the last one is executed after the final
+% contents hook. Both executions are done only, if the \texttt{artifact}
+% option of the layer has been used an was not boolean false. With boolean
+% true the argument will be empty. All other values will be passed as
+% argument.
+%
+% In case of package \textsf{tagpdf} the following definition would be
+% usefull (here automatically done after loading the package, if the package
+% does not do its own definitions):
+% \begin{macrocode}
+%<*package&body>
+\RequirePackage{scrlfile}
+\BeforePackage{tagpdf}{%
+% \end{macrocode}
+% Deactivation of the two commands before loading \textsf{tagpdf}, so that
+% after loading the package \cs{providecommand} can be used to do a new
+% default definition.
+% \begin{macrocode}
+ \let\scrlayer@beginartifact\relax
+ \let\scrlayer@endartifact\relax
+}
+\AfterPackage*{tagpdf}{%
+ \providecommand*{\scrlayer@beginartifact}[1]{%
+ \ifstr{#1}{}{%
+ \tagmcbegin{artifact}%
+ }{%
+ \tagmcbegin{artifact=#1}%
+ }%
+ }%
+ \providecommand*{\scrlayer@endartifact}[1]{%
+ \tagmcend
+ }%
+}
+% \end{macrocode}
+% But the default definition (if \textsf{tagpdf} has not already been loaded)
+% are simple dummies:
+% \begin{macrocode}
+\providecommand*{\scrlayer@beginartifact}[1]{}
+\providecommand*{\scrlayer@endartifact}[1]{}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@endartifact
+% \end{macro}^^A \scrlayer@beginartifact
+%
+% \begin{macro}{\DeclarePageStyleAlias}
+% \begin{macro}{\DeclareNewPageStyleAlias}
+% \begin{macro}{\ProvidePageStyleAlias}
+% \begin{macro}{\RedeclarePageStyleAlias}
+% \begin{description}
+% \item[\Parameter{string}:] The name of the page style to be declared
+% (must be expandable and result in a string).
+% \item[\Parameter{string}:] The name of the existing page style
+% (must be expandable and result in a string).
+% \end{description}
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\DeclarePageStyleAlias}[2]{%
+ \edef\reserved@a{\GetRealPageStyle{#2}}%
+ \scr@ifundefinedorrelax{ps@\reserved@a}{%
+ \PackageError{scrlayer}{unknown real page style `#2'}{%
+ You've tried to declare an alias for page style `#2',\MessageBreak
+ but the real page style of `#2' is undefined.\MessageBreak
+ You can define aliases, only if the real page style has been
+ defined.\MessageBreak
+ If you'll continue, the declaration will be ignored.%
+ }%
+ \DestroyRealLayerPageStyle{#1}%
+ \DestroyLayerAlias{#1}%
+ }{%
+ \@namedef{@ps@#1@alias}{#2}%
+ \@namedef{ps@#1}{\pagestyle{\@nameuse{@ps@#1@alias}}}%
+ }%
+}
+\newcommand*{\DeclareNewPageStyleAlias}[1]{%
+ \@ifundefined{ps@#1}{}{%
+ \PackageError{scrlayer}{%
+ Page style `#1' already defined%
+ }{%
+ You may use \string\DeclareNewPageStyleAlias\space to declare a new
+ page style only\MessageBreak
+ if that page style hasn't been declared or defined before.\MessageBreak
+ You may use either \string\ProvidePageStyleAlias\space to declare the
+ page style only\MessageBreak
+ if it hasn't been declared or defined before, or
+ \string\RedeclarePageStyleAlias\MessageBreak
+ to overwrite the former declaration or definition of the page
+ style\MessageBreak
+ Nevertheless, if you'll continue, the page style will be
+ overwritten\MessageBreak
+ by the new alias.%
+ }%
+ }%
+ \DeclarePageStyleAlias{#1}%
+}
+\newcommand*{\ProvidePageStyleAlias}[2]{%
+ \@ifundefined{ps@#1}{%
+ \DeclarePageStyleAlias{#1}{#2}%
+ }{%
+%<*trace>
+ \PackageInfo{scrlayer}{%
+ \string\ProvidePageStyleAlias{#1}{#2} ignored,\MessageBreak
+ because page style `#1' already\MessageBreak
+ exists%
+ }%
+%</trace>
+ }%
+}
+\newcommand*{\RedeclarePageStyleAlias}[1]{%
+ \@ifundefined{ps@#1}{%
+ \PackageError{scrlayer}{%
+ Page style `#1' not yet defined%
+ }{%
+ You may use \string\RedeclarePageStyleAlias\space to declare a page
+ style only\MessageBreak
+ if that page style has already been declared or defined.\MessageBreak
+ You may use either \string\DeclareNewPageStyleAlias,
+ \string\DeclarePageStyleAlias,\MessageBreak
+ or \string\ProvidePageStyleAlias\space to declare that not yet
+ defined page style.\MessageBreak
+ Nevertheless, if you'll continue, the page style will be declared.%
+ }%
+ }{}%
+ \DeclarePageStyleAlias{#1}%
+}
+% \end{macrocode}
+% \end{macro}^^A \RedeclarePageStyleAlias
+% \end{macro}^^A \ProvidePageStyleAlias
+% \end{macro}^^A \DeclareNewPageStyleAlias
+% \end{macro}^^A \DeclarePageStyleAlias
+%
+% \begin{macro}{\DestroyPageStyleAlias}
+% \begin{description}
+% \item[\Parameter{string}:] the name of a page style (must be
+% expandable and result in a string).
+% \end{description}
+% \begin{macrocode}
+\newcommand*{\DestroyPageStyleAlias}[1]{%
+ \scr@ifundefinedorrelax{@ps@#1@alias}{}{%
+ \expandafter\let\csname @ps@#1@alias\endcsname\relax
+ \expandafter\let\csname ps@#1\endcsname\relax
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\GetRealPageStyle}
+% \begin{description}
+% \item[\Parameter{string}:] the name of a page style (must be
+% expandable and result in a string).
+% \end{description}
+% Get the real name of the page style.
+% \begin{macrocode}
+\newcommand*{\GetRealPageStyle}[1]{%
+ \scr@ifundefinedorrelax{@ps@#1@alias}{#1}{%
+ \expandafter\GetRealPageStyle\expandafter{%
+ \expandafter\csname @ps@#1@alias\expandafter\endcsname\expandafter}%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfLayerPageStyleExists}
+% \begin{macro}{\IfRealLayerPageStyleExists}
+% \begin{description}
+% \item[\Parameter{string}:] the name of the page style to be tested (must
+% be expandable and result in a string).
+% \item[\Parameter{code}:] whatever code should be expanded, if the test
+% result is true.
+% \item[\Parameter{code}:] whatever code should be expanded, if the test
+% result is false.
+% \end{description}
+% Test, whether or not the page style is a declared layer page style.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\IfLayerPageStyleExists}[1]{%
+ \scr@ifundefinedorrelax{ps@#1}{%
+ \expandafter\@secondoftwo
+ }{%
+ \scr@ifundefinedorrelax{@ps@#1@layers}{%
+ \scr@ifundefinedorrelax{@ps@#1@alias}{%
+ \expandafter\@secondoftwo
+ }{%
+ \expandafter\IfLayerPageStyleExists\expandafter{%
+ \expandafter\csname @ps@#1@alias\expandafter\endcsname\expandafter}%
+ }%
+ }{%
+ \expandafter\@firstoftwo
+ }%
+ }%
+}
+\newcommand*{\IfRealLayerPageStyleExists}[1]{%
+ \scr@ifundefinedorrelax{ps@#1}{%
+ \expandafter\@secondoftwo
+ }{%
+ \scr@ifundefinedorrelax{@ps@#1@layers}{%
+ \expandafter\@secondoftwo
+ }{%
+ \expandafter\@firstoftwo
+ }%
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \IfRealLayerPageStyleExists
+% \end{macro}^^A \IfLayerPageStyleExists
+%
+% \begin{macro}{\IfLayerAtPageStyle}
+% \changes{v3.26}{2018/08/29}{\cs{scr@trim@spaces} added}^^A
+% \begin{macro}{\IfSomeLayersAtPageStyle}
+% \changes{v3.26}{2018/08/29}{\cs{scr@trim@spaces} added}^^A
+% \begin{macro}{\IfLayersAtPageStyle}
+% \begin{description}
+% \item[\Parameter{string}:] the name of the page style to be tested (must
+% be expandable and result in a string).
+% \item[\Parameter{string}:] the name(s) of the layer(s) to be tested (must be
+% expandable and result in a string).
+% \item[\Parameter{code}:] whatever code should be expanded, if the test
+% result is true.
+% \item[\Parameter{code}:] whatever code should be expanded, if the test
+% result is false.
+% \end{description}
+% Tests:
+% \begin{description}
+% \item[\Macro{IfLayerAtPageStyle}:] Test, whether or not the page style has a
+% layer. The second argument is the name of one layer only!
+% \item[\Macro{IfSomeLayersAtPageStyle}:] Test, whether or not the page style
+% has at least one layer of a list of layers. The second argument is a comma
+% separated list of layer names.
+% \item[\Macro{IfLayersAtPageStyle}:] Test, whether or not the page style has
+% every layer of a list of layers. The second argument is a comma separated
+% list of layer names.
+% \end{description}
+% Note, that testing an page style, that is not a layer page style will result
+% in an error and neither the third nor the fourth argument will be expanded.
+% Note, that layers with empty name are only part of a layer page style
+% without any layers.
+%
+% Note also, that with active \Option{deactivatepagestylelayers} layers are
+% logically not longer part of the page styles.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\IfLayerAtPageStyle}[2]{%
+ \IfLayerPageStyleExists{#1}{%
+ \begingroup
+ \edef\reserved@a{\GetRealPageStyle{#1}}%
+ \@tempswafalse
+ \ifstr{#2}{}{%
+ \expandafter\ifx\csname @ps@\reserved@a @layers\endcsname\@empty
+ \@tempswatrue
+ \fi
+ }{%
+ \expandafter\ForEachLayerOfPageStyle\expandafter{%
+ \reserved@a}{\ifstr{##1}{#2}{\aftergroup\@tempswatrue}{}}%
+ }%
+ \if@tempswa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi
+ \expandafter\endgroup
+ }{%
+ \scrlayer@lpm@error{#1}{testing for layers}%
+ \expandafter\@gobbletwo
+ }%
+}
+\newcommand*{\IfSomeLayersAtPageStyle}[2]{%
+ \IfLayerPageStyleExists{#1}{%
+ \begingroup
+ \@tempswafalse
+ \@for \reserved@a:=#2\do {%
+ \scr@trim@spaces\reserved@a
+ \edef\reserved@a{\noexpand\IfLayerAtPageStyle{#1}{\reserved@a}}%
+ \reserved@a{\@tempswatrue}{}%
+ }%
+ \if@tempswa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi
+ \expandafter\endgroup
+ }{%
+ \scrlayer@lpm@error{#1}{testing for layers}%
+ \expandafter\@gobbletwo
+ }%
+}
+\newcommand*{\IfLayersAtPageStyle}[2]{%
+ \IfLayerPageStyleExists{#1}{%
+ \begingroup
+ \@tempswatrue
+ \ifstr{#2}{}{%
+ \edef\reserved@a{\GetRealPageStyle{#1}}%
+ \expandafter\ifx\csname @scr@\reserved@a @layers\endcsname\@empty \else
+ \@tempswafalse
+ \fi
+ }{%
+ \@for \reserved@a:=#2\do {%
+ \scr@trim@spaces\reserved@a
+ \edef\reserved@a{\noexpand\IfLayerAtPageStyle{#1}{\reserved@a}}%
+ \reserved@a{}{\@tempswafalse}%
+ }%
+ }%
+ \if@tempswa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi
+ \expandafter\endgroup
+ }{%
+ \scrlayer@lpm@error{#1}{testing for layers}%
+ \expandafter\@gobbletwo
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \IfLayersAtPageStyle
+% \end{macro}^^A \IfSomeLayersAtPageStyle
+% \end{macro}^^A \IfLayerAtPageStyle
+%
+%
+% \begin{macro}{\DestroyRealLayerPageStyle}
+% \begin{description}
+% \item[\Parameter{string}:] name of the layer page style to be destroyed.
+% \end{description}
+% Destroys the given layer page style but not the layers! If the page style is
+% the current page style, the empty page style an empty page style will be
+% activated. If the special page style is valid an the destroyed one, this
+% will be removed. This command may be used, e.g., at
+% \Macro{scrlayerOnAutoRemoveInterface} after destroying the layers.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\DestroyRealLayerPageStyle}[1]{%
+ \IfRealLayerPageStyleExists{#1}{%
+ \expandafter\let\csname @ps@#1@initialhook\endcsname\relax
+ \expandafter\let\csname @ps@#1@hook\endcsname\relax
+ \expandafter\let\csname @ps@#1@backgroundhook\endcsname\relax
+ \expandafter\let\csname @ps@#1@foregroundhook\endcsname\relax
+ \expandafter\let\csname @ps@#1@oddpagehook\endcsname\relax
+ \expandafter\let\csname @ps@#1@evenpagehook\endcsname\relax
+ \expandafter\let\csname @ps@#1@onesidehook\endcsname\relax
+ \expandafter\let\csname @ps@#1@twosidehook\endcsname\relax
+ \expandafter\let\csname @ps@#1@floatpagehook\endcsname\relax
+ \expandafter\let\csname @ps@#1@nonfloatpagehook\endcsname\relax
+ \expandafter\let\csname @ps@#1@layers\endcsname\relax
+ \expandafter\let\csname ps@#1\endcsname\relax
+ \ifstr{\currentpagestyle}{#1}{%
+ \def\currentpagestyle{scrlayer@empty}%
+ \let\@oddhead\@empty\let\@evenhead\@empty
+ \let\@oddfoot\@empty\let\@evenfoot\@empty
+ }{}%
+ \if@specialpage
+ \ifstr{\@specialstyle}{#1}{%
+ \global\let\@specialstyle\relax
+ \global\@specialpagefalse
+ }{}%
+ \fi
+ }{%
+%<*trace>
+ \PackageInfo{scrlayer}{%
+ \string\DestroyRealLayerPageStyle{#1} ignored,\MessageBreak
+ because the layer page style isn't\MessageBreak
+ defined (any longer)%
+ }%
+%</trace>
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \DestroyRealLayerPageStyle
+%
+%
+% \subsection{Kernel Patches}
+%
+% This package as so many others need to patch the \LaTeX{} kernel. This will
+% be done, because we need information about the current active package style.
+%
+% \begin{macro}{\pagestyle}
+% \begin{macro}{\currentpagestyle}
+% We save the current page style. Note, that this doesn't work for special
+% page styles\footnote{Special page styles are set by
+% \Macro{thispagestyle}.} that hasn't been defined using
+% \Package{scrlayer}. As long as \Macro{currentpagestyle} is empty, the
+% current page style is unknown. And we add two hooks into page style
+% selection: one before an one after the selection.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\currentpagestyle}{}
+\PackageInfo{scrlayer}{patching LaTeX kernel macro \string\pagestyle}
+\def\reserved@a{%
+ \iftoplevelpagestyle\edef\toplevelpagestyle{##1}\toplevelpagestylefalse\fi
+ \scrlayer@exec@before@pagestyle@hook{##1}%
+}
+\expandafter\expandafter\expandafter\renewcommand
+\expandafter\expandafter\expandafter*%
+\expandafter\expandafter\expandafter\pagestyle
+\expandafter\expandafter\expandafter[%
+\expandafter\expandafter\expandafter1%
+\expandafter\expandafter\expandafter]%
+\expandafter\expandafter\expandafter{%
+ \expandafter\reserved@a
+ \pagestyle{#1}%
+ \edef\currentpagestyle{\GetRealPageStyle{#1}}%
+ \scrlayer@exec@after@pagestyle@hook{#1}%
+ \toplevelpagestyletrue
+}
+\newif\iftoplevelpagestyle\toplevelpagestyletrue
+\AtBeginDocument{%
+ \begingroup
+ \let\scrlayer@exec@before@pagestyle@hook\@gobble
+ \let\scrlayer@exec@after@pagestyle@hook\@gobble
+ \def\ps@test{}%
+ \pagestyle{test}%
+ \ifstr{\currentpagestyle}{test}{}{%
+ \PackageError{scrlayer}{package incompatibility detected}{%
+ Another package redefines \string\pagestyle\space incompatible with
+ scrlayer.\MessageBreak
+ This disables setting of \string\currentpagestyle\space and may
+ be serious.\MessageBreak
+ Maybe you could prevent this loading package scrlayer
+ later.\MessageBreak
+ If not you should either not use scrlayer or not the other
+ package,\MessageBreak
+ that redefines \string\pagestyle.%
+ }%
+ }%
+ \endgroup
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \currentpagestyle
+%
+% \begin{macro}{\BeforeSelectAnyPageStyle}
+% \begin{macro}{\scrlayer@exec@before@pagestyle@hook}
+% \begin{macro}{\AfterSelectAnyPageStyle}
+% \begin{macro}{\scrlayer@exec@after@pagestyle@hook}
+% We have two macros to locally add code to be executed whenever a page style
+% changes using \Macro{pagestyle}. The first one executes the code before the
+% page style will be changed, the second one after the page style has been
+% changed. Note, that you may use \#1 as a placeholder of the argument of
+% \Macro{pagestyle}.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\BeforeSelectAnyPageStyle}[1]{%
+ \expandafter\renewcommand\expandafter*%
+ \expandafter\scrlayer@exec@before@pagestyle@hook
+ \expandafter[\expandafter1\expandafter]\expandafter{%
+ \scrlayer@exec@before@pagestyle@hook{##1}#1}%
+}
+\newcommand*{\scrlayer@exec@before@pagestyle@hook}[1]{}
+\newcommand*{\AfterSelectAnyPageStyle}[1]{%
+ \expandafter\renewcommand\expandafter*%
+ \expandafter\scrlayer@exec@after@pagestyle@hook
+ \expandafter[\expandafter1\expandafter]\expandafter{%
+ \scrlayer@exec@after@pagestyle@hook{##1}#1}%
+}
+\newcommand*{\scrlayer@exec@after@pagestyle@hook}[1]{}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@exec@after@pagestyle@hook
+% \end{macro}^^A \AfterSelectAnyPageStyle
+% \end{macro}^^A \scrlayer@exec@before@pagestyle@hook
+% \end{macro}^^A \BeforeSelectAnyPageStyle
+% \end{macro}^^A \pagestyle
+%
+%
+% \subsection{Declaration of End User Interfaces}
+%
+% The package also supports an interface for loading end user interfaces.
+% Maybe it would be a good idea to move this to \Package{scrbase}, but
+% currently it is not needed.
+%
+% \begin{macro}{\scrlayerAddToInterface}
+% \begin{macro}{\scrlayerAddCsToInterface}
+% \begin{description}
+% \item[\texttt{\{\meta{command}\textbar\meta{command sequence}\}}:] the
+% command (with backslash) or the command sequence of the command (without
+% backslash) of the command, that should be added to the interface.
+% \item[\Parameter{code}:] will be executed, only if the command could be
+% added to the interface.
+% \end{description}
+% Add either a command sequence or a command to the user interface.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\scrlayerAddToInterface}[2][\@currname.\@currext]{%
+ \begingroup
+ \edef\reserve@a{%
+ \noexpand\scrlayerAddCsToInterface[#1]{\expandafter\@gobble\string #2}%
+ }%
+ \expandafter\endgroup\reserve@a
+}
+\newcommand{\scrlayerAddCsToInterface}[3][\@currname.\@currext]{%
+ \@ifundefined{scrlayer@#1@commandlist}{%
+ \PackageError{scrlayer}{unkown interface `#1'}{%
+ I've been told to add a command sequence to an interface, that hasn't
+ been\MessageBreak
+ defined yet. Please initialise every interface using
+ \string\InitInterface\space before\MessageBreak
+ trying to add command sequences to it.\MessageBreak
+ If you'll continue, the command will be ignored.%
+ }%
+ }{%
+ \@ifundefined{#2}{%
+ \scrlayer@AddCsToInterface[#1]{#2}#3%
+ }{%
+ \@ifundefined{scrlayer@command@#2}{%
+ \ifscrlayer@forceoverwrite
+ \PackageWarning{scrlayer}{%
+ Overloading `\@backslashchar#2'!\MessageBreak
+ scrlayer detected, that the given command\MessageBreak
+ has been defined already, when\MessageBreak
+ `#1' tried to define it again.\MessageBreak
+ Nevertheless, while scrlayer is in force overwrite\MessageBreak
+ mode currently, the original definition will be\MessageBreak
+ removed%
+ }%
+ \expandafter\let\csname #2\endcsname\relax
+ \scrlayer@AddCsToInterface[#1]{#2}#3%
+ \else
+ \PackageError{scrlayer}{cannot define `\@backslashchar#2'}{%
+ scrlayer interface `#1' has tried to
+ define command\MessageBreak
+ `\@backslashchar#2', but this has already been defined\MessageBreak
+ and is not part of another interface. So it cannot be
+ defined.\MessageBreak
+ Before continuing you should solve this conflict.\MessageBreak
+ Nevertheless, you may use option `forceoverwrite' to get only a
+ warning instead\MessageBreak
+ of an error. But this wouldn't solve the problem at
+ all!\MessageBreak
+ This error is almost fatal, so you should abort the LaTeX
+ run.%
+ }%
+ \fi
+ }{%
+ \ifscrlayer@autoremoveinterfaces
+ \PackageInfo{scrlayer}{%
+ already define interface command\MessageBreak
+ `\@backslashchar#2' detected.\MessageBreak
+ Command has been defined by interface\MessageBreak
+ `\@nameuse{scrlayer@command@#2}'.\MessageBreak
+ To continue installation of interface\MessageBreak
+ `#1', interface\MessageBreak
+ `\@nameuse{scrlayer@command@#2}' will\MessageBreak
+ be removed%
+ }%
+ \@nameuse{scrlayer@\@nameuse{scrlayer@command@#2}@onremove}%
+ \begingroup
+ \def\@elt##1{%
+ \aftergroup\let\aftergroup##1\aftergroup\relax
+ }%
+ \@nameuse{scrlayer@\@nameuse{scrlayer@command@#2}@commandlist}%
+ \endgroup
+ \expandafter\let\csname
+ scrlayer@\@nameuse{scrlayer@command@#2}@commandlist\endcsname\relax
+ \expandafter\let\csname
+ scrlayer@\@nameuse{scrlayer@command@#2}@onremove\endcsname\relax
+ \expandafter\let\csname #2\endcsname\relax
+ \scrlayer@AddCsToInterface[#1]{#2}#3%
+ \else
+ \PackageError{scrlayer}{cannot define `\@backslashchar#2'}{%
+ Interface command `\@backslashchar#2' has already
+ been\MessageBreak
+ defined by interface
+ `\@nameuse{scrlayer@command@#2}'.\MessageBreak
+ So it cannot be defined again.\MessageBreak
+ You may try scrlayer option `autoremoveinterfaces' to
+ automatically remove\MessageBreak
+ older interfaces in such conflict situations.\MessageBreak
+ For now, it's recommended so solve the problem before you'll
+ continue.%
+ }%
+ \fi
+ }%
+ }%
+ }%
+}%
+% \end{macrocode}
+% \begin{macro}{\scrlayer@AddCsToInterface}
+% Little helper, to avoid repeating this \Macro{expandafter} orgy.
+% \begin{description}
+% \item[\OParameter{string}:] the interface name (must be expandable and
+% expand to a string)
+% \item[\Parameter{command sequence}] the command sequence of the command to
+% be added.
+% \end{description}
+% \begin{macrocode}
+\newcommand*\scrlayer@AddCsToInterface[2][\@currname.\@currext]{%
+ \expandafter\expandafter\expandafter\def\expandafter
+ \csname scrlayer@#1@commandlist\expandafter\expandafter\expandafter\endcsname
+ \expandafter\expandafter\expandafter{%
+ \csname scrlayer@#1@commandlist\expandafter\endcsname
+ \expandafter\@elt\csname #2\endcsname
+ }%
+ \@namedef{scrlayer@command@#2}{#1}%
+}
+%</package&body>
+% \end{macrocode}
+% \begin{option}{forceoverwrite}
+% \begin{macro}{\ifscrlayer@forceoverwrite}
+% \begin{description}
+% \item[\Parameter{simple switch}:] whether or not to overwrite already
+% defined command. Note: If true, there will still be a warning.
+% \end{description}
+% \begin{macrocode}
+%<*options>
+%<*package>
+\KOMA@ifkey{forceoverwrite}{scrlayer@forceoverwrite}
+%</package>
+%<*interface>
+\KOMA@key{forceoverwrite}[true]{%
+ \KOMA@set@ifkey{forceoverwrite}{scrlayer@forceoverwrite}{#1}%
+ \KOMA@kav@replacebool{.scrlayer.sty}{forceoverwrite}{scrlayer@forceoverwrite}%
+}
+%</interface>
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @forceoverwrite\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @forceoverwrite@default\endcsname\relax
+%</interface&body>
+% \end{macrocode}
+% \end{macro}^^A \ifscrlayer@forceoverwrite
+% \end{option}^^A forceoverwrite
+%
+% \begin{option}{autoremoveinterfaces}
+% \begin{macro}{\ifscrlayer@autoremoveinterfaces}
+% \begin{description}
+% \item[\Parameter{simple switch}:] whether or not older interfaces may be
+% automatically removed in conflict cases.
+% \end{description}
+% \begin{macrocode}
+%<*options>
+%<*package>
+\KOMA@ifkey{autoremoveinterfaces}{scrlayer@autoremoveinterfaces}
+%</package>
+%<*interface>
+\KOMA@key{autoremoveinterfaces}[true]{%
+ \KOMA@set@ifkey{autoremoveinterfaces}{scrlayer@autoremoveinterfaces}{#1}%
+ \KOMA@kav@replacebool{.scrlayer.sty}{autoremoveinterfaces}
+ {scrlayer@autoremoveinterfaces}%
+}
+%</interface>
+%</options>
+%<*interface&body>
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @autoremoveinterfaces\endcsname\relax
+\expandafter\let
+ \csname KV@KOMA.\@currname.\@currext @autoremoveinterfaces@default\endcsname
+ \relax
+%</interface&body>
+% \end{macrocode}
+% \end{macro}^^A \ifscrlayer@autoremoveinterfaces
+% \end{option}^^A autoremoveinterfaces
+% \end{macro}^^A \scrlayer@AddCsToInterface
+% \end{macro}^^A \scrlayerAddCsToInterface
+% \end{macro}^^A \scrlayerAddToInterface
+%
+% \begin{macro}{\scrlayerInitInterface}
+% \begin{description}
+% \item[\OParameter{string}:] the name of the interface. Generally this is
+% the file name of the package or class, that defines the interface
+% (default: \texttt{\Macro{@currname}.\Macro{@currext}}).
+% \end{description}
+% This registers a new user interface.
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\scrlayerInitInterface}[1][\@currname.\@currext]{%
+ \@ifundefined{scrlayer@#1@commandlist}{%
+ \@namedef{scrlayer@#1@commandlist}{}%
+ }{%
+ \begingroup
+ \def\@elt##1{\space\space\string##1\MessageBreak}%
+ \PackageError{scrlayer}{interface `#1' already initialised}{%
+ You've tried to initialise scrlayer interface `#1',\MessageBreak
+ but an interface of this name has been initialised
+ already.\MessageBreak
+ Here's a list of all macros of the already initialised
+ interface:\MessageBreak
+ \@nameuse{scrlayer@#1@commandlist}.%
+ If you'll continue, this re-initialisation will be ignored.%
+ }%
+ \endgroup
+ }%
+}
+%</package&body>
+% \end{macrocode}
+% The initialisation has to be done by each interface package:
+% \begin{macrocode}
+%<interface&init>\scrlayerInitInterface
+% \end{macrocode}
+% \end{macro}^^A \scrlayerInitInterface
+%
+% \begin{macro}{\scrlayerOnAutoRemoveInterface}
+% \begin{description}
+% \item[\OParameter{string}:] the name of the interface. Generally this is
+% the file name of the package or class, that defines the interface
+% (default: \texttt{\Macro{@currname}.\Macro{@currext}}).
+% \item[\Parameter{code}:] will be executed if the interface will be removed
+% automatically (see option \Option{autoremoveinterfaces}).
+% \end{description}
+% \begin{macrocode}
+%<*package&body>
+\newcommand*{\scrlayerOnAutoRemoveInterface}[2][\@currname.\@currext]{%
+ \@ifundefined{scrlayer@#1@onremove}{\@namedef{scrlayer@#1@onremove}{}}{}%
+ \expandafter\l@addto@macro\csname scrlayer@#1@onremove\endcsname{#2}%
+}
+%</package&body>
+% \end{macrocode}
+% \end{macro}^^A \scrlayerOnAutoRemoveInterface
+%
+%
+% \iffalse^^A meta-comment
+%</package|interface|class>
+% \fi^^A meta-comment
+%
+%
+% \Finale
+%
+\endinput
+%
+% end of file `scrlayer.dtx'
+
+%%% Local Variables:
+%%% mode: doctex
+%%% mode: flyspell
+%%% ispell-local-dictionary: "en_GB"
+%%% TeX-master: t
+%%% End: