% mathematical symbols by Anthony Phan.
% file: mathltlk.mf (mathematical letter-like symbols)
% last modification: May 16, 2005.
% Only known charcodes will be generated.

def horizontal_rules_list=math_axis,
  -body_depth,-desc_depth,x_height,cap_height,asc_height,body_height
enddef;

use_rule1;

%turningcheck:=0;

%
%  A
%

beginchar(for_all,8.2u#+2appr#,cap_height#,0);
  "Universal quantifier";
  pickup tiny.nib;
  lft x1l=w-rt x3r=appr-hround 0.5u; x2=x4=0.5[x1l,x3r];
  top y1l=top y3r=h; bot y2=bot y4=-o;
  adjust_slanted_bar(1l,2,1,2l)(0.5(rth-tiny),1);
  adjust_slanted_bar(3r,4,3,4r)(0.5(rth-tiny),-1);
  forsuffixes $=1,2,3,4: z$r-z$=z$-z$l; endfor
  z5=whatever[z1r,z2r]; z5=whatever[z3l,z4l];
  top y6r-bot y6l=top y7r-bot y7l=rth;
  top y6r=top y7r=vround(x_height+0.5rth);
  forsuffixes $=r,l: z6$=whatever[z1,z2]; z7$=whatever[z3,z4]; endfor
  filldraw z1l--z2l--z4r--z3r--z3l--z5--z1r--cycle;
  filldraw stroke z6e..z7e; penlabels(1,2,3,4,5,6,7);
endchar;

%
%  C
%

beginchar(complement,5.5u#+2appr#,cap_height#,0);
  "Complement";
       autorounded; pickup tiny.nib;
  pos1(rth,0); pos2(rth,0);
  pos7(rth,0); pos8(rth,0);
  h-bot y1=top y8+d=vround 0.25(h+d);
  y3+0.5rth=h+o; y6-0.5rth=-d-o;
  rt x1r=w-appr; x1=x2=x7=x8;
  x4=x5=appr+0.5rth; x3=x6=0.5[x1,x4];
  y2=y4=max(y3-x1+x3,1/6[y1,y3]);
  y5=y7=min(y6+x1-x3,1/6[y8,y6]);
  filldraw stroke z1e..z2e; filldraw stroke z7e..z8e;
  pickup rule.nib;
  draw z2 up_to_left z3 left_to_down
  z4..z5 down_to_right z6 right_to_up z7;
  penlabels(1,2,7,8); labels(3,4,5,6);
endchar;

%
%  E
%

beginchar(there_exists,6.5u#+appr#+Appr#,cap_height#,0);
  "Existential quantifier";
  pickup tiny.nib;
  pos1(rth,90); pos4(rth,-90); pos5(rth,90); pos6(rth,90);
  y2l=y1l; y2r=y1r; y3l=y4l; y3r=y4r; top y1r=h; bot y4r=0;
  top y5r=top y6r=vround 0.5(h+rth);
  x2r-x2l=x3r-x3l=rth-tiny;
  lft x1=lft x4=lft x5-hround 0.15u=appr;
  rt x2r=rt x3r=w-Appr; x6=0.5[x2l,x2r]; filldraw stroke z5e..z6e;
  filldraw stroke z1e--z2e--z3e--z4e; penlabels(1,2,3,4,5,6);
endchar;

beginchar(there_not_exists,6.5u#+appr#+Appr#,
    min(body_height#,cap_height#+asc_depth#),asc_depth#);
  "Not existential quantifier";
  pickup tiny.nib;
  pos1(rth,90); pos4(rth,-90); pos5(rth,90); pos6(rth,90);
  y2l=y1l; y2r=y1r; y3l=y4l; y3r=y4r; top y1r=cap_height; bot y4r=0;
  top y5r=top y6r=vround 0.5(cap_height+rth);
  x2r-x2l=x3r-x3l=rth-tiny;
  lft x1=lft x4=lft x5-hround 0.15u=appr;
  rt x2r=rt x3r=w-Appr; x6=0.5[x2l,x2r]; filldraw stroke z5e..z6e;
  filldraw stroke z1e--z2e--z3e--z4e;
  lft x8l-appr=w-Appr-rt x7r=hround u;
  bot y8l=-d-eps; y7r-y1r=y4r-y8l;
  adjust_slanted_bar(8l,7r,8r,7l)(rth-tiny,-1);
  filldraw stroke z7e..z8e; penlabels(1,2,3,4,5,6,7,8);
endchar;

%
%  F
%

beginchar(F_inverse,6.5u#+appr#+Appr#,cap_height#,0);
  "F inverse";
  pickup tiny.nib;
  pos1(rth,0); pos3(rth,-90); pos4(rth,90); pos5(rth,90);
  y2l=y3l; y2r=y3r; top y1=h; bot y3r=0;
  top y4r=top y5r=vround 0.5(h+rth);
  lft x3=lft x4-hround 0.15u=appr; rt x1r=w-Appr;
  x1r=x2r; x1l=x2l; x5=x1; filldraw stroke z4e..z5e;
  filldraw stroke z1e--z2e--z3e; penlabels(1,2,3,4,5);
endchar;

%
%  G
%

beginchar(G_inverse,11.2u#+2appr#,cap_height#,0);
  "G inverse (game)";
  pickup tiny.nib;
  top y2r=h+o; bot y4r=-o; y3=y0=0.5[y2r,y4r];
  top y7r=vround y3;
  rt x3r=w-appr; rt x3r-lft x0r=hround 13u;
  x2=x4=0.5[x0r,x3r]; lft x6r=appr; x6l-x6r=rth-tiny;
  pos0(rth,180); pos2(rth,90); pos3(rth,0); pos4(rth,-90);
  pos7(rth,90); rt x7=hround x2;
  path tmp_path.r,tmp_path.l; numeric t[].r,t[].l;
  forsuffixes $=r,l: y6$=y7$;
    tmp_path.$=z0$ up_to_right z2$ right_to_down z3$
    down_to_left z4$ left_to_up z0$;
    t2$=xpart(tmp_path.$ intersectiontimes (z6$..(x6$,y4$)));
    z5$=point t2$ of tmp_path.$;
  endfor
  t1r=xpart(tmp_path.r intersectiontimes (z6r..(x6r,y2r)));
  z1r=point t1r of tmp_path.r; y1=y3;
  z1-z1r=whatever*(direction t1r of tmp_path.r rotated -90);
  t1l=xpart(tmp_path.l intersectiontimes (z1r..z1));
  z1l=point t1l of tmp_path.l;
  filldraw stroke subpath (t1e,t2e) of tmp_path.e--z6e--z7e;
  penlabels(0,1,2,3,4,5,6,7);
endchar;

%
%  O
%

beginchar(empty_set,min(15.2u#,asc_height#+asc_depth#)+2appr#,
    asc_height#,asc_depth#);
  "The empty set";
  pickup rule.nib;
  a:=w-2appr;
  lft x3=w-rt x1=appr+hround(a/16.5)-eps;
  lft x5=appr; rt x6=w-appr;
  y2=good.y(math_axis+x1-0.5w)+eps;
  y6=good.y(math_axis+x6-0.5w);
  0.5[y2,y4]=0.5[y5,y6]=math_axis;
  x2=x4=0.5[x1,x3]; y1=y3=0.5[y2,y4];
  draw superellipse(z1,z2,z3,z4,1/sqrt 2);
  draw z5..z6; labels(1,2,3,4,5,6);
endchar;

beginchar(diameter_sign,12u#+2appr#,fig_height#,0);
  "Diameter sign";
  pickup rule.nib;
  top y2=top y6-o=h; bot y4=bot y5+o=-d;
  lft x3=appr; rt x1=w-appr;
  lft x5=appr+hround u; rt x6=w-appr-hround u;
  x2=x4=0.5[x1,x3]; y1=y3=0.5[y2,y4];
  draw superellipse(z1,z2,z3,z4,1/sqrt 2);
  draw z5..z6; labels(1,2,3,4,5,6);
endchar;

%
%  T
%

beginchar(top_sign,11.2u#+2appr#,cap_height#,0);
  "Top sign";
  pickup tiny.nib;
  pos1(rth,0); pos2(rth,0); pos3(rth,90); pos4(rth,90);
  top y1=top y3r=top y4r=cap_height; bot y2=-o;
  lft x1l=hround 0.5(w-rth);
  x2=x1; lft x3=appr; x1-x3=x4-x1;
  filldraw stroke z1e..z2e; % stem
  filldraw stroke z3e..z4e; % crossbar
  penlabels(1,2,3,4);
endchar;

beginchar(not_top_sign,11.2u#+2appr#,cap_height#,0);
  "Not top sign";
  pickup tiny.nib;
  pos1(rth,0); pos2(rth,0); pos3(rth,90); pos4(rth,90);
  top y1=top y3r=top y4r=cap_height; bot y2=-o;
  lft x1l=hround 0.5(w-rth);
  x2=x1; lft x3=appr; x1-x3=x4-x1;
  filldraw stroke z1e..z2e; % stem
  filldraw stroke z3e..z4e; % crossbar
  lft x5r=lft x5l=appr; rt x6r=rt x6l=w-appr;
  h-top y6r=bot y5l+d=hround 0.15(h+d)-eps;
  numeric a,b; a=rth-tiny; b=abs(z6r-z5l);
  y5r-y5l=y6r-y6l=a/(((x6r-x5l)/b)*((b+-+a)/b)+((y6r-y5l)/b)*(a/b));
  filldraw stroke z5e..z6e;
  penlabels(1,2,3,4,5,6);
endchar;

beginchar(bot_sign,11.2u#+2appr#,cap_height#,0);
  "Bot sign";
  pickup tiny.nib;
  pos1(rth,0); pos2(rth,0); pos3(rth,90); pos4(rth,90);
  bot y2=bot y3l=bot y4l=0; top y1=cap_height+o;
  lft x1l=hround 0.5(w-rth); x2=x1;
  lft x3=appr; x1-x3=x4-x1;
  filldraw stroke z1e..z2e; % stem
  filldraw stroke z3e..z4e; % crossbar
  penlabels(1,2,3,4);
endchar;

beginchar(not_bot_sign,11.2u#+2appr#,cap_height#,0);
  "Not bot sign";
  pickup tiny.nib;
  pos1(rth,0); pos2(rth,0); pos3(rth,90); pos4(rth,90);
  bot y2=bot y3l=bot y4l=0; top y1=cap_height+o;
  lft x1l=hround 0.5(w-rth); x2=x1;
  lft x3=appr; x1-x3=x4-x1;
  filldraw stroke z1e..z2e; % stem
  filldraw stroke z3e..z4e; % crossbar
  lft x5r=lft x5l=appr; rt x6r=rt x6l=w-appr;
  h-top y6r=bot y5l+d=hround 0.15(h+d)-eps;
  numeric a,b; a=rth-tiny; b=abs(z6r-z5l);
  y5r-y5l=y6r-y6l=a/(((x6r-x5l)/b)*((b+-+a)/b)+((y6r-y5l)/b)*(a/b));
  filldraw stroke z5e..z6e;
  penlabels(1,2,3,4,5,6);
endchar;

%
%  EPSILONS
%

% use_rule2;

rth:=ceiling((1/3[rth1#,rth2#])*hppp);
pickup pencircle scaled rth;
math_axis:=good.x(math_axis#*hppp);

beginchar(belong_to,7.5u#+2appr#,v_center(spread3#));
  "Belong to";
  pickup tiny.nib;
  pos2(rth,90); pos6(rth,90); pos3(rth,90); pos4(rth,270);
  y3=y6=math_axis;
  y2-y3=y3-y4=vround(0.5spread3-0.5rth+0.5[oo,o])+eps;
  top y1r=vround(y3+0.5spread3); y1r-y3=y3-y5r;
  rt x1r=rt x5r+hround 0.6u=w-appr; x3=appr-ho+0.5rth;
  x2r=0.5[x1r,x3]; x4=0.5[x5r,x3];
  z1'-z1r=(z2r-z1r) xscaled 0.35; z5'-z5r=(z4r-z5r) xscaled 0.325;
  pos1(rth,angle(z1'-z1r)-90); pos5(rth,angle(z5r-z5')-90);
  x6=good.x x1l;
  filldraw stroke z2e{right}...z1e{z1r-z1'};
  filldraw stroke z5e{z5'-z5r}...z4e{left};
  filldraw stroke z3e..z6e;
  pickup pencircle scaled rth;
  draw z2..controls 0.625[z2,(x3,y2)] and 0.65[z3,(x3,y2)]..
  z3..controls 0.65[z3,(x3,y4)] and 0.625[z4,(x3,y4)]..z4;
  penlabels(1,2,3,4,5,6,7,1',5');
  tmp_picture:=currentpicture;
endchar;

beginchar(not_belong_to,7.5u#+2appr#,asc_height#,asc_depth#);
  "Not belong sign";
  currentpicture:=tmp_picture;
  pickup tiny.nib;
  lft x2l=w-rt x1r=appr+hround u;
  top y1r=h+eps; 0.5[y1r,y2l]=math_axis;
  adjust_slanted_bar(2l,1r,2r,1l)(rth-tiny,-1);
  filldraw stroke z1e..z2e; penlabels(1,2);
endchar;

beginchar(var_not_belong_to,7.5u#+2appr#,asc_height#,asc_depth#);
  "Variant not belong sign";
  currentpicture:=tmp_picture;
  pickup tiny.nib;
  pos1(rth,0); pos2(rth,0);
  top y1l=h+eps; 0.5[y1l,y2l]=math_axis;
  lft x1l=lft x2l=vround 0.5(w-rth);
  filldraw stroke z1e..z2e; penlabels(1,2);
endchar;

beginchar(belong_to_bar,7.5u#+2appr#,
    math_axis#+0.5spread3#+spread1#+0.5rth#,
    0.5spread3#-math_axis#);
  "Variant not reverse belong sign";
  currentpicture:=tmp_picture;
  pickup tiny.nib;
  pos1(rth,90); pos2(rth,90); top y1r=top y2r=h;
  lft x1l=appr; rt x2=w-appr;
  filldraw stroke z1e..z2e; penlabels(1,2);
endchar;

beginchar(rev_belong_to,7.5u#+2appr#,v_center(spread3#));
  "Reverse belong to";
  pickup tiny.nib;
  pos2(rth,-90); pos6(rth,90); pos3(rth,90); pos4(rth,90);
  y3=y6=math_axis;
  y3-y2=y4-y3=vround(0.5spread3-0.5rth+0.5[oo,o])+eps;
  top y5r=vround(y3+0.5spread3); y1r-y3=y3-y5r;
  lft x1r=lft x5r-hround 0.6u=appr; x3=w-appr+ho-0.5rth;
  x2r=0.5[x1r,x3]; x4=0.5[x5r,x3];
  z1'-z1r=(z2r-z1r) xscaled 0.35; z5'-z5r=(z4r-z5r) xscaled 0.325;
  pos1(rth,angle(z1'-z1r)-90); pos5(rth,angle(z5r-z5')-90);
  x6=good.x x1l;
  filldraw stroke z2e{left}...z1e{z1r-z1'};
  filldraw stroke z5e{z5'-z5r}...z4e{right};
  filldraw stroke z6e..z3e;
  pickup pencircle scaled rth;
  draw z2..controls 0.625[z2,(x3,y2)] and 0.65[z3,(x3,y2)]..
  z3..controls 0.65[z3,(x3,y4)] and 0.625[z4,(x3,y4)]..z4;
  penlabels(1,2,3,4,5,6,7,1',5');
  tmp_picture:=currentpicture;
endchar;

beginchar(not_rev_belong_to,7.5u#+2appr#,asc_height#,asc_depth#);
  "Not reverse belong sign";
  currentpicture:=tmp_picture;
  pickup tiny.nib;
  pickup tiny.nib;
  lft x2l=w-rt x1r=appr+hround u;
  top y1r=h+eps; 0.5[y1r,y2l]=math_axis;
  adjust_slanted_bar(2l,1r,2r,1l)(rth-tiny,-1);
  filldraw stroke z1e..z2e; penlabels(1,2);
endchar;

beginchar(var_not_rev_belong_to,7.5u#+2appr#,asc_height#,asc_depth#);
  "Variant not reverse belong sign";
  currentpicture:=tmp_picture;
  pickup tiny.nib;
  pos1(rth,0); pos2(rth,0);
  top y1l=h; 0.5[y1l,y2l]=math_axis;
  lft x1l=lft x2l=vround 0.5(w-rth);
  filldraw stroke z1e..z2e; penlabels(1,2);
endchar;

beginchar(rev_belong_to_bar,7.5u#+2appr#,math_axis#+0.5spread3#,
    0.5spread3#+spread1#+0.5rth#-math_axis#);
  "Variant not reverse belong sign";
  currentpicture:=tmp_picture;
  pickup tiny.nib;
  pos1(rth,90); pos2(rth,90); bot y1l=bot y2l=-d;
  lft x1l=appr; rt x2=w-appr;
  filldraw stroke z1e..z2e; penlabels(1,2);
endchar;

%
%  U
%

use_rule1;

beginchar(cap_sign,12u#+2appr#,x_height#,0);
  "Small cap sign";
  pickup tiny.nib;
  pos1(rth,180); pos2(rth,180);
  pos4(rth,0); pos5(rth,0);
  y3+0.5rth=h+o; bot y1r=bot y5r=-d; y2=y4=2/3[y3,y1r];
  lft x1r=w-rt x5r=appr+hround 0.8u;
  x1=x2; x4=x5; x3=0.5[x2,x4];
  filldraw stroke z1e..z2e; filldraw stroke z4e..z5e;
  pickup rule.nib; autorounded;
  draw z2 down_to_right z3 right_to_up z4;
  penlabels(1,2,3,4,5);
endchar;

beginchar(cup_sign,12u#+2appr#,x_height#,0);
  "Small cup sign";
  pickup tiny.nib;
  pos1(rth,180); pos2(rth,180);
  pos4(rth,0); pos5(rth,0);
  y3-0.5rth=-d-o; top y1r=top y5r=h; y2=y4=2/3[y3,y1r];
  lft x1r=w-rt x5r=appr+hround 0.8u;
  x1=x2; x4=x5; x3=0.5[x2,x4];
  filldraw stroke z5e..z4e; filldraw stroke z2e..z1e;
  pickup rule.nib; autorounded;
  draw z2 down_to_right z3 right_to_up z4;
  penlabels(1,2,3,4,5);
endchar;

beginchar(cup_plus,12u#+2appr#,x_height#,0);
  "Small cup-plus sign";
  ensure_centering_of(rth);
  %
  pickup tiny.nib;
  pos1(rth,180); pos2(rth,180); pos3(rth,-90);
  pos4(rth,0); pos5(rth,0);
  y3-0.5rth=-d-o; top y1r=top y5r=h; y2=y4=2/3[y3,y1r];
  lft x1r=w-rt x5r=appr+hround 0.8u;
  x1=x2; x4=x5; x3=0.5[x2,x4];
  filldraw stroke z5e..z4e; filldraw stroke z2e..z1e;
  %
  pos6(rth,0); pos7(rth,0); pos8(rth,90); pos9(rth,90);
  top y6=h; x6=x7=0.5w;
  numeric a;
  a=0.5(min(lft x5r-rt x1r-1.2u,h-rth-0.6u)-rth);
  y6-y8r=y8l-y7=vround a; x6l-x8=x9-x6r=hround a; y8=y9;
  filldraw stroke z6e..z7e; filldraw stroke z8e..z9e;
  pickup rule.nib; autorounded;
  draw z2 down_to_right z3 right_to_up z4;
  penlabels(1,2,3,4,5,6,7,8,9);
endchar;

beginchar(sqcap_sign,12u#+2appr#,x_height#,0);
  "Small square cap sign";
  pickup tiny.nib;
  pos1(rth,180); pos4(rth,0);
  top y2r=top y3r=h; bot y1=bot y4=-d;
  top y2r-bot y2l=top y3r-bot y3l=rth;
  lft x1r=w-rt x4r=appr+hround 0.95u;
  x2r=x1r; x3r=x4r; x2l=x1l; x3l=x4l;
  filldraw stroke z1e--z2e--z3e--z4e;
  penlabels(1,2,3,4);
endchar;

beginchar(sqcup_sign,12u#+2appr#,x_height#,0);
  "Small square cup sign";
  pickup tiny.nib;
  pos1(rth,180); pos4(rth,0);
  bot y2r=bot y3r=-d; top y1=top y4=h;
  top y2l-bot y2r=top y3l-bot y3r=rth;
  lft x1r=w-rt x4r=appr+hround 0.95u;
  x2r=x1r; x3r=x4r; x2l=x1l; x3l=x4l;
  filldraw stroke z4e--z3e--z2e--z1e;
  penlabels(1,2,3,4);
endchar;

beginchar(sqcup_plus,12u#+2appr#,x_height#,0);
  "Small square cup-plus sign";
  pickup tiny.nib;
  ensure_centering_of(rth);
  pos1(rth,180); pos4(rth,0);
  bot y2r=bot y3r=-d; top y1=top y4=h;
  top y2l-bot y2r=top y3l-bot y3r=rth;
  lft x1r=w-rt x4r=appr+hround 0.95u;
  x2r=x1r; x3r=x4r; x2l=x1l; x3l=x4l;
  filldraw stroke z4e--z3e--z2e--z1e;
  %
  pos6(rth,0); pos7(rth,0); pos8(rth,90); pos9(rth,90);
  top y6=h; x6=x7=0.5w;
  numeric a;
  a=0.5(min(lft x4l-rt x1l-1.2u,h-rth-0.6u)-rth);
  y6-y8r=y8l-y7=vround a; x6l-x8=x9-x6r=hround a; y8=y9;
  filldraw stroke z6e..z7e; filldraw stroke z8e..z9e;
  penlabels(1,2,3,4,6,7,8,9);
endchar;

def tmp_program(expr stem,orientation,$)=
  autorounded; pickup tiny.nib;
  pos1(stem,0); pos2(stem,0);
  pos4(stem,180); pos5(stem,180);
  lft x1l=w-rt x5l=appr+hround $;
  x1l=x2l; x4l=x5l; x3=0.5[x1,x5];
  if orientation=up: pos3(stem,90);
    top y1=top y5=h; bot y3l=-d-o;
    y2=y4=min(0.25[y1,y3r],y3+0.5(x5-x1));
  else: pos3(stem,-90);
    bot y1=bot y5=-d; top y3l=h+o;
    y2=y4=max(0.25[y1,y3r],y3-0.5(x5-x1));
  fi
  filldraw stroke z1e..z2e..controls (x2e,y3e) and (flatness[x3e,x2e],y3e)
  ..z3e..controls (flatness[x3e,x4e],y3e) and (x4e,y3e)..z4e..z5e;
  penlabels(1,2,3,4,5);
enddef;

beginchar(bold_cap,12u#+2appr#,x_height#,0);
  "Bold cap";
  tmp_program(stem,down,0.8u);
endchar;

beginchar(bold_cup,12u#+2appr#,x_height#,0);
  "Bold cup";
  tmp_program(stem,up,0.8u);
endchar;

%
%  V
%

beginchar(wedge_sign,12u#+2appr#,x_height#,0);
  "Wedge sign";
  pickup tiny.nib;
  top y2r=x_height+o; bot y1r=0; y1r=y1l=y3r=y3l;
  x2r=good.x 0.5w;
  x3r-x2r=x2r-x1r=hround((y2r-y1r)/sqrt3);
  x1l-x1r=diag_width(rth-tiny,z2r-z1r);
  x3r-x3l=diag_width(rth-tiny,z2r-z3r);
  z2l-z1l=whatever*(z2r-z1r); z2l-z3l=whatever*(z2r-z3r);
  filldraw stroke z1e--z2e--z3e; penlabels(1,2,3);
endchar;

beginchar(vee_sign,12u#+2appr#,x_height#,0);
  "Vee sign";
  pickup tiny.nib;
  bot y2r=-o; top y1r=x_height; y1r=y1l=y3r=y3l;
  x2r=good.x 0.5w;
  x3r-x2r=x2r-x1r=-hround((y2r-y1r)/sqrt3);
  x1l-x1r=diag_width(rth-tiny,z2r-z1r);
  x3r-x3l=diag_width(rth-tiny,z2r-z3r);
  z2l-z1l=whatever*(z2r-z1r); z2l-z3l=whatever*(z2r-z3r);
  filldraw stroke z3e--z2e--z1e; penlabels(1,2,3);
endchar;

beginchar(wedge_eq,12u#+2appr#,x_height#,0);
  "Wedge-bar sign";
  pickup tiny.nib;
  top y2r=x_height; bot y1r=0; y1r=y1l=y3r=y3l;
  x2r=good.x 0.5w;
  x3r-x2r=x2r-x1r=hround((y2r-y1r+o)/sqrt3);% see wedge sign (+o)
  x1l-x1r=diag_width(rth-tiny,z2r-z1r);
  x3r-x3l=diag_width(rth-tiny,z2r-z3r);
  z2l-z1l=whatever*(z2r-z1r); z2l-z3l=whatever*(z2r-z3r);
  pos4(rth,90); pos5(rth,90); y4r=y5r=y2r;
  lft x4=min(Appr,lft x1r); x5-x3r=x1r-x4;
  filldraw stroke z1e--z2e--z3e; filldraw stroke z4e..z5e;
  penlabels(1,2,3,4,5);
endchar;

beginchar(vee_eq,12u#+2appr#,x_height#,0);
  "Vee-bar sign";
  pickup tiny.nib;
  bot y2r=0; top y1r=x_height; y1r=y1l=y3r=y3l;
  x2r=good.x 0.5w;
  x3r-x2r=x2r-x1r=-hround((y2r-y1r-o)/sqrt3);% see vee sign (-o)
  x1l-x1r=diag_width(rth-tiny,z2r-z1r);
  x3r-x3l=diag_width(rth-tiny,z2r-z3r);
  z2l-z1l=whatever*(z2r-z1r); z2l-z3l=whatever*(z2r-z3r);
  pos4(rth,-90); pos5(rth,-90); y4r=y5r=y2r;
  rt x4=max(w-Appr,rt x1r); x5-x3r=x1r-x4;
  filldraw stroke z3e--z2e--z1e; filldraw stroke z4e..z5e;
  penlabels(1,2,3,4,5);
endchar;

beginchar(wedge_eqq,12u#+2appr#,asc_height#,0);% strange choice
  "Wedge-equal sign";
  pickup tiny.nib;
  top y2r=x_height; bot y1r=0; y1r=y1l=y3r=y3l;
  x2r=good.x 0.5w;
  x3r-x2r=x2r-x1r=hround((y2r-y1r+o)/sqrt3);% see wedge sign (+o)
  x1l-x1r=diag_width(rth-tiny,z2r-z1r);
  x3r-x3l=diag_width(rth-tiny,z2r-z3r);
  z2l-z1l=whatever*(z2r-z1r); z2l-z3l=whatever*(z2r-z3r);
  pos4(rth,90); pos5(rth,90); pos6(rth,90); pos7(rth,90);
  y4r=y5r=y2r; y6=y7=y4+spread1;
  lft x4=min(Appr,lft x1r); x5-x3r=x1r-x4; x4=x6; x5=x7;
  filldraw stroke z1e--z2e--z3e; filldraw stroke z4e..z5e;
  filldraw stroke z6e..z7e; penlabels(1,2,3,4,5,6,7);
endchar;

beginchar(vee_eqq,12u#+2appr#,asc_height#,0);% strange choice
  "Vee-equal sign";
  pickup tiny.nib;
  bot y2r=0+spread1; top y1r=x_height+spread1; y1r=y1l=y3r=y3l;
  x2r=good.x 0.5w;
  x3r-x2r=x2r-x1r=-hround((y2r-y1r-o)/sqrt3);% see vee sign (-o)
  x1l-x1r=diag_width(rth-tiny,z2r-z1r);
  x3r-x3l=diag_width(rth-tiny,z2r-z3r);
  z2l-z1l=whatever*(z2r-z1r); z2l-z3l=whatever*(z2r-z3r);
  pos4(rth,-90); pos5(rth,-90); pos6(rth,-90); pos7(rth,-90);
  y4r=y5r=y2r; y6=y7=y4-spread1;
  rt x4=max(w-Appr,rt x1r); x5-x3r=x1r-x4; x4=x6; x5=x7;
  filldraw stroke z3e--z2e--z1e; filldraw stroke z4e..z5e;
  filldraw stroke z6e..z7e; penlabels(1,2,3,4,5,6,7);
endchar;

beginchar(wedge_curly,12u#+2appr#,x_height#,0);
  "Curly wedge sign";
  pickup tiny.nib;
  x2=hround 0.5(w-rth)+0.5rth;
  top y2=h+o; pos2(rth,0); bot y1r=bot y3l=0;
  lft x1r=hround min(appr+1.0u,lft x2l-((y2r-y1r)/sqrt3));
  x3l-x2r=x2l-x1r; x1l=x1r; x3l=x3r;
  x4=x2; pos4(rth,0); y4=0.625[y2,y1r];
  y1l-y1r=y3r-y3l=(rth-tiny)/cosd angle(z4r-z1r);
  filldraw stroke z2e{down}...z1e{z1r-z4r};
  filldraw stroke z2e{down}...z3e{z3l-z4l};
  penlabels(1,2,3,4);
endchar;

beginchar(vee_curly,12u#+2appr#,x_height#,0);
  "Curly vee sign";
  pickup tiny.nib;
  x2=hround 0.5(w-rth)+0.5rth;
  bot y2=-o; pos2(rth,0); top y1r=top y3l=h;
  lft x1r=hround min(appr+1.0u,lft x2l+((y2r-y1r)/sqrt3));
  x1l=x1r; x3l=x3r; x3l-x2r=x2l-x1r;
  x4=x2; pos4(rth,0); y4=0.625[y2,y1r];
  y1r-y1l=y3l-y3r=(rth-tiny)/cosd angle(z4r-z1r);
  filldraw stroke z2e{up}...z1e{z1r-z4r};
  filldraw stroke z2e{up}...z3e{z3l-z4l};
  penlabels(1,2,3,4);
endchar;

beginchar(double_cap_sign,
    12u#+2appr#,cap_height#,0);% maybe too high
  "Double cap sign";
  pickup tiny.nib;
  pos1(rth,180); pos2(rth,180);
  pos4(rth,0); pos5(rth,0);
  pos6(rth,180); pos7(rth,180);
  pos9(rth,0); pos10(rth,0);
  rt x1l=w-appr; lft x5l=appr;
  numeric a; a=min(spread1,0.25(x1-x5));
  x1=x2; x4=x5; x6=x7; x9=x10; x3=x8=0.5[x1,x5];
  x1-x6=x10-x5=hround a;
  bot y1=bot y5=-d-o; bot y6=bot y10=-d;
  y3+0.5rth=h+o; y8-y3=-vround a;
  y2=y4=y7=y9=1/3[y8,y6];
  filldraw stroke z1e..z2e; filldraw stroke z4e..z5e;
  filldraw stroke z6e..z7e; filldraw stroke z9e..z10e;
  pickup rule.nib; autorounded;
  draw z2 up_to_right z3 right_to_down z4;
  draw z7 up_to_right z8 right_to_down z9;  
  penlabels(1,2,3,4,5,6,7,8,9,10);
endchar;

beginchar(double_cup_sign,
    12u#+2appr#,cap_height#,0);% maybe too high
  "Double cup sign";
  pickup tiny.nib;
  pos1(rth,0); pos2(rth,0);
  pos4(rth,180); pos5(rth,180);
  pos6(rth,0); pos7(rth,0);
  pos9(rth,180); pos10(rth,180);
  rt x1r=w-appr; lft x5r=appr;
  numeric a; a=min(spread1,0.25(x1-x5));
  x1=x2; x4=x5; x6=x7; x9=x10; x3=x8=0.5[x1,x5];
  x1-x6=x10-x5=hround a;
  top y1=top y5=h+o; top y6=top y10=h;
  y3-0.5rth=-d-o; y8-y3=vround a;
  y2=y4=y7=y9=1/3[y8,y6];
  filldraw stroke z1e..z2e; filldraw stroke z4e..z5e;
  filldraw stroke z6e..z7e; filldraw stroke z9e..z10e;
  pickup rule.nib; autorounded;
  draw z2 down_to_right z3 right_to_up z4;
  draw z7 down_to_right z8 right_to_up z9;
  penlabels(1,2,3,4,5,6,7,8,9,10);
endchar;

beginchar(double_sqcap_sign,
    12u#+2appr#,cap_height#,0);% maybe too high
  "Double square cap sign";
  pickup tiny.nib;
  pos1(rth,180); pos3(rth,90); pos5(rth,0);
  pos6(rth,180); pos8(rth,90); pos10(rth,0);
  lft x1r=appr; rt x5r=w-appr;
  numeric a; a=min(spread1,0.25(x5-x1));
  x6-x1=x5-x10=hround a; x3=x8=0.5[x1,x5];
  bot y1=bot y5=-d-o; bot y6=bot y10=-d;
  top y3r=h; y8-y3=-vround a;
  forsuffixes $=,r,l:
    x1$=x2$; x4$=x5$; x6$=x7$; x9$=x10$;
    y2$=y3$=y4$; y7$=y8$=y9$; endfor
  filldraw stroke z1e--z2e--z4e--z5e;
  filldraw stroke z6e--z7e--z9e--z10e;
  penlabels(1,2,3,4,5,6,7,8,9,10);
endchar;

beginchar(double_sqcup_sign,
    12u#+2appr#,cap_height#,0);% maybe too high
  "Double square cup sign";
  pickup tiny.nib;
  pos1(rth,0); pos3(rth,90); pos5(rth,180);
  pos6(rth,0); pos8(rth,90); pos10(rth,180);
  lft x1l=appr; rt x5l=w-appr;
  numeric a; a=min(spread1,0.25(x5-x1));
  x6-x1=x5-x10=hround a; x3=x8=0.5[x1,x5];
  top y1=top y5=h+o; top y6=top y10=h;
  bot y3l=0; y8-y3=vround a;
  forsuffixes $=,r,l:
    x1$=x2$; x4$=x5$; x6$=x7$; x9$=x10$;
    y2$=y3$=y4$; y7$=y8$=y9$; endfor
  filldraw stroke z1e--z2e--z4e--z5e;
  filldraw stroke z6e--z7e--z9e--z10e;
  penlabels(1,2,3,4,5,6,7,8,9,10);
endchar;