1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16if known metafun_loaded_apos : endinput ; fi ;
17
18newinternal boolean metafun_loaded_apos ; metafun_loaded_apos := true ; immutable metafun_loaded_apos ;
19
20path posboxes[],
21 posregions[] ;
22
23numeric pospages[],
24 nofposboxes ;
25
26nofposboxes := 0 ;
27
28def boxlineoptions = withcolor .8blue enddef ;
29def boxfilloptions = withcolor .8white enddef ;
30
31mutable posboxes, posregions, pospages, nofposboxes ;
32
33def connect_positions =
34 if nofposboxes = 2 :
35 pickup pencircle scaled boxlinewidth ;
36 path pa ; pa := posboxes[1] enlarged boxlineoffset ;
37 path pb ; pb := posboxes[2] enlarged boxlineoffset ;
38 if pospages[1] = pospages[2] :
39 draw posboxes[1] boxlineoptions ;
40 path pc ; pc := center pa {up} .. {down} center pb ;
41 pair cc ; cc := (pc intersection_point pa) ;
42 if intersection_found :
43 pc := pc cutbefore cc ;
44 cc := (pc intersection_point pb) ;
45 if intersection_found :
46 pc := pc cutafter cc ;
47 drawarrow pc boxlineoptions ;
48 drawarrow reverse pc boxlineoptions ;
49 fi ;
50 fi ;
51 elseif pospages[1] == RealPageNumber :
52 draw posboxes[1] boxlineoptions ;
53 path pc ; pc := center pa {up} ... {right} urcorner (posregions[1] enlarged (20pt,20pt)) ;
54 pair cc ; cc := (pc intersection_point pa) ;
55 if intersection_found :
56 pc := pc cutbefore cc ;
57 drawarrow pc boxlineoptions ;
58 fi ;
59 elseif pospages[2] == RealPageNumber :
60 draw posboxes[2] boxlineoptions ;
61 path pc ; pc := ulcorner (posregions[2] enlarged (20pt,20pt)) {right} ... {down} center pb ;
62 pair cc ; cc := (pc intersection_point pb) ;
63 if intersection_found :
64 pc := pc cutafter cc ;
65 drawarrow pc boxlineoptions ;
66 fi ;
67 fi ;
68 fi ;
69enddef ;
70
71
72
73
74
75
76
77vardef anch_sidebars_pattern(expr a, b, pattern, patternlength, patternheight, linewidth) =
78 image (
79 save p, q, s ; pair p, s ; path q ;
80 s := ( (b a) arclength (a -- b) ) patternlength ;
81 q := pattern xscaled patternlength yscaled patternheight rotated (angle(s)) ;
82 p := a ;
83 forever :
84 draw
85 q shifted p
86 withpen pencircle scaled linewidth ;
87 p := p s ;
88 exitif arclength (a -- p) > arclength (a -- b) ;
89 endfor ;
90 clip currentpicture to
91 (xpart llcorner currentpicture, ypart b) --
92 (xpart lrcorner currentpicture, ypart b) --
93 (xpart urcorner currentpicture, ypart a) --
94 (xpart ulcorner currentpicture, ypart a) -- cycle ;
95 )
96enddef ;
97
98
99
100def anch_sidebars_draw(expr b_self, e_self, t_anchor) =
101
102 begingroup ;
103 interim linecap := if boxalternative = 1 : rounded else : butt fi ;
104 save a, b, lw, by ; pair a, b ; numeric lw, by ;
105 by := getposy(getposregion(b_self)) getposy(t_anchor) ;
106 if getpospage(b_self) = getpospage(e_self) :
107 a := (boxdistance,getposy(b_self) getposheight(b_self) getposy(t_anchor)) ;
108 b := (boxdistance,getposy(e_self) getposdepth (e_self) getposy(t_anchor)) ;
109 elseif RealPageNumber = getpospage(b_self) :
110 a := (boxdistance,getposy(b_self) getposheight(b_self) getposy(t_anchor)) ;
111 b := (boxdistance,by) ;
112 elseif RealPageNumber = getpospage(e_self) :
113 a := (boxdistance,getposheight(t_anchor)) ;
114 b := (boxdistance,getposy(e_self) getposdepth (e_self) getposy(t_anchor)) ;
115 else :
116 a := (boxdistance,getposheight(t_anchor)) ;
117 b := (boxdistance,0) ;
118 fi ;
119 if a == b :
120 message("side bar pattern ignored: a == b") ;
121 else :
122 a := (xpart a, min(ypart a boxtopoffset,getposheight(t_anchor))) ;
123 b := (xpart b, max(ypart b boxbottomoffset,0)) ;
124 if boxatright :
125 a := (xpart a HSize 2 boxdistance,ypart a) ;
126 b := (xpart b HSize 2 boxdistance,ypart b) ;
127 fi ;
128 lw := boxlinewidth ;
129 draw
130 if boxalternative = 2 :
131 anch_sidebars_pattern(a, b,
132 ((0,0)--(0.25,-0.5)--(0.75,0.5)--(1,0)) scaled lw,
133 2lw, 2lw, lw
134 )
135 elseif boxalternative = 3 :
136 anch_sidebars_pattern(a, b,
137 ((0,0)--(0.25,-0.5)--(0.75,0.5)--(1,0)) scaled lw,
138 4lw, 1.5lw, lw
139 )
140 elseif boxalternative = 4 :
141 anch_sidebars_pattern(a, b,
142 (((0,0) .. controls (0,0.5) and (0.5,0.5) .. (0.5,0)) -- ((0.5,0) .. controls (0.5,-0.5) and (1,-0.5) .. (1,0))) scaled lw,
143 6lw, 4lw, lw
144 )
145 elseif boxalternative = 5 :
146 anch_sidebars_pattern(a, b,
147 ((0,0) .. controls (0,1) and (1,1) .. (1,0)) scaled lw,
148 4lw, 2lw, lw
149 )
150 elseif boxalternative = 6 :
151 anch_sidebars_pattern(a, b,
152 ((0,0.5) .. (1,-0.5)) scaled lw,
153 4lw, 2lw, lw
154 )
155 elseif boxalternative = 7 :
156 anch_sidebars_pattern(a, b,
157 ((0,-0.5) .. (1,0.5)) scaled lw,
158 22lw, 5lw, lw
159 )
160 else :
161 (a -- b)
162 if boxalternative = 1 :
163 dashed (withdots scaled (lw2))
164 fi
165 withpen pencircle scaled lw
166 fi
167 withcolor boxlinecolor ;
168 fi ;
169 endgroup ;
170enddef ;
171
172
173
174newscriptindex mfid_getposboxes ; mfid_getposboxes := scriptindex "getposboxes" ;
175newscriptindex mfid_getmultipars ; mfid_getmultipars := scriptindex "getmultipars" ;
176
177def getposboxes (expr tags, anchor) = runscript mfid_getposboxes tags anchor ; enddef ;
178def getmultipars(expr tags, anchor) = runscript mfid_getmultipars tags anchor ; enddef ;
179
180newscriptindex mfid_getpospage ; mfid_getpospage := scriptindex "getpospage" ; vardef getpospage (expr n) = runscript mfid_getpospage n enddef ;
181newscriptindex mfid_getposparagraph ; mfid_getposparagraph := scriptindex "getposparagraph" ; vardef getposparagraph(expr n) = runscript mfid_getposparagraph n enddef ;
182newscriptindex mfid_getposcolumn ; mfid_getposcolumn := scriptindex "getposcolumn" ; vardef getposcolumn (expr n) = runscript mfid_getposcolumn n enddef ;
183newscriptindex mfid_getposregion ; mfid_getposregion := scriptindex "getposregion" ; vardef getposregion (expr n) = runscript mfid_getposregion n enddef ;
184
185newscriptindex mfid_getposx ; mfid_getposx := scriptindex "getposx" ; vardef getposx(expr n) = runscript mfid_getposx n enddef ;
186newscriptindex mfid_getposy ; mfid_getposy := scriptindex "getposy" ; vardef getposy(expr n) = runscript mfid_getposy n enddef ;
187
188newscriptindex mfid_getposwidth ; mfid_getposwidth := scriptindex "getposwidth" ; vardef getposwidth (expr n) = runscript mfid_getposwidth n enddef ;
189newscriptindex mfid_getposheight ; mfid_getposheight := scriptindex "getposheight" ; vardef getposheight(expr n) = runscript mfid_getposheight n enddef ;
190newscriptindex mfid_getposdepth ; mfid_getposdepth := scriptindex "getposdepth" ; vardef getposdepth (expr n) = runscript mfid_getposdepth n enddef ;
191
192newscriptindex mfid_getposleftskip ; mfid_getposleftskip := scriptindex "getposleftskip" ; vardef getposleftskip (expr n) = runscript mfid_getposleftskip n enddef ;
193newscriptindex mfid_getposrightskip ; mfid_getposrightskip := scriptindex "getposrightskip" ; vardef getposrightskip (expr n) = runscript mfid_getposrightskip n enddef ;
194newscriptindex mfid_getposhsize ; mfid_getposhsize := scriptindex "getposhsize" ; vardef getposhsize (expr n) = runscript mfid_getposhsize n enddef ;
195newscriptindex mfid_getposparindent ; mfid_getposparindent := scriptindex "getposparindent" ; vardef getposparindent (expr n) = runscript mfid_getposparindent n enddef ;
196newscriptindex mfid_getposhangindent ; mfid_getposhangindent := scriptindex "getposhangindent" ; vardef getposhangindent(expr n) = runscript mfid_getposhangindent n enddef ;
197newscriptindex mfid_getposhangafter ; mfid_getposhangafter := scriptindex "getposhangafter" ; vardef getposhangafter (expr n) = runscript mfid_getposhangafter n enddef ;
198
199newscriptindex mfid_getposxy ; mfid_getposxy := scriptindex "getposxy" ; vardef getposxy (expr n) = runscript mfid_getposxy n enddef ;
200newscriptindex mfid_getposupperleft ; mfid_getposupperleft := scriptindex "getposupperleft" ; vardef getposupperleft (expr n) = runscript mfid_getposupperleft n enddef ;
201newscriptindex mfid_getposlowerleft ; mfid_getposlowerleft := scriptindex "getposlowerleft" ; vardef getposlowerleft (expr n) = runscript mfid_getposlowerleft n enddef ;
202newscriptindex mfid_getposupperright ; mfid_getposupperright := scriptindex "getposupperright" ; vardef getposupperright(expr n) = runscript mfid_getposupperright n enddef ;
203newscriptindex mfid_getposlowerright ; mfid_getposlowerright := scriptindex "getposlowerright" ; vardef getposlowerright(expr n) = runscript mfid_getposlowerright n enddef ;
204
205newscriptindex mfid_getposllx ; mfid_getposllx := scriptindex "getposllx" ; vardef getposllx(expr n) = runscript mfid_getposllx n enddef ;
206newscriptindex mfid_getposlly ; mfid_getposlly := scriptindex "getposlly" ; vardef getposlly(expr n) = runscript mfid_getposlly n enddef ;
207newscriptindex mfid_getposurx ; mfid_getposurx := scriptindex "getposurx" ; vardef getposurx(expr n) = runscript mfid_getposurx n enddef ;
208newscriptindex mfid_getposury ; mfid_getposury := scriptindex "getposury" ; vardef getposury(expr n) = runscript mfid_getposury n enddef ;
209
210permanent
211 getposboxes, getmultipars,
212 getpospage, getposparagraph, getposcolumn, getposregion,
213 getposx, getposy, getposwidth, getposheight, getposdepth,
214 getposleftskip, getposrightskip, getposhsize, getposparindent, getposhangindent, getposhangafter,
215 getposxy, getposupperleft, getposlowerleft, getposupperright, getposlowerright,
216 getposllx, getposlly, getposurx, getposury ;
217 |