%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Module:    ZzTeX Document Facilities
%
% Synopsis:
%
% Author:    Paul C. Anagnostopoulos
% Created:   9 September 1989
%
% Copyright 1989--2020 by Paul C. Anagnostopoulos
% under The MIT License (opensource.org/licenses/MIT)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%                       Loading Design Files
%                       ------- ------ -----


\def \bookauthor {}
\def \booktitle {}
\def \bookpublisher {}
\def \bookISBN {}


\def \loaddesign #1{%                                   {file-list}
  \zdtinit
  \zloadinifile
  \global\divisionname = \expandafter{\jobname}%
  \setfoliostyle{\arabic}%              % Initialize various options that
  \setsentencespacing{\false}%          $ might be set in the design file.
  \setmathspaces{4mu plus .4mu minus .75mu}
                {4mu plus .4mu minus .75mu}
                {4mu plus .4mu minus .75mu}%
  \protectcitecommands
  \commalist{\zdeslist}{#1}%
  \maplist{\zinputdes{##1}}{\zdeslist}%
  \textsize\rm                          % In case \documentdesign resets
                                        % \normallineskip[limit].
  \if \DVIWindorules \setflag \DVIWindoinuse = \true \fi %%% Temporary.
  \if \newbiblio \input zzbiblio \else \input zzbibtex \fi
  \if \rangep{\newmath}{1}{2}\input zznewmath\relax \fi
  \if \newrunners \input zzrunner\relax \fi
  \if \zerop{\tabularversion}%
    \tabularversion = \if \newtabular 2\else 1\fi\relax
  \fi
  \if \neqlp{\tabularversion}{3}\input zztabularv\the\tabularversion\relax \fi
  \if \newtitleadjustment \input zzttladj\relax \fi}

\def \zinputdes #1{%                            {design-file}
  \checkfile{\znext}{#1.zzd}%
  \if \znext
    \input #1.zzd\relax
  \else
    \error{nodesfile}{The design file `#1.zzd' is missing}
    \zend
  \fi
  \if \orp{\hmodep}{\posp{\pagetotal}}
    \error{desjunk}
          {The design file `#1.zzd' has some spurious junk in it}
  \fi
  \textsize\rm                  % So \documentdesign macro can use it.
  \documentdesign}

\def \announcedesign #1{%                       {title}
  \remark{Loading design file `#1'._}}

\def \bookdata #1#2#3#4{%                       {author}{title}{publisher}{ISBN}
  \gdef \bookauthor {#1}%
  \gdef \booktitle {#2}%
  \gdef \bookpublisher {#3}%
  \gdef \bookISBN {#4}}

%~ Deprecated in favor of |\bookdata|.

\def \bookinfo #1#2#3{%                         {author}{title}{publisher}
  \gdef \bookauthor {#1}%
  \gdef \booktitle {#2}%
  \gdef \bookpublisher {#3}}

\def \commonencoding {%
  \input zzcomenc\relax
  \global\setflag \zcommonencoding = \true}

\def \protectcitecommands {%
  \let \cite      = \citeleterror
  \let \citeauthr = \citeleterror
  \let \citeyear  = \citeleterror
  \let \nocite    = \citeleterror}

\def \citeleterror {%
  \error{citelet}{Cannot use \noexpand\let to define \noexpand\cite commands}}

%                       Design Alternatives
%                       ------ ------------


% Design alternatives are deprecated.

\def \designalternative #1#2{%                  {\name}{choice}
  \withname\gdef{\=zA:\string#1}{#2}}

\def \definedesignalternative #1#2#3{%          {\name}{required?}{choice1,...}
  \definecount{#1}{-1}%
  \if \undefinedp{\=zA:\string#1}%
    \if #2%
      \error{altreq}{The design alternative `\string#1' must be specified}%
    \else
      \zdefalt{#1}#3,\zmark
    \fi
  \fi
  \commalist{\zaltlist}{#3}%
  \tcounta = -1\relax
  \maplist{\zcompalt{#1}{##1}}{\zaltlist}%
  \if \negp{#1}%
    \error{altinv}{The design alternative `\string#1' is invalid}%
  \fi}

\def \zdefalt #1#2,#3\zmark{%                   {\name}choice1,...\zmark
  \designalternative{#1}{#2}}

\def \zcompalt #1#2{%                           {\name}{choice}
  \increment \tcounta
  \stringeql{\znext}{\name{\=zA:\string#1}}{#2}%
  \if \znext \global#1 = \tcounta \fi \relax}

\let \altcase = \ifcase

%                       Document Parameters
%                       -------- ----------


% The following PDF document information options are available.

\chardef \PDFinfodefault = 0
\chardef \PDFinfofull    = 1
\chardef \PDFinfocomp    = 2
\chardef \PDFinfonone    = 3


% Integer parameters:

\adjdemerits = 10000            % Adjacent incompatible lines.
\binoppenalty = 700             % Line break after binary operator.
%\brokenpenalty = 0             % See \even and \oddbrokenpenalty.
\clubpenalty = 500              % Club line at bottom of page.
\defaulthyphenchar = `\-        % Default hyphen character.
\defaultskewchar = -1           % Default skew character.
\delimiterfactor = 941          % Math delimiter size factor.
\displaywidowpenalty = 500      % Widow line above math display.
\definecount{\dollarhyph}{0}    % 0: no hyphenation after dollar signs;
                                % 1: hyphenate after, but nowhere else;
                                % 2: hyphenate after and other places.
\doublehyphendemerits = 80000   % Consecutive hyphenated lines.
\errorcontextlines = 8          % Maximum error context line pairs.
\definecount{\evenbrokenpenalty}{3000}  % Column breaks after hyphenated
                                        % line, but on same spread.
\exhyphenpenalty = 0            % Line break after explicit hyphen.
\finalhyphendemerits = 10000    % Penultimate hyphenated line.
\hbadness = 1000                % Above which bad hboxes are shown.
\hyphenpenalty = 50             % Line break after discretionary hyphen.
\interlinepenalty = 0           % Between lines of a paragraph.
\language = 0                   % Current set of hyphenation rules.
\lefthyphenmin = 2              % Shortest fragment at beginning of
                                % hyphenated word.
\linepenalty = 10               % Increment at each line break.
\definecount{\lineslong}{0}     % Number of lines page can go long.
\definecount{\linesperpage}{0}  % Number of lines per page.
\definecount{\linesshort}{0}    % Number of lines page can go short.
\definecount{\maxbottomcolumnfloats}{1} % Floats at column bottom.
\definecount{\maxbottompagefloats}{1}   % Floats at page bottom.
\definecount{\maxtopcolumnfloats}{1}    % Floats at column top.
\definecount{\maxtoppagefloats}{1}      % Floats at page top.
\definecount{\mintextpercent}{10} % Percent of page that must have text.
\newlinechar = -1               % Newline character for \write.
\definecount{\newmath}{0}       % Revision level of math---DEPRECATED.
\definecount{\oddbrokenpenalty}{10000}  % Spread breaks after
                                        % hyphenated line.
\definecount{\PDFinfo}{\PDFinfodefault} % Include document info in final PDF file.
\pretolerance = 400             % Badness tolerated before hyphenation.
\relpenalty = 500               % Line break after relation operator.
\righthyphenmin = 3             % Shortest fragment at end of hypenated word.
\definecount{\shrinkpercent}{10}        % Percentage shrink is of nominal.
\definecount{\stretchpercent}{25}       % Percentage of the maximum stretch.
\definecount{\tabularversion}{0}        % Version of tabular facility.
\tolerance = \pretolerance      % Badness tolerated after hyphenation.
\tracinglostchars = 1           % Positive to trace lost characters.
\definecount{\tracingpagemakeup}{0}     % Positive to trace page makeup.
\tracingstats = 1               % Positive to trace memory statistics.
\uchyph = 1                     % Positive to hyphenate Capitalized words.
\definecount{\underscorehyph}{1}        % See \dollarhyph.
\vbadness = 2000                % Above which bad vboxes are shown.
\widowpenalty = 10000           % Widow line at top of page.
\definecount{\xrefcites}{0}     % Cross-reference \cite's:
                                %   0: no
                                %   1: simple xref entry
                                %   2: custom xref entry

% Flag Parameters:

\setflag \allowcolor = \true            % Allow color specials?
\setflag \allowreftitle = \false        % Allow use of \reftitle?
\setflag \baselinetoprules = \true      % Rules at page top sit on baseline?
\setflag \DVIWindoinuse = \false        % Generate DVIWindo-specific goodies?
\setflag \DVIWindorules = \false        % Display page makeup rules? [deprecated]
\setflag \forceepsbb = \false           % Force reading of EPS bounding box?
\setflag \indexcites = \false           % \cite generates indexing command?
\setflag \newbiblio = \false            % Use new biblio facility?
\setflag \newdots = \false              % Use new \xdots commands?
\setflag \newrunners = \false           % Use new runners scheme?
\setflag \newtabular = \false           % Use new tabular module? [deprecated]
\setflag \newtitleadjustment = \false   % Use new title adjustment scheme?
\setflag \PDFhyperlinks = \false        % Generate PDF hyperlinks?
\setflag \raggedbottom = \false         % Ragged-bottom pages?
\setflag \risingbottomfloats = \false   % Bottom floats rise up on page?
\setflag \risingfootnotes = \false      % Footnotes rise up on page?
\setflag \topdeltaadjustment = \false   % Use \topdelta?
\setflag \zcommonencoding = \false      % Set with \commonencoding command.

% Dimension Parameters:

\boxmaxdepth = \maxdimen        % Maximum depth of explicit vboxes.
\delimitershortfall = 4pt       % Maximum math delimiter shortfall.
\emergencystretch = 4pt         % Emergency stretchability of each line.
\definedimen{\evenbleedshift}{0pt}      % Bleed shift for versos.
\definedimen{\eveninnermargin}{0pt}     % Inner margin (gutter) for versos.
\definedimen{\evenlefttextmargin}{0pt}  % Left text margin for versos.
\definedimen{\evenoutermargin}{0pt}     % Outer margin for versos.
\definedimen{\evenrighttextmargin}{0pt} % Right text margin for versos.
\definedimen{\footerheight}{0pt}        % Height of footer box.
\definedimen{\headerheight}{0pt}        % Height of running head.
\definedimen{\headmargin}{0in}          % Head (top) margin.
\hfuzz = 0.33pt                 % Overrun before overfull hbox messages.
\hoffset = 0pt                  % Overall horizontal offset.
\zremovePlaindef \jot
\definedimen{\jot}{3pt}         % Increment for opening up math displays.
\lineskiplimit = 0pt            % Threshold where \lineskip is used
                                % instead of \baselineskip.
\let \linewidth = \hsize        % Alternate name for \hsize.
\maxdepth = 4pt                 % Maximum depth of boxes on main pages.
\zremovePlaindef \normallineskiplimit
\definedimen{\normallineskiplimit}{0pt} % Normal line skip limit.
\nulldelimiterspace = 1.2pt             % Width of a null delimiter.
\definedimen{\oddbleedshift}{0pt}       % Bleed shift for rectos.
\definedimen{\oddinnermargin}{0pt}      % Inner margin (gutter) for rectos.
\definedimen{\oddlefttextmargin}{0pt}   % Left text margin for rectos.
\definedimen{\oddoutermargin}{0pt}      % Outer margin for rectos.
\definedimen{\oddrighttextmargin}{0pt}  % Right text margin for rectos.
\overfullrule = 6pt             % Width of rule appended to overfull boxes.
\parindent = 0pt                % Width of paragraph indent.
\definedimen{\parrag}{0pt}      % Raggedness of paragraph lines.
\scriptspace = .25pt            % Extra space after a sub/superscript.
\splitmaxdepth = \maxdimen      % Maximum depth of boxes on split pages.
\definedimen{\standardbleed}{.125in}    % Standard bleed required by press.
\definedimen{\standardindent}{0pt}      % Standard indentation amount.
\definedimen{\textareaheight}{\mindimen}% Height of text area.
\definedimen{\textmeasure}{0pc}         % Width of text area.
\let \textareawidth = \textmeasure
\definedimen{\topdelta}{0pt}            % \topskip - height(first line).
\definedimen{\trimheight}{0in}          % Trimmed paper height.
\definedimen{\trimwidth}{0in}           % Trimmed paper width.
\definedimen{\trimplusbleedheight}{0in} % Trim plus bleed top and bottom.
\definedimen{\trimplusbleedwidth}{0in}  % Trim plus bleed both sides.
\definedimen{\typeareaheight}{\mindimen}% Height of type area.
\definedimen{\typeareawidth}{0pt}       % Width of type area.
\vfuzz = 0.5pt                  % Overrun before overfull vbox messages.
\voffset = 0pt                  % Overall vertical offset.

% Skip (glue) Parameters:

\leftskip = 0pt                 % At left end of paragraph lines.
\lineskip = 0pt                 % When \baselineskip isn't possible.
\zremovePlaindef \normalbaselineskip
\defineskip{\normalbaselineskip}{0pt}   % Normal baseline distance.
\zremovePlaindef \normallineskip
\defineskip{\normallineskip}{0pt}       % Normal line skip limit.
\parfillskip = 0pt plus 1fil    % Additional \rightskip at paragraph end.
\parskip = 0pt                  % Above paragraphs.
\rightskip = 0pt                % At right end of lines.
\spaceskip = 0pt                % Between words (if nonzero).
\splittopskip = 10pt            % At top of split pages.
\defineskip{\standardskip}{0pt} % Standard skip above/below elements.
\topskip = \mindimen            % At top of main pages.
\xspaceskip = 0pt               % Between sentences (if nonzero).

% Muskip (mu glue) Parameters:

\definemuskip{\fracbarhang}{0mu}        % Fraction bar overhang.
\thinmuskip = 0mu               % Math space after punctuation.
\medmuskip = 0mu                % Math space around binary operators.
\thickmuskip = 0mu              % Math space around relational operators.

% Token list parameters:

\definetoks{\annotationfont}    % Font for annotations (e.g., proof identification).
\annotationfont = {cmssi10 at 7pt}
\definetoks{\baselinemultiplier}% Multiplier for baselines.
\baselinemultiplier = {1}
\definetoks{\decimalpoint}      % Decimal point character.
\decimalpoint = {.}
\definetoks{\PDFbuttoncolor}    % Color of hyperlinked text.
\definetoks{\matrixspread}      % Baseline multiplier for matrices.
\matrixspread = {1.0}

% The following parameters are fixed and hidden from the user.

\mathsurround = 0pt             % Space around a math formula in text.

%                       Parameter Calculation
%                       --------- -----------


\def \calculatetextareaheight #1{%                              {lines}
  \relax
  \if \dimnegp{\topskip}%
    \error{misstopskip}{The value of \string\topskip must be set}%
  \fi
  {\global\linesperpage = #1\relax
   \tcounta = #1\relax
   \decrement \tcounta
   \textareaheight = \the\tcounta\baselineskip
   \global\advance \textareaheight by \topskip
   \measurecapheight{\topdelta}%
   \measureascenderheight{\tdimena}%
   \if \dimgtrp{\tdimena}{\topdelta}\topdelta = \tdimena \fi
   \advance \topdelta by -\topskip
   \global\negate \topdelta}}

\def \calculatetypeareaheight #1#2{%                    {head-height}{head-b/b}
  \relax
  \if \dimnegp{\textareaheight}%
    \error{misstah}{The value of \string\textareaheight must be set}%   
  \fi
  {\typeareaheight = \textareaheight
   \advance \typeareaheight by -\topskip
   \advance \typeareaheight by #1\relax
   \advance \typeareaheight by #2\relax
   \global\advance \typeareaheight by \footerheight
   \headerheight = #1\relax
   \advance \headerheight by #2\relax
   \global\advance \headerheight by -\topskip}}

\def \calculateoffsets #1#2{%                   {sheet-width}{sheet-height}
  \relax
  \if \andp{\dimposp{\trimwidth}}{\dimposp{\trimheight}}%
    \hoffset = #1\relax
    \advance \hoffset by -\trimwidth
    \divide \hoffset by 2
    \advance \hoffset by -1in
    \voffset = #2\relax
    \advance \voffset by -\trimheight
    \divide \voffset by 2
    \advance \voffset by -1in\relax
  \else
    \error{misstrim}{The values of \string\trimwidth and
                     \string\trimheight must be set}%
  \fi}

\def \calculatepdfoffsets #1#2#3{%      {virtual-width}{virtual-height}{bleeds?}
  \relax
  \if \andp{\dimposp{\trimwidth}}{\dimposp{\trimheight}}%
    \hoffset = -1in
    \if #3\advance \hoffset by \standardbleed \fi
    \calculate \voffset = {#2,-,\trimheight,-,1in}%
    \if #3\advance \voffset by -\standardbleed \fi
  \else
    \error{misstrim}{The values of \string\trimwidth and
                     \string\trimheight must be set}%
  \fi}

\def \setskip #1=#2#3#4{%        \parameter = {nominal}{max-stretch}{[shrink]}
  \tdimena = #2\relax
  \calculate \tdimenb = {#3,P,\stretchpercent}%
  \if \emptyargp{#4}%
    \calculate \tdimenc = {\tdimena,P,\shrinkpercent}%
  \else
    \tdimenc = #4\relax
  \fi
  #1 = \the\tdimena plus \the\tdimenb minus \the\tdimenc\relax}

\def \fromtrim #1{%                             \setskip or \register
  \if \tokeqlp{#1}{\setskip}%
    \let \znext = \zfromtrima
  \else
    \def \zfromtrimreg {#1}%
    \let \znext = \zfromtrimb
  \fi
  \znext}

\def \zfromtrima #1=#2#3#4{%
  \setskip #1={#2}{#3}{#4}%
  \advance #1 by -\headmargin}
  
\def \zfromtrimb {%
  \afterassignment\zfromtrimc \zfromtrimreg}

\def \zfromtrimc {%
  \advance \zfromtrimreg by -\headmargin}

%                       Document Block
%                       -------- -----


\def \document {%
  % There is no point to embedding the entire document in a group.
  % \documentdesign was already invoked by \loaddesign.
  \zpushblock{document}%
  \xdef \znext {%
    \noexpand\definefont \noexpand\zannofont{\the\annotationfont}}
  \znext
  \zfontsummary{\false}%
  \zopentfmlist
  \zwritePDFinfo
  \zpageinit
  \zpushvcontext
  \setparrag{\parrag}%
  \zxrefinit
  \zbiblioinit
  \zindexinit
  \zfloatinit
  \setpagecolumns{}{1}{0pt}%
  \if \definedp{\documentprolog}\documentprolog \fi}

\def \enddocument {%
  \endgraf
  \if \definedp{\documentepilog}\documentepilog \fi
  \closeanychapter
  \closeanysection
  \zpopblock{document}%
  \freshpage{\short\floats\any}%
  \zindexfinal
  \zxreffinal
%%%  \zbibfinal
  \zmissingartmsg
  \ztagsummary
  \zpopvcontext
  \zlayoutsummary
  \zfontsummary{\true}%
  \zwritetfmlist
  \if \posp{\tracingstats}\zregstats \fi
  \zfeaturewarns
  \ztodomsg
  \zdivmsg
  \zproofidfile
  \zend}

\def \zfeaturewarns {%
  \messagenl{_}%
  \if \zoverlayset
    \remark{Overlays are present on each page.}%
  \fi
  \zproofident}

\def \zproofident {%
  \zproofidentline
  \if \emptytoksp{\zproofid}%
    \messagenl{|  No proof identification.}%
  \else
    \messagenl{|  \the\zproofid\space\space
                  \number\year/\number\month/\number\day\space
                  \formattime\space\space\space
                  \inicompositor}%
  \fi
  \zproofidentline}

\def \zproofidentline {%
  \messagenl{+-----------------------------------------------------------------------------_}}

%                       Write PDF Document Information
%                       ----- --- -------- -----------


\def \zwritePDFinfo {%
  \ifcase \PDFinfo
    \relax
  \or
    \special{PDF: Title \booktitle}%
    \special{PDF: Author \bookauthor}%
    \special{PDF: Subject}%
    \special{PDF: Keywords Publisher: \bookpublisher,
                           Compositor: \inicompositor}%
  \or
    \special{PDF: Title}%
    \special{PDF: Author}%
    \special{PDF: Subject}%
    \special{PDF: Keywords Compositor: \inicompositor}%
  \or
    \special{PDF: Title}%
    \special{PDF: Author}%
    \special{PDF: Subject}%
    \special{PDF: Keywords}%
  \fi}

%                       Disable \end
%                       ------- ----


\let \zend = \end

\def \end {%
  \error{noend}{Do not use the TeX \string\end\space command}}