% \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:
