summaryrefslogtreecommitdiff
path: root/tex/context/base/page-box.mkvi
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2011-12-13 17:40:23 +0200
committerMarius <mariausol@gmail.com>2011-12-13 17:40:23 +0200
commit008b7b212da48ca7ef8fc8ac876dbf13ca7b21a5 (patch)
tree8571937aba1460b4bf7daa0e08738f8768c48d03 /tex/context/base/page-box.mkvi
parent0396ead2bd0816d7e546848690271bbbe9077334 (diff)
downloadcontext-008b7b212da48ca7ef8fc8ac876dbf13ca7b21a5.tar.gz
beta 2011.12.13 15:17
Diffstat (limited to 'tex/context/base/page-box.mkvi')
-rw-r--r--tex/context/base/page-box.mkvi322
1 files changed, 322 insertions, 0 deletions
diff --git a/tex/context/base/page-box.mkvi b/tex/context/base/page-box.mkvi
new file mode 100644
index 000000000..145f2192b
--- /dev/null
+++ b/tex/context/base/page-box.mkvi
@@ -0,0 +1,322 @@
+%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 skippign tokens
+%D which is nicer for tracing.
+
+%D Centering the paper area on the print area is determined
+%D by the \type {top}, \type {bottom}, \type {left} and \type
+%D {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%
+ \else\ifdim\printpaperwidth>\wd#box\relax
+ \page_boxes_apply_center_indeed#box%
+ \fi\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\vbox to \printpaperheight
+ {\v_page_target_top
+ \v_page_target_top_fill
+ \hbox 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 % #box
+ {\ifdim\topoffset=\zeropoint
+ \ifdim\backoffset=\zeropoint
+ \doubleexpandafter\gobbleoneargument
+ \else
+ \doubleexpandafter\page_boxes_apply_offset_indeed
+ \fi
+ \else
+ \expandafter\page_boxes_apply_offset_indeed
+ \fi}
+
+\def\page_boxes_apply_offset_indeed#box%
+ {\scratchwidth \wd#box%
+ \scratchheight\ht#box%
+ \scratchdepth \dp#box%
+ \setbox#box\vbox
+ {\offinterlineskip
+ \vskip\topoffset
+ \hskip\doifbothsides\backoffset\backoffset{-\backoffset}%
+ \box#box}%
+ \wd#box\scratchwidth
+ \ht#box\scratchheight
+ \dp#box\scratchdepth}
+
+\def\page_boxes_apply_replicate
+ {\ifnum\layoutparameter\c!nx>\plusone
+ \expandafter\page_boxes_apply_replicate_indeed
+ \else\ifnum\layoutparameter\c!ny>\plusone
+ \doubleexpandafter\page_boxes_apply_replicate_indeed
+ \else
+ \doubleexpandafter\gobbleoneargument
+ \fi\fi}
+
+\def\page_boxes_apply_replicate_indeed#box%
+ {\setbox#box\vbox
+ {\offinterlineskip
+ \dorecurse{\layoutparameter\c!ny}
+ {\hbox{\dorecurse{\layoutparameter\c!nx}{\copy#box\hskip\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\vbox
+ {\edef\somerotation{\number\ifdoublesided\ifodd\realpageno#odd\else#even\fi\else##odd\fi}%
+ \dorotatebox\somerotation\hbox{\box#box}}}
+
+\def\page_boxes_apply_mirror#box%
+ {\setbox#box\vbox{\domirrorbox\vbox{\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}
+
+\let\page_boxes_apply_negate\negatecolorbox
+
+\def\page_boxes_apply_negate_print#box%
+ {\ifconditional\c_page_target_print_negate
+ \page_boxes_apply_negate#box%
+ \else\ifconditional\c_page_target_paper_negate
+ \page_boxes_apply_negate#box%
+ \fi\fi}
+
+\def\page_boxes_apply_scale#box%
+ {\edef\tmp_currentlayout_scale{\layoutparameter\c!scale}%
+ \ifdim\tmp_currentlayout_scale\points=\onepoint
+ \edef\tmp_currentlayout_sx{\layoutparameter\c!sx}%
+ \edef\tmp_currentlayout_sy{\layoutparameter\c!sy}%
+ \ifdim\tmp_currentlayout_sx\points=\onepoint
+ \ifdim\layoutparameter\c!sy\points=\onepoint
+ % no scaling done (and no copying either)
+ \else
+ \page_boxes_apply_scale_indeed\tmp_currentlayout_sx\tmp_currentlayout_sy{#box}%
+ \fi
+ \else
+ \page_boxes_apply_scale_indeed\tmp_currentlayout_sx\tmp_currentlayout_sy{#box}%
+ \fi
+ \else
+ \page_boxes_apply_scale_indeed\tmp_currentlayout_scale\tmp_currentlayout_scale{#box}%
+ \fi}
+
+\def\page_boxes_apply_scale_indeed#sx#sy#box%
+ {\setbox#box\vbox{\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
+
+\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\hbox
+ {\advance\scratchheight\dimexpr\scratchdepth+2\scratchoffset\relax
+ \advance\scratchwidth \scratchoffset
+ \ifconditional#right\relax
+ \scratchdimen-\scratchoffset
+ \hskip\scratchdimen
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \lower\scratchoffset\hbox
+ {\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\hbox
+ {\advance\scratchheight\dimexpr\scratchdepth+2\scratchoffset\relax
+ \advance\scratchwidth \scratchoffset
+ \doifbothsides
+ {\advance\scratchwidth\scratchoffset
+ \scratchdimen-\scratchoffset
+ \hskip\scratchdimen}%
+ {\scratchdimen\zeropoint}
+ {\scratchdimen-\scratchoffset
+ \hskip\scratchdimen}%
+ \lower\scratchoffset\hbox
+ {\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\vbox to \paperheight
+ {\hsize\paperwidth
+ \vskip\topspace
+ \doifbothsides
+ {\hskip\backspace}
+ {\hskip\backspace}
+ {\hskip\dimexpr\paperwidth-\backspace-\makeupwidth\relax}%
+ \box#1}%
+ \dp#1\zeropoint}
+
+% \let\page_boxes_apply_clip_paper \gobbleoneargument
+% \let\page_boxes_apply_clip_print_left \gobbleoneargument
+% \let\page_boxes_apply_clip_print_right\gobbleoneargument
+
+%D This is rather specialized:
+
+\newconditional\c_page_areas_enabled
+\newbox \b_page_areas_registered
+
+\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
+ {\hbox\bgroup
+ \ifx\registerMPtextarea\undefined \else
+ \setbox\b_page_areas_registered\emptyhbox
+ \wd\b_page_areas_registered\wd#3%
+ \ht\b_page_areas_registered\ht#3%
+ \dp\b_page_areas_registered\dp#3%
+ \ifcase#1\or % 1
+ \setbox\b_page_areas_registered\hbox{\lower\strutdp\box\b_page_areas_registered}%
+ \fi
+ \ifcase#2\or % 1
+ \setbox\b_page_areas_registered\hbox{\raise\topskip\hbox{\lower\strutht\box\b_page_areas_registered}}%
+ \dp\b_page_areas_registered\strutdp
+ \fi
+ \dp\b_page_areas_registered\strutdp % needed
+ \setbox\b_page_areas_registered\hbox
+ {\registerMPtextarea{\box\b_page_areas_registered}}%
+ \smashbox\b_page_areas_registered
+ \box\b_page_areas_registered
+ \fi
+ \box#3%
+ \egroup}
+
+\def\page_areas_register_direct#1%
+ {\xypos{pbd:\realfolio:b}% we could save bytes by only saving the y
+ \endgraf
+ \begingroup
+ \scratchdimen\dimexpr\MPy{pbd:\realfolio:b}-\MPy{pbd:\realfolio:e}\relax
+ \setbox\scratchbox\emptyhbox
+ \wd\scratchbox\makeupwidth
+ \ht\scratchbox\scratchdimen
+ \vsmash{\page_areas_registered_box00\scratchbox}%
+ \endgroup
+ #1%
+ \endgraf
+ \xypos{pbd:\realfolio:e}}
+
+\def\page_areas_register_boxed#1%
+ {\begingroup
+ \setbox\scratchbox\vbox{#1}%
+ \wd\scratchbox\makeupwidth % somehow a space creeps in
+ \vbox{\page_areas_registered_box00\scratchbox}%
+ \endgroup}
+
+\protect \endinput