diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/koma-script/scrlayer.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/koma-script/scrlayer.dtx | 4901 |
1 files changed, 4901 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/koma-script/scrlayer.dtx b/Master/texmf-dist/source/latex/koma-script/scrlayer.dtx new file mode 100644 index 00000000000..99ff0c5771d --- /dev/null +++ b/Master/texmf-dist/source/latex/koma-script/scrlayer.dtx @@ -0,0 +1,4901 @@ +% \CheckSum{3307} +% \iffalse^^A meta-comment +% ====================================================================== +% scrlayer.dtx +% Copyright (c) Markus Kohm, 2012-2013 +% +% This file is part of the LaTeX2e KOMA-Script bundle. +% +% This work may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c of the license. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 and of this work. +% +% This work has the LPPL maintenance status "author-maintained". +% +% The Current Maintainer and author of this work is Markus Kohm. +% +% This work consists of all files listed in manifest.txt. +% ---------------------------------------------------------------------- +% scrlayer.dtx +% Copyright (c) Markus Kohm, 2012-2013 +% +% Diese Datei ist Teil der LaTeX2e KOMA-Script-Sammlung. +% +% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz, +% Version 1.3c. +% Die neuste Version dieser Lizenz ist +% http://www.latex-project.org/lppl.txt +% und Version 1.3c ist Teil aller Verteilungen von LaTeX +% Version 2005/12/01 und dieses Werks. +% +% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained" +% (allein durch den Autor verwaltet). +% +% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm. +% +% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien. +% ====================================================================== +% \fi^^A meta-comment +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% \iffalse^^A meta-comment +%<identify>%%% From File: $Id: scrlayer.dtx 1480 2013-10-31 10:00:02Z mjk $ (identify) +%<init>%%% From File: $Id: scrlayer.dtx 1480 2013-10-31 10:00:02Z mjk $ (init) +%<options>%%% From File: $Id: scrlayer.dtx 1480 2013-10-31 10:00:02Z mjk $ (options) +%<body>%%% From File: $Id: scrlayer.dtx 1480 2013-10-31 10:00:02Z mjk $ (body) +%<final>%%% From File: $Id: scrlayer.dtx 1480 2013-10-31 10:00:02Z mjk $ (final) +%<*dtx> +\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi +\begingroup + \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#4/#3/#2}} + \filedate$Date: 2013-10-31 11:00:02 +0100 (Do, 31. Okt 2013) $ + \def\filerevision$#1: #2 ${\gdef\filerevision{v0.9.#2}} + \filerevision$Revision: 1480 $ +\endgroup +\ProvidesFile{scrlayer.dtx}[\filedate\space\filerevision\space +%</dtx> +%<*identify|doc> +%<package>\NeedsTeXFormat{LaTeX2e}[1995/12/01] +%<package>\ProvidesPackage{scrlayer}[% +%<doc>\ProvidesFile{scrlayer.tex}[% +% Sometimes following will be replaced by !KOMASCRIPTVERSION: +%!SCRLAYERVERSION +%<package> package +%</identify|doc> +%<*dtx|identify|doc> + (defining layers and page styles)] +%</dtx|identify|doc> +%<*dtx> +\ifx\documentclass\undefined + \input scrdocstrip.tex + \@@input scrkernel-version.dtx + \@@input scrstrip.inc + \KOMAdefVariable{COPYRIGHTFROM}{2012} + \KOMAdefVariable{SCRLAYERVERSION}{\space\space\filedate\space\filerevision}% + \generate{\usepreamble\defaultpreamble + \file{scrlayer.sty}{% + \from{scrlayer.dtx}{package,trace,scrlayer,identify}% + \from{scrlayer.dtx}{package,trace,scrlayer,init}% + \from{scrlayer.dtx}{package,trace,scrlayer,options}% + \from{scrlayer.dtx}{package,trace,scrlayer,body}% + \from{scrlayer.dtx}{package,trace,scrlayer,final}% + \from{scrlogo.dtx}{logo}% + }% + } + + \batchinput{scrlayer-scrpage.dtx} + \batchinput{scrlayer-notecolumn.dtx} + \@@input scrstrop.inc +\else + \let\endbatchfile\relax +\fi +\endbatchfile +%</dtx> +%<*driver> + \documentclass{scrdoc} + \addtolength{\textwidth}{-1em} + \addtolength{\marginparwidth}{2em} + \addtolength{\oddsidemargin}{2em} + \usepackage[ngerman,english]{babel} + \usepackage{url,babelbib}\bibliographystyle{babalpha-fl} + \usepackage{listings} + \usepackage{scrhack} + \usepackage{etoolbox} + \pretocmd\DescribeMacro{\ifhmode\else\bigskip\noindent\fi}{}{} + \pretocmd\DescribeEnv{\ifhmode\else\bigskip\noindent\fi}{}{} + \pretocmd\DescribeOption{\ifhmode\else\bigskip\noindent\fi}{}{} + + \CodelineIndex + \RecordChanges + \GetFileInfo{scrlayer.dtx} + \title{The \KOMAScript{} package \texttt{scrlayer}% + \footnote{This is version \fileversion\ of file \texttt{\filename}.}} + \date{\filedate} + \author{Markus Kohm} + + \newenvironment{Explain}{\par}{\par} + \newcommand*{\length}{} + \let\length\Length + \let\endlength\endLength + \let\Macro\cs + \let\Length\Macro + \let\Package\textsf + \let\Class\Package + \let\File\texttt + \let\Option\texttt + \newcommand*{\KOption}[1]{\Option{#1}\texttt{=}} + \newcommand*{\OptionValue}[2]{\Option{#1}\texttt{=}\PValue{#2}} + \let\Counter\texttt + \let\Environment\texttt + \let\ShowOutput\quote + \let\endShowOutput\endquote + \let\Pagestyle\texttt + \newcommand*{\Parameter}[1]{\texttt{\marg{#1}}\linebreak[1]} + \newcommand*{\OParameter}[1]{\texttt{\oarg{#1}}\linebreak[1]} + \newcommand*{\MParameter}[2]{\texttt{(\meta{#1},\meta{#2})}\linebreak[1]} + \providecommand\PParameter[1]{\mbox{\texttt{\{#1\}}}\linebreak[1]} + \let\PName\meta + \let\PValue\texttt + \providecommand*{\autoref}[1]{\expandafter\AUTOREF#1:} + \providecommand*{\AUTOREF}{} + \makeatletter + \def\AUTOREF#1:#2:{% + \edef\@tempa{#1}% + \edef\@tempb{tab}\ifx\@tempa\@tempb table~\fi + \edef\@tempb{sec}\ifx\@tempa\@tempb section~\fi + \ref{#1:#2}% + } + \providecommand*{\IndexCmd}[2][]{} + \providecommand*{\textnote}[2][]{} + \providecommand*\eTeX{\leavevmode\hbox{$\varepsilon$}-\TeX} + \providecommand*\NTS{% + \leavevmode\hbox{$\cal N\kern-0.35em\lower0.5ex\hbox{$\cal T$}% + \kern-0.2emS$}} + + \lstnewenvironment{lstcode}{\lstset{language=[LaTeX]TeX}}{} + \makeatother + \sloppy% YOU SHOULD NOT DO THIS!!! + + \begin{document} + \maketitle + \DocInput{\filename} + \DocInput{scrlayer-scrpage.dtx} + \DocInput{scrlayer-notecolumn.dtx} + \bibliography{guide} + \PrintChanges + \PrintIndex + \end{document} +%</driver> +% \fi^^A meta-comment +% +% \selectlanguage{english} +% +% \changes{v0.0}{2012/01/01}{Start of new package} +% +%\iffalse^^A meta comment +%<*dtx|doc> +\chapter[{Defining Layers and Page Styles Using \Package{scrlayer}}]% +{Defining Layers and Page Styles Using \Package{scrlayer}% +%\footnote{This chapter has been generated from \File{scrlayer.dtx}.}% +} +\labelbase{scrlayer} + +\BeginIndex{Package}{scrlayer} + +%\fi^^A meta comment +% \begin{abstract} +\LaTeX{} itself doesn't know layers, but there are already packages +like \Package{eso-pic} or \Package{textpos}, that provide a kind of +background or foreground layer. \Package{scrlayer} is another package, +that provides such background and foreground layers, but in difference +to the other packages mentioned above these layers are part of the +page style definition. With this you may simply switch between usage +of layers by switching the page style. + +To do so, the package also supports a low level interface to define page +styles using a layer stack, to put layers onto a page style's layer stack, to +put layers at the lowest position of a page style's layer stack, to put layers +before or after a layer of a page style's layer stack, to remove a layer from +a page style's layer stack and to remove doublets of layers of a page style's +layer stack. In short words: The page style interface of \Package{scrlayer} +provides commands to define layer-stack-based page styles and to manage those +layer stacks. + +Nevertheless using the layers directly is recommended for advanced users only. +End user interfaces for beginners or average users are provided by additional +packages, that load \Package{scrlayer} on their own. +% \end{abstract} +% +% \tableofcontents +% + +\section{State of Development Note} +\label{sec:scrlayer.draft} + +Development of this package hasn't been finished yet. Because of this, +especially internal functionality may be changed in future. Most likely the +package will be extended. And because of the early state of development, you +should not expect any user documentation. In fact there's at least only some +developers documentation needed by the main developer himself. + +%\iffalse^^A meta-comment +\EndIndex{Package}{scrlayer} +%\fi^^A meta-comment + +\section{Early or Late Selection of Options} +\label{sec:scrlayer.options} + +Package \Package{scrlayer} uses the option interface of \KOMAScript. Therefore +you may set options either within the optional argument of +\Macro{documentclass} as global options, or within the optional argument of +\Macro{usepackage} as local options, or with \Macro{KOMAoptions} or +\Macro{KOMAoption} as \KOMAScript{} option. Several of these options expect a +value. See the \KOMAScript{} manual, \File{scrguide.pdf}, for more information +about this. + + +\section{Some Generic Information} +\label{sec:scrlayer.generic} + +The package needs some generic information about the class. Class authors may +help \Package{scrlayer} setting this information. Otherwise the package tries +to detect the information itself. This works, e.g., for the standard classes +and the \KOMAScript{} classes. But it may or may not fail with other classes. + +This section describes some of the information, that class authors may +provide. Generally users need not to care about this. + +%\iffalse^^A meta-comment +\begin{Declaration} + \Macro{if@chapter}\ \PName{then code} \Macro{else}\ \PName{else code} \Macro{fi}% +\end{Declaration} +\BeginIndex{Cmd}{if@chapter}% +%\fi^^A meta-comment +% \DescribeMacro{\if@chapter} +If \Macro{if@chapter} is defined and \Macro{iftrue}, \Package{scrlayer} will +work including the chapter level, e.g., at option \Option{automark}. If it is +defined, but not \Macro{iftrue}, it only handles part, section, subsection, +sub\dots subsection, paragraph, subparagraph, sub\dots subparagraph. If the +macro isn't defined, \Package{scrlayer} searches for \Macro{chapter}. If +\Macro{chapter} is defined and not \Macro{relax}, \Package{scrlayer} will +define \Macro{if@chapter} to \Macro{iftrue}, otherwise \Macro{if@chapter} will +become \Macro{iffalse}. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{if@chapter} +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} + \Macro{if@mainmatter}\ \PName{then code} \Macro{else}\ \PName{else code} \Macro{fi}% +\end{Declaration} +\BeginIndex{Cmd}{if@mainmatter}% +%\fi^^A meta-comment +% \DescribeMacro{\if@mainmatter} +Classes like \Class{book} define \Macro{frontmatter}, \Macro{mainmatter}, and +\Macro{backmatter}. They also use \Macro{if@mainmatter} to distinguish whether +or the current matter is the main matter. Classes like \Class{report} and +\Class{article} don't have \Macro{frontmatter}, \Macro{mainmatter}, or +\Macro{backmatter} and therefore also don't have \Macro{if@mainmatter}. + +For \Package{scrlayer} it's easier not to test always for the existence of the +matter commands, but to have \Macro{if@mainmatter} even with classes like +\Class{report} and \Class{article}, simply set to \Macro{iftrue}. So if +\Macro{if@mainmatter} is not defined, it will be defined to \Macro{iftrue}. + +Some classes have \Macro{frontmatter}, \Macro{mainmatter}, or +\Macro{backmatter} but not \Macro{if@mainmatter}. In this case +\Package{scrlayer} will also define \Macro{if@mainmatter} to be \Macro{iftrue} +and it'll extend definition of \Macro{frontmatter}, \Macro{mainmatter}, and +\Macro{backmatter} to set \Macro{if@mainmatter} properly. Other matter +commands are not known, not tested, and not extended. So if there other matter +commands \Package{scrlayer} needs help of the class author to get +\Macro{if@mainmatter} set correctly. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{if@mainmatter} +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\DeclareSectionNumberDepth} +% The command + \Macro{DeclareSectionNumberDepth}%^^A + \Parameter{level name}\Parameter{level depth} +% maps +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{DeclareSectionNumberDepth}% +With this command you may map +%\fi^^A meta-comment +the name of a heading level to a section numbering depth. With standard class +book, e.g., the \PName{level name} could be \PValue{part}, \PValue{chapter}, +\PValue{section}, \PValue{subsection}, \PValue{subsubsection}, +\PValue{paragraph}, or \PValue{subparagraph} and the corresponding +\PName{level depth}s would be -1, 0, 1, 2, 3, 4, and 5. Package +\Package{scrlayer} tries to determine the levels on it's own while loading +and while \Macro{begin}\PParameter{document}. But, if it fails, you may set it +on yourself using this command. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{DeclareSectionNumberDepth} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\footheight} +%\iffalse^^A meta-comment + \Length{footheight}% +\end{Declaration} +\BeginIndex{Length}{footheight}% +%\fi^^A meta-comment +While \LaTeX{} already provides \Length{headheight} to set up the height of +the page head, it doesn't provide a corresponding length for the page +footer. Nevertheless \Package{scrlayer} needs this in several cases. So if +\Length{footheight} doesn't already exist, \Package{scrlayer} will define +it and initialise it to -12345\,sp. If it's value is still this magic value +while \Macro{begin}\PParameter{document}, it will be set to +\Length{baselineskip} then. +%\iffalse^^A meta-comment +\EndIndex{Length}{footheight} +%\fi^^A meta-comment + + +\section{Declaration of Layers} +\label{sec:scrlayer.layers} + +A layer is a kind of logical sheet of transparent paper (in opposite to a +physical sheet of paper). One layer is stacked onto another layer and opaque +material on one layer may hide material on the layers below. The stack of all +layers together makes the physical page. Package \Package{scrlayer} +provides two such layer stacks for each page: a background layer stack and a +foreground layer stack. The background layer stack is behind the normal page +contents, the foreground layer stack is above the normal page contents. So the +normal contents is a kind of a separating layer. + +A layer has several attributes. The first attribute is, whether or not +the layer is part of the foreground or the background. Background +layers will be printed before the main contents of the page. Optically +they will be behind the main contents. Foreground layers will be +printed after the main contents of the page. Optically they will be in +front of the main contents. By default, a layer is both, a background +layer \emph{and} a foreground layer and therefore will be printed +twice. + +The second and third attributes are the horizontal and vertical position of +the layer. The forth and fifth attributes are the horizontal and vertical size +of the layer. As you can see, a layer may be smaller or larger than the +paper. + +But how are the horizontal an vertical positions measured? The answer +is the sixth attribute, the alignment. We can measure from the left edge of +the paper to the left edge of the layer, or from the left edge of the paper to +the middle of the layer, or from the left edge of the paper to the right edge +of the layer. We can measure from the top edge of the paper to the top edge of +the layer, or to the middle of the layer, or to the bottom edge of the layer. + +The seventh and eights attributes are, whether or not a layer should be +printed onto left or right pages. By default a layer will be printed at both, +left and right pages. Note, that \LaTeX{} names left pages as even pages and +right pages as odd pages and that there are no left or even pages in +single-sided mode. + +The ninth and tenth attributes are, whether or not a layer should be printed in +single-side mode or in two-side mode. By default a layer will be printed in +both, single-side mode and two-side mode. Nevertheless an even page layer will +never be printed in single-side mode and therefore isn't really a two-side +mode layer. + +The eleventh and twelveth attributes are, whether or not a layer should be +printed onto float pages or non-float pages. \LaTeX{} produces float pages for +float environment like tables or figures, if they are allowed to be printed on +a page without normal page contents (see option \PValue{p} for +\Environment{figure} or \Environment{table}). Non-float pages aren't pages +without floats, but pages, that aren't float pages. They may contain floats +inside the text, on the top of the page, or on the bottom of the page. Very +large floats may seem to be page floats, while in reality they are top floats. + +The thirteenth and last attribute is the contents of the layer. This is simply, +what should be printed, whenever the layer will be printed. + +So we have thirteen attributes yet. Below in this manual we will see additional +attributes, that may be build by these twelve attribute. Because of this, we +call these twelve attributes the primary attributes. + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\DeclareLayer} +% \DescribeMacro{\DeclareNewLayer} +% \DescribeMacro{\ProvideLayer} +% \DescribeMacro{\RedeclareLayer} +% \DescribeMacro{\ModifyLayer} +% The command: + \Macro{DeclareLayer}\OParameter{option list}\Parameter{layer name} +%\iffalse^^A meta-comment + \\\Macro{DeclareNewLayer}\OParameter{option list}\Parameter{layer name} + \\\Macro{ProvideLayer}\OParameter{option list}\Parameter{layer name} + \\\Macro{RedeclareLayer}\OParameter{option list}\Parameter{layer name} + \\\Macro{ModifyLayer}\OParameter{option list}\Parameter{layer name} +\end{Declaration} +\BeginIndex{Cmd}{DeclareLayer}% +\BeginIndex{Cmd}{DeclareNewLayer}% +\BeginIndex{Cmd}{ProvideLayer}% +\BeginIndex{Cmd}{RedeclareLayer}% +\BeginIndex{Cmd}{ModifyLayer}% +Command \Macro{DeclareLayer} +%\fi^^A meta-comment +declares or defines a layer with the name \PName{layer name}. It doesn't care +whether or not a layer with this name already exists. Argument \PName{layer + name} must be fully expandable and the expansion has to result in +letters. Some other characters will be tolerated, but only letters are +recommended. + +The \PName{option list} is a comma separated list of \PName{option}s. An +\PName{option} may be either a \PName{key} or a \PName{key} followed be an +equal sign followed by a \PName{value}. We call this a +\OptionValue{\PName{key}}{\PName{value}} option. Each \PName{key} is the +representation of a layer attribute. See \autoref{tab:scrlayer.layerkeys} for +more information about the names of the \PName{key}s and the corresponding +attributes. + +\begin{center} + \captionaboveof{table}{The \PName{key}s representing a layer attribute}% + \label{tab:scrlayer.layerkeys}% + \begin{description} + \item[\OptionValue{align}{\PName{alignment character}s} --] a description + of the wanted alignment. Each \PName{alignment character} influences + either, how the \PName{length} of \Option{hoffset} or \Option{voffset} + will be used. Several \PName{alignment character}s may be used together + (without comma or space). No macros should be used here! Valid + \PName{alignment character}s are: + \begin{description} + \item[\PValue{b} --] align the layer with its bottom edge to the given + \Option{length} of \Option{voffset} from the top edge of the paper. + \item[\PValue{c} --] align the layer with its centre to the given + \PValue{length} of \Option{hoffset} from the left edge and of + \Option{voffset} from the top edge of the paper. + \item[\PValue{l} --] align the layer with its left edge to the given + \PValue{length} of \Option{hoffset} from the left edge of the paper. + \item[\PValue{r} --] align the layer with its right edge to the given + \PValue{length} of \Option{hoffset} from the left edge of the paper. + \item[\PValue{t} --] align the layer with its top edge to the given + \Option{length} of \Option{voffset} from the top edge of the paper. + \end{description} + \item[\OptionValue{area}{%^^A + \Parameter{hoffset}\Parameter{voffset}%^^A + \Parameter{width}\Parameter{height}} --] composing option, that results + in \OptionValue{hoffset}{\PName{hoffset}}, + \OptionValue{voffset}{\PName{voffset}}, + \OptionValue{width}{\PName{width}}, \OptionValue{height}{\PName{height}}. + \item[\Option{background} --] print the layer only in the background, but not + in the foreground. This makes a background-only layer in opposite to the + default of layers which are both, background and foreground layers. The + option doesn't expect any value. By the default the attribute is not set. + \item[\Option{bottommargin} --] composing option, that sets + \Option{hoffset}, \Option{voffset}, \Option{width}, \Option{height}, and + \Option{align} to horizontally span the paper from the left edge to the + right and vertically span the area below the footer down to the bottom + edge of the paper. + \item[\OptionValue{clone}{\PName{layer name}} --] composing option, that + sets all primary attributes of the layer to the same values as the primary + attributes of the layer with the given \PName{layer name}. Note, that + \PName{layer name} has to be fully expandable and should expand to letters + only. Some additional characters will be tolerated, but they are not + recommended! + \item[\OptionValue{contents}{\PName{code}} --] the \PName{code} will be + expanded whenever the layer is printed. So the \PName{code} is what you + will see. No checks for valid code will be done. So errors in \PName{code} + may result in several failures on each page, that prints the layer. + \item[\Option{evenpage} --] print the layer on even pages only, but not on + odd pages. The option doesn't expect any value. By the default the + attribute is not set. Note, that this attribute includes \Option{twoside}. + \item[\Option{floatpage} --] print the layer on float pages only, but not on + other pages. The option doesn't expect any value. By the default the + attribute is not set. + \item[\Option{foot} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the text area and vertically span the page footer + defined by the new \LaTeX{} length \Length{footheight}. + \item[\Option{footskip} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the text area and vertically span the distance between + the text area and the page footer (note, that this is not the same like + \Length{footskip}). + \item[\Option{foreground} --] print the layer only in the foreground, but not + in the background. This makes a foreground-only layer in opposite to the + default of layers which are both, background and foreground layers. The + option doesn't expect any value. By the default the attribute is not set. + \item[\Option{head} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the text area and vertically span the page head defined + by usual\LaTeX{} length \Length{headheight}. + \item[\Option{headsep} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the text area and vertically span the distance between + the page head and the text area. + \item[\OptionValue{height}{\PName{length}} --] the height of the + layer. Note, that \PName{length} may either a \LaTeX{} length, declared + using \Macro{newlength}, or a \TeX{} length, declared using + \Macro{newdimen} or \Macro{newskip}, a length value like 10\,pt, or a + dimensional expression using +, -, /, *, (, and ). For more information + about valid dimensional expression see \cite[section~3.5]{manual:eTeX}. + \item[\OptionValue{hoffset}{\PName{length}} --] the offset of the layer + (depending on \Option{align} either left edge of the layer, middle of the + layer or right edge of the layer) from the left edge of the paper. See + \Option{height} for more information about valid content of + \PName{length}. + \item[\Option{innermargin} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the distance between the right edge of text area and the + right edge of the paper on even pages or the distance between the left + edge of the paper and the left edge of the text area on odd pages and + vertically span the whole paper from the top edge to the bottom edge. + \item[\Option{leftmargin} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the distance between the left edge of the paper and the + left edge of the text area and vertically span the whole paper from the + top edge to the bottom edge. + \item[\Option{nonfloatpage} --] don't print the layer on float pages, but on + other pages only. The option doesn't expect any value. By the default the + attribute is not set. + \item[\Option{oddpage} --] print the layer on odd pages only, but not on even + pages. The option doesn't expect any value. By the default the attribute + is not set. + \item[\Option{oneside} --] print the layer in single-side mode only, but not + in two-side mode. The option doesn't expect any value. By the default the + attribute is not set. + \item[\Option{outermargin} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the distance between the left edge of the paper and the + left edge of the text area on even pages or the distance between the right + edge of the text area and the right edge of the paper on odd pages and + vertically span the whole paper from the top edge to the bottom edge. + \item[\Option{page} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally and vertically span the whole paper from the left edge to the + right edge and the top edge to the bottom edge. + \item[\Option{rightmargin} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the distance between the right edge of text area and the + right edge of the paper and vertically span the whole paper from the top + edge to the bottom edge. + \item[\Option{textarea} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally and vertically span the whole text area from the left edge to + the right edge and the top edge to the bottom edge. + \item[\Option{topmargin} --] composing option, that sets \Option{hoffset}, + \Option{voffset}, \Option{width}, \Option{height}, and \Option{align} to + horizontally span the whole page from the left edge to the right edge and + vertically span the distance between the top edge of the paper and the + page head. + \item[\Option{twoside} --] print the layer in two-side mode only, but not in + single-side mode. The option doesn't expect any value. By the default the + attribute is not set. + \item[\OptionValue{voffset}{\PName{length}} --] the offset of the layer + (depending on \Option{align} either top edge of the layer, middle of the + layer or bottom edge of the layer) from the top edge of the paper. See + \Option{height} for more information about valid content of + \PName{length}. + \item[\OptionValue{width}{\PName{length}} --] the width of the layer. See + \Option{height} for more information about valid content of + \PName{length}. + \end{description} +\end{center} + +The difference between \Macro{DeclareLayer} and \Macro{DeclareNewLayer} is, +that using \Macro{DeclareNewLayer} would result in an error, if a layer with +the same \PName{layer name} already exists. So you may prevent yourself using +the same \PName{layer name} twice by mistake. + +The difference between \Macro{DeclareLayer} and \Macro{ProvideLayer} is, that +using \Macro{ProvideLayer} would be simply ignored, if a layer with the same +\PName{layer name} already exists. So it is something like: \emph{declare the + layer only, if is hasn't been declared already.} + +The difference between \Macro{DeclareLayer} and \Macro{RedeclareLayer} is, +that using \Macro{RedeclareLayer} would result in an error, if a layer with +the same \PName{layer name} doesn't exist already. So it may not be used to +define a new layer. + +The difference between \Macro{RedeclareLayer} and \Macro{ModifyLayer} is, that +\Macro{RedeclareLayer} resets the layer to the default, before declaring it +new. \Macro{ModifyLayer} doesn't reset it, so only the attributes, set by the +\PName{option list} will be changed. +% +%\iffalse^^A meta-comment +\EndIndex{Cmd}{ModifyLayer}% +\EndIndex{Cmd}{RedeclareLayer}% +\EndIndex{Cmd}{ProvideLayer}% +\EndIndex{Cmd}{DeclareNewLayer}% +\EndIndex{Cmd}{DeclareLayer}% +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\IfLayerExists} +% The command + \Macro{IfLayerExists}%^^A + \Parameter{string}\Parameter{then-code}\Parameter{else-code} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{IfLayerExists}% +This command +%\fi^^A meta-comment +may be used to execute code depending on whether or not a layer has been +defined already. If the layer exists \PName{then-code} will be executed, +otherwise \PName{else-code}. Note, that the command cannot really test whether +a layer exists. It uses a heuristic, that will never be false negative, but +may be false positive. Nevertheless, if it is false positive something went +wrong, either an incompatible package has been used or the user made something +he shouldn't do. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{IfLayerExists} +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\DestroyLayer} +% The command + \Macro{DestroyLayer}%^^A + \Parameter{layer name} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{DestroyLayer}% +This command +%\fi^^A meta-comment +sets all macros corresponding with the layer with given \PName{layer name} to +\Macro{relax}, if a layer with that name exists. After this the layer may not +be used any longer. But it doesn't matter, if the layer is still part of the +layer list of a page style, because such destroyed layers will be +ignored. Nevertheless destroyed layers may be defined new using +\Macro{DeclareNewLayer} or \Macro{ProvideLayer}, but couldn't be changed using +\Macro{RedeclareLayer} or \Macro{ModifyLayer} any longer. The command is +intended to be used inside \Macro{scrlayerOnAutoRemoveInterface} to remove +layers, that have been defined by an interface using removable macros of that +interface. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{DestroyLayer} +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% The command +% \DescribeMacro{\layercontentsmeasure} +% \DescribeOption{draft} + \Macro{layercontentsmeasure}% +%\iffalse^^A meta-comment + \\\KOption{draft}{\PName{simple switch}}% +\end{Declaration} +\BeginIndex{Option}{draft~=\PName{simple switch}} +\BeginIndex{Cmd}{layercontentsmeasure}% +The command \Macro{layercontentsmeasure} +%\fi^^A meta-comment +is internally used, if option \Option{draft} has been set, so visualise +the layers. The visualisation will be done with a centimetre ruler at the top +and left edge of the layer and an inch ruler at the bottom and right edge of +the layer. The rulers will be drawn behind the content of the layer. If you +would you, could also use it as content of a layer. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{layercontentsmeasure} +\EndIndex{Option}{draft~=\PName{simple switch}} +%\fi^^A meta-comment + + +\section{Declaration and Management of Page Styles} +\label{sec:scrlayer.pagestyles} + +Until now we know layers, but we don't know how to use them. The +perhaps astonishing answer is: with page styles. In \LaTeX{}, page +styles usually define heads and foots of odd and even pages. + +The head and foot of odd pages will be printed on pages with odd +page number in two-side mode or on all pages in single-side mode. This is +something like the layer attributes \Option{oddpage} and \Option{evenpage}. + +The page head will be printed before the main contents of a page. The page +footer will be printed after the main contents of a page. So this is something +like the layer attributes \Option{background} and \Option{foreground}. + +So it's obvious to declare page styles to be a list of layers. But instead of +having only four attributes \Option{oddpage}, \Option{evenpage}, +\Option{background}, and \Option{foreground} all the attributes of layers +shown in \autoref{sec:scrlayer.layers} may be used. + +The outcome of this is, that one kind of page styles \Package{scrlayer} +provides are layer page styles. A layer page style consists of layers and +several \emph{hooks}. For description of layers see +\autoref{sec:scrlayer.layers}. The \emph{hooks} are points in the expansion +or execution of page styles and you may add additional code, that will be +expanded there. + +Another kind of page styles \Package{scrlayer} provides are alias page +style. An alias page style simply consists of one other page style. In +other words, the name of an alias page style is only an alias name of +another page style, the aliased or original page style. Because of +this, the manipulation of an alias page style results in the +manipulation of the original page style. If the original page style is +an alias page style too, the manipulation will result in the +manipulation of the aliased page style of that original page style and +so on until a real page style will be manipulated. You may not only +alias layer page styles made with \Package{scrlayer}, but all kind of +page styles. + + +% \DescribeMacro{\currentpagestyle} +%\iffalse^^A meta-comment +\begin{Declaration} + \Macro{currentpagestyle} +\end{Declaration} +\BeginIndex{Cmd}{currentpagestyle}% +%\fi^^A meta-comment +Package scrlayer patches \Macro{pagestyle} to set \Macro{currentpagestyle} to +the currently active page style. Note, that \Macro{thispagestyle} does not +change \Macro{currentpagestyle}. But if you use \Macro{thispagestyle} the +result of \Macro{currentpagestyle} may be changed while execution of the +\LaTeX{} output routine. This may be relevant only, if +\Macro{currentpagestyle} has been used protected until execution of the output +routine. + +Note, that the layer page styles described later in this section, won't need +the patch of \Macro{pagestyle} to set \Macro{currentpagestyle}. The patch has +been made for usage with other page styles. Note also, that +\Macro{currentpagestyle} is empty before the first \Macro{pagestyle} after +loading \Package{scrlayer}. So if you define an end user page style interface, +it may be useful to use an implicit \Macro{pagestyle} to set the current page +style to a default page style. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{currentpagestyle} +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\BeforeSelectAnyPageStyle} +% \DescribeMacro{\AfterSelectAnyPageStyle} +% The command + \Macro{BeforeSelectAnyPageStyle}\Parameter{code}% +%\iffalse^^A meta-comment + \\\Macro{AfterSelectAnyPageStyle}\Parameter{code}%^^A +\end{Declaration} +\BeginIndex{Cmd}{BeforeSelectAnyPageStyle}% +\BeginIndex{Cmd}{AfterSelectAnyPageStyle}% +The command \Macro{BeforeSelectAnyPageStyle} +%\fi^^A meta-comment +adds \PName{code} to hook, that will be executed inside of \Macro{pagestyle} +just before the page style will be selected. You may use \texttt{\#1} as a +placeholder for the argument of \Macro{pagestyle}. + +The command \Macro{AfterSelectAnyPageStyle}%^^A +% \iffalse^^A meta-comment +\Parameter{code}%^^A +% \fi^^A meta-comment +\ is similar, but the \PName{code} will be executed just after the page style +has been selected and after \Macro{currentpagestyle} has been set to the name +of real page style. + +Note, that \PName{code} of both commands will be executed only, if a page +style will be selected using \Macro{pagestyle}, but not, e.\,g., if a page +style will be selected using \Macro{thispagestyle}. Note also, that you cannot +remove \PName{code} from the hook after adding it. But the \PName{code} will +be added locally, so you may use a group to limit the scope of +\PName{code}.%^^A +%\iffalse^^A meta-comment +\EndIndex{Cmd}{AfterSelectAnyPageStyle} +\EndIndex{Cmd}{BeforeSelectAnyPageStyle} +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\DeclarePageStyleAlias} +% \DescribeMacro{\DeclareNewPageStyleAlias} +% \DescribeMacro{\ProvidePageStyleAlias} +% \DescribeMacro{\RedeclarePageStyleAlias} +% The command + \Macro{DeclarePageStyleAlias}%^^A + \Parameter{alias page style name}\Parameter{original page style name} +%\iffalse^^A meta-comment + \\\Macro{DeclareNewPageStyleAlias}% + \Parameter{alias page style name}\Parameter{original page style name} + \\\Macro{ProvidePageStyleAlias}% + \Parameter{alias page style name}\Parameter{original page style name} + \\\Macro{RedeclarePageStyleAlias}% + \Parameter{alias page style name}\Parameter{original page style name} +\end{Declaration} +\BeginIndex{Cmd}{DeclarePageStyleAlias}% +\BeginIndex{Cmd}{DeclareNewPageStyleAlias}% +\BeginIndex{Cmd}{ProvidePageStyleAlias}% +\BeginIndex{Cmd}{RedeclarePageStyleAlias}% +These Commands +%\fi^^A meta-comment +may be used to define a page style with name \PName{alias page style name}, +that is simply an alias for already existing page style with name +\PName{original page style name}. If there's already a page style \PName{alias + page style name} it will be destroyed before creating the alias using +\Macro{DeclarePageStyleAlias} or \Macro{RedeclarePageStyleAlias}. + +\Macro{DeclareNewPageStyleAlias} will throw an error message, if a page style +\PName{alias page style name} has already been defined before. It doesn't +matter if the already defined page style is a layer page style, an alias page +style or another page style. + +\Macro{ProvidePageStyleAlias} will define the alias only, if a page style +\PName{alias page style name} hasn't been defined before. If a page style +\PName{alias page style name} already exists nothing will be done. + +\Macro{RedeclarePageStyleAlias} expects, that a page style \PName{alias page + style name} already exists. In this case it will destroy it and define the +alias newly. In the other case you'll get an error. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{RedeclarePageStyleAlias}% +\EndIndex{Cmd}{ProvidePageStyleAlias}% +\EndIndex{Cmd}{DeclareNewPageStyleAlias}% +\EndIndex{Cmd}{DeclarePageStyleAlias} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\DestroyPageStyleAlias} +% The command + \Macro{DestroyPageStyleAlias}\Parameter{page style name}% +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{DestroyPageStyleAlias}% +This command +%\fi^^A meta-comment +makes the page style with given \PName{page style name} \LaTeX-undefined, if +it is an alias for another page style. After this, the page style may be +defined newly with, e.g., \Macro{DeclareNewAliasPageStyle} or +\Macro{ProvideAliasPageStyle}. The command is intended to be used inside of +\Macro{scrlayerOnAutoRemoveInterface} to remove page styles, that have been +declared by an interface and uses removable macros of that interface. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{DestroyPageStyleAlias} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\GetRealPageStyle} +% The command + \Macro{GetRealPageStyle}\Parameter{page style name}% +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{GetRealPageStyle}% +The command +%\fi^^A meta-comment +will result in the (recursive) real page name of the page style, if +the page style with given name \PName{page style name} is an alias of +another page style. In all other cases, even if there's no alias and no page +style named \PName{page style name}, the result would be simply \PName{page + style name}. The command is fully expandable and may be used, e.g., in the +second argument of \Macro{edef}. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{GetRealPageStyle} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\DeclarePageStyleByLayers} +% \DescribeMacro{\DeclareNewPageStyleByLayers} +% \DescribeMacro{\ProvidePageStyleByLayers} +% \DescribeMacro{\RedeclarePageStyleByLayers} +% The command + \Macro{DeclarePageStyleByLayers}%^^A + \OParameter{option list}\Parameter{page style name}\Parameter{layer list}% +%\iffalse^^A meta-comment + \\\Macro{DeclareNewPageStyleByLayers}%^^A + \OParameter{option list}\Parameter{page style name}\Parameter{layer list}% + \\\Macro{ProvidePageStyleByLayers}%^^A + \OParameter{option list}\Parameter{page style name}\Parameter{layer list}% + \\\Macro{RedeclarePageStyleByLayers}%^^A + \OParameter{option list}\Parameter{page style name}\Parameter{layer list}% +\end{Declaration} +\BeginIndex{Cmd}{DeclarePageStyleByLayers}% +\BeginIndex{Cmd}{DeclareNewPageStyleByLayers}% +\BeginIndex{Cmd}{ProvidePageStyleByLayers}% +\BeginIndex{Cmd}{RedeclarePageStyleByLayers}% +These commands +%\fi^^A meta-comment +declares a page style with \PName{page style name}. The page style will +consist of the layers given in \PName{layer list}, a comma separated list of +layer names. Note, that the \PName{page style name} and the layer names at the +\PName{layer list} must be fully expandable and should expand to +letters. Several other characters will be tolerated, but nevertheless, they +aren't recommended. + +The \PName{option list} is a comma separated list of +\OptionValue{\PName{key}}{\PName{value}} options. These options may be used to +set additional features. Currently they are used to set the code, that should +be expanded or executed at several \emph{hooks}. See the introduction to this +section for more general information about \emph{hooks}. See +\autoref{tab:scrlayer.pagestyle.hooks} for more information about the hooks +and their purpose. + +\begin{center} + \parbox{\textwidth}{% + \captionaboveof{table}{The \emph{hook} options for page styles (in order of + execution)}\nobreak\vskip4\baselineskip}\vskip-5\baselineskip + \label{tab:scrlayer.pagestyle.hooks} + \begin{description} + \item[\texttt{\KOption{onselect}\PName{code}}:] Execute \PName{code} + whenever the page style will be selected using, e.g., + \Macro{pagestyle}. Note, that \Macro{thispagestyle} doesn't select the + page style immediately, but asynchronously inside \LaTeX's output routine. + \item[\texttt{\KOption{oninit}\PName{code}}:] Execute \PName{code} whenever + the output of the layers of a page style will be initialised. Note, that + this will be done twice for every page: once for background layers and + once for foreground layers. + \item[\texttt{\KOption{ononeside}\PName{code}}:] Execute \PName{code} + whenever the output of the layers of a page style in single-side mode will + initialised. Note, that this will be done twice for every page: once for + background layers and once for foreground layers. + \item[\texttt{\KOption{ontwoside}\PName{code}}:] Execute \PName{code} + whenever the output of the layers of a page style in two-side mode will + initialised. Note, that this will be done twice for every page: once for + background layers and once for foreground layers. + \item[\texttt{\KOption{onoddpage}\PName{code}}:] Execute \PName{code} + whenever the output of the layers of a page style on an odd page will + initialised. Note, that this will be done twice for every page: once for + background layers and once for foreground layers. Note also, that in + single-side mode all pages are odd pages, not only pages with odd page + numbers. + \item[\texttt{\KOption{onevenpage}\PName{code}}:] Execute \PName{code} + whenever the output of the layers of a page style on an even page will + initialised. Note, that this will be done twice for every page: once for + background layers and once for foreground layers. Note also, that there + aren't even pages in single-side mode, but all pages are odd pages, not + only pages with odd page numbers. + \item[\texttt{\KOption{onfloatpage}\PName{code}}:] Execute \PName{code} + whenever the output of the layers of a page style on a float page will + initialised. Note, that this will be done twice for every page: once for + background layers and once for foreground layers. Note also, that float + pages are only those pages with p-placed floating objects. + \item[\texttt{\KOption{onnonfloatpage}\PName{code}}:] Execute \PName{code} + whenever the output of the layers of a page style on a non-float page will + initialised. Note, that this will be done twice for every page: once for + background layers and once for foreground layers. Note also, that + non-float pages are all pages, that aren't float-pages. Those pages may + have t-placed, h-placed, b-placed, or no floating objects. + \item[\texttt{\KOption{onbackground}\PName{code}}:] Execute \PName{code} + whenever the output of the layers of a page style in the background of a + page will initialised. Note, that this will be done once for every page. + \item[\texttt{\KOption{onforeground}\PName{code}}:] Execute \PName{code} + whenever the output of the layers of a page style in the foreground of a + page will initialised. Note, that this will be done once for every page. + \end{description} +\end{center} + +The difference of \Macro{DeclarePageStyleByLayers} and +\Macro{DeclareNewPageStyleByLayers} is, that \Macro{DeclareNewPageStyleByLayers} +will result in an error, if a page style with name \PName{page style name} +already exists. Note, that declaring a page style, that is an alias of another +page style (see \Macro{DeclareAliasPageStyle} prior in this section), will not +re-declare the page style itself, but it's real page style (see +\Macro{GetRealPageStyle} prior in this section). + +The difference of \Macro{DeclarePageStyleByLayers} and +\Macro{ProvidePageStyleByLayers} is, that \Macro{ProvidePageStyleByLayers} +will simply do nothing, if there's already a page style with name \PName{page + style name}. In difference to \Macro{DeclareNewPageStyleByLayers} it won't +raise an error in this case. + +The difference of \Macro{DeclarePageStyleByLayers} and +\Macro{RedeclarePageStyleByLayers} is, that \Macro{RedeclarePageStyleByLayers} +may be used only, if the real page style of \PName{page style name} already +exists. Otherwise an error would occur. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{RedeclarePageStyleByLayers}% +\EndIndex{Cmd}{ProvidePageStyleByLayers}% +\EndIndex{Cmd}{DeclareNewPageStyleByLayers}% +\EndIndex{Cmd}{DeclarePageStyleByLayers}% +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} + \Pagestyle{@everystyle@}\\ + \Pagestyle{empty} +\end{Declaration} +\BeginIndex{Pagestyle}{@everysel@}% +\BeginIndex{Pagestyle}{empty}% +%\fi^^A meta-comment +There are two somehow special, default layer page styles. The first one is +\Pagestyle{@everystyle@}. This page style shouldn't be used normally, but the +layers of this page style will be used by all the other layer page styles. So +adding a layer to this page style would be similar to adding this layer to all +other layer page styles even the empty one. There's one difference: Layer +referencing commands of the page style interface like +\Macro{ForEachLayerOfPageStyle}, \Macro{AddLayerToPageStyleBeforeLayer}, or +\Macro{AddLayerToPageStyleAfterLayer} ignore the layers of +\Pagestyle{@everystyle@} if they are used for another layer page style. + +The other somehow special page style is \Pagestyle{empty}. Normally page style +\Pagestyle{empty} is defined by the \LaTeX{} kernel, to be a page style +without page head or page foot. Package{scrlayer} re-defines it to be a layer +page style without any layer. Nevertheless you may use it like every other +layer page style too. The main advantage above the \LaTeX{} kernel's empty +page style is, that it also executes the layers of special layer page style +\Pagestyle{@everysel@}. +%\iffalse^^A meta-comment +\EndIndex{Pagestyle}{empty}% +\EndIndex{Pagestyle}{@everysel@}% +%\fi^^A meta-comment + + +% \iffalse^^A meta-comment +\begin{Declaration} +% \fi^^A meta-comment +% \DescribeOption{onpsselect}% +% \DescribeOption{onpsinit}% +% \DeleteShortVerb{\|}% +% \DescribeOption{onps(one|two)side}% +% \DescribeOption{onps(odd|even)page}% +% \DescribeOption{onps(float|nonfloat)page}% +% \DescribeOption{onps(back|fore)ground}% +% \MakeShortVerb{\|}% +% \iffalse^^A meta-comment + \KOption{onpsselect}\PValue{code}\\ + \KOption{onpsinit}\PValue{code}\\ + \KOption{onpsoneside}\PValue{code}\\ + \KOption{onpstwoside}\PValue{code}\\ + \KOption{onpsoddpage}\PValue{code}\\ + \KOption{onpsevenpage}\PValue{code}\\ + \KOption{onpsfloatpage}\PValue{code}\\ + \KOption{onpsnonfloatpage}\PValue{code}\\ + \KOption{onpsbackground}\PValue{code}\\ + \KOption{onpsforeground}\PValue{code} +\end{Declaration} +\BeginIndex{Option}{onpsselect}% +\BeginIndex{Option}{onpsinit}% +\BeginIndex{Option}{onpsoneside}% +\BeginIndex{Option}{onpstwoside}% +\BeginIndex{Option}{onpsoddpage}% +\BeginIndex{Option}{onpsevenpage}% +\BeginIndex{Option}{onpsfloatpage}% +\BeginIndex{Option}{onpsnonfloatpage}% +\BeginIndex{Option}{onpsbackground}% +\BeginIndex{Option}{onpsforeground}% +% \fi^^A meta-comment +There's also a \KOMAScript{} option for each of those \texttt{hooks}. The +names of the \KOMAScript{} options are similar to the names of the page style +options, but with ``\texttt{ps}'' inserted behind ``\texttt{on}''. The value of +the \KOMAScript{} options are the initial defaults of the corresponding +\texttt{hooks}. This default will be extended by every usage of the page style +options at the \PName{option list}. You may remove the default, using +\Macro{ModifyLayerPageStyleOptions} described later in this section. +% \iffalse^^A meta-comment +\EndIndex{Option}{onpsforeground}% +\EndIndex{Option}{onpsbackground}% +\EndIndex{Option}{onpsnonfloatpage}% +\EndIndex{Option}{onpsfloatpage}% +\EndIndex{Option}{onpsevenpage}% +\EndIndex{Option}{onpsoddpage}% +\EndIndex{Option}{onpstwoside}% +\EndIndex{Option}{onpsoneside}% +\EndIndex{Option}{onpsinit}% +\EndIndex{Option}{onpsselect}% +% \fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} + \KOption{deactivatepagestylelayers}\PName{simple switch}\\ +%\fi^^A meta-comment +% \DescribeMacro{\ForEachLayerOfPageStyle} +% The command + \Macro{ForEachLayerOfPageStyle}%^^A + \Parameter{page style name}\Parameter{code} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{ForEachLayerOfPageStyle}% +This command +%\fi^^A meta-comment +may be used to process \PName{code} for every layer, that is a member of the +layers list of a page style with given \PName{page style name}. Inside of +\PName{code} the place holder \PValue{\#1} may be used for the name of the +current layer. +%\iffalse^^A meta-comment +\begin{Example} +%\fi^^A meta-comment +% \par +If you want to output the names of all layers of page style +\PValue{scrheadings}, you may us: +\begin{lstcode} + \let\commaatlist\empty + \ForEachLayerOfPageStyle{scrheadings}{% + \commaatlist#1\gdef\commaatlist{, }} +\end{lstcode} +%\iffalse^^A meta-comment +\end{Example} +%\fi^^A meta-comment +\KOMAScript{} option \Option{deactivatepagestylelayers} may be used to +deactivate all layers within \Macro{ForEachLayerOfPageStyle}. If the options +has been switched on, \Macro{ForEachLayerOfPageStyle} will not longer process +\PName{code} for any layer. Several other commands of \Package{scrlayer} also +uses \Macro{ForEachLayerOfPageStyle} internally. So these also won't process +any layer. You may use this options, e.g., to hide all layers. + +Please note, that \PName{code} will be executed inside a group! +% \iffalse^^A meta-comment +\EndIndex{Cmd}{ForEachLayerOfPageStyle} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\AddLayersToPageStyle} +% \DescribeMacro{\AddLayersAtBeginOfPageStyle} +% \DescribeMacro{\AddLayersAtEndOfageStyle} +% \DescribeMacro{\RemoveLayersFromPageStyle} +% The command + \Macro{AddLayersToPageStyle}%^^A + \Parameter{page style name}\Parameter{layer list}% +%\iffalse^^A meta-comment + \\\Macro{AddLayersAtBeginOfPageStyle}%^^A + \Parameter{page style name}\Parameter{layer list}% + \\\Macro{AddLayersAtEndOfPageStyle}%^^A + \Parameter{page style name}\Parameter{layer list}% + \\\Macro{RemoveLayersFromPageStyle}%^^A + \Parameter{page style name}\Parameter{layer list}% +\end{Declaration} +\BeginIndex{Cmd}{AddLayersToPageStyle}% +\BeginIndex{Cmd}{AddLayersAtBeginOfPageStyle}% +\BeginIndex{Cmd}{AddLayersAtEndOfPageStyle}% +\BeginIndex{Cmd}{RemoveLayersFromPageStyle}% +The first command +%\fi^^A meta-comment +adds all layers of the comma separated list of layers \PName{layer list} at +the end of the layer list of layer page style \PName{page style + name}. \Macro{AddLayersAtEndOfPageStyle} is an alias for the same. If you +want to add the new layers at the begin of the layer list of a layer page +style you may use \Macro{AddLayersAtBeginOfPageStyle}. Note, that the layers +will be added in the order of the \PName{layer list}. The first layer at +\PName{layer list} will be added first, the second layer will be added second +and so on. So with \Macro{AddLayersAtBeginOfPageStyle} the last layer at +\PName{layer list} will become the new first layer of the layer list of layer +page style \PName{page style name}. + +Command \Macro{RemoveLayersFromPageStyle} may be used to remove layers from +the layer list of layer page style \PName{page style name} instead of adding +them. Note, that layers, that are part of \PName{layer list} but not part of +the page style's layer list, will be ignored. + +Adding or removing layers from a page style, that is not a layer page style or +an alias of a layer page style would be an error and result in an error +message.% +%\iffalse^^A meta-comment +\EndIndex{Cmd}{RemoveLayersFromPageStyle}% +\EndIndex{Cmd}{AddLayersAtEndOfPageStyle}% +\EndIndex{Cmd}{AddLayersAtBeginOfPageStyle}% +\EndIndex{Cmd}{AddLayersToPageStyle} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\AddLayersToPageStyleBeforeLayer} +% The commands + \Macro{AddLayersToPageStyleBeforeLayer}%^^A + \Parameter{page style name}\Parameter{layer list}%^^A + \Parameter{reference layer name} +% and + \\\Macro{AddLayersToPageStyleAfterLayer}%^^A + \Parameter{page style name}\Parameter{layer list}%^^A + \Parameter{reference layer name} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{AddLayersToPageStyleBeforeLayer}% +\BeginIndex{Cmd}{AddLayersToPageStyleAfterLayer}% +These commands +%\fi^^A meta-comment +are similar to the commands described before, but they do not add the layers +at the begin or end of the layer list of a layer page style, but just before +or after a reference layer at the layer list of a layer page style. Note, that +in this case the order of the \PName{layer list} will be same in the layer +list of \PName{page style name} after adding. If the reference layer named +\PName{reference layer name} is not part of the layer list of the layer page +style, nothing happens. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{AddLayersToPageStyleAfterLayer} +\EndIndex{Cmd}{AddLayersToPageStyleBeforeLayer} +%\fi^^A meta-comment + + +% \DescribeMacro{\UnifyLayersAtPageStyle} +%\iffalse^^A meta-comment +\begin{Declaration} + \Macro{UnifyLayersAtPageStyle}\Parameter{page style name} +\end{Declaration} +\BeginIndex{Cmd}{UnifyLayersAtPageStyle}% +%\fi^^A meta-comment +With the commands described before in this section you may not only add +different layers to a page style, but even add the same layer several times to +a page style. In most cases it doesn't make sense to have one layer several +times at the layer list of a layer page style. So you may use +\Macro{UnifyLayersAtPageStyle}%^^A +%\Parameter{page style name}^^A +\ to remove all dupes of layers from the layer list of a layer page +style. Note that the order of layers may change! So if you want a special +order, you should remove all layers and add the layers in the order you want +instead of using \Macro{UnifyLayersAtPageStyle}. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{UnifyLayersAtPageStyle} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\ModifyLayerPageStyleOptions} +% \DescribeMacro{\AddToLayerPageStyleOptions} +% The command + \Macro{ModifyLayerPageStyleOptions}%^^A + \Parameter{page style name}\Parameter{option list} +%\iffalse^^A meta-comment + \\\Macro{AddToLayerPageStyleOptions}%^^A + \Parameter{page style name}\Parameter{option list} +\end{Declaration} +\BeginIndex{Cmd}{ModifyLayerPageStyleOptions}% +\BeginIndex{Cmd}{AddToLayerPageStyleOptions}% +Command \Macro{ModifyLayerPageStyleOptions} +%\fi^^A meta-comment +may be used to modify the page style options of a layer page style. Only +options at the comma separated \PName{option list} will be set to the new +values given in \PName{option list} if the new value is not empty. Options, +that are not at \PName{option list}, will stay unchanged. If you want to set +an option to \emph{do nothing} you may use value \Macro{relax}. Note, that +setting an option to a new value using \Macro{ModifyLayerPageStyleOptions} +will remove the previous value including the global default value. + +\Macro{AddToLayerPageStyleOptions} differs from +\Macro{ModifyLayerPageStyleOptions} in that point. It will not overwrite the +previous values, but adds\,---\,or more precisely: concatenates\,---\, the new +values to the previous values of the options at \PName{option list}. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{AddToLayerPageStyleOptions} +\EndIndex{Cmd}{ModifyLayerPageStyleOptions} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\IfLayerPageStyleExists} +% \DescribeMacro{\IfRealLayerPageStyleExists} +% The command + \Macro{IfLayerPageStyleExists}%^^A + \Parameter{page style name}\Parameter{then code}\Parameter{else code}% +%\iffalse^^A meta-comment + \\\Macro{IfRealLayerPageStyleExists}%^^A + \Parameter{page style name}\Parameter{then code}\Parameter{else code}% +\end{Declaration} +\BeginIndex{Cmd}{IfLayerPageStyleExists}% +\BeginIndex{Cmd}{IfRealLayerPageStyleExists}% +Command \Macro{IfLayerPageStyleExists} +%\fi^^A meta-comment +tests, whether or not the real page style of \PName{page style name} is a +layer page style. If the test is true, \PName{then code} will be executed. If +\PName{page style name} is neither a layer page style, nor an alias of a layer +page style, nor an alias of an alias of \dots\ a layer page style, \PName{else + code} will be executed. Internally this command is often used to throw an +error message if you use one of the layer page style commands with an +\PName{page style name} that doesn't correspond with a layer page style. + +Command \Macro{IfRealLayerPageStyleExists} is similar, but \PName{then code} +will only be executed, if \PName{page style name} itself is the name of a +layer page style. So \PName{else code} will even be executed, if \PName{page + style name} is an alias name of a layer page style or the alias name of an +alias name of \dots\ a layer page style. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{IfRealLayerPageStyleExists} +\EndIndex{Cmd}{IfLayerPageStyleExists} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\IfLayerAtPageStyle} +% \DescribeMacro{\IfSomeLayersAtPageStyle} +% \DescribeMacro{\IfLayersAtPageStyle} +% The command + \Macro{IfLayerAtPageStyle}% + \Parameter{page style name}\Parameter{layer name}%^^A + \Parameter{then code}\Parameter{else code}% +%\iffalse^^A meta-comment + \\\Macro{IfSomeLayerAtPageStyle}% + \Parameter{page style name}\Parameter{layer list}%^^A + \Parameter{then code}\Parameter{else code}% + \\\Macro{IfLayerAtPageStyle}% + \Parameter{page style name}\Parameter{layer list}%^^A + \Parameter{then code}\Parameter{else code}% +\end{Declaration} +\BeginIndex{Cmd}{IfLayerAtPageStyle}% +\BeginIndex{Cmd}{IfSomeLayersAtPageStyle}% +\BeginIndex{Cmd}{IfLayersAtPageStyle}% +Command \PName{IfLayerAtPageStyle} +%\fi^^A meta-comment +may be used to test, whether or not a layer named \PName{layer name} is a +member of the layer list of a given page style. If the test is true, the +\PName{then code} will be executed. If the layer is not a member of the layer +list of \PName{page style name}, the \PName{else code} will be executed. + +Commands \Macro{IfSomeLayerAtPageStyle} and \Macro{IfLayersAtPageStyle} do not +only test one layer but several layers at a given, comma separated +\PName{layer list}. \Macro{IfSomeLayerAtPageStyle} will execute the +\PName{then code} if \emph{at least one} of the layers at \PName{layer list} +is a member of the layer list of \PName{page style name}. In difference +\Macro{IfLayersAtPageStyle} executes the \PName{then code} only, if \emph{all} +of the layers at \PName{layer list} are members of the layer list of +\PName{page style name}. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{IfLayersAtPageStyle} +\EndIndex{Cmd}{IfSomeLayersAtPageStyle} +\EndIndex{Cmd}{IfLayerAtPageStyle} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\DestroyRealLayerPageStyle} +% The command + \Macro{DestroyRealLayerPageStyle}\Parameter{page style name} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{DestroyRealLayerPageStyle}% +Command \Macro{DestroyRealLayerPageStyle} +%\fi^^A meta-comment +makes the page style named \PName{page style name} undefined, if and only if +it is a layer page style. Nothing will be happen if it is an alias name of a +layer page style, if it is another page style, or if it isn't a page style. If +\PName{page style name} is the name of the current page style the current page +style will become a kind of empty page style. If the special page +style\,---\,this may be set using \Macro{thispagestyle}\,---\,is \PName{page + style name}, this will be simply reset. + +Note, that the layers of the page style won't be destroyed automatically. If +you want to destroy the layers too, you may use +\begin{lstcode} + \ForEachLayerOfPageStyle{...}{\DestroyLayer{#1}} +\end{lstcode} +\emph{before} destroying the layer page style. + +The command is intended to be used inside the auto-remove code of an interface +See following \ref{sec:scrlayer.enduserinterfaces} for more information about +auto-remove code. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{DestroyRealLayerPageStyle} +%\fi^^A meta-comment + + +\section{End User Interfaces} +\label{sec:scrlayer.enduserinterfaces} + +Package \Package{scrlayer} provides an interface to define and manage +(concurrent) end user interfaces. Maybe future releases of \KOMAScript{} will +provide parts of this by package \Package{scrbase}, but currently package +\Package{scrlayer} provides its own interface definition commands. + +This section only describes the interface commands for defining end user +interfaces. This is not of interest for end users, but only for authors of end +user interfaces. End users will find information about the end user interfaces +in the sections about the particular end user interface, e.g., +\autoref{sec:scrlayer.scrpage}. + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\scrlayerInitInterface} +% The command + \Macro{scrlayerInitInterface}\OParameter{interface name} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{scrlayerInitInterface}% +Command \Macro{scrlayerInitInterface} +%\fi^^A meta-comment +registers a new interface. The \PName{interface name} must be unique. If you +try to initialise an already initialised interface an error will occur. This +command is obligatory and mandatory for interfaces. It should be the first +interface command and therefore has been described first. If the optional +argument is omitted, \PValue{\Macro{@currname}.\Macro{@currext}} will be +used instead. For classes and packages this will be the file name of the class +or package while loading the class or package. But you may use any sequence of +characters with category letter or other. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{scrlayerInitInterface} +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} + \KOption{forceoverwrite}\PName{simple switch}\\ + \KOption{autoremoveinterfaces}\PName{simple switch}\\ +%\fi^^A meta-comment +% \DescribeMacro{\scrlayerAddToInterface} +% \DescribeMacro{\scrlayerAddCsToInterface} +%\iffalse^^A meta-comment + \Macro{scrlayerAddToInterface}% + \OParameter{interface name}\Parameter{command}\Parameter{code}\\ + \Macro{scrlayerAddCsToInterface}% + \OParameter{interface name}\Parameter{command sequence}\Parameter{code} +\end{Declaration} +\BeginIndex{Option}{forceoverwrite}% +\BeginIndex{Option}{autoremoveinterfaces}% +\BeginIndex{Cmd}{scrlayerAddToInterface}% +\BeginIndex{Cmd}{scrlayerAddCsToInterface}% +%\fi^^A meta-comment +One of the special features of end user interfaces is, that they should +register all interface dependent commands (also known as \emph{macros}). You +may do this using \Macro{scrlayerAddToInterface}%^^A +%\OParameter{interface name}\Parameter{command}\Parameter{code}%^^A +. If your interface generates macros not only at load time but also at run +time or if the interface name shouldn't be the class's or package's name, you +have to use the optional argument to add the command to a dedicated +interface. An error will occur, if the interface hasn't been initialised +before. + +The first mandatory argument is the \PName{command}\footnote{The + \PName{command} consists in the backslash followed by a \PName{command + sequence} consisting in characters with category code letter or one other + character, or \PName{command} consists in one active character (without + backslash).}, that should be added to the interface. If the command can be +added to the interface, it will be added to the interface, will be set to +\Macro{relax} and \PName{code} will be executed. You can use, e.g., +\Macro{newcommand}\PName{command} inside of \PName{code} to define +\PName{command}. + +But when can a command be defined? If a command is undefined or \Macro{relax} +it can be defined. If a command has already been defined and registered for +another interface \emph{and} if \KOMAScript{} option +\Option{autoremoveinterface} has been switched on, the other interface will be +removed automatically and the new command will be set to \Macro{relax} and +will be registered for the given interface. If a command +has already been defined but isn't part of another interface \emph{and} if +\KOMAScript{} option \Option{forceoverwrite} has been switched on, the command +will be set to \Macro{relax} and will be registered for the given interface. + +Command \Macro{scrlayerAddCsToInterface} is similar to +\Macro{scrlayerAddToInterface} but doesn't expect a command as first, +mandatory argument, but a command sequence\footnote{A command sequence may + consist of any characters with category code letter or other.}. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{scrlayerAddCsToInterface}% +\EndIndex{Cmd}{scrlayerAddToInterface} +\EndIndex{Option}{autoremoveinterfaces}% +\EndIndex{Option}{forceoverwrite}% +%\fi^^A meta-comment + + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\scrlayerOnAutoRemoveInterface} +% The command + \Macro{scrlayerOnAutoRemoveInterface}%^^A + \OParameter{interface name}\Parameter{code} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{scrlayerOnAutoRemoveInterface}% +Command \Macro{scrlayerOnAutoRemoveInterface} +%\fi^^A meta-comment +registers \PName{code} to be executed, if the interface will be automatically +removed (see \Option{autoremoveinterfaces} prior in this section). This may be +used, e.g., to automatically destroy layers or page styles (see +\Macro{DestroyLayer}, \Macro{DestroyAliasPageStyle}, and +\Macro{DestroyRealLayerPageStyle}). +%\iffalse^^A meta-comment +\EndIndex{Cmd}{scrlayerOnAutoRemoveInterface} +%\fi^^A meta-comment + + +%\iffalse +%</dtx|doc> +%\fi +% +% \StopEventually{} +% +% +% \section{Implementation of \Package{scrlayer}} +% +% This section if for developers only. +% Users may continue at \autoref{sec:scrlayer.scrpage} at +% page~\pageref{sec:scrlayer.scrpage}. +% +% \iffalse +%<*package> +%<*identify> +% \fi +% +%\iffalse^^A meta-comment +%</identify> +%</package> +%<*package|interface> +%\fi^^A meta-comment +% +% \subsection{Initialising some Values before the Options} +% +% \iffalse^^A meta-comment +%<*init> +% \fi^^A meta-comment +% +% Initialisation before all options. +% +% While there are \KOMAScript{} options, we need \Package{scrkbase} to declare +% them, but the interfaces also needs \Package{scrlayer} which already +% includes \Package{scrkbase}. +% \begin{macrocode} +%<package>\RequirePackage{scrkbase}[2013/03/05] +%<interface>\RequirePackage{scrlayer} +% \end{macrocode} +% +% +% \begin{macro}{\scrlayer@AtEndOfPackage} +% Initial \Macro{AtEndOfPackage}, but after end of package +% \Macro{@firstofone}. +% \begin{macrocode} +\scr@ifundefinedorrelax{scrlayer@AtEndOfPackage}{% + \AtEndOfPackage{\let\scrlayer@AtEndOfPackage\@firstofone}% +}{% + \ifx\scrlayer@AtEndOfPackage\@firstofone + \AtEndOfPackage{\let\scrlayer@AtEndOfPackage\@firstofone}% + \fi +} +\let\scrlayer@AtEndOfPackage\AtEndOfPackage +% \end{macrocode} +% \end{macro}^^A \sls@AtEndOfPackage +% +% \begin{macro}{\scrlayer@testunexpectedarg} +% We'll have several \KOMAScript{} options, that didn't expect an +% value. So we use this general helper to test the value and report an error +% if it is not empty (or \Macro{relax}). +% \begin{macrocode} +%<*package> +\newcommand*{\scrlayer@testunexpectedarg}[2]{% + \ifx\relax#2\relax\else + \PackageError{scrlayer}{unexpected value to `#1'}{% + Option `#1' doesn't expect any value.\MessageBreak + If you'll continue, the value `#2' will be ignored.% + }% + \fi +} +%</package> +% \end{macrocode} +% \end{macro}^^A \scrlayer@testunexpectedarg +% +% \begin{macro}{\if@chapter} +% We need this later. But it is something general. So we initialise it as +% early as possible. +% \begin{macrocode} +%<*package> +\scr@ifundefinedorrelax{if@chapter}{% + \newif\if@chapter + \scr@ifundefinedorrelax{chapter}{\@chapterfalse}{\@chaptertrue}% +}{} +% \end{macrocode} +% \end{macro}^^A \if@chapter +% +% \begin{macro}{\if@mainmatter} +% Some classes define \Macro{frontmatter} or \Macro{mainmatter}, but do not +% define \Macro{if@mainmatter}. But we nee some information about the matter, +% so in that case, we add it. +% \begin{macrocode} +\scr@ifundefinedorrelax{if@mainmatter}{% + \scr@ifundefinedorrelax{mainmatter}{% + \newif\if@mainmatter\@mainmattertrue + }{% + \PackageWarningNoLine{scrlayer}{% + \string\mainmatter\space defined without + \string\if@mainmatter!\MessageBreak + Note, that several packages need + \string\if@mainmatter\space\MessageBreak + to detect whether or no the main matter has been\MessageBreak + entered. So does scrlayer. Because of this\MessageBreak + it will extend \string\mainmatter, now% + }% + \newif\if@mainmatter\@mainmattertrue + \expandafter\def\expandafter\mainmatter\expandafter{% + \expandafter\@mainmattertrue\mainmatter}% + \scr@ifundefinedorrelax{frontmatter}{}{% + \expandafter\def\expandafter\frontmatter\expandafter{% + \expandafter\@mainmatterfalse\frontmatter} + }% + \scr@ifundefinedorrelax{backmatter}{}{% + \expandafter\def\expandafter\backmatter{% + \expandafter\@mainmatterfalse\backmattter}% + }% + }% +}{} +%</package> +% \end{macrocode} +% \end{macro}^^A \if@mainmatter +% +% \iffalse^^A meta-comment +%</init> +% \fi^^A meta-comment +% +% +% \subsection{Process Options} +% +% \iffalse^^A meta-comment +%<*body> +% \fi^^A meta-comment +% +% The very first thing at the body is processing the options: +% \begin{macrocode} +\KOMAProcessOptions\relax +% \end{macrocode} +% +% \subsection{Body Initialisation} +% +% Currently not needed. +% +% \iffalse +%</body> +% \fi +% +% +% \subsection{Extended Running Heads} +% +% Package \Package{scrpage2} changes and extends the running head mechanisms +% of \LaTeX{} and the classes. Most of this are basic features an therefore +% done already by \Package{scrlayer}. But not the deprecated options. +% +% \begin{option}{markcase} +% \begin{description} +% \item[\texttt{=\meta{setting}}] one of: \texttt{upper}, \texttt{lower}, +% \texttt{used}, or \texttt{ignoreuppercase}. +% \end{description}\noindent +% The two options \Option{markuppercase} and \Option{markusedcase} become +% deprecated and are replace be the single option \Option{markcase}. Note, +% that interface \Package{scrlayer-scrpage} has to delay this option to +% overload case setting of option \Option{pagestyleset}. +% \begin{macrocode} +%<*options> +\KOMA@key{markcase}{% +%<interface&scrpage>\scrlayer@AtEndOfPackage{% + \begingroup + \KOMA@set@ncmdkey{markcase}{reserved@a}{% + {upper}{0},{lower}{1},{used}{2},% + {ignoreuppercase}{3},{nouppercase}{3},% + {ignoreupper}{3},{noupper}{3}% + }{#1}% + \ifx\FamilyKeyState\FamilyKeyStateProcessed + \aftergroup\FamilyKeyStateProcessed + \ifnum \reserved@a>\m@ne + \aftergroup\let\aftergroup\MakeMarkcase + \ifcase \reserved@a + \aftergroup\MakeUppercase + \aftergroup\scrlayer@forceignoreuppercasefalse + \or + \aftergroup\MakeLowercase + \aftergroup\scrlayer@forceignoreuppercasefalse + \or + \aftergroup\@firstofone + \aftergroup\scrlayer@forceignoreuppercasefalse + \else + \aftergroup\scrlayer@ignoreuppercase + \aftergroup\scrlayer@forceignoreuppercasetrue + \fi + \fi + \else + \aftergroup\FamilyKeyStateUnknownValue + \fi + \endgroup +%<interface&scrpage>}% +} +%<interface>\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @markcase} +% \end{macrocode} +% \begin{macro}{\MakeMarkcase} +% We use this instead of, e.g., \Macro{MakeUppercase} for every layer! So the +% name seams to be wrong, but it is common, so we use it here. +% \begin{macrocode} +%<*package> +\providecommand*{\MakeMarkcase}[1]{#1} +% \end{macrocode} +% \begin{macro}{\scrlayer@ignoreuppercase} +% We span a group and set \Macro{uppercase} and \Macro{MakeUppercase} to +% \Macro{@firstofone}. +% \begin{macrocode} +\DeclareRobustCommand*{\scrlayer@ignoreuppercase}[1]{% + \begingroup + \let\uppercase\@firstofone + \let\MakeUppercase\@firstofone + \expandafter\let\csname MakeUppercase \endcsname\@firstofone + #1% + \endgroup +} +% \end{macrocode} +% This is almost enough, but standard classes still would show upper-case +% letters at table of contents, list of figures, list of tables, index and +% bibliography. So we need an additional workaround. +% \begin{macro}{\ifscrlayer@forceignoreuppercase} +% \begin{macrocode} +\newif\ifscrlayer@forceignoreuppercase +%</package> +%</options> +% \end{macrocode} +% \end{macro}^^A \ifscrlayer@forceignoreuppercase +% \end{macro}^^A \scrlayer@ignoreuppercase +% \end{macro}^^A \MakeMarkcase +% \end{option}^^A markcase +% +% +% \begin{macro}{\headmark} +% Inside a page style, this macro is either \Macro{rightmark} or +% \Macro{leftmark}. Outside its \LaTeX-undefined and therefore it's not an +% interface command, but has to be undefined: +% \begin{macrocode} +%<*package&body> +\@ifundefined{headmark}{}{% + \PackageWarningNoLine{scrlayer}{% + \string\headmark\space detected!\MessageBreak + \string\headmark\space will either be set to + \string\rightmark\MessageBreak + or \string\leftmark inside of page styles.\MessageBreak + This means, that \string\headmark\space will be overwritten\MessageBreak + at every page layer usage!\MessageBreak + Nevertheless it will stay unchanged outside\MessageBreak + of page layers.\MessageBreak + I hope, this won't break your document% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \headmark +% +% \begin{macro}{\pagemark} +% The page number together with its font setting. It's robust and will never +% be part of the interface. +% \begin{macrocode} +%<*package&body> +\@ifundefined{pagemark}{% + \DeclareRobustCommand\pagemark{{\pnumfont{\thepage}}}% +}{}% +% \end{macrocode} +% \begin{macro}{\pnumfont} +% \begin{macro}{\scr@fnt@pagenumber} +% The low-level page number font command. It is deprecated to redefine or use +% this and it may already be defined. These commands will not become part of +% the interface! +% \begin{macrocode} +\@ifundefined{pnumfont}{% + \newcommand{\pnumfont}{\normalfont}% +}{} +\@ifundefined{scr@fnt@pagenumber}{% + \newcommand{\scr@fnt@pagenumber}{\pnumfont}% +}{} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \scr@fnt@pagenumber +% \end{macro}^^A \pnumfont +% \end{macro}^^A \pagemark +% +% \begin{macro}{\partmarkformat} +% \begin{macro}{\chaptermarkformat} +% \begin{macro}{\sectionmarkformat} +% \begin{macro}{\GenericMarkFormat} +% All the \Macro{\dots markformat} macros of \KOMAScript{} are also +% supported by \Package{scrlayer} and it uses them actively. The generic +% definition has been moved from \Macro{@seccntmarkformat} to +% \Macro{GenericMarkFormat}. This is one more difference to +% \Package{scrpage2}. The defaults are compatible to the standard +% classes. These commands will not become part of the interface and other +% interfaces should redefine them only, if they are not already defined. +% \begin{macrocode} +%<*package&body> +\providecommand*{\partmarkformat}{\partname\ \thepart. \ }% +\if@chapter + \providecommand*{\@chapapp}{\chaptername}% + \providecommand*{\chaptermarkformat}{\@chapapp\ \thechapter. \ }% + \providecommand*{\sectionmarkformat}{\thesection. \ }% +\else + \providecommand*{\sectionmarkformat}{\GenericMarkFormat{section}}% +\fi +\scr@ifundefinedorrelax{@seccntmarkformat}{% + \providecommand*{\GenericMarkFormat}{\@seccntformat}% +}{% + \providecommand*{\GenericMarkFormat}[1]{\@seccntmarkformat{#1}}% +} +%</package&body> +% \end{macrocode} +% Note, that the other \Macro{\dots markformat} will be defined by +% \Macro{scrlayer@level@init}. +% \end{macro}^^A \GenericMarkFormat +% \end{macro}^^A \sectionmarkformat +% \end{macro}^^A \chaptermarkformat +% \end{macro}^^A \partmarkformat +% +% \begin{macro}{\@mkleft} +% \begin{macro}{\@mkright} +% \begin{macro}{\@mkdouble} +% These are new in \Package{scrlayer}. They may be updated, whenever +% \Macro{@mkboth} will be updated. Otherwise they get a working default +% definition. These commands will not become part of the interface and other +% interfaces should redefine them only, if they are not already defined. +% \begin{macrocode} +%<*package&body> +\providecommand*{\@mkleft}{% + \begingroup + \ifx\@mkboth\markboth \aftergroup\markleft + \else + \ifx\@mkboth\@gobbletwo \aftergroup\@gobble + \else \def\@gobbletwo##1##2{}% + \ifx \@mkboth\@gobbletwo \aftergroup\@gobble + \else + \PackageWarning{scrlayer}{% + package incompatibility detected!\MessageBreak + \string\@mkboth it neither \string\markboth nor any\MessageBreak + kind of two arguments gobbling,\MessageBreak + e.g., \string\@gobbletwo.\MessageBreak + So I don't known, what to do\MessageBreak + with \string\@mkleft.\MessageBreak + Nevertheless, \string\markleft\space will be\MessageBreak + used% + }% + \aftergroup\markleft + \fi + \fi + \fi + \endgroup +}% +\providecommand*{\@mkright}{% + \begingroup + \ifx\@mkboth\markboth \aftergroup\markright + \else + \ifx\@mkboth\@gobbletwo \aftergroup\@gobble + \else \def\@gobbletwo##1##2{}% + \ifx \@mkboth\@gobbletwo \aftergroup\@gobble + \else + \PackageWarning{scrlayer}{% + package incompatibility detected!\MessageBreak + \string\@mkboth it neither \string\markboth nor any\MessageBreak + kind of two arguments gobbling,\MessageBreak + e.g., \string\@gobbletwo.\MessageBreak + So I don't known, what to do\MessageBreak + with \string\@mkright.\MessageBreak + Nevertheless, \string\markright\space will be\MessageBreak + used% + }% + \aftergroup\markright + \fi + \fi + \fi + \endgroup +}% +\providecommand*{\@mkdouble}[1]{% + \@mkboth{#1}{#1}% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@mkdouble +% \end{macro}^^A \@mkright +% \end{macro}^^A \@mkleft +% +% \begin{macro}{\markleft} +% \begin{macro}{\@markleft} +% \LaTeX{} itself provides \Macro{markboth} and \Macro{markright} but not +% \Macro{markleft}. So we add it. +% \begin{macrocode} +%<*package&body> +\providecommand*{\markleft}[1]{% + \begingroup + \let\label\relax \let\index\relax \let\glossary\relax + \expandafter\@markleft\@themark {#1}% + \@temptokena \expandafter{\@themark}% + \mark{\the\@temptokena}% + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi +} +\providecommand{\@markleft}[3]{% + \@temptokena {#2}% + \unrestored@protected@xdef\@themark{{#3}{\the\@temptokena}}% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@markleft +% \end{macro}^^A \markleft +% +% +% \begin{option}{autooneside} +% \begin{macro}{\ifscrlayer@autooneside} +% Decide whether or not use the optional argument of \Macro{automark} in +% single-side layout. +% \begin{macrocode} +%<*options> +\KOMA@ifkey{autooneside}{scrlayer@autooneside}\scrlayer@autoonesidetrue +%<interface>\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @autooneside} +%</options> +% \end{macrocode} +% \end{macro}^^A \ifscrlayer@autooneside +% \end{option}^^A autooneside +% +% +% \begin{option}{automark} +% \begin{option}{manualmark} +% Maybe we will extend these options later. Currently they do almost the +% same they do at \Package{scrpage2}. The difference is, that single-side or +% two-side doesn't matter here (but it does inside of the definitions of the +% marks itself). +% ToDo: Maybe \Option{manualmark} should become deprecated and +% \Option{automark} should have simple values or a new option, that also +% handles \Option{autooneside}? +% \begin{macrocode} +%<*options> +\KOMA@key{automark}[]{% + \scrlayer@testunexpectedarg{automark}{#1}% + \scrlayer@AtEndOfPackage{% + \if@chapter + \automark[section]{chapter}% + \else + \automark[subsection]{section}% + \fi + }% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @automark} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @automark@default} +%</interface> +\KOMA@key{manualmark}[]{% + \scrlayer@testunexpectedarg{manualmark}{#1}% + \scrlayer@AtEndOfPackage{\manualmark}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @manualmark} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @manualmark@default} +%</interface> +%</options> +% \end{macrocode} +% \end{option}^^A manualmark +% \end{option}^^A automark +% +% \begin{macro}{\manualmark} +% Switch to manual marks. This resets \Macro{@mkleft}, \Macro{@mkright}, +% \Macro{@mkdouble}, \Macro{@mkboth} and the \Macro{\dots mark} of all known +% levels. +% \begin{macrocode} +%<*package&body> +\newcommand*{\manualmark}{% + \begingroup + \def\@elt##1{% + \aftergroup\let\expandafter\aftergroup\csname ##1mark\endcsname + \aftergroup\@gobble + }% + \scrlayer@level@list + \endgroup + \let\@mkleft\@gobble + \let\@mkright\@gobble + \let\@mkdouble\@gobble + \let\@mkboth\@gobbletwo +} +%</package&body> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\automark} +% \begin{macro}{\@automark} +% This is the brain knot of the game! I'll try to explain, what I'm doing: +% First of all the new starred version of \Macro{automark} doesn't reset the +% mark commands. So it works cumulatively. This may be useful e.g. to have +% chapter marks as long as no section marks have been made etc. +% \begin{macrocode} +%<*package&body> +\newcommand*{\automark}{% + \@ifstar{\@automark}{\manualmark\@automark}% +} +\newcommand*{\@automark}[2][]{% + \ifstr{#2}{}{% + \ifstr{#1}{}{% +% \end{macrocode} +% \Macro{automark[]{}} or \Macro{automark{}} has been used. This will activate +% the low level mark commands, but doesn't change the high level commands. It +% may be useful or may not, the user should know what he does: +% \begin{macrocode} + \automark@basics + }{% +% \end{macrocode} +% \Macro{automark[\dots]{}} has been used. This will activate the higher level +% mark commands and also set up the right mark +% \begin{macrocode} + \automark@basics + \automark@righthigh{#1}% + }% + }{% + \ifstr{#1}{}{% +% \end{macrocode} +% \Macro{automark[]{\dots}} or \Macro{automark{\dots}} has been used. This +% will activate the low level mark commands and also set up either the left or +% both marks. +% \begin{macrocode} + \automark@basics + \automark@leftlow{#2}% + }{% +% \end{macrocode} +% \Macro{automark[\dots]{\dots}} has been used. This will activate the low +% level mark commands and also both high level marks. +% \begin{macrocode} + \automark@basics + \automark@both{#1}{#2}% + }% + }% +} +% \end{macrocode} +% \begin{macro}{\automark@basics} +% Activate all low level \Macro{@mk\dots} commands: +% \begin{macrocode} +\newcommand*{\automark@basics}{% + \let\@mkleft\markleft + \let\@mkright\markright + \let\@mkboth\markboth + \def\@mkdouble##1{\@mkboth{##1}{##1}}% +} +% \end{macrocode} +% \end{macro}^^A \automark@basics +% \begin{macro}{\automark@righthigh} +% Set up the right mark of a higher level, but in single-side layout only if +% \Option{autooneside} hasn't been used. Note, that with this definition no +% special handling for \KOMAScript's \Macro{addchap} and \Macro{addsec} is +% needed. +% \begin{macrocode} +\newcommand*{\automark@righthigh}[1]{% + \ifscrlayer@level@prepared{#1}{% + \expandafter\def\csname #1mark\endcsname##1{% + \begingroup + \@tempswafalse + \if@twoside\@tempswatrue + \else\ifscrlayer@autooneside\else\@tempswatrue\fi\fi + \expandafter\endgroup + \if@tempswa + \@mkright{% + \MakeMarkcase{% + \ifnum \c@secnumdepth<\numexpr \csname #1level\endcsname +0\relax + \else\if@mainmatter \csname #1markformat\endcsname\fi\fi + ##1% + }% + }% + \fi + }% + }{}% +} +% \end{macrocode} +% \end{macro}^^A \automark@righthigh +% \begin{macro}{\automark@leftlow} +% Set up the left mark of a low level, but in single-side layout the right +% mark has to be used. +% \begin{macrocode} +\newcommand*{\automark@leftlow}[1]{% + \ifscrlayer@level@prepared{#1}{% + \expandafter\def\csname #1mark\endcsname ##1{% + \if@twoside +% \end{macrocode} +% In two-side mode the left high mark has also to clear the right low +% mark. This would be unwanted, if the left mark is a low mark and the right +% mark is a high mark. But we cannot detect this if no right mark level has +% been given. So we simply use: +% \begin{macrocode} + \expandafter\@mkboth + \else +% \end{macrocode} +% In single-side mode there's no left high mark without a right low mark. So +% instead of only a left high mark, we set up both marks. +% \begin{macrocode} + \expandafter\@mkdouble + \fi + {% + \MakeMarkcase{% + \ifnum \c@secnumdepth<\numexpr \csname #1level\endcsname +0\relax + \else\if@mainmatter \csname #1markformat\endcsname\fi\fi + ##1% + }% + }\@empty + }% + }{}% +} +% \end{macrocode} +% \end{macro}^^A \automark@leftlow +% \begin{macro}{\automark@both} +% Set up both marks, but in single-side layout depending on +% \Option{autooneside}. +% \begin{macrocode} +\newcommand*{\automark@both}[2]{% + \ifscrlayer@level@prepared{#1}{% + \ifscrlayer@level@prepared{#2}{% + \ifnum \numexpr \csname #1level\endcsname +0\relax + > \numexpr \csname #2level\endcsname +0\relax +% \end{macrocode} +% Level of left mark is greater than level of right mark. e.g., section > +% chapter. This is unusual. Nevertheless we'll handle it. +% \begin{macrocode} + \automark@leftlow{#2}% + \automark@righthigh{#1}% + \else \ifnum \numexpr \csname #1level\endcsname +0\relax + = \numexpr \csname #2level\endcsname +0\relax +% \end{macrocode} +% Level of left mark is equal to level of right mark. This is +% nice and very easy to handle. +% \begin{macrocode} + \expandafter\def\csname #2mark\endcsname##1{% + \@mkdouble{% + \MakeMarkcase{% + \ifnum \c@secnumdepth<\numexpr + \csname #2level\endcsname +0\relax + \else + \if@mainmatter \csname #2markformat\endcsname\fi + \fi + ##1% + }% + }% + }% + \else +% \end{macrocode} +% Level of left mark is less than level of right mark. This is +% usual. +% \begin{macrocode} + \expandafter\def\csname #1mark\endcsname##1{% + \begingroup + \@tempswafalse + \if@twoside\@tempswatrue + \else\ifscrlayer@autooneside\else\@tempswatrue\fi\fi + \expandafter\endgroup + \if@tempswa + \@mkleft{% + \MakeMarkcase{% + \ifnum \c@secnumdepth + < \numexpr\csname #1level\endcsname +0\relax + \else + \if@mainmatter \csname #1markformat\endcsname\fi + \fi + ##1% + }% + }% + \fi + }% + \expandafter\def\csname #2mark\endcsname##1{% + \@mkboth{}{% + \MakeMarkcase{% + \ifnum \c@secnumdepth + < \numexpr \csname #2level\endcsname +0\relax + \else\if@mainmatter \csname #2markformat\endcsname\fi\fi + ##1% + }% + }% + }% + \fi + \fi + }{}% + }{}% +} +% \end{macrocode} +% \begin{macro}{\ifscrlayer@level@prepared} +% Test, whether or not this level has been prepared. +% \begin{macrocode} +\newcommand*{\ifscrlayer@level@prepared}[1]{% + \typeout{1: \detokenize{#1}}% + \scr@ifundefinedorrelax{#1level}{% + \PackageError{scrlayer}{numbering depth of `#1' unknown}{% + Someone told me to use a section mark for level `#1',\MessageBreak + but the numbering depth hasn't been declared before. You may solve this + using\MessageBreak + \string\DeclareSectionNumberDepth{#1}{NUMBER}.% + }% + \@secondoftwo + }{% + \@firstoftwo + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \ifscrlayer@level@prepared +% \end{macro}^^A \automark@both +% \end{macro}^^A \@automark +% \end{macro}^^A \automark +% +% \begin{macro}{\DeclareSectionNumberDepth} +% \begin{description} +% \item[\Parameter{string}:] the name of the section level, e.g., +% part, chapter, section etc. (must be fully +% expandable and expand to a string). +% \item[\Parameter{numeric expression}:] the section number depth of the +% level, e.g., -1 for part, 0 for chapter etc. +% \end{description} +% Note that levels part, chapter, section, subsection, sub\dots subsection, +% paragraph, subparagraph, sub\dots subparagraph, minisec, subminisec, +% sub\dots subminisec will be recognised either at load time or at +% \Macro{begin}\PParameter{document} automatically if they have the usual +% levels. +% \begin{macrocode} +%<*package&body> +\newcommand*{\DeclareSectionNumberDepth}[2]{% + \expandafter\edef\csname #1level\endcsname{\the\numexpr #2\relax}% + \@ifundefined{#1mark}{% + \expandafter\let\csname #1mark\endcsname\@gobble + }{}% + \@ifundefined{#1markformat}{% + \@namedef{#1markformat}{\GenericMarkFormat{#1}}% + }{}% + \begingroup + \@tempswatrue + \def\@elt##1{\ifstr{#1}{##1}{\@tempswafalse}{}}% + \scrlayer@level@list + \if@tempswa + \aftergroup\@firstofone + \else + \aftergroup\@gobble + \fi + \endgroup + {% + \l@addto@macro\scrlayer@level@list{\@elt{#1}}% + }% +} +% \end{macrocode} +% \begin{macro}{\scrlayer@level@list} +% \begin{macro}{\scrlayer@level@init} +% Stores all the existing levels. +% \begin{macrocode} +\newcommand*{\scrlayer@level@list}{} +% \end{macrocode} +% Usually all levels are known on loading this package, but if a package +% defines additional levels later we'll do an additional test at +% \Macro{begin}\PParameter{document}. But we do not redo the part and the +% chapter test. +% \begin{macrocode} +\scr@ifundefinedorrelax{part}{}{% + \DeclareSectionNumberDepth{part}{-1}% +} +\if@chapter + \DeclareSectionNumberDepth{chapter}{0}% +\fi +\newcommand*{\scrlayer@level@init}{% + \@tempcnta=1 + \def\reserved@b##1{% + \@tempswatrue + \def\reserved@a{##1}% + \@whilesw \if@tempswa \fi {% + \scr@ifundefinedorrelax{\reserved@a}{% + \@tempswafalse + }{% + \@ifundefined{\reserved@a level}{% + \expandafter\DeclareSectionNumberDepth + \expandafter{\reserved@a}{\@tempcnta}% + }{}% + \advance \@tempcnta by \@ne + \edef\reserved@a{sub\reserved@a}% + }% + }% + }% + \reserved@b{section}% + \reserved@b{paragraph}% + \reserved@b{minisec}% +} +\scrlayer@level@init +\AtBeginDocument{% + \scrlayer@level@init +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \scrlayer@level@init +% \end{macro}^^A \scrlayer@level@list +% \end{macro}^^A DeclareSectionNumberDepth +% +% +% \subsection{Providing Layers} +% +% A layer is a virtual sheet of paper stacked behind or above the real sheet +% of paper. All the virtual and real sheets of one page may been seen +% simultanous, but material o one sheet may overlap material on sheets below. +% Layers provided by \Package{scrlayer} will not be stacked below or above +% real sheets unless they are used by a page style. +% +% While we use \meta{key}\texttt{=}\meta{value} arguments for several of the +% layer commands we define a new family with a new member: +% \begin{macrocode} +%<*package&body> +\DefineFamily{KOMAarg} +\DefineFamilyMember[.definelayer]{KOMAarg} +%</package&body> +% \end{macrocode} +% +% \begin{macro}{\DeclareLayer} +% \begin{description} +% \item[\OParameter{option list}:] a comma separated list of +% \texttt{\meta{key}=\meta{value}} pairs. +% \item[\Parameter{string}:] the name of the layer (must be fully expandable +% and expand to a string only). +% \end{description} +% Layers are the basic elements of page styles. A layer has a name and several +% attributes. The attributes may be set as comma separated list at the first, +% optional argument of \cs{DeclareLayer}. The name must be set by the second, +% mandatory argument. +% \begin{macro}{\def@scr@l@pos} +% And a second helper macro to easily define $x, y, w, h$ of a layer. +% \begin{macrocode} +%<*package&body> +\newcommand*{\def@scr@l@pos}[4]{% + \@namedef{scr@l@\scr@current@layer @x}{#1}% + \@namedef{scr@l@\scr@current@layer @y}{#2}% + \@namedef{scr@l@\scr@current@layer @w}{#3}% + \@namedef{scr@l@\scr@current@layer @h}{#4}% +} +% \end{macrocode} +% \end{macro}^^A \def@scr@l@pos +% +% There are basic attributes and compounding attributes. The basic attributes +% are: +% \begin{description} +% \item[\texttt{hoffset=\meta{dimension expression}}:] offset from the left +% edge of the paper. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{hoffset}{% + \@namedef{scr@l@\scr@current@layer @x}{\dimexpr #1\relax}% + \FamilyKeyStateProcessed +} +% \end{macrocode} +% \item[\texttt{voffset=\meta{dimension expression}}:] offset from the top +% edge of the paper. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{voffset}{% + \@namedef{scr@l@\scr@current@layer @y}{\dimexpr #1\relax}% + \FamilyKeyStateProcessed +} +% \end{macrocode} +% \item[\texttt{width=\meta{dimension expression}}:] width of the layer. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{width}{% + \@namedef{scr@l@\scr@current@layer @w}{\dimexpr #1\relax}% + \FamilyKeyStateProcessed +} +% \end{macrocode} +% \item[\texttt{height=\meta{dimension expression}}:] height of the layer. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{height}{% + \@namedef{scr@l@\scr@current@layer @h}{\dimexpr #1\relax}% + \FamilyKeyStateProcessed +} +% \end{macrocode} +% \item[\texttt{align=\meta{specification}}:] horizontal and vertical +% alignment of the layer. The \meta{specification} will interpreted +% character by character with the following valid characters: +% \begin{itemize} +% \item[l] -- align the layer with its left edge to the given horizontal +% offset. This means, that the layer's width will span right from the +% given horizontal offset. +% \item[r] -- align the layer with its right edge to the given horizontal +% offset. This means, that the layer's width will span left from the given +% horizontal offset. +% \item[c] -- align the layer centered to the given horizontal and vertical +% offset. This means, that the given offsets are at the middle of the +% layer width and total height. +% \item[t] -- align the layer with its top edge to the given vertical +% offset. This means that the layer's contents will span below the given +% vertical offset. +% \item[b] -- align the layer with its bottom edge to the given vertical +% offset. This means, that the layer's contents will span above the given +% vertical offset. +% \end{itemize} +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{align}{% + \@namedef{scr@l@\scr@current@layer @align}{#1}% + \FamilyKeyStateProcessed +} +% \end{macrocode} +% \item[\texttt{contents=\meta{output}}:] whatever should be printed by the +% layer. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{contents}{% + \@namedef{scr@l@\scr@current@layer @contents}{#1}% + \FamilyKeyStateProcessed +} +% \end{macrocode} +% \item[\texttt{background}:] restrict the layer to the page +% background. This means, that the main contents of the page may overprint +% the contents of the layer. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{background}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{background}{#1}% + \csname @scr@l@\scr@current@layer @backgroundtrue\endcsname + \csname @scr@l@\scr@current@layer @foregroundfalse\endcsname +} +% \end{macrocode} +% \item[\texttt{foreground}:] restrict the layer to the page +% foreground. This means, that the layer's contents may overprint the main +% contents of the page. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{foreground}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{foreground}{#1}% + \csname @scr@l@\scr@current@layer @backgroundfalse\endcsname + \csname @scr@l@\scr@current@layer @foregroundtrue\endcsname +} +% \end{macrocode} +% \item[\texttt{oddpage}:] restrict the layer to odd pages only. At +% two-sided layout only pages with odd page numbers are odd pages. At +% single-sided layout all pages are odd pages. Note, that this attribute has +% no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{oddpage}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{oddpage}{#1}% + \csname @scr@l@\scr@current@layer @oddtrue\endcsname + \csname @scr@l@\scr@current@layer @evenfalse\endcsname +} +% \end{macrocode} +% \item[\texttt{evenpage}:] restrict the layer to even pages only. At +% two-sided layout only pages with even page numbers are even pages. At +% single-sided layout there aren't even pages. Note, that this attribute has +% no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{evenpage}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{evenpage}{#1}% + \csname @scr@l@\scr@current@layer @oddfalse\endcsname + \csname @scr@l@\scr@current@layer @eventrue\endcsname +} +% \end{macrocode} +% \item[\Option{floatpage}:] restrict the layer to float pages. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{floatpage}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{floatpage}{#1}% + \csname @scr@l@\scr@current@layer @nonfloatpagefalse\endcsname + \csname @scr@l@\scr@current@layer @floatpagetrue\endcsname +} +% \end{macrocode} +% \item[\Option{nonfloatpage}:] restrict the layer to pages, which aren't +% float pages. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{nonfloatpage}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{twoside}{#1}% + \csname @scr@l@\scr@current@layer @nonfloatpagetrue\endcsname + \csname @scr@l@\scr@current@layer @floatpagefalse\endcsname +} +% \end{macrocode} +% \item[\Option{oneside}:] restrict the layer to pages on single-sided +% layouts. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{oneside}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{oneside}{#1}% + \csname @scr@l@\scr@current@layer @twosidefalse\endcsname + \csname @scr@l@\scr@current@layer @onesidetrue\endcsname +} +% \end{macrocode} +% \item[\Option{twoside}:] restrict the layer to pages on two-sided +% layouts. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{twoside}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{twoside}{#1}% + \csname @scr@l@\scr@current@layer @twosidetrue\endcsname + \csname @scr@l@\scr@current@layer @onesidefalse\endcsname +} +% \end{macrocode} +% \end{description} +% +% Compounding attributes are attributes, that set up several basic attributes +% with a single compounding attribute: +% \begin{description} +% \item[\texttt{page}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values spanning the whole +% page aligned by the default alignment \texttt{tl}. Note, that this +% attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{page}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{page}{#1}% + \def@scr@l@pos{\z@}{\z@}{\paperwidth}{\paperheight}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{topmargin}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the top +% margin of the page and horizontally spanning the whole page aligned by the +% default alignment \texttt{tl}. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{topmargin}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{topmargin}{#1}% + \def@scr@l@pos{\z@}{\z@}{\paperwidth}{\dimexpr \topmargin+1in\relax}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{head}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the page +% head and horizontally spanning the text area aligned by usual head +% alignment \texttt{bl}. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{head}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{head}{#1}% + \def@scr@l@pos{% + \dimexpr + \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi + \else\oddsidemargin\fi + +1in + \relax + }{% + \dimexpr \topmargin+1in+\headheight\relax + }{\textwidth}{\headheight}% + \@namedef{scr@l@\scr@current@layer @align}{bl}% +} +% \end{macrocode} +% \item[\texttt{headsep}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the area +% between page head and text area and horizontally spanning the text area +% aligned by the default alignment \texttt{t}. Note, that this attribute +% has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{headsep}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{head}{#1}% + \def@scr@l@pos{% + \dimexpr + \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi + \else\oddsidemargin\fi + +1in + \relax + }{% + \dimexpr \topmargin+1in+\headheight\relax + }{\textwidth}{\headsep}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{textarea}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values spanning the text area of +% the page aligned by the default alignment \texttt{t}. Note, that this +% attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{textarea}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{textarea}{#1}% + \def@scr@l@pos{% + \dimexpr + \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi + \else\oddsidemargin\fi + +1in + \relax + }{% + \dimexpr \topmargin+1in+\headheight+\headsep\relax + }{\textwidth}{\textheight}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{foot}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the page +% footer and horizontally spanning the text area aligned by the usual footer +% alignment \texttt{t}. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{foot}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{foot}{#1}% + \def@scr@l@pos{% + \dimexpr + \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi + \else\oddsidemargin\fi + +1in + \relax + }{% + \dimexpr \topmargin+1in+\headheight+\headsep+\textheight + +\footskip+\dp\strutbox-\footheight\relax + }{\textwidth}{\footheight}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{footskip}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the +% distance from the text area to the page +% footer and horizontally spanning the text area aligned by the usual footer +% alignment \texttt{t}. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{footskip}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{foot}{#1}% + \def@scr@l@pos{% + \dimexpr + \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi + \else\oddsidemargin\fi + +1in + \relax + }{% + \dimexpr \topmargin+1in+\headheight+\headsep+\textheight\relax + }{\textwidth}{\dimexpr\footskip+\dp\strutbox-\footheight\relax}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{bottommargin}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the +% page's bottom margin below the footer and horizontally spanning the page +% by the default alignment \texttt{t}. Note, that this attribute has no +% value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{bottommargin}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{bottommargin}{#1}% + \def@scr@l@pos{\z@}{% + \dimexpr \topmargin+1in+\headheight+\headsep + +\textheight + +\footskip+\dp\strutbox\relax + }{\paperwidth}{\dimexpr\paperheight-\layeryoffset\relax}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{leftmargin}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the page +% and horizontally spanning the left margin of the page by the default +% alignment \texttt{t}. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{leftmargin}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{leftmargin}{#1}% + \def@scr@l@pos{\z@}{\z@}{% + \dimexpr + \if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi + \else\oddsidemargin\fi + +1in + \relax + }{\paperheight}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{rightmargin}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the page +% and horizontally spanning the right margin of the page by the default +% alignment \texttt{t}. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{rightmargin}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{rightmargin}{#1}% + \def@scr@l@pos{\paperwidth}{\z@}{% + \dimexpr \paperwidth-1in-\textwidth + -\if@twoside\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi + \else\oddsidemargin\fi\relax + }{\paperheight}% + \@namedef{scr@l@\scr@current@layer @align}{tr}% +} +% \end{macrocode} +% \item[\texttt{innermargin}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the page +% and horizontally spanning the right margin of even pages and the left +% margin of odd pages by the default alignment \texttt{t}. See attributes +% \texttt{oddpage} and \texttt{evenpage} for more information about odd and +% even pages. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{innermargin}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{innermargin}{#1}% + \def@scr@l@pos{% + \if@twoside + \ifodd\value{page} \z@ + \else \dimexpr \evensidemargin+1in+\textwidth\relax + \fi + \else \z@\fi + }{\z@}{% + \dimexpr + \if@twoside\ifodd\value{page} \oddsidemargin+1in + \else \paperwidth-\layerxoffset\fi + \else \oddsidemargin+1in\fi + \relax + }{\paperheight}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{outermargin}:] set up \texttt{hoffset}, \texttt{voffset}, +% \texttt{width}, and \texttt{height} to values vertically spanning the page +% and horizontally spanning the left margin of even pages and the right +% margin of odd pages by the default alignment \texttt{t}. See attributes +% \texttt{oddpage} and \texttt{evenpage} for more information about odd and +% even pages. Note, that this attribute has no value! +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{outermargin}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{outermargin}{#1}% + \def@scr@l@pos{% + \dimexpr + \if@twoside\ifodd\value{page} \oddsidemargin+1in+\textwidth + \else \z@\fi + \else \oddsidemargin+1in+\textwidth\fi + \relax + }{\z@}{% + \dimexpr + \if@twoside\ifodd\value{page}\paperwidth-\layerxoffset + \else \evensidemargin+1in\fi + \else \paperwidth-\layerxoffset\fi + \relax + }{\paperheight}% + \@namedef{scr@l@\scr@current@layer @align}{tl}% +} +% \end{macrocode} +% \item[\texttt{area=\{\meta{hoffset}\}\{\meta{voffset}\}^^A +% \{\meta{width}\}\{\meta{height}\}}:] set up +% \texttt{hoffset}, \texttt{voffset}, \texttt{width}, and \texttt{height} to +% the given values. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{area}{% + \def@scr@l@pos#1 + \FamilyKeyStateProcessed +} +% \end{macrocode} +% \item[\texttt{clone=\meta{layer}}:] set up the new layer by the settings +% of the given \meta{layer}. +% \begin{macrocode} +\DefineFamilyKey[.definelayer]{KOMAarg}{clone}{% + \scr@ifundefinedorrelax{scr@l@#1@x}{% + \FamilyKeyStateUnknownValue + \PackageError{scrlayer}{layer `#1' undefined}{% + You can clone only already defined layers.\MessageBreak + If you'll continue, `clone=#1' will be ignored.% + }% + }{% + \FamilyKeyStateProcessed + \scrlayer@clone@attribute{\scr@current@layer}{#1}{x}% + \scrlayer@clone@attribute{\scr@current@layer}{#1}{y}% + \scrlayer@clone@attribute{\scr@current@layer}{#1}{w}% + \scrlayer@clone@attribute{\scr@current@layer}{#1}{h}% + \scrlayer@clone@attribute{\scr@current@layer}{#1}{align}% + \scrlayer@clone@attribute{\scr@current@layer}{#1}{contents}% + \scrlayer@clone@switch{\scr@current@layer}{#1}{background}% + \scrlayer@clone@switch{\scr@current@layer}{#1}{foreground}% + \scrlayer@clone@switch{\scr@current@layer}{#1}{odd}% + \scrlayer@clone@switch{\scr@current@layer}{#1}{even}% + \scrlayer@clone@switch{\scr@current@layer}{#1}{oneside}% + \scrlayer@clone@switch{\scr@current@layer}{#1}{twoside}% + \scrlayer@clone@switch{\scr@current@layer}{#1}{floatpage}% + \scrlayer@clone@switch{\scr@current@layer}{#1}{nonfloatpage}% + }% +} +% \end{macrocode} +% \begin{macro}{\scrlayer@clone@attribute} +% \begin{macro}{\scrlayer@clone@switch} +% Two helpers used to at option \texttt{clone} to clone either a macro-based +% attribute or a if-based attribute. +% \begin{macrocode} +\newcommand*{\scrlayer@clone@attribute}[3]{% + \expandafter\let\csname scr@l@#1@#3\expandafter\endcsname + \csname scr@l@#2@#3\expandafter\endcsname +} +\newcommand*{\scrlayer@clone@switch}[3]{% + \expandafter\let\csname if@scr@l@#1@#3\expandafter\endcsname + \csname if@scr@l@#2@#3\expandafter\endcsname +} +% \end{macrocode} +% \end{macro}^^A \scrlayer@clone@switch +% \end{macro}^^A \scrlayer@clone@attribute +% \end{description} +% +% \begin{macrocode} +\newcommand*{\DeclareLayer}[2][]{% + \def\scr@current@layer{#2}% + \@namedef{scr@l@#2@x}{\z@}% + \@namedef{scr@l@#2@y}{\z@}% + \@namedef{scr@l@#2@w}{\paperwidth}% + \@namedef{scr@l@#2@h}{\paperheight}% + \@namedef{scr@l@#2@align}{tl}% + \@namedef{scr@l@#2@contents}{}% + \expandafter\newif\csname if@scr@l@#2@background\endcsname + \csname @scr@l@#2@backgroundtrue\endcsname + \expandafter\newif\csname if@scr@l@#2@foreground\endcsname + \csname @scr@l@#2@foregroundtrue\endcsname + \expandafter\newif\csname if@scr@l@#2@odd\endcsname + \csname @scr@l@#2@oddtrue\endcsname + \expandafter\newif\csname if@scr@l@#2@even\endcsname + \csname @scr@l@#2@eventrue\endcsname + \expandafter\newif\csname if@scr@l@#2@oneside\endcsname + \csname @scr@l@#2@onesidetrue\endcsname + \expandafter\newif\csname if@scr@l@#2@twoside\endcsname + \csname @scr@l@#2@twosidetrue\endcsname + \expandafter\newif\csname if@scr@l@#2@floatpage\endcsname + \csname @scr@l@#2@floatpagetrue\endcsname + \expandafter\newif\csname if@scr@l@#2@nonfloatpage\endcsname + \csname @scr@l@#2@nonfloatpagetrue\endcsname + \FamilyExecuteOptions[.definelayer]{KOMAarg}{#1}% +} +% \end{macrocode} +% \begin{macro}{\scr@current@layer} +% Helper to hold the current layer and only valid in non recursive calls of +% \Macro{DeclareLayer}. +% \begin{macrocode} +\newcommand*{\scr@current@layer}{} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \scr@current@layer +% \end{macro}^^A \DeclareLayer +% +% \begin{macro}{\IfLayerExists} +% \begin{description} +% \item[\Parameter{string}:] the name of the layer (must be fully expandable +% and expand to a string only). +% \item[\Parameter{then code}:] will be executed, if the layer exists. +% \item[\Parameter{else code}:] will be executed, if the layer doesn't exist. +% \end{description} +% Note, that we don't known really whether or not a layer exists, but have a +% heuristic. +% \begin{macrocode} +%<*package&body> +\newcommand*{\IfLayerExists}[1]{% + \scr@ifundefinedorrelax{scr@l@#1@x}{% + \expandafter\@secondoftwo + }{% + \expandafter\@firstoftwo + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}%^^A \IfLayerExists +% +% \begin{macro}{\DeclareNewLayer} +% \begin{macro}{\ProvideLayer} +% \begin{macro}{\RedeclareLayer} +% \begin{macro}{\ModifyLayer} +% There are also two commands for declaration of layers, that haven't been +% declared before, with or without error message for already declared layers, +% and two commands for changing already declared layers, first one beginning +% again from scratch, second one for only setting up attributes, that should +% be changed. +% \begin{macrocode} +%<*package&body> +\newcommand*{\DeclareNewLayer}[2][]{% + \IfLayerExists{#2}{% + \PackageError{scrlayer}{layer `#2' already defined}{% + You may declare only layer, that haven't been declared previously + using\MessageBreak + \string\DeclareNewLayer. See also the alternatives + \string\RedeclareLayer,\MessageBreak + \string\ModifyLayer\space and \string\ProvideLayer.\MessageBreak + If you'll continue, declaration will be ignored.}% + }{\DeclareLayer[{#1}]{#2}}% +} +\newcommand*{\ProvideLayer}[2][]{% + \IfLayerExists{#2}{% +%<*trace> + \PackageInfo{scrlayer}{\string\ProvideLayer{#2} ignored,\MessageBreak + because of already defined layer}% +%</trace> + }{\DeclareNewLayer[{#1}]{#2}}% +} +\newcommand*{\RedeclareLayer}[2][]{% + \IfLayerExists{#2}{}{% + \PackageError{scrlayer}{layer `#2' not yet defined}{% + You may declare only already declared layers using + \string\RedeclareLayer.\MessageBreak + See also the alternatives + \string\DeclareLayer and \string\ProvideLayer.\MessageBreak + Nevertheless, if you'll continue, declaration will be done.}% + }% + \DeclareLayer[{#1}]{#2}% +} +\newcommand*{\ModifyLayer}[2][]{% + \IfLayerExists{#2}{% + \FamilyExecuteOptions[.definelayer]{KOMAarg}{#1}% + }{% + \PackageError{scrlayer}{layer `#2' not yet defined}{% + You may modify only already declared layers using + \string\ModifyLayer.\MessageBreak + See also the alternatives + \string\DeclareLayer and \string\ProvideLayer.\MessageBreak + Nevertheless, if you'll continue, declaration will be done.}% + \DeclareLayer[{#1}]{#2}% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \ModifyLayer +% \end{macro}^^A \RedeclareLayer +% \end{macro}^^A \ProvideLayer +% \end{macro}^^A \DeclareNewLayer +% +% +% \begin{macro}{\DestroyLayer} +% \begin{description} +% \item[\Parameter{string}:] the name of the layer, that should be +% destroyed +% \end{description} +% Note: Nothing will be done to remove the layer from a page style, but this +% shouldn't matter, because layers with, e.g., +% \Macro{if@scr@l@\dots@nonfloatpage}=\Macro{relax} and +% \Macro{if@scr@l@\dots@floatpage}=\Macro{relax} won't be output ever. This +% command may and should be used by interfaces via +% \Macro{scrlayerOnAutoRemoveInterface} to remove the generated +% layers. Therefore it only destroys existing layers and doesn't care for not +% existing. +% \begin{macrocode} +%<*package&body> +\newcommand*{\DestroyLayer}[1]{% + \IfLayerExists{#1}{% + \expandafter\let\csname scr@l@#1@x\endcsname\relax + \expandafter\let\csname scr@l@#1@y\endcsname\relax + \expandafter\let\csname scr@l@#1@w\endcsname\relax + \expandafter\let\csname scr@l@#1@h\endcsname\relax + \expandafter\let\csname scr@l@#1@align\endcsname\relax + \expandafter\let\csname scr@l@#1@contents\endcsname\relax + \expandafter\let\csname if@scr@l@#1@background\endcsname\relax + \expandafter\let\csname @scr@l@#1@backgroundfalse\endcsname\relax + \expandafter\let\csname @scr@l@#1@backgroundtrue\endcsname\relax + \expandafter\let\csname if@scr@l@#1@foreground\endcsname\relax + \expandafter\let\csname @scr@l@#1@foregroundfalse\endcsname\relax + \expandafter\let\csname @scr@l@#1@foregroundtrue\endcsname\relax + \expandafter\let\csname if@scr@l@#1@odd\endcsname\relax + \expandafter\let\csname @scr@l@#1@oddfalse\endcsname\relax + \expandafter\let\csname @scr@l@#1@oddtrue\endcsname\relax + \expandafter\let\csname if@scr@l@#1@even\endcsname\relax + \expandafter\let\csname @scr@l@#1@evenfalse\endcsname\relax + \expandafter\let\csname @scr@l@#1@eventrue\endcsname\relax + \expandafter\let\csname if@scr@l@#1@oneside\endcsname\relax + \expandafter\let\csname @scr@l@#1@onesidefalse\endcsname\relax + \expandafter\let\csname @scr@l@#1@onesidetrue\endcsname\relax + \expandafter\let\csname if@scr@l@#1@twoside\endcsname\relax + \expandafter\let\csname @scr@l@#1@twosidefalse\endcsname\relax + \expandafter\let\csname @scr@l@#1@twosidetrue\endcsname\relax + \expandafter\let\csname if@scr@l@#1@floatpage\endcsname\relax + \expandafter\let\csname @scr@l@#1@floatpagefalse\endcsname\relax + \expandafter\let\csname @scr@l@#1@floatpagetrue\endcsname\relax + \expandafter\let\csname if@scr@l@#1@nonfloatpage\endcsname\relax + \expandafter\let\csname @scr@l@#1@nonfloatpagefalse\endcsname\relax + \expandafter\let\csname @scr@l@#1@nonfloatpagetrue\endcsname\relax + }{% +%<*trace> + \PackageInfo{scrlayer}{\string\DestroyLayer{#1} ignored,\MessageBreak + because that layer doesn't exist\MessageBreak + (any longer)% + }% +%</trace> + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \DestroyLayer +% +% +% \begin{macro}{\layercontentsmeasure} +% This may used by used as the only value of the layer option +% \texttt{contents} to show measure lines around the layer. The left and the +% top measure line will be in centimeter, the right and the bottom measure +% line in inch. With option \texttt{draft=true} this also be used +% automatically and additionally for every layer of a page style. +% \begin{macrocode} +%<*package&body> +\newcommand*{\layercontentsmeasure}{% + \smash{\begin{picture}(0,0) + (0,\if t\scr@l@valign -\ht\strutbox + \else + \if b\scr@l@valign -\dimexpr\layerheight-\dp\strutbox\relax + \else -.5\dimexpr \layerheight+\ht\strutbox-\dp\strutbox\relax + \fi + \fi\@gobble) +% \end{macrocode} +% 1st horizontal cm +% \begin{macrocode} + \put(0,0){\line(1,0){\layerwidth\@gobble}}% + \@tempcnta=\numexpr \dimexpr\layerwidth + .5mm\relax/\dimexpr 1mm\relax\relax + \multiput(0,0)(1mm\@gobble,0){\@tempcnta}{% + \line(0,-1){1mm\@gobble}% + }% + \@tempcnta=\numexpr \dimexpr\layerwidth + 2.5mm\relax/\dimexpr 5mm\relax\relax + \multiput(0,0)(5mm\@gobble,0){\@tempcnta}{% + \line(0,-1){2mm\@gobble}% + }% + \@tempcnta=\numexpr \dimexpr\layerwidth + .5cm\relax/\dimexpr 1cm\relax\relax + \multiput(0,0)(10mm\@gobble,0){\@tempcnta}{% + \put(0,0){\line(0,-1){3mm\@gobble}}% + \put(0,-3.5mm\@gobble){% + \makebox(0,0)[ct]{\the\numexpr\@tempcnta-\@multicnt\relax}}% + }% +% \end{macrocode} +% 2nd horizontal in: +% \begin{macrocode} + \put(0,-\layerheight\@gobble){\line(1,0){\layerwidth\@gobble}}% + \@tempcnta=\numexpr \dimexpr\layerwidth + .05in\relax/\dimexpr .1in\relax\relax + \multiput(0,-\layerheight\@gobble)(.1in\@gobble,0){\@tempcnta}{% + \line(0,1){1mm\@gobble}% + }% + \@tempcnta=\numexpr \dimexpr\layerwidth + .25in\relax/\dimexpr .5in\relax\relax + \multiput(0,-\layerheight\@gobble)(.5in\@gobble,0){\@tempcnta}{% + \line(0,1){2mm\@gobble}% + }% + \@tempcnta=\numexpr \dimexpr\layerwidth + .5in\relax/\dimexpr 1in\relax\relax + \multiput(0,-\layerheight\@gobble)(1in\@gobble,0){\@tempcnta}{% + \put(0,0){\line(0,1){3mm\@gobble}}% + \put(0,3.5mm\@gobble){% + \makebox(0,0)[cb]{\the\numexpr\@tempcnta-\@multicnt\relax}}% + }% +% \end{macrocode} +% 3rd vertical cm: +% \begin{macrocode} + \put(0,0){\line(0,-1){\layerheight\@gobble}}% + \@tempcnta\numexpr \dimexpr\layerheight + .5mm\relax/\dimexpr 1mm\relax\relax + \multiput(0,0)(0,-1mm\@gobble){\@tempcnta}{% + \line(1,0){1mm\@gobble}% + }% + \@tempcnta\numexpr \dimexpr\layerheight + 2.5mm\relax/\dimexpr 5mm\relax\relax + \multiput(0,0)(0,-5mm\@gobble){\@tempcnta}{% + \line(1,0){2mm\@gobble}% + }% + \@tempcnta\numexpr \dimexpr\layerheight + .5cm\relax/\dimexpr 1cm\relax\relax + \multiput(0,0)(0,-1cm\@gobble){\@tempcnta}{% + \put(0,0){\line(1,0){3mm\@gobble}}% + \put(3.5mm\@gobble,0){% + \makebox(0,0)[cl]{\the\numexpr\@tempcnta-\@multicnt\relax}}% + }% +% \end{macrocode} +% 4th vertical in: +% \begin{macrocode} + \put(\layerwidth\@gobble,0){\line(0,-1){\layerheight\@gobble}}% + \@tempcnta\numexpr \dimexpr\layerheight + .05in\relax/\dimexpr .1in\relax\relax + \multiput(\layerwidth\@gobble,0)(0,-.1in\@gobble){\@tempcnta}{% + \line(-1,0){1mm\@gobble}% + }% + \@tempcnta\numexpr \dimexpr\layerheight + .25in\relax/\dimexpr .5in\relax\relax + \multiput(\layerwidth\@gobble,0)(0,-.5in\@gobble){\@tempcnta}{% + \line(-1,0){2mm\@gobble}% + }% + \@tempcnta\numexpr \dimexpr\layerheight + .5in\relax/\dimexpr 1in\relax\relax + \multiput(\layerwidth\@gobble,0)(0,-1in\@gobble){\@tempcnta}{% + \put(0,0){\line(-1,0){3mm\@gobble}}% + \put(-3.5mm\@gobble,0){% + \makebox(0,0)[cr]{\the\numexpr\@tempcnta-\@multicnt\relax}}% + }% + \end{picture}}% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \layercontentsmeasure +% +% +% \subsection{Providing Page Styles} +% +% Page styles in \LaTeX{} consist of the elements: +% \begin{itemize} +% \item a header for odd pages, +% \item a header for even pages, +% \item a footer for odd pages, +% \item a footer for even pages, +% \end{itemize} +% and some optional additional commands, that will be expanded, whenever the +% page style will be activated. Note, that header and footer for even pages +% will be used only at two-sided mode. At one-sided mode the header and footer +% for odd pages will be used for all pages. +% +% With package \Package{scrlayer} layers will be linked to package styles and +% expanded at the four elements above. Background layers will expand only +% at the headers. Foreground layers will expand only at the +% footers. Layers, that haven't been restricted to background or foreground, +% will expand at both, page headers and page footers. +% +% Similar to the expansion of background and foreground layers, odd page +% layers will only expand in the headers or footers of odd pages and even page +% layers will only expand in the headers or footers of even pages. Layers, +% that haven't been restricted to odd or even pages, will expand in the +% headers or footers of odd pages and also in the headers or footers of even +% pages. +% +% One step more: Single-side layers will only expand in the headers or footers +% of pages in single-side layouts and two-side layers only in the headers or +% footers of pages in two-side layout. +% +% One more step: float page layers will only expand in the headers or footers +% of pages, that consists of page floats only, while non-float page layers +% will only expand in the headers of footers of pages, that doesn't have page +% floats. +% +% \begin{length}{\footheight} +% For the header \LaTeX{} already defines a length \Length{headheight} to be +% the maximum height of the header. But for footer it only defines the +% distance of the baseline of the footer from the last baseline of the text +% area. \Package{scrlayer} changes this and also defines a new length +% \Length{footheight}. This length will be initialised with magic value +% -12345\,sp. But if it is still that magic value at +% \Macro{begin}\PParameter{document} it will be reset to the value of +% \Length{baselineskip}. +% \begin{macrocode} +%<*package&init> +\@ifundefined{footheight}{% + \newlength{\footheight}% + \setlength{\footheight}{-12345sp}% +}{% +%<*trace> + \PackageInfo{scrlayer}{Using already defined \string\footheight\MessageBreak + hoping, that this is a length and\MessageBreak + not only a macro}% +%</trace> +} +\AtBeginDocument{% + \ifdim\footheight=-12345sp +%<*trace> + \PackageInfo{scrlayer}{Setting magic \string\footheight\space to + \string\baselineskip\space while\MessageBreak + \string\begin{document}}% +%</trace> + \setlength{\footheight}{\baselineskip} + \fi +} +%</package&init> +% \end{macrocode} +% \end{length}^^A \footheight +% +% +% Several of the following commands use \meta{key}=\meta{value} arguments. So +% we define a family with a new member: +% \begin{macrocode} +%<*package&body> +\DefineFamily{KOMAarg} +\DefineFamilyMember[.definelayerpagestyle]{KOMAarg} +%</package&body> +% \end{macrocode} +% +% \begin{macro}{\DeclarePageStyleByLayers} +% \begin{description} +% \item[\OParameter{option list}:] comma separated list of named page +% style options (see below). +% \item[\Parameter{string}:] the name of the page style to be declared (must +% be expandable and result in a string). +% \item[\Parameter{string list}:] comma separated list of layer names (must +% be expandable and result in strings); first in the list will be added +% first. +% \end{description} +% Page styles may be declared using this command. It has one optional and +% two mandatory arguments. The first mandatory one is the name of the page +% style and the second one is a list of layers to be used for this page +% style. The page style itself will expand all background layers for odd +% pages in \cs{@oddhead}, all background layers for even pages on +% \cs{@evenhead}, all foreground layers for odd pages in \cs{@oddfoot}, and +% all foreground layers for even pages in \cs{@evenfoot}. This may be +% restricted by additional attributes, e.g., \Option{oneside} and +% \Option{twoside}. +% +% The optional argument may be used to define hooks. There are six named +% optional arguments to set up six hooks. And there are also \KOMAScript{} +% options for these, to define global pre-definitions. Note, that you may +% remove the global pre-definitions by emptying the local hooks. The local +% argument are named similar, but without ``\texttt{ps}'' after +% ``\texttt{on}''. +% \begin{option}{onpsselect} +% \begin{macro}{\@ps@initialhook} +% \begin{description} +% \item[\texttt{=\meta{code}}:] executes \meta{code} whenever the +% page style will be selected, e.g. using \Macro{pagestyle} or +% \Macro{thispagestyle} or the low level command defining the page +% style itself. +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsselect}{% + \l@addto@macro{\@ps@initialhook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsselect} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsselect@default} +%</interface> +%<package>\newcommand*{\@ps@initialhook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onselect}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @initialhook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@initialhook +% \end{option}^^A onpsselect +% \begin{option}{onpsinit} +% \begin{macro}{\@ps@hook} +% \begin{description} +% \item[\texttt{=\meta{code}}:] executes \meta{code} whenever the +% output of a layer stack is initialised. Note, that \meta{code} must not +% result in any page output. Otherwise the output of the layer stack will be +% broken! +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsinit}{% + \l@addto@macro{\@ps@hook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsinit} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsinit@default} +%</interface> +%<package>\newcommand*{\@ps@hook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{oninit}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @hook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@hook +% \end{option}^^A onpsinit +% \begin{option}{onpsoneside} +% \begin{macro}{\@ps@onesidehook} +% \begin{description} +% \item[\Option{=\meta{code}}:] executes \meta{code} after +% \Option{oninit}'s \meta{code} whenever the output of a layer stack of a +% page in single-side layout is initialised. Note, that \meta{code} must not +% result in any page output. Otherwise the output of the layer stack will be +% broken! +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsoneside}{% + \l@addto@macro{\@ps@onesidehook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsoneside} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsoneside@default} +%</interface> +%<package>\newcommand*{\@ps@onesidehook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{ononeside}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @onesidehook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@onesidehook +% \end{option}^^A onpsoneside +% \begin{option}{onpstwoside} +% \begin{macro}{\@ps@twosidehook} +% \begin{description} +% \item[\Option{=\meta{code}}:] executes \meta{code} after +% \Option{oninit}'s \meta{code} whenever the output of a layer stack of a +% page in two-side layout is initialised. Note, that \meta{code} must not +% result in any page output. Otherwise the output of the layer stack will be +% broken! +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpstwoside}{% + \l@addto@macro{\@ps@twosidehook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpstwoside} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpstwoside@default} +%</interface> +%<package>\newcommand*{\@ps@twosidehook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{ontwoside}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @twosidehook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@twosidehook +% \end{option}^^A onpstwoside +% \begin{option}{onpsoddpage} +% \begin{macro}{\@ps@oddpagehook} +% \begin{description} +% \item[\texttt{=\meta{code}}:] executes \meta{code} after +% \Option{ononeside}'s or \Option{ontwoside}'s \meta{code} whenever the +% output of a layer stack of an odd page is initialised. Note, that +% \meta{code} must not result in any page output. Otherwise the output of +% the layer stack will be broken! +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsoddpage}{% + \l@addto@macro{\@ps@oddpagehook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsoddpage} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsoddpage@default} +%</interface> +%<package>\newcommand*{\@ps@oddpagehook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onoddpage}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @oddpagehook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@oddpagehook +% \end{option}^^A onpsoddpage +% \begin{option}{onpsevenpage} +% \begin{macro}{\@ps@evenpagehook} +% \begin{description} +% \item[\texttt{=\meta{code}}:] executes \meta{code} after +% \Option{ononeside}'s or \Option{ontwoside}'s \meta{code} whenever the +% output of a layer stack of an even page is initialised. Note, that +% \meta{code} must not result in any page output. Otherwise the output of +% the layer stack will be broken! +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsevenpage}{% + \l@addto@macro{\@ps@evenpagehook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsevenpage} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsevenpage@default} +%</interface> +%<package>\newcommand*{\@ps@evenpagehook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onevenpage}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @evenpagehook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@evenpagehook +% \end{option}^^A onpsevenpage +% \begin{option}{onpsfloatpage} +% \begin{macro}{\@ps@floatpagehook} +% \begin{description} +% \item[\Option{=\meta{code}}:] executes \meta{code} after +% \Option{onoddpage}'s or \Option{onevenpage}'s \meta{code} whenever a float +% column has been made (usually those pages are float pages). +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsfloatpage}{% + \l@addto@macro{\@ps@floatpagehook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsfloatpage} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsfloatpage@default} +%</interface> +%<package>\newcommand*{\@ps@floatpagehook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onfloatpage}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @floatpagehook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@floatpagehook +% \end{option}^^A onpsfloatpage +% \begin{option}{onpsnonfloatpage} +% \begin{macro}{\@ps@nonfloatpagehook} +% \begin{description} +% \item[\Option{=\meta{code}}:] executes \meta{code} after +% \Option{onoddpage}'s or \Option{onevenpage}'s \meta{code} whenever no +% float column has been made (usually those pages aren't float pages). +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsnonfloatpage}{% + \l@addto@macro{\@ps@nonfloatpagehook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsnonfloatpage} +\scrlayer@AddCsToInterface{% + KV@KOMA.\@currname.\@currext @onpsnonfloatpage@default} +%</interface> +%<package>\newcommand*{\@ps@nonfloatpagehook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onnonfloatpage}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @nonfloatpagehook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@nonfloatpagehook +% \end{option}^^A onpsnonfloatpage +% \begin{option}{onpsbackground} +% \begin{macro}{\@ps@backgroundhook} +% \begin{description} +% \item[\texttt{=\meta{code}}:] executes \meta{code} after +% \Option{onfloatpage}'s or \Option{onnonfloatpage}'s \meta{code} whenever +% the output of a background layer stack is initialised. Note, that +% \meta{code} must not result in any page output. Otherwise the output of +% the layer stack will be broken! +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsbackground}{% + \l@addto@macro{\@ps@backgroundhook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsbackground} +\scrlayer@AddCsToInterface{% + KV@KOMA.\@currname.\@currext @onpsbackground@default} +%</interface> +%<package>\newcommand*{\@ps@backgroundhook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onbackground}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @backgroundhook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@ps@backgroundhook +% \end{option}^^A onbackground +% \begin{option}{onpsforeground} +% \begin{macro}{\@ps@foregroundhook} +% \begin{description} +% \item[\texttt{=\meta{code}}:] executes \meta{code} after +% \Option{onfloatpage}'s or \Option{onnonfloatpage}'s \meta{code} whenever +% the output of a foreground layer stack is initialised. Note, that +% \meta{code} must not result in any page output. Otherwise the output of +% the layer stack will be broken! +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@key{onpsforeground}{% + \l@addto@macro{\@ps@foregroundhook}{#1}% + \FamilyKeyStateProcessed +} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @onpsforeground} +\scrlayer@AddCsToInterface{% + KV@KOMA.\@currname.\@currext @onpsforeground@default} +%</interface> +%<package>\newcommand*{\@ps@foregroundhook}{} +%</options> +%<*package&body> +\DefineFamilyKey[.definelayerpagestyle]{KOMAarg}{onforeground}{% + \expandafter\l@addto@macro + \csname @ps@\scrlayer@current@pagestyle @foregroundhook\endcsname + {#1}% + \FamilyKeyStateProcessed +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \@psforegroundhook +% \end{option}^^A onpsforeground +% \begin{macrocode} +%<*package&body> +\newcommand*{\DeclarePageStyleByLayers}[3][]{% + \edef\scrlayer@current@pagestyle{\GetRealPageStyle{#2}}% + \expandafter\scrlayer@declare@ps@by@layers\expandafter{% + \scrlayer@current@pagestyle + }{#1}{#3}% +} +% \end{macrocode} +% \begin{macro}{\scrlayer@declare@ps@by@layers} +% Needed, because of page style aliases. Same arguments like +% \cs{DeclarePageStyleByLayers} but, \#1 is the name of the page style, \#2 is +% the list of options and \#3 is still the list of layers. +% \begin{macrocode} +\newcommand*{\scrlayer@declare@ps@by@layers}[3]{% + \@namedef{@ps@#1@initialhook}{\@ps@initialhook}% + \@namedef{@ps@#1@hook}{\@ps@hook}% + \@namedef{@ps@#1@backgroundhook}{\@ps@backgroundhook}% + \@namedef{@ps@#1@foregroundhook}{\@ps@foregroundhook}% + \@namedef{@ps@#1@oddpagehook}{\@ps@oddpagehook}% + \@namedef{@ps@#1@evenpagehook}{\@ps@evenpagehook}% + \@namedef{@ps@#1@onesidehook}{\@ps@onesidehook}% + \@namedef{@ps@#1@twosidehook}{\@ps@twosidehook}% + \@namedef{@ps@#1@floatpagehook}{\@ps@floatpagehook}% + \@namedef{@ps@#1@nonfloatpagehook}{\@ps@nonfloatpagehook}% + \FamilyExecuteOptions[.definelayerpagestyle]{KOMAarg}{#2}% + \@namedef{ps@#1}{% + \renewcommand*{\currentpagestyle}{#1}% + \@nameuse{@ps@@everystyle@@initialhook}% + \@nameuse{@ps@#1@initialhook}% + \renewcommand*{\currentpagestyle}{#1}% + \renewcommand*{\@oddhead}{% + \begingroup + \let\headmark\rightmark + \@nameuse{@ps@@everystyle@@hook}% + \@nameuse{@ps@#1@hook}% + \@nameuse{@ps@@everystyle@@\if@twoside two\else one\fi sidehook}% + \@nameuse{@ps@#1@\if@twoside two\else one\fi sidehook}% + \@nameuse{@ps@@everystyle@@oddpagehook}% + \@nameuse{@ps@#1@oddpagehook}% + \@nameuse{@ps@@everystyle@@\if@fcolmade\else non\fi floatpagehook}% + \@nameuse{@ps@#1@\if@fcolmade\else non\fi floatpagehook}% + \@nameuse{@ps@@everystyle@@backgroundhook}% + \@nameuse{@ps@#1@backgroundhook}% + \parbox[t][\headheight][t]{\linewidth}{% + \vskip \dimexpr -\topmargin-1in + -\headheight + -\ht\strutbox\relax + \hskip \dimexpr -\oddsidemargin-1in\relax + \strut\makebox[\z@][l]{% + \ForEachLayerOfPageStyle{@everystyle@}{% + \scrlayer@do@page@style@element@layer{background}{odd}% + {########1}% + }% + \ForEachLayerOfPageStyle{#1}{% + \scrlayer@do@page@style@element@layer{background}{odd}% + {########1}% + }% + }% + }% + \endgroup + }% + \renewcommand*{\@evenhead}{% + \begingroup + \let\headmark\leftmark + \@nameuse{@ps@@everystyle@@hook}% + \@nameuse{@ps@#1@hook}% + \@nameuse{@ps@@everystyle@@twosidehook}% + \@nameuse{@ps@#1@twosidehook}% + \@nameuse{@ps@@everystyle@@evenpagehook}% + \@nameuse{@ps@#1@evenpagehook}% + \@nameuse{@ps@@everystyle@@\if@fcolmade\else non\fi floatpagehook}% + \@nameuse{@ps@#1@\if@fcolmade\else non\fi floatpagehook}% + \@nameuse{@ps@@everystyle@@backgroundhook}% + \@nameuse{@ps@#1@backgroundhook}% + \parbox[t][\headheight][t]{\linewidth}{% + \vskip \dimexpr -\topmargin-1in + -\headheight + -\ht\strutbox\relax + \hskip \dimexpr-\evensidemargin-1in\relax + \strut\makebox[\z@][l]{% + \ForEachLayerOfPageStyle{@everystyle@}{% + \scrlayer@do@page@style@element@layer{background}{even}% + {########1}% + }% + \ForEachLayerOfPageStyle{#1}{% + \scrlayer@do@page@style@element@layer{background}{even}% + {########1}% + }% + }% + }% + \endgroup + }% + \renewcommand*{\@oddfoot}{% + \begingroup + \let\headmark\rightmark + \@nameuse{@ps@@everystyle@@hook}% + \@nameuse{@ps@#1@hook}% + \@nameuse{@ps@@everystyle@@\if@twoside two\else one\fi sidehook}% + \@nameuse{@ps@#1@\if@twoside two\else one\fi sidehook}% + \@nameuse{@ps@@everystyle@@oddpagehook}% + \@nameuse{@ps@#1@oddpagehook}% + \@nameuse{@ps@@everystyle@@\if@fcolmade\else non\fi floatpagehook}% + \@nameuse{@ps@#1@\if@fcolmade\else non\fi floatpagehook}% + \@nameuse{@ps@@everystyle@@foregroundhook}% + \@nameuse{@ps@#1@foregroundhook}% + \parbox[t][\headheight][t]{\linewidth}{% + \vskip \dimexpr -\topmargin-1in + -\headheight + -\headsep + -\textheight + -\footskip + -\ht\strutbox\relax + \hskip \dimexpr -\oddsidemargin-1in\relax + \strut\makebox[\z@][l]{% + \ForEachLayerOfPageStyle{@everystyle@}{% + \scrlayer@do@page@style@element@layer{foreground}{odd}% + {########1}% + }% + \ForEachLayerOfPageStyle{#1}{% + \scrlayer@do@page@style@element@layer{foreground}{odd}% + {########1}% + }% + }% + }% + \endgroup + }% + \renewcommand*{\@evenfoot}{% + \begingroup + \let\headmark\leftmark + \@nameuse{@ps@@everystyle@@hook}% + \@nameuse{@ps@#1@hook}% + \@nameuse{@ps@@everystyle@@twosidehook}% + \@nameuse{@ps@#1@twosidehook}% + \@nameuse{@ps@@everystyle@@evenpagehook}% + \@nameuse{@ps@#1@evenpagehook}% + \@nameuse{@ps@@everystyle@@\if@fcolmade\else non\fi floatpagehook}% + \@nameuse{@ps@#1@\if@fcolmade\else non\fi floatpagehook}% + \@nameuse{@ps@@everystyle@@foregroundhook}% + \@nameuse{@ps@#1@foregroundhook}% + \parbox[t][\headheight][t]{\linewidth}{% + \vskip \dimexpr -\topmargin-1in + -\headheight + -\headsep + -\textheight + -\footskip + -\ht\strutbox\relax + \hskip \dimexpr-\evensidemargin-1in\relax + \strut\makebox[\z@][l]{% + \ForEachLayerOfPageStyle{@everystyle@}{% + \scrlayer@do@page@style@element@layer{foreground}{even}% + {########1}% + }% + \ForEachLayerOfPageStyle{#1}{% + \scrlayer@do@page@style@element@layer{foreground}{even}% + {########1}% + }% + }% + }% + \endgroup + }% + }% + \@namedef{@ps@#1@layers}{}% + \@for \reserved@a:=#3\do {% + \ifstr\reserved@a\@empty{}{% + \expandafter\@cons\csname @ps@#1@layers\endcsname{{\reserved@a}}% + }% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \scrlayer@declare@ps@by@layers +% +% \begin{macro}{\ForEachLayerOfPageStyle} +% \begin{description} +% \item[\Parameter{string}:] a valid page style (must be fully expandable +% and expand to the name of a existing page style); note, that currently +% no exists test will be done. +% \item[\Parameter{code}:] any macro definition body with usage of at most +% one argument (\texttt{\#1}), that will be replaced by the layer's name +% \end{description} +% Do the given \meta{code} for each layer of the page style +% \meta{string}. Note, that the expansion of \meta{code} will be done inside +% a group. +% \begin{macrocode} +%<*package&body> +\newcommand*{\ForEachLayerOfPageStyle}[2]{% + \begingroup + \edef\reserved@a{\GetRealPageStyle{#1}}% + \def\@elt##1{\ifscrlayer@deactivate@layers\else #2\fi}% + \@nameuse{@ps@\reserved@a @layers}% + \endgroup +} +%</package&body> +% \end{macrocode} +% \begin{option}{deactivatepagestylelayers} +% \begin{macro}{\ifscrlayer@deactivate@layers} +% \begin{description} +% \item[\Parameter{simple switch}:] whether or not +% \Macro{ForEachLayerOfPageStyle} should ignore the layers. +% \end{description} +% This is a global \KOMAScript{} options. Several other definitions and at +% least the usage of the page style will ignore the layers if +% \Macro{ForEachLayerOfPageStyle} ignores them. So this is something like: +% hide the layers. It may also be useful inside the code for the hooks +% described above, because hooks may used to deactivate the layers with this +% option too. +% \begin{macrocode} +%<*options> +\KOMA@ifkey{deactivatepagestylelayers}{scrlayer@deactivate@layers} +%<*interface> +\scrlayer@AddCsToInterface{% + KV@KOMA.\@currname.\@currext @deactivatepagestylelayers} +\scrlayer@AddCsToInterface{% + KV@KOMA.\@currname.\@currext @deactivatepagestylelayers@default} +%</interface> +%</options> +% \end{macrocode} +% \end{macro}^^A \ifscrlayer@deactivate@layers +% \end{option}^^A deactivatepagestylelayers +% \end{macro}^^A \ForEachLayerOfPageStyle +% +% \begin{macro}{\scrlayer@do@page@style@element@layer} +% Helper macro to show one layer. First argument is either ``background'' or +% ``foreground'', second argument is either ``odd'' or ``even'', and third +% argument is the name of the layer. Note, that in draft mode for every layer +% will be shown also a \cs{layercontentsmeasure}. +% \begin{macrocode} +%<*package&body> +\newcommand*{\scrlayer@do@page@style@element@layer}[3]{% + \begingroup + \expandafter\ifx\csname if@scr@l@#3@\if@fcolmade\else non\fi floatpage% + \expandafter\endcsname\csname iftrue\endcsname + \expandafter\ifx\csname if@scr@l@#3@\if@twoside two\else one\fi side% + \expandafter\endcsname\csname iftrue\endcsname + \expandafter + \ifx\csname if@scr@l@#3@#1\expandafter\endcsname + \csname iftrue\endcsname + \expandafter + \ifx\csname if@scr@l@#3@#2\expandafter\endcsname + \csname iftrue\endcsname + \ifscrlayer@draft + \scr@layerbox(\csname scr@l@#3@x\endcsname,% + \csname scr@l@#3@y\endcsname)% + (\csname scr@l@#3@w\endcsname,% + \csname scr@l@#3@h\endcsname)% + [\csname scr@l@#3@align\endcsname]% + {\layercontentsmeasure}% + \fi + \scr@layerbox(\csname scr@l@#3@x\endcsname,% + \csname scr@l@#3@y\endcsname)% + (\csname scr@l@#3@w\endcsname,% + \csname scr@l@#3@h\endcsname)% + [\csname scr@l@#3@align\endcsname]% + {\csname scr@l@#3@contents\endcsname}% + \fi + \fi + \fi + \fi + \endgroup +} +% \end{macrocode} +% \begin{macro}{\scr@layerbox} +% \begin{macro}{\scr@@layerbox} +% The layer box is used to output a layer in \cs{@oddhead}, \cs{@evenhead}, +% \cs{@oddfoot}, or \cs{@evenfoot}. Is has two pairs of arguments: ($x,y$) +% and ($w,h$), where $x$ is the distance from left paper edge, $y$ is the +% distance from the topmost edge of paper, $w$ is the width of the box and $h$ +% is the height of the box. The fifth argument is an optional vertical and +% horizontal alignment of the box. It may be a combination of the alignment +% characters described above. The sixth and last argument is the contents of +% the layer, to be placed into the last argument of the innermost +% \cs{parbox}. +% \begin{macrocode} +\def\scr@layerbox(#1,#2)(#3,#4){% + \@ifnextchar [%] + {\scr@@layerbox(#1,#2)(#3,#4)}{\scr@@layerbox(#1,#2)(#3,#4)[]}% +} +\def\scr@@layerbox(#1,#2)(#3,#4)[#5]#6{% + \begingroup + \edef\layerxoffset{#1}% + \edef\layeryoffset{#2}% + \edef\layerwidth{#3}% + \edef\layerheight{#4}% + \def\scr@l@valign{t}% + \def\scr@l@halign{l}% + \edef\reserved@b{#5}% + \expandafter\@tfor\expandafter\reserved@a\expandafter:\expandafter=% + \reserved@b\do{% + \if t\reserved@a + \def\scr@l@valign{t}% + \else + \if c\reserved@a + \def\scr@l@valign{c}% + \def\scr@l@halign{c}% + \else + \if b\reserved@a + \def\scr@l@valign{b}% + \else + \if l\reserved@a + \def\scr@l@halign{l}% + \else + \if r\reserved@a + \def\scr@l@halign{r}% + \else + \PackageWarning{scrlayer}{% + Unknown alignment `\reserved@a' ignored}% + \fi + \fi + \fi + \fi + \fi + }% + \parbox[t][\z@][t]{\z@}{% + \vskip\layeryoffset + \if b\scr@l@valign\vskip-\layerheight\fi + \if c\scr@l@valign\vskip-.5\dimexpr\layerheight\relax\fi + \makebox[\z@][l]{% + \hskip\layerxoffset + \makebox[\z@][\scr@l@halign]{% + \parbox[\scr@l@valign][\layerheight][\scr@l@valign]{\layerwidth}{% + \vskip\z@\strut{% + \ifscrlayer@forceignoreuppercase + \expandafter\let\csname MakeUppercase \endcsname\@firstofone + \let\MakeUppercase\@firstofone + \let\uppercase\@firstofone + \fi + #6% + }\strut\vskip\z@ + }% + }% + }% + }% + \endgroup +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \scr@@layerbox +% \end{macro}^^A \scr@layerbox +% \begin{option}{draft} +% \begin{macro}{\ifscrlayer@draft} +% \begin{description} +% \item[\Parameter{simple switch}:] whether or not to use the draft mode, +% that, i.e., activates visualisation of the layers. +% \end{description} +% When option is set, every layer is shown twice: one time with it's own +% contents and one time with contents \Macro{layercontentsmeasure}. +% \begin{macrocode} +%<*options> +\KOMA@ifkey{draft}{scrlayer@draft} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @draft} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @draft@default} +%</interface> +%</options> +% \end{macrocode} +% \end{macro}^^A \ifscrlayer@draft +% \end{option}^^A draft +% \end{macro}^^A \scrlayer@do@page@style@element@layer +% \end{macro}^^A \DeclarePageStyleByLayers +% +% +% \begin{macro}{\DeclareNewPageStyleByLayers} +% Arguments like \Macro{DeclarePageStyleByLayers}; results in error if the page +% style has been defined (or declared) already. +% \begin{macro}{\ProvidePageStyleByLayers} +% Arguments like \Macro{DeclarePageStyleByLayers}; doesn't define anything it +% the page style has been defined (or declared) already. +% \begin{macro}{\RedeclarePageStyleByLayers} +% Arguments like \Macro{DeclarePageStyleByLayers}; results in error if the page +% style hasn't been defined (or declared) already. +% \begin{macrocode} +%<*package&body> +\newcommand*{\DeclareNewPageStyleByLayers}[2][]{% + \@ifundefined{ps@#2}{}{% + \PackageError{scrlayer}{% + Page style `#2' already defined% + }{% + You may use \string\DeclareNewPageStyleByLayers\space to declare a new + page style only\MessageBreak + if that page style hasn't been declared or defined before.\MessageBreak + You may use either \string\ProvidePageStyleByLayers\space to declare the + page style only\MessageBreak + if it hasn't been declared or defined before, or + \string\RedeclarePageStyleByLayers\MessageBreak + to overwrite the former + declaration or definition of the page style% + \@ifundefined{@ps@#2@layers}{}{,\MessageBreak + or \string\AddLayersToPageStyle\space to add further layers to the + already declared\MessageBreak + page style, or \string\RemoveLayersFromPageStyle\space to remove + layers from the\MessageBreak + already declared page style}.\MessageBreak + Nevertheless, if you'll continue, the page style will be + overwritten\MessageBreak + by the new declaration.% + }% + }% + \DeclarePageStyleByLayers[{#1}]{#2}% +} +\newcommand*{\ProvidePageStyleByLayers}[3][]{% + \@ifundefined{ps@#2}{% + \DeclarePageStyleByLayers[{#1}]{#2}{#3}% + }{% +%<*trace> + \PackageInfo{scrlayer}{% + \string\ProvidePageStyleByLayers{#2}{#3} ignored,\MessageBreak + because page style `#2'\MessageBreak + already exists% + }% +%</trace> + }% +} +\newcommand*{\RedeclarePageStyleByLayers}[2][]{% + \@ifundefined{ps@#2}{% + \PackageError{scrlayer}{% + Page style `#2' not yet defined% + }{% + You may use \string\RedeclarePageStyleByLayers\space to declare a page + style only\MessageBreak + if that page style has already been declared or defined.\MessageBreak + You may use either \string\DeclareNewPageStyleByLayers, + \string\DeclarePageStyleByLayers,\MessageBreak + or \string\ProvidePageStyleByLayers\space to declare that not yet + defined page style.\MessageBreak + Nevertheless, if you'll continue, the page style will be declared.% + }% + }{}% + \DeclarePageStyleByLayers[{#1}]{#2}% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \RedeclarePageStyleByLayers +% \end{macro}^^A \ProvidePageStyleByLayers +% \end{macro}^^A \DeclareNewPageStyleByLayers +% +% We also declare page style \Pagestyle{@everystyle@} by default. You should +% not use this page style as an real page style (even not as the empty +% one). The layers of this page style will be used by every other layer page +% style. An we re-declare \Pagestyle{empty} to be a layer page style. +% \begin{macrocode} +%<*package&final> +\DeclareNewPageStyleByLayers{@everystyle@}{} +\RedeclarePageStyleByLayers{empty}{} +%</package&final> +% \end{macrocode} +% +% \begin{macro}{\AddLayersToPageStyle} +% \begin{macro}{\AddLayersAtBeginOfPageStyle} +% \begin{macro}{\AddLayersAtEndOfPageStyle} +% \begin{macro}{\RemoveLayersFromPageStyle} +% \begin{description} +% \item[\Parameter{string}:] the name of the page style to be modified (must +% be expandable and result in a string). +% \item[\Parameter{string list}:] comma separated list of layer names (must +% be expandable and result in strings); first in the list will be added +% first. +% \end{description} +% Change the layer list of a given page style. The differences between the +% commands are: +% \begin{description} +% \item[\Macro{AddLayersToPageStyle}:] first in the \meta{string list} will +% be added first at the end. +% \item[\Macro{AddLayersAtBeginOfPageStyle}:] first in the \meta{string list} +% will be added first at the start. Note, that this will result in changing +% the order of the layers in \meta{string list}. +% \item[\Macro{AddLayerAtEndOfPageStyle}:] same like +% \Macro{AddLayerToPageStyle}. +% \item[\Macro{RemoveLayersFromPageStyle}:] remove the layers from the page +% style's layer list. +% \end{description} +% \begin{macrocode} +%<*package&body> +\newcommand*{\AddLayersToPageStyle}[2]{% + \edef\reserved@b{\GetRealPageStyle{#1}}% + \IfLayerPageStyleExists{\reserved@b}{% + \@for \reserved@a:=#2\do {% + \ifstr\reserved@a\@empty{}{% + \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname + {{\reserved@a}}% + }% + }% + }{% + \scrlayer@lpm@error{#1}{adding layers}% + }% +} +\newcommand*{\AddLayersAtEndOfPageStyle}{% + \AddLayersToPageStyle +} +\newcommand*{\AddLayersAtBeginOfPageStyle}[2]{% + \begingroup + \let\@cons\@snoc + \AddLayersToPageStyle{#1}{#2}% + \endgroup +} +% \end{macrocode} +% \begin{macro}{\@snoc} +% \cs{@snoc} is a helper macro similar to \cs{@cons} from \LaTeX{} kernel, but +% it appends at the front instead of the end. +% \begin{macrocode} +\newcommand*{\@snoc}[2]{% + \begingroup\let\@elt\relax\xdef#1{\@elt #2#1}\endgroup +} +% \end{macrocode} +% \end{macro}^^A \@snoc +% \begin{macrocode} +\newcommand*{\RemoveLayersFromPageStyle}[2]{% + \edef\reserved@b{\GetRealPageStyle{#1}}% + \IfLayerPageStyleExists{#1}{% + \@for \reserved@a:=#2\do {% + \ifstr\reserved@a\@empty{}{% + \expandafter\remove@layer@from@page@style\expandafter{\reserved@a}% + {\reserved@b}% + }% + }% + }{% + \scrlayer@lpm@error{#1}{removing layers}% + }% +} +% \end{macrocode} +% \begin{macro}{\remove@layer@from@page@style} +% Helper macro to remove exactly one layer (arg 1) from a page style (arg 2). +% \begin{macrocode} +\newcommand*{\remove@layer@from@page@style}[2]{% + \begingroup + \expandafter\let\expandafter\reserved@a\csname @ps@#2@layers\endcsname + \@namedef{@ps@#2@layers}{}% + \def\@elt##1{% + \ifstr{#1}{##1}{}{% + \expandafter\@cons\csname @ps@#2@layers\endcsname{{##1}}% + }% + }\reserved@a + \endgroup +} +% \end{macrocode} +% \end{macro}^^A \remoce@layer@from@page@style +% \begin{macro}{\scrlayer@lpm@error} +% \begin{description} +% \item[\Parameter{string}:] the name of the page style to be modified (must +% be expandable and result in a string). +% \item[\Parameter{string}:] the kind of modification, that isn't allowed +% (must be expandable and result in a string). +% \end{description} +% Show an error because of page style it either not a defined or not a layer +% page style. +% \begin{macrocode} +\newcommand*{\scrlayer@lpm@error}[2]{% + \PackageError{scrlayer}{`#1' is not a layer page style}{% + \scr@ifundefinedorrelax{ps@#1}{% + Page style `#1' is not defined, + }{% + Page style `#1' is not a layer page style, + }% + but #2\MessageBreak + may be used only for layer page styles declared using\MessageBreak + \string\DeclarePageStyleByLayers, + \string\DeclareNewPageStyleByLayers,\MessageBreak + of \string\ProvidePageStyleByLayers.\MessageBreak + If you'll continue, your operation will be ignored.% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \scrlayer@lpm@error +% \end{macro}^^A \RemoveLayersFromPageStyle +% \end{macro}^^A \AddLayersAtEndOfPageStyle +% \end{macro}^^A \AddLayersAtBeginOfPageStyle +% \end{macro}^^A \AddLayersToPageStyle +% +% \begin{macro}{\AddLayersToPageStyleBeforeLayer} +% \begin{macro}{\AddLayersToPageStyleAfterLayer} +% \begin{description} +% \item[\Parameter{string}:] the name of the page style to be modified (must +% be expandable and result in a string). +% \item[\Parameter{string list}:] comma separated list of layer names (must +% be expandable and result in strings); first in the list will be added +% first. +% \item[\Parameter{string}:] the name of the layer before +% (\Macro{AddLayersToPageStyleBeforeLayer}) or after +% (\Macro{AddLayersToPageStyleAfterLayer}) that the layers of the list +% should be added. +% \end{description} +% Note: If the layer from third argument is not part of the page style's layer +% list, the new layers won't be added anywhere. +% \begin{macrocode} +%<*package&body> +\newcommand*{\AddLayersToPageStyleAfterLayer}[3]{% + \edef\reserved@b{\GetRealPageStyle{#1}}% + \IfLayerPageStyleExists{\reserved@b}{% + \begingroup + \expandafter\let\expandafter\reserved@a + \csname @ps@\reserved@b @layers\endcsname + \@namedef{@ps@\reserved@b @layers}{}% + \def\@elt##1{% + \ifstr{##1}\@empty{}{% + \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname{{##1}}% + \ifstr{##1}{#3}{% + \@for \reserved@a:=#2\do {% + \ifstr\reserved@a\@empty{}{% + \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname + {{\reserved@a}}% + }% + }% + }{}% + }% + }% + \reserved@a + \endgroup + }{% + \scrlayer@lpm@error{#1}{adding layers}% + }% +} +\newcommand*{\AddLayersToPageStyleBeforeLayer}[3]{% + \edef\reserved@b{\GetRealPageStyle{#1}}% + \IfLayerPageStyleExists{\reserved@b}{% + \begingroup + \expandafter\let\expandafter\reserved@a + \csname @ps@\reserved@b @layers\endcsname + \@namedef{@ps@\reserved@b @layers}{}% + \def\@elt##1{% + \ifstr{##1}\@empty{}{% + \ifstr{##1}{#3}{% + \@for \reserved@a:=#2\do {% + \ifstr\reserved@a\@empty{}{% + \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname + {{\reserved@a}}% + }% + }% + }{}% + \expandafter\@cons\csname @ps@#1@layers\endcsname{{##1}}% + }% + }% + \reserved@a + \endgroup + }{% + \scrlayer@lpm@error{#1}{adding layers}% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \AddLayersToPageStyleAfterLayer +% \end{macro}^^A \AddLayersToPageStyleBeforeLayer +% +% +% \begin{macro}{\UnifyLayersAtPageStyle} +% \begin{description} +% \item[\Parameter{string}:] the name of the page style to be unified (must +% be expandable and result in a string). +% \end{description} +% Remove doublets of layers from a page style. +% \begin{macrocode} +%<*package&body> +\newcommand*{\UnifyLayersAtPageStyle}[1]{% + \edef\reserved@b{\GetRealPageStyle{#1}}% + \IfLayerPageStyleExists{\reserved@b}{% + \expandafter\let\expandafter\reserved@a + \csname @ps@\reserved@b @layers\endcsname + \@namedef{@ps@\reserved@b @layers}{}% + \begingroup + \def\@elt##1{% + \ifstr{##1}\@empty{}{% + \remove@layer@from@page@style{##1}{\reserved@b}% + \expandafter\@cons\csname @ps@\reserved@b @layers\endcsname{{##1}}% + }% + }% + \reserved@a + \endgroup + }{% + \scrlayer@lpm@error{#1}{unifying}% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \UnifyLayersAtPageStyle +% +% \begin{macro}{\ModifyLayerPageStyleOptions} +% \begin{macro}{\AddToLayerPageStyleOptions} +% \begin{description} +% \item[\Parameter{string}:] the name of the page style to be modified (must +% be expandable and result in a string). +% \item[\Parameter{option list}:] comma separated list of named page +% style options. You may use any of the options provided for +% \Macro{DeclarePageStyle}. +% \end{description} +% \Macro{ModifyLayerPageStyleOptions} replaces the options and only the +% options from the list by their new +% values. \Macro{AddToLayerPageStyleOptions} adds the new values to the +% already given. +% \begin{macrocode} +%<*package&body> +\newcommand*{\ModifyLayerPageStyleOptions}[2]{% + \edef\reserved@a{\GetRealPageStyle{#1}}% + \IfLayerPageStyleExists{#1}{% + \expandafter\scrlayer@modify@layer@ps@options\expandafter{% + \reserved@a + }{#2}% + }{% + \scrlayer@lpm@error{#1}{modifying}% + }% +} +% \end{macrocode} +% \begin{macro}{\scrlayer@modify@layer@ps@options} +% Helper needed because of alias page styles. Same parameters like +% \cs{ModifyLayerPageStyleOptions} +% \begin{macrocode} +\newcommand*{\scrlayer@modify@layer@ps@options}[2]{% + \begingroup + \def\scrlayer@current@pagestyle{#1}% + \@namedef{@ps@#1@initialhook}{}% + \@namedef{@ps@#1@hook}{}% + \@namedef{@ps@#1@backgroundhook}{}% + \@namedef{@ps@#1@foregroundhook}{}% + \@namedef{@ps@#1@oddpagehook}{}% + \@namedef{@ps@#1@evenpagehook}{}% + \@namedef{@ps@#1@onesidehook}{}% + \@namedef{@ps@#1@twosidehook}{}% + \@namedef{@ps@#1@floatpagehook}{}% + \@namedef{@ps@#1@nonfloatpagehook}{}% + \FamilyExecuteOptions[.definelayerpagestyle]{KOMAarg}{#2}% + \def\reserved@a{\endgroup}% + \def\@sls@##1{% + \expandafter\let\expandafter\reserved@b\csname @ps@#1@##1hook\endcsname + \ifx\reserved@b\@empty\else + \l@addto@macro\reserved@a{\@namedef{@ps@#1@##1hook}}% + \expandafter\l@addto@macro\expandafter\reserved@a\expandafter{% + \expandafter{% + \reserved@b + }% + }% + \fi + }% + \@sls@{initial}% + \@sls@{}% + \@sls@{background}% + \@sls@{foreground}% + \@sls@{oddpage}% + \@sls@{evenpage}% + \@sls@{oneside}% + \@sls@{twoside}% + \@sls@{floatpage}% + \@sls@{nonfloatpage}% + \reserved@a +} +% \end{macrocode} +% \end{macro}^^A \scrlayer@modify@layer@ps@options +% \begin{macrocode} +\newcommand*{\AddToLayerPageStyleOptions}[2]{% + \IfLayerPageStyleExists{#1}{% + \def\scrlayer@current@pagestyle{#1}% + \FamilyExecuteOptions[.definelayerpagestyle]{KOMAarg}{#2}% + }{% + \scrlayer@lpm@error{#1}{modifying}% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \AddToLayerPageStyleOptions +% \end{macro}^^A \ModifyLayerPageStyleOptions +% +% \begin{macro}{\DeclarePageStyleAlias} +% \begin{macro}{\DeclareNewPageStyleAlias} +% \begin{macro}{\ProvidePageStyleAlias} +% \begin{macro}{\RedeclarePageStyleAlias} +% \begin{description} +% \item[\Parameter{string}:] The name of the page style to be declared +% (must be expandable and result in a string). +% \item[\Parameter{string}:] The name of the existing page style +% (must be expandable and result in a string). +% \end{description} +% \begin{macrocode} +%<*package&body> +\newcommand*{\DeclarePageStyleAlias}[2]{% + \edef\reserved@a{\GetRealPageStyle{#2}}% + \scr@ifundefinedorrelax{ps@\reserved@a}{% + \PackageError{scrlayer}{unknown real page style `#2'}{% + You've tried to declare an alias for page style `#2',\MessageBreak + but the real page style of `#2' is undefined.\MessageBreak + You can define aliases, only if the real page style has been + defined.\MessageBreak + If you'll continue, the declaration will be ignored.% + }% + \DestroyRealLayerPageStyle{#1}% + \DestroyLayerAlias{#1}% + }{% + \@namedef{@ps@#1@alias}{#2}% + \@namedef{ps@#1}{\pagestyle{\@nameuse{@ps@#1@alias}}}% + }% +} +\newcommand*{\DeclareNewPageStyleAlias}[1]{% + \@ifundefined{ps@#1}{}{% + \PackageError{scrlayer}{% + Page style `#1' already defined% + }{% + You may use \string\DeclareNewPageStyleAlias\space to declare a new + page style only\MessageBreak + if that page style hasn't been declared or defined before.\MessageBreak + You may use either \string\ProvidePageStyleAlias\space to declare the + page style only\MessageBreak + if it hasn't been declared or defined before, or + \string\RedeclarePageStyleAlias\MessageBreak + to overwrite the former declaration or definition of the page + style\MessageBreak + Nevertheless, if you'll continue, the page style will be + overwritten\MessageBreak + by the new alias.% + }% + }% + \DeclarePageStyleAlias{#1}% +} +\newcommand*{\ProvidePageStyleAlias}[2]{% + \@ifundefined{ps@#1}{% + \DeclarePageStyleAlias{#1}{#2}% + }{% +%<*trace> + \PackageInfo{scrlayer}{% + \string\ProvidePageStyleAlias{#1}{#2} ignored,\MessageBreak + because page style `#1' already\MessageBreak + exists% + }% +%</trace> + }% +} +\newcommand*{\RedeclarePageStyleAlias}[1]{% + \@ifundefined{ps@#1}{% + \PackageError{scrlayer}{% + Page style `#1' not yet defined% + }{% + You may use \string\RedeclarePageStyleAlias\space to declare a page + style only\MessageBreak + if that page style has already been declared or defined.\MessageBreak + You may use either \string\DeclareNewPageStyleAlias, + \string\DeclarePageStyleAlias,\MessageBreak + or \string\ProvidePageStyleAlias\space to declare that not yet + defined page style.\MessageBreak + Nevertheless, if you'll continue, the page style will be declared.% + }% + }{}% + \DeclarePageStyleAlias{#1}% +} +% \end{macrocode} +% \end{macro}^^A \RedeclarePageStyleAlias +% \end{macro}^^A \ProvidePageStyleAlias +% \end{macro}^^A \DeclareNewPageStyleAlias +% \end{macro}^^A \DeclarePageStyleAlias +% +% \begin{macro}{\DestroyPageStyleAlias} +% \begin{description} +% \item[\Parameter{string}:] the name of a page style (must be +% expandable and result in a string). +% \end{description} +% \begin{macrocode} +\newcommand*{\DestroyPageStyleAlias}[1]{% + \scr@ifundefinedorrelax{@ps@#1@alias}{}{% + \expandafter\let\csname @ps@#1@alias\endcsname\relax + \expandafter\let\csname ps@#1\endcsname\relax + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\GetRealPageStyle} +% \begin{description} +% \item[\Parameter{string}:] the name of a page style (must be +% expandable and result in a string). +% \end{description} +% Get the real name of the page style. +% \begin{macrocode} +\newcommand*{\GetRealPageStyle}[1]{% + \scr@ifundefinedorrelax{@ps@#1@alias}{#1}{% + \expandafter\GetRealPageStyle\expandafter{% + \expandafter\csname @ps@#1@alias\expandafter\endcsname\expandafter}% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfLayerPageStyleExists} +% \begin{macro}{\IfRealLayerPageStyleExists} +% \begin{description} +% \item[\Parameter{string}:] the name of the page style to be tested (must +% be expandable and result in a string). +% \item[\Parameter{code}:] whatever code should be expanded, if the test +% result is true. +% \item[\Parameter{code}:] whatever code should be expanded, if the test +% result is false. +% \end{description} +% Test, whether or not the page style is a declared layer page style. +% \begin{macrocode} +%<*package&body> +\newcommand*{\IfLayerPageStyleExists}[1]{% + \scr@ifundefinedorrelax{ps@#1}{% + \expandafter\@secondoftwo + }{% + \scr@ifundefinedorrelax{@ps@#1@layers}{% + \scr@ifundefinedorrelax{@ps@#1@alias}{% + \expandafter\@secondoftwo + }{% + \expandafter\IfLayerPageStyleExists\expandafter{% + \expandafter\csname @ps@#1@alias\expandafter\endcsname\expandafter}% + }% + }{% + \expandafter\@firstoftwo + }% + }% +} +\newcommand*{\IfRealLayerPageStyleExists}[1]{% + \scr@ifundefinedorrelax{ps@#1}{% + \expandafter\@secondoftwo + }{% + \scr@ifundefinedorrelax{@ps@#1@layers}{% + \expandafter\@secondoftwo + }{% + \expandafter\@firstoftwo + }% + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \IfRealLayerPageStyleExists +% \end{macro}^^A \IfLayerPageStyleExists +% +% \begin{macro}{\IfLayerAtPageStyle} +% \begin{macro}{\IfSomeLayersAtPageStyle} +% \begin{macro}{\IfLayersAtPageStyle} +% \begin{description} +% \item[\Parameter{string}:] the name of the page style to be tested (must +% be expandable and result in a string). +% \item[\Parameter{string}:] the name(s) of the layer(s) to be tested (must be +% expandable and result in a string). +% \item[\Parameter{code}:] whatever code should be expanded, if the test +% result is true. +% \item[\Parameter{code}:] whatever code should be expanded, if the test +% result is false. +% \end{description} +% Tests: +% \begin{description} +% \item[\Macro{IfLayerAtPageStyle}:] Test, whether or not the page style has a +% layer. The second argument is the name of one layer only! +% \item[\Macro{IfSomeLayersAtPageStyle}:] Test, whether or not the page style +% has at least one layer of a list of layers. The second argument is a comma +% separated list of layer names. +% \item[\Macro{IfLayersAtPageStyle}:] Test, whether or not the page style has +% every layer of a list of layers. The second argument is a comma separated +% list of layer names. +% \end{description} +% Note, that testing an page style, that is not a layer page style will result +% in an error and neither the third nor the fourth argument will be expanded. +% Note, that layers with empty name are only part of a layer page style +% without any layers. +% +% Note also, that with active \Option{deactivatepagestylelayers} layers are +% logically not longer part of the page styles. +% \begin{macrocode} +%<*package&body> +\newcommand*{\IfLayerAtPageStyle}[2]{% + \IfLayerPageStyleExists{#1}{% + \begingroup + \edef\reserved@a{\GetRealPageStyle{#1}}% + \@tempswafalse + \ifstr{#2}{}{% + \expandafter\ifx\csname @ps@\reserved@a @layers\endcsname\@empty + \@tempswatrue + \fi + }{% + \expandafter\ForEachLayerOfPageStyle\expandafter{% + \reserved@a}{\ifstr{##1}{#2}{\aftergroup\@tempswatrue}{}}% + }% + \if@tempswa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi + \expandafter\endgroup + }{% + \scrlayer@lpm@error{#1}{testing for layers}% + \expandafter\@gobbletwo + }% +} +\newcommand*{\IfSomeLayersAtPageStyle}[2]{% + \IfLayerPageStyleExists{#1}{% + \begingroup + \@tempswafalse + \@for \reserved@a:=#2\do {% + \edef\reserved@a{\noexpand\IfLayerAtPageStyle{#1}{\reserved@a}}% + \reserved@a{\@tempswatrue}{}% + }% + \if@tempswa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi + \expandafter\endgroup + }{% + \scrlayer@lpm@error{#1}{testing for layers}% + \expandafter\@gobbletwo + }% +} +\newcommand*{\IfLayersAtPageStyle}[2]{% + \IfLayerPageStyleExists{#1}{% + \begingroup + \@tempswatrue + \ifstr{#2}{}{% + \edef\reserved@a{\GetRealPageStyle{#1}}% + \expandafter\ifx\csname @scr@\reserved@a @layers\endcsname\@empty \else + \@tempswafalse + \fi + }{% + \@for \reserved@a:=#2\do {% + \edef\reserved@a{\noexpand\IfLayerAtPageStyle{#1}{\reserved@a}}% + \reserved@a{}{\@tempswafalse}% + }% + }% + \if@tempswa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi + \expandafter\endgroup + }{% + \scrlayer@lpm@error{#1}{testing for layers}% + \expandafter\@gobbletwo + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \IfLayersAtPageStyle +% \end{macro}^^A \IfSomeLayersAtPageStyle +% \end{macro}^^A \IfLayerAtPageStyle +% +% +% \begin{macro}{\DestroyRealLayerPageStyle} +% \begin{description} +% \item[\Parameter{string}:] name of the layer page style to be destroyed. +% \end{description} +% Destroys the given layer page style but not the layers! If the page style is +% the current page style, the empty page style an empty page style will be +% activated. If the special page style is valid an the destroyed one, this +% will be removed. This command may be used, e.g., at +% \Macro{scrlayerOnAutoRemoveInterface} after destroying the layers. +% \begin{macrocode} +%<*package&body> +\newcommand*{\DestroyRealLayerPageStyle}[1]{% + \IfRealLayerPageStyleExists{#1}{% + \expandafter\let\csname @ps@#1@initialhook\endcsname\relax + \expandafter\let\csname @ps@#1@hook\endcsname\relax + \expandafter\let\csname @ps@#1@backgroundhook\endcsname\relax + \expandafter\let\csname @ps@#1@foregroundhook\endcsname\relax + \expandafter\let\csname @ps@#1@oddpagehook\endcsname\relax + \expandafter\let\csname @ps@#1@evenpagehook\endcsname\relax + \expandafter\let\csname @ps@#1@onesidehook\endcsname\relax + \expandafter\let\csname @ps@#1@twosidehook\endcsname\relax + \expandafter\let\csname @ps@#1@floatpagehook\endcsname\relax + \expandafter\let\csname @ps@#1@nonfloatpagehook\endcsname\relax + \expandafter\let\csname @ps@#1@layers\endcsname\relax + \expandafter\let\csname ps@#1\endcsname\relax + \ifstr{\currentpagestyle}{#1}{% + \def\currentpagestyle{scrlayer@empty}% + \let\@oddhead\@empty\let\@evenhead\@empty + \let\@oddfoot\@empty\let\@evenfoot\@empty + }{}% + \if@specialpage + \ifstr{\@specialstyle}{#1}{% + \global\let\@specialstyle\relax + \global\@specialpagefalse + }{}% + \fi + }{% +%<*trace> + \PackageInfo{scrlayer}{% + \string\DestroyRealLayerPageStyle{#1} ignored,\MessageBreak + because the layer page style isn't\MessageBreak + defined (any longer)% + }% +%</trace> + }% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \DestroyRealLayerPageStyle +% +% +% \subsection{Kernel Patches} +% +% This package as so many others need to patch the \LaTeX{} kernel. This will +% be done, because we need information about the current active package style. +% +% \begin{macro}{\pagestyle} +% \begin{macro}{\currentpagestyle} +% We save the current page style. Note, that this doesn't work for special +% page styles\footnote{Special page styles are set by +% \Macro{thispagestyle}.} that hasn't been defined using +% \Package{scrlayer}. As long as \Macro{currentpagestyle} is empty, the +% current page style is unknown. And we add two hooks into page style +% selection: one before an one after the selection. +% \begin{macrocode} +%<*package&body> +\newcommand*{\currentpagestyle}{} +\PackageInfo{scrlayer}{patching LaTeX kernel macro \string\pagestyle} +\def\reserved@a{\scrlayer@exec@before@pagestyle@hook{##1}} +\expandafter\expandafter\expandafter\renewcommand +\expandafter\expandafter\expandafter*% +\expandafter\expandafter\expandafter\pagestyle +\expandafter\expandafter\expandafter[% +\expandafter\expandafter\expandafter1% +\expandafter\expandafter\expandafter]% +\expandafter\expandafter\expandafter{% + \expandafter\reserved@a + \pagestyle{#1}% + \edef\currentpagestyle{\GetRealPageStyle{#1}}% + \scrlayer@exec@after@pagestyle@hook{#1}% +} +\AtBeginDocument{% + \begingroup + \let\scrlayer@exec@before@pagestyle@hook\@gobble + \let\scrlayer@exec@after@pagestyle@hook\@gobble + \def\ps@test{}% + \pagestyle{test}% + \ifstr{\currentpagestyle}{test}{}{% + \PackageError{scrlayer}{package incompatibility detected}{% + Another package redefines \string\pagestyle\space incompatible with + scrlayer.\MessageBreak + This disables setting of \string\currentpagestyle\space and may + be serious.\MessageBreak + Maybe you could prevent this loading package scrlayer + later.\MessageBreak + If not you should either not use scrlayer or not the other + package,\MessageBreak + that redefines \string\pagestyle.% + }% + }% + \endgroup +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \currentpagestyle +% +% \begin{macro}{\BeforeSelectAnyPageStyle} +% \begin{macro}{\scrlayer@exec@before@pagestyle@hook} +% \begin{macro}{\AfterSelectAnyPageStyle} +% \begin{macro}{\scrlayer@exec@after@pagestyle@hook} +% We have two macros to locally add code to be executed whenever a page style +% changes using \Macro{pagestyle}. The first one executes the code before the +% page style will be changed, the second one after the page style has been +% changed. Note, that you may use \#1 as a placeholder of the argument of +% \Macro{pagestyle}. +% \begin{macrocode} +%<*package&body> +\newcommand*{\BeforeSelectAnyPageStyle}[1]{% + \expandafter\renewcommand\expandafter*% + \expandafter\scrlayer@exec@before@pagestyle@hook + \expandafter[\expandafter1\expandafter]\expandafter{% + \scrlayer@exec@before@pagestyle@hook{##1}#1}% +} +\newcommand*{\scrlayer@exec@before@pagestyle@hook}[1]{} +\newcommand*{\AfterSelectAnyPageStyle}[1]{% + \expandafter\renewcommand\expandafter*% + \expandafter\scrlayer@exec@after@pagestyle@hook + \expandafter[\expandafter1\expandafter]\expandafter{% + \scrlayer@exec@after@pagestyle@hook{##1}#1}% +} +\newcommand*{\scrlayer@exec@after@pagestyle@hook}[1]{} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \scrlayer@exec@after@pagestyle@hook +% \end{macro}^^A \AfterSelectAnyPageStyle +% \end{macro}^^A \scrlayer@exec@before@pagestyle@hook +% \end{macro}^^A \BeforeSelectAnyPageStyle +% \end{macro}^^A \pagestyle +% +% +% \subsection{Declaration of End User Interfaces} +% +% The package also supports an interface for loading end user interfaces. +% Maybe it would be a good idea to move this to \Package{scrbase}, but +% currently it is not needed. +% +% \begin{macro}{\scrlayerAddToInterface} +% \begin{macro}{\scrlayerAddCsToInterface} +% \begin{description} +% \item[\texttt{\{\meta{command}\textbar\meta{command sequence}\}}:] the +% command (with backslash) or the command sequence of the command (without +% backslash) of the command, that should be added to the interface. +% \item[\Parameter{code}:] will be executed, only if the command could be +% added to the interface. +% \end{description} +% Add either a command sequence or a command to the user interface. +% \begin{macrocode} +%<*package&body> +\newcommand*{\scrlayerAddToInterface}[2][\@currname.\@currext]{% + \begingroup + \edef\reserve@a{% + \noexpand\scrlayerAddCsToInterface[#1]{\expandafter\@gobble\string #2}% + }% + \expandafter\endgroup\reserve@a +} +\newcommand{\scrlayerAddCsToInterface}[3][\@currname.\@currext]{% + \@ifundefined{scrlayer@#1@commandlist}{% + \PackageError{scrlayer}{unkown interface `#1'}{% + I've been told to add a command sequence to an interface, that hasn't + been\MessageBreak + defined yet. Please initialise every interface using + \string\InitInterface\space before\MessageBreak + trying to add command sequences to it.\MessageBreak + If you'll continue, the command will be ignored.% + }% + }{% + \@ifundefined{#2}{% + \scrlayer@AddCsToInterface[#1]{#2}#3% + }{% + \@ifundefined{scrlayer@command@#2}{% + \ifscrlayer@forceoverwrite + \PackageWarning{scrlayer}{% + Overloading `\@backslashchar#2'!\MessageBreak + scrlayer detected, that the given command\MessageBreak + has been defined already, when\MessageBreak + `#1' tried to define it again.\MessageBreak + Nevertheless, while scrlayer is in force overwrite\MessageBreak + mode currently, the original definition will be\MessageBreak + removed% + }% + \expandafter\let\csname #2\endcsname\relax + \scrlayer@AddCsToInterface[#1]{#2}#3% + \else + \PackageError{scrlayer}{cannot define `\@backslashchar#2'}{% + scrlayer interface `#1' has tried to + define command\MessageBreak + `\@backslashchar#2', but this has already been defined\MessageBreak + and is not part of another interface. So it cannot be + defined.\MessageBreak + Before continuing you should solve this conflict.\MessageBreak + Nevertheless, you may use option `forceoverwrite' to get only a + warning instead\MessageBreak + of an error. But this wouldn't solve the problem at + all!\MessageBreak + This error is almost fatal, so you should abort the LaTeX + run.% + }% + \fi + }{% + \ifscrlayer@autoremoveinterfaces + \PackageInfo{scrlayer}{% + already define interface command\MessageBreak + `\@backslashchar#2' detected.\MessageBreak + Command has been defined by interface\MessageBreak + `\@nameuse{scrlayer@command@#2}'.\MessageBreak + To continue installation of interface\MessageBreak + `#1', interface\MessageBreak + `\@nameuse{scrlayer@command@#2}' will\MessageBreak + be removed% + }% + \@nameuse{scrlayer@\@nameuse{scrlayer@command@#2}@onremove}% + \begingroup + \def\@elt##1{% + \aftergroup\let\aftergroup##1\aftergroup\relax + }% + \@nameuse{scrlayer@\@nameuse{scrlayer@command@#2}@commandlist}% + \endgroup + \expandafter\let\csname + scrlayer@\@nameuse{scrlayer@command@#2}@commandlist\endcsname\relax + \expandafter\let\csname + scrlayer@\@nameuse{scrlayer@command@#2}@onremove\endcsname\relax + \expandafter\let\csname #2\endcsname\relax + \scrlayer@AddCsToInterface[#1]{#2}#3% + \else + \PackageError{scrlayer}{cannot define `\@backslashchar#2'}{% + Interface command `\@backslashchar#2' has already + been\MessageBreak + defined by interface + `\@nameuse{scrlayer@command@#2}'.\MessageBreak + So it cannot be defined again.\MessageBreak + You may try scrlayer option `autoremoveinterfaces' to + automatically remove\MessageBreak + older interfaces in such conflict situations.\MessageBreak + For now, it's recommended so solve the problem before you'll + continue.% + }% + \fi + }% + }% + }% +}% +% \end{macrocode} +% \begin{macro}{\scrlayer@AddCsToInterface} +% Little helper, to avoid repeating this \Macro{expandafter} orgy. +% \begin{description} +% \item[\OParameter{string}:] the interface name (must be expandable and +% expand to a string) +% \item[\Parameter{command sequence}] the command sequence of the command to +% be added. +% \end{description} +% \begin{macrocode} +\newcommand*\scrlayer@AddCsToInterface[2][\@currname.\@currext]{% + \expandafter\expandafter\expandafter\def\expandafter + \csname scrlayer@#1@commandlist\expandafter\expandafter\expandafter\endcsname + \expandafter\expandafter\expandafter{% + \csname scrlayer@#1@commandlist\expandafter\endcsname + \expandafter\@elt\csname #2\endcsname + }% + \@namedef{scrlayer@command@#2}{#1}% +} +%</package&body> +% \end{macrocode} +% \begin{option}{forceoverwrite} +% \begin{macro}{\ifscrlayer@forceoverwrite} +% \begin{description} +% \item[\Parameter{simple switch}:] whether or not to overwrite already +% defined command. Note: If true, there will still be a warning. +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@ifkey{forceoverwrite}{scrlayer@forceoverwrite} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @forceoverwrite} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @forceoverwrite@default} +%</interface> +%</options> +% \end{macrocode} +% \end{macro}^^A \ifscrlayer@forceoverwrite +% \end{option}^^A forceoverwrite +% +% \begin{option}{autoremoveinterfaces} +% \begin{macro}{\ifscrlayer@autoremoveinterfaces} +% \begin{description} +% \item[\Parameter{simple switch}:] whether or not older interfaces may be +% automatically removed in conflict cases. +% \end{description} +% \begin{macrocode} +%<*options> +\KOMA@ifkey{autoremoveinterfaces}{scrlayer@autoremoveinterfaces} +%<*interface> +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @autoremoveinterfaces} +\scrlayer@AddCsToInterface{% + KV@KOMA.\@currname.\@currext @autoremoveinterfaces@default} +%</interface> +%</options> +% \end{macrocode} +% \end{macro}^^A \ifscrlayer@autoremoveinterfaces +% \end{option}^^A autoremoveinterfaces +% \end{macro}^^A \scrlayer@AddCsToInterface +% \end{macro}^^A \scrlayerAddCsToInterface +% \end{macro}^^A \scrlayerAddToInterface +% +% \begin{macro}{\scrlayerInitInterface} +% \begin{description} +% \item[\OParameter{string}:] the name of the interface. Generally this is +% the file name of the package or class, that defines the interface +% (default: \texttt{\Macro{@currname}.\Macro{@currext}}). +% \end{description} +% This registers a new user interface. +% \begin{macrocode} +%<*package&body> +\newcommand*{\scrlayerInitInterface}[1][\@currname.\@currext]{% + \@ifundefined{scrlayer@#1@commandlist}{% + \@namedef{scrlayer@#1@commandlist}{}% + }{% + \begingroup + \def\@elt##1{\space\space\string##1\MessageBreak}% + \PackageError{scrlayer}{interface `#1' already initialised}{% + You've tried to initialise scrlayer interface `#1',\MessageBreak + but an interface of this name has been initialised + already.\MessageBreak + Here's a list of all macros of the already initialised + interface:\MessageBreak + \@nameuse{scrlayer@#1@commandlist}.% + If you'll continue, this re-initialisation will be ignored.% + }% + \endgroup + }% +} +%</package&body> +% \end{macrocode} +% The initialisation has to be done by each interface package: +% \begin{macrocode} +%<interface&init>\scrlayerInitInterface +% \end{macrocode} +% \end{macro}^^A \scrlayerInitInterface +% +% \begin{macro}{\scrlayerOnAutoRemoveInterface} +% \begin{description} +% \item[\OParameter{string}:] the name of the interface. Generally this is +% the file name of the package or class, that defines the interface +% (default: \texttt{\Macro{@currname}.\Macro{@currext}}). +% \item[\Parameter{code}:] will be executed if the interface will be removed +% automatically (see option \Option{autoremoveinterfaces}). +% \end{description} +% \begin{macrocode} +%<*package&body> +\newcommand*{\scrlayerOnAutoRemoveInterface}[2][\@currname.\@currext]{% + \@ifundefined{scrlayer@#1@onremove}{\@namedef{scrlayer@#1@onremove}{}}{}% + \expandafter\l@addto@macro\csname scrlayer@#1@onremove\endcsname{#2}% +} +%</package&body> +% \end{macrocode} +% \end{macro}^^A \scrlayerOnAutoRemoveInterface +% +% +% \iffalse^^A meta-comment +%</package|interface> +% \fi^^A meta-comment +% +% +% \Finale +% +\endinput +% +% end of file `scrlayer.dtx' + +%%% Local Variables: +%%% mode: doctex +%%% mode: flyspell +%%% ispell-local-dictionary: "en_GB" +%%% TeX-master: t +%%% End: |