%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Module:    ZzTeX Front Matter Facilities
%
% Synopsis:  This file provides facilities for typesetting the front
%            matter of a book.
%
% Author:    Paul C. Anagnostopoulos
% Created:   24 September 1989
%
% Copyright 1989--2020 by Paul C. Anagnostopoulos
% under The MIT License (opensource.org/licenses/MIT)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%                       Copyright Page
%                       --------- ----


\def \copyrightline #1#2{%                              {year}{publisher}
  \noindent Copyright \copyright\ #1 by #2\par}

\def \concisecopyrightline #1#2{%                       {year}{publisher}
  \noindent \copyright\ #1 by #2\par}

\def \superconcisecopyrightline #1#2{%                  {year}{publisher}
  \noindent \copyright\ #1 #2\par}

\def \copyrightnotice {%
  All rights reserved.  No part of this publication may be reproduced,
  stored in a retrieval system, or transmitted, in any form or by any
  means, electronic, mechanical, photocopying, recording, or otherwise,
  without the prior written permission of the publisher.}


% We provide a standard text design for the Library of Congress
% Cataloging-in-Publication data.

\def \textcipdataidesign {%
  \aboveskip = \noskip
  \belowskip = \noskip
  \bodyfont = {}%
  \setflag \enabletabbing = \false
  \leftindent = 0pt
  \parindent = \enclosingparindent
  \parrag = \enclosingparrag
  \parskip = 0pt
  \rightindent = 0pt
  \setflag \verbatimlines = \true
  \width = \naturalwidth}

\def \textcipdataiidesign {%
  \textcipdataidesign}

%                       Table of Contents Entries
%                       ----- -- -------- -------


% This macro is used to write a ToC entry in the cross-reference file.

