% +--------------------------------------------------+
% | Typeset titlesec.tex to get the documentation.   |
% +--------------------------------------------------+
%
% Copyright (c) 1998-2007 by Javier Bezos.
% All Rights Reserved.
%
% This file is part of the titlesec distribution release 2.8
% -----------------------------------------------------------
%
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
% 
% This work has the LPPL maintenance status "maintained".
% 
% The Current Maintainer of this work is Javier Bezos.

% History of v1.0 (actually not 1.0)
% ~~~~~~~~~~~~~~~
% 99/11/03: Split from titlesec.sty
% 99/11/03: Changed \setmarks, \ttl@sethead, \ttl@setfoot to follow
%           the new scheme
% 99/11/03: Removed the redefinition of \markboth. The arguments are
%           expanded on the fly by the corresponding \...mark. 
% 00/01/06: Added the \newtitlemark device.
% 00/01/19: Rejected the idea of a separate package (for the time 
%           being). Now it's ttlps.def.
% 00/01/20: Starred versions of \widenhead, \sethead, \setfoot.
% 00/01/23: Added \ifthe..., \iftitle, etc.
% 00/02/05: Modified \ifthe... mechanism
% 00/02/25: Fixed a bug which made enter in an endless loop.
%           Now \ttl@marks is just \relax. The new scheme made
%           compatible with babel. (2.3.1)
% 00/03/01: Fixed a bug in the previous bug fix. (2.3.2)
% 00/03/08: Removed the code for AMS and babel. A general procedure
%           to catch the changes of \markboth is introduced, with
%           \ttl@enccode and \ttl@running. (2.3.3)
% 00/05/05: \setmarks may be used outside of \newpagestyle, with
%           the help of \ttl@setmarks and \ttl@marksset (2.3.4)
% 00/05/25: Tests for \ttl@toclabel moved to the redefinition of
%           \secdef in titlesec. (2.3.5)
% 00/06/07: Added the first attempt for pagestyles with floats.
%           With slight changes, it will become the final form
%           for that. (2.3.5)
% 00/06/14: The default \ifthe... are now defined with \ttl@setifthe
%           so that they are robust from the very beginning. (2.3.5)
% 01/01/21: Replaced some \defs by \newcommand
%
% As before, all marks has two parts but now they don't refer to left or 
% right pages at all.  There are some issues related to top marks which 
% are explained by Knuth in \textit{The \TeX book}, pp.  259f, as well 
% as an uncompatibility between them and \LaTeX{} floats.  To overcome 
% both limitations, in the \textsf{titlesec} page styles, the second 
% part in |\cs{firstmark}| is a \emph{fixed} top mark and the first one 
% the actual first mark; the right way to get the bot mark is from the 
% second part.  Marks are stored at each section and used before and 
% after the title (straight class); the first part contains the values 
% of current title, but the second one contains the previolusly stored 
% values in the mark before the title, and the current values in the 
% mark after.

\ProvidesFile{ttlps.def}[2007/08/12]

% 
% Page Styles
% ~~~~~~~~~~~

\ifx\ttl@compatps\@undefined\else
  \PackageWarningNoLine{titlesec}
      {You are using an old interface for page styles\MessageBreak
      You could proceed but don't complain if you run\MessageBreak
      into errors}
\fi

\ttl@pstrue

\let\parttitle\@empty
\let\chaptertitle\@empty
\let\sectiontitle\@empty
\let\subsectiontitle\@empty
\let\subsubsectiontitle\@empty
\let\paragraphtitle\@empty
\let\subparagraphtitle\@empty

\newcommand\iftitle[1]{%
  \expandafter\ifx\csname #1title\endcsname\@empty
    \expandafter\@secondoftwo
  \else
    \expandafter\@firstoftwo
  \fi}

\newcommand\newtitlemark{%
  \@ifstar{\@tempswafalse\ttl@newmk@i}%
          {\@tempswatrue\ttl@newmk@i}}
  
