summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/koma-script/scrlayer-scrpage.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/koma-script/scrlayer-scrpage.dtx')
-rw-r--r--macros/latex/contrib/koma-script/scrlayer-scrpage.dtx2495
1 files changed, 2495 insertions, 0 deletions
diff --git a/macros/latex/contrib/koma-script/scrlayer-scrpage.dtx b/macros/latex/contrib/koma-script/scrlayer-scrpage.dtx
new file mode 100644
index 0000000000..f7c7565a2d
--- /dev/null
+++ b/macros/latex/contrib/koma-script/scrlayer-scrpage.dtx
@@ -0,0 +1,2495 @@
+% \iffalse^^A meta-comment
+% ======================================================================
+% scrlayer-scrpage.dtx
+% Copyright (c) Markus Kohm, 2012-2022
+%
+% This file is part of the LaTeX2e KOMA-Script bundle.
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c of the license.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 and of this work.
+%
+% This work has the LPPL maintenance status "author-maintained".
+%
+% The Current Maintainer and author of this work is Markus Kohm.
+%
+% This work consists of all files listed in MANIFEST.md.
+% ======================================================================
+%%% From File: $Id: scrlayer-scrpage.dtx 3889 2022-06-09 12:11:14Z kohm $
+%<identify>%%% (run: identify)
+%<init>%%% (run: init)
+%<options>%%% (run: options)
+%<body>%%% (run: body)
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\begingroup
+ \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
+ \filedate$Date: 2022-06-09 14:11:14 +0200 (Do, 09. Jun 2022) $
+ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
+ \filerevision$Revision: 3889 $
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\ProvidesFile{scrlayer-scrpage.dtx}%
+ [\filedate\space\filerevision\space
+ KOMA-Script package source
+ }%
+\reserved@a
+%</dtx>
+%<*identify>
+%<interface>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+%<interface>\ProvidesPackage{scrlayer-scrpage}[%
+%!KOMAScriptVersion
+%<interface> package
+%</identify>
+%<*dtx|identify>
+ (end user interface for scrlayer)]
+%</dtx|identify>
+%<*dtx>
+\ifx\documentclass\undefined
+ \input scrdocstrip.tex
+ \@@input scrkernel-version.dtx
+ \@@input scrstrip.inc
+ \KOMAdefVariable{COPYRIGHTFROM}{2012}
+ \generate{\usepreamble\defaultpreamble
+ \file{scrlayer-scrpage.sty}{%
+ \from{scrlayer-scrpage.dtx}{interface,scrpage,identify}%
+ \from{scrlayer.dtx}{interface,scrpage,init}%
+ \from{scrlayer-scrpage.dtx}{interface,scrpage,init}%
+ \from{scrlayer.dtx}{interface,scrpage,options}%
+ \from{scrlayer-scrpage.dtx}{interface,scrpage,options}%
+ \from{scrlayer.dtx}{interface,scrpage,body}%
+ \from{scrlayer-scrpage.dtx}{interface,scrpage,body}%
+ \from{scrlogo.dtx}{logo}%
+ }%
+ }
+ \@@input scrstrop.inc
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
+\documentclass[USenglish]{koma-script-source-doc}
+\usepackage{babel}
+\setcounter{StandardModuleDepth}{2}
+% We need (foo,bar)
+\DeclareRobustCommand*{\pparg}[2]{\texttt(\meta{#1}\texttt,\meta{#2}\texttt)}
+% and {foo:bar}
+\DeclareRobustCommand*{\mmarg}[2]{%
+ \texttt{\char`\{}\meta{#1}\texttt:\meta{#2}\texttt{\char`\}}}
+\begin{document}
+ \DocInput{scrlayer-scrpage.dtx}
+\end{document}
+%</dtx>
+% \fi^^A meta-comment
+%
+% \changes{v0.0}{2012/01/01}{start of interface}
+% \changes{v3.32}{2020/09/11}{do not use deprecated interface commands}
+% \changes{v3.36}{2022/02/09}{switch over from \cls*{scrdoc} to
+% \cls*{koma-script-source-doc}}
+% \changes{v3.36}{2022/02/09}{require package \pkg*{scrlogo} instead of
+% defining \cs{KOMAScript}}
+% \changes{v3.36}{2022/02/09}{whole implementation documentation in English}
+%
+% \GetFileInfo{scrlayer-scrpage.dtx}
+% \title{The \texttt{scrlayer} Interface of
+% \href{https://komascript.de}{\KOMAScript} Package \pkg*{scrlayer-scrpage}}
+% \author{\href{mailto:komascript@gmx.info}{Markus Kohm}}
+% \date{Revision \fileversion{} of \filedate}
+% \maketitle
+% \begin{abstract}
+% This package defines several extensions above \pkg*{scrlayer} for easy
+% handling of pairs of \emph{headings} and \emph{plain} page styles. So this
+% widely is a replacement of the not any longer supported, former
+% \KOMAScript{} package \pkg{scrpage2}.
+% \end{abstract}
+% \tableofcontents
+%
+% \section{User Manual}
+%
+% You can find the user manuals of \pkg*{scrlayer-scrpage} in the \KOMAScript{}
+% manual, either the German \file{scrguide} or the English \file{scrguien}.
+%
+% \MaybeStop{\PrintIndex}
+%
+%
+% \section{Implementation of \pkg*{scrlayer-scrpage}}
+% \label{sec:scrlayer-scrpage}
+%
+% This section if for developers only.
+%
+% \begin{macrocode}
+%<*interface>
+% \end{macrocode}
+%
+%
+% \subsection{Initialising some values before the options}
+%
+% \begin{macrocode}
+%<*init>
+% \end{macrocode}
+%
+% Initialisation before all options (even the options from
+% \file{scrlayer.dtx}).
+%
+% Currently nothing to do.
+%
+% \begin{macrocode}
+%</init>
+% \end{macrocode}
+%
+%
+% \subsection{Options}
+%
+% \begin{macrocode}
+%<*options>
+% \end{macrocode}
+%
+% Package \pkg{scrpage2} didn't support \KOMAScript{} options but only
+% regular \LaTeX{} package options. This interface will also support those
+% options, but uses \KOMAScript{} options for the implementation. This
+% results in additional features of the interface.
+%
+% Note, that some options are already defined before this by the common option
+% parts of \file{scrlayer.dtx}. All others will follow step by step in the
+% main part.
+%
+% Options \opt{headinclude}, \opt{headexclude}, \opt{footinclude} and
+% \opt{footexclude} of package \pkg{scrpage2} are deprecated since
+% package version 2.3, 2008-12-08. They won't be supported by the
+% \pkg*{scrlayer-scrpage} interface.
+%
+% Additional initialisation may be done here, but currently this isn't
+% needed.
+%
+% \begin{macrocode}
+%</options>
+% \end{macrocode}
+%
+%
+% \subsection{Width of header and footer}
+%
+% \pkg{scrpage2} provided commands \cs{setheadwidth} and \cs{setfootwidth} to
+% set the width of the page head or footer different from the width of the
+% text area of the page. Optionally those commands allow to setup an
+% horizontal offset for the head or footer. This interface provides the same
+% feature but prefers to set up the widths and offsets with \KOMAScript{}
+% options. Those options will become the primary interface.
+%
+% \begin{option}{headwidth}
+% \changes{v0.9.1757}{2014/04/09}{new: two offsets available}
+% \changes{v3.17}{2015/02/25}{new: store the values}
+% \begin{option}{footwidth}
+% \changes{v0.9.1757}{2014/04/09}{new: two offsets available}
+% \changes{v3.15}{2014/12/28}{fix: missing colon in call of
+% \cs{sls@split@at@iicolons}}
+% \changes{v3.17}{2015/02/25}{new: store the values}
+% \begin{description}
+% \item[\texttt{=\meta{special dimensional expression}:\meta{special
+% dimensional expression}}:] see \cs{sls@settowidthof} for information about
+% the syntax of \meta{special dimensional expression}. The width of the page
+% head or footer will be set to the result of the first on, the offset to
+% the result of the second one. If the first one\,---\,the width\,---\,is
+% omitted, the current width will be used. If the second one\,---\,the
+% offset\,---\,is omitted and the width is the width of the text area plus
+% the margin note column, the offset will be set to zero. If the second one
+% is omitted and the width is not the width of the text area plus the margin
+% note column, a special kind of centering will be used.
+% \end{description}
+% These options may be used to set up the widths of head and foot.
+% \begin{macrocode}
+%<*options>
+\KOMA@key{headwidth}{%
+ \begingroup
+ \sls@split@at@iicolons#1:::\@nil
+ \ifx\reserved@a\@empty \let\reserved@a\sls@headwidth\fi
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\sls@set@hf@width{head}{\reserved@b}{\reserved@c}{\reserved@a}%
+ \noexpand\FamilyKeyStateProcessed
+ \noexpand\KOMA@kav@replacevalue{.scrlayer-scrpage.sty}{headwidth}{%
+ \reserved@a:\reserved@b:\reserved@c
+ }%
+ }%
+ \reserved@a
+}
+\KOMA@key{footwidth}{%
+ \begingroup
+ \sls@split@at@iicolons#1:::\@nil
+ \ifx\reserved@a\@empty \let\reserved@a\sls@footwidth\fi
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\sls@set@hf@width{foot}{\reserved@b}{\reserved@c}{\reserved@a}%
+ \noexpand\FamilyKeyStateProcessed
+ \noexpand\KOMA@kav@replacevalue{.scrlayer-scrpage.sty}{footwidth}{%
+ \reserved@a:\reserved@b:\reserved@c
+ }%
+ }%
+ \reserved@a
+}
+% \end{macrocode}
+% \begin{macro}{\sls@split@at@iicolons}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{description}
+% \item[\texttt{\meta{balanced}:\meta{balanced}:\meta{balanced}\cs{@nil}}:]
+% first \meta{balanced} will be stored into \cs{reserved@a}, second into
+% \cs{reserved@b}, third will be eaten and warn about if it is neither empty
+% and nor a colon.
+% \end{description}
+% This little helper is used, e.g., by options \opt{headwidth} and
+% \opt{footwidth}.
+% \begin{macrocode}
+\newcommand\sls@split@at@iicolons{}
+\def\sls@split@at@iicolons#1:#2:#3:#4\@nil{%
+ \Ifstr{#4}{}{}{%
+ \Ifstr{#4}{:}{}{%
+ \Ifstr{#4}{::}{}{%
+ \PackageWarning{scrlayer}{extra `:' found!\MessageBreak
+ You've used more than two colons at the argument\MessageBreak
+ of a two value option.\MessageBreak
+ The extra value(s) will be ignored%
+ }%
+ }%
+ }%
+ }%
+ \def\reserved@a{#1}%
+ \def\reserved@b{#2}%
+ \def\reserved@c{#3}%
+}%
+% \end{macrocode}
+% \end{macro}^^A \sls@split@at@iicolons
+% \begin{macro}{\sls@set@hf@width}
+% \changes{v0.9.1757}{2014/04/09}{new: two offsets available}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{description}
+% \item[\marg{head or foot}:] to complete the macro names for page head or
+% footer, either \texttt{head} or \texttt{foot}.
+% \item[\marg{special dimensional expression}:] the offset odd page
+% \item[\marg{special dimensional expression}:] the offset even page
+% \item[\marg{special dimensional expression}:] the width
+% \end{description}
+% This helper will generally set up width an offset of either head or footer.
+% \begin{macrocode}
+\newcommand*{\sls@set@hf@width}[4]{%
+ \sls@settowidthof{\@tempdima}{#4}%
+ \ifdim\@tempdima>\paperwidth
+ \PackageWarning
+ {scrlayer-scrpage}%
+ {You've set width of #1 to a value\MessageBreak
+ greater than width of page!\MessageBreak%
+ I'll reduce width of #1 to width of page}%
+ \setlength{\@tempdima}{\paperwidth}%
+ \else
+ \ifdim\@tempdima<\z@
+ \PackageWarning
+ {scrlayer-scrpage}%
+ {You've set width of #1 to negative value!\MessageBreak%
+ I'll set it to 0pt}%
+ \setlength{\@tempdima}{\z@}%
+ \fi
+ \fi
+ \expandafter\edef\csname sls@#1width\endcsname{\the\@tempdima}%
+ \setlength{\@tempdima}{\textwidth}%
+ \addtolength{\@tempdima}{-\csname sls@#1width\endcsname}%
+ \Ifstr{#2}{}{%
+ \ifdim \csname sls@#1width\endcsname
+ = \dimexpr \textwidth+\marginparwidth+\marginparsep\relax
+ \setlength{\@tempdimb}{\z@}
+ \else
+ \if@twoside
+ \setlength{\@tempdimb}{.3333333333\@tempdima}%
+ \else
+ \setlength{\@tempdimb}{.5\@tempdima}%
+ \fi
+ \fi
+ }{%
+ \sls@settowidthof{\@tempdimb}{#2}%
+ }%
+ \Ifstr{#3}{}{%
+ \addtolength{\@tempdima}{-\@tempdimb}%
+ }{%
+ \sls@settowidthof{\@tempdima}{#3}%
+ \setlength{\@tempdima}{-\@tempdima}%
+ }%
+ \ifdim\@tempdimb<\z@
+ \setlength{\@tempdimb}{-\@tempdimb}%
+ \expandafter\edef\csname sls@odd#1shift\endcsname{-\the\@tempdimb}%
+ \else
+ \expandafter\edef\csname sls@odd#1shift\endcsname{\the\@tempdimb}%
+ \fi
+ \ifdim\@tempdima<\z@
+ \setlength{\@tempdima}{-\@tempdima}%
+ \expandafter\edef\csname sls@even#1shift\endcsname{-\the\@tempdima}%
+ \else
+ \expandafter\edef\csname sls@even#1shift\endcsname{\the\@tempdima}%
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}^^A \sls@set@hf@width
+% \begin{macro}{\sls@headwidth,\sls@oddheadshift,\sls@evenheadshift,
+% \sls@footwidth,\sls@oddfootshift,\sls@evenfootshift}
+% To store width and offset of page head an footer, we use macros. Those are
+% also used by the options and therefore need to be initialised before option
+% usage.
+% \begin{macrocode}
+\scr@ifundefinedorrelax{@headwidth}{%
+ \newcommand*{\sls@headwidth}{\textwidth}%
+ \KOMA@kav@add{.scrlayer-scrpage.sty}{headwidth}{\textwidth:0pt:0pt}%
+}{%
+ \newcommand*{\sls@headwidth}{\@headwidth}%
+ \KOMA@kav@xadd{.scrlayer-scrpage.sty}{headwidth}{\@headwidth:0pt:0pt}%
+}%
+\newcommand*{\sls@oddheadshift}{0pt}
+\newcommand*{\sls@evenheadshift}{0pt}
+\scr@ifundefinedorrelax{@footwidth}{%
+ \newcommand*{\sls@footwidth}{\textwidth}%
+ \KOMA@kav@add{.scrlayer-scrpage.sty}{footwidth}{\textwidth:0pt:0pt}
+}{%
+ \newcommand*{\sls@footwidth}{\@footwidth}%
+ \KOMA@kav@xadd{.scrlayer-scrpage.sty}{footwidth}{\@footwidth:0pt:0pt}
+}%
+\newcommand*{\sls@oddfootshift}{0pt}
+\newcommand*{\sls@evenfootshift}{0pt}
+% \end{macrocode}
+% \end{macro}^^A \sls@headwidth … \sls@evenfootshift
+%
+% \begin{macro}{\sls@settowidthof,\sls@deftowidthof}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% the special dimensional expressions may be either one of the strings
+% \texttt{paper}, \texttt{text}, \texttt{marginpar},
+% \texttt{textwithmarginpar}, \texttt{head}, \texttt{foot},
+% \texttt{headtopline}, \texttt{headsepline}, \texttt{footsepline},
+% \texttt{footbotline}, or \texttt{page} or a valid dimensional
+% expression. But it cannot be both a dimensional expression using symbolic
+% values!
+% \begin{macrocode}
+\newcommand*{\sls@settowidthof}[2]{%
+ \Ifstr{#2}{paper}{%
+ \setlength{#1}{\paperwidth}%
+ }{%
+ \Ifstr{#2}{text}{%
+ \setlength{#1}{\textwidth}%
+ }{%
+ \Ifstr{#2}{marginpar}{%
+ \setlength{#1}{\dimexpr \marginparwidth+\marginparsep\relax}%
+ }{%
+ \Ifstr{#2}{textwithmarginpar}{%
+ \setlength{#1}{\dimexpr\textwidth
+ +\marginparwidth
+ +\marginparsep\relax}%
+ }{%
+ \Ifstr{#2}{head}{%
+ \setlength{#1}{\sls@headwidth}%
+ }{%
+ \Ifstr{#2}{foot}{%
+ \setlength{#1}{\sls@footwidth}%
+ }{%
+ \Ifstr{#2}{headtopline}{%
+ \setlength{#1}{\sls@headabove@linelength}%
+ }{%
+ \Ifstr{#2}{headsepline}{%
+ \setlength{#1}{\sls@headbelow@linelength}%
+ }{%
+ \Ifstr{#2}{footsepline}{%
+ \setlength{#1}{\sls@footabove@linelength}%
+ }{%
+ \Ifstr{#2}{footbotline}{%
+ \setlength{#1}{\sls@footbelow@linelength}%
+ }{%
+ \Ifstr{#2}{page}{%
+ \setlength{#1}{\paperwidth}%
+ \begingroup
+ \expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname ta@bcor\endcsname\relax\else
+ \addtolength{#1}{-\ta@bcor}%
+ \fi
+ }{%
+ \setlength{#1}{\dimexpr #2\relax}%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+}%
+\newcommand*{\sls@deftowidthof}[2]{%
+ \Ifstr{#2}{autohead}{%
+ \expandafter\def\csname #1\endcsname{\sls@headwidth}%
+ }{%
+ \Ifstr{#2}{autofoot}{%
+ \expandafter\def\csname #1\endcsname{\sls@footwidth}%
+ }{%
+ \sls@settowidthof{\@tempdima}{#2}%
+ \expandafter\edef\csname #1\endcsname{\the\@tempdima}%
+ }%
+ }%
+}%
+%</options>
+% \end{macrocode}
+% \end{macro}^^A \sls@deftowidthof,\sls@settowidthof
+% \end{option}^^A footwidth
+% \end{option}^^A footheight
+%
+% \begin{command}{\setheadwidth,\setfootwidth}
+% \changes{v3.36}{2022/02/09}{warning about deprecated command}
+% For compatibility with \pkg{scrpage2}, map the commands to the options:
+% \begin{macrocode}
+%<*body>
+\newcommand*{\setheadwidth}[2][]{%
+ \PackageWarning{scrlayer-scrpage}{%
+ Command `\string\setheadwidth' is deprecated.\MessageBreak
+ I'm using \detokenize{\KOMAoptions{headwidth=#2:#1}} instead,\MessageBreak
+ and so should you do}%
+ \KOMAoptions{headwidth=#2:#1}%
+}%
+\newcommand*{\setfootwidth}[2][]{%
+ \PackageWarning{scrlayer-scrpage}{%
+ Command `\string\setfootwidth' is deprecated.\MessageBreak
+ I'm using \detokenize{\KOMAoptions{footwidth=#2:#1}} instead,\MessageBreak
+ and so should you do}%
+ \KOMAoptions{footwidth=#2:#1}%
+}%
+%</body>
+% \end{macrocode}
+% \end{command}^^A \setheadwidth,\setfootwidth
+%
+%
+% \subsection{Lines in page head and footer}
+%
+% The interface implements the options \opt{headtopline}, \opt{headsepline},
+% \opt{footsepline}, \opt{footbotline}, \opt{plainheadtopline},
+% \opt{plainheadsepline}, \opt{plainfootsepline}, \opt{plainfootbotline},
+% \opt{ilines}, \opt{clines}, and \opt{olines}, the commands
+% \cs{setheadtopline}, \cs{setheadsepline}, \cs{setfootsepline}, and
+% \cs{setfootbotline}, and the corresponding \KOMAScript{} font elements of
+% package \pkg{scrpage2}. Some of the options are extended to understand
+% values.
+%
+% \begin{option}{headtopline,headsepline,footsepline,footbotline}
+% \changes{v3.17}{2015/02/25}{new: store the values}
+% \begin{description}
+% \item[{\texttt{=\meta{dimensional expression}:\meta{dimensional
+% expression}}:}]
+% \end{description}\noindent
+% Define thickness and length of the a default separation line between:
+% \begin{description}
+% \item[\opt{headtopline}:] the top margin of the page and the page head.
+% \item[\opt{headsepline}:] the page head and the text area.
+% \item[\opt{footsepline}:] the text area and the page footer.
+% \item[\opt{footbotline}:] the page footer and the bottom margin.
+% \end{description}
+% Both \meta{dimensional expression} values may be omitted. In that case
+% thickness would be 0.4\,pt, and length would be the width of the page head
+% or footer. If the second argument, the length, has been omitted the
+% \texttt{:} may also be omitted.
+% \begin{macrocode}
+%<*options>
+\KOMA@key{headtopline}[:]{%
+ \sls@set@values[headtopline]{head}{above}{#1}%
+}
+\KOMA@key{headsepline}[:]{%
+ \sls@set@values[headsepline]{head}{below}{#1}%
+}
+\KOMA@key{footsepline}[:]{%
+ \sls@set@values[footsepline]{foot}{above}{#1}%
+}
+\KOMA@key{footbotline}[:]{%
+ \sls@set@values[footbotline]{foot}{below}{#1}%
+}
+% \end{macrocode}
+% \begin{macro}{\sls@set@values}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{description}
+% \item[\oarg{option name}:] either empty or the name of the option that sets
+% the line,
+% \item[\marg{head or foot}:] either \texttt{head} or \texttt{foot},
+% \item[\marg{above or below}:] either \texttt{above} or \texttt{below},
+% \item[\mmarg{dimension expression}{dimension expression}:] length an
+% thickness of a line (both are optional).
+% \end{description}
+% Helper macros for the options to set two macros by two values of one
+% option. The two values are separated by a colon.
+% \begin{macrocode}
+\newcommand*{\sls@set@values}[4][]{%
+ \begingroup
+ \Ifstr{#1}{}{%
+ \FamilyKeyStateUnknown
+ }{%
+ \KOMA@set@ifkey{#1}{@tempswa}{#4}%
+ }%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+ \if@tempswa
+ \edef\reserved@b{%
+ \noexpand\endgroup
+ \noexpand\@namedef{sls@#2#3@linethickness}{.4pt}%
+ \noexpand\@namedef{sls@#2#3@linelength}{%
+ \expandafter\noexpand\csname sls@#2width\endcsname
+ }%
+ }%
+ \else
+ \def\reserved@b{%
+ \endgroup
+ \@namedef{sls@#2#3@linethickness}{0pt}%
+ \@namedef{sls@#2#3@linelength}{0pt}%
+ }%
+ \fi
+ \else
+ \let\reserved@a\@empty
+ \let\reserved@b\@empty
+ \sls@split@at@colon#4::\@nil
+ \ifx\reserved@a\@empty
+ \def\reserved@a{\endgroup\@namedef{sls@#2#3@linethickness}{.4pt}}%
+ \else
+ \setlength{\@tempdima}{\dimexpr\reserved@a\relax}%
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\@namedef{sls@#2#3@linethickness}{\the\@tempdima}%
+ }%
+ \fi
+ \ifx\reserved@b\@empty
+ \def\reserved@b{%
+ \reserved@a
+ \@namedef{sls@#2#3@linelength}{\@nameuse{sls@#2width}}%
+ }%
+ \else
+ \edef\reserved@b{%
+ \noexpand\reserved@a
+ \noexpand\sls@deftowidthof{sls@#2#3@linelength}{\reserved@b}%
+ }%
+ \fi
+ \fi
+ \reserved@b
+ \FamilyKeyStateProcessed
+ \Ifstr{#1}{}{}{%
+ \KOMA@kav@xreplacevalue{.scrlayer-scrpage.sty}{#1}{%
+ \csname sls@#2#3@linethickness\endcsname
+ :\csname sls@#2#3@linelength\endcsname
+ }%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}^^A \sls@set@values
+% \begin{macro}{\sls@split@at@colon}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{description}
+% \item[\texttt{\meta{balanced}:\meta{balanced}:\meta{balanced}\cs{@nil}}:]
+% first \meta{balanced} will be stored into \cs{reserved@a}, second into
+% \cs{reserved@b}, third will be eaten and warn about if it is neither empty
+% and nor a colon.
+% \end{description}
+% This little helper is used, e.g., by options \opt{headwidth} and
+% \opt{footwidth}.
+% \begin{macrocode}
+\newcommand*{\sls@split@at@colon}{}
+\def\sls@split@at@colon#1:#2:#3\@nil{%
+ \Ifstr{#3}{}{}{%
+ \Ifstr{#3}{:}{}{%
+ \PackageWarning{scrlayer}{extra `:' found!\MessageBreak
+ You've used more than one colon at the argument\MessageBreak
+ of a two value option.\MessageBreak
+ The extra value(s) will be ignored%
+ }%
+ }%
+ }%
+ \def\reserved@a{#1}%
+ \def\reserved@b{#2}%
+}%
+% \end{macrocode}
+% \end{macro}^^A \sls@split@at@colon
+% \begin{macro}{\sls@headabove@linelength,\sls@headabove@linethickness,
+% \sls@headbelow@linelength,\sls@headbelow@linethickness,
+% \sls@footabove@linelength,\sls@footabove@linethickness,
+% \sls@footbelow@linelength,\sls@footbelow@linethickness}
+% To store length and thickness of the lines at the page head an footer, we
+% use macros. Those are also used by the options and therefore need to be
+% initialised before option usage.
+% \begin{macrocode}
+\newcommand*{\sls@headabove@linelength}{\sls@headwidth}%
+\newcommand*{\sls@headabove@linethickness}{0pt}%
+\KOMA@kav@xadd{.scrlayer-scrpage.sty}{headtopline}{%
+ \expandafter\noexpand\sls@headabove@linethickness:%
+ \expandafter\noexpand\sls@headabove@linelength
+}
+\newcommand*{\sls@headbelow@linelength}{\sls@headwidth}%
+\newcommand*{\sls@headbelow@linethickness}{0pt}%
+\KOMA@kav@xadd{.scrlayer-scrpage.sty}{headsepline}{%
+ \expandafter\noexpand\sls@headbelow@linethickness:%
+ \expandafter\noexpand\sls@headbelow@linelength
+}
+\newcommand*{\sls@footabove@linelength}{\sls@footwidth}%
+\newcommand*{\sls@footabove@linethickness}{0pt}%
+\KOMA@kav@xadd{.scrlayer-scrpage.sty}{footsepline}{%
+ \expandafter\noexpand\sls@footabove@linethickness:%
+ \expandafter\noexpand\sls@footabove@linelength
+}
+\newcommand*{\sls@footbelow@linelength}{\sls@footwidth}%
+\newcommand*{\sls@footbelow@linethickness}{0pt}%
+\KOMA@kav@xadd{.scrlayer-scrpage.sty}{footbotline}{%
+ \expandafter\noexpand\sls@footbelow@linethickness:%
+ \expandafter\noexpand\sls@footbelow@linelength
+}
+%</options>
+% \end{macrocode}
+% \end{macro}^^A \sls@headabove@linelength … \sls@footbelow@linethickness
+% \end{option}^^A headtopline … footbotline
+%
+% \begin{option}{plainheadtopline,plainheadsepline,
+% plainfootsepline,plainfootbotline}
+% \begin{macro}{\ifsls@plain@head@above@line,\sls@plain@head@above@linetrue,
+% \sls@plain@head@above@linefalse,
+% \ifsls@plain@head@below@line,\sls@plain@head@below@linetrue,
+% \sls@plain@head@below@linefalse,
+% \ifsls@plain@foot@above@line,\sls@plain@foot@above@linetrue,
+% \sls@plain@foot@above@linefalse,
+% \ifsls@plain@foot@below@line,\sls@plain@foot@below@linetrue,
+% \sls@plain@foot@below@linefalse}
+% \begin{description}
+% \item[\texttt{=\meta{switch value}}:]
+% \end{description}\noindent
+% While these only switches the rule on or off, we need only some switches.
+% \begin{macrocode}
+%<*options>
+\KOMA@ifkey{plainheadtopline}{sls@plain@head@above@line}%
+\KOMA@ifkey{plainheadsepline}{sls@plain@head@below@line}%
+\KOMA@ifkey{plainfootsepline}{sls@plain@foot@above@line}%
+\KOMA@ifkey{plainfootbotline}{sls@plain@foot@below@line}%
+%</options>
+% \end{macrocode}
+% \end{macro}^^A \ifsls@plain@foot@below@line … \sls@plain@foot@below@linefalse
+% \end{option}^^A plainheadtopline … plainfootbotline
+%
+% \begin{option}{ilines,clines,olines}
+% \changes{v3.17}{2015/02/25}{storing values}
+% \begin{macro}{\sls@hfline@adjust}
+% Maybe it would be more useful to be able to adjust each line on its own or
+% at most to define an offset. But \pkg{scrpage2} supports only these
+% options. At least we can set the options inside a layer or page style. This
+% may help.
+% \begin{macrocode}
+%<*options>
+\newcommand*{\sls@hfline@adjust}{0}%
+\KOMA@kav@add{.scrlayer-scrpage.sty}{ilines}{}
+\KOMA@key{ilines}[]{%
+ \ifx\relax#1\relax
+ \renewcommand*{\sls@hfline@adjust}{0}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{ilines}%
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{clines}%
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{olines}%
+ \KOMA@kav@add{.scrlayer-scrpage.sty}{ilines}{}%
+ \else
+ \def\FamilyKeyStateProcessed{unexpected value}%
+ \fi
+}
+\KOMA@key{clines}[]{%
+ \ifx\relax#1\relax
+ \renewcommand*{\sls@hfline@adjust}{1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{ilines}%
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{clines}%
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{olines}%
+ \KOMA@kav@add{.scrlayer-scrpage.sty}{clines}{}%
+ \else
+ \def\FamilyKeyStateProcessed{unexpected value}%
+ \fi
+}
+\KOMA@key{olines}[]{%
+ \ifx\relax#1\relax
+ \renewcommand*{\sls@hfline@adjust}{2}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{ilines}%
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{clines}%
+ \KOMA@kav@removekey{.scrlayer-scrpage.sty}{olines}%
+ \KOMA@kav@add{.scrlayer-scrpage.sty}{olines}{}%
+ \else
+ \def\FamilyKeyStateProcessed{unexpected value}%
+ \fi
+}
+\KOMA@kav@add{.scrlayer-scrpage.sty}{ilines}{}
+%</options>
+% \end{macrocode}
+% \end{macro}^^A \sls@hfline@adjust
+% \end{option}^^A ilines … olines
+%
+% \begin{command}{\setheadtopline,\setheadsepline,
+% \setfootsepline,\setfootbotline}
+% \begin{description}
+% \item[\oarg{extended dimensional expression}:] the length of the line; if
+% omitted the length will use the width of the page head or footer while
+% printing the line.
+% \item[\marg{dimensional expression}:] the thickness of the line.
+% \item[\oarg{code}:] the font selection code for the line. You may use it for
+% any kind of operation, that doesn't change the position, width, height, or
+% depth, e.g., to change the colour of the line.
+% \end{description}
+% \begin{macrocode}
+%<*body>
+\newcommand*{\setheadtopline}{\sls@setline{head}{above}}%
+\newcommand*{\setheadsepline}{\sls@setline{head}{below}}%
+\newcommand*{\setfootsepline}{\sls@setline{foot}{above}}%
+\newcommand*{\setfootbotline}{\sls@setline{foot}{below}}%
+% \end{macrocode}
+% \begin{macro}{\sls@setline}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\sls@@setline}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{macro}{\sls@@@setline}
+% \changes{v3.17}[2015/02/27]{internal use of the corresponding options}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{macro}{\sls@@@@setline}
+% \changes{v3.18}{2015/06/17}{explicit reuse of the current length}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% Helper to set up the line attributes processing the parameters of the
+% commands above.
+% \begin{macrocode}
+\newcommand*\sls@setline[2]{%
+ \kernel@ifnextchar[%]
+ {\sls@@setline{#1}{#2}}{\sls@@@setline{#1#2}}%
+}%
+\newcommand*{\sls@@setline}{}
+\def\sls@@setline#1#2[#3]{%
+ \Ifstr{#3}{auto}{%
+ \sls@deftowidthof{sls@#1#2@linelength}{#3#1}%
+ }{%
+ \sls@deftowidthof{sls@#1#2@linelength}{#3}%
+ }%
+ \sls@@@setline{#1#2}%
+}%
+\newcommand*{\sls@@@setline}[2]{%
+ \edef\@tempa{#2}\edef\@tempb{current}%
+ \Ifstr{#2}{}{}{%
+ \Ifstr{#2}{current}{}{%
+ \setlength{\@tempdima}{#2}%
+ \Ifstr{#1}{headabove}{%
+ \KOMAExecuteOptions[.scrlayer-scrpage.sty]%
+ {headtopline=\@tempdima:\csname sls@#1@linelength\endcsname}%
+ }{\Ifstr{#1}{headbelow}{%
+ \KOMAExecuteOptions[.scrlayer-scrpage.sty]%
+ {headsepline=\@tempdima:\csname sls@#1@linelength\endcsname}%
+ }{%
+ \Ifstr{#1}{footabove}{%
+ \KOMAExecuteOptions[.scrlayer-scrpage.sty]%
+ {footsepline=\@tempdima:\csname sls@#1@linelength\endcsname}%
+ }{%
+ \KOMAExecuteOptions[.scrlayer-scrpage.sty]%
+ {footbotline=\@tempdima:\csname sls@#1@linelength\endcsname}%
+ }%
+ }%
+ }%
+ }%
+ }%
+ \PackageWarning{scrlayer-scrpage}{%
+ Command deprecated!\MessageBreak
+ Usage of `\string\setheadtopline',
+ `\string\setheadsepline',\MessageBreak
+ `\string\setfootsepline', and `\string\setfootbotline'\MessageBreak
+ became deprecated with scrlayer-scrpage.\MessageBreak
+ You should use KOMA-Script options\MessageBreak
+ `headsepline', `headtopline', `footsepline',\MessageBreak
+ or `footbotline' with values\MessageBreak
+ `<line thickness>:<line length>' to setup\MessageBreak
+ the line length and thickness, and\MessageBreak
+ `\string\setkomafont' or `\string\addtokomafont' to\MessageBreak
+ setup the colour%
+ }%
+ \kernel@ifnextchar[%]
+ {%
+ \sls@@@@setline{#1}%
+ }{%
+ }%
+}%
+\newcommand*{\sls@@@@setline}{}
+\def\sls@@@@setline#1[#2]{%
+ \Ifstr{#1}{headabove}{\setkomafont{headtopline}{#2}}{%
+ \Ifstr{#1}{headbelow}{\setkomafont{headsepline}{#2}}{%
+ \Ifstr{#1}{footabove}{\setkomafont{footsepline}{#2}}{%
+ \setkomafont{footbotline}{#2}%
+ }%
+ }%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}^^A \sls@setline
+% \end{macro}^^A \sls@@setline
+% \end{macro}^^A \sls@@@setline
+% \end{macro}^^A \sls@@@@setline
+% \begin{fontelement}{headtopline,headsepline,footsepline,footbotline}
+% These are the font elements used in \cs{sls@hf@rule} to set the rules
+% with, i.e., another colour. Note, that those may already be defined and
+% become only part of the interface if they are not.
+% \begin{macrocode}
+\@ifundefined{scr@fnt@headtopline}{%
+ \newkomafont{headtopline}{}%
+}{}
+\@ifundefined{scr@fnt@headsepline}{%
+ \newkomafont{headsepline}{}%
+}{}
+\@ifundefined{scr@fnt@footsepline}{%
+ \newkomafont{footsepline}{}%
+}{}
+\@ifundefined{scr@fnt@footbotline}{%
+ \newkomafont{footbotline}{}%
+}{}
+%</body>
+% \end{macrocode}
+% \end{fontelement}^^A headtopline … footbotline
+% \end{command}^^A \setheadtopline … \setfootbotline
+%
+% \begin{length}{\headheight,\footheight}
+% \changes{v3.24}{2017/05/22}{warning depends on option \opt{singlespacing}}
+% Some classes set \len{headheight} to a very, very small value. We'll
+% warn about that.
+% \changes{v3.24}{2017/05/23}{also warn for low \cs{footheight}}
+% If the \len{headheight} is OK, we also test for \len{footheight}.
+% \begin{macrocode}
+%<*body>
+\AtBeginDocument{%
+ \ifdim \headheight
+ <\if@ps@singlespacing\f@baselineskip\else\baselineskip\fi\relax
+ \PackageWarningNoLine{scrlayer-scrpage}{Very small head height
+ detected!\MessageBreak
+ Using scrlayer-scrpage the head height\MessageBreak
+ should be at least \string\baselineskip, which is\MessageBreak
+ \if@ps@singlespacing\f@baselineskip\else\the\baselineskip\fi\space
+ currently.\MessageBreak
+ But head height is currently
+ \the\headheight\space only.\MessageBreak
+ You may use\MessageBreak
+ \@ifpackageloaded{geometry}{%
+ geometry option
+ `head=\if@ps@singlespacing\f@baselineskip\else\the\baselineskip\fi'%
+ }{%
+ \@ifpackageloaded{typearea}{%
+ typearea option `headheight=%
+ \if@ps@singlespacing\f@baselineskip\else\the\baselineskip\fi'%
+ }{%
+ \string\setlength{\string\headheight}%
+ {\if@ps@singlespacing\f@baselineskip\else\the\baselineskip\fi}%
+ }%
+ }\MessageBreak
+ \if@ps@singlespacing\else\ifdim \headheight<\f@baselineskip\else
+ or load package `scrlayer-scrpage' with\MessageBreak
+ option `singlespacing=true'\MessageBreak
+ \fi\fi
+ to avoid this warning%
+ }%
+ \else
+ \ifdim \footheight
+ <\if@ps@singlespacing\f@baselineskip\else\baselineskip\fi\relax
+ \PackageWarningNoLine{scrlayer-scrpage}{Very small foot height
+ detected!\MessageBreak
+ Using scrlayer-scrpage the foot height\MessageBreak
+ should be at least \string\baselineskip, which is\MessageBreak
+ \if@ps@singlespacing\f@baselineskip\else\the\baselineskip\fi\space
+ currently.\MessageBreak
+ But foot height is currently
+ \the\footheight\space only.\MessageBreak
+ You may use\MessageBreak
+ \@ifpackageloaded{typearea}{%
+ typearea option `footheight=%
+ \if@ps@singlespacing\f@baselineskip\else\the\baselineskip\fi'%
+ }{%
+ \string\setlength{\string\footheight}%
+ {\if@ps@singlespacing\f@baselineskip\else\the\baselineskip\fi}%
+ }%
+ \MessageBreak
+ \if@ps@singlespacing\else\ifdim \footheight<\f@baselineskip\else
+ or load package `scrlayer-scrpage' with\MessageBreak
+ option `singlespacing=true'\MessageBreak
+ \fi\fi
+ to avoid this warning%
+ }%
+ \fi
+ \fi
+}
+%</body>
+% \end{macrocode}
+% \end{length}^^A \headheight,\footheight
+%
+%
+% \subsection{Usual \LaTeX{} kernel commands}
+%
+% \pkg*{scrlayer-scrpage} uses some very usual \LaTeX{} kernel commands, that
+% should really behave like the original \LaTeX{} kernel commands do. But some
+% packages redefine them without restoring them in the output routine before
+% the page head and foot is build. Such a redefinition could break
+% \pkg*{scrlayer-scrpage} or even provoke errors. Here we try to make sure,
+% that \pkg*{scrlayer-scrpage} uses the correct definitions. Note: This should
+% not be needed, if other packages would be more careful.
+%
+% \begin{command}{\LaTeXcentering,\LaTeXraggedright,\LaTeXraggedleft}
+% \changes{v3.27}{2019/04/05}{added}
+% \pkg*{scrlayer-scrpage} needs \cs{centering} to center, \cs{raggedright}
+% to left align and \cs{raggedleft} to right align the three elements of
+% three-part header and footer. \pkg{ragged2e} optionally redefines them. This
+% is not perfect but does not break \pkg*{scrlayer-scrpage} completely. But
+% \pkg{tabu}\footnote{Note, package \pkg{tabu} is not officially maintained by
+% anyone for several years. Unofficially some members of The \LaTeX{} Team
+% fix some problems related to new \LaTeX{} kernel changes. But the package
+% is without support for all other problems, even if they are known for
+% years. But you have to decide yourself, whether it is a good idea to use
+% such packages.} also redefines them an that breaks \pkg*{scrlayer-scrpage}
+% in a way, that even error messages can occur. So from version~3.27
+% \pkg*{scrlayer-scrpage} does not longer use \cs{centering}, \cs{raggedright}
+% or \cs{raggedleft} but \cs{LaTeXcentering}, \cs{LaTeXraggedright} and
+% \cs{LaTeXraggedleft}. With \pkg{ragged2e} and its option
+% \opt{newcommands}/\opt{NewCommands} this would be already defined and
+% contain the original definition. On all other circumstances the commands
+% have to be defined. But these commands should not be defined as part of the
+% interface or removing the interface could break other packages like
+% \pkg{ragged2e}.
+% \begin{macrocode}
+%<*body>
+\@ifundefined{LaTeXcentering}{\let\LaTeXcentering\centering}{}
+\@ifundefined{LaTeXraggedleft}{\let\LaTeXraggedleft\raggedleft}{}
+\@ifundefined{LaTeXraggedright}{\let\LaTeXraggedright\raggedright}{}
+%</body>
+% \end{macrocode}
+% \end{command}^^A \LaTeXcentering … \LaTeXraggedright
+%
+%
+% \subsection{Style of running heads}
+%
+% This implements not only options \opt{komastyle} and \opt{standardstyle} of
+% \pkg{scrpage2}, but also activates the default style at the end of the
+% package and takes care for the correct behave of option \opt{markcase}.
+%
+% \begin{option}{pagestyleset}
+% \begin{description}
+% \item[\texttt{=\meta{string}}:] a valid name of a predefined
+% style-set. Currently only \optvalue{KOMA-Script} and \optvalue{standard}
+% are supported. Maybe more will follow.
+% \end{description}
+% Note, that the following automatic style activation must be before the
+% first option usage:
+% \begin{macrocode}
+%<*init>
+\AtEndOfPackage{%
+ \sls@auto@pagestyleset%
+}
+% \end{macrocode}
+% \begin{macro}{\sls@auto@pagestyleset}
+% \changes{v0.9}{2014/01/22}{added}
+% \begin{macrocode}
+\newcommand*{\sls@auto@pagestyleset}{%
+ \scr@ifundefinedorrelax{KOMAClassName}{%
+%<trace> \PackageInfoNoLine{scrlayer-scrpage}{%
+%<trace> auto-selection of `pagestyleset=standard'}%
+ \FamilyExecuteOptions[.scrlayer-scrpage.sty]{KOMA}{pagestyleset=standard}%
+ }{%
+%<trace> \PackageInfoNoLine{scrlayer-scrpage}{%
+%<trace> auto-selection of `pagestyleset=KOMA-Script'}%
+ \FamilyExecuteOptions[.scrlayer-scrpage.sty]{KOMA}%
+ {pagestyleset=KOMA-Script}%
+ }%
+}
+%</init>
+% \end{macrocode}
+% \end{macro}^^A \sls@auto@pagestyleset
+% \changes{v3.17}{2015/02/25}{storing the values}
+% \begin{macrocode}
+%<*options>
+\KOMA@key{pagestyleset}{%
+ \scr@ifundefinedorrelax{sls@ps@style@#1}{%
+ \FamilyKeyStateUnknownValue
+ }{%
+ \let\sls@auto@pagestyleset\relax
+ \@nameuse{sls@ps@style@#1}%
+ \FamilyKeyStateProcessed
+ \KOMA@kav@replacevalue{.scrlayer-scrpage.sty}{pagestyleset}{#1}%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\sls@ps@style@standard,\sls@ps@style@KOMA-Script}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% These are the predefined page style sets.
+% \begin{macrocode}
+\newcommand*{\sls@ps@style@standard}{%
+ \let\MakeMarkcase\MakeUppercase
+ \scrlayer@AtEndOfPackage{%
+ \pagestyle{scrheadings}%
+ \clearpairofpagestyles
+ \ihead{\headmark}%
+ \ohead{\pagemark}%
+ \cfoot[\if@twoside\else\pagemark\fi]{}%
+ }%
+}%
+\expandafter\newcommand\expandafter*\csname sls@ps@style@KOMA-Script\endcsname{%
+ \let\MakeMarkcase\@firstofone
+ \scrlayer@AtEndOfPackage{%
+ \pagestyle{scrheadings}%
+ \clearpairofpagestyles
+ \ohead{\if@twoside\headmark\fi}%
+ \chead{\if@twoside\else\headmark\fi}%
+ \ofoot[\if@twoside\pagemark\fi]{\if@twoside\pagemark\fi}%
+ \cfoot[\if@twoside\else\pagemark\fi]{\if@twoside\else\pagemark\fi}%
+ \scr@ifundefinedorrelax{KOMAClassName}{}{%
+ \Ifstr{\KOMAClassName}{scrlttr2}{%
+% \end{macrocode}
+% We are using \cls*{scrlttr2}, so we have to initialise the page style
+% different:
+% \changes{v3.18}{2015/06/24}{missing \cs{lofoot} and \cs{rofoot} added}
+% \begin{macrocode}
+ \clearpairofpagestyles
+ \lehead[\ifnum\@pageat=\z@\pagemark\fi]
+ {\ifnum\@pageat=\z@\pagemark\else\leftmark\fi}%
+ \lohead[\ifnum\@pageat=\z@\pagemark\fi]
+ {\ifnum\@pageat=\z@\pagemark\else\leftmark\fi}%
+ \chead[\ifnum\@pageat=\@ne\pagemark\fi]
+ {\ifcase\@pageat \rightmark\or \pagemark\or \rightmark\fi}%
+ \rehead[\ifnum\@pageat=\tw@\pagemark\fi]
+ {\ifcase\@pageat \leftmark\or \rightmark\or \pagemark
+ \else \rightmark\fi}%
+ \rohead[\ifnum\@pageat=\tw@\pagemark\fi]
+ {\ifcase\@pageat \leftmark\or \rightmark\or \pagemark
+ \else \rightmark\fi}%
+ \lefoot[\ifnum\@pageat=\thr@@\pagemark\fi]
+ {\ifnum\@pageat=\thr@@\pagemark\fi}%
+ \lofoot[\ifnum\@pageat=\thr@@\pagemark\fi]
+ {\ifnum\@pageat=\thr@@\pagemark\fi}%
+ \cfoot[\ifnum\@pageat=4 \pagemark\fi]
+ {\ifnum\@pageat=4 \pagemark\fi}%
+ \refoot[\ifnum\@pageat=5 \pagemark\fi]
+ {\ifnum\@pageat=5 \pagemark\fi}%
+ \rofoot[\ifnum\@pageat=5 \pagemark\fi]
+ {\ifnum\@pageat=5 \pagemark\fi}%
+ }{}%
+ }%
+ }%
+}%
+%</options>
+% \end{macrocode}
+% \end{macro}^^A \sls@ps@style@standard,\sls@ps@style@KOMA-Script
+% \end{option}^^A pagestyleset
+%
+% \begin{option}{komastyle,standardstyle}
+% These options are deprecated, but defined for compatibility with
+% \pkg{scrpage2}:
+% \begin{macrocode}
+%<*options>
+\KOMA@DeclareDeprecatedOption[scrlayer-scrpage]{komastyle}{%
+ pagestyleset=KOMA-Script}
+\KOMA@DeclareDeprecatedOption[scrlayer-scrpage]{standardstyle}{%
+ pagestyleset=standard}
+%</options>
+% \end{macrocode}
+% \end{option}^^A komastyle,standardstyle
+%
+%
+% \subsection{Extended mark mechanisms}
+%
+% Package options \opt{markuppercase}, \opt{markusedcase}, and
+% \opt{nouppercase} of package \pkg{scrpage2} are mapped to \KOMAScript{}
+% option \opt{markcase}.
+%
+% \begin{option}{markuppercase,markusedcase,nouppercase}
+% For compatibility with \pkg{scrpage2}.
+% \begin{macrocode}
+%<*options>
+\KOMA@DeclareDeprecatedOption[scrlayer-scrpage]{markuppercase}{markcase=upper}
+\KOMA@DeclareDeprecatedOption[scrlayer-scrpage]{markusedcase}{markcase=used}
+\KOMA@DeclareDeprecatedOption[scrlayer-scrpage]{nouppercase}{%
+ markcase=ignoreuppercase%
+}
+%</options>
+% \end{macrocode}
+% \end{option}^^A markuppercase … nouppercase
+%
+%
+% \subsection{Expert page style definition interface}
+%
+% This is the low level interface of \pkg{scrpage2} with \cs{defpagestyle},
+% \cs{newpagestyle}, \cs{renewpagestyle}, and \cs{providepagestyle}. We will
+% also define is. In difference to \pkg{scrpage2} layers are used. Following
+% layers will be defined for each page style:
+% \begin{description}
+% \item[\texttt{\meta{page style name}.head.above.line}] line above the head
+% \item[\texttt{\meta{page style name}.head.odd}] odd page head (only twoside)
+% \item[\texttt{\meta{page style name}.head.even}] even page head (only
+% twoside)
+% \item[\texttt{\meta{page style name}.head.oneside}] single-side head (only
+% oneside)
+% \item[\texttt{\meta{page style name}.head.below}] line below the head
+% \item[\texttt{\meta{page style name}.foot.above.line}] line above the footer
+% \item[\texttt{\meta{page style name}.foot.odd}] odd page footer (only
+% twoside)
+% \item[\texttt{\meta{page style name}.foot.even}] even side footer (only
+% twoside)
+% \item[\texttt{\meta{page style name}.foot.oneside}] single-side footer (only
+% oneside)
+% \item[\texttt{\meta{page style name}.foot.below.line}] line below the footer
+% (only oneside)
+% \end{description}
+% Note: \pkg{scrpage2} also provided star versions of the page style
+% definition commands, doing the same like the starless versions. This has
+% been done for compatibility reasons with deprecated
+% \pkg[https://www.ctan.org/pkg/koma-script-obsolete]{scrpage} and has been
+% described as to be removed some times. The layer interface doesn't support
+% this any longer.
+%
+%
+% \begin{command}{\defpagestyle}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{description}
+% \item[\marg{string}:] the name of the page style to be defined (must be
+% fully expandable and expand to a string only).
+% \item[\marg{head/foot definition}:] will be used to define the head (see
+% \cs{sls@defhead}).
+% \item[\marg{head/foot definition}:] will be used to define the foot (see
+% \cs{sls@deffoot}).
+% \end{description}
+% \begin{macrocode}
+%<*body>
+\newcommand*{\defpagestyle}[3]{%
+ \sls@defhead{#1}#2\@empty\@empty\@empty
+ \sls@deffoot{#1}#3\@empty\@empty\@empty
+ \DeclarePageStyleByLayers{#1}{%
+ #1.head.odd,#1.head.even,#1.head.oneside,%
+ #1.head.above.line,#1.head.below.line,%
+ #1.foot.odd,#1.foot.even,#1.foot.oneside,%
+ #1.foot.above.line,#1.foot.below.line%
+ }%
+}%
+% \end{macrocode}
+% \begin{macro}{\sls@defhead,\sls@@defhead}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\sls@@@defhead}
+% \changes{v0.9}{2014/08/18}{fixed names of layers \texttt{\dots head.odd} and
+% \texttt{\dots head.even}}
+% \begin{description}
+% \item[\pparg{dimensional expression}{dimensional expression}:] length and
+% thickness of a line (ruler) above the page head. May be omitted and if so
+% the values from option \opt{headtopline} will be used.
+% \item[\marg{code}:] will be executed on even pages; used to define the
+% contents of layer \texttt{\meta{page style name}.head.even}.
+% \item[\marg{code}:] will be executed on odd pages within two-side layout;
+% used to define the contents of layer \texttt{\meta{page style
+% name}.head.odd}.
+% \item[\marg{code}:] will be executed on single-side pages; used to define
+% the contents of layer \texttt{\meta{page style name}.head.oneside}.
+% \item[\pparg{dimensional expression}{dimensional expression}:] length and
+% thickness of a line (ruler) below the page head. May be omitted and if so
+% the values from option \opt{headsepline} will be used.
+% \end{description}
+% Helper to define the head layers.
+% \begin{macrocode}
+\newcommand*\sls@defhead[1]{%
+ \kernel@ifnextchar(%)
+ {\sls@@defhead{#1}}%
+ {\sls@@defhead{#1}(\sls@headabove@linelength,\sls@headabove@linethickness)}%
+}%
+\newcommand*{\sls@@defhead}{}
+\def\sls@@defhead#1(#2,#3)#4#5#6{%
+ \kernel@ifnextchar(%)
+ {\sls@@@defhead{#1}({#2},{#3}){#4}{#5}{#6}}%
+ {\sls@@@defhead{#1}%
+ ({#2},{#3})%
+ {#4}{#5}{#6}%
+ (\sls@headbelow@linelength,\sls@headbelow@linethickness)}%
+}%
+\newcommand*{\sls@@@defhead}{}
+\def\sls@@@defhead#1(#2,#3)#4#5#6(#7,#8){%
+% \end{macrocode}
+% The lines:
+% \begin{macrocode}
+ \DeclareLayer[%
+ background,%
+ hoffset=\sls@leftmargin{head},%
+ voffset=\sls@topmargin+\dp\strutbox,%
+ width=\sls@headwidth,%
+ height=0pt,%
+ align=bl,%
+ contents={%
+ {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagehead}{%
+ \sls@hf@rule{headtop}{#2}{#3}}}}%
+ }%
+ ]{#1.head.above.line}%
+ \DeclareLayer[%
+ background,%
+ hoffset=\sls@leftmargin{head},%
+ voffset=\sls@topmargin+\headheight-\ht\strutbox+#8,%
+ width=\sls@headwidth,%
+ height=0pt,%
+ align=tl,%
+ contents={%
+ {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagehead}{%
+ \sls@hf@rule{headsep}{#7}{#8}}}}%
+ }%
+ ]{#1.head.below.line}%
+% \end{macrocode}
+% The odd side, even side and one side:
+% \changes{v3.13b}{2014/10/16}{workaround: additional group added to avoid
+% pdf\TeX{} color stack warnings}
+% \begin{macrocode}
+ \DeclareLayer[%
+ background,evenpage,twoside,%
+ head,%
+ hoffset=\sls@leftmargin{head},%
+ width=\sls@headwidth,%
+ contents={%
+ \sls@secure@box\headheight{%
+ \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#4}}}}}%
+ ]{#1.head.even}%
+ \DeclareLayer[%
+ background,oddpage,twoside,%
+ head,%
+ hoffset=\sls@leftmargin{head},%
+ width=\sls@headwidth,%
+ contents={%
+ \sls@secure@box\headheight{%
+ \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#5}}}}}%
+ ]{#1.head.odd}%
+ \DeclareLayer[%
+ background,oddpage,oneside,%
+ head,%
+ hoffset=\sls@leftmargin{head},%
+ width=\sls@headwidth,%
+ contents={%
+ \sls@secure@box\headheight{%
+ \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#6}}}}}%
+ ]{#1.head.oneside}%
+}%
+% \end{macrocode}
+% \begin{macro}{\sls@deffoot,\sls@@deffoot}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\sls@@@deffoot}
+% \changes{v0.9}{2014/08/18}{fixed names of layers \texttt{\dots foot.odd} and
+% \texttt{\dots foot.even}}
+% \begin{description}
+% \item[\pparg{dimensional expression}{dimensional expression}:] length and
+% thickness of a line (ruler) above the page footer. May be omitted and if
+% so the values from option \opt{footsepline} will be used.
+% \item[\marg{code}:] will be executed on even pages; used to define the
+% contents of layer \texttt{\meta{page style name}.foot.even}.
+% \item[\marg{code}:] will be executed on odd pages within two-side layout;
+% used to define the contents of layer \texttt{\meta{page style
+% name}.foot.odd}.
+% \item[\marg{code}:] will be executed on single-side pages; used to define
+% the contents of layer \texttt{\meta{page style name}.foot.oneside}.
+% \item[\pparg{dimensional expression}{dimensional expression}:] length and
+% thickness of a line (ruler) below the page footer. May be omitted and if
+% so the values from option \opt{footbotline} will be used.
+% \end{description}
+% Helper to define the foot layers.
+% \begin{macrocode}
+\newcommand*\sls@deffoot[1]{%
+ \kernel@ifnextchar(%)
+ {\sls@@deffoot{#1}}%
+ {\sls@@deffoot{#1}(\sls@footabove@linelength,\sls@footabove@linethickness)}%
+}%
+\newcommand*{\sls@@deffoot}{}
+\def\sls@@deffoot#1(#2,#3)#4#5#6{%
+ \kernel@ifnextchar(%)
+ {\sls@@@deffoot{#1}({#2},{#3}){#4}{#5}{#6}}%
+ {\sls@@@deffoot{#1}%
+ ({#2},{#3})%
+ {#4}{#5}{#6}%
+ (\sls@footbelow@linelength,\sls@footbelow@linethickness)}%
+}%
+\newcommand*{\sls@@@deffoot}{}
+\def\sls@@@deffoot#1(#2,#3)#4#5#6(#7,#8){%
+% \end{macrocode}
+% The lines:
+% \begin{macrocode}
+ \DeclareLayer[%
+ foreground,%
+ hoffset=\sls@leftmargin{foot},%
+ voffset=\sls@topmargin
+ +\headheight+\headsep
+ +\textheight
+ +\footskip-\footheight
+ +2\dp\strutbox,%
+ width=\sls@footwidth,%
+ height=0pt,%
+ align=bl,%
+ contents={%
+ {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{%
+ \sls@hf@rule{footsep}{#2}{#3}}}}%
+ }%
+ ]{#1.foot.above.line}%
+ \DeclareLayer[%
+ foreground,%
+ hoffset=\sls@leftmargin{foot},%
+ voffset=\sls@topmargin
+ +\headheight+\headsep
+ +\textheight
+ +\footskip
+ +2\dp\strutbox
+ +#8,%
+ width=\sls@footwidth,%
+ height=0pt,%
+ align=bl,%
+ contents={%
+ {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{%
+ \sls@hf@rule{footbot}{#7}{#8}}}}%
+ }%
+ ]{#1.foot.below.line}%
+% \end{macrocode}
+% The odd side, even side and one side:
+% \begin{macrocode}
+ \DeclareLayer[%
+ foreground,evenpage,twoside,%
+ foot,%
+ hoffset=\sls@leftmargin{foot},%
+ width=\sls@footwidth,%
+ contents={%
+ \sls@secure@box\footheight{%
+ \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#4}}}}%
+ ]{#1.foot.even}%
+ \DeclareLayer[%
+ foreground,oddpage,twoside,%
+ foot,%
+ hoffset=\sls@leftmargin{foot},%
+ width=\sls@footwidth,%
+ contents={%
+ \sls@secure@box\footheight{%
+ \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#5}}}}%
+ ]{#1.foot.odd}%
+ \DeclareLayer[%
+ foreground,oddpage,oneside,%
+ foot,%
+ hoffset=\sls@leftmargin{foot},%
+ width=\sls@footwidth,%
+ contents={%
+ \sls@secure@box\footheight{%
+ \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#6}}}}%
+ ]{#1.foot.oneside}%
+}%
+% \end{macrocode}
+% \begin{macro}{\sls@secure@box}
+% \changes{v3.34}{2021/05/16}{\LaTeX{} team requested for additional \cs{par}}
+% \begin{description}
+% \item[\marg{length}:] a \LaTeX{} length, that gives the maximum
+% height + depth of the \meta{content}. It has to be either
+% \cs{headheight} or \cs{footheight}.
+% \item[\marg{content}:] what should be output (inside the box).
+% \end{description}
+% Note, that several length may be changed, to fit.
+% \begin{macrocode}
+\newcommand*{\sls@secure@box}[2]{%
+ \begingroup
+ \setbox\z@\vbox{%
+ \ifsls@leavevmode\leavevmode\expandafter\ignorespaces\fi
+ #2\par
+ }%
+ \ifdim #1<\dimexpr \ht\z@+\dp\z@\relax
+ \PackageWarning{scrlayer-scrpage}{%
+ \string#1 to low.\MessageBreak
+ At least \the\dimexpr \ht\z@+\dp\z@\relax\space needed,\MessageBreak
+ but only \the#1 found.\MessageBreak
+ \ifsls@autoenlarge
+ I'll enlarge \string#1, for further\MessageBreak
+ processing, but you should do this yourself,\MessageBreak
+ \else
+ You should enlarge \string#1,\MessageBreak
+ \fi
+ e.g.,
+ \scr@ifundefinedorrelax{geometry}{%
+ \scr@ifundefinedorrelax{typearea}{%
+ using\MessageBreak
+ \space\space\string\setlength{\string#1}{%
+ \the\dimexpr \ht\z@+\dp\z@\relax}\MessageBreak
+ in your preamble%
+ }{%
+ setting typearea's option\MessageBreak
+ `\expandafter\@gobble\string#1=\the\dimexpr \ht\z@+\dp\z@\relax'%
+ }%
+ }{%
+ \ifx #1\headheight
+ setting geometry's option\MessageBreak
+ `head=\the\dimexpr \ht\z@+\dp\z@\relax'%
+ \else
+ using\MessageBreak
+ \space\space\string\setlength{\string#1}{%
+ \the\dimexpr \ht\z@+\dp\z@\relax}\MessageBreak
+ in your preamble%
+ \fi
+ }%
+ \ifsls@autoenlarge
+ .\MessageBreak
+ I'll also
+ \ifx #1\headheight decrease \string\topmargin
+ \else increase \string\footskip\fi
+ \fi
+ }%
+ \ifsls@autoenlarge
+ \@tempdima\dimexpr \ht\z@+\dp\z@\relax
+ \ifx #1\headheight
+ \global\advance\topmargin by \dimexpr #1-(\ht\z@+\dp\z@)\relax
+ \dp\z@\dimexpr \dp\z@+\ht\z@+\dp\z@-\headheight\relax
+ \else
+ \global\advance\footskip by \dimexpr \ht\z@+\dp\z@-#1\relax
+ \fi
+ \global#1\@tempdima
+ \fi
+ \fi
+ \usebox\z@
+ \endgroup
+}%
+%</body>
+% \end{macrocode}
+% \begin{option}{hmode}
+% Switch automatically to the horizontal mode before setting a page head or
+% page footer element.
+% \begin{macrocode}
+%<*options>
+\KOMA@ifkey{hmode}{sls@leavevmode}
+%</options>
+% \end{macrocode}
+% \end{option}^^A hmode
+% \begin{option}{autoenlargeheadfoot}
+% \changes{v3.25}{2018/01/14}{added}
+% Automaticly enlarge vertical size of head or foot if the contents is to
+% large. This is the default.
+% \begin{macrocode}
+%<*options>
+\KOMA@ifkey{autoenlargeheadfoot}{sls@autoenlarge}
+\KOMAExecuteOptions{autoenlargeheadfoot=true}
+%</options>
+% \end{macrocode}
+% \end{option}^^A autoenlargeheadfoot
+% \end{macro}^^A \sls@secure@box
+% \end{macro}^^A \sls@@@deffoot
+% \end{macro}^^A \sls@deffoot,\sls@@deffoot
+% \end{macro}^^A \sls@@@defhead
+% \end{macro}^^A \sls@defhead,\sls@@defhead
+% \begin{command}{\headfont}
+% The low level page head font command. It is deprecated to redefine or use
+% this and it may already be defined.
+% \begin{macro}{\scr@fnt@pagehead}
+% \changes{v3.25}{2018/02/05}{don't use \cs{newkomafont} to avoid warning}
+% \begin{macro}{\scr@fnt@wrn@pagehead}
+% \changes{v0.9}{2014/01/13}{warning always deactivated}
+% \begin{macro}{\scr@fnt@pageheadfoot}
+% \begin{macrocode}
+%<*body>
+\@ifundefined{scr@fnt@pagehead}{%
+ \scr@ifundefinedorrelax{scr@fnt@instead@pagehead}{}{%
+ \PackageInfo{scrlayer-scrpage}{%
+ Makeing stand-alone element `pagehead' from\MessageBreak
+ alias to `pageheadfoot'%
+ }%
+ \let\scr@fnt@instead@pagehead\relax
+ }%
+ \@ifundefined{@pageheadfont}{%
+ \newcommand*{\@pageheadfont}{}%
+ }{}%
+ \newcommand*{\scr@fnt@pagehead}{\@pageheadfont}%
+}{}
+\@ifundefined{scr@fnt@pageheadfoot}{%
+ \newcommand*{\scr@fnt@pageheadfoot}{\headfont}%
+ \@ifundefined{headfont}{%
+ \newcommand*{\headfont}{\normalcolor\slshape}%
+ }{}
+}{}
+\scr@ifundefinedorrelax{scr@fnt@wrn@pagehead}{}{%
+%<trace> \PackageInfo{scrlayer-scrpage}{%
+%<trace> deactivating warning for font element\MessageBreak
+%<trace> `pagehead'}%
+ \let\scr@fnt@wrn@pagehead\relax
+}
+% \end{macrocode}
+% \end{macro}^^A \scr@fnt@pageheadfoot
+% \end{macro}^^A \scr@fnt@wrn@pagehead
+% \end{macro}^^A \scr@fnt@pagehead
+% \end{command}^^A \headfont
+%
+% \begin{command}{\footfont}
+% The low level page footer font command. It is deprecated to redefine or use
+% this and it may already be defined.
+% \begin{macro}{\scr@fnt@pagefoot}
+% \begin{macro}{\scr@fnt@wrn@pagefoot}
+% \changes{v0.9}{2014/01/13}{warning always deactivated}
+% \begin{macrocode}
+\@ifundefined{scr@fnt@pagefoot}{%
+ \def\scr@fnt@pagefoot{\footfont}%
+ \@ifundefined{footfont}{%
+ \newcommand*{\footfont}{}%
+ }{}%
+}{}
+\scr@ifundefinedorrelax{scr@fnt@wrn@pagefoot}{}{%
+%<trace> \PackageInfo{scrlayer-scrpage}{%
+%<trace> deactivating warning for font element\MessageBreak
+%<trace> `pagefoot'}%
+ \let\scr@fnt@wrn@pagefoot\relax
+}
+% \end{macrocode}
+% \end{macro}^^A \scr@fnt@wrn@pagefoot
+% \end{macro}^^A \scr@fnt@pagefoot
+% \end{command}^^A \footfont
+%
+% \begin{macro}{\sls@hf@rule}
+% \changes{v3.34}{2021/05/16}{\LaTeX{} team requested for additional \cs{par}}
+% \begin{description}
+% \item[\marg{rule name}:] one of \texttt{headtop}, \texttt{headsep},
+% \texttt{footsep}, or \texttt{footbot}
+% \item[\marg{dimensional expression}:] the line length (width)
+% \item[\marg{dimensional expression}:] the line thickness (height)
+% \end{description}
+% Helper to draw the line.
+% \begin{macrocode}
+\newcommand*\sls@hf@rule[3]{%
+ \begingroup
+ \normalfont\usekomafont{#1line}{%
+ \vbox to \z@{%
+ \kern -\dimexpr #3\relax
+ \ifnum \sls@hfline@adjust>\z@ \@tempswatrue \else \@tempswafalse\fi
+ \if@twoside\ifodd\value{page}\else
+ \ifnum \sls@hfline@adjust<\tw@ \@tempswatrue\else \@tempswafalse\fi
+ \fi\fi
+ \if@tempswa
+ \hskip \z@\@plus 1fill\@minus \paperwidth
+ \fi
+ \vrule \@width\dimexpr #2\relax \@height\dimexpr #3\relax \@depth\z@
+ \ifnum \sls@hfline@adjust<\tw@ \@tempswatrue\else \@tempswafalse\fi
+ \if@twoside\ifodd\value{page}\else
+ \ifnum \sls@hfline@adjust>\z@ \@tempswatrue \else \@tempswafalse\fi
+ \fi\fi
+ \if@tempswa
+ \hskip \z@\@plus 1fill\@minus \paperwidth\null
+ \fi
+ \par
+ }%
+ }%
+ \endgroup
+}%
+% \end{macrocode}
+% \end{macro}^^A \sls@hf@rule
+% \begin{macro}{\sls@topmargin,\sls@leftmargin}
+% Two simple helper macros:
+% \begin{macrocode}
+\newcommand*{\sls@topmargin}{\dimexpr\topmargin+1in\relax}%
+\newcommand*{\sls@leftmargin}[1]{%
+ \dimexpr
+ \if@twoside
+ \ifodd\value{page}
+ \oddsidemargin+\csname sls@odd#1shift\endcsname
+ \else
+ \evensidemargin+\csname sls@even#1shift\endcsname
+ \fi
+ \else
+ \oddsidemargin+\csname sls@odd#1shift\endcsname
+ \fi
+ +1in\relax
+}%
+%</body>
+% \end{macrocode}
+% \end{macro}^^A \sls@topmargin … \sls@leftmargin
+% \end{command}^^A \defpagestyle
+%
+% \begin{command}{\newpagestyle}
+% \changes{v3.32}{2020/09/11}{test for \pkg{titlesec}}
+% For the parameters see \cs{defpagestyle}. Define the pagestyle only, if not
+% already defined. Unfortunately \pkg{titlesec} also defines this command. So
+% new definition will fail. \textsf{titlesec} uses \cs{providecommand} so if
+% the order would be changed, everything would be OK.
+% \begin{macrocode}
+%<*body>
+\@ifpackageloaded{titlesec}{%
+ \@ifundefined{newpagestyle}{}{%
+ \@ifpackageloaded{titleps}{}{%
+ \PackageWarningNoLine{scrlayer-scrpage}{%
+ it seems that package `titlesec' is used\MessageBreak
+ and has already defined `\string\newpagestyle'.\MessageBreak
+ To avoid this warning message, you should\MessageBreak
+ load package `titlesec' not before package\MessageBreak
+ `scrlayer-scrpage'. If you need `titlesec'\MessageBreak
+ you could load it after `scrlayer-scrpage',\MessageBreak
+ but you still would not be able to use\MessageBreak
+ the `titlesec' implemenation of\MessageBreak
+ `\string\newpagestyle'%
+ }%
+ \let\newpagestyle\relax
+ }%
+ }%
+}{}
+\newcommand*\newpagestyle[3]{%
+ \@ifundefined{ps@#1}{\defpagestyle{#1}{#2}{#3}}{%
+ \PackageError{scrlayer-scrpage}{Page style `#1' already defined}{%
+ Only not yet defined page style may be defined using
+ \string\newpagestyle.\MessageBreak
+ You may use either \string\renewpagestyle, \string\providepagestyle,
+ or \string\defpagestyle\MessageBreak
+ with already defined page styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }%
+}%
+%</body>
+% \end{macrocode}
+% \end{command}^^A \newpagestyle
+%
+% \begin{command}{\renewpagestyle}
+% \changes{v3.32}{2020/09/11}{test for \textsf{titlesec}}
+% For the parameters see \cs{defpagestyle}. Define the pagestyle only, if not
+% already defined. Unfortunately \textsf{titlesec} also defines this
+% command. So new definition will fail. \textsf{titlesec} uses
+% \cs{providecommand} so if the order would be changed, everything would be OK.
+% \begin{macrocode}
+%<*body>
+\@ifpackageloaded{titlesec}{%
+ \@ifundefined{renewpagestyle}{}{%
+ \@ifpackageloaded{titleps}{}{%
+ \PackageWarningNoLine{scrlayer-scrpage}{%
+ It seems that package `titlesec' is used\MessageBreak
+ and has already defined `\string\renewpagestyle'.\MessageBreak
+ To avoid this warning message, you should\MessageBreak
+ load package `titlesec' not before package\MessageBreak
+ `scrlayer-scrpage'. If you need `titlesec'\MessageBreak
+ you could load it after `scrlayer-scrpage',\MessageBreak
+ but you still would not be able to use\MessageBreak
+ the `titlesec' implemenation of\MessageBreak
+ `\string\renewpagestyle'%
+ }%
+ \let\renewpagestyle\relax
+ }%
+ }%
+}{}
+\newcommand*\renewpagestyle[3]{%
+ \@ifundefined{ps@#1}{%
+ \PackageError{scrlayer-scrpage}{Undefined page style `#1'}{%
+ Only already defined page style may be re-defined using
+ \string\renewpagestyle.\MessageBreak
+ You may use either \string\newpagestyle, \string\providepagestyle,
+ or \string\defpagestyle\MessageBreak
+ with not yet defined page styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }{%
+ \defpagestyle{#1}{#2}{#3}%
+ }%
+}%
+%</body>
+% \end{macrocode}
+% \end{command}^^A \renewpagestyle
+%
+% \begin{command}{\providepagestyle}
+% For the parameters see \cs{defpagestyle}. Define only, if not already defined:
+% \begin{macrocode}
+%<*body>
+\newcommand*\providepagestyle[3]{%
+ \@ifundefined{ps@#1}{%
+ \defpagestyle{#1}{#2}{#3}%
+ }{%
+%<*trace>
+ \PackageInfo{scrlayer-scrpage}{%
+ page style `#1' already defined.\MessageBreak
+ New definition ignored%
+ }%
+%</trace>
+ }%
+}
+%</body>
+% \end{macrocode}
+% \end{command}^^A \providepagestyle
+%
+%
+% \subsection{User page style definition interface}
+%
+% This is the mid-level interface of \pkg{scrpage2} with \cs{deftripstyle}. As
+% in \pkg{scrpage2} we simply use the expert page style definition interface
+% to define the new user interface commands. But here the useless starred
+% versions will not longer be supported. So users of them have to remove the
+% star (nothing else).
+%
+% \begin{command}{\deftriplepagestyle,\newtriplepagestyle,
+% \renewtriplepagestyle,\providetriplepagestyle}
+% \begin{description}
+% \item[\marg{string}:] the name of the page style to be defined (must be
+% fully expandable and expand to a string only).
+% \item[\oarg{dimensional expression}:] thickness of a horizontal line above
+% the page head and below the page foot (default: 0\,pt).
+% \item[\oarg{dimensional expression}:] thickness of a horizontal line below
+% the page head and above the page foot (default: 0\,pt).
+% \item[\marg{code}:] will be expanded left aligned at head of odd pages (with
+% one-side layout all pages are odd) and right aligned at head of even
+% pages.
+% \item[\marg{code}:] will be expanded centered at head of odd and even pages.
+% \item[\marg{code}:] will be expanded right aligned at head of odd pages
+% (with one-side layout all pages are odd) and left aligned at head of even
+% pages.
+% \item[\marg{code}:] will be expanded left aligned at footer of odd pages
+% (with one-side layout all pages are odd) and right aligned at footer of
+% even pages.
+% \item[\marg{code}:] will be expanded centered at footer of odd and even
+% pages.
+% \item[\marg{code}:] will be expanded right aligned at footer of odd pages
+% (with one-side layout all pages are odd) and left aligned at footer of
+% even pages.
+% \end{description}
+% \begin{macrocode}
+%<*body>
+\newcommand*{\deftriplepagestyle}[1]{%
+ \let\@tempa\defpagestyle
+ \scrlayer@triplestyle{#1}%
+}%
+\newcommand*{\newtriplepagestyle}[1]{%
+ \let\@tempa\newpagestyle
+ \scrlayer@triplestyle{#1}%
+}%
+\newcommand*{\renewtriplepagestyle}[1]{%
+ \let\@tempa\renewpagestyle
+ \scrlayer@triplestyle{#1}%
+}%
+\newcommand*{\providetriplepagestyle}[1]{%
+ \let\@tempa\providepagestyle
+ \scrlayer@triplestyle{#1}%
+}%
+% \end{macrocode}
+% \begin{macro}{\scrlayer@triplestyle,\scrlayer@@triplestyle}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\scrlayer@@@triplestyle}
+% Helpers, that do the real work. Parameters are same, but \cs{reserved@a} has
+% to be one of \cs{defpagestyle}, \cs{newpagestyle},
+% \cs{renewpagestyle}, or \cs{providepagestyle}.
+% \begin{macrocode}
+\newcommand*{\scrlayer@triplestyle}[1]{%
+ \kernel@ifnextchar[%]
+ {\scrlayer@@triplestyle{#1}}%
+ {\scrlayer@@triplestyle{#1}[\z@]}%
+}
+\newcommand*{\scrlayer@@triplestyle}{}
+\def\scrlayer@@triplestyle#1[#2]{%
+ \kernel@ifnextchar[%]
+ {\scrlayer@@@triplestyle{#1}[#2]}%
+ {\scrlayer@@@triplestyle{#1}[\z@][#2]}%
+}%
+\newcommand*{\scrlayer@@@triplestyle}{}
+\def\scrlayer@@@triplestyle#1[#2][#3]#4#5#6#7#8#9{%
+ \@tempa{#1}{%
+ (\sls@headwidth,#2)%
+ {%
+ \makebox[\z@][l]{#6}\hfill
+ \makebox[\z@][c]{#5}\hfill
+ \makebox[\z@][r]{#4}%
+ }{%
+ \makebox[\z@][l]{#4}\hfill
+ \makebox[\z@][c]{#5}\hfill
+ \makebox[\z@][r]{#6}%
+ }{%
+ \makebox[\z@][l]{#4}\hfill
+ \makebox[\z@][c]{#5}\hfill
+ \makebox[\z@][r]{#6}%
+ }%
+ (\sls@headwidth,#3)%
+ }{%
+ (\sls@footwidth,#3)%
+ {%
+ \makebox[\z@][l]{#9}\hfill
+ \makebox[\z@][c]{#8}\hfill
+ \makebox[\z@][r]{#7}%
+ }{%
+ \makebox[\z@][l]{#7}\hfill
+ \makebox[\z@][c]{#8}\hfill
+ \makebox[\z@][r]{#9}%
+ }{%
+ \makebox[\z@][l]{#7}\hfill
+ \makebox[\z@][c]{#8}\hfill
+ \makebox[\z@][r]{#9}%
+ }%
+ (\sls@footwidth,#2)%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}^^A \scrlayer@@@triplestyle
+% \end{macro}^^A \scrlayer@triplestyle,\scrlayer@@triplestyle
+% \begin{command}{deftripstyle}
+% Command \cs{deftripstyle} has been defined for compatibility with
+% \pkg{scrpage2} only. It is deprecated now.
+% The starred version \cs{deftripstyle*} is deprecated for several
+% years and hasn't been described at the manual, it will not longer be
+% defined.
+% \begin{macrocode}
+\newcommand*{\deftripstyle}{%
+ \PackageWarning{scrlayer-scrpage}{%
+ Command \string\deftripstyle\space is deprecate.\MessageBreak
+ You should replace it by \string\deftriplepagestyle,\MessageBreak
+ e.g.,%
+ }%
+ \let\deftripstyle\deftriplepagestyle
+ \deftripstyle
+}%
+%</body>
+% \end{macrocode}
+% \end{command}^^A \deftripstyle
+% \end{command}^^A \deftriplepagestyle … \providetriplepagestyle
+%
+%
+% \subsection{Pre-defined page styles interface}
+%
+% This is the high-level interface of \pkg{scrpage2} with the page style
+% \pstyle{scrheadings}, \pstyle{scrplain}, and \pstyle{useheadings}. Those
+% will work as expected but will also be extended to support definition of
+% additional styles using the same interface.
+%
+% \begin{command}{\defpairofpagestyles}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% \begin{description}
+% \item[\oarg{string}:] name of a parent page style, that will be used to
+% initialise the new page style (must be fully expandable and expand to the
+% name of a page style).
+% \item[\marg{string}:] name the page style to be defined (must be fully
+% expandable and expand to the name of a page style).
+% \item[\marg{code}:] several commands of \cs{ihead}, \cs{chead}, \cs{ohead},
+% \cs{lehead}, \cs{lohead}, \cs{cohead}, \cs{rehead}, \cs{cehead},
+% \cs{rohead}, \cs{ifoot}, \cs{cfoot}, \cs{ofoot}, \cs{lefoot}, \cs{cefoot},
+% \cs{lofoot}, \cs{refoot}, \cs{cofoot}, \cs{rofoot}, \cs{clearscrheadfoot},
+% \cs{clearscrheadings}, \cs{clearscrplain}.
+% \end{description}
+% Two page styles will be defined using \cs{defpagestyle}, page style named
+% with the second argument and page style with the same name but an additional
+% prefix ``\pstyle{plain.}''. This will be activated automatically to be the
+% plain page style when the first page style will be used. If first argument
+% is used this pair of page styles will be used to initialise the head and
+% footer of the new. All the other commands are used to define the initial
+% fields. Note, if one of those page styles is active, all further commands
+% (see 3rd argument) depend on the active page style. If no one is active,
+% they depend on page style \pstyle{scrheadings}.
+% \begin{macrocode}
+%<*body>
+\newcommand*{\defpairofpagestyles}[3][]{%
+ \def\reserved@a##1##2##3##4##5##6##7\@nil{##1##2##3##4##5##6}%
+ \edef\reserved@a{\expandafter\reserved@a #2xxxxxx\@nil}%
+ \Ifstr\reserved@a{plain.}{%
+ \PackageError{scrlayer-scrpage}{plain page style `#2' not allowed}{%
+ You may not define a plain page style using
+ \string\defpairofpagestyles, \string\newpairofpagestyles,
+ \string\renewpairofpagestyles, or\MessageBreak
+ \string\providepairofpagestyles. I'd suggest to simply define the
+ corresponding\MessageBreak
+ non-plain page style to also define the plain one.\MessageBreak
+ If you'll continue, your command will be ignored.}%
+ }{%
+ \sls@init@pair@page@style*{#2}%
+ \sls@init@pair@page@style*{plain.#2}%
+ \ifx\relax #1\relax\else
+ \scr@ifundefinedorrelax{sls@ps@#1@even@left@head}{%
+ \PackageError{scrlayer-scrpage}{`#1' not a pair page style}{%
+ Only pair page styles may be used to initialise new pairs of page
+ styles. So\MessageBreak
+ optional argument of \string\defpairofpagestyles,
+ \string\newpairofpagestyles,\MessageBreak
+ \string\renewpairofpagestyles, or \string\providepairofpagestyle has
+ to be a pair\MessageBreak
+ page style or should be unused.\MessageBreak
+ If you'll continue, the initialisation will be ignored.}%
+ }{%
+ \sls@init@pair@page@style{#2}{#1}%
+ \scr@ifundefinedorrelax{sls@ps@plain.#1@even@left@head}{%
+ \sls@init@pair@page@style{plain.#2}{#1}%
+ }{%
+ \sls@init@pair@page@style{plain.#2}{plain.#1}%
+ }%
+ }%
+ \fi
+ \sls@def@pair@page@style@member{#2}%
+ \AddToLayerPageStyleOptions{#2}{%
+ onselect={%
+% \end{macrocode}
+% \changes{v3.15}{2015/01/08}{usage of \cs{DeclarePageStyleAlias} instead of
+% \cs{let}}
+% \begin{macrocode}
+ \DeclarePageStyleAlias{plain}{plain.#2}%
+ \DeclarePageStyleAlias{headings}{#2}%
+ \def\sls@currentheadings{#2}%
+ \def\sls@currentplain{plain.#2}%
+ #3%
+ }%
+ }%
+ \sls@def@pair@page@style@member{plain.#2}%
+ \AddToLayerPageStyleOptions{plain.#2}{%
+ onselect={%
+% \end{macrocode}
+% \changes{v3.15}{2015/01/08}{usage of \cs{DeclarePageStyleAlias} instead of
+% \cs{let}}
+% \begin{macrocode}
+ \DeclarePageStyleAlias{plain}{plain.#2}%
+ \DeclarePageStyleAlias{headings}{#2}%
+ \def\sls@currentheadings{#2}%
+ \def\sls@currentplain{plain.#2}%
+ #3%
+ },%
+ oninit={%
+ \expandafter
+ \ifx\csname ifsls@plain@head@above@line\expandafter\endcsname
+ \csname iftrue\endcsname\else
+ \let\sls@headabove@linelength\z@
+ \let\sls@headabove@linethickness\z@
+ \fi
+ \expandafter
+ \ifx\csname ifsls@plain@head@below@line\expandafter\endcsname
+ \csname iftrue\endcsname\else
+ \let\sls@headbelow@linelength\z@
+ \let\sls@headbelow@linethickness\z@
+ \fi
+ \expandafter
+ \ifx\csname ifsls@plain@foot@above@line\expandafter\endcsname
+ \csname iftrue\endcsname\else
+ \let\sls@footabove@linelength\z@
+ \let\sls@footabove@linethickness\z@
+ \fi
+ \expandafter
+ \ifx\csname ifsls@plain@foot@below@line\expandafter\endcsname
+ \csname iftrue\endcsname\else
+ \let\sls@footbelow@linelength\z@
+ \let\sls@footbelow@linethickness\z@
+ \fi
+ }%
+ }%
+ }%
+}%
+% \end{macrocode}
+% \begin{macro}{\sls@currentheadings,\sls@currentplain}
+% These little helpers will be set up at selection of each pair page style and
+% stores the last activated page style pair of the scope.
+% \begin{macrocode}
+\newcommand*\sls@currentheadings{scrheadings}%
+\newcommand*\sls@currentplain{plain.scrheadings}%
+% \end{macrocode}
+% \end{macro}^^A \sls@currentheadings,\sls@currentplain
+% \begin{macro}{\sls@init@pair@page@style}
+% \changes{v3.20}{2016/04/12}{\cs{ifstar} replaced by \cs{kernel@ifstar}}
+% \begin{macro}{\sls@init@@pair@page@style}
+% \begin{description}
+% \item[\marg{string}:] the name of the page style, that should be initialised
+% to be one member of a page style pair.
+% \item[\marg{string}:] the name of a member of a page style pair, that should
+% be used to initialise one the member of a page style pair from first
+% argument.
+% \end{description}
+% These are two little helpers for \cs{defpairofpagestyles}. The first command
+% has two starred versions. With one star the commands for the page style will
+% be initialised to \cs{@empty}, with two stars they will become
+% \LaTeX-undefined (\cs{relax}).
+%
+% Note also, that the second argument may either be the plain or the non-plain
+% member of the page style pair.
+% \begin{macrocode}
+\newcommand*{\sls@init@pair@page@style}{%
+ \kernel@ifstar {%
+ \kernel@ifstar {%
+ \sls@let@pair@page@style\relax
+ }{%
+ \sls@let@pair@page@style\@empty
+ }
+ }{%
+ \sls@init@@pair@page@style
+ }%
+}%
+\newcommand*{\sls@init@@pair@page@style}[2]{%
+ \expandafter\let\csname sls@ps@#1@even@left@head\expandafter\endcsname
+ \csname sls@ps@#2@even@left@head\endcsname
+ \expandafter\let\csname sls@ps@#1@even@middle@head\expandafter\endcsname
+ \csname sls@ps@#2@even@middle@head\endcsname
+ \expandafter\let\csname sls@ps@#1@even@right@head\expandafter\endcsname
+ \csname sls@ps@#2@even@right@head\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@left@head\expandafter\endcsname
+ \csname sls@ps@#2@odd@left@head\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@middle@head\expandafter\endcsname
+ \csname sls@ps@#2@odd@middle@head\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@right@head\expandafter\endcsname
+ \csname sls@ps@#2@odd@right@head\endcsname
+ \expandafter\let\csname sls@ps@#1@even@left@foot\expandafter\endcsname
+ \csname sls@ps@#2@even@left@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@even@middle@foot\expandafter\endcsname
+ \csname sls@ps@#2@even@middle@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@even@right@foot\expandafter\endcsname
+ \csname sls@ps@#2@even@right@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@left@foot\expandafter\endcsname
+ \csname sls@ps@#2@odd@left@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@middle@foot\expandafter\endcsname
+ \csname sls@ps@#2@odd@middle@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@right@foot\expandafter\endcsname
+ \csname sls@ps@#2@odd@right@foot\endcsname
+}%
+% \end{macrocode}
+% \end{macro}^^A \sls@init@@pair@page@style
+% \begin{macro}{\sls@let@pair@page@style}
+% \begin{description}
+% \item[\marg{command}:] a single command used to initialise the commands of
+% the page style commands.
+% \item[\marg{string}:] the name of a member of a page style pair, that should
+% be used to initialise one the member of a page style pair from first
+% argument.
+% \end{description}
+% A little helper for \cs{sls@init@pair@page@style}.
+% \begin{macrocode}
+\newcommand*{\sls@let@pair@page@style}[2]{%
+ \expandafter\let\csname sls@ps@#2@even@left@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@middle@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@right@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@left@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@middle@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@right@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@left@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@middle@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@right@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@left@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@middle@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@right@foot\endcsname #1%
+}%
+% \end{macrocode}
+% \end{macro}^^A \sls@let@pair@page@style
+% \end{macro}^^A \sls@init@pair@page@style
+% \begin{macro}{\sls@def@pair@page@style@member}
+% \changes{v3.24}{2017/05/04}{improved \textsf{bidi} compatibility}
+% \changes{v3.27}{2019/04/05}{\cs{centering} replaced by
+% \cs{LaTeXcentering}}
+% \changes{v3.27}{2019/04/05}{\cs{raggedright} replaced by
+% \cs{LaTeXraggedright}}
+% \changes{v3.27}{2019/04/05}{\cs{raggedleft} replaced by
+% \cs{LaTeXraggedleft}}
+% \begin{description}
+% \item[\marg{string}:] name of the page style to be defined.
+% \end{description}
+% A little helper for \cs{defpairofpagestyles}.
+% \begin{macrocode}
+\newcommand*{\sls@def@pair@page@style@member}[1]{%
+ \defpagestyle{#1}{%
+ {%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@even@left@head}\strut}}%
+ \parbox{\sls@headwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@even@middle@head}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@even@right@head}\strut}}%
+ }{%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@odd@left@head}\strut}}%
+ \parbox{\sls@headwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@odd@middle@head}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@odd@right@head}\strut}}%
+ }{%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@odd@left@head}\strut}}%
+ \parbox{\sls@headwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@odd@middle@head}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@odd@right@head}\strut}}%
+ }%
+ }{%
+ {%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@even@left@foot}\strut}}%
+ \parbox{\sls@footwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@even@middle@foot}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@even@right@foot}\strut}}%
+ }{%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@odd@left@foot}\strut}}%
+ \parbox{\sls@footwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@odd@middle@foot}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@odd@right@foot}\strut}}%
+ }{%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@odd@left@foot}\strut}}%
+ \parbox{\sls@footwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@odd@middle@foot}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@odd@right@foot}\strut}}%
+ }%
+ }%
+}%
+%</body>
+% \end{macrocode}
+% \end{macro}^^A \sls@def@pair@page@style@member
+% \end{command}^^A \defpairofpagestyles
+%
+% \begin{command}{\newpairofpagestyles,\renewpairofpagestyles,
+% \providepairofpagestyles}
+% See \cs{defpairofpagestyles} for the arguments.
+% \begin{macrocode}
+%<*body>
+\newcommand*{\newpairofpagestyles}[3][]{%
+ \scr@ifundefinedorrelax{ps@#2}{%
+ \@ifundefined{ps@plain.#2}{\defpairofpagestyles[#1]{#2}{#3}}{%
+ \PackageError{scrlayer-scrpage}{%
+ Plain page style of `#2' already defined}{%
+ You may only define a new pair of page styles, if neither the style
+ itself\MessageBreak
+ nor it's plain page style has already been defined.\MessageBreak
+ You may use only \string\defpairofpagestyles\space or
+ \string\providepairofpagestyles\space with partly\MessageBreak
+ already defined page styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }%
+ }{%
+ \PackageError{scrlayer-scrpage}{%
+ Page style `#2' already defined}{%
+ You may only define a new pair of page styles, if neither the style
+ itself\MessageBreak
+ nor it's plain page style has already been defined.\MessageBreak
+ You may use either \string\renewpairsofpagestyles,
+ \string\defpairofpagestyles, or\MessageBreak
+ \string\providepairofpagestyles\space with already defined page
+ styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }%
+}%
+\newcommand*{\renewpairofpagestyles}[3][]{%
+ \scr@ifundefinedorrelax{ps@#2}{%
+ \PackageError{scrlayer-scrpage}{%
+ Undefined page style `#2'}{%
+ You may only redefine existing pairs of page styles. You may use
+ either\MessageBreak
+ \string\newpairsofpagestyles, \string\defpairofpagestyles, or
+ \string\providepairofpagestyles\MessageBreak
+ with not yet defined page styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }{%
+ \@ifundefined{ps@plain.#2}{%
+ \PackageError{scrlayer-scrpage}{%
+ Undefined plain page style of `#2'}{%
+ You may only redefine existing pairs of page styles. You may use
+ either\MessageBreak
+ \string\defpairofpagestyles\space or
+ \string\providepairofpagestyles\space with partly already
+ defined\MessageBreak
+ page styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }{\defpairofpagestyles[#1]{#2}{#3}}%
+ }%
+}%
+\newcommand*{\providepairofpagestyles}[3][]{%
+ \scr@ifundefinedorrelax{ps@#2}{%
+ \@ifundefined{ps@plain.#2}{\defpairofpagestyles[#1]{#2}{#3}}{%
+%<*trace>
+ \PackageInfo{scrlayer-scrpage}{%
+ Plain page style of `#2' already\MessageBreak
+ defined. Definition ignored}%
+%</trace>
+ }%
+ }{%
+%<*trace>
+ \PackageInfo{scrlayer-scrpage}{%
+ Page style of `#2' already defined.\MessageBreak
+ Definition ignored}%
+%</trace>
+ }%
+}%
+%</body>
+% \end{macrocode}
+% \end{command}^^A \newpairofpagestyles … \providepairofpagestyles
+%
+%
+% \begin{pgstyle}{scrheading,plain.scrheadings}
+% We have one predefined pair: \texttt{scrheadings} with plain page style
+% \texttt{plain.scrheadings}.
+% \begin{macrocode}
+%<*body>
+\newpairofpagestyles{scrheadings}{}%
+% \end{macrocode}
+% \begin{pgstyle}{scrplain}
+% But with package \pkg{scrpage2}
+% the plain page style was \texttt{scrplain}. So we make a kind of alias:
+% \begin{macrocode}
+\DeclarePageStyleAlias{scrplain}{plain.scrheadings}
+%</body>
+% \end{macrocode}
+% \end{pgstyle}^^A scrplain
+% \end{pgstyle}^^A scrheadings,plain.scrheadings
+%
+%
+% \begin{command}{\ihead,\ohead,\chead,
+% \lehead,\lohead,\rehead,\rohead,\cehead,\cohead,
+% \ifoot,\ofoot,\cfoot,
+% \lefoot,\lofoot,\refoot,\rofoot,\cefoot,\cofoot}
+% \changes{v3.14}{2014/09/19}{new star version double the argument}
+% \changes{v3.20}{2016/04/12}{\cs{ifstar} replaced by \cs{kernel@ifstar}}
+% We also need macros to define the contents of the three part head and
+% foot. Each macro defines one of the part of head or foot of the
+% \emph{headings} page style member and optional of the \emph{plain} page
+% style member.
+% \begin{macrocode}
+%<*body>
+\newcommand*{\ihead}{\kernel@ifstar {\@dblarg\@@@ihead}{\@ihead}}%
+% \end{macrocode}
+% \begin{macro}{\@ihead}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@@ihead,\@@@ihead}
+% \changes{v3.27}{2019/04/05}{long}
+% Two helpers for the previous one to double the command and it's arguments.
+% \begin{macrocode}
+\newcommand*{\@ihead}{\kernel@ifnextchar[{\@@@ihead}{\@@ihead}}%
+\newcommand{\@@ihead}[1]{\rehead{#1}\lohead{#1}}%
+\newcommand{\@@@ihead}[2][]{\rehead[{#1}]{#2}\lohead[{#1}]{#2}}%
+% \end{macrocode}
+% \end{macro}^^A \@@ihead,\@@@ihead
+% \end{macro}^^A \@ihead
+% \begin{macrocode}
+\newcommand*{\ohead}{\kernel@ifstar {\@dblarg\@@@ohead}{\@ohead}}%
+% \end{macrocode}
+% \begin{macro}{\@ohead}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@@ohead,\@@@ohead}
+% \changes{v3.27}{2019/04/05}{long}
+% Two helpers for the previous one to double the command and it's arguments.
+% \begin{macrocode}
+\newcommand*{\@ohead}{\kernel@ifnextchar[{\@@@ohead}{\@@ohead}}%
+\newcommand{\@@ohead}[1]{\lehead{#1}\rohead{#1}}%
+\newcommand{\@@@ohead}[2][]{\lehead[{#1}]{#2}\rohead[{#1}]{#2}}%
+% \end{macrocode}
+% \end{macro}^^A \@@ohead,\@@@ohead
+% \end{macro}^^A \@ohead
+% \begin{macrocode}
+\newcommand*{\chead}{\kernel@ifstar {\@dblarg\@@@chead}{\@chead}}%
+% \end{macrocode}
+% \begin{macro}{\@chead}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@@chead,\@@@chead}
+% \changes{v3.27}{2019/04/05}{long}
+% Two helpers for the previous one to double the command and it's arguments.
+% \begin{macrocode}
+\newcommand*{\@chead}{\kernel@ifnextchar[{\@@@chead}{\@@chead}}%
+\newcommand{\@@chead}[1]{\cehead{#1}\cohead{#1}}%
+\newcommand{\@@@chead}[2][]{\cehead[{#1}]{#2}\cohead[{#1}]{#2}}%
+% \end{macrocode}
+% \end{macro}^^A \@@chead,\@@@chead
+% \end{macro}^^A \@chead
+% \begin{macrocode}
+\newcommand*{\lehead}{\sls@renewelement{even}{left}{head}}%
+\newcommand*{\lohead}{\sls@renewelement{odd}{left}{head}}%
+\newcommand*{\rehead}{\sls@renewelement{even}{right}{head}}%
+\newcommand*{\rohead}{\sls@renewelement{odd}{right}{head}}%
+\newcommand*{\cehead}{\sls@renewelement{even}{middle}{head}}%
+\newcommand*{\cohead}{\sls@renewelement{odd}{middle}{head}}%
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*{\ifoot}{\kernel@ifstar {\@dblarg\@@@ifoot}{\@ifoot}}%
+% \end{macrocode}
+% \begin{macro}{\@ifoot}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@@ifoot,\@@@ifoot}
+% \changes{v3.27}{2019/04/05}{long}
+% Two helpers for the previous one to double the command and it's arguments.
+% \begin{macrocode}
+\newcommand*{\@ifoot}{\kernel@ifnextchar[{\@@@ifoot}{\@@ifoot}}%
+\newcommand{\@@ifoot}[1]{\refoot{#1}\lofoot{#1}}%
+\newcommand{\@@@ifoot}[2][]{\refoot[{#1}]{#2}\lofoot[{#1}]{#2}}%
+% \end{macrocode}
+% \end{macro}^^A \@@ifoot,\@@@ifoot
+% \end{macro}^^A \@ifoot
+% \begin{macrocode}
+\newcommand*{\ofoot}{\kernel@ifstar {\@dblarg\@@@ofoot}{\@ofoot}}%
+% \end{macrocode}
+% \begin{macro}{\@ofoot}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@@ofoot,\@@@ofoot}
+% \changes{v3.27}{2019/04/05}{long}
+% Two helpers for the previous one to double the command and it's arguments.
+% \begin{macrocode}
+\newcommand*{\@ofoot}{\kernel@ifnextchar[{\@@@ofoot}{\@@ofoot}}%
+\newcommand{\@@ofoot}[1]{\lefoot{#1}\rofoot{#1}}%
+\newcommand{\@@@ofoot}[2][]{\lefoot[{#1}]{#2}\rofoot[{#1}]{#2}}%
+% \end{macrocode}
+% \end{macro}^^A \@@ofoot,\@@@ofoot
+% \end{macro}^^A \@ofoot
+% \begin{macrocode}
+\newcommand*{\cfoot}{\kernel@ifstar {\@dblarg\@@@cfoot}{\@cfoot}}%
+% \end{macrocode}
+% \begin{macro}{\@cfoot}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@@cfoot,\@@@cfoot}
+% \changes{v3.27}{2019/04/05}{long}
+% Two helpers for the previous one to double the command and it's arguments.
+% \begin{macrocode}
+\newcommand*{\@cfoot}{\kernel@ifnextchar[{\@@@cfoot}{\@@cfoot}}%
+\newcommand{\@@cfoot}[1]{\cefoot{#1}\cofoot{#1}}%
+\newcommand{\@@@cfoot}[2][]{\cefoot[{#1}]{#2}\cofoot[{#1}]{#2}}%
+% \end{macrocode}
+% \end{macro}^^A \@@cfoot,\@@@cfoot
+% \end{macro}^^A \@cfoot
+% \begin{macrocode}
+\newcommand*{\lefoot}{\sls@renewelement{even}{left}{foot}}%
+\newcommand*{\lofoot}{\sls@renewelement{odd}{left}{foot}}%
+\newcommand*{\refoot}{\sls@renewelement{even}{right}{foot}}%
+\newcommand*{\rofoot}{\sls@renewelement{odd}{right}{foot}}%
+\newcommand*{\cefoot}{\sls@renewelement{even}{middle}{foot}}%
+\newcommand*{\cofoot}{\sls@renewelement{odd}{middle}{foot}}%
+% \end{macrocode}
+% \begin{macro}{\sls@renewelement}
+% \begin{macro}{\sls@@renewelement}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \changes{v3.20}{2016/04/12}{\cs{ifstar} replaced by \cs{kernel@ifstar}}
+% \begin{macro}{\sls@@@renewelement,\sls@@@@renewelement,
+% \sls@@renewplainelement}
+% \changes{v3.27}{2019/04/05}{long}
+% Little helper for several of the above commands.
+% \begin{macrocode}
+\newcommand*{\sls@renewelement}[3]{%
+ \kernel@ifstar{\@dblarg{\sls@@@@renewelement{#1}{#2}{#3}}}%
+ {\sls@@renewelement{#1}{#2}{#3}}%
+}%
+\newcommand*{\sls@@renewelement}[3]{%
+ \kernel@ifnextchar[%]
+ {\sls@@@@renewelement{#1}{#2}{#3}}%
+ {\sls@@@renewelement{#1}{#2}{#3}}%
+}%
+\newcommand{\sls@@@renewelement}[4]{%
+ \scr@ifundefinedorrelax{sls@ps@\sls@currentheadings @#1@#2@#3}{%
+ \@namedef{sls@ps@scrheadings@#1@#2@#3}{#4}%
+ }{%
+ \@namedef{sls@ps@\sls@currentheadings @#1@#2@#3}{#4}%
+ }%
+}%
+\newcommand*{\sls@@@@renewelement}{}
+\long\def\sls@@@@renewelement#1#2#3[#4]#5{%
+ \sls@@renewplainelement{#1}{#2}{#3}{#4}%
+ \sls@@@renewelement{#1}{#2}{#3}{#5}%
+}%
+\newcommand{\sls@@renewplainelement}[4]{%
+ \scr@ifundefinedorrelax{sls@ps@\sls@currentplain @#1@#2@#3}{%
+ \@namedef{sls@ps@plain.scrheadings@#1@#2@#3}{#4}%
+ }{%
+ \@namedef{sls@ps@\sls@currentplain @#1@#2@#3}{#4}%
+ }%
+}%
+%</body>
+% \end{macrocode}
+% \end{macro}^^A \sls@@@renewelement … \sls@@renewplainelement
+% \end{macro}^^A \sls@@renewelement
+% \end{macro}^^A \sls@renewelement
+% \end{command}^^A \ihead … \cofoot
+%
+%
+% \begin{command}{\clearmainofpairofpagestyles}
+% \begin{command}{\clearscrheadings}
+% \changes{v3.32}{2020/09/11}{deprecation warning added}
+% Maybe you want to clear the currently defined head and foot. First
+% let's clear only scrheadings pagestyle but not scrplain pagestyle.
+% We do this simply using the already known command:
+% \begin{macrocode}
+%<*body>
+\newcommand*{\clearmainofpairofpagestyles}{%
+ \ihead{}\chead{}\ohead{}\ifoot{}\cfoot{}\ofoot{}%
+}%
+\newcommand*{\clearscrheadings}{%
+ \PackageWarning{scrlayer-scrpage}{%
+ replacing deprecated \string\clearscrheading\space by\MessageBreak
+ \string\clearmainofpairofpagestyles
+ }%
+ \clearmainofpairofpagestyles
+}
+%</body>
+% \end{macrocode}
+% \end{command}^^A \clearscrheadings
+% \end{command}^^A \clearmainofpairofpagestyles
+% \begin{command}{\clearplainofpairofpagestyles}
+% \begin{command}{\clearscrplain}
+% \changes{v3.32}{2020/09/11}{deprecation warning added}
+% Now, we use the not recommended feature to set up a plain style:
+% \begin{macrocode}
+%<*body>
+\newcommand*{\clearplainofpairofpagestyles}{%
+ \sls@@renewplainelement{odd}{left}{head}{}%
+ \sls@@renewplainelement{odd}{right}{head}{}%
+ \sls@@renewplainelement{odd}{middle}{head}{}%
+ \sls@@renewplainelement{even}{left}{head}{}%
+ \sls@@renewplainelement{even}{right}{head}{}%
+ \sls@@renewplainelement{even}{middle}{head}{}%
+ \sls@@renewplainelement{odd}{left}{foot}{}%
+ \sls@@renewplainelement{odd}{right}{foot}{}%
+ \sls@@renewplainelement{odd}{middle}{foot}{}%
+ \sls@@renewplainelement{even}{left}{foot}{}%
+ \sls@@renewplainelement{even}{right}{foot}{}%
+ \sls@@renewplainelement{even}{middle}{foot}{}%
+}%
+\newcommand*{\clearscrplain}{%
+ \PackageWarning{scrlayer-scrpage}{%
+ replacing deprecated \string\clearscrplain\space by\MessageBreak
+ \string\clearplainofpairofpagestyles
+ }%
+ \clearplainofpairofpagestyles
+}
+%</body>
+% \end{macrocode}
+% \end{command}^^A \clearscrplain
+% \end{command}^^A \clearplainofpairofpagestyles
+% \begin{command}{\clearpairofpagestyles}
+% \begin{command}{\clearscrheadfoot}
+% \changes{v3.32}{2020/09/11}{deprecation warning added}
+% Last but not least we clean up both, the main and the plain:
+% \begin{macrocode}
+%<*body>
+\newcommand*{\clearpairofpagestyles}{%
+ \ihead[]{}\chead[]{}\ohead[]{}\ifoot[]{}\cfoot[]{}\ofoot[]{}%
+}%
+\newcommand*{\clearscrheadfoot}{%
+ \PackageWarning{scrlayer-scrpage}{%
+ replacing deprecated \string\clearscrheadfoot\space by\MessageBreak
+ \string\clearpairofpagestyles
+ }%
+ \clearpairofpagestyles
+}
+%</body>
+% \end{macrocode}
+% \end{command}^^A \clearscrheadfoot
+% \end{command}^^A \clearpairofpagestyles
+%
+%
+% \begin{pgstyle}{useheadings,plain.useheadings}
+% Not longer supported:
+% \begin{macrocode}
+%<*body>
+\newcommand*\ps@useheadings{%
+ \PackageWarning{scrlayer-scrpage}{incompatible page style!\MessageBreak
+ Page styles like `headings' and `plain'\MessageBreak
+ are incompatible with the page styles\MessageBreak
+ of scrlayer-scrpage. You shouldn't mix\MessageBreak
+ them up. Therefore page style\MessageBreak
+ `useheadings' is not longer provided.\MessageBreak
+ Usage is deprecated and will be replaced\MessageBreak
+ by `scrheadings'%
+ }%
+ \let\ps@useheadings\ps@scrheadings
+ \ps@useheadings
+}%
+\expandafter\newcommand\expandafter*\csname ps@plain.useheadings\endcsname{%
+ \@nameuse{ps@plain.scrheadings}%
+}%
+%</body>
+% \end{macrocode}
+% \end{pgstyle}^^A useheadings,plain.useheadings
+%
+% \begin{macrocode}
+%</interface>
+% \end{macrocode}
+%
+% \Finale
+% \PrintChanges
+%
+\endinput
+% Local Variables:
+% mode: doctex
+% ispell-local-dictionary: "en_US"
+% eval: (flyspell-mode 1)
+% TeX-master: t
+% TeX-engine: luatex-dev
+% eval: (setcar (or (cl-member "Index" (setq-local TeX-command-list (copy-alist TeX-command-list)) :key #'car :test #'string-equal) (setq-local TeX-command-list (cons nil TeX-command-list))) '("Index" "mkindex %s" TeX-run-index nil t :help "makeindex for dtx"))
+% End: