summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost/context/base/mp-core.mp
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/metapost/context/base/mp-core.mp')
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-core.mp202
1 files changed, 112 insertions, 90 deletions
diff --git a/Master/texmf-dist/metapost/context/base/mp-core.mp b/Master/texmf-dist/metapost/context/base/mp-core.mp
index 2b62559b8bc..7c5d5a1c1b1 100644
--- a/Master/texmf-dist/metapost/context/base/mp-core.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-core.mp
@@ -1,15 +1,3 @@
-%D \module
-%D [ file=mp-core.mp,
-%D version=2000.something, % 1999.08.12,
-%D title=\CONTEXT\ \METAPOST\ graphics,
-%D subtitle=core interfacing,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
-%C details.
if unknown context_tool : input mp-tool ; fi ;
if known context_core : endinput ; fi ;
@@ -135,7 +123,6 @@ def initialize_area_par (expr fn,fx,fy,fw,fh,fd,
numeric mpos ; mpos := 6 ; freeze_box(mpos) ;
-% do_initialize_area (fpos, tpos) ;
do_initialize_par (fpos, tpos, mpos, ffpos, 0,0,0,0,0,0) ;
enddef ;
@@ -359,6 +346,8 @@ boolean force_multi_par_chain ; force_multi_par_chain := true ;
boolean one_piece_multi_par ; one_piece_multi_par := false ;
boolean check_multi_par_chain ; check_multi_par_chain := true ; % extra page check
+boolean multi_column_first_page_hack; multi_column_first_page_hack := true ; % seems to work ok
+
def simplify_multi_pars = % boundingbox ipv shape als optie
for i := 1 upto nofmultipars :
multipars[i] := boundingbox multipars[i] ;
@@ -422,7 +411,6 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
pair par_start_pos ;
-% par_start_pos := llxy[fpos] if par_indent<0: shifted (-par_indent,0) fi ;
par_start_pos := llxy[fpos]
if par_indent <0: shifted (-par_indent, 0) fi
@@ -442,8 +430,6 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
numeric multi_par_pages ; multi_par_pages := nxy[tpos]-nxy[fpos]+1 ;
- ii := 0 ; nn := NOfTextAreas+1 ; nofmultipars := 0 ;
-
vardef snapped_multi_pos (expr p) =
if snap_multi_par_tops :
if abs(ypart p - ypart ulcorner multipar) < par_line_height :
@@ -516,15 +502,13 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
vardef left_top_hang (expr same_area) =
-par_hang_after := ra + estimated_par_lines(py-fy) ;
+ par_hang_after := ra + estimated_par_lines(py-fy) ;
if (par_hang_indent>0) and (par_hang_after<0) and obey_multi_par_hang :
pair _ul_ ; _ul_ := (xpart ulcorner multipar, ypart snapped_multi_pos(ulxy[fpos]));
pair _pa_ ; _pa_ := _ul_ shifted (0,par_hang_after*par_line_height) ;
-% _pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
_pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llcorner multipar)) ;
if same_area :
-% _pa_ := (xpart _pa_,max(ypart _pa_,ypart llxy[tpos])) ;
_pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llxy[tpos])) ;
fi ;
if obey_multi_par_more and (round(par_line_height)>0) :
@@ -541,8 +525,7 @@ par_hang_after := ra + estimated_par_lines(py-fy) ;
vardef right_top_hang (expr same_area) =
-% par_hang_after := ra - estimated_par_lines(py-fy) ;
-par_hang_after := ra + estimated_par_lines(py-fy) ;
+ par_hang_after := ra + estimated_par_lines(py-fy) ;
if (par_hang_indent<0) and (par_hang_after<0) and obey_multi_par_hang :
pair _ur_ ; _ur_ := (xpart urcorner multipar, ypart snapped_multi_pos(urxy[fpos])) ;
@@ -569,17 +552,15 @@ par_hang_after := ra + estimated_par_lines(py-fy) ;
pair _ul_ ; _ul_ := ulcorner multipar ;
pair _pa_ ; _pa_ := _ul_ shifted (0,par_hang_after*par_line_height) ;
_pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
-
-if t :
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart llxy[tpos]));
-fi ;
-if abs(ypart _pa_-ypart llxy[tpos])<par_line_height :
- _pa_ := (xpart _pa_,ypart llxy[tpos]);
-fi ;
-if abs(ypart _pa_-ypart llcorner multipar)<par_line_height :
- _pa_ := (xpart _pa_,ypart llcorner multipar);
-fi ;
-
+ if t :
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart llxy[tpos]));
+ fi ;
+ if abs(ypart _pa_-ypart llxy[tpos])<par_line_height :
+ _pa_ := (xpart _pa_,ypart llxy[tpos]);
+ fi ;
+ if abs(ypart _pa_-ypart llcorner multipar)<par_line_height :
+ _pa_ := (xpart _pa_,ypart llcorner multipar);
+ fi ;
(xpart _ul_, ypart _pa_) --
(xpart _ul_ + par_hang_indent, ypart _pa_) --
(xpart _ul_ + par_hang_indent, ypart _ul_)
@@ -588,27 +569,15 @@ fi ;
fi
enddef ;
-% here
-
vardef x_right_top_hang (expr i, t) =
par_hang_after := min(0,ra + estimated_multi_par_height(i,t)) ;
if (par_hang_indent<0) and (par_hang_after<0) :
pair _ur_ ; _ur_ := urcorner multipar ;
pair _pa_ ; _pa_ := _ur_ shifted (0,par_hang_after*par_line_height) ;
_pa_ := (xpart _pa_,max(ypart _pa_,ypart lrcorner multipar)) ;
-if t :
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart snapped_multi_pos(urxy[tpos]))) ;
-fi ;
-
-%todo
-%
-%if abs(ypart _pa_-ypart llxy[tpos])<par_line_height :
-% _pa_ := (xpart _pa_,ypart llxy[tpos]);
-%fi ;
-%if abs(ypart _pa_-ypart llcorner multipar)<par_line_height :
-% _pa_ := (xpart _pa_,ypart llcorner multipar);
-%fi ;
-
+ if t :
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart snapped_multi_pos(urxy[tpos]))) ;
+ fi ;
(xpart _ur_ + par_hang_indent, ypart _ur_) --
(xpart _ur_ + par_hang_indent, ypart _pa_) --
(xpart _ur_, ypart _pa_)
@@ -702,17 +671,13 @@ fi ;
enddef ;
def test_multipar =
-% multipar :=
-% llcorner multipar --
-% urcorner multipar --
-% lrcorner multipar --
-% ulcorner multipar --
-% cycle ;
multipar := boundingbox multipar ;
enddef ;
% first loop
+ ii := 0 ; nn := NOfTextAreas+1 ; nofmultipars := 0 ;
+
if enable_multi_par_fallback and
(nxy[fpos]=RealPageNumber) and
(nxy[tpos]=RealPageNumber) and not
@@ -908,8 +873,7 @@ fi ;
x_left_top_hang(i,true) --
x_right_top_hang(i,true) --
x_right_bottom_hang(i,true) --
-% ulxy[tpos] --
-snapped_multi_pos(ulxy[tpos]) --
+ snapped_multi_pos(ulxy[tpos]) --
llxy[tpos] --
x_left_bottom_hang(i,true) --
cycle ;
@@ -920,8 +884,7 @@ snapped_multi_pos(ulxy[tpos]) --
ulcorner multipar --
urcorner multipar --
(xpart lrcorner multipar, ypart urxy[tpos]) --
-% ulxy[tpos] --
-snapped_multi_pos(ulxy[tpos]) --
+ snapped_multi_pos(ulxy[tpos]) --
llxy[tpos] --
(xpart llcorner multipar, ypart llxy[tpos]) --
cycle ;
@@ -930,47 +893,50 @@ snapped_multi_pos(ulxy[tpos]) --
save_multipar (i,3,multipar) ;
- else :
+ elseif multi_column_first_page_hack and ((nxy[fpos]=RealPageNumber) and (nxy[tpos]>=RealPageNumber) and (NOfTextColumns>1)) :
- % handled later
+ save_multipar (i,2,multipar) ;
+ else :
+ % handled later
fi ;
endfor ;
% second loop
-if force_multi_par_chain or (ii > 1) :
+ if force_multi_par_chain or (ii > 1) :
- for i=ii+1 upto nn-1 :
+ for i=ii+1 upto nn-1 :
- % rest of chain / todo : hang
+ % rest of chain / todo : hang
-% we need to test, else we get a <lineheight bottom one
-% triggering a whole text frame; weird
+% hm, the second+ column in column sets now gets lost in a NOfTextColumns
-if (not check_multi_par_chain) or ((nxy[fpos]<RealPageNumber) and (nxy[tpos]>RealPageNumber)) :
+ if (not check_multi_par_chain) or
+ ((nxy[fpos]<RealPageNumber) and (nxy[tpos]>RealPageNumber))
+ :
- multipar := set_multipar(i) ;
+ multipar := set_multipar(i) ;
- if obey_multi_par_hang and obey_multi_par_more :
+ if obey_multi_par_hang and obey_multi_par_more :
- multipar :=
- x_left_top_hang(i,false) --
- x_right_top_hang(i,false) --
- x_right_bottom_hang(i,false) --
- x_left_bottom_hang(i,false) --
- cycle ;
+ multipar :=
+ x_left_top_hang(i,false) --
+ x_right_top_hang(i,false) --
+ x_right_bottom_hang(i,false) --
+ x_left_bottom_hang(i,false) --
+ cycle ;
- fi ;
+ fi ;
- save_multipar(i,2,multipar) ;
+ save_multipar(i,2,multipar) ;
-fi ;
+ fi ;
- endfor ;
+ endfor ;
-fi ;
+ fi ;
% end of normal/fallback
@@ -1079,9 +1045,6 @@ def sort_multi_pars =
fi ;
enddef ;
-% This collapses successive areas (possibly interrupted by
-% floats. First we need to sort the areas, since they are
-% normally in de order start, end, inbetween.
def collapse_multi_pars =
if nofmultipars>1 :
@@ -1110,20 +1073,40 @@ multirefs[_nofmultipars_] := multirefs[i+1] ;
fi ;
enddef ;
+% def draw_multi_pars =
+% for i=1 upto nofmultipars :
+% do_draw_par(multipars[i]) ;
+% if boxgridtype= 1 :
+% draw baseline_grid (multipars[i],up,true ) ; % withcolor boxgridcolor ;
+% elseif boxgridtype= 2 :
+% draw baseline_grid (multipars[i],up,false) ; % withcolor boxgridcolor ;
+% elseif boxgridtype= 3 :
+% draw baseline_grid (multipars[i],up,true ) ; % withcolor boxgridcolor ;
+% draw baseline_grid (multipars[i],up,true )
+% shifted (0,ExHeight) ; % withcolor boxgridcolor ;
+% elseif boxgridtype= 4 :
+% draw baseline_grid (multipars[i],up,true )
+% shifted (0,ExHeight/2) ; % withcolor boxgridcolor ;
+% elseif boxgridtype=11 :
+% draw graphic_grid(multipars[i],boxgriddistance,boxgriddistance,boxgriddistance/2,boxgriddistance/2) ;
+% elseif boxgridtype=12 :
+% draw graphic_grid(multipars[i],boxgriddistance,boxgriddistance,0,0) ;
+% fi ;
+% endfor ;
+% enddef ;
+
def draw_multi_pars =
for i=1 upto nofmultipars :
do_draw_par(multipars[i]) ;
if boxgridtype= 1 :
- draw baseline_grid (multipars[i],up,true ) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,true) ; % withcolor boxgridcolor ;
elseif boxgridtype= 2 :
- draw baseline_grid (multipars[i],up,false) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,false) ; % withcolor boxgridcolor ;
elseif boxgridtype= 3 :
- draw baseline_grid (multipars[i],up,true ) ; % withcolor boxgridcolor ;
- draw baseline_grid (multipars[i],up,true )
- shifted (0,ExHeight) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,true) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,true) shifted (0,ExHeight) ; % withcolor boxgridcolor ;
elseif boxgridtype= 4 :
- draw baseline_grid (multipars[i],up,true )
- shifted (0,ExHeight/2) ; % withcolor boxgridcolor ;
+ draw baseline_grid (multipars[i],if multilocs[i]=1: down else: up fi,true) shifted (0,ExHeight/2) ; % withcolor boxgridcolor ;
elseif boxgridtype=11 :
draw graphic_grid(multipars[i],boxgriddistance,boxgriddistance,boxgriddistance/2,boxgriddistance/2) ;
elseif boxgridtype=12 :
@@ -1231,7 +1214,6 @@ let draw_area = draw_box ;
let anchor_area = anchor_box ;
let anchor_par = anchor_box ;
-% new and experimental and yet undocumented
numeric sync_n[], sync_p[][], sync_w[][], sync_h[][], sync_d[][], sync_t[][] ;
pair sync_xy[][] ; color sync_c[][] ;
@@ -1286,7 +1268,6 @@ vardef PrepareSyncTasks(expr n, collapse, extendtop, prestartnext) =
NOfSyncPaths := NOfSyncPaths + 1 ;
if not ok :
if i>1 :
-% not yet correct when two of the same follow each other
if sync_t[n][i-1] = sync_t[n][i] :
SyncPaths[NOfSyncPaths] := SyncBox(n, i, SyncLeftOffset, SyncWidth, PaperHeight, -PaperHeight) ;
SyncTasks[NOfSyncPaths] := i ;
@@ -1394,3 +1375,44 @@ def ProcessSyncTask(expr p, c) =
enddef ;
endinput ;
+
+end
+
+% for Jelle Huisman
+%
+% \setupcolors[state=start]
+% \dontcomplain
+% \definecolumnset[example][n=3,distance=5mm]
+% \startMPextensions
+% multi_column_first_page_hack := true ;
+% \stopMPextensions
+% \startuseMPgraphic{mpos:par:trick}
+% for i=1 upto nofmultipars-1 : draw (rightboundary multipars[i]) shifted (2.5mm, 0) ; endfor ;
+% \stopuseMPgraphic
+% \definetextbackground[test][mp=mpos:par:trick,method=mpos:par:columnset]
+% \starttext
+% \definecolumnsetspan[chapter][n=3]
+% \startcolumnset[example]
+% \startcolumnsetspan[chapter]
+% \chapter{Chapter One}
+% \stopcolumnsetspan
+% \starttextbackground[test] \dorecurse {3}{\input knuth } \stoptextbackground
+% \stopcolumnset
+% \startcolumnset[example]
+% \startcolumnsetspan[chapter]
+% \chapter{Chapter One}
+% \stopcolumnsetspan
+% \starttextbackground[test] \dorecurse {10}{\input knuth } \stoptextbackground
+% \stopcolumnset
+% \stoptext
+%
+% fast variant:
+%
+% \startuseMPgraphic{whatever}
+% for i=1 upto NOfTextColumns-1 :
+% draw (rightboundary TextColumns[i]) shifted (2.5mm,0) shifted -\MPxy\textanchor ;
+% endfor ;
+% setbounds currentpicture to OverlayBox ;
+% \stopuseMPgraphic
+% \defineoverlay[whatever][\useMPgraphic{whatever}]
+% \setupbackgrounds[text][background=whatever]