% \iffalse meta-comment
%
% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
% This file is part of the LaTeX base system.
% -------------------------------------------
%
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
%    https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
% The list of all files belonging to the LaTeX base distribution is
% given in the file `manifest.txt'. See also `legal.txt' for additional
% information.
%
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
%
% \fi
%
% \iffalse
%%% From File: ltpage.dtx
%
%<*driver>
% \fi
\ProvidesFile{ltpage.dtx}
             [2025/05/22 v1.0o LaTeX Kernel (page style setup)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltpage.dtx}
\title{\filename}
\date{\filedate}
 \author{%
  Johannes Braams\and
  David Carlisle\and
  Alan Jeffrey\and
  Leslie Lamport\and
  Frank Mittelbach\and
  Chris Rowley\and
  Rainer Sch\"opf}

\begin{document}
 \MaintainedByLaTeXTeam{latex}
 \maketitle
 \DocInput{\filename}
\end{document}
%</driver>
% \fi
%
%
% \section{Page styles and related commands}
%
%
% \changes{v1.0a}{1994/03/07}{Initial version, split from ltherest.dtx}
% \changes{v1.0b}{1994/04/19}{Improve documentation}
% \changes{v1.0i}{1996/04/18}{Improve documentation}
% \changes{v1.0l}{2019/08/27}{Make various commands robust}
%
%
% \subsection{Page Style Commands}
%
%  |\pagestyle|\marg{style} : sets the page style of the
%  current and succeeding  pages to \emph{style}
%
%  |\thispagestyle|\marg{style} : sets the page style of the
%  current page only to \emph{style}.
%
%  To define a page style \emph{style}, you must define
%  |\ps@|\emph{style} to set the page style parameters.
%
% \subsection{How a page style makes running heads and feet}
%
% The |\ps@|\ldots command defines the macros |\@oddhead|, |\@oddfoot|,
% |\@evenhead|, and |\@evenfoot| to define the running heads and feet.
% (See output routine.)  To make headings determined by the sectioning
% commands, the page style defines the commands |\chaptermark|,
% |\sectionmark|, etc., where |\chaptermark|\marg{text} is called by
% |\chapter| to set a mark.  The |\...mark| commands and the |\...head|
% macros are defined  with the help of the following macros.
%
% (All the |\...mark| commands should be initialized to no-ops.)
%
% \subsection{marking conventions}
%
% \LaTeX\ extends \TeX's |\mark| facility by producing two kinds of marks
% a `left' and a `right' mark, using the following commands:\\
%     |\markboth|\marg{left}\marg{right} : Adds both marks.\\
%     |\markright|\marg{right}      : Adds a 'right' mark.\\
%     |\leftmark| :
%        Used in the output routine, gets the current `left'  mark.
%        Works like \TeX's |\botmark.|\\
%     |\rightmark| :
%        Used in the output routine, gets the current `right' mark.
%        Works like \TeX's |\firstmark|.
% The marking commands work reasonably well for right marks `numbered
% within' left marks---e.g., the left mark is changed by a |\chapter|
% command and the right mark is changed by a |\section| command.
% However, it does produce somewhat anomalous results if 2 |\markboth|'s
% occur on the same page.
%
% Commands like |\tableofcontents| that should set the marks in some
% page styles use a |\@mkboth| command, which is |\let| by the pagestyle
% command (|\ps@...|) to |\markboth| for setting the heading or to
% |\@gobbletwo| to do nothing.
%
% \MaybeStop{}
%
%    \begin{macrocode}
%<*2ekernel>
%    \end{macrocode}
%
% \begin{macro}{\pagestyle}
% User command to set the page style for this and following pages.
% \changes{LaTeX2e}{1994/01/24}
%         {(DPC) Complain if pagestyle is undefined.}
% \changes{LaTeX2e}{1994/02/01}
%         {(DPC) Modify to get nicer error message}
%    \begin{macrocode}
\def\pagestyle#1{%
  \@ifundefined{ps@#1}%
    \undefinedpagestyle
    {\@nameuse{ps@#1}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thispagestyle}
% User command to set the page style for this page only.
% \changes{LaTeX2e}{1994/02/01}
%         {(DPC) Modify to get nicer error message}
%    \begin{macrocode}
\def\thispagestyle#1{%
  \@ifundefined{ps@#1}%
    \undefinedpagestyle
    {\global\@specialpagetrue\gdef\@specialstyle{#1}}}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ps@empty}
% The empty page style: No head or foot line.
%    \begin{macrocode}
\def\ps@empty{%
  \let\@mkboth\@gobbletwo\let\@oddhead\@empty\let\@oddfoot\@empty
  \let\@evenhead\@empty\let\@evenfoot\@empty}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ps@plain}
% \changes{v1.0g}{1995/05/26}{removed \cs{rmfamily} (PR 1578)}
% The plain page style: No head, centred page number in foot.
%    \begin{macrocode}
\def\ps@plain{\let\@mkboth\@gobbletwo
     \let\@oddhead\@empty\def\@oddfoot{\reset@font\hfil\thepage
     \hfil}\let\@evenhead\@empty\let\@evenfoot\@oddfoot}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@leftmark}
% \begin{macro}{\@rightmark}
%    We implement |\@leftmark| and |\@rightmark| in terms of already
%    defined commands to save token space. We can't get rid of them
%    since they are sometimes used in applications.
%    \begin{macrocode}
\let\@leftmark\@firstoftwo
\let\@rightmark\@secondoftwo
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2025/06/01}%
%<latexrelease>                 {\markboth}{Drop legacy mark support}%
%    \end{macrocode}
%
%
% \begin{macro}{\markboth}
% \begin{macro}{\markright}
% \changes{v1.0d}{1994/05/20}{Changed setting for \cs{protect}.}
% \changes{v1.0e}{1994/11/04}{Added \cs{@unexpandable@protect}.
%    ASAJ.}
%
% User commands for setting \LaTeX\ marks.
%
% Test for |@nobreak| added 15 Apr 86 in |\markboth| and |\markright|
% letting |\label| and |\index| to |\relax| added 22 Feb 86 so these
%   commands can appear in sectioning command arguments
% RmS 91/06/21 Same for |\glossary|
% \changes{v1.0k}{2000/06/02}{Tidied 1.0j reimplementation, CAR}
% \changes{v1.0k}{2000/06/02}{Small adjustment to give slightly less
%    expansion, CAR}
% \changes{v1.0j}{2000/05/26}{Reimplementation to fix expansion
%                             error (pr/3203).}
% \changes{v1.0m}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \changes{v1.0n}{2022/04/04}{Interface with new mark mechanism}
% \changes{v1.0o}{2024/11/16}{Drop legacy mark support}
%    \begin{macrocode}
\ExplSyntaxOn
\DeclareRobustCommand*\markboth[2]{%
    \mark_insert:nn{2e-left}{#1}
    \mark_insert:nn{2e-right}{#2} 
    \tl_if_empty:nF{#2}{ \mark_insert:nn{2e-right-nonempty}{#2} }
}
%    \end{macrocode}
%
% \changes{v1.0m}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \changes{v1.0n}{2022/04/04}{Interface with new mark mechanism}
% \changes{v1.0o}{2024/11/16}{Drop legacy mark support}
%    \begin{macrocode}
\DeclareRobustCommand*\markright[1]{%
    \mark_insert:nn{2e-right}{#1}
    \tl_if_empty:nF{#1}{ \mark_insert:nn{2e-right-nonempty}{#1} }
}
\ExplSyntaxOff
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2022/06/01}%
%<latexrelease>                 {\markboth}{New mark support}%
%<latexrelease>\ExplSyntaxOn
%<latexrelease>\DeclareRobustCommand*\markboth[2]{%
%<latexrelease>  \begingroup
%<latexrelease>    \let\label\relax \let\index\relax \let\glossary\relax
%<latexrelease>    \unrestored@protected@xdef\@themark {{#1}{#2}}%
%<latexrelease>    \@temptokena \expandafter{\@themark}%
%<latexrelease>    \mark_insert:nn{2e-left}{#1}
%<latexrelease>    \mark_insert:nn{2e-right}{#2}
%<latexrelease>    \tl_if_empty:nF{#2}{ \mark_insert:nn{2e-right-nonempty}{#2} }
%<latexrelease>    \mark{\the\@temptokena}%
%<latexrelease>  \endgroup
%<latexrelease>  \if@nobreak\ifvmode\nobreak\fi\fi}
%<latexrelease>\DeclareRobustCommand*\markright[1]{%
%<latexrelease>  \begingroup
%<latexrelease>    \let\label\relax \let\index\relax \let\glossary\relax
%<latexrelease>    \expandafter\@markright\@themark {#1}%
%<latexrelease>    \@temptokena \expandafter{\@themark}%
%<latexrelease>    \mark_insert:nn{2e-right}{#1}
%<latexrelease>    \tl_if_empty:nF{#1}{ \mark_insert:nn{2e-right-nonempty}{#1} }
%<latexrelease>    \mark{\the\@temptokena}%
%<latexrelease>  \endgroup
%<latexrelease>  \if@nobreak\ifvmode\nobreak\fi\fi}
%<latexrelease>\ExplSyntaxOff
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2019/10/01}%
%<latexrelease>                 {\markboth}{Make commands robust}%
%<latexrelease>
%<latexrelease>\DeclareRobustCommand*\markboth[2]{%
%<latexrelease>  \begingroup
%<latexrelease>    \let\label\relax \let\index\relax \let\glossary\relax
%<latexrelease>    \unrestored@protected@xdef\@themark {{#1}{#2}}%
%<latexrelease>    \@temptokena \expandafter{\@themark}%
%<latexrelease>    \mark{\the\@temptokena}%
%<latexrelease>  \endgroup
%<latexrelease>  \if@nobreak\ifvmode\nobreak\fi\fi}
%<latexrelease>\DeclareRobustCommand*\markright[1]{%
%<latexrelease>  \begingroup
%<latexrelease>    \let\label\relax \let\index\relax \let\glossary\relax
%<latexrelease>    \expandafter\@markright\@themark {#1}%
%<latexrelease>    \@temptokena \expandafter{\@themark}%
%<latexrelease>    \mark{\the\@temptokena}%
%<latexrelease>  \endgroup
%<latexrelease>  \if@nobreak\ifvmode\nobreak\fi\fi}
%<latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\markboth}{Make commands robust}%
%<latexrelease>
%    \end{macrocode}
%    Using \cs{kernel@make@fragile} doesn't really work if there are
%    more redefinitions later on, so we have to repeat the above
%    definition first and then undo it (or use \cs{def} directly).
%    \begin{macrocode}
%<latexrelease>%\kernel@make@fragile\markboth
%<latexrelease>%\kernel@make@fragile\markright
%<latexrelease>\def\markboth#1#2{%
%<latexrelease>  \begingroup
%<latexrelease>    \let\label\relax \let\index\relax \let\glossary\relax
%<latexrelease>    \unrestored@protected@xdef\@themark {{#1}{#2}}%
%<latexrelease>    \@temptokena \expandafter{\@themark}%
%<latexrelease>    \mark{\the\@temptokena}%
%<latexrelease>  \endgroup
%<latexrelease>  \if@nobreak\ifvmode\nobreak\fi\fi}
%<latexrelease>\def\markright#1{%
%<latexrelease>  \begingroup
%<latexrelease>    \let\label\relax \let\index\relax \let\glossary\relax
%<latexrelease>    \expandafter\@markright\@themark {#1}%
%<latexrelease>    \@temptokena \expandafter{\@themark}%
%<latexrelease>    \mark{\the\@temptokena}%
%<latexrelease>  \endgroup
%<latexrelease>  \if@nobreak\ifvmode\nobreak\fi\fi}
%<latexrelease>
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
%
%
%
%
% \begin{macro}{\leftmark}
% \changes{v1.0j}{2000/05/26}{Use \cs{@empty} instead of brace group
%                             (pr/3203).}
% \begin{macro}{\rightmark}
% \changes{LaTeX2e}{1993/12/17}{Stopgap solution to mark \cs{leftmark}
%      and \cs{rightmark} work without initializing mark until
%      the problem is solved.}
% \changes{v1.0j}{2000/05/26}{Use \cs{@empty} instead of brace group
%                             (pr/3203).}
% \task{???}{mark initialization solved?}
%    \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2025/06/01}%
%<latexrelease>                 {\leftmark}{Use new mark mechanism}%
%    \end{macrocode}
%    
%    \begin{macrocode}
\ExplSyntaxOn
\cs_new:Npn \leftmark {\mark_use_last:nn{page}{2e-left}}
\cs_new:Npn \rightmark {\mark_use_first:nn{page}{2e-right}}
\ExplSyntaxOff
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease>                 {\leftmark}{Use new mark mechanism}%
%<latexrelease>
%<latexrelease>\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
%<latexrelease>\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
%    \end{macrocode}
%    
% \begin{macro}{\@markright}
% \changes{v1.0j}{2000/05/26}{Reimplementation to fix expansion
%                             error (pr/3203).}
% \changes{v1.0k}{2000/06/02}{Small adjustment to give slightly less
%    expansion, CAR}
% \begin{macro}{\mark}
% \changes{LaTeX2e}{1993/12/16}{Init \cs{mark} at begin document}
% \changes{LaTeX2e}{1993/12/17}{Removed init \cs{mark} at begin
%                   document, since it doesn't work.}
%    \begin{macrocode}
%<latexrelease>\def\@themark{{}{}}
%<latexrelease>\def\@markright#1#2#3{\@temptokena {#1}%
%<latexrelease>\unrestored@protected@xdef\@themark{{\the\@temptokena}{#3}}}
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
% \begin{macro}{\raggedbottom}
%  |\raggedbottom| typesets pages with no vertical stretch, so they have
%                  their natural height instead of all being exactly the
%                  same height.  (Uses a space of .0001fil to avoid
%                  interfering with the 1fil space of |\newpage|.)
%
%    \begin{macrocode}
\DeclareRobustCommand\raggedbottom{%
  \def\@textbottom{\vskip \z@ \@plus.0001fil}\let\@texttop\relax}
%    \end{macrocode}
%  \end{macro}
%
% \begin{macro}{\flushbottom}
% |\flushbottom|:
% Inverse of |\raggedbottom| --- makes all pages the same height.
%    \begin{macrocode}
\DeclareRobustCommand\flushbottom{%
  \let\@textbottom\relax \let\@texttop\relax}
%    \end{macrocode}
%  \end{macro}
%
%
% \begin{macro}{\sloppy}
%  |\sloppy| will never (well, hardly ever) produce overfull boxes, but
%  may produce underfull ones.  (14 June 85)
% \changes{LaTeX2e}{1993/12/18}{Added \cs{emergencystretch}}
% \changes{v1.0h}{1994/07/20}{Save a few tokens}
%    \begin{macrocode}
\DeclareRobustCommand\sloppy{%
  \tolerance 9999%
  \emergencystretch 3em%
  \hfuzz .5\p@
  \vfuzz\hfuzz}
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{sloppypar}
%  A sloppypar environment is equivalent to |{\par \sloppy ... \par}|.
%    \begin{macrocode}
\def\sloppypar{\par\sloppy}
\def\endsloppypar{\par}
%    \end{macrocode}
%  \end{environment}
%
% \begin{macro}{\fussy}
% \changes{v1.0f}{1995/04/24}{reset \cs{emergencystretch} latex/1344}
%  Resets \TeX's parameters to their normal finicky values.
%    \begin{macrocode}
\DeclareRobustCommand\fussy{%
  \emergencystretch\z@
  \tolerance 200%
  \hfuzz .1\p@
  \vfuzz\hfuzz}
%    \end{macrocode}
%  \end{macro}
%
% \begin{macro}{\overfullrule}
% \LaTeX\ default is no overfull box rule.  Changed by document
% class option.
%    \begin{macrocode}
\overfullrule 0pt
%    \end{macrocode}
%  \end{macro}
%
%    \begin{macrocode}
%</2ekernel>
%    \end{macrocode}
%
% \Finale
%
