%D \module
%D   [       file=page-num, % moved here from main-001
%D        version=1997.03.31,
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=Numbering,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{Context Core Macros / Numbering}

% todo: {}{}{} ipv ...--...-...-...--... in pag ref

\unprotect

% \gotonextsubpage  : voor de pagebody
% \subpaginanummer  : alleen in de voet/kopregels
% \aantalsubpaginas : alleen in de voet/kopregels

% \firstsubpage     : eerste \realpageno, voor interne doeleinden
% \prevsubpage      : vorige \realpageno, voor interne doeleinden
% \nextsubpage      : volgende \realpageno, voor interne doeleinden
% \lastsubpage      : laatste \realpageno, voor interne doeleinden
% \nofsubpages      : laatste subpage (in berekeningen)
% \subpageno        : huidige subpage (in berekeningen)

\newif\ifsubpaging
\newif\ifshowingsubpage

\definenumber
  [\s!subpage]

\setupnumber
  [\s!subpage]
  [\c!way=\@@snway]

% hard to sync
%
% \def\resetsubpagenumber%
%   {\resetnumber[\s!subpage]%
%    \global\subpageno=\rawnumber[\s!subpage]}
%
% better sync

\newif\ifresettingsubpagenumber

\def\resetsubpagenumber
  {\global\resettingsubpagenumbertrue}

% so far for sync, see \gotonext...

\def\dosetupsubpagenumber[#1]%
  {\doifelse{#1}\v!reset
     \resetsubpagenumber % \resetnumber[\s!subpage]
     {\getparameters[\??sn][#1]%
      \processaction
        [\@@snstate]
        [  \v!stop=>\ifsubpaging
                      \resetsubpagenumber % new, see sync
                    \else
                      \subpagingfalse
                    \fi
                    \showingsubpagefalse,
          \v!start=>\subpagingtrue
                    \showingsubpagetrue,
           \v!none=>\subpagingtrue
                    \showingsubpagefalse]}}

\def\numberofsubpages
  {\ifshowingsubpage\nofsubpages\else0\fi}

\def\subpagenumber
  {\ifshowingsubpage\the\subpageno\else0\fi}

\def\setupsubpagenumber
  {\dosingleargument\dosetupsubpagenumber}

\def\newnofsubpages{0}
\def\nofsubpages   {0}
\def\firstsubpage  {1}
\def\prevsubpage   {1}
\def\nextsubpage   {1}
\def\lastsubpage   {1}

\def\nextpage      {1}
\def\prevpage      {1}

\definetwopasslist\s!subpage

\def\savenofsubpages
  {\ifsubpaging
     \showmessage\m!layouts6{\newnofsubpages,\the\subpageno}%
     \immediatewriteutilitycommand
        {\twopassentry%
           {\s!subpage}%
           {\newnofsubpages}%
           {\the\subpageno}}%
   \fi}

\def\setsubpagenumbers
  {\iftwopassdatafound
     \bgroup
     \xdef\nofsubpages  {\twopassdata}%
     \xdef\firstsubpage {\realfolio}%
     \advance\realpageno \nofsubpages
     \advance\realpageno \minusone
     \xdef\lastsubpage  {\realfolio}%
     \egroup
   \else
     \xdef\nofsubpages{0}%
   \fi}

\def\gotonextsubpage % overlapt behoorlijk met realpage macro
  {\global\let\checksubpages\relax
   \ifresettingsubpagenumber
     \resetnumber[\s!subpage]%
     \global\resettingsubpagenumberfalse
   \fi
   \ifsubpaging
     \edef\oldsubpage{\the\subpageno}%
     \incrementnumber[\s!subpage]%
     \global\subpageno\rawnumber[\s!subpage]\relax
     \ifnum\subpageno=\plusone
       \gettwopassdata\s!subpage
       \setsubpagenumbers
       \ifnum\oldsubpage>\zerocount
         \showmessage\m!layouts6{\newnofsubpages,\oldsubpage}%
         \edef\next % \expanded
           {\writeutilitycommand%
              {\twopassentry%
                 {\s!subpage}%
                 {\newnofsubpages}%
                 {\oldsubpage}}}%
         \next
       \fi
       \doglobal\increment\newnofsubpages\relax
     \fi
     \setglobalsystemreference\rt!page\v!firstsubpage\firstsubpage
     \setglobalsystemreference\rt!page\v!lastsubpage\lastsubpage
     \bgroup
     \ifnum\realpageno=\firstsubpage\relax
       \global\let\prevsubpage\firstsubpage
       \setglobalsystemreference\rt!page\v!subbackward\lastsubpage
     \else
       \xdef\prevsubpage{\realfolio}%
       \doglobal\decrement\prevsubpage
       \setglobalsystemreference\rt!page\v!subbackward\prevsubpage
     \fi
     \setglobalsystemreference\rt!page\v!previoussubpage\prevsubpage
     \ifnum\realpageno=\lastsubpage\relax
       \global\let\nextsubpage\lastsubpage
       \setglobalsystemreference\rt!page\v!subforward\firstsubpage
     \else
       \xdef\nextsubpage{\realfolio}%
       \doglobal\increment\nextsubpage
       \setglobalsystemreference\rt!page\v!subforward\nextsubpage
     \fi
     \setglobalsystemreference\rt!page\v!nextsubpage\nextsubpage
     \egroup
   \fi}

\def\checksubpages
  {\getfromtwopassdata\s!subpage1%
   \setsubpagenumbers
   \global\let\checksubpages\relax}

% Omdat \gotonextrealpage gebruik maakt van de hulpfile,
% moet het initialiseren van \realpageno plaatsvinden in
% een later stadium, namelijk zodra referenties worden
% gebruikt (anders gaat het mis op nog niet gedefinieerde
% lijstcommando's e.d.). De eerst aanroep vindt dan ook
% plaats vlak nadat de hulpfile voor de eerste maal is
% ingelezen.

\countdef\realpageno = 0   \realpageno = 1
\countdef\userpageno = 1   \userpageno = 1
\countdef\subpageno  = 2   \subpageno  = 0 % !!
\countdef\arrangeno  = 3   \arrangeno  = 0 % !!

% we don't want conflicts when \pageno is used by other
% packages, like CWEB, so we redefine \pageno

\newcount\pageno           \pageno     = 1

\def\setuserpageno#1%
  {\global\userpageno#1\relax
   \global\pageno\userpageno}

\def\realfolio     {\the\realpageno}
\def\folio         {\the\userpageno}
\def\firstpage     {1}
\def\lastpage      {1}
\def\currentpage   {\the\realpageno}
\def\lastpagenumber{1}

\def\gotonextrealpage
  {\global\advance\realpageno \plusone\relax
   \ifnum\realpageno>\lastpage
     \xdef\lastpage{\realfolio}%
   \fi
   \setglobalsystemreference\rt!page\v!firstpage \firstpage
   \setglobalsystemreference\rt!page\v!lastpage\lastpage
   \bgroup
   \ifnum\realpageno>\plusone
     \advance\realpageno \minusone
     \xdef\prevpage{\realfolio}%
     \setglobalsystemreference\rt!page\v!backward\prevpage
   \else
     \global\let\prevpage\firstpage
     \setglobalsystemreference\rt!page\v!backward\lastpage
   \fi
   \setglobalsystemreference\rt!page\v!previouspage\prevpage
   \egroup
   \bgroup
   \ifnum\realpageno<\lastpage\relax
     \advance\realpageno \plusone
     \xdef\nextpage{\realfolio}%
     \setglobalsystemreference\rt!page\v!page\nextpage
     \setglobalsystemreference\rt!page\v!forward\nextpage
     \bgroup
     \xdef\nextnextpage{\realfolio}%
     \ifodd\realpageno
       \setglobalsystemreference\rt!page\v!nextoddpage\nextnextpage
     \else
       \setglobalsystemreference\rt!page\v!nextevenpage\nextnextpage
     \fi
     \advance\realpageno \plusone
     \xdef\nextnextpage{\realfolio}%
     \ifnum\realpageno>\lastpage\relax
      %\ifodd\realpageno
      %  \setglobalsystemreference\rt!page\v!nextoddpage\lastpage
      %\else
      %  \setglobalsystemreference\rt!page\v!nextevenpage\lastpage
      %\fi
     \else
       \ifodd\realpageno
         \setglobalsystemreference\rt!page\v!nextoddpage\nextnextpage
       \else
         \setglobalsystemreference\rt!page\v!nextevenpage\nextnextpage
       \fi
     \fi
     \egroup
   \else
     \global\let\nextpage\lastpage
     \setglobalsystemreference\rt!page\v!page\firstpage
     \setglobalsystemreference\rt!page\v!forward\firstpage
     \setglobalsystemreference\rt!page\v!nextoddpage\lastpage
     \setglobalsystemreference\rt!page\v!nextevenpage\lastpage
   \fi
   \setglobalsystemreference\rt!page\v!nextpage\realfolio
   \egroup}

\def\checkrealpage
  {\global\realpageno\zerocount
   \gotonextrealpage
   \global\let\checkrealpage\relax}

\def\savenofpages
  {\bgroup
   \advance\realpageno \minusone
   \savecurrentvalue\lastpage\realfolio
   \advance\userpageno \minusone
   \savecurrentvalue\lastpagenumber\folio
   \egroup}

\def\totalnumberofpages
  {\lastpage}

\def\setpagecounters
  {\setuserpageno{\rawnumber[\s!page]}%
   \doifelse\@@snstate\v!stop
     {\global\subpageno\zerocount}
     {\global\subpageno\rawnumber[\s!subpage]}\relax}

% Standaard is \count0 in Plain TeX de paginateller. Omwille
% van de afhandeling van lokaal nummeren, definieren we
% echter een eigen nummer.

\definenumber
  [\s!page]
  [\c!conversion=\@@nmconversion,
   \c!way=\@@nmway,
   \c!state=\@@nmstate,
   \c!start=1]

% \@@pnstatus global, but \@@nmstatus local and only start/stop

\global\let\@@pnstate\@@pnstate

\def\dosetuppagenumber[#1]%
  {\getparameters[\??pn][\c!number=,#1]%
   \global\let\@@pnstate\@@pnstate
   \doifsomething\@@pnnumber
     {\setnumber[\s!page]{\@@pnnumber}%
      \setuserpageno{\rawnumber[\s!page]}}%
   % this makes starting at an even page possible
   \ifnum\realpageno=1 \ifodd\pageno \else
     \global\shiftedrealpagenotrue
   \fi \fi}

\def\setuppagenumber
  {\dosingleargument\dosetuppagenumber}

% long time used alternative
%
% \def\verlaagpaginanummer
%   {\doifinset{\@@pnstatus}{\v!start,\v!leeg,\v!geen}
%      {\decrementnumber[\s!page]%
%       \setuserpageno{\rawnumber[\s!page]}}}
%
% \def\verhoogpaginanummer
%   {\doifinset{\@@pnstatus}{\v!start,\v!leeg,\v!geen}
%      {\incrementnumber[\s!page]%
%       \setuserpageno{\rawnumber[\s!page]}}%
%    \doifinset{\@@pnstatus}{\v!handhaaf,\v!leeg}
%      {\global\let\@@pnstatus\v!start}}
%
% alternative, saves some 3 sec on 10K pages on a 1G machine
% (needed during a test / prelude to installable methods)

\def\dodecrementpagenumber
  {\decrementnumber[\s!page]\setuserpageno{\rawnumber[\s!page]}}

\def\doincrementpagenumber
  {\incrementnumber[\s!page]\setuserpageno{\rawnumber[\s!page]}}

\def\dosynchronizepagenumber
  {\global\let\@@pnstate\v!start}

\def\verlaagpaginanummer{\getvalue{\??pn-\@@pnstate}}
\def\verhoogpaginanummer{\getvalue{\??pn+\@@pnstate}}

\letvalue{\??pn-\v!start   }\dodecrementpagenumber
\letvalue{\??pn-\v!none    }\dodecrementpagenumber
\letvalue{\??pn-\v!empty    }\dodecrementpagenumber

\letvalue{\??pn+\v!start   }\doincrementpagenumber
\letvalue{\??pn+\v!none    }\doincrementpagenumber
\setvalue{\??pn+\v!empty   }{\doincrementpagenumber
                            \dosynchronizepagenumber}
\letvalue{\??pn+\v!keep}\dosynchronizepagenumber

% so far

\def\checkpagecounter
  {\checknummer{\s!page}}

% \getpagestatus
% \ifrightpage als odd/enkelzijdig

\newif\ifrightpage \rightpagetrue

\newcounter \nofpagesets

\definetwopasslist\s!page

\def\dopagesetreference
  {\doglobal\increment\nofpagesets\relax
   \edef\writepagref
     {\writeutilitycommand
        {\twopassentry
           {\s!page}%
           {\nofpagesets}%
           {\noexpand\realfolio}}}%
   \writepagref}

\def\getpagestatus % hierboven gebruiken
  {\ifdubbelzijdig
     \gettwopassdata\s!page
     \iftwopassdatafound \else
       \let\twopassdata\realpageno
     \fi
     \ifodd\twopassdata
       \global\rightpagetrue
     \else
       \global\rightpagefalse
     \fi
     \dopagesetreference
   \else
     \global\rightpagetrue
   \fi}

\def\@@nmin       {} % kan vervallen  (upward compatibility)
\def\@@nmlocation {} % mag {plaats, in} zijn

\newcounter\@@pagenumberlocation

\def\do@@plaatspaginanummer#1%
  {\ifnum#1=\@@pagenumberlocation\@@plaatspaginanummer\fi}

\def\dodosetpagenumberlocation#1% tricky because of ...texts
  {\increment\@@pagenumberlocation
   \ifx\@@nmlocation\empty\else
     \def\dododosetpagenumberlocation##1%
       {\donetrue
        \setevalue{\??tk#1##1}{\noexpand\do@@plaatspaginanummer{\@@pagenumberlocation}}}%
     \donefalse
     \ExpandFirstAfter\processallactionsinset
       [\@@nmlocation]
       [    \v!middle=>\dododosetpagenumberlocation{\v!text\c!middletext},
              \v!left=>\dododosetpagenumberlocation{\v!text\c!lefttext},
             \v!right=>\dododosetpagenumberlocation{\v!text\c!righttext},
            \v!inleft=>\dododosetpagenumberlocation{\v!margin\c!lefttext},
           \v!inright=>\dododosetpagenumberlocation{\v!margin\c!righttext},
          \v!inmargin=>\dododosetpagenumberlocation{\v!margin\ifdubbelzijdig\c!margintext\else\c!righttext\fi},
            \v!margin=>\dododosetpagenumberlocation{\v!margin\ifdubbelzijdig\c!margintext\else\c!righttext\fi},
          \v!atmargin=>\dododosetpagenumberlocation{\v!text\c!marginedgetext},
        \v!marginedge=>\dododosetpagenumberlocation{\v!text\c!marginedgetext}]%
     \ifdone \else
       \dododosetpagenumberlocation{\v!text\c!middletext}% default
     \fi
   \fi}

\def\dosetpagenumberlocation
  {\ExpandBothAfter\doifinsetelse\v!header{\@@nmlocation,\@@nmin}
     {\dodosetpagenumberlocation\v!header}
     {\dodosetpagenumberlocation\v!footer }}

\def\dosetuppagenumbering[#1]%
  {\getparameters[\??nm][#1]%
   \preparepageprefix\??nm
   \enkelzijdigfalse
   \dubbelzijdigfalse
   \ExpandFirstAfter\processallactionsinset
     [\@@nmalternative]
     [ \v!singlesided=>\enkelzijdigtrue,
      \v!doublesided=>\dubbelzijdigtrue]%
   \ifx\trackingmarginnotestrue\undefined\else
     \ifdubbelzijdig
       \trackingmarginnotestrue
     \else
       \trackingmarginnotesfalse
     \fi
   \fi
   \dosetpagenumberlocation
   \recalculatebackgrounds
   \recalculatelogos}

\def\setuppagenumbering
  {\dosingleempty\dosetuppagenumbering}

\let\stelnummeringin\setuppagenumbering

% listig: hangt af van \@@kolijst

% erg fout
%
% \def\preparepageprefix#1%
%   {\def\dopreparepageprefix##1%
%      {\doifvalue{#1##1\c!nummer}{\v!ja}
%         {\setvalue{#1\getvalue{\??by##1}\c!nummer}{\v!ja}}}%
%    \processcommacommand[\@@kolijst]\dopreparepageprefix}
%
% nog fouter
%
% \def\preparepageprefix#1%
%   {\def\dopreparepageprefix##1%
%      {\doifelsevalue{#1##1\v!nummer}{\v!ja}                    % v
%         {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!ja}}     % v
%         {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!nee}}}%  % v
%    \processcommacommand[\@@kolijst]\dopreparepageprefix}
%
% best, beware, chapter (yes) can be followed by title (no)

\def\preparepageprefix#1%
  {\def\dopreparepageprefix##1%
     {\letvalue{#1\getvalue{\??by##1}\v!number}\v!no}%  %v
   \rawprocesscommalist[\@@kolist]\dopreparepageprefix
   \def\dopreparepageprefix##1%
     {\doifvalue{#1##1\v!number}\v!yes                    %v
        {\letvalue{#1\getvalue{\??by##1}\v!number}\v!yes}}%
   \rawprocesscommalist[\@@kolist]\dopreparepageprefix}

\def\dodopageprefix#1% uti seperator --
  {\let\normaluchar\uchar \let\uchar\relax % ugly but needed
   \doifelsevalue{\pageprefixtype#1\v!number}\v!yes % \v! and no \c!
     {\edef\preprefix {\@@filterheadpart[\postprefix]}%
      \edef\postprefix{\@@filtertailpart[\postprefix]}%
      \let\uchar\normaluchar % ugly but needed
      \ifx\preprefix\empty \else
        \ifx\preprefix\zerocountervalue\else
          \preprefix\@@nmnumberseparator
        \fi
      \fi}
     {\edef\postprefix{\@@filtertailpart[\postprefix]}%
      \let\uchar\normaluchar}} % ugly but needed

\def\dopageprefix#1%
  {\dodopageprefix{#1}%
   \donexttracklevel{#1}}

\def\pageprefix#1[#2]%
  {\bgroup
   \edef\pageprefixtype{#1}%
   \edef\postprefix{\@@filternumberpart[#2]}%
   \let\donexttrackcommando\dopageprefix
   \donexttrackcommando\firstsection
   \egroup}

%D It was Marco Kuhlmann who uncovered the missing strut. This
%D was a pretty old bug kind of covered up by the fact that non
%D oldstyle numbers are about as high as strutheight. Rather
%D interesting that it went unnoticed for so long.

\unexpanded\def\@@plaatspaginanummer % called in empty tests
  {\doif{\@@nmstate\@@pnstate}{\v!start\v!start}
     {{\doif\@@nmstrut\v!yes\strut
       \@@nmcommand{\doattributes\??nm\c!style\c!color{\completepagenumber}}}}}

\def\@@plaatspaginascheider% still used ?
  {\doif{\@@nmstate\@@pnstate}{\v!start\v!start}\@@nmtextseparator}

\def\userfolio {\convertednumber[\s!page]}  %  naast realfolio
\def\pagenumber{\userfolio}

\def\pageprefixes
  {\let\donexttrackcommando\dopageprefixes
   \donexttrackcommando\firstsection}

\def\dopageprefixes#1%
  {\doifvalue{\??nm#1\v!number}\v!yes  % v
     {\ifnum\countervalue{\??se#1}>\zerocount
        \getvalue{#1\c!number}\@@nmnumberseparator
      \fi}%
   \doifsomething\@@nmtext{\@@nmtext\@@nmnumberseparator}% strange option, what was the purpose of text?
   \donexttracklevel{#1}}

\unexpanded\def\completepagenumber
  {\doif{\@@nmstate\@@pnstate}{\v!start\v!start}
     {\@@nmleft\labeltexts\v!pagenumber{\pageprefixes\pagenumber}\@@nmright}}

\unexpanded\def\placepagenumber
  {\doif{\@@nmstate\@@pnstate}{\v!start\v!start}
     {\labeltexts\v!pagenumber{\pagenumber}}}

% Nog een variant; wat is een goeie naam?

% \unexpanded\def\placexxpagenumber
%   {\@@plaatspaginanummer}

% \def\translatednumber[#1::#2::#3]{#3}

\def\translatednumber{\@@filterpagepart}

\unexpanded\def\referencepagenumber[#1]%
  {\doifelsenothing{#1}{?}%
     {\preparepageprefix\??rf
      \pageprefix\??rf[#1]\translatednumber[#1]}}

\setuppagenumber
  [\c!state=\v!start,
   \c!number=1]

\setupsubpagenumber
  [\c!way=\v!by\v!part,
   \c!state=\v!stop]

\protect \endinput
