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