%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)}

\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

\definieernummer
  [\s!subpage]

\stelnummerin
  [\s!subpage]
  [\c!wijze=\@@snwijze]

% hard to sync 
%
% \def\resetsubpaginanummer%
%   {\resetnummer[\s!subpage]%
%    \global\subpageno=\ruwenummer[\s!subpage]}
%
% better sync 

\newif\ifresettingsubpagenumber 

\def\resetsubpaginanummer
  {\global\resettingsubpagenumbertrue}

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

\def\dostelsubpaginanummerin[#1]%
  {\doifelse{#1}{\v!reset}
     {\resetsubpaginanummer} % \resetnummer[\s!subpage]
     {\getparameters[\??sn][#1]%
      \processaction
        [\@@snstatus]
        [  \v!stop=>\ifsubpaging
                      \resetsubpaginanummer % new, see sync 
                    \else
                      \subpagingfalse
                    \fi
                    \showingsubpagefalse,
          \v!start=>\subpagingtrue
                    \showingsubpagetrue,
           \v!geen=>\subpagingtrue
                    \showingsubpagefalse]}}

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

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

\def\stelsubpaginanummerin
  {\dosingleargument\dostelsubpaginanummerin}

\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 
     \resetnummer[\s!subpage]%  
     \global\resettingsubpagenumberfalse
   \fi
   \ifsubpaging
     \edef\oldsubpage{\the\subpageno}%
     \verhoognummer[\s!subpage]%
     \global\subpageno\ruwenummer[\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!eerstesubpagina\firstsubpage
     \setglobalsystemreference\rt!page\v!laatstesubpagina\lastsubpage
     \bgroup
     \ifnum\realpageno=\firstsubpage\relax
       \global\let\prevsubpage\firstsubpage
       \setglobalsystemreference\rt!page{\v!sub\v!achteruit}\lastsubpage
     \else
       \xdef\prevsubpage{\realfolio}%
       \doglobal\decrement\prevsubpage
       \setglobalsystemreference\rt!page{\v!sub\v!achteruit}\prevsubpage
     \fi
     \setglobalsystemreference\rt!page\v!vorigesubpagina\prevsubpage
     \ifnum\realpageno=\lastsubpage\relax
       \global\let\nextsubpage\lastsubpage
       \setglobalsystemreference\rt!page{\v!sub\v!vooruit}\firstsubpage
     \else
       \xdef\nextsubpage{\realfolio}%
       \doglobal\increment\nextsubpage
       \setglobalsystemreference\rt!page{\v!sub\v!vooruit}\nextsubpage
     \fi
     \setglobalsystemreference\rt!page\v!volgendesubpagina\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!eerstepagina \firstpage
   \setglobalsystemreference\rt!page\v!laatstepagina\lastpage
   \bgroup
   \ifnum\realpageno>\plusone
     \advance\realpageno \minusone
     \xdef\prevpage{\realfolio}%
     \setglobalsystemreference\rt!page\v!achteruit\prevpage
   \else
     \global\let\prevpage\firstpage
     \setglobalsystemreference\rt!page\v!achteruit\lastpage
   \fi
   \setglobalsystemreference\rt!page\v!vorigepagina\prevpage
   \egroup
   \bgroup
   \ifnum\realpageno<\lastpage\relax
     \advance\realpageno \plusone
     \xdef\nextpage{\realfolio}%
     \setglobalsystemreference\rt!page\v!pagina\nextpage
     \setglobalsystemreference\rt!page\v!vooruit\nextpage
     \bgroup
     \xdef\nextnextpage{\realfolio}%
     \ifodd\realpageno
       \setglobalsystemreference\rt!page\v!volgendeonevenpagina\nextnextpage
     \else
       \setglobalsystemreference\rt!page\v!volgendeevenpagina\nextnextpage
     \fi
     \advance\realpageno \plusone
     \xdef\nextnextpage{\realfolio}%
     \ifnum\realpageno>\lastpage\relax
      %\ifodd\realpageno
      %  \setglobalsystemreference\rt!page\v!volgendeonevenpagina\lastpage
      %\else
      %  \setglobalsystemreference\rt!page\v!volgendeevenpagina\lastpage
      %\fi
     \else
       \ifodd\realpageno
         \setglobalsystemreference\rt!page\v!volgendeonevenpagina\nextnextpage
       \else
         \setglobalsystemreference\rt!page\v!volgendeevenpagina\nextnextpage
       \fi
     \fi
     \egroup
   \else
     \global\let\nextpage\lastpage
     \setglobalsystemreference\rt!page\v!pagina\firstpage
     \setglobalsystemreference\rt!page\v!vooruit\firstpage
     \setglobalsystemreference\rt!page\v!volgendeonevenpagina\lastpage
     \setglobalsystemreference\rt!page\v!volgendeevenpagina\lastpage
   \fi
   \setglobalsystemreference\rt!page\v!volgendepagina\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\totaalaantalpaginas
  {\lastpage}

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

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

\definieernummer
  [\s!page]
  [\c!conversie=\@@nmconversie,
   \c!wijze=\@@nmwijze,
   \c!status=\@@nmstatus,
   \c!start=1]

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

\global\let\@@pnstatus\@@pnstatus

\def\dostelpaginanummerin[#1]%
  {\getparameters[\??pn][\c!nummer=,#1]%
   \global\let\@@pnstatus\@@pnstatus
   \doifsomething{\@@pnnummer}
     {\setnummer[\s!page]{\@@pnnummer}%
      \setuserpageno{\ruwenummer[\s!page]}}%
   % this makes starting at an even page possible
   \ifnum\realpageno=1 \ifodd\pageno \else
     \global\shiftedrealpagenotrue
   \fi \fi}

\def\stelpaginanummerin
  {\dosingleargument\dostelpaginanummerin}

% long time used alternative 
%
% \def\verlaagpaginanummer
%   {\doifinset{\@@pnstatus}{\v!start,\v!leeg,\v!geen}
%      {\verlaagnummer[\s!page]%
%       \setuserpageno{\ruwenummer[\s!page]}}}
% 
% \def\verhoogpaginanummer
%   {\doifinset{\@@pnstatus}{\v!start,\v!leeg,\v!geen}
%      {\verhoognummer[\s!page]%
%       \setuserpageno{\ruwenummer[\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
  {\verlaagnummer[\s!page]\setuserpageno{\ruwenummer[\s!page]}}

\def\doincrementpagenumber
  {\verhoognummer[\s!page]\setuserpageno{\ruwenummer[\s!page]}}

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

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

\letvalue{\??pn-\v!start   }\dodecrementpagenumber
\letvalue{\??pn-\v!geen    }\dodecrementpagenumber
\letvalue{\??pn-\v!leeg    }\dodecrementpagenumber

\letvalue{\??pn+\v!start   }\doincrementpagenumber
\letvalue{\??pn+\v!geen    }\doincrementpagenumber
\setvalue{\??pn+\v!leeg   }{\doincrementpagenumber
                            \dosynchronizepagenumber}
\letvalue{\??pn+\v!handhaaf}\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\@@nmplaats {} % 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\@@nmplaats\empty\else
     \def\dododosetpagenumberlocation##1%
       {\donetrue
        \setevalue{\??tk#1##1}%
          {\noexpand\do@@plaatspaginanummer{\@@pagenumberlocation}}}%
     \donefalse
     \ExpandFirstAfter\processallactionsinset
       [\@@nmplaats]
       [    \v!midden=>\dododosetpagenumberlocation{\v!tekst\c!middentekst},
             \v!links=>\dododosetpagenumberlocation{\v!tekst\c!linkertekst},
            \v!rechts=>\dododosetpagenumberlocation{\v!tekst\c!rechtertekst},
          \v!inlinker=>\dododosetpagenumberlocation{\v!marge\c!linkertekst},
         \v!inrechter=>\dododosetpagenumberlocation{\v!marge\c!rechtertekst},
           \v!inmarge=>\dododosetpagenumberlocation{\v!marge\ifdubbelzijdig
                         \c!margetekst\else\c!rechtertekst\fi},
             \v!marge=>\dododosetpagenumberlocation{\v!marge\ifdubbelzijdig
                         \c!margetekst\else\c!rechtertekst\fi},
           \v!opmarge=>\dododosetpagenumberlocation{\v!tekst\c!kantlijntekst},
          \v!kantlijn=>\dododosetpagenumberlocation{\v!tekst\c!kantlijntekst}]%
     \ifdone \else
       \dododosetpagenumberlocation{\v!tekst\c!middentekst}% default
     \fi
   \fi}

\def\dosetpagenumberlocation
  {\ExpandBothAfter\doifinsetelse\v!hoofd{\@@nmplaats,\@@nmin}
     {\dodosetpagenumberlocation\v!hoofd}
     {\dodosetpagenumberlocation\v!voet}}

\def\dosetuppagenumbering[#1]%
  {\getparameters[\??nm][#1]%
   \preparepaginaprefix\??nm
   \enkelzijdigfalse
   \dubbelzijdigfalse
   \ExpandFirstAfter\processallactionsinset
     [\@@nmvariant]
     [ \v!enkelzijdig=>\enkelzijdigtrue,
      \v!dubbelzijdig=>\dubbelzijdigtrue]%
   \ifdubbelzijdig
     \trackingmarginnotestrue
   \else
     \trackingmarginnotesfalse
   \fi
   \dosetpagenumberlocation
   \recalculatebackgrounds
   \recalculatelogos}

\def\setuppagenumbering
  {\dosingleempty\dosetuppagenumbering}

\let\stelnummeringin\setuppagenumbering

% listig: hangt af van \@@kolijst

% erg fout
%
% \def\preparepaginaprefix#1%
%   {\def\dopreparepaginaprefix##1%
%      {\doifvalue{#1##1\c!nummer}{\v!ja}
%         {\setvalue{#1\getvalue{\??by##1}\c!nummer}{\v!ja}}}%
%    \processcommacommand[\@@kolijst]\dopreparepaginaprefix}
%
% nog fouter
%
% \def\preparepaginaprefix#1%
%   {\def\dopreparepaginaprefix##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]\dopreparepaginaprefix}
%
% best, beware, chapter (yes) can be followed by title (no)

\def\preparepaginaprefix#1%
  {\def\dopreparepaginaprefix##1%
     {\letvalue{#1\getvalue{\??by##1}\v!nummer}\v!nee}%  %v
   \rawprocesscommalist[\@@kolijst]\dopreparepaginaprefix
   \def\dopreparepaginaprefix##1%
     {\doifvalue{#1##1\v!nummer}\v!ja                    %v
        {\letvalue{#1\getvalue{\??by##1}\v!nummer}\v!ja}}%
   \rawprocesscommalist[\@@kolijst]\dopreparepaginaprefix}

% \def\dodopaginaprefix#1% uti seperator --
%   {\let\normaluchar\uchar\let\uchar\relax % ugly but needed
%    \doifelsevalue{\paginatype#1\v!nummer}\v!ja % \v! and no \c!
%      {\@EA\beforesplitstring\@EA\postprefix\@EA\at\sectionseparator\to\preprefix
%       \@EA\aftersplitstring \@EA\postprefix\@EA\at\sectionseparator\to\postprefix
%       \let\uchar\normaluchar % ugly but needed
%       \ifx\preprefix\empty \else
%         \ifx\preprefix\zerocountervalue\else
%           \preprefix\@@nmnummerscheider
%         \fi
%       \fi}
%      {\@EA\aftersplitstring\@EA\postprefix\@EA\at\sectionseparator\to\postprefix
%       \let\uchar\normaluchar}} % ugly but needed

\def\dodopaginaprefix#1% uti seperator --
  {\let\normaluchar\uchar\let\uchar\relax % ugly but needed
   \doifelsevalue{\paginatype#1\v!nummer}\v!ja % \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\@@nmnummerscheider
        \fi
      \fi}
     {\edef\postprefix{\@@filtertailpart[\postprefix]}%
      \let\uchar\normaluchar}} % ugly but needed

\def\dopaginaprefix#1%
  {\dodopaginaprefix{#1}%
   \donexttracklevel{#1}}

\def\paginaprefix#1[#2]% 
  {\bgroup
   \edef\paginatype{#1}%
   \edef\postprefix{\@@filternumberpart[#2]}% 
   \let\donexttrackcommando\dopaginaprefix
   \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{\@@nmstatus\@@pnstatus}{\v!start\v!start}
     {{\doif\@@nmstrut\v!ja\strut
       \@@nmcommando{\doattributes\??nm\c!letter\c!kleur
         {\completepagenumber}}}}}

\def\@@plaatspaginascheider% still used ? 
  {\doif{\@@nmstatus\@@pnstatus}{\v!start\v!start}
     {\@@nmtekstscheider}}

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

\def\pagenumber
  {\userfolio}

\def\pageprefixes
  {\def\donexttrackcommando##1%
      {\doifvalue{\??nm##1\v!nummer}\v!ja  % v
         {\ifnum\countervalue{\??se##1}>\zerocount
            \getvalue{##1\c!nummer}\@@nmnummerscheider
          \fi}%
       \doifsomething{\@@nmtekst}
         {\@@nmtekst\@@nmnummerscheider}%
       \donexttracklevel{##1}}%
    \donexttrackcommando{\firstsection}}

\unexpanded\def\completepagenumber  
  {\doif{\@@nmstatus\@@pnstatus}{\v!start\v!start} 
     {\@@nmlinks\labeltexts\v!paginanummer{\pageprefixes\pagenumber}\@@nmrechts}}

\unexpanded\def\placepagenumber
  {\doif{\@@nmstatus\@@pnstatus}{\v!start\v!start}
     {\labeltexts\v!paginanummer{\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}{?}{\paginaprefix\??rf[#1]\translatednumber[#1]}}

\stelpaginanummerin
  [\c!status=\v!start,
   \c!nummer=1]

\stelsubpaginanummerin
  [\c!wijze=\v!per\v!deel,
   \c!status=\v!stop]

\protect \endinput 
