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 |