summaryrefslogtreecommitdiff
path: root/tex/context/base/strc-pag.mkiv
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2010-07-04 15:32:09 +0300
committerMarius <mariausol@gmail.com>2010-07-04 15:32:09 +0300
commit85b7bc695629926641c7cb752fd478adfdf374f3 (patch)
tree80293f5aaa7b95a500a78392c39688d8ee7a32fc /tex/context/base/strc-pag.mkiv
downloadcontext-85b7bc695629926641c7cb752fd478adfdf374f3.tar.gz
stable 2010-05-24 13:10
Diffstat (limited to 'tex/context/base/strc-pag.mkiv')
-rw-r--r--tex/context/base/strc-pag.mkiv496
1 files changed, 496 insertions, 0 deletions
diff --git a/tex/context/base/strc-pag.mkiv b/tex/context/base/strc-pag.mkiv
new file mode 100644
index 000000000..0f3d7ba3b
--- /dev/null
+++ b/tex/context/base/strc-pag.mkiv
@@ -0,0 +1,496 @@
+%D \module
+%D [ file=strc-pag,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Pagenumbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / Hans Hagen]
+%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 Structure Macros / Pagenumbering}
+
+\registerctxluafile{strc-pag}{1.001}
+
+\unprotect
+
+% Hacks:
+
+\let\preparepageprefix\gobbleoneargument
+
+% Allocation:
+
+\countdef\realpageno = 0 \realpageno = 1
+\countdef\userpageno = 1 \userpageno = 1
+\countdef\subpageno = 2 \subpageno = 0 % !!
+\countdef\arrangeno = 3 \arrangeno = 0 % !!
+\countdef\pagenoshift = 4 \pagenoshift = 0 % !!
+
+\let\pageno\userpageno
+
+\def\realfolio{\the\realpageno}
+\def\userfolio{\the\userpageno}
+\def\subfolio {\the\subpageno }
+
+\newtoks\everyinitializepagecounters
+
+\def\initializepagecounters{\the\everyinitializepagecounters}
+
+\appendtoks
+ \initializepagecounters
+\to \everyjob
+
+% Page numbers are kind of independent of each other and therefore they
+% all get their own counter. After all, it's easier to combine them in
+% a pseudo counterset than to deal with a complex set itself.
+
+% \definestructureprefixset [mine][section-1,section-2]
+% \definestructureseparatorset[mine][:]
+%
+% \setupuserpagenumber
+% [way=bypart,
+% prefix=yes,
+% prefixset=mine,
+% prefixseparatorset=mine]
+
+% \definestructureconversionset[frontpart:pagenumber][][romannumerals]
+% \definestructureconversionset[bodypart:pagenumber] [][numbers]
+%
+% \setupuserpagenumber[way=byblock]
+% \setupuserpagenumber[way=bychapter]
+% \setupuserpagenumber[numberconversionset=pagenumber]
+%
+% \starttext
+% \startfrontmatter
+% \completecontent[criterium=all]
+% \chapter{tufte} \section{one} \input tufte \page \section{two} \input tufte \page
+% \chapter{tufte} \section{one} \input tufte \page \section{two} \input tufte \page
+% \stopfrontmatter
+% \startbodymatter
+% \chapter{knuth} \section{one} \input knuth \page \section{two} \input knuth \page \section{three} \input knuth \page
+% \chapter{knuth} \section{one} \input knuth \page \section{two} \input knuth \page \section{three} \input knuth \page
+% \stopbodymatter
+% \stoptext
+
+
+\definestructurecounter[\s!realpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=realpageno]
+\definestructurecounter[\s!userpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=userpageno]
+\definestructurecounter[\s!subpage] [\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=subpageno]
+
+\newtoks\everysetuprealpagenumber % todo: set state: none, start, stop, reset
+\newtoks\everysetupuserpagenumber % todo: set state: none, start, stop, reset
+\newtoks\everysetupsubpagenumber % todo: set state: none, start, stop, reset
+
+\unexpanded\def\setuprealpagenumber{\dosingleargument\dosetuprealpagenumber}
+\unexpanded\def\setupuserpagenumber{\dosingleargument\dosetupuserpagenumber}
+\unexpanded\def\setupsubpagenumber {\dosingleargument\dosetupsubpagenumber}
+
+\def\dosavepagenumberstate#1{\edef\oldpagenumberstate{\structurecounterparameter#1\c!state}}
+
+\def\dosetuprealpagenumber[#1]{\dosavepagenumberstate\s!realpage\dosetupstructurecounter[\s!realpage][#1]\the\everysetuprealpagenumber}
+\def\dosetupuserpagenumber[#1]{\dosavepagenumberstate\s!userpage\dosetupstructurecounter[\s!userpage][#1]\the\everysetupuserpagenumber}
+\def\dosetupsubpagenumber [#1]{\dosavepagenumberstate\s!subpage \dosetupstructurecounter[\s!subpage ][#1]\the\everysetupsubpagenumber }
+
+\def\resetrealpagenumber {} % not permitted
+\def\resetuserpagenumber {\resetstructurecounter[\s!userpage]}
+\def\resetsubpagenumber {\resetstructurecounter[\s!subpage]}
+
+\appendtoks
+ \setstructurecounter[\s!realpage]\realpageno
+ \setstructurecounter[\s!userpage]\userpageno
+ \setstructurecounter[\s!subpage] \subpageno
+\to \everyinitializepagecounters
+
+\let\setuppagenumber\setupuserpagenumber
+\let\resetpagenumber\resetuserpagenumber
+
+\def\savecurrentpagestate % \normalexpanded?
+ {\ctxlua{structure.pages.save({
+ prefix = "\structurecounterparameter\s!userpage\c!prefix",
+ separatorset = "\structurecounterparameter\s!userpage\c!prefixseparatorset",
+ conversion = "\structurecounterparameter\s!userpage\c!prefixconversion",
+ conversionset = "\structurecounterparameter\s!userpage\c!prefixconversionset",
+ set = "\structurecounterparameter\s!userpage\c!prefixset",
+ segments = "\structurecounterparameter\s!userpage\c!prefixsegments",
+ connector = \!!bs\structurecounterparameter\s!userpage\c!prefixconnector\!!es,
+ },{
+ conversion = "\structurecounterparameter\s!userpage\c!numberconversion",
+ conversionset = "\structurecounterparameter\s!userpage\c!numberconversionset",
+ starter = \!!bs\structurecounterparameter\s!userpage\c!numberstarter\!!es,
+ stopper = \!!bs\structurecounterparameter\s!userpage\c!numberstopper\!!es,
+ }
+ )}}
+
+\prependtoks
+ \savecurrentpagestate
+\to \everyshipout
+
+\def\pushpagestate{\setxvalue{\??nm:\s!userpage:\c!state}{\structurecounterparameter\s!userpage\c!state}}
+\def\poppagestate {\normalexpanded{\noexpand\setuppagenumber[\c!state=\getvalue{\??nm:\s!userpage:\c!state}]}}
+
+\setuppagenumber
+ [\c!way=\v!by\v!text,
+ \c!prefix=\v!no,
+ \c!prefixset=\v!part,
+ \c!prefixconnector=\endash,
+ \c!state=\v!start]
+
+\setupsubpagenumber
+ [\c!way=\v!by\v!part,
+ \c!state=\v!stop]
+
+% Counters
+
+% \def\firstpage {1} \def\prevpage {1} \def\nextpage {1} \def\lastpage {1}
+% \def\firstuserpage{1} \def\prevuserpage{1} \def\nextuserpage{1} \def\lastuserpage{1}
+% \def\firstsubpage {1} \def\prevsubpage {1} \def\nextsubpage {1} \def\lastsubpage {1}
+
+% \def\firstrealpage{\firststructurecounter[\s!realpage]}
+% \def\prevrealpage {\prevstructurecounter [\s!realpage]}
+% \def\nextrealpage {\nextstructurecounter [\s!realpage]}
+% \def\lastrealpage {\laststructurecounter [\s!realpage]}
+
+% \let\firstpage\firstrealpage
+% \let\prevpage \prevrealpage
+% \let\nextpage \nextrealpage
+% \let\lastpage \lastrealpage
+
+\def\firstrealpagenumber{\convertedstructurecounter[\s!realpage][\c!type=\v!first]}
+\def\firstuserpagenumber{\convertedstructurecounter[\s!userpage][\c!type=\v!first]}
+\def\firstsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!first]}
+
+\def\lastrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!last]}
+\def\lastuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!last]}
+\def\lastsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!last]}
+
+\def\prevrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!previous]}
+\def\prevuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!previous]}
+\def\prevsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!previous]}
+
+\def\nextrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!next]}
+\def\nextuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!next]}
+\def\nextsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!next]}
+
+\def\firstrealpage{\firststructurecounter[\s!realpage]}
+\def\firstuserpage{\firststructurecounter[\s!userpage]}
+\def\firstsubpage {\firststructurecounter[\s!subpage ]}
+
+\def\prevrealpage {\prevstructurecounter [\s!realpage]}
+\def\prevuserpage {\prevstructurecounter [\s!userpage]}
+\def\prevsubpage {\prevstructurecounter [\s!subpage ]}
+
+\def\nextrealpage {\nextstructurecounter [\s!realpage]}
+\def\nextuserpage {\nextstructurecounter [\s!userpage]}
+\def\nextsubpage {\nextstructurecounter [\s!subpage ]}
+
+\def\lastrealpage {\laststructurecounter [\s!realpage]}
+\def\lastuserpage {\laststructurecounter [\s!userpage]}
+\def\lastsubpage {\laststructurecounter [\s!subpage ]}
+
+\let\firstpage\firstrealpage
+\let\prevpage \prevrealpage
+\let\nextpage \nextrealpage
+\let\lastpage \lastrealpage
+
+% Compatibility counters:
+
+\def\nofrealpages {\lastrealpage} \def\totalnumberofpages{\lastrealpage}
+\def\nofuserpages {\lastuserpage} \def\lastpagenumber {\lastuserpage}
+\def\nofsubpages {\lastsubpage }
+
+% Renderers:
+
+\def\pagenumber {\rawstructurecounter[\s!userpage]}
+\def\prefixedpagenumber {\directconvertedstructurecounter\s!userpage\empty} % \userpagenumber
+
+\def\realpagenumber {\directconvertedstructurecounter\s!realpage\empty}
+\def\userpagenumber {\directconvertedstructurecounter\s!userpage\empty}
+\def\subpagenumber {\directconvertedstructurecounter\s!subpage \empty}
+
+\def\firstrealpagenumber{\directconvertedstructurecounter\s!realpage\v!first}
+\def\firstuserpagenumber{\directconvertedstructurecounter\s!userpage\v!first}
+\def\firstsubpagenumber {\directconvertedstructurecounter\s!subpage \v!first}
+
+\def\lastrealpagenumber {\directconvertedstructurecounter\s!realpage\v!last}
+\def\lastuserpagenumber {\directconvertedstructurecounter\s!userpage\v!last}
+\def\lastsubpagenumber {\directconvertedstructurecounter\s!subpage \v!last}
+
+\def\prevrealpagenumber {\directconvertedstructurecounter\s!realpage\v!previous}
+\def\prevuserpagenumber {\directconvertedstructurecounter\s!userpage\v!previous}
+\def\prevsubpagenumber {\directconvertedstructurecounter\s!subpage \v!previous}
+
+\def\nextrealpagenumber {\directconvertedstructurecounter\s!realpage\v!next}
+\def\nextuserpagenumber {\directconvertedstructurecounter\s!userpage\v!next}
+\def\nextsubpagenumber {\directconvertedstructurecounter\s!subpage \v!next}
+
+\appendtoks
+ \decrementstructurecounter[\s!realpage]%
+ \decrementstructurecounter[\s!userpage]%
+ \decrementstructurecounter[\s!subpage]%
+\to\everygoodbye
+
+% Equivalents (compatibility):
+%
+% todo: maybe leave lastpage etc lua calls
+
+\def\realpage{\the\realpageno}
+\def\userpage{\the\userpageno}
+\def\subpage {\the\subpageno}
+
+% Hooks:
+
+\def\currentpage{\the\realpageno}% rather useless
+
+\appendtoks
+ \ifnum\realpageno>\lastpage \globallet\lastpage\lastrealpage \fi
+\to \everyinitializepagecounters
+
+% States:
+
+\newif\ifrightpage \rightpagetrue
+\newif\ifdoublesided
+\newif\ifsinglesided
+
+% Realpage and subpage numbers:
+
+\def\setnextrealpageno{\global\realpageno\incrementedstructurecounter[\s!realpage]\relax}
+\def\setnextsubpageno {\global\subpageno \incrementedstructurecounter[\s!subpage ]\relax}
+
+% Page numbers: (can move to lua)
+
+\def\dodecrementpagenumber {\global\userpageno\decrementedstructurecounter[\s!userpage]\relax}
+\def\doincrementpagenumber {\global\userpageno\incrementedstructurecounter[\s!userpage]\relax}
+
+\def\decrementsubpagenumber{\global\subpageno \decrementedstructurecounter[\s!subpage ]\relax}
+\def\incrementsubpagenumber{\global\subpageno \incrementedstructurecounter[\s!subpage ]\relax}
+
+\def\dosynchronizepagenumber{\global\let\@@pnstate\v!start}
+
+\def\decrementpagenumber{\csname\??pn-\structurecounterparameter\s!userpage\c!state\endcsname}
+\def\incrementpagenumber{\csname\??pn+\structurecounterparameter\s!userpage\c!state\endcsname}
+
+\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
+
+% Control:
+
+\def\getpagestatus % hierboven gebruiken
+ {\ifdoublesided
+ \global\rightpagetrue
+ % todo: \global\rightpagetrue or \global\rightpagefalse
+ \else
+ \global\rightpagetrue
+ \fi}
+
+% Setup general page numbering
+
+\newtoks\everysetuppagenumbering
+
+\unexpanded\def\setuppagenumbering
+ {\dosingleempty\dosetuppagenumbering}
+
+\def\dosetuppagenumbering[#1]%
+ {\getparameters[\??nm][#1]\the\everysetuppagenumbering}
+
+\appendtoks
+ \singlesidedfalse
+ \doublesidedfalse
+ \normalexpanded{\noexpand\processallactionsinset[\@@nmalternative]}
+ [ \v!singlesided=>\singlesidedtrue,
+ \v!doublesided=>\doublesidedtrue]%
+ \ifx\trackingmarginnotestrue\undefined\else
+ \ifdoublesided
+ \trackingmarginnotestrue
+ \else
+ \trackingmarginnotesfalse
+ \fi
+ \fi
+ \dosetpagenumberlocation
+\to \everysetuppagenumbering
+
+\appendtoks
+ \ifdefined \recalculatebackgrounds \recalculatebackgrounds \fi
+\to \everysetuppagenumbering
+
+\def\flushfinallayoutpage
+ {\doifsomething\@@nmpage{\doifnot\@@nmpage\v!no{\page[\@@nmpage]}}}
+
+% The numbered location handler is there because we need to be downward
+% compatible. So, in fact there can be multiple handlers active at the
+% same time, but only the current one does something.
+%
+% thsi code might move to page-txt
+
+\newcount\currentpagenumberlocation
+
+\def\dosetpagenumberlocation
+ {\advance\currentpagenumberlocation\plusone
+ \ifx\@@nmlocation\empty \else
+ \let\@@pagenumbervlocation\v!footer
+ \let\@@pagenumberhlocation\v!text
+ \let\@@pagenumberxlocation\c!middletext
+ \normalexpanded{\noexpand\processallactionsinset[\@@nmlocation]}
+ [ \v!header=>\let\@@pagenumbervlocation\v!header,
+ \v!footer=>\let\@@pagenumbervlocation\v!footer,
+ \v!middle=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!middletext,
+ \v!left=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!lefttext,
+ \v!right=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!righttext,
+ \v!inleft=>\let\@@pagenumberhlocation\v!margin\let\@@pagenumberxlocation\c!lefttext,
+ \v!inright=>\let\@@pagenumberhlocation\v!margin\let\@@pagenumberxlocation\c!righttext,
+ \v!inmargin=>\let\@@pagenumberhlocation\v!margin\def\@@pagenumberxlocation{\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!margin=>\let\@@pagenumberhlocation\v!margin\def\@@pagenumberxlocation{\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!atmargin=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!marginedgetext,
+ \v!marginedge=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!marginedgetext]%
+ \normalexpanded{\noexpand\setspecificlayouttext
+ {\@@pagenumbervlocation}{\@@pagenumberhlocation}{\@@pagenumberxlocation}%
+ {\noexpand\doplacepagenumberatlocation{\number\currentpagenumberlocation}}}%
+ \fi}
+
+\def\setspecificlayouttext#1#2#3#4{\setvalue{\??tk#1#2#3}{#4}} % weird place
+
+\appendtoks
+ \dosetpagenumberlocation
+\to \everyinitializepagecounters
+
+\def\doplacepagenumberatlocation#1%
+ {\ifnum#1=\currentpagenumberlocation\relax\expandafter\placelocationpagenumber\fi}
+
+% Rendering:
+
+\unexpanded\def\placelocationpagenumber
+ {\ifnum\userpagenumberstate=\plustwo
+ \ifnum\overallpagenumberstate=\plusone
+ \doif\@@nmstrut\v!yes\strut
+ \@@nmcommand{\doattributes\??nm\c!style\c!color{\@@nmleft\labeltexts\v!pagenumber{\prefixedpagenumber}\@@nmright}}%
+ \fi
+ \fi}
+
+\unexpanded\def\completepagenumber
+ {\ifnum\userpagenumberstate=\plustwo
+ \ifnum\overallpagenumberstate=\plusone
+ \@@nmleft\labeltexts\v!pagenumber\prefixedpagenumber\@@nmright
+ \fi
+ \fi}
+
+\unexpanded\def\placepagenumber
+ {\ifnum\userpagenumberstate=\plustwo
+ \ifnum\overallpagenumberstate=\plusone
+ \labeltexts\v!pagenumber\pagenumber
+ \fi
+ \fi}
+
+\unexpanded\def\referencepagenumber[#1]%
+ {\doifelsenothing{#1}{?}{}}
+
+% The numbered location handler is there because we need to be downward
+% compatible. So, in fact there can be multiple handlers active at the
+% same time, but only the current one does something.
+
+\chardef\realpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
+\chardef\userpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
+\chardef\subpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
+\chardef\overallpagenumberstate=1 % general number: 0=invisible, 1=visible
+
+\def\checkpagenumberstatechange#1#2%
+ {\edef\newpagenumberstate{\structurecounterparameter#1\c!state}%
+ \ifx\newpagenumberstate\oldpagenumberstate \else
+ \doifelse\newpagenumberstate\v!start
+ {\chardef#2\plustwo}%
+ {\chardef#2\zerocount}%
+ \fi}
+
+\appendtoks % todo: set state: none, start, stop, reset
+ \checkpagenumberstatechange\s!realpage\realpagenumberstate
+\to \everysetuprealpagenumber
+
+\appendtoks % todo: set state: none, start, stop, reset
+ \checkpagenumberstatechange\s!userpage\userpagenumberstate
+\to \everysetupuserpagenumber
+
+\appendtoks % todo: set state: none, start, stop, reset
+ \checkpagenumberstatechange\s!subpage\subpagenumberstate
+\to \everysetupsubpagenumber
+
+\appendtoks % todo: set state: none, start, stop, reset
+ \doifelse\@@nmstate\v!start
+ {\chardef\overallpagenumberstate\plusone}%
+ {\chardef\overallpagenumberstate\zerocount}%
+\to \everysetuppagenumbering
+
+% Done
+
+% \c!way=\v!by\v!part
+% \c!text=
+% \v!chapter\v!number=\v!no
+% \v!part\v!number=\v!yes
+% \c!numberseparator=--
+% \c!conversion=\v!numbers
+
+\setuppagenumbering
+ [\c!alternative=\v!singlesided,
+ \c!location={\v!header,\v!middle},
+ \c!width=, % in geval van \v!marginedge
+ \c!left=,
+ \c!right=,
+ \c!page=\v!last,
+ \c!textseparator=\tfskip,
+ \c!state=\v!start,
+ \c!command=,
+ \c!strut=\v!yes,
+ \c!style=, % empty, otherwise conflict
+ \c!color=]
+
+% just for downward compatbility
+
+\appendtoks
+ \edef\askeduserpagenumber{\structurecounterparameter\s!userpage\c!number}%
+ \ifx\askeduserpagenumber\empty \else
+ \normalexpanded{\noexpand\setuppagenumber[\c!start=\structurecounterparameter\s!userpage\c!number,\c!number=]}%
+ \userpageno\rawstructurecounter[\s!userpage]%
+ \fi
+\to \everysetupuserpagenumber % todo: set state: none, start, stop, reset
+
+\appendtoks
+ \edef\askedsubpagenumber{\structurecounterparameter\s!subpage\c!number}%
+ \ifx\askedsubpagenumber\empty \else
+ \normalexpanded{\noexpand\setupsubpagenumber[\c!start=\structurecounterparameter\s!subpage\c!number,\c!number=]}%
+ \subpageno\rawstructurecounter[\s!subpage]%
+ \fi
+\to \everysetupsubpagenumber % todo: set state: none, start, stop, reset
+
+% \setuplayout[width=300pt,backspace=4cm]
+% \setuppagenumbering [alternative=doublesided]
+% \setupuserpagenumber[start=2]
+% \starttext \dorecurse{20}{\input knuth \par} \stoptext
+
+\def\checkpagenumbershift
+ {\userpageno\rawstructurecounter[\s!userpage]\relax
+ \ifnum\realpageno=\plusone
+ \ifodd\userpageno
+ \else
+ \global\pagenoshift\plusone
+ \fi
+ \fi}
+
+\appendtoks % todo: set state: none, start, stop, reset
+ % this makes starting at an even page possible
+ \checkpagenumbershift
+\to \everysetupuserpagenumber
+
+\appendtoks % todo: set state: none, start, stop, reset
+ % this makes starting at an even page possible
+ \checkpagenumbershift
+\to \everysetuppagenumbering
+
+\initializepagecounters
+
+\protect \endinput