summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Geometric.mf
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Geometric.mf')
-rw-r--r--Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Geometric.mf2277
1 files changed, 2277 insertions, 0 deletions
diff --git a/Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Geometric.mf b/Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Geometric.mf
new file mode 100644
index 00000000000..7f19a9d1d4c
--- /dev/null
+++ b/Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Geometric.mf
@@ -0,0 +1,2277 @@
+
+beginsymbol(dot_size# + 2side_bearing#, vcentre(2dot_size#)); "centre dot";
+ pickup rule_pen;
+
+ fill circle((w/2, (h-d)/2), dot_size);
+endchar;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, (3dot_size# + equal_spread#)/arrow_horiz_len#, dot_size#);
+ "colon (" & decimal alpha & ")";
+ pickup rule_pen;
+
+ z1 - z0 = (2dot_size + equal_spread) * dir alpha;
+ 1/2[z0,z1] = centre;
+
+ fill circle(z0, dot_size);
+ fill circle(z1, dot_size);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginarrow(alpha, (5dot_size# + 2equal_spread#)/arrow_horiz_len#, dot_size#);
+ "triple colon (" & decimal alpha & ")";
+ pickup rule_pen;
+
+ z1 - z0 = (2dot_size + equal_spread) * dir alpha;
+ z2 - z1 = (2dot_size + equal_spread) * dir alpha;
+ z1 = centre;
+
+ fill circle(z0, dot_size);
+ fill circle(z1, dot_size);
+ fill circle(z2, dot_size);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "therefore (" & decimal alpha & ")";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ fill circle(centre + r * dir alpha, dot_size);
+ fill circle(centre + r * dir (alpha + 120), dot_size);
+ fill circle(centre + r * dir (alpha + 240), dot_size);
+ endchar;
+endfor;
+
+for alpha = 0, 45:
+ beginoperator(plus_size#, 1); "quad dot (" & decimal alpha & ")";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ fill circle(centre + r * dir alpha, dot_size);
+ fill circle(centre + r * dir (alpha + 90), dot_size);
+ fill circle(centre + r * dir (alpha + 180), dot_size);
+ fill circle(centre + r * dir (alpha + 270), dot_size);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1); "five dots";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ fill circle(centre, dot_size);
+ fill circle(centre + r * dir 0, dot_size);
+ fill circle(centre + r * dir 90, dot_size);
+ fill circle(centre + r * dir 180, dot_size);
+ fill circle(centre + r * dir 270, dot_size);
+endchar;
+
+beginoperator(plus_size#, 1); "minus";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 0) -- (centre + r * dir 180);
+endchar;
+
+beginoperator(plus_size#, 1); "bar";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 90) -- (centre + r * dir 270);
+endchar;
+
+beginoperator(plus_size#, 1); "medium slash";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ draw (centre + r * dir 45) -- (centre + r * dir 225);
+endchar;
+
+beginoperator(plus_size#, 1); "medium backslash";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ draw (centre + r * dir 135) -- (centre + r * dir 315);
+endchar;
+
+beginoperator(plus_size#, 1); "plus";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 0) -- (centre + r * dir 180);
+ draw (centre + r * dir 90) -- (centre + r * dir 270);
+endchar;
+
+beginoperator(plus_size#, 1); "times";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ draw (centre + r * dir 45) -- (centre + r * dir 225);
+ draw (centre + r * dir 135) -- (centre + r * dir 315);
+endchar;
+
+beginoperator(plus_size#, 1); "plus minus";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 0) -- (centre + r * dir 180);
+ draw (centre + r * dir 90) -- (centre + (r - 1/4rule_thickness) * dir 270);
+
+ draw (centre + r * (dir 0 - dir 90)) -- (centre + r * (dir 180 - dir 90));
+endchar;
+
+beginoperator(plus_size#, 1); "minus plus";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 0) -- (centre + r * dir 180);
+ draw (centre + (r - 1/4rule_thickness) * dir 90) -- (centre + r * dir 270);
+
+ draw (centre + r * (dir 0 + dir 90)) -- (centre + r * (dir 180 + dir 90));
+endchar;
+
+for angle = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "dot minus (" & decimal angle & ")";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre - r * dir angle) -- (centre + r * dir angle);
+ fill circle(centre + equal_spread * dir (angle + 90), dot_size);
+ endchar;
+endfor;
+
+for angle = 0, 45, 90, 135:
+ beginoperator(plus_size#, 1); "divides";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre - r * dir angle) -- (centre + r * dir angle);
+ fill circle(centre + equal_spread * dir (angle + 90), dot_size);
+ fill circle(centre - equal_spread * dir (angle + 90), dot_size);
+ endchar;
+endfor;
+
+% Warning: The other two orientations are below.
+% They should stay consistent.
+
+beginoperator(plus_size#, 1); "logical not";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 180) -- (centre + r * dir 0)
+ -- (centre + r * dir 0 - equal_spread * dir 90);
+endchar;
+
+beginoperator(plus_size#, 1); "reversed logical not";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 180 - equal_spread * dir 90)
+ -- (centre + r * dir 180) -- (centre + r * dir 0)
+endchar;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "times (" & decimal alpha & ")";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ draw (centre + r * dir (alpha + 45)) -- (centre + r * dir (alpha + 225)) --
+ (centre + r * dir (alpha + 315)) -- (centre + r * dir (alpha + 135));
+ endchar;
+endfor;
+
+for alpha = 0, 90:
+ beginoperator(plus_size#, 1); "bowtie (" & decimal alpha & ")";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ draw (centre + r * dir (alpha + 45)) -- (centre + r * dir (alpha + 225)) --
+ (centre + r * dir (alpha + 135)) -- (centre + r * dir (alpha + 315)) -- cycle;
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "Y (" & decimal alpha & ")";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+ r := r * 1/3[1, sqrt 2];
+
+ draw centre -- (centre + r * dir alpha);
+ draw centre -- (centre + r * dir (alpha + 120));
+ draw centre -- (centre + r * dir (alpha + 240));
+ endchar;
+endfor;
+
+% operators
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "wedge";
+ pickup rule_pen;
+
+ z2 - z0 = plus_size * dir 0;
+
+ x1 = 1/2[x0, x2] = w/2;
+
+ y1 - y0 = sign * plus_size;
+ 1/2[y0,y1] = ypart centre;
+
+ draw z0 -- z1 -- z2;
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "wedge dot";
+ pickup rule_pen;
+
+ z2 - z0 = plus_size * dir 0;
+
+ x1 = 1/2[x0, x2] = w/2;
+
+ y1 - y0 = sign * plus_size;
+ 1/2[y0,y1] = ypart centre;
+
+ draw z0 -- z1 -- z2;
+ fill circle(centre - sign * 1/3plus_size * dir 90, dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(13/9plus_size# + 2side_bearing#, vcentre(plus_size# + rule_thickness#));
+ "double wedge";
+
+ pickup rule_pen;
+
+ z2 - z0 = plus_size * dir 0;
+
+ x1 = 1/2[x0, x2] = w/2;
+
+ y1 - y0 = sign * plus_size;
+ 1/2[y0,y1] = ypart centre;
+
+ 1/2[z0a,z0b] = z0;
+ 1/2[z1a,z1b] = z1;
+ 1/2[z2a,z2b] = z2;
+ z0b - z0a = z1b - z1a = z2b - z2a = 4/9plus_size * dir 0;
+
+ draw z0a -- z1a -- z2a;
+ draw z0b -- z1b -- z2b;
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "curly wedge";
+ pickup rule_pen;
+
+ draw prec(centre + sign * 1/2plus_size * dir 90,
+ centre - sign * 1/2plus_size * dir 90,
+ plus_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "curly wedge dot";
+ pickup rule_pen;
+
+ draw prec(centre + sign * 1/2plus_size * dir 90,
+ centre - sign * 1/2plus_size * dir 90,
+ plus_size);
+ fill circle(centre - sign * 5/12plus_size * dir 90, dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(13/9plus_size# + 2side_bearing#, vcentre(plus_size# + rule_thickness#));
+ "double wedge";
+
+ pickup rule_pen;
+
+ 1/2[z0,z1] = (w/2, (h-d)/2);
+ z1 - z0 = 4/9plus_size * dir 0;
+
+ draw prec(z0 + sign * 1/2plus_size * dir 90,
+ z0 - sign * 1/2plus_size * dir 90,
+ plus_size);
+ draw prec(z1 + sign * 1/2plus_size * dir 90,
+ z1 - sign * 1/2plus_size * dir 90,
+ plus_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union";
+ pickup rule_pen;
+
+ draw subset(centre - sign * 1/2plus_size * dir 90,
+ centre + sign * 1/2plus_size * dir 90,
+ plus_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(4/3plus_size#, 1); "double union";
+ pickup rule_pen;
+
+ draw subset(centre - sign * 5/18plus_size * dir 90,
+ centre + sign * 2/3plus_size * dir 90,
+ 5/9plus_size);
+ draw subset(centre - sign * 2/3plus_size * dir 90,
+ centre + sign * 2/3plus_size * dir 90,
+ 4/3plus_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union dot";
+ pickup rule_pen;
+
+ draw subset(centre - sign * 1/2plus_size * dir 90,
+ centre + sign * 1/2plus_size * dir 90,
+ plus_size);
+ fill circle(centre + sign * 1/6plus_size * dir 90, dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union plus";
+ pickup rule_pen;
+
+ draw subset(centre - sign * 1/2plus_size * dir 90,
+ centre + sign * 1/2plus_size * dir 90,
+ plus_size);
+
+ t := 22/10rule_thickness;
+ r := 1/2plus_size - t;
+
+ draw (centre + sign * 1/6plus_size * dir 90 + r * dir 0)
+ -- (centre + sign * 1/6plus_size * dir 90 + r * dir 180);
+ draw (centre + (r + sign * 1/6plus_size) * dir 90)
+ -- (centre + (r - sign * 1/6plus_size) * dir 270);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union";
+ pickup rule_pen;
+
+ z3 - z0 = z2 - z1 = plus_size * dir 0;
+ z0 - z1 = sign * plus_size * dir 90;
+
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw z0 -- z1 -- z2 -- z3;
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(4/3plus_size#, 1); "double square union";
+ pickup rule_pen;
+
+ z3a - z0a = z2a - z1a = 4/3plus_size * dir 0;
+ z0a - z1a = sign * 4/3plus_size * dir 90;
+
+ 1/2[1/2[z0a,z1a], 1/2[z2a,z3a]] = centre;
+
+ z3b - z0b = z2b - z1b = 5/9plus_size * dir 0;
+ z0b - z1b = sign * 17/18plus_size * dir 90;
+
+ y0b = y0a;
+ 1/2[x0b, x3b] = xpart centre;
+
+ draw z0a -- z1a -- z2a -- z3a;
+ draw z0b -- z1b -- z2b -- z3b;
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union dot";
+ pickup rule_pen;
+
+ z3 - z0 = z2 - z1 = plus_size * dir 0;
+ z0 - z1 = sign * plus_size * dir 90;
+
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw z0 -- z1 -- z2 -- z3;
+
+ fill circle(centre + sign * 1/6plus_size * dir 90, dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union plus";
+ pickup rule_pen;
+
+ z3 - z0 = z2 - z1 = plus_size * dir 0;
+ z0 - z1 = sign * plus_size * dir 90;
+
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw z0 -- z1 -- z2 -- z3;
+
+ t := 22/10rule_thickness;
+ r := 1/2plus_size - t;
+
+ draw (centre + sign * 1/6plus_size * dir 90 + r * dir 0)
+ -- (centre + sign * 1/6plus_size * dir 90 + r * dir 180);
+ draw (centre + (r + sign * 1/6plus_size) * dir 90)
+ -- (centre + (r - sign * 1/6plus_size) * dir 270);
+ endchar;
+endfor;
+
+
+% triangles
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(small_op_size#, 1); "small triangle (" & decimal alpha & ")";
+ pickup rule_pen;
+ draw triangle(centre, w/2-side_bearing, alpha);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(small_op_size#, 1); "small filled triangle (" & decimal alpha & ")";
+ pickup rule_pen;
+ draw triangle(centre, w/2-side_bearing, alpha);
+ fill triangle(centre, w/2-side_bearing, alpha);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(med_op_size#, 1); "medium triangle (" & decimal alpha & ")";
+ pickup rule_pen;
+ draw triangle(centre, w/2-side_bearing, alpha);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(large_op_size#, 1); "large triangle (" & decimal alpha & ")";
+ pickup rule_pen;
+ draw triangle(centre, w/2-side_bearing, alpha);
+ endchar;
+endfor;
+
+% circles
+
+beginoperator(4/5small_op_size#, 1); "small circle";
+ pickup rule_pen;
+ draw circle(centre, 4/10small_op_size);
+endchar;
+
+beginoperator(4/5small_op_size#, 1); "small filled circle";
+ pickup rule_pen;
+ draw circle(centre, 4/10small_op_size);
+ fill circle(centre, 4/10small_op_size);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle";
+ pickup rule_pen;
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+endchar;
+
+beginoperator(4/5large_op_size#, 1); "large circle";
+ pickup rule_pen;
+ draw circle(centre, 4/10large_op_size);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle minus";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw (centre + plus_size/2 * left) -- (centre + plus_size/2 * right);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle bar";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw (centre + plus_size/2 * up) -- (centre + plus_size/2 * down);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle slash";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw (centre + plus_size/2 * dir 45) -- (centre + plus_size/2 * dir 225);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle backslash";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw (centre + plus_size/2 * dir 135) -- (centre + plus_size/2 * dir 315);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle plus";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw (centre + plus_size/2 * left) -- (centre + plus_size/2 * right);
+ draw (centre + plus_size/2 * up) -- (centre + plus_size/2 * down);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle times";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw (centre + plus_size/2 * dir 45) -- (centre + plus_size/2 * dir 225);
+ draw (centre + plus_size/2 * dir 135) -- (centre + plus_size/2 * dir 315);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle dot";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ fill circle(centre, 1.3dot_size);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle circle";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw circle(centre, (plus_size + 11/5rule_thickness)/5);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle triangle";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw triangle(centre, small_op_size/2, 90);
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle asterisk";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+
+ penpos a0(4/3rule_thickness, 0 - 7);
+ penpos a1(4/3rule_thickness, 72 - 7);
+ penpos a2(4/3rule_thickness, 144 - 7);
+ penpos a3(4/3rule_thickness, 216 - 7);
+ penpos a4(4/3rule_thickness, 288 - 7);
+
+ penpos b0(2/3rule_thickness, 0 - 7);
+ penpos b1(2/3rule_thickness, 72 - 7);
+ penpos b2(2/3rule_thickness, 144 - 7);
+ penpos b3(2/3rule_thickness, 216 - 7);
+ penpos b4(2/3rule_thickness, 288 - 7);
+
+ reg_poly_points(a)(5, centre, plus_size/2, 77);
+
+ z.b0 = z.b1 = z.b2 = z.b3 = z.b4 = centre;
+
+ fill stroke z.a0e -- z.b0e;
+ fill stroke z.a1e -- z.b1e;
+ fill stroke z.a2e -- z.b2e;
+ fill stroke z.a3e -- z.b3e;
+ fill stroke z.a4e -- z.b4e;
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "medium circle star";
+ pickup rule_pen;
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+
+ reg_poly_points(a)(5, centre, plus_size/2, 90);
+ reg_poly_points(b)(5, centre, plus_size/20, 126);
+
+ draw z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+
+beginoperator(plus_size# + 11/5rule_thickness#, 1); "negated medium circle";
+ pickup rule_pen;
+
+ r := 3/4(plus_size + 11/5rule_thickness);
+
+ draw circle(centre, plus_size/2 + 11/10rule_thickness);
+ draw (centre + r * dir 45) -- (centre + r * dir 225);
+endchar;
+
+% squares
+
+beginoperator(small_op_size#/sqrt(2), 1); "small square";
+ pickup rule_pen;
+ draw square(centre, w/2 - side_bearing, 0);
+endchar;
+beginoperator(small_op_size#/sqrt(2), 1); "small filled square";
+ pickup rule_pen;
+ draw square(centre, w/2 - side_bearing, 0);
+ fill square(centre, w/2 - side_bearing, 0);
+endchar;
+beginoperator(med_op_size#/sqrt(2), 1); "medium square";
+ pickup rule_pen;
+ draw square(centre, w/2 - side_bearing, 0);
+endchar;
+beginoperator(large_op_size#/sqrt(2), 1); "large square";
+ pickup rule_pen;
+ draw square(centre, w/2 - side_bearing, 0);
+endchar;
+
+beginoperator(small_op_size#, 1); "small diamond";
+ pickup rule_pen;
+ draw square(centre, (w/2 - side_bearing) / sqrt(2), 45);
+endchar;
+beginoperator(small_op_size#, 1); "small filled diamond";
+ pickup rule_pen;
+ draw square(centre, (w/2 - side_bearing) / sqrt(2), 45);
+ fill square(centre, (w/2 - side_bearing) / sqrt(2), 45);
+endchar;
+beginoperator(med_op_size#, 1); "medium diamond";
+ pickup rule_pen;
+ draw square(centre, (w/2 - side_bearing) / sqrt(2), 45);
+endchar;
+beginoperator(large_op_size#, 1); "large diamond";
+ pickup rule_pen;
+ draw square(centre, (w/2 - side_bearing) / sqrt(2), 45);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square minus";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r, 0);
+ draw (centre + sqrt .5 * r * dir 0) -- (centre + sqrt .5 * r * dir 180);
+endchar;
+beginoperator(med_op_size#/sqrt(2), 1); "medium square vert";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r, 0);
+ draw (centre + sqrt .5 * r * dir 90) -- (centre + sqrt .5 * r * dir 270);
+endchar;
+beginoperator(med_op_size#/sqrt(2), 1); "medium square slash";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r, 0);
+ draw (centre + r * dir 45) -- (centre + r * dir 225);
+endchar;
+beginoperator(med_op_size#/sqrt(2), 1); "medium square backslash";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r, 0);
+ draw (centre + r * dir 135) -- (centre + r * dir 315);
+endchar;
+beginoperator(med_op_size#/sqrt(2), 1); "medium square plus";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r, 0);
+ draw (centre + sqrt .5 * r * dir 0) -- (centre + sqrt .5 * r * dir 180);
+ draw (centre + sqrt .5 * r * dir 90) -- (centre + sqrt .5 * r * dir 270);
+endchar;
+beginoperator(med_op_size#/sqrt(2), 1); "medium square times";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r, 0);
+ draw (centre + r * dir 45) -- (centre + r * dir 225);
+ draw (centre + r * dir 135) -- (centre + r * dir 315);
+endchar;
+beginoperator(med_op_size#/sqrt(2), 1); "medium square dot";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r, 0);
+ fill circle(centre, 1.3dot_size);
+endchar;
+beginoperator(med_op_size#/sqrt(2), 1); "medium square square";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r, 0);
+ draw square(centre, .4r, 0);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond minus";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r / sqrt(2), 45);
+ draw (centre + r * dir 0) -- (centre + r * dir 180);
+endchar;
+beginoperator(med_op_size#, 1); "medium diamond vert";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r / sqrt(2), 45);
+ draw (centre + r * dir 90) -- (centre + r * dir 270);
+endchar;
+beginoperator(med_op_size#, 1); "medium diamond slash";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r / sqrt(2), 45);
+ draw (centre + sqrt .5 * r * dir 45) -- (centre + sqrt .5 * r * dir 225);
+endchar;
+beginoperator(med_op_size#, 1); "medium diamond backslash";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r / sqrt(2), 45);
+ draw (centre + sqrt .5 * r * dir 135) -- (centre + sqrt .5 * r * dir 315);
+endchar;
+beginoperator(med_op_size#, 1); "medium diamond plus";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r / sqrt(2), 45);
+ draw (centre + r * dir 0) -- (centre + r * dir 180);
+ draw (centre + r * dir 90) -- (centre + r * dir 270);
+endchar;
+beginoperator(med_op_size#, 1); "medium diamond times";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r / sqrt(2), 45);
+ draw (centre + sqrt .5 * r * dir 45) -- (centre + sqrt .5 * r * dir 225);
+ draw (centre + sqrt .5 * r * dir 135) -- (centre + sqrt .5 * r * dir 315);
+endchar;
+beginoperator(med_op_size#, 1); "medium diamond dot";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r / sqrt(2), 45);
+ fill circle(centre, 1.3dot_size);
+endchar;
+beginoperator(med_op_size#, 1); "medium diamond diamond";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ draw square(centre, r / sqrt(2), 45);
+ draw square(centre, .4r, 45);
+endchar;
+
+beginoperator(small_op_size#, 1); "small star";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(5, centre, r, 90);
+ reg_poly_points(b)(5, centre, .4r, 126);
+ draw z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+beginoperator(small_op_size#, 1); "small filled star";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(5, centre, r, 90);
+ reg_poly_points(b)(5, centre, .4r, 126);
+ draw z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+beginoperator(med_op_size#, 1); "medium star";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(5, centre, r, 90);
+ reg_poly_points(b)(5, centre, .4r, 126);
+ draw z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+beginoperator(large_op_size#, 1); "large star";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(5, centre, r, 90);
+ reg_poly_points(b)(5, centre, .4r, 126);
+ draw z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+beginoperator(med_op_size#, 1); "medium pentagram";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(5, centre, r, 90);
+ draw z.a0 -- z.a2 -- z.a4 -- z.a1 -- z.a3 -- cycle;
+endchar;
+beginoperator(large_op_size#, 1); "large pentagram";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(5, centre, r, 90);
+ draw z.a0 -- z.a2 -- z.a4 -- z.a1 -- z.a3 -- cycle;
+endchar;
+
+beginoperator(small_op_size#, 1); "medium thin filled star";
+ pickup pencircle scaled 1/2rule_thickness;
+
+ r := w/2 - side_bearing;
+
+ reg_poly_points(a)(5, centre, r, 90);
+ reg_poly_points(b)(5, centre, .2r, 126);
+
+ draw z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+
+beginoperator(small_op_size#, 1); "asterisk";
+ r := w/2 - side_bearing;
+
+ penpos a0(4/3rule_thickness, 0 - 7);
+ penpos a1(4/3rule_thickness, 72 - 7);
+ penpos a2(4/3rule_thickness, 144 - 7);
+ penpos a3(4/3rule_thickness, 216 - 7);
+ penpos a4(4/3rule_thickness, 288 - 7);
+
+ penpos b0(2/3rule_thickness, 0 - 7);
+ penpos b1(2/3rule_thickness, 72 - 7);
+ penpos b2(2/3rule_thickness, 144 - 7);
+ penpos b3(2/3rule_thickness, 216 - 7);
+ penpos b4(2/3rule_thickness, 288 - 7);
+
+ reg_poly_points(a)(5, centre, r, 77);
+
+ z.b0 = z.b1 = z.b2 = z.b3 = z.b4 = centre;
+
+ fill stroke z.a0e -- z.b0e;
+ fill stroke z.a1e -- z.b1e;
+ fill stroke z.a2e -- z.b2e;
+ fill stroke z.a3e -- z.b3e;
+ fill stroke z.a4e -- z.b4e;
+endchar;
+
+for alpha = 0, 45, 90, 135:
+ beginsymbol(2order_width# * abs (cosd (alpha)) + 5/3equal_spread# * abs (sind (alpha)) + 2side_bearing#,
+ vcentre(2order_width# * abs (sind (alpha)) + 5/3equal_spread# * abs (cosd (alpha)) + rule_thickness#));
+ "infinity";
+ pickup rule_pen;
+
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ z0 = centre - (order_width - 1/2rule_thickness) * dir alpha;
+ z1 = centre + (order_width - 1/2rule_thickness) * dir alpha;
+
+ z6 = 1/5[z0,z1];
+ z7 = 4/5[z0,z1];
+
+ z2 = z6 + 5/6equal_spread * dir (alpha + 90);
+ z3 = z6 - 5/6equal_spread * dir (alpha + 90);
+ z4 = z7 + 5/6equal_spread * dir (alpha + 90);
+ z5 = z7 - 5/6equal_spread * dir (alpha + 90);
+
+ draw z4{dir (alpha + 180)}
+ .. {dir (alpha + 225)}1/2[z0,z1]{dir (alpha + 225)}
+ .. {dir (alpha + 180)}z3{dir (alpha + 180)}
+ .. {dir (alpha + 90)}z0{dir (alpha + 90)}
+ .. {dir (alpha + 0)}z2{dir (alpha + 0)}
+ .. {dir (alpha + -45)}1/2[z0,z1]{dir (alpha + -45)}
+ .. {dir (alpha + 0)}z5{dir (alpha + 0)}
+ .. {dir (alpha + 90)}z1{dir (alpha + 90)}
+ .. cycle;
+ labels (0,1,2,3,4,5,6,7);
+ endchar;
+endfor
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol(17/10order_width# * abs (cosd (alpha)) + 5/3equal_spread# * abs (sind (alpha)) + 2side_bearing#,
+ vcentre(17/10order_width# * abs (sind (alpha)) + 5/3equal_spread# * abs (cosd (alpha)) + rule_thickness#));
+ "proportional";
+ pickup rule_pen;
+
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ z0 = centre - (17/20order_width - 1/2rule_thickness) * dir alpha;
+ z1 = centre + (15/20order_width - 1/2rule_thickness) * dir alpha;
+
+ z4 = z1 + 5/6equal_spread * dir (alpha + 90);
+ z5 = z1 - 5/6equal_spread * dir (alpha + 90);
+
+ z6 - z4 = z7 - z5 = 1/10order_width * dir alpha;
+
+ z8 = 1/4[z0,z1];
+
+ z2 = z8 + 5/6equal_spread * dir (alpha + 90);
+ z3 = z8 - 5/6equal_spread * dir (alpha + 90);
+
+ draw z6 -- z4{dir (alpha + 180)}
+ .. {dir (alpha + 225)}5/8[z0,z1]{dir (alpha + 225)}
+ .. {dir (alpha + 180)}z3{dir (alpha + 180)}
+ .. {dir (alpha + 90)}z0{dir (alpha + 90)}
+ .. {dir (alpha + 0)}z2{dir (alpha + 0)}
+ .. {dir (alpha + -45)}5/8[z0,z1]{dir (alpha + -45)}
+ .. {dir (alpha + 0)}z5 -- z7;
+ labels (0,1,2,3,4,5,6,7);
+ endchar;
+endfor;
+
+for alpha = 0, 45, 90, 135:
+ beginsymbol(14/10order_width# * abs (cosd (alpha)) + 5/3equal_spread# * abs (sind (alpha)) + 2side_bearing#,
+ vcentre(14/10order_width# * abs (sind (alpha)) + 5/3equal_spread# * abs (cosd (alpha)) + rule_thickness#));
+ "crossing";
+ pickup rule_pen;
+
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ z0 = centre - (14/20order_width - 1/2rule_thickness) * dir alpha;
+ z1 = centre + (14/20order_width - 1/2rule_thickness) * dir alpha;
+
+ z2 = z0 + 5/6equal_spread * dir (alpha + 90);
+ z3 = z0 - 5/6equal_spread * dir (alpha + 90);
+ z4 = z1 + 5/6equal_spread * dir (alpha + 90);
+ z5 = z1 - 5/6equal_spread * dir (alpha + 90);
+
+ z6 - z4 = z7 - z5 = 1/10order_width * dir alpha;
+ z2 - z8 = z3 - z9 = 1/10order_width * dir alpha;
+
+ draw z6 -- z4{dir (alpha + 180)}
+ .. {dir (alpha + 225)}1/2[z0,z1]{dir (alpha + 225)}
+ .. {dir (alpha + 180)}z3 -- z9;
+ draw z8 -- z2{dir (alpha + 0)}
+ .. {dir (alpha + -45)}1/2[z0,z1]{dir (alpha + -45)}
+ .. {dir (alpha + 0)}z5 -- z7;
+ labels (0,1,2,3,4,5,6,7,8,9);
+ endchar;
+endfor;
+
+beginoperator(med_op_size#, 1); "between";
+ pickup rule_pen;
+
+ r := w/2 - side_bearing;
+
+ draw smile( 1, centre - r * dir 90, centre + r * dir 90, equal_spread, true);
+ draw smile(-1, centre - r * dir 90, centre + r * dir 90, equal_spread, true);
+endchar;
+
+beginoperator(med_op_size#, 1); "reversed between";
+ pickup rule_pen;
+
+ r := w/2 - side_bearing;
+
+ draw smile( 1, centre - 2/3equal_spread * dir 0 - r * dir 90,
+ centre - 2/3equal_spread * dir 0 + r * dir 90,
+ 2/3equal_spread, true);
+ draw smile(-1, centre + 2/3equal_spread * dir 0 - r * dir 90,
+ centre + 2/3equal_spread * dir 0 + r * dir 90,
+ 2/3equal_spread, true);
+endchar;
+
+for sign = 1, -1:
+ beginsymbol(order_width# + 2side_bearing#, 2math_axis# + rule_thickness#, rule_thickness#); "top";
+ pickup rule_pen;
+
+ z1 - z0 = z3 - z2 = order_width * dir 0;
+ z2 - z0 = sign * 2math_axis * dir 90;
+
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = (w/2, (h-d)/2);
+
+ draw z0 -- z1;
+ draw 1/2[z0,z1] -- 1/2[z2,z3];
+ endchar;
+endfor;
+
+beginsymbol(2/3equal_spread# + 2side_bearing#, vcentre(plus_size#+rule_thickness#)); "wreath";
+ pickup rule_pen;
+
+ z0 = (w/2, (h-d)/2);
+
+ draw sim(z0 + 1/2plus_size * dir 90, z0 - 1/2plus_size * dir 90);
+endchar;
+
+beginoperator(med_op_size#, 1); "angle";
+ pickup rule_pen;
+
+ z0 = centre - 1/3plus_size * dir 90;
+
+ z1 = z0 + 1/2plus_size * dir 0;
+ z2 = z0 - 1/2plus_size * dir 0;
+ x3 = xpart centre + 1/2plus_size;
+ y3 = ypart centre + 2/3plus_size;
+
+ draw z1 -- z2 -- 5/6[z2,z3];
+endchar;
+
+beginoperator(med_op_size#, 1); "measured angle";
+ pickup rule_pen;
+
+ z0 = centre - 1/3plus_size * dir 90;
+
+ z1 = z0 + 1/2plus_size * dir 0;
+ z2 = z0 - 1/2plus_size * dir 0;
+ x3 = xpart centre + 1/2plus_size;
+ y3 = ypart centre + 2/3plus_size;
+
+ z4 = 2/3 [z2,z1];
+ z5 = z2 + (z4 - z2) rotated angle (z3 - z2);
+
+ draw z1 -- z2 -- 5/6[z2,z3];
+ draw z4{dir 90} .. {dir (angle (z3 - z2) + 90)}z5;
+endchar;
+
+beginoperator(med_op_size#, 1); "spherical angle";
+ pickup rule_pen;
+
+ z0 = centre - 1/2plus_size * dir 0;
+
+ z1 = z0 + plus_size * dir 25;
+ z2 = z0 + plus_size * dir -25;
+ z3 = z0 + 2/3plus_size * dir 25;
+ z4 = z0 + 2/3plus_size * dir -25;
+
+ draw z1 -- z0 -- z2;
+ draw z4{dir 65} .. {dir 115}z3;
+endchar;
+
+beginsymbol(5.5u#, 4/5asc_height#, 0); "prime";
+ pickup penrazor;
+
+ z0 = (w, h);
+
+ z1 = z0 + 7/3u * dir 183;
+
+ z2 = (1u, 1/9h);
+ z3 = z2 + u * dir -20;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginsymbol(5.5u#, 4/5asc_height#, 0); "backprime";
+ pickup penrazor;
+
+ z0 = (0, h);
+
+ z1 = z0 + 7/3u * dir -3;
+
+ z2 = (w - 1u, 1/9h);
+ z3 = z2 + u * dir 200;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "product";
+ draw_product(centre, plus_size, plus_size, sign, rule_thickness);
+ endchar;
+endfor;
+
+beginsymbol(13u# + 2side_bearing#, asc_height#, 0); "check mark";
+ pickup pencircle
+ xscaled 3/2rule_thickness
+ yscaled 3/4rule_thickness
+ rotated 30;
+
+ lft x1 = hround(1.5u);
+ x2 = hround(w/3);
+ x3 = w - x1;
+ x4 = w - 3/2x2;
+
+ y1 = math_axis;
+ y2 = -d;
+ y3 = y4 = h;
+
+ draw z1 -- z2{z4 - z2} .. z3;
+
+ penlabels(1,2,3,4);
+endchar;
+
+beginsymbol(6u# + 2side_bearing#, 5/4asc_height#, 1/8asc_height#); "lightning";
+
+ penpos1 (2rule_thickness, -20);
+ penpos4 (5/6rule_thickness, -20);
+
+ x3r = w - side_bearing;
+ x2l = side_bearing;
+ x4 = 1/4w;
+
+ y1l = h;
+ y3r = 14/24h;
+ y4 = -d + 1/2rule_thickness;
+
+ z2'l = z2l;
+ z3'r = z3r;
+
+ z3'l = z2l + whatever * dir 15;
+ z2'r = z3r + whatever * dir 15;
+
+ z2r - z2l = 3/2rule_thickness * dir 15;
+ z3r - z3l = 2rule_thickness * dir 15;
+ z3'l = z3r + rule_thickness * dir (angle (z4r - z3r));
+
+ z1l - z2l = whatever * (z4r - z3r);
+ z2'r = whatever[z1l,z2l];
+
+ fill stroke z1e -- z2e -- z2'e -- z3'e -- z3e -- z4e;
+
+ pickup rule_pen;
+
+ draw arrowhead(z4, angle (z4l - z3l), 4/5arrow_spread);
+
+ penlabels(1,2,2',3',3,4);
+endchar;
+
+beginsymbol(11u#, 1/2[x_height#,asc_height#], 0)
+ "diamond suit";
+
+ x0 = x2 = w/2;
+ 1/2[y0,y2] = h/2;
+ y2 - y0 = h;
+
+ 1/2[x1,x3] = w/2;
+ x3 - x1 = w - 2side_bearing;
+ y1 = y3 = h/2;
+
+ pickup pencircle scaled rule_thickness;
+
+ draw z0{dir (90+30)} .. {dir (180-30)}z1{dir (0+30)}
+ .. {dir (90-30)}z2{dir (270+30)}
+ .. {dir (0-30)}z3{dir (180+30)}
+ .. {dir (270-30)}z0 & cycle;
+endchar;
+
+beginsymbol(11u#, 1/2[x_height#,asc_height#], 0)
+ "heart suit";
+
+ x0 = x1 = w/2;
+ y0 = 0;
+
+ 1/2[x2,x3] = w/2;
+ x3 - x2 = w - 2side_bearing;
+
+ y1 = y2 = y3;
+
+ x4 = 1/2[x1,x2];
+ x5 = 1/2[x1,x3];
+
+ y4 = y5 = h;
+
+ h - y1 = x4 - x2;
+
+ pickup pencircle scaled rule_thickness;
+
+ draw z0{dir (90+20)} .. z2 .. z4 .. {dir (270+20)}z1{dir (90-20)} .. z5 .. z3 .. {dir (270-20)}z0 & cycle;
+endchar;
+
+beginsymbol(11u#, 1/2[x_height#,asc_height#], 0)
+ "spade suit";
+
+ x0 = x1 = w/2;
+ y0 = h + 1/2rule_thickness;
+
+ 1/2[x2,x3] = w/2;
+ x3 - x2 = w - 2side_bearing;
+
+ y2 = y3;
+
+ x4 = 1/2[x1,x2];
+ x5 = 1/2[x1,x3];
+
+ y4 = y5 = 1/6h;
+
+ y2 - y4 = x4 - x2;
+
+ y1 = 1/3[y2,y4];
+
+ x6 = x0;
+ y6 = 0;
+ penpos1(1/2rule_thickness, 0);
+ penpos6(3/2rule_thickness, 0);
+
+ pickup pencircle scaled rule_thickness;
+
+ fill z0{dir (270-20)} .. z2 .. z4 .. {dir (90-20)}(z1 + 1/2rule_thickness*left)
+ -- (z1 + 1/2rule_thickness*right){dir (270+20)} .. z5 .. z3 .. {dir (90+20)}z0 -- cycle;
+
+ fill stroke z1e -- z6e;
+
+ labels (0,1,2,3,4,5,6);
+endchar;
+
+beginsymbol(11u#, 1/2[x_height#,asc_height#], 0)
+ "club suit";
+
+ radius := 5/11(w - 4side_bearing);
+
+ x0 = w/2;
+ y0 = h - 2.5radius;
+
+ x1 = w - x3 = 3/5x0;
+ y1 = y3 = y0;
+ x2 = x4 = x0;
+ y2 = h - radius;
+ y4 = 0;
+
+ penpos0(2/3rule_thickness, 0);
+ penpos1(2/3rule_thickness, 90);
+ penpos2(2/3rule_thickness, 0);
+ penpos3(2/3rule_thickness, 90);
+ penpos4(3/2rule_thickness, 0);
+
+ fill circle(z1, radius);
+ fill circle(z2, radius);
+ fill circle(z3, radius);
+
+ fill stroke z2e -- z0e{down} .. z4e;
+ fill stroke z1e -- z3e;
+
+ labels (0,1,2,3,4);
+endchar;
+
+beginsymbol(5/4order_width# + 2side_bearing#, asc_height#, 0);
+ "forall";
+ pickup rule_pen;
+
+ lft x0 = side_bearing;
+ rt x1 = w - side_bearing;
+ x2 = w/2;
+
+ top y0 = top y1 = h;
+ bot y2 = 0;
+
+ z4 = whatever [z0,z2];
+ z5 = whatever [z1,z2];
+
+ y4 = y5 = x_height;
+
+ draw z0 -- z2 -- z1;
+
+ pickup pencircle scaled 8/9rule_thickness;
+
+ draw z4 -- z5;
+endchar;
+
+for negated = 0, 1:
+ beginsymbol(order_width# + 2side_bearing#,
+ if negated = 0: asc_height# else: asc_height# + 2/3equal_spread# fi,
+ if negated = 0: 0 else: 2/3equal_spread# fi);
+ "exists";
+
+ pickup rule_pen;
+
+ lft x0 = lft x2 = side_bearing;
+ rt x1 = rt x3 = w - side_bearing;
+
+ top y0 = top y1 = asc_height;
+ bot y2 = bot y3 = 0;
+
+ z4 = 1/8[1/2[z0,z2], 1/2[z1,z3]];
+
+ draw z0 -- z1 -- z3 -- z2;
+ draw z4 -- 1/2[z1,z3];
+
+ if negated = 1:
+ stroke_through(1/2[1/2[z0,z2], 1/2[z1,z3]], h + d - stroke_through_thickness)
+ fi;
+ endchar;
+endfor;
+
+beginsymbol(3/2order_width# + 2side_bearing#, vcentre(med_op_size#)); "nabla";
+ pickup pencircle scaled 2/3rule_thickness;
+
+ top y0 = top y1 = h;
+ bot y2 = -d;
+
+ x0 = side_bearing;
+ x1 = w - side_bearing;
+ x2 = w/2;
+
+ y3 = y4 = y0 - 2/3rule_thickness;
+
+ z3 = whatever[z0,z2];
+ z4 = whatever[z1,z2];
+ z5 = whatever[z0,z1];
+ z6 = whatever[z1,z2];
+
+ x5 - x0 = -2/3rule_thickness / sind (angle (z2 - z0));
+
+ z6 = z5 + whatever * (z2 - z0);
+
+ draw z0 -- z1 -- z2 -- cycle;
+ filldraw z0 -- z3 -- z4 -- z1 -- cycle;
+ filldraw z0 -- z5 -- z6 -- z2 -- cycle;
+endchar;
+
+beginsymbol(2order_width# + 2side_bearing#, x_height#, 0); "infinity";
+ pickup rule_pen;
+
+ lft x0 = side_bearing;
+ rt x1 = w - side_bearing;
+
+ top y2 = top y4 = h;
+ bot y3 = bot y5 = d + rule_thickness;
+
+ y0 = y1 = 1/2[y2,y3];
+
+ x2 = x3 = 1/5[x0,x1];
+ x4 = x5 = 4/5[x0,x1];
+
+ penpos0 (rule_thickness, 180);
+ penpos1 (rule_thickness, 180);
+ penpos2 (3/2rule_thickness * cosd 30, 75);
+ penpos5 (3/2rule_thickness * cosd 30, 75);
+ penpos6 (3/2rule_thickness, 45);
+ penpos7 (3/2rule_thickness, 45);
+ penpos8 (3/2rule_thickness, 45);
+ penpos9 (6/5rule_thickness, 135);
+ penpos10(6/6rule_thickness, 135);
+
+ z6 = 1/2[z0,z1];
+
+ z7 = point 1/3 of (z2{right} .. {dir -45}z6);
+ z8 = point 2/3 of (z6{dir -45} .. {right}z5);
+ z9 = point 7/12 of (z0{up} .. {right}z2);
+ z10 = point 5/12 of (z5{right} .. {up}z1);
+
+ fill stroke z0e{up} .. {dir 45}z9e .. z2e{right} .. z7e
+ .. {dir -45}z6e .. z8e .. {right}z5e .. {dir 45}z10e .. {up}z1e;
+
+ draw z1{dir 90} .. z4{dir 180} .. {dir 225}z6{dir 225} .. {dir 180}z3{dir 180}
+ .. {dir 90}z0;
+ penlabels(0,1,2,3,4,5,6,7,8,9,10);
+endchar;
+
+beginsymbol(1/2order_width# + 2side_bearing#,
+ asc_height# + 2/3rule_thickness#,
+ 2/3rule_thickness#);
+ "small integral";
+
+ pair centre;
+ centre := (w/2, (h - d)/2);
+
+ draw_integral([0])(1/2, centre);
+endchar;
+
+beginsymbol(order_width#, asc_height#, 0)
+ "flat";
+
+ x0 = x1 = x4 = side_bearing + rule_thickness;
+ y0 = 0; y1 = h;
+ x3 = w - side_bearing;
+
+ y3 = 0.45[y0,y1];
+
+ y4 = 4/5x_height;
+
+ penpos0(rule_thickness, 10);
+ penpos1(rule_thickness, 10);
+ penpos3(rule_thickness, 0);
+
+ fill stroke z0e -- z1e;
+
+ pickup pencircle scaled rule_thickness;
+
+ draw z0{dir 40} .. {up}z3 .. {dir 230}z4;
+
+ penlabels (0,1,3,4);
+ endchar;
+
+beginsymbol(order_width#, asc_height#, 0)
+ "natural";
+
+ x0 = x1 = w - x2 = w - x3 = side_bearing + 1/2rule_thickness;
+ x4 = x5 = w - x6 = w - x7 = side_bearing;
+
+ y1 = y3 = h;
+ y7 = x_height;
+ y6l = 0;
+ y0 = y2 = -h/3;
+
+ z6 = z4 + whatever * dir 15;
+ z5 = z7 + whatever * dir 15;
+
+ z8 = whatever[z0,z1] = whatever[z4,z6];
+ z9 = whatever[z2,z3] = whatever[z5,z7];
+
+ x10 = x0l;
+ x11 = x0l;
+ x12 = x2r;
+ x13 = x2r;
+
+ z10 = whatever[z4,z6];
+ z11 = whatever[z5,z7];
+ z12 = whatever[z4,z6];
+ z13 = whatever[z5,z7];
+
+ penpos0(rule_thickness, 10);
+ penpos1(rule_thickness, 10);
+ penpos2(rule_thickness, 10);
+ penpos3(rule_thickness, 10);
+ penpos4(5/4rule_thickness, 90);
+ penpos5(5/4rule_thickness, 90);
+ penpos6(5/4rule_thickness, 90);
+ penpos7(5/4rule_thickness, 90);
+ penpos8 (rule_thickness, 10);
+ penpos9 (rule_thickness, 10);
+ penpos10(5/4rule_thickness, 90);
+ penpos11(5/4rule_thickness, 90);
+ penpos12(5/4rule_thickness, 90);
+ penpos13(5/4rule_thickness, 90);
+
+ fill stroke z1e -- z8e;
+ fill stroke z9e -- z2e;
+ fill stroke z10e -- z12e;
+ fill stroke z11e -- z13e;
+
+ penlabels (0,1,2,3,4,5,6,7);
+ endchar;
+
+beginsymbol(order_width#, asc_height#, 0)
+ "sharp";
+
+ x0 = x1 = w - x2 = w - x3 = side_bearing + rule_thickness;
+
+ x4 = x5 = w - x6 = w - x7 = side_bearing;
+
+ y3 = h;
+ y7 = x_height;
+ y6l = 0;
+ y0 = -h/3;
+
+ z2 = z0 + whatever * dir 20;
+ z1 = z3 + whatever * dir 20;
+ z6 = z4 + whatever * dir 15;
+ z5 = z7 + whatever * dir 15;
+
+ penpos0(rule_thickness, 10);
+ penpos1(rule_thickness, 10);
+ penpos2(rule_thickness, 10);
+ penpos3(rule_thickness, 10);
+ penpos4(5/4rule_thickness, 90);
+ penpos5(5/4rule_thickness, 90);
+ penpos6(5/4rule_thickness, 90);
+ penpos7(5/4rule_thickness, 90);
+
+ fill stroke z0e -- z1e;
+ fill stroke z2e -- z3e;
+ fill stroke z4e -- z6e;
+ fill stroke z5e -- z7e;
+
+ penlabels (0,1,2,3,4,5,6,7);
+endchar;
+
+beginsymbol(11u#, 0.85asc_height#, 0); "aleph";
+
+ pickup pencircle scaled 2/3rule_thickness;
+
+ penpos 1(0, 65);
+ penpos 2(rule_thickness, 65);
+ penpos 3(rule_thickness, 65);
+ penpos 4(0, 65);
+ penpos 5(rule_thickness, 65);
+ penpos 6(rule_thickness, 65);
+ penpos 7(rule_thickness, 65);
+ penpos 8(rule_thickness, 65);
+ penpos 9(rule_thickness, 65);
+ penpos10(rule_thickness, 65);
+ penpos11(rule_thickness, 65);
+ penpos12(rule_thickness, 65);
+ penpos13(rule_thickness, 65);
+
+ x1l = side_bearing;
+ x4r = w - side_bearing;
+ y1r = h;
+ y4l = 0;
+
+ x2 - x1 = x4 - x3 = ceiling (u/2);
+ y1 - y2 = y3 - y4 = 2rule_thickness;
+ 1/2[z2,z3] = (w/2,h/2);
+
+ z5 = 0.24[z2,z3];
+ z6 = 0.60[z2,z3];
+
+ x7 = x8 = x2;
+ x9 = x5;
+ y7 = min (y6, y5 - 3/2rule_thickness);
+ bot y8l = bot y9l = 0;
+
+ x10 = x11 = 0.85[x2,x3];
+ y10 = max (y5, y6 + 3/2rule_thickness);
+
+ x12 = x3 + 2/3rule_thickness;
+ x13 = 1/4[x6,x10];
+
+ top y13r = h;
+ z12 = z13 + whatever * (z3-z2);
+ z11 = z13 + whatever * (z3-z2);
+
+ y11r := y11; % prevent the stroke from sticking out at the other side
+
+ filldraw stroke z1e{down} ... {z3e-z2e}z2e -- z3e{z3e-z2e} ... {down}z4e;
+ filldraw stroke z12e -- z13e;
+
+ alpha := angle (z5 - z7);
+ beta := (alpha + 90)/2;
+ penpos5'(3/2rule_thickness * abs cosd (155 - alpha), alpha - 90);
+ penpos7'(3/2rule_thickness * abs cosd (155 - beta), beta - 90);
+ z5' = z5;
+ z7' = z7;
+
+ % We don't need a filldraw since the stroke is that thin.
+ % A filldraw might cause "Strange path" errors in low resolutions.
+
+ draw stroke z5'e{-dir alpha} .. {-dir beta}z7'e -- z8e;
+ filldraw stroke z8e -- z9e;
+
+ alpha := angle (z10 - z6);
+ beta := (alpha + 90)/2;
+ penpos 6'(3/2rule_thickness * abs cosd (155 - alpha), alpha - 90);
+ penpos10'(3/2rule_thickness * abs cosd (155 - beta), beta - 90);
+ z6' = z6;
+ z10' = z10;
+
+ draw stroke z6'e{dir alpha} .. {dir beta}z10'e -- z11e;
+
+ penlabels(1,2,3,4,5,6,7,8,9,10,11,12,13,5',7');
+endchar;
+
+beginsymbol(11u#, 0.85asc_height#, 0); "beth";
+
+ pickup pencircle scaled 2/3rule_thickness;
+
+ penpos1(0, 65);
+ penpos2(rule_thickness, 65);
+ penpos3(rule_thickness, 65);
+ penpos4(rule_thickness, 65);
+ penpos5(rule_thickness, 65);
+ penpos6(rule_thickness, 65);
+ penpos7(rule_thickness, 65);
+
+ x1l = side_bearing + rule_thickness;
+ y1r = h;
+ x2 - x1 = ceiling (u/2);
+ y1 - y2 = 3/2rule_thickness;
+ y3 = y2;
+
+ x3 = w - x2;
+ bot y5l = 0;
+
+ x4r = w - side_bearing;
+ y3l - y4 = y1 - y2r;
+
+ x5 = x4;
+
+ x6 = w - x7l = side_bearing;
+ y6 = y7 = y5;
+
+ filldraw stroke z1e{down} ... {z3e-z2e}z2e -- z3e{z3e-z2e} ... {down}z4e -- z5e;
+ filldraw stroke z6e -- z7e;
+
+ penlabels(1,2,3,4,5,6,7);
+endchar;
+
+beginsymbol(7u#, 0.85asc_height#, 0); "gimel";
+
+ pickup pencircle scaled 2/3rule_thickness;
+
+ penpos1(0, 65);
+ penpos2(rule_thickness, 65);
+ penpos3(rule_thickness, 65);
+ penpos4(rule_thickness, 65);
+ penpos5(rule_thickness, 65);
+ penpos6(rule_thickness, 65);
+ penpos7(rule_thickness, 65);
+ penpos8(rule_thickness, 65);
+
+ x1l = side_bearing + rule_thickness;
+ y1r = h;
+ x2 - x1 = ceiling (u/2);
+ y1 - y2 = 3/2rule_thickness;
+
+ z3 = z2 + whatever * dir -25;
+
+ x3 = w - x2;
+
+ x4r = w - side_bearing - 1/3rule_thickness;
+ y3l - y4 = y1 - y2r;
+
+ x5 = x4;
+ x6 = w - side_bearing;
+
+ y5l = y8r;
+ bot y6l = 0;
+
+ x7 = side_bearing;
+ rt x8r = lft x5l;
+ y7 = y8 = y6;
+
+ filldraw stroke z1e{down} ... {z3e-z2e}z2e -- z3e{z3e-z2e} ... {down}z4e -- z5e .. z6e;
+ filldraw stroke z7e -- z8e;
+
+ penlabels(1,2,3,4,5,6,7,8);
+endchar;
+
+beginsymbol(11u#, 0.85asc_height#, 0); "daleth";
+
+ pickup pencircle scaled 2/3rule_thickness;
+
+ penpos1(0, 65);
+ penpos2(rule_thickness, 65);
+ penpos3(rule_thickness, 65);
+ penpos4(1/2rule_thickness, 65);
+ penpos5(rule_thickness, 65);
+
+ x1l = side_bearing;
+ y1r = h;
+ x2 - x1 = ceiling (u/2);
+ y1 - y2 = 3/2rule_thickness;
+ y2 = y3 = y4;
+
+ x3 = w - side_bearing;
+ x4 = x3 - 3/2rule_thickness;
+ y5 = 0;
+ x5l = x4l;
+
+
+ filldraw stroke z1e{down} ... {z3e-z2e}z2e -- z3e{z3e-z2e};
+ filldraw stroke z4e{down} ... z5e;
+
+ penlabels(1,2,3,4,5);
+endchar;
+
+
+begingroup;
+
+save slant;
+save currenttransform;
+
+slant := 0.212557;
+
+transform currenttransform;
+
+currenttransform := identity slanted slant yscaled aspect_ratio scaled granularity shifted (-u,0);
+
+beginsymbol(11u#, x_height#, 8/25asc_height#);
+ "Weierstrass p";
+
+ pickup pencircle scaled 1/2rule_thickness;
+
+ numeric theta;
+ theta = 90-angle(8u,h);
+ slope := -h/8u; % angle at middle
+ superness := 1/sqrt 2;
+ superpull := 1/6;
+
+ penpos2(1/2rule_thickness, -90);
+ penpos1(5/6rule_thickness,theta);
+ penpos7(1/2rule_thickness, -90);
+
+ x2 + .5u = x1 = x7 - .5u = 3u;
+ top y2l = h;
+ bot y7r = -d;
+ y1 = .4[-d, h];
+
+ lft x3l = hround .5u;
+ rt x6r = hround max(rt x7 + .5, .5w - .25u);
+
+ x3r - x3l = x6r - x6l = (hround 3/4rule_thickness) - 1/10rule_thickness;
+
+ ellipse_set(2l,3l,4l,1l);
+ ellipse_set(2r,3r,4r,1r);
+ ellipse_set(7l,6l,5l,1l);
+ ellipse_set(7r,6r,5r,1r);
+
+ y3 = y3r;
+ y6 = y6r;
+
+ filldraw stroke super_arc.e(2,3) & z3e{down} .. z4e --- z5e .. z6e{down} & super_arc.e(6,7); % flourish
+
+ penpos8(1/2rule_thickness, 180);
+ penpos9(1/2rule_thickness, 90);
+ penpos10(rule_thickness, 0);
+ penpos11(1/2rule_thickness, -90);
+ penpos12(1/2rule_thickness, -180);
+ penpos13(5/7rule_thickness, -180);
+
+ rt x10r = hround(w - 1.5u + 1/2rule_thickness);
+ lft x12r = hround(.5w - .5u);
+ rt x8l = hround 2.25u;
+ x9 = x11 = max(x12l + eps, .5w + 1.5u);
+ y8 = 0;
+ top y9r = vround .95h;
+ y10 = .5[y9,y11];
+ bot y11r = y8;
+
+ filldraw stroke z7e{left} ... z8e{up} ... pulled_arc.e(9,10) & pulled_arc.e(10,11); % stem and bowl
+
+ y13 - 5/7rule_thickness = .15h;
+ bulb(11,12,13); % bulb
+
+ penlabels(1,2,3,4,5,6,7,8,9,10,11,12,13);
+endchar;
+
+beginsymbol(11u#, 11/10asc_height#, 1/10asc_height#);
+ "powerset";
+
+ pickup pencircle scaled 1/2rule_thickness;
+
+ numeric theta;
+ theta = 90 - angle(12/7*8u, h);
+ slope := -h/(12/7*8u); % angle at middle
+ superness := 1/sqrt 2;
+ superpull := 1/6;
+
+ penpos2(1/2rule_thickness, -90);
+ penpos1(rule_thickness,theta);
+ penpos7(1/2rule_thickness, -90);
+
+ x2 + .5u = x1 = x7 - .5u = 3u;
+ top y2l = h;
+ bot y7r = -d;
+ y1 = .4h;
+
+ lft x3l = hround .5u;
+ rt x6r = hround max(rt x7 + .5, .5w - .25u);
+
+ x3r - x3l = x6r - x6l = (hround 3/4rule_thickness) - 1/10rule_thickness;
+
+ ellipse_set(2l,3l,4l,1l);
+ ellipse_set(2r,3r,4r,1r);
+ ellipse_set(7l,6l,5l,1l);
+ ellipse_set(7r,6r,5r,1r);
+
+ y3 = y3r;
+ y6 = y6r;
+
+ filldraw stroke super_arc.e(2,3) & z3e{down} .. z4e --- z5e .. z6e{down} & super_arc.e(6,7); % flourish
+
+ penpos8(1/2rule_thickness, 180);
+ penpos9(1/2rule_thickness, 90);
+ penpos10(rule_thickness, 0);
+ penpos11(1/2rule_thickness, -90);
+ penpos12(1/2rule_thickness, -180);
+ penpos13(5/7rule_thickness, -180);
+
+ rt x10r = hround(w - 1.5u + 1/2rule_thickness);
+ lft x12r = hround(.5w - .5u);
+ rt x8l = hround 2.25u;
+ x9 = x11 = max(x12l + eps, .5w + 1.5u);
+ y8 = 10/11*5/12h;
+ top y9r = vround .95h;
+ y10 = .5[y9,y11];
+ bot y11r = y8;
+
+ filldraw stroke z7e{left} ... z8e{up} ... pulled_arc.e(9,10) & pulled_arc.e(10,11); % stem and bowl
+
+ y13 - 5/7rule_thickness = y8 + 1/10h;
+ bulb(11,12,13); % bulb
+
+ penlabels(1,2,3,4,5,6,7,8,9,10,11,12,13);
+endchar;
+
+endgroup;
+
+% Warning: The other two orientations are above.
+% They should stay consistent.
+
+beginoperator(plus_size#, 1); "upside down logical not";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 180) -- (centre + r * dir 0)
+ -- (centre + r * dir 0 + equal_spread * dir 90);
+endchar;
+
+beginoperator(plus_size#, 1); "upside down reversed logical not";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 180 + equal_spread * dir 90)
+ -- (centre + r * dir 180) -- (centre + r * dir 0)
+endchar;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "half square union";
+ pickup rule_pen;
+
+ z3 - z0 = z2 - z1 = plus_size * dir 0;
+ z0 - z1 = sign * plus_size * dir 90;
+
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw z0 -- z1 -- z2;
+ endchar;
+
+ beginoperator(plus_size#, 1); "half square union";
+ pickup rule_pen;
+
+ z3 - z0 = z2 - z1 = plus_size * dir 0;
+ z0 - z1 = sign * plus_size * dir 90;
+
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw z1 -- z2 -- z3;
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "closed curly wedge";
+ pickup rule_pen;
+
+ z0 = centre + 1/2plus_size * dir alpha;
+ z1 = centre - 1/2plus_size * dir alpha;
+ z2 = z1 + 1/2plus_size * dir (alpha + 90);
+ z3 = z1 - 1/2plus_size * dir (alpha + 90);
+
+ draw z2{dir (alpha - 40)}
+ .. {dir alpha}z0{dir (alpha + 180)}
+ .. {dir (alpha - 140)}z3{dir (alpha + 40)}
+ .. {dir (alpha + 140)}z2 & cycle;
+
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(6/5plus_size#, 1); "slice";
+ pickup rule_pen;
+
+ z1 - 1/2[z0,z2] = plus_size * dir alpha;
+
+ z2 - z0 = plus_size * dir (alpha + 90);
+
+ 7/12[z1,1/2[z0,z2]] = centre;
+
+ draw z1 -- z0{dir (alpha + 120)} .. {dir (alpha + 60)}z2 -- cycle;
+ endchar;
+endfor;
+
+beginoperator(5/6small_op_size#, 8/5); "small lozenge";
+ pickup rule_pen;
+
+ lft x0 = w - rt x2 = side_bearing;
+ y0 = y2 = ypart centre;
+
+ x1 = x3 = xpart centre;
+ top y1 = h;
+ bot y3 = -d;
+
+ draw z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginoperator(5/6small_op_size#, 8/5); "small filled lozenge";
+ pickup rule_pen;
+
+ lft x0 = w - rt x2 = side_bearing;
+ y0 = y2 = ypart centre;
+
+ x1 = x3 = xpart centre;
+ top y1 = h;
+ bot y3 = -d;
+
+ draw z0 -- z1 -- z2 -- z3 -- cycle;
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*med_op_size#, 8/5); "medium lozenge";
+ pickup rule_pen;
+
+ lft x0 = w - rt x2 = side_bearing;
+ y0 = y2 = ypart centre;
+
+ x1 = x3 = xpart centre;
+ top y1 = h;
+ bot y3 = -d;
+
+ draw z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*med_op_size#, 8/5); "medium filled lozenge";
+ pickup rule_pen;
+
+ lft x0 = w - rt x2 = side_bearing;
+ y0 = y2 = ypart centre;
+
+ x1 = x3 = xpart centre;
+ top y1 = h;
+ bot y3 = -d;
+
+ draw z0 -- z1 -- z2 -- z3 -- cycle;
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*large_op_size#, 8/5); "large lozenge";
+ pickup rule_pen;
+
+ lft x0 = w - rt x2 = side_bearing;
+ y0 = y2 = ypart centre;
+
+ x1 = x3 = xpart centre;
+ top y1 = h;
+ bot y3 = -d;
+
+ draw z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(med_op_size#, 1); "medium filled triangle (" & decimal alpha & ")";
+ pickup rule_pen;
+ draw triangle(centre, w/2-side_bearing, alpha);
+ fill triangle(centre, w/2-side_bearing, alpha);
+ endchar;
+endfor;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium filled square";
+ pickup rule_pen;
+ draw square(centre, w/2 - side_bearing, 0);
+ fill square(centre, w/2 - side_bearing, 0);
+endchar;
+
+
+beginoperator(large_op_size#, 1); "large filled star";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(5, centre, r, 90);
+ reg_poly_points(b)(5, centre, .4r, 126);
+ draw z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+endchar;
+
+beginoperator(med_op_size#, 1); "medium star of david";
+ pickup pencircle scaled 4/5rule_thickness;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(6, centre, r, 90);
+ draw z.a0 -- z.a2 -- z.a4 -- cycle;
+ draw z.a1 -- z.a3 -- z.a5 -- cycle;
+endchar;
+
+beginoperator(large_op_size#, 1); "large star of david";
+ pickup rule_pen;
+ r := w/2 - side_bearing;
+ reg_poly_points(a)(6, centre, r, 90);
+ draw z.a0 -- z.a2 -- z.a4 -- cycle;
+ draw z.a1 -- z.a3 -- z.a5 -- cycle;
+endchar;
+
+beginoperator(med_op_size#, 1); "maltese";
+ pickup rule_pen;
+
+ 1/2[z0,z1] = centre + 1/2med_op_size * dir 180;
+ 1/2[z2,z3] = centre + 1/2med_op_size * dir 270;
+ 1/2[z4,z5] = centre + 1/2med_op_size * dir 0;
+ 1/2[z6,z7] = centre + 1/2med_op_size * dir 90;
+
+ z0 - z1 = z5 - z4 = 1/2med_op_size * up;
+ z3 - z2 = z6 - z7 = 1/2med_op_size * right;
+
+ filldraw z1{dir 45}
+ .. {right}centre{down}
+ .. {dir 225}z2 -- z3{dir 135}
+ .. {up}centre{right}
+ .. {dir -45}z4 -- z5{dir 225}
+ .. {left}centre{up}
+ .. {dir 45}z6 -- z7{dir -45}
+ .. {down}centre{left}
+ .. z0{dir 135} -- cycle;
+endchar;
+
+
+current_char := 219;
+
+% Keep these consistent with the glyphs in Sym-Order.mf!
+
+for negated = 0, 1:
+
+ vardef ifneg(text values) =
+ select(negated)(values)
+ enddef;
+
+ beginorder(1, order_width# + rule_thickness#, ifneg(2,4) * equal_spread# + rule_thickness#);
+ "closedequal";
+ pickup rule_pen;
+
+ z2 - z1 = z1 - z0 = equal_spread * dir 90;
+ z5 - z4 = z4 - z3 = equal_spread * dir 90;
+
+ 1/2[z0, z2] = left_point;
+ 1/2[z3, z5] = right_point;
+
+ draw z0 -- z3;
+ draw z1 -- z4 -- z5 -- z2 -- cycle;
+
+ if negated = 1:
+ stroke_through(centre, 4equal_spread);
+ fi;
+ endchar;
+
+ beginorder(1, order_width# + rule_thickness#, ifneg(2,4) * equal_spread# + rule_thickness#);
+ "equalclosed";
+ pickup rule_pen;
+
+ z2 - z1 = z1 - z0 = equal_spread * dir 90;
+ z5 - z4 = z4 - z3 = equal_spread * dir 90;
+
+ 1/2[z0, z2] = left_point;
+ 1/2[z3, z5] = right_point;
+
+ draw z0 -- z3 -- z4 -- z1 -- cycle;
+ draw z2 -- z5;
+
+ if negated = 1:
+ stroke_through(centre, 4equal_spread);
+ fi;
+ endchar;
+
+ beginorder(1, order_width# + rule_thickness#, ifneg(2,4) * equal_spread# + rule_thickness#);
+ "equivclosed";
+ pickup rule_pen;
+
+ z2 - z1 = z1 - z0 = equal_spread * dir 90;
+ z5 - z4 = z4 - z3 = equal_spread * dir 90;
+
+ 1/2[z0, z2] = left_point;
+ 1/2[z3, z5] = right_point;
+
+ draw z0 -- z3 -- z5 -- z2 -- cycle;
+ draw (z1 + 1/4rule_thickness * right) -- (z4 + 1/4rule_thickness * left);
+
+ if negated = 1:
+ stroke_through(centre, 4equal_spread);
+ fi;
+ endchar;
+
+ for sign = 1, -1:
+ beginorder(sign, order_width# + rule_thickness#,
+ greater_spread# + ifneg(4/3, 8/3) * equal_spread# + rule_thickness#);
+ "less sim";
+
+ pickup rule_pen;
+
+ z1 - z0 = greater_spread * dir 90;
+ y2 = 1/2[y0, y1];
+ x0 = xpart right_point;
+ x2 = xpart left_point;
+ y3 = y4 = y0 - equal_spread;
+ x4 - x3 = sign * (x0 - x2);
+ 1/2[x3,x4] = xpart centre;
+
+ 1/2[y1, y4 - 1/3equal_spread] = ypart centre;
+
+ draw z0 -- z2 -- z1;
+ draw sim(z3, z4);
+
+ if negated = 1:
+ stroke_through(centre, 8/3equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+
+ for sign = 1, -1:
+ beginorder(sign, order_width# + rule_thickness#,
+ greater_spread# + ifneg(7/3, 9/3) * equal_spread# + rule_thickness#);
+ "less approx";
+
+ pickup rule_pen;
+
+ z1 - z0 = greater_spread * dir 90;
+ y2 = 1/2[y0, y1];
+ x0 = xpart right_point;
+ x2 = xpart left_point;
+ y3 = y4 = y0 - equal_spread;
+ y5 = y6 = y4 - equal_spread;
+ x4 - x3 = sign * (x0 - x2);
+ 1/2[x3,x4] = xpart centre;
+ x6 = x4;
+ x5 = x3;
+
+ 1/2[y1, y6 - 1/3equal_spread] = ypart centre;
+
+ draw z0 -- z2 -- z1;
+ draw sim(z3, z4);
+ draw sim(z5, z6);
+
+ if negated = 1:
+ stroke_through(centre, 9/3equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+
+ for sign = 1, -1:
+ beginorder(sign, order_width# + rule_thickness#,
+ greater_spread# + ifneg(1,3) * equal_spread# + rule_thickness#);
+ "slanted equal or less than";
+
+ pickup rule_pen;
+
+ z0 - z1 = greater_spread * dir 90;
+ z3 - z2 = equal_spread * dir 90;
+ z4 - z0 = equal_spread * dir 90;
+
+ 1/2[z2, z3] = left_point;
+ 1/2[z1, z4] = right_point;
+
+ draw z0 -- z2 -- z1;
+ draw z3 -- z4;
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread + greater_spread);
+ fi;
+ endchar;
+ endfor;
+
+ for sign = 1, -1:
+ beginorder(sign, order_width# + rule_thickness#,
+ ifneg(1,3) * equal_spread# + 2/3[equal_spread#, greater_spread#] + rule_thickness#);
+ "curly equal or curly less than";
+
+ pickup rule_pen;
+
+ t := 2/3[equal_spread, greater_spread];
+
+ z0 - z1 = equal_spread * dir 90;
+ z2 - z4 = 7/5equal_spread * dir 90;
+ z4 - z3 = t/2 * dir 90;
+ y1 = y3;
+ y4 = ypart centre + 1/2(t - equal_spread);
+ x0 = xpart left_point;
+ x2 = xpart right_point;
+
+ path p;
+
+ p = z0{z3 - z1} .. z2;
+
+ v := xpart (p intersectiontimes (z4 -- (z4 + h * dir (90 + sign * 20))));
+
+ draw prec(z1, z3, t);
+ draw subpath (0,v) of p;
+
+ if negated = 1:
+ stroke_through(centre, 3equal_spread + 2/3[equal_spread, greater_spread]);
+ fi;
+
+ labels(0,1,2,3,4);
+ endchar;
+ endfor;
+
+ for alpha = 0, 180:
+ beginarrow(alpha, 6/5, ifneg(14/10, 21/10) * arrow_spread#); "triple arrow (" & decimal alpha & ")";
+
+ z1 - z0 = z2 - z1 = z4 - z3 = z5 - z4 = 2/3equal_spread * dir (arrow_dir + 90);
+
+ z1 = foot;
+ z4 = head;
+
+ pickup pencircle scaled 4/5rule_thickness;
+
+ draw z0 -- arrowhead_intersection(head, arrow_dir, 14/10arrow_spread, z0 -- z3);
+ draw z1 -- arrowhead_intersection(head, arrow_dir, 14/10arrow_spread, z1 -- z4);
+ draw z2 -- arrowhead_intersection(head, arrow_dir, 14/10arrow_spread, z2 -- z5);
+
+ pickup rule_pen;
+
+ draw arrowhead(head, arrow_dir, 14/10arrow_spread);
+
+ if negated = 1:
+ stroke_through_arrow(1/2[foot, head - arrow_spread * dir arrow_dir], alpha, 21/10arrow_spread)
+ (70, 70, 110, 110, 70, 70, 110, 110);
+ fi
+ endchar;
+ endfor;
+
+endfor;
+
+for sign = -1, 1:
+ beginsymbol(4/3arrow_spread# + 2side_bearing#, vcentre(2arrow_spread# + rule_thickness#));
+ "left shift";
+
+ pickup rule_pen;
+
+ top y0 = top y1 = h - 1/2arrow_spread;
+ bot y2 = -d;
+
+ 1/2[x0,x1] = w/2;
+ x1 - x0 = sign * 4/3arrow_spread;
+
+ x2 = x1;
+
+ draw z0 -- z1 -- z2;
+
+ draw arrowhead(z0, 90 + sign * 90, arrow_spread);
+ endchar;
+endfor;
+
+for sign = -1, 1:
+ beginoperator(arrow_len#, 1);
+ "loop arrow";
+
+ pickup rule_pen;
+
+ z0 = centre + sign * arrow_len/2 * left;
+ z1 = centre + arrow_len/2 * down;
+ z2 = centre + arrow_len/4 * up;
+ z3 = centre + sign * arrow_len/4 * right;
+ z4 = centre + arrow_len * (1/4sign, 1/2);
+ z5 = centre + arrow_len * (1/2sign, 1/4);
+
+ draw z0 -- z3{sign * right} .. {up}z5 .. {sign * left}z4 .. {down}z2 -- z1;
+
+ draw arrowhead(z0, 90 + sign * 90, arrow_spread);
+ endchar;
+endfor;
+
+for sign = -1, 1:
+ beginoperator(plus_size#, 1); "three times";
+ pickup rule_pen;
+
+ r := plus_size/2;
+ r := r * 1/3[1, sqrt 2];
+
+ z0 = centre + r * dir (sign * 45);
+ z1 = centre + r * dir (sign * 225);
+ z2 = centre + r * dir (270 + sign * 45);
+ z3 = centre + 1/4rule_thickness * dir (270 + sign * 45);
+
+ draw z0 -- z1;
+ draw z3 -- z2;
+ endchar;
+endfor;
+
+beginarrow(0, 5/6, 7/4arrow_spread#);
+ "Vvdash";
+
+ pickup rule_pen;
+
+ z0 = foot + 4/5equal_spread * dir arrow_dir;
+ z1 = foot + 8/5equal_spread * dir arrow_dir;
+
+ draw z1 + 1/4rule_thickness * dir arrow_dir -- head;
+ draw (foot - 7/8arrow_spread * dir (arrow_dir + 90)) --
+ (foot + 7/8arrow_spread * dir (arrow_dir + 90));
+ draw (z0 - 7/8arrow_spread * dir (arrow_dir + 90)) --
+ (z0 + 7/8arrow_spread * dir (arrow_dir + 90));
+ draw (z1 - 7/8arrow_spread * dir (arrow_dir + 90)) --
+ (z1 + 7/8arrow_spread * dir (arrow_dir + 90));
+
+endchar;
+
+beginoperator(plus_size#, 1); "negated medium bar";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ draw (centre + r * dir 90) -- (centre + r * dir 270);
+
+ stroke_through_arrow(centre, 90, 2/3plus_size, 45);
+endchar;
+
+beginoperator(plus_size#, 1); "double bar";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ z1 - z0 = equal_spread * right;
+ 1/2[z0,z1] = centre;
+
+ draw (z0 + r * up) -- (z0 + r * down);
+ draw (z1 + r * up) -- (z1 + r * down);
+endchar;
+
+beginoperator(plus_size#, 1); "negated double bar";
+ pickup rule_pen;
+
+ r := plus_size/2; % - 11/10rule_thickness;
+
+ z1 - z0 = equal_spread * right;
+ 1/2[z0,z1] = centre;
+
+ draw (z0 + r * up) -- (z0 + r * down);
+ draw (z1 + r * up) -- (z1 + r * down);
+
+ stroke_through_arrow(centre, 90, plus_size, 40);
+endchar;
+