%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /data/old/usr/share/texlive/texmf-dist/fonts/source/public/mnsymbol/
Upload File :
Create Path :
Current File : //data/old/usr/share/texlive/texmf-dist/fonts/source/public/mnsymbol/Sym-Geometric.mf

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;


Zerion Mini Shell 1.0