summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost/context/base/mpxl/mp-page.mpxl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/metapost/context/base/mpxl/mp-page.mpxl')
-rw-r--r--Master/texmf-dist/metapost/context/base/mpxl/mp-page.mpxl296
1 files changed, 296 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/context/base/mpxl/mp-page.mpxl b/Master/texmf-dist/metapost/context/base/mpxl/mp-page.mpxl
new file mode 100644
index 00000000000..72831e92708
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpxl/mp-page.mpxl
@@ -0,0 +1,296 @@
+%D \module
+%D [ file=mp-page.mpiv,
+%D version=1999.03.10,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=page enhancements,
+%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.
+
+%D This module is rather preliminary and subjected to changes.In the process of
+%D moving to \METAFUN2\ this might change.
+
+if known metafun_loaded_page : endinput ; fi ;
+
+newinternal boolean metafun_loaded_page ; metafun_loaded_page := true ; immutable metafun_loaded_page ;
+
+def LoadPageState = enddef ; % just in case some old style uses it
+
+% Next we implement the the page area model. First some constants. We use a
+% matrix approach as we do at the TeX end but we could have gone for a period
+% separated variant. Too late.
+
+LeftEdge := -4 ; Top := -40 ;
+LeftEdgeSeparator := -3 ; TopSeparator := -30 ;
+LeftMargin := -2 ; Header := -20 ;
+LeftMarginSeparator := -1 ; HeaderSeparator := -10 ;
+Text := 0 ; Text := 0 ;
+RightMarginSeparator := +1 ; FooterSeparator := +10 ;
+RightMargin := +2 ; Footer := +20 ;
+RightEdgeSeparator := +3 ; BottomSeparator := +30 ;
+RightEdge := +4 ; Bottom := +40 ;
+
+numeric HorPos ; HorPos := 0 ;
+numeric VerPos ; VerPos := 0 ;
+
+immutable % permanent
+ Text, HorPos, VerPos,
+ LeftEdge, LeftEdgeSeparator, LeftMargin, LeftMarginSeparator,
+ RightMarginSeparator, RightMargin, RightEdgeSeparator, RightEdge,
+ Top, TopSeparator, Header, HeaderSeparator,
+ FooterSeparator, Footer, BottomSeparator, Bottom ;
+
+% Because metapost > 1.50 has dynamic memory management and is less efficient than
+% before we now delay calculations ... (on a document with 150 pages the time spent
+% in mp was close to 5 seconds which was only due to initialising the page related
+% areas, something that was hardly noticeable before. At least now we're back to
+% half a second for such a case.
+
+% We could go for just setting them (:=):
+
+path mfun_page_area[][] ;
+pair mfun_page_location[][] ;
+path mfun_page_field[][] ;
+numeric mfun_page_vsize[] ;
+numeric mfun_page_hsize[] ;
+numeric mfun_page_vstep[] ;
+numeric mfun_page_hstep[] ;
+
+newinternal mfun_page_done ; mfun_page_done := 0 ;
+
+def mfun_page_check_vsize =
+ mfun_page_vsize[Top] := TopHeight ;
+ mfun_page_vsize[TopSeparator] := TopDistance ;
+ mfun_page_vsize[Header] := HeaderHeight ;
+ mfun_page_vsize[HeaderSeparator] := HeaderDistance ;
+ mfun_page_vsize[Text] := TextHeight ;
+ mfun_page_vsize[FooterSeparator] := FooterDistance ;
+ mfun_page_vsize[Footer] := FooterHeight ;
+ mfun_page_vsize[BottomSeparator] := BottomDistance ;
+ mfun_page_vsize[Bottom] := BottomHeight ;
+enddef ;
+
+def mfun_page_check_hsize =
+ mfun_page_hsize[LeftEdge] := LeftEdgeWidth ;
+ mfun_page_hsize[LeftEdgeSeparator] := LeftEdgeDistance ;
+ mfun_page_hsize[LeftMargin] := LeftMarginWidth ;
+ mfun_page_hsize[LeftMarginSeparator] := LeftMarginDistance ;
+ mfun_page_hsize[Text] := MakeupWidth ;
+ mfun_page_hsize[RightMarginSeparator] := RightMarginDistance ;
+ mfun_page_hsize[RightMargin] := RightMarginWidth ;
+ mfun_page_hsize[RightEdgeSeparator] := RightEdgeDistance ;
+ mfun_page_hsize[RightEdge] := RightEdgeWidth ;
+enddef ;
+
+def mfun_page_check_vstep =
+ mfun_page_vstep[TopSeparator] := PaperHeight-TopSpace ;
+ mfun_page_vstep[Top] := mfun_page_vstep[TopSeparator] +mfun_page_vsize[TopSeparator] ;
+ mfun_page_vstep[Header] := mfun_page_vstep[TopSeparator] -mfun_page_vsize[Header] ;
+ mfun_page_vstep[HeaderSeparator] := mfun_page_vstep[Header] -mfun_page_vsize[HeaderSeparator] ;
+ mfun_page_vstep[Text] := mfun_page_vstep[HeaderSeparator]-mfun_page_vsize[Text] ;
+ mfun_page_vstep[FooterSeparator] := mfun_page_vstep[Text] -mfun_page_vsize[FooterSeparator] ;
+ mfun_page_vstep[Footer] := mfun_page_vstep[FooterSeparator]-mfun_page_vsize[Footer] ;
+ mfun_page_vstep[BottomSeparator] := mfun_page_vstep[Footer] -mfun_page_vsize[BottomSeparator] ;
+ mfun_page_vstep[Bottom] := mfun_page_vstep[BottomSeparator]-mfun_page_vsize[Bottom] ;
+enddef ;
+
+def mfun_page_check_hstep =
+ mfun_page_hstep[Text] := BackSpace ;
+ mfun_page_hstep[LeftMarginSeparator] := mfun_page_hstep[Text] -mfun_page_hsize[LeftMarginSeparator] ;
+ mfun_page_hstep[RightMarginSeparator] := mfun_page_hstep[Text] +mfun_page_hsize[Text] ;
+ mfun_page_hstep[LeftMargin] := mfun_page_hstep[LeftMarginSeparator] -mfun_page_hsize[LeftMargin] ;
+ mfun_page_hstep[RightMargin] := mfun_page_hstep[RightMarginSeparator]+mfun_page_hsize[RightMarginSeparator] ;
+ mfun_page_hstep[LeftEdgeSeparator] := mfun_page_hstep[LeftMargin] -mfun_page_hsize[LeftEdgeSeparator] ;
+ mfun_page_hstep[LeftEdge] := mfun_page_hstep[LeftEdgeSeparator] -mfun_page_hsize[LeftEdge] ;
+ mfun_page_hstep[RightEdgeSeparator] := mfun_page_hstep[RightMargin] +mfun_page_hsize[RightMargin] ;
+ mfun_page_hstep[RightEdge] := mfun_page_hstep[RightEdgeSeparator] +mfun_page_hsize[RightEdgeSeparator] ;
+enddef ;
+
+def mfun_check_page_dimensions =
+ if mfun_page_done <> RealPageNumber :
+ if LayoutHasChanged :
+ mfun_page_check_vsize ;
+ mfun_page_check_hsize ;
+ mfun_page_check_vstep ;
+ mfun_page_check_hstep ;
+ fi ;
+ mfun_page_done := RealPageNumber ;
+ fi ;
+enddef;
+
+
+def mfun_check_page_area =
+ mfun_check_page_dimensions ;
+ for VerPos=Top step 10 until Bottom:
+ for HorPos=LeftEdge step 1 until RightEdge:
+ mfun_page_area[HorPos][VerPos] := unitsquare xscaled mfun_page_hsize[HorPos] yscaled mfun_page_vsize[VerPos] ;
+ mfun_page_area[VerPos][HorPos] := mfun_page_area[HorPos][VerPos] ;
+ endfor ;
+ endfor ;
+enddef ;
+
+def mfun_check_page_location =
+ mfun_check_page_dimensions ;
+ for VerPos=Top step 10 until Bottom:
+ for HorPos=LeftEdge step 1 until RightEdge:
+ mfun_page_location[HorPos][VerPos] := (mfun_page_hstep[HorPos],mfun_page_vstep[VerPos]) ;
+ mfun_page_location[VerPos][HorPos] := mfun_page_location[HorPos][VerPos] ;
+ endfor ;
+ endfor ;
+enddef ;
+
+def mfun_check_page_field =
+ mfun_check_page_dimensions ;
+ for VerPos=Top step 10 until Bottom:
+ for HorPos=LeftEdge step 1 until RightEdge:
+ mfun_page_field[HorPos][VerPos] := unitsquare xscaled mfun_page_hsize[HorPos] yscaled mfun_page_vsize[VerPos] shifted (mfun_page_hstep[HorPos],mfun_page_vstep[VerPos]) ;
+ mfun_page_field[VerPos][HorPos] := mfun_page_field[HorPos][VerPos] ;
+ endfor ;
+ endfor ;
+enddef ;
+
+def Area = hide(mfun_check_page_area ;) mfun_page_area enddef ;
+def Location = hide(mfun_check_page_location ;) mfun_page_location enddef ;
+def Field = hide(mfun_check_page_field ;) mfun_page_field enddef ;
+def Vsize = hide(mfun_check_page_dimensions ;) mfun_page_vsize enddef ;
+def Hsize = hide(mfun_check_page_dimensions ;) mfun_page_hsize enddef ;
+def Vstep = hide(mfun_check_page_dimensions ;) mfun_page_vstep enddef ;
+def Hstep = hide(mfun_check_page_dimensions ;) mfun_page_hstep enddef ;
+
+immutable % permanent
+ Area, Location, Field, Vsize, Hsize, Vstep, Hstep ;
+
+vardef FrontPageWidth = PaperWidth enddef ;
+vardef BackPageWidth = PaperWidth enddef ;
+vardef CoverWidth = 2 * PaperWidth + SpineWidth enddef ;
+vardef CoverHeight = PaperHeight enddef ;
+
+vardef FrontPageHeight = PaperHeight enddef ;
+vardef BackPageHeight = PaperHeight enddef ;
+vardef SpineHeight = PaperHeight enddef ;
+
+path mfun_page_page, mfun_page_cover, mfun_page_spine, mfun_page_back, mfun_page_front ;
+
+def mfun_check_page = mfun_page_page := unitsquare xscaled PaperWidth yscaled PaperHeight ; enddef ;
+def mfun_check_cover = mfun_page_cover := unitsquare xscaled CoverWidth yscaled CoverHeight ; enddef ;
+def mfun_check_spine = mfun_page_spine := unitsquare xscaled SpineWidth yscaled CoverHeight shifted (BackPageWidth,0) ; enddef ;
+def mfun_check_back = mfun_page_back := unitsquare xscaled BackPageWidth yscaled CoverHeight ; enddef ;
+def mfun_check_front = mfun_page_front := unitsquare xscaled FrontPageWidth yscaled CoverHeight shifted (BackPageWidth+SpineWidth,0) ; enddef ;
+
+def Page = hide(mfun_check_page ;) mfun_page_page enddef ;
+def CoverPage = hide(mfun_check_cover ;) mfun_page_cover enddef ;
+def Spine = hide(mfun_check_spine ;) mfun_page_spine enddef ;
+def BackPage = hide(mfun_check_back ;) mfun_page_back enddef ;
+def FrontPage = hide(mfun_check_front ;) mfun_page_front enddef ;
+
+% pages
+
+def StartPage =
+ begingroup ;
+ setbounds currentpicture to Page ;
+enddef ;
+
+def StopPage =
+ setbounds currentpicture to Page ;
+ endgroup ;
+enddef ;
+
+% cover pages
+
+def StartCover =
+ begingroup ;
+ setbounds currentpicture to CoverPage enlarged PaperBleed ;
+enddef ;
+
+def StopCover =
+ setbounds currentpicture to CoverPage enlarged PaperBleed ;
+ endgroup ;
+enddef ;
+
+immutable % permanent
+ FrontPageWidth, BackPageWidth, CoverWidth, FrontPageHeight, BackPageHeight, CoverHeight,
+ SpineHeight, Page, CoverPage, Spine, BackPage, FrontPage,
+ StartPage, StopPage, StartCover, StopCover ;
+
+% overlays:
+
+def OverlayBox =
+ (unitsquare xyscaled (OverlayWidth,OverlayHeight))
+enddef ;
+
+immutable % permanent
+ OverlayBox ;
+
+% handy
+
+def innerenlarged =
+ if OnRightPage : leftenlarged else : rightenlarged fi
+enddef ;
+
+def outerenlarged =
+ if OnRightPage : rightenlarged else : leftenlarged fi
+enddef ;
+
+permanent
+ innerenlarged, outerenlarged ;
+
+% obsolete
+
+% def llEnlarged (expr p,d) = (llcorner p shifted (-d,-d)) enddef ;
+% def lrEnlarged (expr p,d) = (lrcorner p shifted (+d,-d)) enddef ;
+% def urEnlarged (expr p,d) = (urcorner p shifted (+d,+d)) enddef ;
+% def ulEnlarged (expr p,d) = (ulcorner p shifted (-d,+d)) enddef ;
+
+% def Enlarged (expr p, d) =
+% (
+% llEnlarged (p,d) --
+% lrEnlarged (p,d) --
+% urEnlarged (p,d) --
+% ulEnlarged (p,d) --
+% cycle
+% )
+% enddef ;
+
+% for the moment we put these here:
+
+string RuleDirection ; RuleDirection := "" ;
+string RuleOption ; RuleOption := "" ;
+numeric RuleWidth ; RuleWidth := 0 ;
+numeric RuleHeight ; RuleHeight := 0 ;
+numeric RuleDepth ; RuleDepth := 0 ;
+numeric RuleH ; RuleH := 0 ;
+numeric RuleV ; RuleV := 0 ;
+numeric RuleThickness ; RuleThickness := 0 ;
+numeric RuleFactor ; RuleFactor := 0 ;
+numeric RuleOffset ; RuleOffset := 0 ;
+ def RuleColor = (.5white) enddef ; % yet undecided, might become a string
+
+def FakeWord(expr RuleWidth, RuleHeight, RuleDepth, RuleThickness) (text RuleColor) =
+ fill unitsquare
+ xscaled RuleWidth
+ yscaled (RuleDepth-RuleThickness/2)
+ withcolor RuleColor ;
+ fill unitsquare
+ xscaled RuleWidth
+ yscaled (RuleHeight-RuleDepth-RuleThickness/2)
+ shifted (0,RuleDepth+RuleThickness)
+ withcolor RuleColor ;
+enddef ;
+
+def FakeRule(expr RuleWidth, RuleHeight, RuleDepth, RuleThickness) (text RuleColor) =
+ fill unitsquare
+ xscaled RuleWidth
+ yscaled RuleHeight
+ withcolor RuleColor ;
+enddef ;
+
+mutable
+ RuleDirection, RuleOption, RuleWidth, RuleHeight, RuleDepth, RuleH, RuleV, RuleThickness,
+ RuleFactor, RuleOffset, RuleColor;
+
+permanent
+ FakeWord, FakeRule ;