summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/fdsymbol/fdgeometric.mf
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/fonts/source/public/fdsymbol/fdgeometric.mf')
-rw-r--r--Master/texmf-dist/fonts/source/public/fdsymbol/fdgeometric.mf1837
1 files changed, 1837 insertions, 0 deletions
diff --git a/Master/texmf-dist/fonts/source/public/fdsymbol/fdgeometric.mf b/Master/texmf-dist/fonts/source/public/fdsymbol/fdgeometric.mf
new file mode 100644
index 00000000000..520b34e5ec7
--- /dev/null
+++ b/Master/texmf-dist/fonts/source/public/fdsymbol/fdgeometric.mf
@@ -0,0 +1,1837 @@
+%
+% Copyright (c) 2011, Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% This Font Software is licensed under the SIL Open Font License,
+% Version 1.1. This license is in the accompanying file OFL.txt, and
+% is also available with a FAQ at: http://scripts.sil.org/OFL
+%
+
+beginsymbol(2dot_size# + 2side_bearing#, vcentre(2dot_size#)); "centre dot";
+ fill dot((w/2, (h-d)/2), dot_size);
+endchar;
+
+for alpha = 0, 90, 45, 135:
+ beginsymbol((4dot_size# + equal_spread#) * abs (cosd alpha) + 2dot_size# * abs (sind alpha) + 2side_bearing#, vcentre(2dot_size# * abs (cosd alpha) + (4dot_size# + equal_spread#) * abs (sind alpha))); "colon (" & decimal alpha & ")";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ z1 - z0 = (2dot_size + equal_spread) * dir alpha;
+ 1/2[z0,z1] = centre;
+
+ fill dot(z0, dot_size);
+ fill dot(z1, dot_size);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 45, 135:
+ beginsymbol((6dot_size# + 2equal_spread#) * abs (cosd alpha) + 2dot_size# * abs (sind alpha) + 2side_bearing#, vcentre(2dot_size# * abs (cosd alpha) + (6dot_size# + 2equal_spread#) * abs (sind alpha))); "triple colon (" & decimal alpha & ")";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ z1 - z0 = (2dot_size + equal_spread) * dir alpha;
+ z2 - z1 = (2dot_size + equal_spread) * dir alpha;
+ z1 = centre;
+
+ fill dot(z0, dot_size);
+ fill dot(z1, dot_size);
+ fill dot(z2, dot_size);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "therefore (" & decimal alpha & ")";
+ r := 1/2plus_size - dot_size;
+ r := r * 1/3[1, sqrt 2];
+
+ z1 = z0 + r * dir alpha;
+ z2 = z0 + r * dir (alpha + 120);
+ z3 = z0 + r * dir (alpha + 240);
+
+ 1/2[z1,1/2[z2,z3]] = centre;
+
+ fill dot(z1, dot_size);
+ fill dot(z2, dot_size);
+ fill dot(z3, dot_size);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1); "double colon";
+ r := (1/2plus_size - dot_size) * sqrt(2);
+
+ fill dot(centre + r * dir 45, dot_size);
+ fill dot(centre + r * dir 135, dot_size);
+ fill dot(centre + r * dir 225, dot_size);
+ fill dot(centre + r * dir 315, dot_size);
+endchar;
+
+beginoperator(plus_size#, 1); "minus";
+ draw_line(centre + radius * right, centre + radius * left, true);
+endchar;
+
+beginoperator(plus_size#, 1); "medium slash";
+ draw_line(centre + 4/3radius * dir 45, centre + 4/3radius * dir 225, true);
+endchar;
+
+beginoperator(plus_size#, 1); "medium backslash";
+ draw_line(centre + 4/3radius * dir 135, centre + 4/3radius * dir 315, true);
+endchar;
+
+beginoperator(plus_size#, 1); "plus";
+ draw_line(centre + radius * right, centre + radius * left, true);
+ draw_line(centre + radius * up, centre + radius * down, true);
+endchar;
+
+beginoperator(plus_size#, 1); "times";
+ r := 4/3radius;
+
+ draw_line(centre + r * dir 45, centre + r * dir 225, true);
+ draw_line(centre + r * dir 135, centre + r * dir 315, true);
+endchar;
+
+beginoperator(plus_size#, 1.25); "plus minus";
+ centre := centre + 0.125plus_size * up;
+ pair bt;
+ bt := centre + (radius + 0.25plus_size) * down;
+
+ draw_line(centre + radius * right, centre + radius * left, true);
+ draw_line(centre + radius * up, centre + radius * down, true);
+ draw_line(bt + radius * right, bt + radius * left, true);
+endchar;
+
+beginoperator(plus_size#, 1.25); "minus plus";
+ centre := centre + 0.125plus_size * down;
+ pair tp;
+ tp := centre + (radius + 0.25plus_size) * up;
+
+ draw_line(centre + radius * right, centre + radius * left, true);
+ draw_line(centre + radius * up, centre + radius * down, true);
+ draw_line(tp + radius * right, tp + radius * left, true);
+endchar;
+
+for angle = 0, 180:
+ beginoperator(plus_size#, 1); "dot minus (" & decimal angle & ")";
+ draw_line(centre - radius * dir angle, centre + radius * dir angle, true);
+ fill dot(centre + equal_spread * dir (angle + 90), 3/4dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "minus with two dots";
+ draw_line(centre + radius * right, centre + radius * left, true);
+ fill dot(centre + sign * (radius - 3/4dot_size) * left + equal_spread * up, 3/4dot_size);
+ fill dot(centre + sign * (radius - 3/4dot_size) * right + equal_spread * down, 3/4dot_size);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1); "minus with four dots";
+ draw_line(centre + radius * right, centre + radius * left, true);
+ fill dot(centre + (radius - 3/4dot_size) * left + equal_spread * up, 3/4dot_size);
+ fill dot(centre + (radius - 3/4dot_size) * right + equal_spread * up, 3/4dot_size);
+ fill dot(centre + (radius - 3/4dot_size) * left + equal_spread * down, 3/4dot_size);
+ fill dot(centre + (radius - 3/4dot_size) * right + equal_spread * down, 3/4dot_size);
+endchar;
+
+beginoperator(plus_size#, 1); "divide";
+ draw_line(centre + radius * right, centre + radius * left, true);
+ fill dot(centre + equal_spread * up, 3/4dot_size);
+ fill dot(centre + equal_spread * down, 3/4dot_size);
+endchar;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "logical not";
+ draw_line(centre + radius * left, centre + radius * right, true);
+ draw_line(centre + sign * radius * right, centre + sign * radius * right + equal_spread * down, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "upside down logical not";
+ draw_line(centre + radius * left, centre + radius * right, true);
+ draw_line(centre + sign * radius * right, centre + sign * radius * right + equal_spread * up, true);
+ endchar;
+endfor;
+
+for sign = -1, 1:
+ beginoperator(plus_size#, 1); "three times";
+ r := 4/3radius;
+
+ z0 = centre + r * dir (sign * 45);
+ z1 = centre + r * dir (sign * 225);
+ z2 = centre + r * dir (270 + sign * 45);
+ z3 = centre + 1/4line_thickness * dir (270 + sign * 45);
+
+ draw_line(z0, z1, true);
+ draw_line(z3, z2, true);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "closed times (" & decimal alpha & ")";
+ thick := line_thickness;
+ r := 4/3radius;
+
+ z0 = centre + (r + 1/2line_thickness) * dir (alpha + 45);
+ z1 = centre + r * dir (alpha + 315);
+ z2 = centre + r * dir (alpha + 225);
+ z3 = centre + (r + 1/2line_thickness) * dir (alpha + 135);
+
+ penpos0(thick,alpha + 315);
+ penpos1(thick,alpha + 45);
+ penpos2(thick,alpha + 315);
+ penpos3(thick,alpha + 45);
+
+ z5 = z1r + whatever * dir (270 + alpha - 15);
+ z6 = z2l + whatever * dir (270 + alpha + 15);
+ z5 = whatever[z1r + thick * dir (270 + alpha), z2l + thick * dir (270 + alpha)];
+ z6 = whatever[z1r + thick * dir (270 + alpha), z2l + thick * dir (270 + alpha)];
+
+ fill stroke z0e -- z2e;
+ fill stroke z1e -- z3e;
+ fill z1r -- z5 -- z6 -- z2l -- cycle;
+
+ penlabels(0,1,2,3,5,6);
+ endchar;
+endfor;
+
+for alpha = 0, 90:
+ beginoperator(plus_size#, 1); "bowtie (" & decimal alpha & ")";
+ thick := line_thickness;
+ r := 4/3radius;
+
+ z0 = centre + r * dir (alpha + 135);
+ z1 = centre + r * dir (alpha + 45);
+ z2 = centre + r * dir (alpha + 315);
+ z3 = centre + r * dir (alpha + 225);
+
+ penpos0(thick,alpha + 45);
+ penpos1(thick,alpha + 135);
+ penpos2(thick,alpha + 45);
+ penpos3(thick,alpha + 135);
+
+ z4 = z0r + whatever * dir (180 + alpha + 15);
+ z5 = z1r + whatever * dir (alpha - 15);
+ z6 = z2l + whatever * dir (alpha + 15);
+ z7 = z3l + whatever * dir (180 + alpha - 15);
+ z4 = whatever[z0r + thick * dir (180 + alpha), z3l + thick * dir (180 + alpha)];
+ z5 = whatever[z1r + thick * dir alpha, z2l + thick * dir alpha];
+ z6 = whatever[z1r + thick * dir alpha, z2l + thick * dir alpha];
+ z7 = whatever[z0r + thick * dir (180 + alpha), z3l + thick * dir (180 + alpha)];
+
+ fill stroke z0e -- z2e;
+ fill stroke z1e -- z3e;
+ fill z1r -- z5 -- z6 -- z2l -- cycle;
+ fill z0r -- z4 -- z7 -- z3l -- cycle;
+
+ penlabels(0,1,2,3,4,5,6,7);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "Y (" & decimal alpha & ")";
+ s := 1/15plus_size;
+
+ draw_line(centre - s * dir alpha, centre + radius * dir alpha, true);
+ draw_line(centre - s * dir alpha, centre - s * dir alpha + (radius + s) * dir (alpha + 135), true);
+ draw_line(centre - s * dir alpha, centre - s * dir alpha + (radius + s) * dir (alpha + 225), true);
+ endchar;
+endfor;
+
+% operators
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "wedge";
+ draw_less(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "wedge dot";
+ draw_less(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ fill dot(centre - sign * 1/3plus_size * up, 3/4dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(13/9plus_size# + 2side_bearing#, vcentre(plus_size#)); "double wedge";
+ 1/2[z0,z1] = (w/2, (h-d)/2);
+ z1 - z0 = 4/9plus_size * right;
+
+ draw_less(a, z0 + sign * plus_size/2 * up, z0 - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ draw_less(b, z1 + sign * plus_size/2 * up, z1 - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "curly wedge";
+ draw_prec(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "curly wedge dot";
+ draw_prec(a, centre + sign * plus_size/2 * up, centre - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ fill dot(1/2[z1a.l,z0a.r] + sign * 3/4dot_size * up, 3/4dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(13/9plus_size# + 2side_bearing#, vcentre(plus_size#)); "double curly wedge";
+ 1/2[z0,z1] = (w/2, (h-d)/2);
+ z1 - z0 = 4/9plus_size * right;
+
+ draw_prec(a, z0 + sign * plus_size/2 * up, z0 - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ draw_prec(b, z1 + sign * plus_size/2 * up, z1 - sign * plus_size/2 * up, 2radius, line_thickness, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union";
+ draw_subset(a,centre - sign * plus_size/2 * up, centre + sign * plus_size/2 * up, 2radius, line_thickness);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(4/3plus_size#, 1); "double union";
+ draw_subset(a, centre - sign * 5/18plus_size * up, centre + sign * 2/3plus_size * up, 5/6radius, line_thickness);
+ draw_subset(b, centre - sign * 2/3plus_size * up, centre + sign * 2/3plus_size * up, 2radius, line_thickness);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union dot";
+ draw_subset(a, centre - sign * plus_size/2 * up, centre + sign * plus_size/2 * up, 2radius, line_thickness);
+ fill dot(centre + sign * 1/6plus_size * up, 3/4dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "union plus";
+ draw_subset(a, centre - sign * plus_size/2 * up, centre + sign * plus_size/2 * up, 2radius, line_thickness);
+
+ t := 22/10line_thickness;
+ r := radius - t;
+
+ draw_line(centre + sign * 1/6plus_size * up + r * right, centre + sign * 1/6plus_size * up + r * left, true);
+ draw_line(centre + (r + sign * 1/6plus_size) * up, centre + (r - sign * 1/6plus_size) * down, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = sign * 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, false);
+ draw_line(z2, z3, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(4/3plus_size#, 1); "double square union";
+ z3a - z0a = z2a - z1a = 2radius * right;
+ z0a - z1a = sign * 2radius * up;
+ 1/2[1/2[z0a,z1a], 1/2[z2a,z3a]] = centre;
+ z3b - z0b = z2b - z1b = 5/9plus_size * right;
+ z0b - z1b = sign * 17/12radius * up;
+ y0b = y0a;
+ 1/2[x0b, x3b] = xpart centre;
+
+ draw_line(z0a, z1a, true);
+ draw_line(z1a, z2a, false);
+ draw_line(z2a, z3a, true);
+ draw_line(z0b, z1b, true);
+ draw_line(z1b, z2b, false);
+ draw_line(z2b, z3b, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union dot";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = sign * 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, false);
+ draw_line(z2, z3, true);
+ fill dot(centre + sign * 1/6plus_size * up, 3/4dot_size);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "square union plus";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = sign * 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, false);
+ draw_line(z2, z3, true);
+
+ t := 22/10line_thickness;
+ r := radius - t;
+
+ draw_line(centre + sign * 1/6plus_size * up + r * right, centre + sign * 1/6plus_size * up + r * left, true);
+ draw_line(centre + (r + sign * 1/6plus_size) * up, centre + (r - sign * 1/6plus_size) * down, true);
+ endchar;
+endfor;
+
+for alpha = 0, 180:
+ beginoperator(plus_size#, 1); "corner with dot";
+ z3 - z0 = z2 - z1 = 2radius * dir alpha;
+ z0 - z1 = 2radius * dir (alpha + 90);
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z1, z2, true);
+ draw_line(z2, z3, true);
+ fill dot(centre, 3/4dot_size);
+ endchar;
+endfor;
+
+% triangles
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol((3/4small_op_size# + 3/2line_thickness#) * abs(cosd alpha) + sqrt(3) * (small_op_size#/2 + line_thickness#) * abs(sind alpha) + 2side_bearing#, vcentre(sqrt(3) * (small_op_size#/2 + line_thickness#) * abs(cosd alpha) + (3/4small_op_size# + 3/2line_thickness#) * abs(sind alpha))); "small triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := small_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ draw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol((3/4small_op_size# + 3/2line_thickness#) * abs(cosd alpha) + sqrt(3) * (small_op_size#/2 + line_thickness#) * abs(sind alpha) + 2side_bearing#, vcentre(sqrt(3) * (small_op_size#/2 + line_thickness#) * abs(cosd alpha) + (3/4small_op_size# + 3/2line_thickness#) * abs(sind alpha))); "small filled triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := small_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ filldraw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol((3/4med_op_size# + 3/2line_thickness#) * abs(cosd alpha) + sqrt(3) * (med_op_size#/2 + line_thickness#) * abs(sind alpha) + 2side_bearing#, vcentre(sqrt(3) * (med_op_size#/2 + line_thickness#) * abs(cosd alpha) + (3/4med_op_size# + 3/2line_thickness#) * abs(sind alpha))); "medium triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := med_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ draw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginsymbol((3/4med_op_size# + 3/2line_thickness#) * abs(cosd alpha) + sqrt(3) * (med_op_size#/2 + line_thickness#) * abs(sind alpha) + 2side_bearing#, vcentre(sqrt(3) * (med_op_size#/2 + line_thickness#) * abs(cosd alpha) + (3/4med_op_size# + 3/2line_thickness#) * abs(sind alpha))); "medium filled triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := med_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ filldraw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+for alpha = 90, 270:
+ beginsymbol(sqrt(3) * (large_op_size#/2 + line_thickness#) + 2side_bearing#, vcentre(3/4large_op_size# + 3/2line_thickness#)); "large triangle (" & decimal alpha & ")";
+ thick := line_thickness;
+ radius := large_op_size/2;
+ centre := (w/2, (h - d)/2) - 1/4(radius + thick) * dir alpha;
+
+ draw_triangle(a, centre, radius, alpha, thick);
+ endchar;
+endfor;
+
+% circles
+
+beginoperator(4/5small_op_size#, 1); "small circle";
+ draw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5small_op_size#, 1); "small filled circle";
+ filldraw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle";
+ draw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium filled circle";
+ filldraw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle minus";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * left, centre + radius * right, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle bar";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle slash";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * dir 45, centre + radius * dir 225, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle backslash";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * dir 135, centre + radius * dir 315, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle plus";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * left, centre + radius * right, false);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle times";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + radius * dir 45, centre + radius * dir 225, false);
+ draw_line(centre + radius * dir 135, centre + radius * dir 315, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle dot";
+ draw_circle(centre, radius, line_thickness);
+ fill dot(centre, dot_size);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle circle";
+ draw_circle(centre, radius, line_thickness);
+ draw_circle(centre, 2/5radius, line_thickness);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle asterisk";
+ thick := line_thickness;
+
+ draw_circle(centre, radius, thick);
+
+ penpos a0(4/3thick, 0);
+ penpos a1(4/3thick, 60);
+ penpos a2(4/3thick, 120);
+ penpos a3(4/3thick, 180);
+ penpos a4(4/3thick, 240);
+ penpos a5(4/3thick, 300);
+
+ penpos b0(2/3thick, 0);
+ penpos b1(2/3thick, 60);
+ penpos b2(2/3thick, 120);
+ penpos b3(2/3thick, 180);
+ penpos b4(2/3thick, 240);
+ penpos b5(2/3thick, 300);
+
+ reg_poly_points(a)(6, centre, radius, 90);
+
+ z.b0 = z.b1 = z.b2 = z.b3 = z.b4 = z.b5 = 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;
+ fill stroke z.a5e -- z.b5e;
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle dash";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + 2/3radius * left, centre + 2/3radius * right, false);
+endchar;
+
+beginoperator(4/5med_op_size#, 1); "medium circle equal";
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + 2/5equal_spread * up + 2/3radius * left, centre + 2/5equal_spread * up + 2/3radius * right, false);
+ draw_line(centre + 2/5equal_spread * down + 2/3radius * left, centre + 2/5equal_spread * down + 2/3radius * right, false);
+endchar;
+
+for sign = 1,-1:
+ beginoperator(4/5med_op_size#, 1); "negated medium circle";
+ r := 4/3radius;
+
+ draw_circle(centre, radius, line_thickness);
+ draw_line(centre + r * dir (sign * 45), centre + r * dir (sign * 225), true);
+ endchar;
+endfor;
+
+beginoperator(4/5large_op_size#, 1); "large circle";
+ draw_circle(centre, radius, line_thickness);
+endchar;
+
+beginoperator(4/5large_op_size#, 1); "large filled circle";
+ filldraw_circle(centre, radius, line_thickness);
+endchar;
+
+% squares
+
+beginoperator(small_op_size#/sqrt(2), 1); "small square";
+ draw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(small_op_size#/sqrt(2), 1); "small filled square";
+ filldraw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square";
+ draw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium filled square";
+ filldraw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square minus";
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + radius * right, centre + radius * left, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square vert";
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square slash";
+ r := radius * sqrt(2);
+
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + r * dir 45, centre + r * dir 225, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square backslash";
+ r := radius * sqrt(2);
+
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + r * dir 135, centre + r * dir 315, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square plus";
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + radius * right, centre + radius * left, false);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square times";
+ r := radius * sqrt(2);
+
+ draw_square(centre, radius, 0, line_thickness);
+ draw_line(centre + r * dir 45, centre + r * dir 225, false);
+ draw_line(centre + r * dir 135, centre + r * dir 315, false);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square dot";
+ draw_square(centre, radius, 0, line_thickness);
+ fill dot(centre, dot_size);
+endchar;
+
+beginoperator(med_op_size#/sqrt(2), 1); "medium square square";
+ draw_square(centre, radius, 0, line_thickness);
+ draw_square(centre, 2/5radius, 0, line_thickness);
+endchar;
+
+beginoperator(large_op_size#/sqrt(2), 1); "large square";
+ draw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(large_op_size#/sqrt(2), 1); "large filled square";
+ filldraw_square(centre, radius, 0, line_thickness);
+endchar;
+
+beginoperator(small_op_size#, 1); "small diamond";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(small_op_size#, 1); "small filled diamond";
+ filldraw_square(centre, radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium filled diamond";
+ filldraw_square(centre, radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond minus";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ draw_line(centre + radius * right, centre + radius * left, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond vert";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond slash";
+ r := radius / sqrt(2);
+
+ draw_square(centre, r, 45, line_thickness);
+ draw_line(centre + r * dir 45, centre + r * dir 225, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond backslash";
+ r := radius / sqrt(2);
+
+ draw_square(centre, r, 45, line_thickness);
+ draw_line(centre + r * dir 135, centre + r * dir 315, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond plus";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ draw_line(centre + radius * right, centre + radius * left, false);
+ draw_line(centre + radius * up, centre + radius * down, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond times";
+ r := radius / sqrt(2);
+
+ draw_square(centre, r, 45, line_thickness);
+ draw_line(centre + r * dir 45, centre + r * dir 225, false);
+ draw_line(centre + r * dir 135, centre + r * dir 315, false);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond dot";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ fill dot(centre, dot_size);
+endchar;
+
+beginoperator(med_op_size#, 1); "medium diamond diamond";
+ draw_square(centre, radius / sqrt(2), 45, line_thickness);
+ draw_square(centre, 2/5radius / sqrt(2), 45, line_thickness);
+endchar;
+
+beginoperator(5/6small_op_size#, 8/5); "small lozenge";
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ theta := angle(z1 - z0);
+
+ x0' = x0 + line_thickness / sind theta;
+ x2' = x2 - line_thickness / sind theta;
+ y0' = y2' = y0;
+ y1' = y1 - line_thickness / cosd theta;
+ y3' = y3 + line_thickness / cosd theta;
+ x1' = x3' = x1;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+ unfill z0' -- z1' -- z2' -- z3' -- cycle;
+endchar;
+
+beginoperator(5/6small_op_size#, 8/5); "small filled lozenge";
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*med_op_size#, 8/5); "medium lozenge";
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ theta := angle(z1 - z0);
+
+ x0' = x0 + line_thickness / sind theta;
+ x2' = x2 - line_thickness / sind theta;
+ y0' = y2' = y0;
+ y1' = y1 - line_thickness / cosd theta;
+ y3' = y3 + line_thickness / cosd theta;
+ x1' = x3' = x1;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+ unfill z0' -- z1' -- z2' -- z3' -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*med_op_size#, 8/5); "medium filled lozenge";
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginoperator(1/sqrt(2)*med_op_size#, 8/5); "medium lozenge minus";
+ thick := line_thickness;
+
+ x0 = w - x2 = side_bearing;
+ y0 = y2 = ypart centre;
+ x1 = x3 = xpart centre;
+ y1 = h;
+ y3 = -d;
+
+ theta := angle(z1 - z0);
+
+ x0' = x0 + thick / sind theta;
+ x2' = x2 - thick / sind theta;
+ y0' = y2' = y0;
+ y1' = y1 - thick / cosd theta;
+ y3' = y3 + thick / cosd theta;
+ x1' = x3' = x1;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+ unfill z0' -- z1' -- z2' -- z3' -- cycle;
+ draw_line(z0', z2', true);
+endchar;
+
+beginoperator(5/4small_op_size#, 1); "small star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ s := r - 4/5line_thickness / sind (270 - angle (z.b0 - z.a0));
+
+ reg_poly_points(c)(5, centre - t * up, s, 90);
+ reg_poly_points(d)(5, centre - t * up, .4s, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ unfill z.c0 -- z.d0 -- z.c1 -- z.d1 -- z.c2 -- z.d2 -- z.c3 -- z.d3 -- z.c4 -- z.d4 -- cycle;
+endchar;
+
+beginoperator(small_op_size#, 1); "small filled star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ 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";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ s := r - line_thickness / sind (270 - angle (z.b0 - z.a0));
+
+ reg_poly_points(c)(5, centre - t * up, s, 90);
+ reg_poly_points(d)(5, centre - t * up, .4s, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ unfill z.c0 -- z.d0 -- z.c1 -- z.d1 -- z.c2 -- z.d2 -- z.c3 -- z.d3 -- z.c4 -- z.d4 -- cycle;
+endchar;
+
+beginoperator(med_op_size#, 1); "medium filled star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ fill 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";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ s := r - line_thickness / sind (270 - angle (z.b0 - z.a0));
+
+ reg_poly_points(c)(5, centre - t * up, s, 90);
+ reg_poly_points(d)(5, centre - t * up, .4s, 126);
+
+ fill z.a0 -- z.b0 -- z.a1 -- z.b1 -- z.a2 -- z.b2 -- z.a3 -- z.b3 -- z.a4 -- z.b4 -- cycle;
+ unfill z.c0 -- z.d0 -- z.c1 -- z.d1 -- z.c2 -- z.d2 -- z.c3 -- z.d3 -- z.c4 -- z.d4 -- cycle;
+endchar;
+
+beginoperator(large_op_size#, 1); "large filled star";
+ r := radius + line_thickness;
+ t := 1/11r;
+
+ reg_poly_points(a)(5, centre - t * up, r, 90);
+ reg_poly_points(b)(5, centre - t * up, .4r, 126);
+
+ 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/3line_thickness, 0);
+ penpos a1(4/3line_thickness, 60);
+ penpos a2(4/3line_thickness, 120);
+ penpos a3(4/3line_thickness, 180);
+ penpos a4(4/3line_thickness, 240);
+ penpos a5(4/3line_thickness, 300);
+
+ penpos b0(2/3line_thickness, 0);
+ penpos b1(2/3line_thickness, 60);
+ penpos b2(2/3line_thickness, 120);
+ penpos b3(2/3line_thickness, 180);
+ penpos b4(2/3line_thickness, 240);
+ penpos b5(2/3line_thickness, 300);
+
+ reg_poly_points(a)(6, centre, r, 90);
+
+ z.b0 = z.b1 = z.b2 = z.b3 = z.b4 = z.b5 = 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;
+ fill stroke z.a5e -- z.b5e;
+endchar;
+
+beginsymbol(18/10order_width# + 2side_bearing#, vcentre(2equal_spread# + line_thickness#)); "infinity";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ thick := line_thickness;
+ alpha := 0;
+
+ z0 = centre - (9/10order_width - 1/2thick) * dir alpha;
+ z1 = centre + (9/10order_width - 1/2thick) * dir alpha;
+ z6 = 1/5[z0,z1];
+ z7 = 4/5[z0,z1];
+ z2 = z6 + equal_spread * dir (alpha + 90);
+ z3 = z6 - equal_spread * dir (alpha + 90);
+ z4 = z7 + equal_spread * dir (alpha + 90);
+ z5 = z7 - equal_spread * dir (alpha + 90);
+ z8 = z9 = centre;
+
+ penpos0(thick, alpha);
+ penpos1(thick, alpha);
+ penpos2(thick, alpha - 90);
+ penpos3(thick, alpha + 90);
+ penpos4(thick, alpha + 90);
+ penpos5(thick, alpha - 90);
+ penpos8(thick, alpha - 135);
+ penpos9(thick, alpha + 135);
+
+ fill stroke z4.e{dir (alpha + 180)}
+ .. {dir (alpha + 225)}z9.e
+ .. {dir (alpha + 180)}z3.e
+ .. {dir (alpha + 90)}z0.e
+ .. {dir alpha}z2.e
+ .. {dir (alpha - 45)}z8.e
+ .. {dir alpha}z5.e
+ .. {dir (alpha + 90)}z1.e
+ .. cycle;
+
+ penlabels (0,1,2,3,4,5,6,7,8,9);
+endchar;
+
+for alpha = 0, 180:
+ beginsymbol(16/10order_width# + 2side_bearing#, vcentre(2equal_spread# + line_thickness#)); "proportional";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ thick := line_thickness;
+
+ z0 = centre - (8/10order_width - 1/2thick) * dir alpha;
+ z1 = centre + (7/10order_width - 1/2thick) * dir alpha;
+ z4 = z1 + equal_spread * dir (alpha + 90);
+ z5 = z1 - equal_spread * dir (alpha + 90);
+ z6 - z4 = z7 - z5 = (1/10order_width + 1/2thick) * dir alpha;
+ z10 = 1/4[z0,z1];
+ z2 = z10 + equal_spread * dir (alpha + 90);
+ z3 = z10 - equal_spread * dir (alpha + 90);
+ z8 = z9 = centre + 1/10order_width * dir alpha;
+
+ penpos0(thick, alpha);
+ penpos2(thick, alpha - 90);
+ penpos3(thick, alpha + 90);
+ penpos4(thick, alpha + 90);
+ penpos5(thick, alpha - 90);
+ penpos6(thick, alpha + 90);
+ penpos7(thick, alpha - 90);
+ penpos8(thick, alpha + 225);
+ penpos9(thick, alpha + 135);
+
+ fill stroke z6.e
+ -- z4.e{dir (alpha + 180)}
+ .. {dir (alpha + 225)}z9.e
+ .. {dir (alpha + 180)}z3.e
+ .. {dir (alpha + 90)}z0.e
+ .. {dir alpha}z2.e
+ .. {dir (alpha - 45)}z8.e
+ .. {dir alpha}z5.e
+ -- z7.e;
+
+ penlabels (0,1,2,3,4,5,6,7,8,9);
+ endchar;
+endfor;
+
+beginsymbol(14/10order_width# + 2side_bearing#, vcentre(2equal_spread# + line_thickness#)); "crossing";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ thick := line_thickness;
+ alpha := 0;
+
+ z0 = centre - (6/10order_width - 1/2thick) * dir alpha;
+ z1 = centre + (6/10order_width - 1/2thick) * dir alpha;
+ z2 = z0 + equal_spread * dir (alpha + 90);
+ z3 = z0 - equal_spread * dir (alpha + 90);
+ z4 = z1 + equal_spread * dir (alpha + 90);
+ z5 = z1 - equal_spread * dir (alpha + 90);
+ z6 - z4 = z7 - z5 = (1/10order_width + 1/2thick) * dir alpha;
+ z2 - z8 = z3 - z9 = (1/10order_width + 1/2thick) * dir alpha;
+ z10 = z11 = 1/2[z0,z1];
+
+ penpos2(thick, alpha + 90);
+ penpos3(thick, alpha + 90);
+ penpos4(thick, alpha + 90);
+ penpos5(thick, alpha + 90);
+ penpos6(thick, alpha + 90);
+ penpos7(thick, alpha + 90);
+ penpos8(thick, alpha + 90);
+ penpos9(thick, alpha + 90);
+ penpos10(thick, alpha + 45);
+ penpos11(thick, alpha + 135);
+
+ fill stroke z6.e
+ -- z4.e{dir (alpha + 180)}
+ .. {dir (alpha + 225)}z11.e
+ .. {dir (alpha + 180)}z3.e
+ -- z9.e;
+ fill stroke z8.e
+ -- z2.e{dir alpha}
+ .. {dir (alpha - 45)}z10.e
+ .. {dir alpha}z5.e
+ -- z7.e;
+
+ penlabels (0,1,2,3,4,5,6,7,8,9,10,11);
+endchar;
+
+beginsymbol(equal_spread# + line_thickness# + 2side_bearing#, vcentre(med_op_size#)); "between";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ r := med_op_size/2;
+
+ z0 = centre;
+ z1 = centre;
+
+ draw_smile(a, 1, z0 - r * up, z0 + r * up, equal_spread, line_thickness, true);
+ draw_smile(b, -1, z1 - r * up, z1 + r * up, equal_spread, line_thickness, true);
+endchar;
+
+beginsymbol(11/5equal_spread# + line_thickness# + 2side_bearing#, vcentre(med_op_size#)); "reversed between";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+ r := med_op_size/2;
+
+ z0 = centre + 3/4equal_spread * right;
+ z1 = centre - 3/4equal_spread * right;
+
+ draw_smile(a, -1, z0 - r * up, z0 + r * up, 2/3equal_spread, line_thickness, true);
+ draw_smile(b, 1, z1 - r * up, z1 + r * up, 2/3equal_spread, line_thickness, true);
+endchar;
+
+for sign = 1, -1:
+ beginsymbol(order_width# + 2side_bearing#, cap_height#, 0); "top";
+ z1 - z0 = z3 - z2 = (order_width - line_thickness) * right;
+ z2 - z0 = sign * (cap_height - line_thickness) * up;
+
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = (w/2, (h-d)/2);
+
+ draw_line(z0, z1, true);
+ draw_line(1/2[z0,z1], 1/2[z2,z3], true);
+ endchar;
+endfor;
+
+beginsymbol(2/3equal_spread# + line_thickness# + 2side_bearing#, vcentre(plus_size#)); "wreath";
+ pair centre;
+ centre := (w/2, (h-d)/2);
+
+ draw_sim(a, centre + 1/2plus_size * up, centre - 1/2plus_size * up, 1/3equal_spread, thick);
+endchar;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "angle";
+ z0 = centre + (plus_size - line_thickness)/2 * down;
+ z1 = z0 + sign * 1/2plus_size * right;
+ z2 = z0 + sign * 1/2plus_size * left;
+ x3 = xpart centre + sign * 1/2plus_size;
+ y3 = ypart centre + 2/3plus_size;
+ z4 = 4/5[z2,z3];
+ z5 = z4l + whatever * (z2 - z4);
+ z5 = z1r + whatever * right;
+ z6 = z4r + whatever * (z2 - z4);
+ z6 = z1r + whatever * right;
+ z7 = z1l + whatever * right;
+ z7 = z6 + whatever * dir (90 + sign * 17);
+
+ penpos1(line_thickness, 90);
+ penpos4(line_thickness, angle(z3 - z2) + sign * 90);
+
+ fill z1r -- z5 -- z4l -- z4r -- z6 -- z7 -- z1l -- cycle;
+
+ penlabels(1,2,3,4,5,6,7);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "measured angle";
+ z0 = centre + (plus_size - line_thickness)/2 * down;
+ z1 = z0 + sign * 1/2plus_size * right;
+ z2 = z0 + sign * 1/2plus_size * left;
+ x3 = xpart centre + sign * 1/2plus_size;
+ y3 = ypart centre + 2/3plus_size;
+ z4 = 4/5[z2,z3];
+ z5 = z4l + whatever * (z2 - z4);
+ z5 = z1r + whatever * right;
+ z6 = z4r + whatever * (z2 - z4);
+ z6 = z1r + whatever * right;
+ z7 = z1l + whatever * right;
+ z7 = z6 + whatever * dir (90 + sign * 17);
+ z8 = 2/3[z2,z1];
+ z9 = z2 + sign * ((z8 - z2) rotated angle (z3 - z2));
+
+ penpos1(line_thickness, 90);
+ penpos4(line_thickness, angle(z3 - z2) + sign * 90);
+ penpos8(line_thickness, 90 - sign * 90);
+ penpos9(line_thickness, angle(z3 - z2));
+
+ fill z1r -- z5 -- z4l -- z4r -- z6 -- z7 -- z1l -- cycle;
+ fill stroke z8.e{up} .. {dir (angle (z3 - z2) + sign * 90)}z9.e;
+
+ penlabels(1,2,3,4,5,6,7,8,9);
+ endchar;
+endfor;
+
+for alpha = 0, 90, 180, 270:
+ beginoperator(plus_size#, 1); "spherical angle (" & decimal alpha & ")";
+ draw_less(a, centre - 1/2plus_size * dir alpha, centre + 1/2plus_size * dir alpha, 2radius, line_thickness, false);
+ z3 = 2/3[z2a, z0a];
+ z4 = 2/3[z2a, z1a];
+
+ penpos3(line_thickness, alpha + 35);
+ penpos4(line_thickness, alpha - 35);
+
+ fill stroke z4.e{dir (alpha + 55)} .. {dir (alpha + 125)}z3.e;
+
+ penlabels(3,4);
+ endchar;
+endfor;
+
+beginoperator(plus_size#, 1); "right angle";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+endchar;
+
+beginoperator(plus_size#, 1); "measured right angle";
+ thick := line_thickness;
+
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+ z4 = 3/5[z1,z0] + (1/2thick - eps) * right;
+ z5 = 3/5[z1,z2] + (1/2thick - eps) * up;
+
+ penpos4(thick, 90);
+ penpos5(thick, 0);
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ fill stroke z4.e{right} .. {down}z5.e;
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginoperator(plus_size#, 1); "squared right angle";
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+ z4 = 1/2[z1,z0];
+ z5 = 1/2[z1,z2];
+
+ penpos4(line_thickness, 90);
+ penpos5(line_thickness, 0);
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ draw_line(z4, centre, true);
+ draw_line(z5, centre, true);
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginoperator(plus_size#, 1); "right angle with dot";
+ thick := line_thickness;
+
+ z3 - z0 = z2 - z1 = 2radius * right;
+ z0 - z1 = 2radius * up;
+ 1/2[1/2[z0,z1], 1/2[z2,z3]] = centre;
+ z4 = 3/5[z1,z0] + (1/2thick - eps) * right;
+ z5 = 3/5[z1,z2] + (1/2thick - eps) * up;
+ z6 = 1/4[z1,z3];
+
+ penpos4(line_thickness, 90);
+ penpos5(line_thickness, 0);
+
+ draw_line(z0, z1, true);
+ draw_line(z1, z2, true);
+ fill stroke z4.e{right} .. {down}z5.e;
+ fill dot(z6, 1/2dot_size);
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginsymbol(4u#, 4/5asc_height#, 0); "prime";
+ z0 = (w, h);
+ z1 = z0 + 2u * left;
+ z2 = (1u, 1/9h);
+ z3 = z2 + 4/3u * right;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+beginsymbol(4u#, 4/5asc_height#, 0); "backprime";
+ z0 = (0, h);
+ z1 = z0 + 2u * right;
+ z2 = (w - 1u, 1/9h);
+ z3 = z2 + 4/3u * left;
+
+ fill z0 -- z1 -- z2 -- z3 -- cycle;
+endchar;
+
+for sign = 1, -1:
+ beginoperator(plus_size#, 1); "product";
+ draw_product(centre, plus_size, plus_size, sign, 4/3line_thickness);
+ endchar;
+endfor;
+
+beginsymbol(2/5asc_height# + 2side_bearing#, asc_height#, 0); "small integral";
+ pair centre;
+ centre := (w/2, (h - d)/2);
+
+ draw_integral(a, 1/2, centre, 4/3line_thickness);
+endchar;
+
+beginsymbol(13u# + 2side_bearing#, asc_height#, 0); "check mark";
+ x1l = side_bearing;
+ y1 = math_axis;
+ x2 = side_bearing + 3u;
+ y2 = -d;
+ x3 = w -x2;
+ y3 = h;
+ x4r = w - side_bearing;
+ y4l = h;
+ z5r = 1/10[z4r,z1r];
+
+ theta := angle(z3 - z2);
+
+ penpos1(4/3thick, 30);
+ penpos2(thick, 0);
+ penpos3(thick, -90 + theta);
+ penpos4(1/3thick, -80);
+ penpos5(thick, -50);
+
+ z6 = z1r + whatever * (z2l - z1l);
+ z6 = z3l + whatever * (z3r - z2r);
+
+ fill z1l -- z2l -- z2r{z3r - z2r} .. {dir 40}z5r .. z4r -- z4l{dir 180} ... z5l{dir 220} .. {z2l - z3l}z6 -- z1r -- cycle;
+
+ penlabels(1,2,3,4,5,6);
+endchar;
+
+beginsymbol(7u# + 2side_bearing#, 5/4asc_height#, 1/8asc_height#); "lightning";
+ thick := line_thickness;
+
+ x3r = w - side_bearing;
+ x2l = side_bearing + u;
+ x4 = 1/3w;
+ y1l = h;
+ y3r = 14/24h;
+ y4 = -d + 1/2thick;
+ z6 - z5 = whatever * dir 15;
+
+ penpos1(3/2thick, -20);
+ penpos2(3/2thick, 15);
+ penpos3(2thick, 15);
+ penpos4(thick, -20);
+ penpos5(thick, -75);
+ penpos6(thick, -75);
+
+ z1 - z2 = whatever * (z4 - z3);
+ z5r = z2;
+ z6l = z3;
+ z7 = whatever[z1r,z2r];
+ z7 = whatever[z5l,z6l];
+ z8 = whatever[z4l,z3l];
+ z8 = whatever[z6r,z5r];
+
+ fill z1l -- z2l -- z8 -- z4l -- z4r -- z3r -- z7 -- z1r -- cycle;
+ draw_arrowhead(z4, angle (z4l - z3l), 4/5arrow_spread, thick);
+
+ penlabels(1,2,3,4,7,8);
+endchar;
+
+for filled = false, true:
+ beginsymbol(13u#, cap_height#, 0); "diamond suit";
+ thick := line_thickness;
+ bend := 5;
+
+ x0 = x2 = x4 = x6 = w/2;
+ 1/2[y0,y2] = 1/2[y4,y6] = h/2;
+ y2 - y0 = h;
+ 1/2[x1,x3] = 1/2[x5,x7] = w/2;
+ x3 - x1 = w - 2side_bearing;
+ y1 = y3 = y5 = y7 = h/2;
+
+ theta := angle(z2 - z1);
+
+ y6 - y4 = h - 2thick / cosd theta;
+ x7 - x5 = w - 2side_bearing - 2thick / sind theta;
+
+ fill z0{dir (180-theta-bend)} .. {dir (180-theta+bend)}z1{dir (theta-bend)} .. {dir (theta+bend)}z2{dir (-theta-bend)} .. {dir (-theta+bend)}z3{dir (180+theta-bend)} .. {dir (180+theta+bend)}z0 & cycle;
+ if not filled:
+ unfill z4{dir (180-theta-bend)} .. {dir (180-theta+bend)}z5{dir (theta-bend)} .. {dir (theta+bend)}z6{dir (-theta-bend)} .. {dir (-theta+bend)}z7{dir (180+theta-bend)} .. {dir (180+theta+bend)}z4 & cycle;
+ fi;
+ labels(0,1,2,3,4,5,6,7);
+ endchar;
+endfor;
+
+for filled = false, true:
+ beginsymbol(14u#, cap_height#, 0); "heart suit";
+ thick := line_thickness;
+
+ x0 = x1l = x1'l = w/2;
+ y0 = 0;
+ 1/2[x2l,x3l] = w/2;
+ x3l - x2l = w - 2side_bearing;
+ y1r = y1'r;
+ y2l = y3l = 3/4h;
+ x4 = 1/2[x1,x2];
+ x5 = 1/2[x1',x3];
+ y4l = y5l = h;
+ h - y2 = 2(h - y1l);
+
+ penpos1(thick, 180+45);
+ penpos1'(thick, -45);
+ penpos2(thick, 0);
+ penpos3(thick, 180);
+ penpos4(thick, -90);
+ penpos5(thick, -90);
+
+ path p[];
+ numeric t[];
+
+ z6 = z1r + whatever * dir (270+45);
+ z6 = z1'r + whatever * dir (270-45);
+ z7 = z0 + thick * dir 20;
+ z8 = z0 + thick * dir (180-20);
+ p1 = z7{dir (90+35)} .. {dir 90}z2r;
+ p2 = z3r{dir 270} .. {dir (270-35)}z8;
+ (t1,t2) = p1 intersectiontimes p2;
+
+ fill z0{dir (90+35)} .. {dir 90}z2l .. {dir 0}z4l .. {dir (270+45)}z1l{dir (90-45)} .. {dir 0}z5l .. {dir 270}z3l .. {dir (270-35)}z0 & cycle;
+ if not filled:
+ unfill subpath (t1,1) of p1 & z2r{dir 90} .. {dir 0}z4r .. {dir (270+45)}z1r -- z6 -- z1'r{dir (90-45)} .. {dir 0}z5r .. {dir 270}z3r & subpath (0,t2) of p2 -- cycle;
+ fi;
+
+ penlabels(0,1,1',2,3,4,5,6,7,8);
+ endchar;
+endfor;
+
+beginsymbol(13u#, cap_height#, 0); "spade suit";
+ x0 = x1 = w/2;
+ y0 = h;
+ 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 = 3/5[y2,y4];
+ x6 = x0;
+ y6 = 0;
+
+ penpos1(2u, 0);
+ penpos6(3u, 0);
+
+ fill z0{dir (270-30)} .. z2 .. z4 .. {dir (90-30)}z1l
+ -- z1r{dir (270+30)} .. z5 .. z3 .. {dir (90+30)}z0 -- cycle;
+ fill stroke z1e -- z6e;
+
+ penlabels(0,1,2,3,4,5,6);
+endchar;
+
+beginsymbol(14u#, cap_height#, 0); "club suit";
+ r := 1/4(w - 2side_bearing);
+
+ x0 = w/2;
+ y0 = h - 2.5r;
+ x1 = w - x3 = side_bearing + r;
+ y1 = y3 = y0;
+ x2 = x4 = x0;
+ y2 = h - r;
+ y4 = 0;
+
+ penpos0(3/2u, 0);
+ penpos2(3/2u, 0);
+ penpos4(3u, 0);
+
+ fill circle(z1, r);
+ fill circle(z2, r);
+ fill circle(z3, r);
+ fill stroke z2e -- z0e -- z4e;
+
+ penlabels(0,1,2,3,4);
+endchar;
+
+beginoperator(med_op_size#, 1); "maltese";
+ r := 1/2med_op_size;
+ thick := line_thickness;
+
+ 1/2[z0,z1] = centre + r * left;
+ 1/2[z2,z3] = centre + r * down;
+ 1/2[z4,z5] = centre + r * right;
+ 1/2[z6,z7] = centre + r * up;
+ z0 - z1 = z5 - z4 = r * up;
+ z3 - z2 = z6 - z7 = r * right;
+ 1/2[z8,z9] = centre + 1/2thick * up;
+ 1/2[z10,z11] = centre - 1/2thick * up;
+ z9 - z8 = z11 - z10 = 2thick * right;
+ 1/2[z12,z13] = centre + thick * up;
+ 1/2[z14,z15] = centre - thick * up;
+ z13 - z12 = z15 - z14 = thick * right;
+
+ fill z0 -- z1 -- z10 -- z11 -- z4 -- z5 -- z9 -- z8 -- cycle;
+ fill z6 -- z7 -- z12 -- z14 -- z2 -- z3 -- z15 -- z13 -- cycle;
+
+ labels(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
+endchar;
+
+beginoperator(med_op_size#, 2/sqrt(3)); "star of david";
+ r := med_op_size/sqrt(3);
+
+ reg_poly_points(a)(6, centre, r, 90);
+
+ s := r - 4/5line_thickness / sind (270 - angle (z.a2 - z.a0));
+
+ reg_poly_points(b)(6, centre, s, 90);
+
+ z0.r = z.a0; z0.l = z.b0;
+ z1.r = z.a2; z1.l = z.b2;
+ z2.r = z.a4; z2.l = z.b4;
+ z3.r = z.a1; z3.l = z.b1;
+ z4.r = z.a3; z4.l = z.b3;
+ z5.r = z.a5; z5.l = z.b5;
+
+ fill stroke z0.e -- z1.e -- z2.e -- cycle;
+ fill stroke z4.e -- z5.e -- z3.e -- cycle;
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginoperator(plus_size#, 1); "sector";
+ thick := line_thickness;
+ alpha := 90;
+
+ z0 = centre - 1/2plus_size * dir alpha;
+ z1 = z0 + 9/10plus_size * dir alpha;
+
+ draw_less(a, z0, z1, 9/10plus_size, thick, false);
+
+ theta := angle(z0a - z2a) - alpha;
+
+ z0a - z4 = 1/2thick * dir (alpha + theta);
+ z1a - z5 = 1/2thick * dir (alpha - theta);
+
+ penpos4(thick, alpha + theta);
+ penpos5(thick, alpha - theta);
+
+ fill stroke z4.e{dir (alpha + theta - 90)} .. {dir(alpha - theta - 90)}z5.e;
+endchar;
+
+beginsymbol(5/4order_width# + 2side_bearing#, cap_height#, 0); "forall";
+ thick := 5/4line_thickness;
+
+ x0 = side_bearing + 1/2thick;
+ x1 = w - side_bearing - 1/2thick;
+ x2 = w/2 - 1/4thick;
+ x3 = w/2 + 1/4thick;
+ y0 = y1 = h;
+ y2 = y3 = 0;
+
+ penpos0(thick * cosd(angle(z2 - z0) + 90), 0);
+ penpos1(thick * cosd(angle(z2 - z0) + 90), 0);
+
+ z4 = z0l + whatever * (z2 - z0) = z2 + whatever * right;
+ z5 = z1r + whatever * (z3 - z1) = z2 + whatever * right;
+ z6 = z0r + whatever * (z2 - z0) = z1l + whatever * (z3 - z1);
+ z7 = whatever [z0,z2];
+ z8 = whatever [z1,z2];
+ y7 = y8 = 0.6 * y0;
+
+ fill z0l -- z4 -- z5 -- z1r -- z1l -- z6 -- z0r -- cycle;
+ draw_line(z7, z8, false);
+
+ penlabels(0,1,2,3,4,5,6,7,8);
+endchar;
+
+for negated = 0, 1:
+ beginsymbol(order_width# + 2side_bearing#, if negated = 0: cap_height# else: cap_height# + 2/3equal_spread# fi, if negated = 0: 0 else: 2/3equal_spread# fi); "exists";
+ thick := 5/4line_thickness;
+
+ x1 = x3 = w - side_bearing - thick/2;
+ y1 = cap_height;
+ y3 = 0;
+ x1' = x3' = w - side_bearing;
+ x0 = x2 = side_bearing;
+ y0 = y1' = cap_height - line_thickness/2;
+ y2 = y3' = line_thickness/2;
+ z4 = 1/8[1/2[z0,z2], 1/2[z1,z3]];
+
+ draw_straight(z1, z3, thick, false);
+ draw_line(z0, z1', false);
+ draw_line(z4, 1/2[z1,z3], false);
+ draw_line(z2, z3', false);
+
+ if negated = 1:
+ stroke_through(1/2[1/2[z0,z2], 1/2[z1,z3]], h + d - stroke_through_thickness)
+ fi;
+ endchar;
+endfor;
+
+beginsymbol(order_width# + 2side_bearing#, cap_height#, 0); "exists finitely many";
+ thick := 5/4line_thickness;
+
+ x1 = x3 = w - side_bearing - thick/2;
+ y1 = cap_height;
+ y3 = 0;
+ x3' = w - side_bearing;
+ x0 = x2 = side_bearing;
+ y0 = cap_height - line_thickness/2;
+ y2 = y3' = line_thickness/2;
+ z4 = 1/8[1/2[z0,z2], 1/2[z1,z3]];
+
+ draw_straight(z1, z3, thick, false);
+ draw_line(z4, 1/2[z1,z3], false);
+ draw_line(z2, z3', false);
+endchar;
+
+beginsymbol(5/4order_width# + 2side_bearing#, cap_height#, 0); "game quantifier";
+ thick := 5/4line_thickness;
+
+ x0 = x1 = 1/2order_width + side_bearing;
+ y0 = cap_height - 1/2thick;
+ y1 = 1/2line_thickness;
+ x2 = w - side_bearing - 1/2thick;
+ y2 = (h - d)/2;
+ x3r = x4r = side_bearing;
+ y3 = 5/6cap_height;
+ y4 = 1/6cap_height;
+
+ penpos0(thick, 90);
+ penpos1(thick, -90);
+ penpos2(thick, 0);
+ penpos3(thick, 125);
+ penpos4(thick, -125);
+
+ fill stroke z3.e .. z0.e .. z2.e{down} .. z1.e{left} .. z4.e;
+ draw_straight(z4r + 1/2thick * right, 2/5[z4r,z3r] + 1/2thick * right, thick, false);
+ draw_line(2/5[z4r,z3r], 2/5[z4r,z3r] + 1/2order_width * right, false);
+
+ penlabels(0,1,2,3,4);
+endchar;
+
+beginsymbol(7/8order_width# + 2side_bearing#, cap_height#, 0); "complement";
+ thick := 5/4line_thickness;
+
+ z0 - z1 = (cap_height - thick) * up;
+ z3 - z2 = (w - 2side_bearing - thick) * right;
+ 1/2[z0,z1] = 1/2[z2,z3] = (w/2,(h-d)/2);
+ x4 = x6 = x2;
+ x5 = x7 = x3;
+ y4 = y5 = 1/4[y0,y1];
+ y6 = y7 = 3/4[y0,y1];
+
+ penpos0(thick, 90);
+ penpos1(thick, -90);
+ penpos4(thick, -180);
+ penpos5(thick, 0);
+ penpos6(thick, -180);
+ penpos7(thick, 0);
+
+ fill stroke z5.e{up} .. z0.e .. {down}z4.e -- z6.e{down} .. z1.e .. {up}z7.e;
+
+ penlabels(0,1,2,3,4,5,6,7);
+endchar;
+
+beginsymbol(6u# + 2side_bearing#, asc_height#, 1/2line_thickness#); "flat";
+ thick := line_thickness;
+
+ x0l = x1l = side_bearing;
+ x4l = x5 = side_bearing + thick;
+ y0 = -d;
+ y1 = h;
+ x2r = w - side_bearing;
+ x3 = w/2;
+ y3r = x_height;
+ y2 = 1/2[y0,y1];
+ y4r = 5/6x_height;
+ y5 = thick * (1 + sind 35) / cosd 35 - d;
+
+ penpos0(thick, 0);
+ penpos1(thick, 0);
+ penpos2(3/2thick, 0);
+ penpos3(thick, 90);
+ penpos4(thick, 130);
+
+ fill z1.l -- z0.l{dir 35} ... {up}z2.r .. {left}z3.r ..{dir 230}z4.r -- z4.l{dir 50} .. {right}z3.l .. {down}z2.l .. {dir 215}z5 -- z1.r -- cycle;
+
+ penlabels (0,1,2,3,4,5);
+endchar;
+
+beginsymbol(6u# + 2side_bearing#, asc_height#, desc_depth#); "natural";
+ thick := line_thickness;
+
+ x0l = x1l = w - x2r = w - x3r = side_bearing;
+ x4 = x5 = w - x6 = w - x7 = side_bearing;
+ y1 = y3 = h;
+ y7r = x_height;
+ y4l = 0;
+ y0 = y2 = -d;
+ z6 = z4 + whatever * dir 15;
+ z5 = z7 + whatever * dir 15;
+
+ penpos0(thick, 0);
+ penpos1(thick, 0);
+ penpos2(thick, 0);
+ penpos3(thick, 0);
+ penpos4(3/2thick, 90);
+ penpos5(3/2thick, 90);
+ penpos6(3/2thick, 90);
+ penpos7(3/2thick, 90);
+
+ z8 = whatever[z0,z1] = whatever[z4,z6];
+ z9 = whatever[z2,z3] = whatever[z5,z7];
+
+ penpos8(thick, 0);
+ penpos9(thick, 0);
+
+ fill stroke z1e -- z8e;
+ fill stroke z9e -- z2e;
+ fill stroke z4e -- z6e;
+ fill stroke z5e -- z7e;
+
+ penlabels(1,2,4,5,6,7);
+endchar;
+
+beginsymbol(6u# + 2side_bearing#, asc_height#, desc_depth#); "sharp";
+ thick := line_thickness;
+
+ x0l = x1l = w - x2r = w - x3r = side_bearing + u;
+ x4 = x5 = w - x6 = w - x7 = side_bearing;
+ y3 = h;
+ y7r = x_height;
+ y4l = 0;
+ y0 = -d;
+ z2 = z0 + whatever * dir 20;
+ z1 = z3 + whatever * dir 20;
+ z6 = z4 + whatever * dir 15;
+ z5 = z7 + whatever * dir 15;
+
+ penpos0(thick, 0);
+ penpos1(thick, 0);
+ penpos2(thick, 0);
+ penpos3(thick, 0);
+ penpos4(3/2thick, 90);
+ penpos5(3/2thick, 90);
+ penpos6(3/2thick, 90);
+ penpos7(3/2thick, 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(10u# + 2side_bearing#, cap_height#, 0); "aleph";
+ thick := line_thickness;
+
+ x0l = x2l = side_bearing;
+ x1r = x3r = w - side_bearing;
+ y0 = h;
+ y1 = h;
+ y2 = 0;
+ y3 = 0;
+
+ penpos0(3/2thick, 20);
+ penpos1(4/3thick, 2);
+ penpos2(3/2thick, 0);
+ penpos3(4/3thick, 20);
+
+ path p;
+ p = z0{dir -70} .. {dir -70}z3;
+
+ z4 = point 3/10 of p;
+ z5 = point 5/8 of p;
+
+ penpos4(5/4thick, -40);
+ penpos5(5/4thick, -45);
+
+ fill stroke z0.e{dir -70} .. {dir -70}z3.e;
+ fill stroke z2.e{up} .. {dir 50}z4.e;
+ fill stroke z5.e{dir 45} .. {up}z1.e;
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginsymbol(10u# + 2side_bearing#, cap_height#, 0); "beth";
+ thick := line_thickness;
+
+ x0 = u + side_bearing;
+ x1 = 5/8[x2,x4];
+ x2 = side_bearing;
+ x3 = w - side_bearing;
+ y0r = h;
+ y1r = h;
+ y2l = 0;
+ y3l = 0;
+ z4r = 7/8[z2,z3];
+ x5 = x4;
+ y5 = 2/3h;
+
+ penpos0(3/2thick, 75);
+ penpos1(3/2thick * sind 75, 90);
+ penpos2(3/2thick, 75);
+ penpos3(3/2thick, 75);
+ penpos4(5/4thick, 0);
+ penpos5(5/4thick, 0);
+
+ fill stroke z2.e -- z3.e;
+ fill stroke z0.e -- z1.e{right} ..tension3/4.. {down}z5.e -- z4.e;
+
+ penlabels(0,1,2,3,4,5);
+endchar;
+
+beginsymbol(7u# + 2side_bearing#, cap_height#, 0); "gimel";
+ thick := line_thickness;
+
+ x0 = x2 = side_bearing;
+ x2'r = 1/8[x0,x1];
+ x1 = x3r = w - side_bearing;
+ x4 = 1/4[x0,x1];
+ x5 = 1/2[x0,x1];
+ x6 = 2/3[x0,x1];
+ y0 = y1 = h;
+ y2l = y3 = 0;
+ y2' = y2;
+ y4r = h + 1/4thick;
+ z5 = z4 + whatever * dir -30;
+ y6 = 2/3h;
+
+ penpos2(3/2thick, 80);
+ penpos2'(3/2thick * sind 80, 90);
+ penpos3(4/3thick, 0);
+ penpos4(3/2thick, 60);
+ penpos5(3/2thick, 60);
+ penpos6(5/4thick, 0);
+
+ path p;
+ p = z6{dir -82} .. {dir -67}z3;
+ z7 = point 1/4 of p;
+ x8 = 2/5[x0,x1];
+ z7 = z8 + whatever * dir 60;
+
+ penpos7(thick, 150);
+ penpos8(thick, 150);
+
+ fill stroke z4.e -- z5.e{dir -30} .. {dir -82}z6.e .. {dir -67}z3.e;
+ fill stroke z2.e -- z2'.e{right} ..tension 3/4 and 1.. {dir 60}z8.e -- z7.e;
+
+ penlabels(2,3,4,5,6,7,8);
+endchar;
+
+beginsymbol(9u# + 2side_bearing#, cap_height#, 0); "daleth";
+ thick := line_thickness;
+
+ x0 = side_bearing;
+ x1 = w - side_bearing;
+ y0r = y1r = h;
+ x3r = x2r = 4/5[x0,x1];
+ y2 = y0;
+ y3 = 0;
+
+ penpos0(3/2thick, 75);
+ penpos1(3/2thick, 75);
+ penpos2(5/4thick, 0);
+ penpos3(5/4thick, 0);
+
+ fill stroke z0.e -- z1.e;
+ fill stroke z2.e -- z3.e;
+
+ penlabels(0,1,2,3);
+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#, desc_depth#); "Weierstrass p";
+ numeric theta;
+ theta = 90 - angle(8u,h);
+ slope := -h/8u; % angle at middle
+ superness := 1/sqrt 2;
+ superpull := 1/6;
+
+ penpos2(line_thickness, -60);
+ penpos1(4/3line_thickness, theta);
+ penpos7(line_thickness, -90);
+
+ x2 + 1/2u = x1 = x7 - 1/2u = 3u;
+ y2l = h;
+ y7r = -d;
+ y1 = 2/5[-d, h];
+ x3l = .5u;
+ x6r = max(rt x7 + .5, .5w - .25u);
+ x3r - x3l = x6r - x6l = 5/4line_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;
+
+ fill stroke super_arc.e(2,3) & z3e{down} .. z4e --- z5e .. z6e{down} & super_arc.e(6,7); % flourish
+
+ penpos8(line_thickness, 180);
+ penpos9(line_thickness, 90);
+ penpos10(3/2line_thickness, 0);
+ penpos11(line_thickness, -90);
+ penpos12(line_thickness, -100);
+
+ x10r = w - 1.5u + 1/2line_thickness;
+ x8l = 2.25u;
+ x9 = x11 = .5w + 1.5u;
+ x12l = max(x6r, .5w + .5u);
+ y8 = y11r = 0;
+ top y9r = .95h;
+ y10 = .5[y9,y11];
+ y12r = 1/4[y11r,y1l];
+
+ fill stroke z7e{left} ... z8e{up} ... pulled_arc.e(9,10) & pulled_arc.e(10,11) .. z12.e; % stem and bowl
+
+ penlabels(1,2,3,4,5,6,7,8,9,10,11,12);
+endchar;
+endgroup;