strc-pag.mkxl /size: 21 Kb    last modification: 2025-02-21 11:03
1%D \module
2%D   [       file=strc-pag,
3%D        version=2008.10.20,
4%D          title=\CONTEXT\ Structure Macros,
5%D       subtitle=Pagenumbering,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14\writestatus{loading}{ConTeXt Structure Macros / Pagenumbering}
15
16\registerctxluafile{strc-pag}{}
17
18\unprotect
19
20\startcontextdefinitioncode
21
22% Allocation:
23
24% \ifdefined\realpageno    \else \permanent\countdef\realpageno    \zerocount  \fi \realpageno    \plusone
25% \ifdefined\userpageno    \else \permanent\countdef\userpageno    \plusone    \fi \userpageno    \plusone
26% \ifdefined\subpageno     \else \permanent\countdef\subpageno     \plustwo    \fi \subpageno     \plusone % was \zerocount but that doesn't work well with bytext
27% \ifdefined\arrangeno     \else \permanent\countdef\arrangeno     \plusthree  \fi \arrangeno     \zerocount % !
28% \ifdefined\pagenoshift   \else \permanent\countdef\pagenoshift   \plusfour   \fi \pagenoshift   \zerocount % !
29% \ifdefined\lastpageno    \else \permanent\countdef\lastpageno    \plusfive   \fi \lastpageno    \zerocount % !
30% \ifdefined\lastuserpageno\else \permanent\countdef\lastuserpageno\plussix    \fi \lastuserpageno\zerocount % !
31% \ifdefined\lastsubpageno \else \permanent\countdef\lastsubpageno \plusseven  \fi \lastsubpageno \zerocount % !
32
33\ifdefined\realpageno    \else \newinteger\realpageno    \fi \realpageno    \plusone
34\ifdefined\userpageno    \else \newinteger\userpageno    \fi \userpageno    \plusone
35\ifdefined\subpageno     \else \newinteger\subpageno     \fi \subpageno     \plusone % was \zerocount but that doesn't work well with bytext
36\ifdefined\arrangeno     \else \newinteger\arrangeno     \fi \arrangeno     \zerocount % !
37\ifdefined\pagenoshift   \else \newinteger\pagenoshift   \fi \pagenoshift   \zerocount % !
38\ifdefined\lastpageno    \else \newinteger\lastpageno    \fi \lastpageno    \zerocount % !
39\ifdefined\lastuserpageno\else \newinteger\lastuserpageno\fi \lastuserpageno\zerocount % !
40\ifdefined\lastsubpageno \else \newinteger\lastsubpageno \fi \lastsubpageno \zerocount % !
41
42\pushoverloadmode \aliasinteger\pageno\userpageno \popoverloadmode
43
44\permanent\def\realfolio{\the\realpageno}
45\permanent\def\userfolio{\the\userpageno}
46\permanent\def\subfolio {\the\subpageno }
47\permanent\def\lastfolio{\the\lastpageno}
48
49\newtoks\everyinitializepagecounters
50
51\permanent\protected\def\initializepagecounters
52  {\expand\everyinitializepagecounters}
53
54\appendtoks
55    \initializepagecounters
56\to \everyjob
57
58% Page numbers are kind of independent of each other and therefore they
59% all get their own counter. After all, it's easier to combine them in
60% a pseudo counterset than to deal with a complex set itself.
61
62% \defineprefixset   [mine][section-1,section-2]
63% \defineseparatorset[mine][:]
64%
65% \setupuserpagenumber
66%   [way=bypart,
67%    prefix=yes,
68%    prefixset=mine,
69%    prefixseparatorset=mine]
70
71% \defineconversionset[frontpart:pagenumber][][romannumerals]
72% \defineconversionset[bodypart:pagenumber] [][numbers]
73%
74% \setupuserpagenumber[way=byblock]
75% \setupuserpagenumber[way=bychapter]
76% \setupuserpagenumber[numberconversionset=pagenumber]
77%
78% \starttext
79%     \startfrontmatter
80%         \completecontent[criterium=all]
81%         \chapter{tufte} \section{one} \input tufte \page \section{two} \input tufte \page
82%         \chapter{tufte} \section{one} \input tufte \page \section{two} \input tufte \page
83%     \stopfrontmatter
84%     \startbodymatter
85%         \chapter{knuth} \section{one} \input knuth \page \section{two} \input knuth \page \section{three} \input knuth \page
86%         \chapter{knuth} \section{one} \input knuth \page \section{two} \input knuth \page \section{three} \input knuth \page
87%     \stopbodymatter
88% \stoptext
89
90\definecounter[\s!realpage][\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=realpageno,\c!method=\v!page]
91\definecounter[\s!userpage][\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=userpageno,\c!method=\v!page]
92\definecounter[\s!subpage] [\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=subpageno, \c!method=\v!page]
93
94\newtoks\everysetuprealpagenumber % todo: set state: none, start, stop, reset
95\newtoks\everysetupuserpagenumber % todo: set state: none, start, stop, reset
96\newtoks\everysetupsubpagenumber  % todo: set state: none, start, stop, reset
97
98\let\m_strc_pagenumbers_state_old\zerocount
99\let\m_strc_pagenumbers_state_new\zerocount
100
101\def\strc_pagenumbers_save_state#1{\edef\m_strc_pagenumbers_state_old{\namedcounterparameter#1\c!state}}
102
103\permanent\tolerant\protected\def\setuprealpagenumber[#S#1]{\strc_pagenumbers_save_state\s!realpage\setupcounter[\s!realpage][#1]\expand\everysetuprealpagenumber}
104\permanent\tolerant\protected\def\setupuserpagenumber[#S#1]{\strc_pagenumbers_save_state\s!userpage\setupcounter[\s!userpage][#1]\expand\everysetupuserpagenumber}
105\permanent\tolerant\protected\def\setupsubpagenumber [#S#1]{\strc_pagenumbers_save_state\s!subpage \setupcounter[\s!subpage ][#1]\expand\everysetupsubpagenumber }
106
107\permanent\protected\def\resetrealpagenumber {} % not permitted
108\permanent\protected\def\resetuserpagenumber {\strc_counters_reset\s!userpage}
109\permanent\protected\def\resetsubpagenumber  {\strc_counters_reset\s!subpage}
110
111\appendtoks
112    \strc_counters_set\s!realpage\realpageno
113    \strc_counters_set\s!userpage\userpageno
114    \strc_counters_set\s!subpage \subpageno
115    \lastpageno    \lastcountervalue[\s!realpage]\relax
116    \lastuserpageno\lastcountervalue[\s!userpage]\relax
117    \lastsubpageno \lastcountervalue[\s!subpage ]\relax
118\to \everyinitializepagecounters
119
120\aliased\let\setuppagenumber\setupuserpagenumber
121\aliased\let\resetpagenumber\resetuserpagenumber
122
123% invisible =
124
125\def\strc_pagenumbers_page_state_save % \normalexpanded?
126  {\clf_savepagedata
127     {
128        prefix        {\namedcounterparameter\s!userpage\c!prefix}
129        separatorset  {\namedcounterparameter\s!userpage\c!prefixseparatorset}
130        conversion    {\namedcounterparameter\s!userpage\c!prefixconversion}
131        conversionset {\namedcounterparameter\s!userpage\c!prefixconversionset}
132        set           {\namedcounterparameter\s!userpage\c!prefixset}
133        segments      {\namedcounterparameter\s!userpage\c!prefixsegments}
134        connector     {\namedcounterparameter\s!userpage\c!prefixconnector}
135     }{
136        conversion    {\namedcounterparameter\s!userpage\c!numberconversion}
137        conversionset {\namedcounterparameter\s!userpage\c!numberconversionset}
138        starter       {\namedcounterparameter\s!userpage\c!numberstarter}
139        stopper       {\namedcounterparameter\s!userpage\c!numberstopper}
140     }{
141        viewerprefix  {\namedcounterparameter\s!userpage\c!viewerprefix}
142        state         {\namedcounterparameter\s!userpage\c!state}
143        label         {\namedcounterparameter\s!userpage\c!label}
144     }%
145   \relax}
146
147\prependtoks
148    \strc_pagenumbers_page_state_save
149\to \everyshipout
150
151\installcorenamespace{pagestatestack} % no level yet
152
153\protected\def\strc_pagenumbers_page_state_push{\xdefcsname\??pagestatestack\c!state\endcsname{\namedcounterparameter\s!userpage\c!state}}
154\protected\def\strc_pagenumbers_page_state_pop {\normalexpanded{\setuppagenumber[\c!state=\csname\??pagestatestack\c!state\endcsname]}}
155
156\setuppagenumber
157  [\c!way=\v!by\v!text,
158   \c!prefix=\v!no,
159   \c!prefixset=\v!part,
160   \c!prefixconnector=\endash,
161   \c!state=\v!start]
162
163\setupsubpagenumber
164  [\c!way=\v!by\v!part,
165   \c!state=\v!start] % was stop but start looks better in logging
166
167% Counters
168
169%permanent\def\firstrealpagenumber{\convertedcounter[\s!realpage][\c!type=\v!first]}
170%permanent\def\firstuserpagenumber{\convertedcounter[\s!userpage][\c!type=\v!first]}
171%permanent\def\firstsubpagenumber {\convertedcounter[\s!subpage ][\c!type=\v!first]}
172
173%permanent\def\lastrealpagenumber {\convertedcounter[\s!realpage][\c!type=\v!last]}
174%permanent\def\lastuserpagenumber {\convertedcounter[\s!userpage][\c!type=\v!last]}
175%permanent\def\lastsubpagenumber  {\convertedcounter[\s!subpage ][\c!type=\v!last]}
176
177%permanent\def\prevrealpagenumber {\convertedcounter[\s!realpage][\c!type=\v!previous]}
178%permanent\def\prevuserpagenumber {\convertedcounter[\s!userpage][\c!type=\v!previous]}
179%permanent\def\prevsubpagenumber  {\convertedcounter[\s!subpage ][\c!type=\v!previous]}
180
181%permanent\def\nextrealpagenumber {\convertedcounter[\s!realpage][\c!type=\v!next]}
182%permanent\def\nextuserpagenumber {\convertedcounter[\s!userpage][\c!type=\v!next]}
183%permanent\def\nextsubpagenumber  {\convertedcounter[\s!subpage ][\c!type=\v!next]}
184
185\permanent\def\firstrealpage{\strc_counters_first\s!realpage}
186\permanent\def\firstuserpage{\strc_counters_first\s!userpage}
187\permanent\def\firstsubpage {\strc_counters_first\s!subpage }
188
189\permanent\def\prevrealpage {\strc_counters_prev \s!realpage}
190\permanent\def\prevuserpage {\strc_counters_prev \s!userpage}
191\permanent\def\prevsubpage  {\strc_counters_prev \s!subpage }
192
193\permanent\def\nextrealpage {\strc_counters_next \s!realpage}
194\permanent\def\nextuserpage {\strc_counters_next \s!userpage}
195\permanent\def\nextsubpage  {\strc_counters_next \s!subpage }
196
197\permanent\def\lastrealpage {\strc_counters_last \s!realpage}
198\permanent\def\lastuserpage {\strc_counters_last \s!userpage}
199\permanent\def\lastsubpage  {\strc_counters_last \s!subpage }
200
201\aliased\let\firstpage\firstrealpage
202\aliased\let\prevpage \prevrealpage
203\aliased\let\nextpage \nextrealpage
204\aliased\let\lastpage \lastrealpage
205
206% Compatibility counters:
207
208\permanent\def\nofrealpages {\lastrealpage} \permanent\def\totalnumberofpages{\lastrealpage}
209\permanent\def\nofuserpages {\lastuserpage} \permanent\def\lastpagenumber    {\lastuserpage}
210\permanent\def\nofsubpages  {\lastsubpage }
211
212% Renderers:
213
214\permanent\def\pagenumber         {\strc_counters_raw\s!userpage}
215\permanent\def\prefixedpagenumber {\directconvertedcounter\s!userpage\empty} % \userpagenumber
216
217\permanent\def\realpagenumber     {\directconvertedcounter\s!realpage\empty}
218\permanent\def\userpagenumber     {\directconvertedcounter\s!userpage\empty}
219\permanent\def\subpagenumber      {\directconvertedcounter\s!subpage \empty}
220
221\permanent\def\firstrealpagenumber{\directconvertedcounter\s!realpage\v!first}
222\permanent\def\firstuserpagenumber{\directconvertedcounter\s!userpage\v!first}
223\permanent\def\firstsubpagenumber {\directconvertedcounter\s!subpage \v!first}
224
225\permanent\def\lastrealpagenumber {\directconvertedcounter\s!realpage\v!last}
226\permanent\def\lastuserpagenumber {\directconvertedcounter\s!userpage\v!last}
227\permanent\def\lastsubpagenumber  {\directconvertedcounter\s!subpage \v!last}
228
229\permanent\def\prevrealpagenumber {\directconvertedcounter\s!realpage\v!previous}
230\permanent\def\prevuserpagenumber {\directconvertedcounter\s!userpage\v!previous}
231\permanent\def\prevsubpagenumber  {\directconvertedcounter\s!subpage \v!previous}
232
233\permanent\def\nextrealpagenumber {\directconvertedcounter\s!realpage\v!next}
234\permanent\def\nextuserpagenumber {\directconvertedcounter\s!userpage\v!next}
235\permanent\def\nextsubpagenumber  {\directconvertedcounter\s!subpage \v!next}
236
237\protected\def\strc_pagenumbers_decrement_counters % only at the end
238   {\strc_counters_decrement\s!realpage
239    \strc_counters_decrement\s!userpage
240    \strc_counters_decrement\s!subpage}
241
242\protected\def\strc_pagenumbers_increment_counters
243  {\incrementpagenumber
244   \incrementsubpagenumber}
245
246\appendtoks
247    \strc_pagenumbers_decrement_counters
248\to \everygoodbye
249
250\newinteger\c_strc_subpage_first_real \c_strc_subpage_first_real\plusone
251
252\appendtoks
253   \ifcase\subpageno\relax
254     \global\c_strc_subpage_first_real\realpageno
255   \or
256     \global\c_strc_subpage_first_real\realpageno
257   \fi
258\to \everybeforepagebody
259
260\permanent\def\therealsubpageno#1% new helper
261  {\tointeger{\c_strc_subpage_first_real+#1+\minusone}}
262
263% Equivalents (compatibility):
264%
265% todo: maybe leave lastpage etc lua calls
266
267\permanent\def\realpage{\the\realpageno}
268\permanent\def\userpage{\the\userpageno}
269\permanent\def\subpage {\the\subpageno}
270
271% Hooks:
272
273\permanent\def\currentpage{\the\realpageno}% rather useless
274
275\appendtoks
276    \ifnum\realpageno>\lastpage
277      % \enforced\glet\lastpage\lastrealpage % maybe \aliasinteger
278        \enforced\gdef\lastpage{\lastrealpage}
279    \fi
280\to \everyinitializepagecounters
281
282% States:
283
284\newconditional\layoutisdoublesided % already defined: \newif\ifdoublesided
285\newconditional\layoutissinglesided % already defined: \newif\ifsinglesided
286
287% Realpage and subpage numbers:
288
289\permanent\protected\def\setnextrealpageno{\global\realpageno\strc_counters_incremented\s!realpage\relax}
290\permanent\protected\def\setnextsubpageno {\global\subpageno \strc_counters_incremented\s!subpage \relax}
291
292% Page numbers: (can move to lua) ... inconsistent names
293
294\installcorenamespace{pagenumberinc}
295\installcorenamespace{pagenumberdec}
296
297\protected\def\strc_pagenumbers_decrement_userpage{\global\userpageno\strc_counters_decremented\s!userpage\relax}
298\protected\def\strc_pagenumbers_increment_userpage{\global\userpageno\strc_counters_incremented\s!userpage\relax}
299
300\permanent\protected\def\decrementsubpagenumber{\global\subpageno \strc_counters_decremented\s!subpage \relax}
301\permanent\protected\def\incrementsubpagenumber{\global\subpageno \strc_counters_incremented\s!subpage \relax}
302
303\protected\def\strc_pagenumbers_synchronize_userpage{\global\c_strc_pagenumbers_state_userpage\plustwo} % start and visible
304
305\permanent\protected\def\decrementpagenumber{\csname\??pagenumberdec\namedcounterparameter\s!userpage\c!state\endcsname}
306\permanent\protected\def\incrementpagenumber{\csname\??pagenumberinc\namedcounterparameter\s!userpage\c!state\endcsname}
307
308\letcsname\??pagenumberdec\v!start\endcsname\strc_pagenumbers_decrement_userpage
309\letcsname\??pagenumberdec\v!none \endcsname\strc_pagenumbers_decrement_userpage
310\letcsname\??pagenumberdec\v!empty\endcsname\strc_pagenumbers_decrement_userpage
311
312\letcsname\??pagenumberinc\v!start\endcsname\strc_pagenumbers_increment_userpage
313\letcsname\??pagenumberinc\v!none \endcsname\strc_pagenumbers_increment_userpage
314\defcsname\??pagenumberinc\v!empty\endcsname{\strc_pagenumbers_increment_userpage\strc_pagenumbers_synchronize_userpage}
315\letcsname\??pagenumberinc\v!keep \endcsname\strc_pagenumbers_synchronize_userpage
316
317% Setup general page numbering
318
319\installcorenamespace{pagenumbering}
320
321\installdirectcommandhandler \??pagenumbering {pagenumbering}
322
323% some day ifsinglesided and ifdoublesided will become obsolete
324
325\newtoks\everysidedswitch
326
327% \appendtoks
328%    \singlesidedfalse \layoutissinglesided\conditionalfalse
329%    \doublesidedfalse \layoutisdoublesided\conditionalfalse
330%    \resetsystemmode\v!singlesided
331%    \resetsystemmode\v!doublesided
332%    \processallactionsinset
333%      [\directpagenumberingparameter\c!alternative]%
334%      [ \v!singlesided=>\setsystemmode\v!singlesided\singlesidedtrue\layoutissinglesided\conditionaltrue,
335%        \v!doublesided=>\setsystemmode\v!doublesided\doublesidedtrue\layoutisdoublesided\conditionaltrue]%
336%    \expand\everysidedswitch
337% \to \everysetuppagenumbering
338
339\appendtoks
340   \doublesidedfalse
341   \layoutisdoublesided\conditionalfalse
342   \resetsystemmode\v!doublesided
343   \ifexporting
344      \singlesidedtrue
345      \layoutissinglesided\conditionaltrue
346      \setsystemmode\v!singlesided
347   \else
348     \singlesidedfalse
349     \layoutissinglesided\conditionalfalse
350     \resetsystemmode\v!singlesided
351     \processallactionsinset
352       [\directpagenumberingparameter\c!alternative]%
353       [ \v!singlesided=>\setsystemmode\v!singlesided\singlesidedtrue\layoutissinglesided\conditionaltrue,
354         \v!doublesided=>\setsystemmode\v!doublesided\doublesidedtrue\layoutisdoublesided\conditionaltrue]%
355   \fi
356   \expand\everysidedswitch
357\to \everysetuppagenumbering
358
359\appendtoks
360   \pageduplexmode
361     \ifsinglesided
362       \ifdoublesided\plustwo\else\zerocount\fi
363     \else
364       \ifdoublesided\plusone\else\zerocount\fi
365     \fi
366   \page_backgrounds_recalculate
367   \strc_pagenumbers_set_location
368\to \everysetuppagenumbering
369
370\ifdefined \page_backgrounds_recalculate \else
371    \let\page_backgrounds_recalculate\relax
372\fi
373
374\ifdefined \strc_pagenumbers_set_location \else
375    \let\strc_pagenumbers_set_location\relax
376\fi
377
378% \protected\def\strc_pagenumbers_flush_final_page
379%   {\edef\p_strc_pagenumbers_page{\directpagenumberingparameter\c!page}%
380%    \ifempty\p_strc_pagenumbers_page \else
381%      \ifx\p_strc_pagenumbers_page\v!no \else
382%        \page[\p_strc_pagenumbers_page]%
383%      \fi
384%    \fi}
385
386\protected\def\strc_pagenumbers_flush_final_page
387  {\edef\p_strc_pagenumbers_page{\directpagenumberingparameter\c!page}%
388   \ifempty\p_strc_pagenumbers_page
389     % nothing
390   \orelse\ifx\p_strc_pagenumbers_page\v!no
391     % nothing
392   \else
393     \page[\p_strc_pagenumbers_page]%
394   \fi}
395
396% The numbered location handler is there because we need to be downward
397% compatible. So, in fact there can be multiple handlers active at the
398% same time, but only the current one does something.
399
400% Rendering:
401
402\protected\def\strc_pagenumbers_place_location
403  {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo
404     \ifnum\c_strc_pagenumbers_state=\plusone
405        \ifcstok{\directpagenumberingparameter\c!strut}\v!yes
406          \strut
407        \fi
408        \begingroup
409        \usepagenumberingstyleandcolor\c!style\c!color
410        \directpagenumberingparameter\c!command
411          {\directpagenumberingparameter\c!left
412           \labeltexts\v!pagenumber\prefixedpagenumber
413           \directpagenumberingparameter\c!right}%
414        \endgroup
415     \fi
416   \fi}
417
418\permanent\protected\def\completepagenumber
419  {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo
420     \ifnum\c_strc_pagenumbers_state=\plusone
421        \directpagenumberingparameter\c!left
422        \labeltexts\v!pagenumber\prefixedpagenumber
423        \directpagenumberingparameter\c!right
424     \fi
425   \fi}
426
427\permanent\protected\def\placepagenumber
428  {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo
429     \ifnum\c_strc_pagenumbers_state=\plusone
430        \labeltexts\v!pagenumber\pagenumber
431     \fi
432   \fi}
433
434\permanent\protected\def\referencepagenumber[#1]%
435  {\ifempty{#1}?\fi}
436
437% The numbered location handler is there because we need to be downward
438% compatible. So, in fact there can be multiple handlers active at the
439% same time, but only the current one does something.
440
441\setnewconstant\c_strc_pagenumbers_state_realpage\plustwo % counter state : 0=stop, 1=start, 2=start and visible
442\setnewconstant\c_strc_pagenumbers_state_userpage\plustwo % counter state : 0=stop, 1=start, 2=start and visible
443\setnewconstant\c_strc_pagenumbers_state_subpage \plustwo % counter state : 0=stop, 1=start, 2=start and visible
444\setnewconstant\c_strc_pagenumbers_state         \plusone % general number: 0=invisible, 1=visible
445
446\protected\def\strc_pagenumbers_check_state_change#1#2%
447  {\edef\m_strc_pagenumbers_state_new{\namedcounterparameter#1\c!state}%
448   \ifx\m_strc_pagenumbers_state_new\m_strc_pagenumbers_state_old \else
449     #2\ifx\m_strc_pagenumbers_state_new\v!start\plustwo\else\zerocount\fi
450   \fi}
451
452\appendtoks % todo: set state: none, start, stop, reset
453    \strc_pagenumbers_check_state_change\s!realpage\c_strc_pagenumbers_state_realpage
454\to \everysetuprealpagenumber
455
456\appendtoks % todo: set state: none, start, stop, reset
457    \strc_pagenumbers_check_state_change\s!userpage\c_strc_pagenumbers_state_userpage
458\to \everysetupuserpagenumber
459
460\appendtoks % todo: set state: none, start, stop, reset
461    \strc_pagenumbers_check_state_change\s!subpage\c_strc_pagenumbers_state_subpage
462\to \everysetupsubpagenumber
463
464\appendtoks % todo: set state: none, start, stop, reset
465    \ifcstok{\directpagenumberingparameter\c!state}\v!start
466      \c_strc_pagenumbers_state\plusone
467    \else
468      \c_strc_pagenumbers_state\zerocount
469    \fi
470\to \everysetuppagenumbering
471
472% Done
473
474% \c!way=\v!by\v!part
475% \c!text=
476% \v!chapter\v!number=\v!no
477% \v!part\v!number=\v!yes
478% \c!numberseparator=--
479% \c!conversion=\v!numbers
480
481\setuppagenumbering
482  [\c!alternative=\v!singlesided,
483   \c!location={\v!header,\v!middle},
484   \c!width=, % in geval van \v!marginedge
485   \c!left=,
486   \c!right=,
487   \c!page=\v!last,
488   \c!textseparator=\tfskip,
489   \c!state=\v!start,
490   \c!command=,
491   \c!strut=\v!yes,
492   \c!style=, % empty, otherwise conflict
493   \c!color=]
494
495% just for downward compatbility
496
497\appendtoks
498    \edef\scratchstringone{\namedcounterparameter\s!userpage\c!number}%
499    \ifempty\scratchstringone \else
500      \normalexpanded{\setuppagenumber[\c!start=\scratchstringone,\c!number=]}%
501      \userpageno\strc_counters_raw\s!userpage
502    \fi
503\to \everysetupuserpagenumber % todo: set state: none, start, stop, reset
504
505\appendtoks
506    \edef\scratchstringone{\namedcounterparameter\s!subpage\c!number}%
507    \ifempty\scratchstringone \else
508      \normalexpanded{\setupsubpagenumber[\c!start=\scratchstringone,\c!number=]}%
509      \subpageno\strc_counters_raw\s!subpage\relax
510    \fi
511\to \everysetupsubpagenumber % todo: set state: none, start, stop, reset
512
513% \setuplayout[width=300pt,backspace=4cm]
514% \setuppagenumbering [alternative=doublesided]
515% \setupuserpagenumber[start=2]
516% \starttext \dorecurse{20}{\input knuth \par} \stoptext
517
518\protected\def\strc_pagenumbers_check_change_shift
519  {\userpageno\strc_counters_raw\s!userpage\relax
520   \ifnum\realpageno=\plusone
521     \ifodd\userpageno
522     \else
523       \global\pagenoshift\plusone
524     \fi
525   \fi}
526
527\appendtoks % todo: set state: none, start, stop, reset
528    % this makes starting at an even page possible
529    \strc_pagenumbers_check_change_shift
530\to \everysetupuserpagenumber
531
532\appendtoks % todo: set state: none, start, stop, reset
533    % this makes starting at an even page possible
534    \strc_pagenumbers_check_change_shift
535\to \everysetuppagenumbering
536
537\initializepagecounters
538
539\stopcontextdefinitioncode
540
541\protect \endinput
542