page-sel.mklx /size: 18 Kb    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=page-sel, % moved from page-imp
3%D        version=1998.01.15,
4%D          title=\CONTEXT\ Page Macros,
5%D       subtitle=Page Selection,
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%D This code relates to old texexec features and one can wonder if it needs
15%D to be in the core. So, this could become runtime loaded code. Some of
16%D the alternatives need checking.
17
18%D Todo: update to use luametatex features.
19
20\writestatus{loading}{ConTeXt Page Macros / Page Selection}
21
22\unprotect
23
24\registerctxluafile{page-sel}{autosuffix}
25
26\startcontextdefinitioncode
27
28%D One can (mis)use this mechanism to (re)arrange pages of already produced files.
29%D
30%D \starttyping
31%D \insertpages[file.pdf][1,3][n=30,width=18cm]
32%D \stoptyping
33%D
34%D The pages are inserted in the text area, and even pages are repositioned
35%D according to the width. In this example empty pages are added after page 1 and 3.
36%D
37%D Selecting pages can be accomplished by:
38%D
39%D \starttyping
40%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
41%D \stoptyping
42%D
43%D One may pass \type {odd} or \type {even} instead of a comma separated list. A
44%D third alternative is:
45%D
46%D \starttyping
47%D \copypages[file.pdf][n=30,scale=950]
48%D \stoptyping
49%D
50%D This macros inserts the page, according to the settings provided.
51
52%D Beware: width is not the width of the image, but height can be used to control
53%D its dimensions.
54
55\installcorenamespace{withpages}
56
57\installsetuponlycommandhandler \??withpages {withpages}
58%  \installdirectcommandhandler \??withpages {withpages}
59
60\newinteger\c_page_selectors_n
61
62\permanent\tolerant\protected\def\insertpages[#filename]#spacer[#emptylist]#spacer[#S#settings]%
63  {\doifelseassignment{#emptylist}%
64     {\page_selectors_insert_indeed[#filename][][#emptylist]}%
65     {\page_selectors_insert_indeed[#filename][#emptylist][#settings]}}
66
67\def\page_selectors_insert_indeed[#filename][#emptylist][#S#settings]%
68  {\bgroup
69   \dontcomplain
70   \getfiguredimensions[#filename]%
71   \setupcurrentwithpages
72     [\c!width=\zeropoint,
73      \c!n=\noffigurepages,
74      \c!category=,
75      \c!alternative=\v!a,
76      #settings]%
77   \global\c_page_selectors_n\directwithpagesparameter\c!n\relax
78   \scratchwidth\directwithpagesparameter\c!width\relax
79   \ifinset{0}{#emptylist}%
80     \emptyhbox
81     \page
82   \fi
83   \dorecurse\c_page_selectors_n
84     {\page_selectors_filter_alternative{#filename}\recurselevel
85      \ifinset{\recurselevel}{#emptylist}%
86        \emptyhbox
87        \page
88      \fi}%
89   \egroup}
90
91\let\page_selectors_filter_step_indeed\gobbleoneargument
92\let\page_selectors_filter_step       \gobbleoneargument
93
94\installcorenamespace{filterpagesalternative}
95
96\protected\def\page_selectors_filter_alternative
97  {\expandnamespaceparameter
98     \??filterpagesalternative
99     \directwithpagesparameter\c!alternative
100     \v!a}
101
102\permanent\tolerant\protected\def\filterpages[#filename]#spacer[#selection]#spacer[#S#settings]%
103  {\doifelseassignment{#selection}%
104     {\page_selectors_filter_indeed[#filename][][#selection]}%
105     {\page_selectors_filter_indeed[#filename][#selection][#settings]}}
106
107\def\page_selectors_filter_indeed[#filename][#selection][#S#settings]% % \noffigurepages not yet supported
108  {\bgroup
109   \dontcomplain
110   \getfiguredimensions[#filename]%
111   \setupcurrentwithpages
112     [\c!width=\zeropoint,
113      \c!n=\noffigurepages,
114      \c!category=,
115      \c!alternative=\v!a,
116      #settings]%
117   \global\c_page_selectors_n\directwithpagesparameter\c!n\relax
118   \scratchwidth\directwithpagesparameter\c!width\relax
119   \edef\p_selection{#selection}%
120   \ifempty\p_selection
121     \let\p_selection\v!all
122   \fi
123   \ifx\p_selection\v!all
124     \dorecurse\c_page_selectors_n
125       {\page_selectors_filter_alternative{#filename}\recurselevel}%
126   \orelse\ifx\p_selection\v!even
127     \dorecurse\c_page_selectors_n
128       {\ifodd\recurselevel\else
129          \page_selectors_filter_alternative{#filename}\recurselevel
130        \fi}%
131   \orelse\ifx\p_selection\v!odd
132     \dorecurse\c_page_selectors_n
133       {\ifodd\recurselevel\relax
134          \page_selectors_filter_alternative{#filename}\recurselevel
135        \fi}%
136   \else
137     \def\page_selectors_filter_step_indeed#page%
138       {\ifnum#page>\c_page_selectors_n\else
139          \page_selectors_filter_alternative{#filename}{#page}%
140        \fi}%
141     \def\page_selectors_filter_step#step%
142       {\dowithminmaxrange{1}{\noffigurepages}{#step}\page_selectors_filter_step_indeed}%
143     \processcommacommand[\p_selection]\page_selectors_filter_step
144   \fi
145   \egroup}
146
147\defcsname\??filterpagesalternative\v!a\endcsname#filename#page%
148  {\hpack to \textwidth
149     {\ifdim\scratchwidth>\zeropoint
150        \rightorleftpageaction{\scratchwidth\zeropoint}{\hfill}%
151      \fi
152      \setbox\scratchbox\hpack
153        {\hskip-\scratchwidth
154         \edef\p_category{\directwithpagesparameter\c!category}% \useexternalfigure[foo][width=\textwidth]
155         \ifx\p_category\empty
156           \externalfigure[#filename][\c!page=#page,\c!height=\textheight]%
157         \else
158           \externalfigure[#filename][\p_category][\c!page=#page]%
159         \fi
160         \hss}%
161      \wd\scratchbox\zeropoint
162      \box\scratchbox}%
163   \page}
164
165\defcsname\??filterpagesalternative\v!b\endcsname#filename#page%
166  {\startTEXpage
167     \externalfigure[#filename][\c!page=#page]%
168   \stopTEXpage}
169
170\letcsname\??filterpagesalternative\v!default\expandafter\endcsname\csname\??filterpagesalternative\v!a\endcsname
171\letcsname\??filterpagesalternative\v!page   \expandafter\endcsname\csname\??filterpagesalternative\v!b\endcsname
172
173\permanent\tolerant\protected\def\copypages[#filename]#spacer[#S#settings]#spacer[#S#figuresettings]%
174  {\bgroup
175   \getfiguredimensions[#filename]%
176   \setupcurrentwithpages
177     [\c!marking=\v!off,
178      \c!offset=\zeropoint,
179      \c!n=\noffigurepages,
180      \c!category=,
181      #settings]%
182   \global\c_page_selectors_n\directwithpagesparameter\c!n\relax
183   \scratchoffset\directwithpagesparameter\c!offset\relax
184   \dorecurse\c_page_selectors_n
185     {\vbox to \textheight
186        {\hsize\textwidth
187         \centeredbox
188           {\ifcstok{\directwithpagesparameter\c!marking}\v!on
189              \expandafter\cuthbox
190            \else
191              \expandafter\hpack % only place where cuthbox is used
192            \fi
193              {\ifdim\scratchoffset>\zeropoint\relax
194                 \advanceby\vsize -2\scratchoffset
195                 \advanceby\hsize -2\scratchoffset
196                 \externalfigure[#filename][\c!page=\recurselevel,#figuresettings,\c!scale=,\c!factor=\v!max,\c!offset=\v!overlay]%
197               \else
198                 \externalfigure[#filename][\c!page=\recurselevel,#figuresettings,\c!offset=\v!overlay]%
199               \fi}}}%
200      \page}%
201   \egroup}
202
203%D \macros
204%D   {combinepages}
205%D
206%D Yet another way of postprocessing is handles by \type {\combinepages}. This macro
207%D builds a matrix of pages from a file, for example:
208%D
209%D \starttyping
210%D \setuppapersize
211%D   [A4][A4] % or [A4,landscape][A4,landscape]
212%D
213%D \setuplayout
214%D   [header=0pt,footer=1cm,
215%D    backspace=1cm,topspace=1cm,
216%D    width=middle,height=middle]
217%D
218%D \setupfootertexts
219%D   [presentation---\currentdate\space---\space\pagenumber]
220%D
221%D \starttext
222%D   \combinepages[slides][nx=2,ny=3,frame=on]
223%D \stoptext
224%D \stoptyping
225%D
226%D One can influence the way the pages are combined. (This will be explained some
227%D time.)
228
229\installcorenamespace{combinepagesalternative}
230
231\permanent\tolerant\protected\def\combinepages[#filename]#spacer[#S#settings]% a=perpag b=free
232  {\bgroup
233   \dontcomplain
234   \getfiguredimensions[#filename]%
235   \setupcurrentwithpages
236     [\c!alternative=\v!a,
237      \c!n=\noffigurepages,\c!nx=\plustwo,\c!ny=\plustwo,
238      \c!start=\plusone,\c!stop=\maxcard,
239      \c!distance=\bodyfontsize,
240      \c!bottom=\vfill,\c!top=\vss,\c!left=\hss,\c!right=\hss,
241      \c!before=\page,\c!after=\page,\c!inbetween=\blank,
242      \c!frame=,\c!background=,\c!backgroundcolor=,
243      \c!name={#filename},
244      \c!category=,
245      #settings]%
246   \global\c_page_selectors_n\directwithpagesparameter\c!n\relax
247   \directwithpagesparameter\c!before
248   \scratchnx\directwithpagesparameter\c!nx
249   \scratchny\directwithpagesparameter\c!ny
250   \scratchdistance\directwithpagesparameter\c!distance\relax
251   \scratchwidth\dimexpr(\textwidth-\scratchnx\scratchdistance+\scratchdistance)/\scratchnx\relax
252   \scratchheight\dimexpr(\textheight-\scratchny\scratchdistance+\scratchdistance)/\scratchny\relax
253   \expandnamespaceparameter\??combinepagesalternative\directwithpagesparameter\c!alternative\v!b
254   \directwithpagesparameter\c!after
255   \egroup}
256
257\defcsname\??combinepagesalternative\v!a\endcsname % use hpacks
258  {\global\combinedpagescounter\directwithpagesparameter\c!start\relax
259   \doloop
260     {\vbox to \textheight
261        {\dorecurse\scratchny
262           {\hbox to \textwidth
263              {\dorecurse\scratchnx
264                 {\vbox to \scratchheight
265                    {\hsize\scratchwidth
266                     \vsize\scratchheight
267                     \directwithpagesparameter\c!top
268                     \hbox to \hsize
269                       {\directwithpagesparameter\c!left
270                        \ifnum\combinedpagescounter>\directwithpagesparameter\c!stop\relax
271                          \global\c_page_selectors_n\zerocount
272                        \orelse\ifnum\combinedpagescounter>\c_page_selectors_n \else
273                          \externalfigure
274                            [\directwithpagesparameter\c!name]
275                            [\c!object=\v!no,
276                             \c!page=\number\combinedpagescounter,
277                             \c!factor=\v!max,
278                             \c!background=\directwithpagesparameter\c!background,
279                             \c!backgroundcolor=\directwithpagesparameter\c!backgroundcolor,
280                             \c!frame=\directwithpagesparameter\c!frame]%
281                        \fi
282                        \directwithpagesparameter\c!right}%
283                     \directwithpagesparameter\c!bottom}%
284                  \global\advanceby\combinedpagescounter\plusone
285                  \hfil}%
286               \hfilneg}
287            \vfil}%
288         \vfilneg}%
289         \page
290         \ifnum\combinedpagescounter>\c_page_selectors_n
291           \exitloop
292         \fi}}
293
294\defcsname\??combinepagesalternative\v!c\endcsname
295  {\global\combinedpagescounter\directwithpagesparameter\c!start\relax
296   \doloop
297     {\vbox to \textheight
298        {\hbox to \textwidth
299           {\dorecurse\scratchnx
300              {\directwithpagesparameter\c!left
301               \vbox to \textheight
302                 {\hsize\scratchwidth
303                  \dorecurse\scratchny
304                    {\directwithpagesparameter\c!top
305                     \hbox to \hsize
306                       {\vbox to \scratchheight
307                          {\hsize\scratchwidth
308                           \vsize\scratchheight
309                           \ifnum\combinedpagescounter>\directwithpagesparameter\c!stop\relax
310                             \global\c_page_selectors_n\zerocount
311                           \orunless\ifnum\combinedpagescounter>\c_page_selectors_n
312                             \externalfigure
313                               [\directwithpagesparameter\c!name]
314                               [\c!object=\v!no,
315                                \c!page=\number\combinedpagescounter,
316                                \c!factor=\v!max,
317                                \c!background=\directwithpagesparameter\c!background,
318                                \c!backgroundcolor=\directwithpagesparameter\c!backgroundcolor,
319                                \c!frame=\directwithpagesparameter\c!frame]%
320                           \fi}}
321                      \global\advanceby\combinedpagescounter\plusone
322                      \directwithpagesparameter\c!bottom}}%
323                \hfil}%
324            \hfilneg}}%
325      \page
326      \ifnum\combinedpagescounter>\c_page_selectors_n
327        \exitloop
328      \fi}}
329
330\letcsname\??combinepagesalternative\v!horizontal\expandafter\endcsname\csname\??combinepagesalternative\v!a\endcsname
331\letcsname\??combinepagesalternative\v!vertical  \expandafter\endcsname\csname\??combinepagesalternative\v!c\endcsname
332
333\defcsname\??combinepagesalternative\v!b\endcsname
334  {\global\combinedpagescounter\directwithpagesparameter\c!start\relax
335   \doloop
336     {\startbaselinecorrection
337        \hbox to \textwidth
338          {\dorecurse\scratchnx
339             {\global\advanceby\combinedpagescounter\plusone
340              \ifnum\combinedpagescounter>\c_page_selectors_n \else
341                 \normalexpanded{\externalfigure
342                   [\directwithpagesparameter\c!name]
343                   [\c!page=\number\combinedpagescounter,
344                    \c!width=\the\scratchwidth,
345                    \c!background=\directwithpagesparameter\c!background,
346                    \c!backgroundcolor=\directwithpagesparameter\c!backgroundcolor,
347                    \c!frame=\directwithpagesparameter\c!frame]}%
348                 \hfill
349              \fi}%
350              \hfillneg}%
351      \stopbaselinecorrection
352      \ifnum\combinedpagescounter<\c_page_selectors_n\relax
353        \directwithpagesparameter\c!inbetween
354      \else
355        \exitloop
356      \fi}}
357
358% This macro cuts a page into n parts that can be pasted together.
359
360\permanent\tolerant\protected\def\slicepages[#filename]#spacer[#S#oddsettings]#spacer[#S#evensettings]%
361  {\ifparameter#evensettings\or
362     \page_selectors_slice_indeed[#filename][#oddsettings][#evensettings]%
363   \else
364     \page_selectors_slice_indeed[#filename][#oddsettings][#oddsettings]%
365   \fi}
366
367\mutable\let\slicedpagenumber\!!zerocount
368\mutable\let\slicedpagestepx \!!zerocount
369\mutable\let\slicedpagestepy \!!zerocount
370
371\def\page_selectors_slice_indeed[#filename][#S#oddsettings][#S#evensettings]%
372  {\bgroup
373   \dontcomplain
374   \glet\slicedpagenumber\!!zerocount
375   \getfiguredimensions[#filename]%
376   \setupcurrentwithpages
377     [\c!offset=\zeropoint,
378      \c!hoffset=\zeropoint,
379      \c!voffset=\zeropoint,
380      \c!width=\figurewidth,
381      \c!height=\figureheight,
382      \c!n=\noffigurepages,
383      \c!category=,
384      #oddsettings]%
385   \global\c_page_selectors_n\directwithpagesparameter\c!n\relax
386   \ifnum\c_page_selectors_n>\zerocount
387     \definepapersize
388       [\s!dummy]
389       [\c!height=\directwithpagesparameter\c!height,
390        \c!width=\directwithpagesparameter\c!width]%
391     \setuppapersize
392       [\s!dummy]
393       [\s!dummy]%
394     \setuplayout
395       [\c!backspace=\zeropoint,\c!topspace=\zeropoint,
396        \c!height=\v!middle,\c!width=\v!middle,
397        \c!textdistance=\zeropoint,
398        \c!header=\zeropoint,\c!footer=\zeropoint]%
399   \fi
400   \dorecurse\noffigurepages
401     {\glet\slicedpagenumber\recurselevel
402      \ifnum\c_page_selectors_n>\plusone
403        \dorecurse\c_page_selectors_n
404          {\let\slicedpagestepx\recurselevel
405           \dorecurse\c_page_selectors_n
406             {\let\slicedpagestepy\recurselevel
407              \clip
408                [\c!nx=\c_page_selectors_n,\c!ny=\c_page_selectors_n,\c!x=\slicedpagestepx,\c!y=\slicedpagestepy]%
409                {\scale
410                   [\c!scale=\the\c_page_selectors_n000]%
411                   {\externalfigure[#filename][\c!page=\slicedpagenumber]}}%
412              \page}}%
413      \else
414        \ifodd\slicedpagenumber\relax
415          \setupcurrentwithpages[#oddsettings]%
416        \else
417          \setupcurrentwithpages[#evensettings]%
418        \fi
419        \hskip\directwithpagesparameter\c!offset\relax
420        \clip
421          [\c!hoffset=\directwithpagesparameter\c!hoffset,\c!voffset=\directwithpagesparameter\c!voffset,
422           \c!height=\directwithpagesparameter\c!height,\c!width=\directwithpagesparameter\c!width]
423          {\externalfigure[#filename][\c!page=\slicedpagenumber]}%
424        \page
425      \fi}
426   \egroup}
427
428% \starttext \slicepages[slice1.pdf][n=3] \stoptext
429
430\permanent\protected\def\trimpages[#S#1]% was for a over decade in p-pdf-51.tex
431  {\begingroup
432   \getdummyparameters
433     [\c!file=dummy,%
434      \c!hoffset=\zeropoint,
435      \c!voffset=\zeropoint,
436      \c!width=17cm,
437      \c!height=24cm,
438      \c!x=\zeropoint,
439      \c!y=\zeropoint,
440      #1]%
441   \getfiguredimensions
442     [\dummyparameter\c!file]
443     [\c!object=\v!no]%
444   \dorecurse\noffigurepages
445     {\scale
446        [\c!width=\paperwidth,
447         \c!height=\paperheight]%
448        {\offset
449           [\c!x=\dummyparameter\c!x,
450            \c!y=\dummyparameter\c!y]
451           {\clip
452              [\c!hoffset=\dummyparameter\c!hoffset,
453               \c!voffset=\dummyparameter\c!voffset,
454               \c!width=\dummyparameter\c!width,
455               \c!height=\dummyparameter\c!height]
456              {% we correct by default, if not needed, introduce option
457               \setbox\nextbox\hbox
458                 {\externalfigure[\dummyparameter\c!file][\c!page=##1]}%
459               \ifdim\wd\nextbox>\ht\nextbox
460                 \rotate[\c!rotation=90]{\box\nextbox}%
461               \else
462                 \box\nextbox
463               \fi}}}}%
464   \endgroup}
465
466\stopcontextdefinitioncode
467
468%D Implemented in Lua:
469
470% crap.tex:
471%
472% \starttext
473%     \dorecurse{10}{
474%         \startchapter[title=Chapter #1,reference=chapter:#1]
475%             \dorecurse{10}{
476%                 \startsubject[title=Subject #1]
477%                     \dorecurse{2}{\samplefile{tufte}\par}
478%                 \stopsubject
479%                 \startsection[title=Section #1.##1,reference=#1.##1]
480%                     \dorecurse{10}{\samplefile{tufte}\par}
481%                 \stopsection
482%             }
483%         \stopchapter
484%     }
485% \stoptext
486%
487% load.tex:
488%
489% \starttext
490%     \dostepwiserecurse {\firstsectionpage[crap][chapter:3]} {\lastsectionpage[crap][chapter:3]} {1} {
491%         \startpagemakeup
492%             \externalfigure[crap.pdf][page=#1]
493%         \stoppagemakeup
494%     }
495%     \dostepwiserecurse {\firstsectionpage[crap][chapter:5]} {\lastsectionpage[crap][chapter:5]} {1} {
496%         \dontleavehmode
497%         \externalfigure[crap.pdf][page=#1,width=3cm,frame=on]%
498%         \space\allowbreak
499%     }
500% \stoptext
501
502\protect \endinput
503