\def\ttl@newmk@i#1{%
  \edef\ttl@a{{\expandafter\@gobble\string#1}}%
  \expandafter\ttl@newmk@ii\ttl@a}

\def\ttl@newmk@ii#1{%
  \if@tempswa
    \expandafter\def\expandafter\ttl@moremarks\expandafter{%
      \ttl@moremarks
      \protect\@namedef{#1}{\@nameuse{#1}}}%
  \else
    \expandafter\def\expandafter\ttl@moremarks\expandafter{%
      \ttl@moremarks
      \protect\@nameuse{#1}=\the\@nameuse{#1}\relax}%
  \fi}

\def\ttl@prevmarks{\ttl@marks}
\let\ttl@marks\relax

\let\ttl@moremarks\@empty

% The following command sets the ifthe... commands to
% be used in heads. When the call is from inside a sectioning
% command, toclabel is either true (in most of cases) or false
% (a chapter in the front matter, for example). Otherwise (an
% explicit \...mark) is false

\def\ttl@setifthe#1{%
  \expandafter\protected@edef\csname ifthe#1\endcsname{%
    \ifttl@toclabel
      \protect\@firstoftwo
    \else
      \protect\@secondoftwo
    \fi}}

% At this point \ttl@toclabel is always false

\ttl@setifthe{part}
\ttl@setifthe{chapter}
\ttl@setifthe{section}
\ttl@setifthe{subsection}
\ttl@setifthe{subsubsection}
\ttl@setifthe{paragraph}
\ttl@setifthe{subparagraph}

\newtitlemark{\ttl@running}
\let\ttl@enccode\relax
\def\ttl@running{\ttl@enccode}

\def\ttl@markboth#1{%
 \begingroup
   \let\protect\@unexpandable@protect
   \let\@mkboth\@gobbletwo
   \let\ttl@enccode\relax
   \let\label\relax
   \let\index\relax
   \let\glossary\relax
   \let\ttl@c\mark
   \def\mark##1{\xdef\ttl@running{\expandafter\@gobble##1}}%
   \markboth{}{\ttl@enccode}%
   \expandafter\let\csname#1mark\endcsname\@gobble
   \xdef\ttl@marks{\ttl@marks}%
   \gdef\@themark{{\ttl@marks}{\ttl@prevmarks}}%
   \ttl@c{\@themark}%
   \if@nobreak\ifvmode\nobreak\fi\fi
 \endgroup}

\newcommand\setmarks[2]{\def\ttl@marksset{{#1}{#2}}}

\def\ttl@setmarks#1#2{%
  \expandafter\def\csname#1mark\endcsname##1{%
    \expandafter\gdef\csname#1title\endcsname{##1}%
    \ttl@setifthe{#1}%
    \def\ttl@marks{%
      \protect\@namedef{#1title}{##1}%
      \protect\@namedef{#2title}{}%
      \protect\@namedef{the#1}{\@nameuse{the#1}}%
      \protect\@namedef{the#2}{}%
      \protect\@namedef{ifthe#1}{\@nameuse{ifthe#1}}%
      \protect\@namedef{ifthe#2}{\protect\@secondoftwo}%
      \ttl@moremarks}%
    \ttl@markboth{#1}}%
  \expandafter\def\csname#2mark\endcsname##1{%
    \expandafter\gdef\csname#2title\endcsname{##1}%
    \ttl@setifthe{#2}%
    \def\ttl@marks{%
      \protect\@namedef{#1title}{\@nameuse{#1title}}%
      \protect\@namedef{#2title}{##1}%
      \protect\@namedef{the#1}{\@nameuse{the#1}}%
      \protect\@namedef{the#2}{\@nameuse{the#2}}%
      \protect\@namedef{ifthe#1}{\@nameuse{ifthe#1}}%
      \protect\@namedef{ifthe#2}{\@nameuse{ifthe#2}}%
      \ttl@moremarks}%
    \ttl@markboth{#1}}}%

\newcommand\headrule{\setheadrule{.4\p@}}
\newcommand\footrule{\setfootrule{.4\p@}}

\newcommand\setheadrule[1]{%
  \ifdim#1=\z@
    \let\makeheadrule\@empty
  \else
    \def\makeheadrule{\rule[-.3\baselineskip]{\linewidth}{#1}}%
  \fi}
\newcommand\setfootrule[1]{%
  \ifdim#1=\z@
    \let\makefootrule\@empty
  \else
    \def\makefootrule{\rule[.7\baselineskip]{\linewidth}{#1}}%
  \fi}
  
\renewcommand\newpagestyle[1]{%
  \begingroup
  \catcode`\^^M=9
  \@ifnextchar[%
    {\ttl@pagestyle\newcommand{#1}}%
    {\ttl@pagestyle\newcommand{#1}[]}}
    
\renewcommand\renewpagestyle[1]{%
  \begingroup
  \catcode`\^^M=9
  \@ifnextchar[%
    {\ttl@pagestyle\renewcommand{#1}}%
    {\ttl@pagestyle\renewcommand{#1}[]}}

\def\ttl@pagestyle#1#2[#3]#4{%
  \endgroup
  \expandafter#1\csname ps@#2\endcsname{%
    \ttl@defaultps
    \def\ttl@headfmt{#3}%
    #4%
    \def\setmarks####1####2{\def\ttl@marksset{{####1}{####2}}}}}

\def\ttl@userunning#1#2{\csname ttlr@#1#2\endcsname}

\def\ttl@defaultps{%
    \let\makeheadrule\@empty
    \let\makefootrule\@empty
    \def\@mkboth{\ttl@savemark\@gobbletwo}%
    \def\@oddfoot{\ttl@userunning of}%
    \def\@evenfoot{\ttl@userunning ef}%
    \def\@oddhead{\ttl@userunning oh}%
    \def\@evenhead{\ttl@userunning eh}%
    \def\ttlr@of{\ttl@makefoot\@empty\@@\ttl@hiol\ttl@hior}%
    \def\ttlr@ef{\ttl@makefoot\@empty\@@\ttl@hiel\ttl@hier}%
    \def\ttlr@oh{\ttl@makehead\@empty\@@\ttl@hiol\ttl@hior}%
    \def\ttlr@eh{\ttl@makehead\@empty\@@\ttl@hiel\ttl@hier}%
    \let\ttlr@of@b\relax  \let\ttlr@of@p\relax
    \let\ttlr@ef@b\relax  \let\ttlr@ef@p\relax
    \let\ttlr@oh@t\relax  \let\ttlr@oh@p\relax
    \let\ttlr@eh@t\relax  \let\ttlr@eh@p\relax
    \let\setmarks\ttl@setmarks
    \expandafter\setmarks\ttl@marksset}

\@ifundefined{chapter}%
    {\setmarks{section}{subsection}}%
    {\setmarks{chapter}{section}}

\newcommand\usepage{\protect\thepage}

\newcommand\toptitlemarks    {\expandafter\@secondoftwo\firstmark{}{}{}}
\def\firsttitlemarks{%
   \toks@\expandafter\expandafter\expandafter{%
      \expandafter\@secondoftwo \firstmark{}{}{}}%
   \@temptokena\expandafter\expandafter\expandafter{%
      \expandafter\@secondoftwo \botmark{}{}{}}%
   \edef\ttl@a{\the\toks@}%
   \edef\ttl@b{\the\@temptokena}%
   \ifx\ttl@a\ttl@b
     \expandafter\@secondoftwo\firstmark{}{}{}%
   \else
     \expandafter\@firstoftwo \firstmark{}{}{}%
   \fi}
\newcommand\bottitlemarks    {\expandafter\@secondoftwo\botmark{}{}{}}
\newcommand\nexttoptitlemarks{\expandafter\@firstoftwo \botmark{}{}{}}
\newcommand\outertitlemarks{%
  \if@twoside
    \ifodd\c@page\relax
      \bottitlemarks
    \else
      \toptitlemarks
    \fi
  \else
    \toptitlemarks
  \fi}
\newcommand\innertitlemarks{%
  \if@twoside
    \ifodd\c@page\relax
      \firsttitlemarks
    \else
      \bottitlemarks
    \fi
  \else
    \bottitlemarks
  \fi}


\def\ttl@duplthreeargs#1#2#3#4{#1[#2][#3][#4]{#2}{#3}{#4}}
\def\ttl@dupltwoargs#1#2#3{#1[#2][#3]{#2}{#3}}
\def\ttl@duplthreeargsrev#1#2#3#4{#1[#4][#3][#2]{#2}{#3}{#4}}
\def\ttl@dupltwoargsrev#1#2#3{#1[#3][#2]{#2}{#3}}

\def\ttl@setany#1{%
  \@ifstar{\ttl@duplthreeargsrev#1}%
          {\@ifnextchar[{#1}{\ttl@duplthreeargs#1}}}

\newcommand\setfoot{\ttl@setany\ttl@setfoot}
\newcommand\sethead{\ttl@setany\ttl@sethead}

\def\ttl@setfoot[#1][#2][#3]#4#5#6{%
  \def\ttlr@ef{\ttl@makefoot{#1}{#2}{#3}\@@\ttl@hiel\ttl@hier}%
  \def\ttlr@of{\ttl@makefoot{#4}{#5}{#6}\@@\ttl@hiol\ttl@hior}}

\def\ttl@sethead[#1][#2][#3]#4#5#6{%
  \def\ttlr@eh{\ttl@makehead{#1}{#2}{#3}\@@\ttl@hiel\ttl@hier}%
  \def\ttlr@oh{\ttl@makehead{#4}{#5}{#6}\@@\ttl@hiol\ttl@hior}}

\def\ttl@headinline#1#2#3{%
  \ttl@headfmt
  \def\ttl@a{#1#3}\def\ttl@b{#2}%
  \ifx\ttl@a\@empty
    \hfil{#2}\hfil
  \else\ifx\ttl@b\@empty
    {#1}\hfil{#3}%
  \else
    \sbox\z@ {#1}%
    \sbox\tw@{#3}%
    \copy\z@
    \ifdim\wd\z@<\wd\tw@
      \kern-\wd\z@\kern\wd\tw@
    \fi
    \hfil{#2}\hfil
    \ifdim\wd\z@>\wd\tw@
      \kern-\wd\tw@\kern\wd\z@
    \fi
    \box\tw@
  \fi\fi}

\def\ttl@makeboth#1#2#3#4{%
  \ttl@calcneg\hspace{#3}%
  \normalsize
  \linewidth\textwidth
  \addtolength\linewidth{#3}%
  \addtolength\linewidth{#4}%
  \ifx#2\@empty\else   
    \setbox\z@\hb@xt@\linewidth{%
	\color@begingroup
        #2%
	\color@endgroup}%
	\wd\z@\z@
	\ht\z@\z@
	\dp\z@\z@
	\box\z@
  \fi
  \ttl@titlemarks   % Must precede the format. Defines \ttl@running
  \def\ttl@enccode{\ttl@headinline#1{}{}{}}%which contains ttl@enccode
  \ttl@running
  \ttl@calcneg\hspace{#4}}% 
	  
\def\ttl@makehead#1\@@{\ttl@makeboth{#1}\makeheadrule}
\def\ttl@makefoot#1\@@{\ttl@makeboth{#1}\makefootrule}
		
\renewcommand\widenhead{%
  \@ifstar{\ttl@dupltwoargsrev\ttl@widenhd}%
          {\@ifnextchar[{\ttl@widenhd}{\ttl@dupltwoargs\ttl@widenhd}}}
  
\def\ttl@widenhd[#1][#2]#3#4{%
  \def\ttl@hiel{#1}\def\ttl@hier{#2}%
  \def\ttl@hiol{#3}\def\ttl@hior{#4}}
  
\let\setheadindent\widenhead
  
\def\ttl@hiel{\z@}\def\ttl@hier{\z@}
\def\ttl@hiol{\z@}\def\ttl@hior{\z@}

% Pagestyles with floats. There macros are defined only with the
% psfloats package option.

\@ifundefined{ttl@replace}{\endinput}{}

% User interface

\newcommand\setfloatfoot{%
  \let\ttl@c\@empty % <- current float, empty if general
  \ttl@setany\ttl@setftfoot}

\newcommand\setfloathead{%
  \let\ttl@c\@empty % <- current float, empty if general
  \ttl@setany\ttl@setfthead}

\def\ttl@setftfoot[#1][#2][#3]#4#5#6#7{%
  \@ifnextchar[{\ttl@setftfoot@i{#1}{#2}{#3}{#4}{#5}{#6}{#7}}%
               {\ttl@setftfoot@i{#1}{#2}{#3}{#4}{#5}{#6}{#7}[bp]}}

\def\ttl@setfthead[#1][#2][#3]#4#5#6#7{%
  \@ifnextchar[{\ttl@setfthead@i{#1}{#2}{#3}{#4}{#5}{#6}{#7}}%
               {\ttl@setfthead@i{#1}{#2}{#3}{#4}{#5}{#6}{#7}[tp]}}

\def\ttl@setftfoot@i#1#2#3#4#5#6#7[#8]{%
  \@tfor\ttl@b:=#8\do{%
    \@namedef{ttlr@ef@\ttl@b\ttl@c}%
       {#7\ttl@makefoot{#1}{#2}{#3}\@@\ttl@hiel\ttl@hier}%
    \@namedef{ttlr@of@\ttl@b\ttl@c}%
       {#7\ttl@makefoot{#4}{#5}{#6}\@@\ttl@hiol\ttl@hior}}}

\def\ttl@setfthead@i#1#2#3#4#5#6#7[#8]{%
  \@tfor\ttl@b:=#8\do{%
    \@namedef{ttlr@eh@\ttl@b\ttl@c}%
       {#7\ttl@makehead{#1}{#2}{#3}\@@\ttl@hiel\ttl@hier}%
    \@namedef{ttlr@oh@\ttl@b\ttl@c}%
       {#7\ttl@makehead{#4}{#5}{#6}\@@\ttl@hiol\ttl@hior}}}

\newcommand\nextfloathead{%
  \ttl@nextfree  % returns ttl@c with the next float
  \ttl@setany\ttl@setfthead}

\newcommand\nextfloatfoot{%
  \ttl@nextfree  % returns ttl@c with the next float
  \ttl@setany\ttl@setftfoot}

% Compat mode with floatps

\ifx\ttl@replace\space

  \let\ttl@setnewfoot\ttl@setftfoot
  \let\ttl@setnewhead\ttl@setfthead

  \def\ttl@setftfoot[#1][#2][#3]#4#5#6{%
    \ttl@setnewfoot[#1][#2][#3]{#4}{#5}{#6}{}}
  \def\ttl@setfthead[#1][#2][#3]#4#5#6{%
    \ttl@setnewhead[#1][#2][#3]{#4}{#5}{#6}{}}

\fi

% The simple default value of \ttl@userunning is
% replaced by one more elaborated

\def\ttl@userunning#1#2{%
  \if@fcolmade  % From a post by D. Arseneau to comp.text.tex
    \def\@elt##1{\edef\ttl@pageft{\string##1}}%
    \@flsucceed
    \let\@elt\relax
    \if#2h%
      \ttl@replace #1hp\ttl@pageft
    \else
      \ttl@replace #1fp\ttl@pageft
      \ttl@killftps\ttl@pageft
    \fi
  \else\if#2h%
    \ifx\ttl@topft\@empty\else
      \ttl@replace #1ht\ttl@topft
    \fi
  \else
    \ifx\ttl@botft\@empty\else
      \ttl@replace #1fb\ttl@botft
    \fi
  \fi\fi
  \csname ttlr@#1#2\endcsname}

% [Don't move above as \ttl@replace is used as a flag.]

\def\ttl@replace#1#2#3#4{%
    \@ifundefined{ttlr@#1#2@#3#4}%
      {\@ifundefined{ttlr@#1#2@#3}{}%
          {\@namedef{ttlr@#1#2}{\@nameuse{ttlr@#1#2@#3}}}}%
      {\csname ttlr@xx@x#4\endcsname\@gobble
       {\expandafter\let\csname ttlr@#1#2\expandafter\endcsname
         \csname ttlr@#1#2@#3#4\endcsname}}}

\def\ttl@nextfree{%
  \def\@elt##1{%
    \edef\ttl@c{\string##1}%
    \let\@elt\@gobble}%
  \@freelist
  \let\@elt\relax
  \@ifundefined{ttlr@xx@x\ttl@c}%
    {\expandafter\let\csname ttlr@xx@x\ttl@c\endcsname\@secondoftwo
     \@tfor\ttl@a:={eh@t}{oh@t}{ef@b}{of@b}{eh@p}{oh@p}{ef@p}{of@p}\do{%
       \expandafter\global\expandafter
       \let\csname ttlr@\ttl@a\ttl@c\endcsname\relax}}{}}

\def\ttl@killftps#1{%
  \expandafter\global\expandafter
  \let\csname ttlr@xx@x#1\endcsname\relax}

\let\ttl@topft\@empty
\let\ttl@botft\@empty
\let\ttl@pageft\@empty

\def\ttl@combinefloats{%
 \ifx\@toplist\@empty\else   
   \def\@elt##1{%
     \edef\ttl@topft{\string##1}%
     \def\@elt####1{\ttl@killftps{\string####1}}}%
   \@toplist
  \fi
  \ifx\@botlist\@empty\else
    \def\@elt##1{%
      \def\@elt####1{%
        \def\@elt####1{\ttl@killftps\ttl@botft}%
        \edef\ttl@botft{\string####1}}%
      \edef\ttl@botft{\string##1}}%
    \@botlist
  \fi
  \let\@elt\relax
  \ttl@combinefloats@x}

\AtBeginDocument{%
  \let\ttl@combinefloats@x\@combinefloats
  \let\@combinefloats\ttl@combinefloats}

\endinput
