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
25
26
27
28
29
30
31
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
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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
95\newtoks\everysetupuserpagenumber
96\newtoks\everysetupsubpagenumber
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 {}
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
124
125\def\strc_pagenumbers_page_state_save
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}
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]
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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
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
213
214\permanent\def\pagenumber {\strc_counters_raw\s!userpage}
215\permanent\def\prefixedpagenumber {\directconvertedcounter\s!userpage\empty}
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
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
261 {\tointeger{\c_strc_subpage_first_real#1\minusone}}
262
263
264
265
266
267\permanent\def\realpage{\the\realpageno}
268\permanent\def\userpage{\the\userpageno}
269\permanent\def\subpage {\the\subpageno}
270
271
272
273\permanent\def\currentpage{\the\realpageno}
274
275\appendtoks
276 \ifnum\realpageno>\lastpage
277
278 \enforced\gdef\lastpage{\lastrealpage}
279 \fi
280\to \everyinitializepagecounters
281
282
283
284\newconditional\layoutisdoublesided
285\newconditional\layoutissinglesided
286
287
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
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}
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
318
319\installcorenamespace{pagenumbering}
320
321\installdirectcommandhandler \??pagenumbering {pagenumbering}
322
323
324
325\newtoks\everysidedswitch
326
327
328
329
330
331
332
333
334
335
336
337
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
379
380
381
382
383
384
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
390 \orelse\ifx\p_strc_pagenumbers_page\v!no
391
392 \else
393 \page[\p_strc_pagenumbers_page]
394 \fi}
395
396
397
398
399
400
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
438
439
440
441\setnewconstant\c_strc_pagenumbers_state_realpage\plustwo
442\setnewconstant\c_strc_pagenumbers_state_userpage\plustwo
443\setnewconstant\c_strc_pagenumbers_state_subpage \plustwo
444\setnewconstant\c_strc_pagenumbers_state \plusone
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
453 \strc_pagenumbers_check_state_change\s!realpage\c_strc_pagenumbers_state_realpage
454\to \everysetuprealpagenumber
455
456\appendtoks
457 \strc_pagenumbers_check_state_change\s!userpage\c_strc_pagenumbers_state_userpage
458\to \everysetupuserpagenumber
459
460\appendtoks
461 \strc_pagenumbers_check_state_change\s!subpage\c_strc_pagenumbers_state_subpage
462\to \everysetupsubpagenumber
463
464\appendtoks
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
473
474
475
476
477
478
479
480
481\setuppagenumbering
482 [\c!alternative=\v!singlesided,
483 \c!location={\v!header,\v!middle},
484 \c!width=,
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=,
493 \c!color=]
494
495
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
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
512
513
514
515
516
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
528
529 \strc_pagenumbers_check_change_shift
530\to \everysetupuserpagenumber
531
532\appendtoks
533
534 \strc_pagenumbers_check_change_shift
535\to \everysetuppagenumbering
536
537\initializepagecounters
538
539\stopcontextdefinitioncode
540
541\protect \endinput
542 |