%D \module %D [ file=page-box, %D version=2011.12.05, % moved from other page-* files %D title=\CONTEXT\ Page Macros, %D subtitle=Page Boxing, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. \writestatus{loading}{ConTeXt Page Macros / Boxing} \unprotect %D The often two step approach (_indeed) saves skipping tokens which is nicer for %D tracing. Centering the paper area on the print area is determined by the \type %D {top}, \type {bottom}, \type {left} and \type {right} parameters. \def\page_boxes_apply_center#box% we could test for a difference (saves packing) {\printpaperwidth \v_page_target_scale\printpaperwidth \relax \printpaperheight\v_page_target_scale\printpaperheight\relax \ifdim\printpaperheight>\ht#box\relax \page_boxes_apply_center_indeed#box% \orelse\ifdim\printpaperwidth>\wd#box\relax \page_boxes_apply_center_indeed#box% \fi} \def\page_boxes_apply_center_indeed_l_r#box% {\v_page_target_left \v_page_target_left_fill \box#box% \v_page_target_right_fill \v_page_target_right} \def\page_boxes_apply_center_indeed_r_l#box% {\v_page_target_right \v_page_target_right_fill \box#box% \v_page_target_left_fill \v_page_target_left} \def\page_boxes_apply_center_indeed#box% we could test for a difference (saves packing) {\setbox#box\vpack to \printpaperheight {\v_page_target_top \v_page_target_top_fill \hpack to \printpaperwidth {\ifconditional\c_page_target_print_doublesided \doifbothsides {\page_boxes_apply_center_indeed_l_r#box}% {\page_boxes_apply_center_indeed_l_r#box}% {\page_boxes_apply_center_indeed_r_l#box}% \else \page_boxes_apply_center_indeed_l_r#box% \fi}% \par \v_page_target_bottom_fill \v_page_target_bottom}} \def\page_boxes_apply_offset_indeed#box% {\scratchwidth \wd#box% \scratchheight\ht#box% \scratchdepth \dp#box% \setbox#box\vpack {\offinterlineskip \vskip\topoffset %\hskip\doifbothsides\backoffset\backoffset{-\backoffset}% \hskip\doifbothsides++-\backoffset \box#box}% \wd#box\scratchwidth \ht#box\scratchheight \dp#box\scratchdepth} % a variant (no gain so we stay mkiv compatible): % % \def\page_boxes_apply_offset_indeed#box% this needs testing in real situations % {\boxxoffset#box\dimexpr\boxxoffset#box\doifbothsides++-\backoffset\relax % \boxyoffset#box\dimexpr\boxyoffset#box-\topoffset\relax} % \def\page_boxes_apply_offset % #box % {\unless\ifdim\topoffset=\zeropoint % \expandafter\page_boxes_apply_offset_indeed % \orunless\ifdim\backoffset=\zeropoint % \expandafter\page_boxes_apply_offset_indeed % \else % \expandafter\gobbleoneargument % \fi} \def\page_boxes_apply_offset % #box {\unless\ifzeropt\topoffset \expandafter\page_boxes_apply_offset_indeed \orunless\ifzeropt\backoffset \expandafter\page_boxes_apply_offset_indeed \else \expandafter\gobbleoneargument \fi} \def\page_boxes_apply_replicate {\ifnum\layoutparameter\c!nx>\plusone \expandafter\page_boxes_apply_replicate_indeed \orelse\ifnum\layoutparameter\c!ny>\plusone \expandafter\page_boxes_apply_replicate_indeed \else \expandafter\gobbleoneargument \fi} \def\page_boxes_apply_replicate_indeed#box% {\setbox#box\vpack {\offinterlineskip \dorecurse{\layoutparameter\c!ny}% {\hpack{\dorecurse{\layoutparameter\c!nx}{\copy#box\kern\layoutparameter\c!dx}\unskip}% \vskip\layoutparameter\c!dy}% \unskip}} \def\page_boxes_apply_orientate_paper#box% {\ifnum\number\c_page_target_paper_orientation\number\c_page_target_paper_reverse>\zerocount \page_boxes_apply_orientate_indeed\c_page_target_paper_orientation\c_page_target_paper_reverse{#box}% \fi} \def\page_boxes_apply_orientate_print#box% {\ifnum\number\c_page_target_print_orientation\number\c_page_target_print_reverse>\zerocount \page_boxes_apply_orientate_indeed\c_page_target_print_orientation\c_page_target_print_reverse{#box}% \fi} \def\page_boxes_apply_orientate_indeed#odd#even#box% {\setbox#box\vpack {\edef\p_rotation{\number\ifdoublesided\ifodd\realpageno#odd\else#even\fi\else#odd\fi}% \dorotatebox\p_rotation\hpack{\box#box}}} \def\page_boxes_apply_mirror#box% {\setbox#box\vpack{\mirror{\box#box}}} \def\page_boxes_apply_mirror_paper#box{\ifconditional\c_page_target_paper_mirror\page_boxes_apply_mirror{#box}\fi} \def\page_boxes_apply_mirror_print#box{\ifconditional\c_page_target_print_mirror\page_boxes_apply_mirror{#box}\fi} \aliased\let\page_boxes_apply_negate\negatecolorbox \def\page_boxes_apply_negate_print#box% {\ifconditional\c_page_target_print_negate \page_boxes_apply_negate#box% \orelse\ifconditional\c_page_target_paper_negate \page_boxes_apply_negate#box% \fi} \let\p_page_layouts_scale\relax \let\p_page_layouts_sx \relax \let\p_page_layouts_sy \relax \def\page_boxes_apply_scale#box% {\edef\p_page_layouts_scale{\layoutparameter\c!scale}% \ifdim\p_page_layouts_scale\points=\onepoint \edef\p_page_layouts_sx{\layoutparameter\c!sx}% \edef\p_page_layouts_sy{\layoutparameter\c!sy}% \ifdim\p_page_layouts_sx\points=\onepoint \ifdim\layoutparameter\c!sy\points=\onepoint % no scaling done (and no copying either) \else \page_boxes_apply_scale_indeed\p_page_layouts_sx\p_page_layouts_sy{#box}% \fi \else \page_boxes_apply_scale_indeed\p_page_layouts_sx\p_page_layouts_sy{#box}% \fi \else \page_boxes_apply_scale_indeed\p_page_layouts_scale\p_page_layouts_scale{#box}% \fi} \def\page_boxes_apply_scale_indeed#sx#sy#box% {\setbox#box\vpack{\scale[\c!sx=#sx,\c!sy=#sy]{\box#box}}% can be a fast one \paperwidth #sx\paperwidth \paperheight#sy\paperheight} % \setuppagenumbering[alternative=doublesided] % \setupcolors[state=start] % \setuppapersize[A4][A4,oversized] % \setuplayout[location=middle,clipoffset=5mm] % \setupbackgrounds % [page] % [frame=on,rulethickness=1mm, % backgroundoffset=10mm,background=color,backgroundcolor=red] % \starttext \dorecurse{10}{\input tufte \par} \stoptext % best use private variables \newconditional\c_page_boxes_clip_print \settrue\c_page_boxes_clip_print \def\page_boxes_apply_clip_print_left % box {\ifconditional\c_page_boxes_clip_print \expandafter\page_boxes_apply_clip_print_indeed\expandafter\conditionalfalse \else \expandafter\gobbleoneargument \fi} \def\page_boxes_apply_clip_print_right % box {\ifconditional\c_page_boxes_clip_print \expandafter\page_boxes_apply_clip_print_indeed\expandafter\conditionaltrue \else \expandafter\gobbleoneargument \fi} \def\page_boxes_apply_clip_print_indeed#right#box% can be made more efficient, see other clipper {\scratchoffset\pagebackgroundoffset % can be zero which is valid % maybe another variable \scratchwidth \wd#box% \scratchheight\ht#box% \scratchdepth \dp#box% \setbox#box\hpack {\advance\scratchheight\dimexpr\scratchdepth+2\scratchoffset\relax \advance\scratchwidth \scratchoffset \ifconditional#right\relax \scratchdimen-\scratchoffset \kern\scratchdimen \else \scratchdimen\zeropoint \fi \lower\scratchoffset\hpack {\clip [\c!hoffset=\scratchdimen, \c!voffset=-\scratchoffset, \c!width=\scratchwidth, \c!height=\scratchheight]% {\box#box}}}% \wd#box\scratchwidth \ht#box\scratchheight \dp#box\scratchdepth} \def\page_boxes_apply_clip_paper {\scratchoffset\layoutparameter\c!clipoffset\relax \ifdim\scratchoffset>\zeropoint \expandafter\page_boxes_apply_clip_paper_indeed \else \expandafter\gobbleoneargument \fi} \def\page_boxes_apply_clip_paper_indeed#box% {\scratchwidth \wd#box% \scratchheight\ht#box% \scratchdepth \dp#box% \setbox#box\hpack {\advance\scratchheight\dimexpr\scratchdepth+2\scratchoffset\relax \advance\scratchwidth \scratchoffset \doifbothsides {\advance\scratchwidth\scratchoffset \scratchdimen-\scratchoffset \kern\scratchdimen}% {\scratchdimen\zeropoint} {\scratchdimen-\scratchoffset \kern\scratchdimen}% \lower\scratchoffset\hpack {\clip [\c!hoffset=\scratchdimen, \c!voffset=-\scratchoffset, \c!width=\scratchwidth, \c!height=\scratchheight]% {\box#box}}}% \wd#box\scratchwidth \ht#box\scratchheight \dp#box\scratchdepth} % nearly always some displacement so no speedup test needed % \def\page_boxes_apply_offsets#1% % {\setbox#1\vpack to \paperheight % {\hsize\paperwidth % \vkern\topspace % \hkern\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}% % \box#1}% % \dp#1\zeropoint} \def\page_boxes_apply_offsets#1% {\setbox#1\vpack to \paperheight {\hsize\paperwidth \vkern\topspace \hkern\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}% % \hkern\doifbothsides\backspace\backspace\cutspace % \page_layouts_swap_margins\v!page % \hkern\backspace \box#1}% \dp#1\zeropoint} % a variant (no gain so we stay mkiv compatible): % % \def\page_boxes_apply_offsets#1% % {\scratchhoffset\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}% % \boxxoffset#1\dimexpr\boxxoffset#1+\scratchhoffset\relax % \boxyoffset#1\dimexpr\boxyoffset#1-\topspace\relax % \wd#1\dimexpr\paperwidth+\scratchhoffset\relax % \ht#1\dimexpr\paperheight+\topspace\relax} %D This is rather specialized: \newconditional\c_page_areas_enabled \newbox \b_page_areas_registered \permanent\protected\def\enabletextarearegistration {\global\settrue\c_page_areas_enabled} \def\page_areas_registered_box {\ifconditional\c_page_areas_enabled \expandafter\page_areas_registered_box_indeed \else \expandafter\page_areas_registered_box_forget \fi} \def\page_areas_registered_box_forget#1#2#3% #1=lower-dp #2=correct-ht #3=box {\box#3} \def\page_areas_registered_box_indeed#1#2#3% #1=lower-dp #2=correct-ht #3=box {\anch_mark_flow_box{#3}} \def\page_areas_register_boxed#1% {\begingroup \setbox\scratchbox\vpack{#1}% \wd\scratchbox\makeupwidth % somehow a space creeps in \vpack{\page_areas_registered_box00\scratchbox}% 0 0 will go \endgroup} \def\page_areas_register_direct#1#2% {\scratchdepth\dp#2% \dp#2\strutdepth \anch_mark_flow_only{#2}% \dp#2\scratchdepth #1#2} \protect \endinput