1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16if known metafun_loaded_grph : endinput ; fi ;
17
18newinternal boolean metafun_loaded_grph ; metafun_loaded_grph := true ; immutable metafun_loaded_grph ;
19
20numeric mfun_fig_nesting ; mfun_fig_nesting := 0 ;
21
22def beginfig (expr c) =
23 mfun_fig_nesting := mfun_fig_nesting 1 ;
24 if mfun_fig_nesting = 1 :
25 begingroup
26 charcode := c ;
27 resetfig ;
28 scantokens extra_beginfig ;
29 fi ;
30enddef ;
31
32def endfig =
33 ;
34 if mfun_fig_nesting = 1 :
35 scantokens extra_endfig ;
36 shipit ;
37 endgroup ;
38 fi ;
39 mfun_fig_nesting := mfun_fig_nesting 1 ;
40enddef;
41
42def resetfig =
43 clearxy ;
44 clearit ;
45 clearpen ;
46 pickup defaultpen ;
47 interim linecap := linecap ;
48 interim linejoin := linejoin ;
49 interim miterlimit := miterlimit ;
50 interim stacking := 0 ;
51 interim makingfigure := true;
52 save temp_b ; color temp_b ; temp_b := background ;
53 save background ; color background ; background := temp_b ;
54 drawoptions () ;
55enddef ;
56
57permanent beginfig, endfig, resetfig ;
58
59def protectgraphicmacros =
60 save showtext ;
61 save beginfig ; let beginfig = begingraphictextfig ;
62 save endfig ; let endfig = endgraphictextfig ;
63 save end ; let end = relax ;
64 resetfig ;
65enddef ;
66
67numeric currentgraphictext ; currentgraphictext := 0 ;
68
69def begingraphictextfig (expr n) =
70 foundpicture := n ;
71 scratchpicture := nullpicture ;
72enddef ;
73
74def endgraphictextfig =
75 if foundpicture = currentgraphictext :
76 expandafter endinput
77 else :
78 scratchpicture := nullpicture ;
79 fi ;
80enddef ;
81
82def loadfigure primary filename =
83 mfun_load_figure(filename)
84enddef ;
85
86def mfun_load_figure (expr filename) text figureattributes =
87 mutable beginfig, endfig ;
88 begingroup ;
89 save figurenumber, figurepicture, number, fixedplace ;
90 numeric figurenumber ; figurenumber := 0 ;
91 boolean figureshift ; figureshift := true ;
92 picture figurepicture ; figurepicture := currentpicture ;
93 def number primary n = hide(figurenumber := n) enddef ;
94 def fixedplace = hide(figureshift := false) enddef ;
95 protectgraphicmacros ;
96
97 interim linecap := rounded ;
98 interim linejoin := rounded ;
99 interim miterlimit := 10 ;
100
101 currentpicture := nullpicture ;
102 draw fullcircle figureattributes ;
103 currentpicture := nullpicture ;
104 def beginfig (expr n) =
105 currentpicture := nullpicture ;
106 if (figurenumber=n) or (figurenumber=0) :
107 let endfig = endinput ;
108 fi ;
109 enddef ;
110 let endfig = relax ;
111 readfile(filename) ;
112 if figureshift :
113 currentpicture := currentpicture shifted llcorner currentpicture ;
114 fi ;
115 addto figurepicture also currentpicture figureattributes ;
116 currentpicture := figurepicture ;
117 endgroup ;
118 permanent beginfig, endfig ;
119enddef ;
120
121
122
123boolean mfun_gt_color_fill ;
124boolean mfun_gt_color_draw ;
125boolean mfun_gt_shade_fill ;
126boolean mfun_gt_reverse_fill ;
127boolean mfun_gt_outline_fill ;
128picture mfun_gt_picture ;
129
130def mfun_gt_default =
131 scaled 11.5
132 withpen pencircle scaled .1
133enddef ;
134
135def graphictext primary t =
136 begingroup ;
137 mfun_graphic_text_indeed(t)
138enddef ;
139
140def mfun_graphic_text_indeed(expr t) text rest =
141 interim linecap := butt ;
142 interim linejoin := mitered ;
143
144
145 let normalwithshade = withshade ;
146
147 save reversefill, outlinefill, withshade, withfillcolor, withdrawcolor ;
148
149 def mfun_gt_fill = enddef ;
150 def mfun_gt_draw = enddef ;
151 def mfun_gt_shade = enddef ;
152
153 mfun_gt_color_fill := false ;
154 mfun_gt_color_draw := false ;
155 mfun_gt_shade_fill := false ;
156 mfun_gt_reverse_fill := false ;
157
158 def reversefill = hide(mfun_gt_reverse_fill := true) enddef ;
159 def outlinefill = enddef ;
160 def withshade primary c = hide(mfun_gt_shade_fill := true; def mfun_gt_shade = normalwithshade c enddef ;) enddef ;
161 def withfillcolor primary c = hide(mfun_gt_color_fill := true; def mfun_gt_fill = withcolor c enddef ;) enddef ;
162 def withdrawcolor primary c = hide(mfun_gt_color_draw := true; def mfun_gt_draw = withcolor c enddef ;) enddef ;
163
164 mfun_gt_picture := nullpicture ;
165 addto mfun_gt_picture doublepath origin rest ;
166 mfun_gt_picture := nullpicture ;
167
168 def reversefill = enddef ;
169 def outlinefill = enddef ;
170 def withshade primary c = enddef ;
171 def withfillcolor primary c = enddef ;
172 def withdrawcolor primary c = enddef ;
173
174 if mfun_gt_shade_fill :
175 draw outlinetext.f(t)(mfun_gt_shade) rest;
176 elseif mfun_gt_color_fill and mfun_gt_color_draw :
177 if mfun_gt_reverse_fill :
178 draw outlinetext.r(t)(mfun_gt_default mfun_gt_fill)(mfun_gt_default mfun_gt_draw) rest;
179 else :
180 draw outlinetext.b(t)(mfun_gt_default mfun_gt_draw)(mfun_gt_default mfun_gt_fill) rest;
181 fi ;
182 elseif mfun_gt_color_fill :
183 draw outlinetext.f(t)(mfun_gt_default mfun_gt_fill) rest;
184 elseif mfun_gt_color_draw :
185 draw outlinetext.d(t)(mfun_gt_default mfun_gt_draw) rest ;
186 else :
187 draw outlinetext.d(t)(mfun_gt_default) rest ;
188 fi ;
189
190 endgroup ;
191enddef ;
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210 |