1
2
3
4
5
6
7
8
9
10
11
12
13
14\writestatus{loading}{ConTeXt Structure Macros Pagenumbering}
15
16\registerctxluafile{strcpag}{}
17
18\unprotect
19
20\startcontextdefinitioncode
21
22
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
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\pageno \else \aliased\let\pageno\userpageno \fi
34
35\permanent\def\realfolio{\the\realpageno}
36\permanent\def\userfolio{\the\userpageno}
37\permanent\def\subfolio {\the\subpageno }
38\permanent\def\lastfolio{\the\lastpageno}
39
40\newtoks\everyinitializepagecounters
41
42\permanent\protected\def\initializepagecounters
43 {\expand\everyinitializepagecounters}
44
45\appendtoks
46 \initializepagecounters
47\to \everyjob
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81\definecounter[\s!realpage][\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=realpageno,\c!method=\v!page]
82\definecounter[\s!userpage][\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=userpageno,\c!method=\v!page]
83\definecounter[\s!subpage] [\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=subpageno, \c!method=\v!page]
84
85\newtoks\everysetuprealpagenumber
86\newtoks\everysetupuserpagenumber
87\newtoks\everysetupsubpagenumber
88
89\let\m_strc_pagenumbers_state_old\zerocount
90\let\m_strc_pagenumbers_state_new\zerocount
91
92\def\strc_pagenumbers_save_state#1{\edef\m_strc_pagenumbers_state_old{\namedcounterparameter#1\c!state}}
93
94\permanent\tolerant\protected\def\setuprealpagenumber[#S#1]{\strc_pagenumbers_save_state\s!realpage\setupcounter[\s!realpage][#1]\expand\everysetuprealpagenumber}
95\permanent\tolerant\protected\def\setupuserpagenumber[#S#1]{\strc_pagenumbers_save_state\s!userpage\setupcounter[\s!userpage][#1]\expand\everysetupuserpagenumber}
96\permanent\tolerant\protected\def\setupsubpagenumber [#S#1]{\strc_pagenumbers_save_state\s!subpage \setupcounter[\s!subpage ][#1]\expand\everysetupsubpagenumber }
97
98\permanent\protected\def\resetrealpagenumber {}
99\permanent\protected\def\resetuserpagenumber {\strc_counters_reset\s!userpage}
100\permanent\protected\def\resetsubpagenumber {\strc_counters_reset\s!subpage}
101
102\appendtoks
103 \strc_counters_set\s!realpage\realpageno
104 \strc_counters_set\s!userpage\userpageno
105 \strc_counters_set\s!subpage \subpageno
106 \lastpageno \lastcountervalue[\s!realpage]\relax
107 \lastuserpageno\lastcountervalue[\s!userpage]\relax
108 \lastsubpageno \lastcountervalue[\s!subpage ]\relax
109\to \everyinitializepagecounters
110
111\aliased\let\setuppagenumber\setupuserpagenumber
112\aliased\let\resetpagenumber\resetuserpagenumber
113
114
115
116\def\strc_pagenumbers_page_state_save
117 {\clf_savepagedata
118 {
119 prefix {\namedcounterparameter\s!userpage\c!prefix}
120 separatorset {\namedcounterparameter\s!userpage\c!prefixseparatorset}
121 conversion {\namedcounterparameter\s!userpage\c!prefixconversion}
122 conversionset {\namedcounterparameter\s!userpage\c!prefixconversionset}
123 set {\namedcounterparameter\s!userpage\c!prefixset}
124 segments {\namedcounterparameter\s!userpage\c!prefixsegments}
125 connector {\namedcounterparameter\s!userpage\c!prefixconnector}
126 }{
127 conversion {\namedcounterparameter\s!userpage\c!numberconversion}
128 conversionset {\namedcounterparameter\s!userpage\c!numberconversionset}
129 starter {\namedcounterparameter\s!userpage\c!numberstarter}
130 stopper {\namedcounterparameter\s!userpage\c!numberstopper}
131 }{
132 viewerprefix {\namedcounterparameter\s!userpage\c!viewerprefix}
133 state {\namedcounterparameter\s!userpage\c!state}
134 }
135 \relax}
136
137\prependtoks
138 \strc_pagenumbers_page_state_save
139\to \everyshipout
140
141\installcorenamespace{pagestatestack}
142
143\protected\def\strc_pagenumbers_page_state_push{\xdefcsname\??pagestatestack\c!state\endcsname{\namedcounterparameter\s!userpage\c!state}}
144\protected\def\strc_pagenumbers_page_state_pop {\normalexpanded{\setuppagenumber[\c!state=\csname\??pagestatestack\c!state\endcsname]}}
145
146\setuppagenumber
147 [\c!way=\v!by\v!text,
148 \c!prefix=\v!no,
149 \c!prefixset=\v!part,
150 \c!prefixconnector=\endash,
151 \c!state=\v!start]
152
153\setupsubpagenumber
154 [\c!way=\v!by\v!part,
155 \c!state=\v!start]
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175\permanent\def\firstrealpage{\strc_counters_first\s!realpage}
176\permanent\def\firstuserpage{\strc_counters_first\s!userpage}
177\permanent\def\firstsubpage {\strc_counters_first\s!subpage }
178
179\permanent\def\prevrealpage {\strc_counters_prev \s!realpage}
180\permanent\def\prevuserpage {\strc_counters_prev \s!userpage}
181\permanent\def\prevsubpage {\strc_counters_prev \s!subpage }
182
183\permanent\def\nextrealpage {\strc_counters_next \s!realpage}
184\permanent\def\nextuserpage {\strc_counters_next \s!userpage}
185\permanent\def\nextsubpage {\strc_counters_next \s!subpage }
186
187\permanent\def\lastrealpage {\strc_counters_last \s!realpage}
188\permanent\def\lastuserpage {\strc_counters_last \s!userpage}
189\permanent\def\lastsubpage {\strc_counters_last \s!subpage }
190
191\aliased\let\firstpage\firstrealpage
192\aliased\let\prevpage \prevrealpage
193\aliased\let\nextpage \nextrealpage
194\aliased\let\lastpage \lastrealpage
195
196
197
198\permanent\def\nofrealpages {\lastrealpage} \permanent\def\totalnumberofpages{\lastrealpage}
199\permanent\def\nofuserpages {\lastuserpage} \permanent\def\lastpagenumber {\lastuserpage}
200\permanent\def\nofsubpages {\lastsubpage }
201
202
203
204\permanent\def\pagenumber {\strc_counters_raw\s!userpage}
205\permanent\def\prefixedpagenumber {\directconvertedcounter\s!userpage\empty}
206
207\permanent\def\realpagenumber {\directconvertedcounter\s!realpage\empty}
208\permanent\def\userpagenumber {\directconvertedcounter\s!userpage\empty}
209\permanent\def\subpagenumber {\directconvertedcounter\s!subpage \empty}
210
211\permanent\def\firstrealpagenumber{\directconvertedcounter\s!realpage\v!first}
212\permanent\def\firstuserpagenumber{\directconvertedcounter\s!userpage\v!first}
213\permanent\def\firstsubpagenumber {\directconvertedcounter\s!subpage \v!first}
214
215\permanent\def\lastrealpagenumber {\directconvertedcounter\s!realpage\v!last}
216\permanent\def\lastuserpagenumber {\directconvertedcounter\s!userpage\v!last}
217\permanent\def\lastsubpagenumber {\directconvertedcounter\s!subpage \v!last}
218
219\permanent\def\prevrealpagenumber {\directconvertedcounter\s!realpage\v!previous}
220\permanent\def\prevuserpagenumber {\directconvertedcounter\s!userpage\v!previous}
221\permanent\def\prevsubpagenumber {\directconvertedcounter\s!subpage \v!previous}
222
223\permanent\def\nextrealpagenumber {\directconvertedcounter\s!realpage\v!next}
224\permanent\def\nextuserpagenumber {\directconvertedcounter\s!userpage\v!next}
225\permanent\def\nextsubpagenumber {\directconvertedcounter\s!subpage \v!next}
226
227\protected\def\strc_pagenumbers_decrement_counters
228 {\strc_counters_decrement\s!realpage
229 \strc_counters_decrement\s!userpage
230 \strc_counters_decrement\s!subpage}
231
232\protected\def\strc_pagenumbers_increment_counters
233 {\incrementpagenumber
234 \incrementsubpagenumber}
235
236\appendtoks
237 \strc_pagenumbers_decrement_counters
238\to \everygoodbye
239
240\newinteger\c_strc_subpage_first_real \c_strc_subpage_first_real\plusone
241
242\appendtoks
243 \ifcase\subpageno\relax
244 \global\c_strc_subpage_first_real\realpageno
245 \or
246 \global\c_strc_subpage_first_real\realpageno
247 \fi
248\to \everybeforepagebody
249
250\permanent\def\therealsubpageno#1
251 {\the\numexpr\c_strc_subpage_first_real#1\minusone\relax}
252
253
254
255
256
257\permanent\def\realpage{\the\realpageno}
258\permanent\def\userpage{\the\userpageno}
259\permanent\def\subpage {\the\subpageno}
260
261
262
263\permanent\def\currentpage{\the\realpageno}
264
265\appendtoks
266 \ifnum\realpageno>\lastpage \enforced\glet\lastpage\lastrealpage \fi
267\to \everyinitializepagecounters
268
269
270
271\newconditional\layoutisdoublesided
272\newconditional\layoutissinglesided
273
274
275
276\permanent\protected\def\setnextrealpageno{\global\realpageno\strc_counters_incremented\s!realpage\relax}
277\permanent\protected\def\setnextsubpageno {\global\subpageno \strc_counters_incremented\s!subpage \relax}
278
279
280
281\installcorenamespace{pagenumberinc}
282\installcorenamespace{pagenumberdec}
283
284\protected\def\strc_pagenumbers_decrement_userpage{\global\userpageno\strc_counters_decremented\s!userpage\relax}
285\protected\def\strc_pagenumbers_increment_userpage{\global\userpageno\strc_counters_incremented\s!userpage\relax}
286
287\permanent\protected\def\decrementsubpagenumber{\global\subpageno \strc_counters_decremented\s!subpage \relax}
288\permanent\protected\def\incrementsubpagenumber{\global\subpageno \strc_counters_incremented\s!subpage \relax}
289
290\protected\def\strc_pagenumbers_synchronize_userpage{\global\c_strc_pagenumbers_state_userpage\plustwo}
291
292\permanent\protected\def\decrementpagenumber{\csname\??pagenumberdec\namedcounterparameter\s!userpage\c!state\endcsname}
293\permanent\protected\def\incrementpagenumber{\csname\??pagenumberinc\namedcounterparameter\s!userpage\c!state\endcsname}
294
295\letcsname\??pagenumberdec\v!start\endcsname\strc_pagenumbers_decrement_userpage
296\letcsname\??pagenumberdec\v!none \endcsname\strc_pagenumbers_decrement_userpage
297\letcsname\??pagenumberdec\v!empty\endcsname\strc_pagenumbers_decrement_userpage
298
299\letcsname\??pagenumberinc\v!start\endcsname\strc_pagenumbers_increment_userpage
300\letcsname\??pagenumberinc\v!none \endcsname\strc_pagenumbers_increment_userpage
301\defcsname\??pagenumberinc\v!empty\endcsname{\strc_pagenumbers_increment_userpage\strc_pagenumbers_synchronize_userpage}
302\letcsname\??pagenumberinc\v!keep \endcsname\strc_pagenumbers_synchronize_userpage
303
304
305
306\installcorenamespace{pagenumbering}
307
308\installdirectcommandhandler \??pagenumbering {pagenumbering}
309
310
311
312\newtoks\everysidedswitch
313
314\appendtoks
315 \singlesidedfalse \layoutisdoublesided\conditionalfalse
316 \doublesidedfalse \layoutissinglesided\conditionalfalse
317 \resetsystemmode\v!singlesided
318 \resetsystemmode\v!doublesided
319 \processallactionsinset
320 [\directpagenumberingparameter\c!alternative]
321 [ \v!singlesided=>\setsystemmode\v!singlesided\singlesidedtrue\layoutissinglesided\conditionaltrue,
322 \v!doublesided=>\setsystemmode\v!doublesided\doublesidedtrue\layoutisdoublesided\conditionaltrue]
323 \expand\everysidedswitch
324 \pageduplexmode
325 \ifsinglesided
326 \ifdoublesided\plustwo\else\zerocount\fi
327 \else
328 \ifdoublesided\plusone\else\zerocount\fi
329 \fi
330 \page_backgrounds_recalculate
331 \strc_pagenumbers_set_location
332\to \everysetuppagenumbering
333
334\ifdefined \page_backgrounds_recalculate \else
335 \let\page_backgrounds_recalculate\relax
336\fi
337
338\ifdefined \strc_pagenumbers_set_location \else
339 \let\strc_pagenumbers_set_location\relax
340\fi
341
342
343
344
345
346
347
348
349
350\protected\def\strc_pagenumbers_flush_final_page
351 {\edef\p_strc_pagenumbers_page{\directpagenumberingparameter\c!page}
352 \ifempty\p_strc_pagenumbers_page
353
354 \orelse\ifx\p_strc_pagenumbers_page\v!no
355
356 \else
357 \page[\p_strc_pagenumbers_page]
358 \fi}
359
360
361
362
363
364
365
366\protected\def\strc_pagenumbers_place_location
367 {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo
368 \ifnum\c_strc_pagenumbers_state=\plusone
369 \ifcstok{\directpagenumberingparameter\c!strut}\v!yes
370 \strut
371 \fi
372 \begingroup
373 \usepagenumberingstyleandcolor\c!style\c!color
374 \directpagenumberingparameter\c!command
375 {\directpagenumberingparameter\c!left
376 \labeltexts\v!pagenumber\prefixedpagenumber
377 \directpagenumberingparameter\c!right}
378 \endgroup
379 \fi
380 \fi}
381
382\permanent\protected\def\completepagenumber
383 {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo
384 \ifnum\c_strc_pagenumbers_state=\plusone
385 \directpagenumberingparameter\c!left
386 \labeltexts\v!pagenumber\prefixedpagenumber
387 \directpagenumberingparameter\c!right
388 \fi
389 \fi}
390
391\permanent\protected\def\placepagenumber
392 {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo
393 \ifnum\c_strc_pagenumbers_state=\plusone
394 \labeltexts\v!pagenumber\pagenumber
395 \fi
396 \fi}
397
398\permanent\protected\def\referencepagenumber[#1]
399 {\ifempty{#1}?\fi}
400
401
402
403
404
405\setnewconstant\c_strc_pagenumbers_state_realpage\plustwo
406\setnewconstant\c_strc_pagenumbers_state_userpage\plustwo
407\setnewconstant\c_strc_pagenumbers_state_subpage \plustwo
408\setnewconstant\c_strc_pagenumbers_state \plusone
409
410\protected\def\strc_pagenumbers_check_state_change#1#2
411 {\edef\m_strc_pagenumbers_state_new{\namedcounterparameter#1\c!state}
412 \ifx\m_strc_pagenumbers_state_new\m_strc_pagenumbers_state_old \else
413 #2\ifx\m_strc_pagenumbers_state_new\v!start\plustwo\else\zerocount\fi
414 \fi}
415
416\appendtoks
417 \strc_pagenumbers_check_state_change\s!realpage\c_strc_pagenumbers_state_realpage
418\to \everysetuprealpagenumber
419
420\appendtoks
421 \strc_pagenumbers_check_state_change\s!userpage\c_strc_pagenumbers_state_userpage
422\to \everysetupuserpagenumber
423
424\appendtoks
425 \strc_pagenumbers_check_state_change\s!subpage\c_strc_pagenumbers_state_subpage
426\to \everysetupsubpagenumber
427
428\appendtoks
429 \ifcstok{\directpagenumberingparameter\c!state}\v!start
430 \c_strc_pagenumbers_state\plusone
431 \else
432 \c_strc_pagenumbers_state\zerocount
433 \fi
434\to \everysetuppagenumbering
435
436
437
438
439
440
441
442
443
444
445\setuppagenumbering
446 [\c!alternative=\v!singlesided,
447 \c!location={\v!header,\v!middle},
448 \c!width=,
449 \c!left=,
450 \c!right=,
451 \c!page=\v!last,
452 \c!textseparator=\tfskip,
453 \c!state=\v!start,
454 \c!command=,
455 \c!strut=\v!yes,
456 \c!style=,
457 \c!color=]
458
459
460
461\appendtoks
462 \edef\scratchstringone{\namedcounterparameter\s!userpage\c!number}
463 \ifempty\scratchstringone \else
464 \normalexpanded{\setuppagenumber[\c!start=\scratchstringone,\c!number=]}
465 \userpageno\strc_counters_raw\s!userpage
466 \fi
467\to \everysetupuserpagenumber
468
469\appendtoks
470 \edef\scratchstringone{\namedcounterparameter\s!subpage\c!number}
471 \ifempty\scratchstringone \else
472 \normalexpanded{\setupsubpagenumber[\c!start=\scratchstringone,\c!number=]}
473 \subpageno\strc_counters_raw\s!subpage\relax
474 \fi
475\to \everysetupsubpagenumber
476
477
478
479
480
481
482\protected\def\strc_pagenumbers_check_change_shift
483 {\userpageno\strc_counters_raw\s!userpage\relax
484 \ifnum\realpageno=\plusone
485 \ifodd\userpageno
486 \else
487 \global\pagenoshift\plusone
488 \fi
489 \fi}
490
491\appendtoks
492
493 \strc_pagenumbers_check_change_shift
494\to \everysetupuserpagenumber
495
496\appendtoks
497
498 \strc_pagenumbers_check_change_shift
499\to \everysetuppagenumbering
500
501\initializepagecounters
502
503\stopcontextdefinitioncode
504
505\protect \endinput
506 |