\def \ztocentry #1#2#3#4{%              {number}{title}{level}{allow?}
  {\ztoksa = {#2}%
   \tcounta = #3\relax
   \edef \znext {\noexpand\xref{toc}{\noexpand\folio}{#1}{\the\ztoksa}
                                    {\the\divisionname,\the\tcounta,%
                                     \the\difficulty,\if #41\else 0\fi}}% 
   \znext}}

% This is the public command for writing ToC entries.

\def \tocentry #1#2#3{%                         {number}{title}{level}
  \ztocentry{#1}{#2}{#3}{\true}}

% This macro allows the compositor to adjust pages in the ToC.

\setlist \ztocadjlist = {}

\long\def \tocadjustment #1#2#3{%               {toc-type}{number}{commands}
  \append{{#1}{#2}{#3}}{\ztocadjlist}}

%                       Table of Contents Block
%                       ----- -- -------- -----


\defineblock{\toc}{\endtoc}{\false}{}

%~block toc Type
% \abovepenalty = integer               % Penalty above text.
% \aboveskip = glue                     % Space b/b above text.
% \belowpenalty = integer               % Penalty below text.
% \belowskip = glue                     % Space b/b below text.
% \bodyfont = {\size\style}             % Default font for body.
% \divisions = {...}                    % List of divisions to include.
% \foliofont = {\size\style}            % Default font for folio.
% \leftindent = glue                    % Left indentation.
% \levels = {...}                       % List of levels to include.
% \setflag \minitoc = boolean           % Is this a miniToC?
% \parindent = dimen                    % Paragraph indentation.
% \parrag = dimen                       % Paragraph raggedness.
% \parskip = glue                       % Paragraph skip.
% \rightindent = glue                   % Right indentation.
% \tocwidtha = dimen                    % General width a.
% \tocwidthb = dimen                    % General width b.
% \tocwidthc = dimen                    % General width c.
% \width = dimen                        % Line width
% \xreffile = {...}                     % Name of composite xref file to use.
%~end

\definetoks{\foliofont}
\definetoks{\levels}
\definedimen{\tocwidtha}{0pt}
\definedimen{\tocwidthb}{0pt}
\definedimen{\tocwidthc}{0pt}
\definetoks{\xreffile}

\definecount{\prevtocprimarylevel}{-1}          % Previous level >= 70.


\def \toc #1{%                                          {type}
  \beginblockscope{toc}%
  \def \ztoctype {#1}%
  \global\increment \tocdepth
  \abovepenalty = \breaknever                   %~default hard
  \belowpenalty = \breakbest                    %~default hard
  \bodyfont = {}%                               %~default soft
  \divisions = {\all}%                          %~default soft
  \setflag \minitoc = \false                    %~default soft
  \tocwidtha = 0pt                              %~default soft
  \tocwidthb = 0pt                              %~default soft
  \tocwidthc = 0pt                              %~default soft
  \xreffile = {}%                               %~default hard
  \processdesign{\toc}{#1}%
  \global\increment \tocnumber
  \commalist{\zlevlist}{\the\levels}%
  \the\bodyfont
  \tocformat
  \endtoc}

\def \endtoc {%
  \endgraf
  \endtocformat
  \global\decrement \tocdepth
  \endblockscope{toc}}

\def \tocformat {%
  \endgraf
  \bbskipabove{\abovepenalty}{\aboveskip}%
  \alterindentation{\leftindent}{\rightindent}%
  \settextwidth{\width}%
  \setparrag{\parrag}%
  \zadjtitle = \if \minitoc \zadjtitleminitoc \else \zadjtitletoc \fi
                            % \adjusttitle should adjust appropriate ToC.
  \def \zadjloc {\toc}%
  \if \emptytoksp{\xreffile}%
    \zxloadcomp{\xrefloadtocmode}%
  \else
    \zxloadothercomp{\the\xreffile}{\xrefloadtocmode}%
  \fi}

\def \endtocformat {%
  \fakepar                                      % In case the ToC is empty.
  \setlist \ztocadjlist = {}%
  \bbskipbelowblock{\belowpenalty}{\belowskip}}


% The following macro is called for each entry in the cross-reference file.
% Each entry must NOT be in a group.

\def \xreftoc #1#2#3#4{%
  \ifnum \xrefmode=\xrefloadtocmode
    \xreftocb{#1}{#2}{#3}{#4}%
  \fi}

\definecount{\ztoclevel}{0}

\def \xreftocb #1#2#3#4{%               {page}{number}{title}
                        %               {division,level,difficulty,allow}
  \def \znext ##1,##2,##3,##4,##5\zmark{%
    \ztoksa={##1}\ztoclevel=##2\difficulty=##3\tcounta=##4\relax}%
  \znext #4,1,\zmark%
  \if \posp{\tcounta}%
    \edef \znext {\noexpand\inclusionlist\noexpand\ztoctest
                                         {\the\ztoksa}{\the\divisions}}%
    \znext
    \if \ztoctest
      \ztesttoclev{\ztoclevel}%
      \if \ztoctest
        \zchktocadj{#2}{#3}%
        \the\bodyfont
        \name{\toc\ztoctype\romannumeral\ztoclevel format}{#1}{#2}{#3}%
        \if \gtrp{\ztoclevel}{69}%
          \prevtocprimarylevel = \ztoclevel     % Save ToC level.
          \global\authortext = {}%              % Clear author text.
        \fi
      \fi
    \fi
  \fi}

\def \ztesttoclev #1{%                                  {level}
  \setflag \ztoctest = \false
  \maplist{\ztesttoca{#1}##1-\zmark}{\zlevlist}}

\def \ztesttoca #1#2-#3\zmark{%                         {n}low-high\zmark
  \if \emptyargp{#3}%
    \setflag \ztoctest = {\eqlp{#1}{#2}}%
  \else
    \ztesttocb{#1}{#2}#3%
  \fi
  \if \ztoctest \exitmaplist \fi}
  
\def \ztesttocb #1#2#3-{%                               {n}{low}high-
  \setflag \ztoctest = {\andp{\notp{\lssp{#1}{#2}}}
                             {\notp{\gtrp{#1}{#3}}}}}

\long\def \zchktocadj #1#2{%                            {number}{title}  
  \maplist{\zchktocadjb##1{#1}{#2}}{\ztocadjlist}}

\long\def \zchktocadjb #1#2#3#4#5{%     {type}{number}{commands}{number}{title}
  {\stringeql{\znext}{#1}{\ztoctype}%
   \if \znext
     \stringeql{\znext}{#2}{#4}%
     \if \znext
       #3\relax
     \else
       \def \tempa {#2}%                % Don't expand titles.
       \def \tempb {#5}%
       \if \tokeqlp{\tempa}{\tempb}%
         #3\relax
       \fi
     \fi
   \fi}}

\def \bbskipabovetochead #1#2#3#4#5{%   {level}{penalty}{skip}{penalty}{skip} 
  \if \eqlp{\prevtocprimarylevel}{#1}%
    \bbskipabove{#2}{#3}%
  \else
    \bbskipabove{#4}{#5}%
  \fi}

\definetoks{\zdelaytoc}

\def \delaytocformatter #1{%
  \global\zdelaytoc = \expandafter{\the\zdelaytoc #1}}

\def \dodelayedtocformatter {%
  \the\zdelaytoc
  \global\zdelaytoc = {}}