% blackboard typefaces by Anthony Phan.
% file: mbbgrklo.mf (Greek lowercase)
% last modification: 25.10.2001.

% One can choose to generate some characters or their variants
% or both when they exist. Characters with no variants will
% be generated anyway
% (except ``bbomicron'' which is the same as roman ``o'').

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

use_rule1;

iff variant_a:
beginchar(bbalpha,10u#+2appr#,x_height#,0);
  "Lowercase Greek alpha";
  italcorr x_height#*slant-.5u#;
  path tmppp_path; numeric t[];
  pickup circle.nib;
  lft x3=apprl-ho; rt x1=hround((8u#+2appr#)*hppp)-apprr;
  x2=x4=0.5[x3,x1]; rt x6=w-apprr+hround 0.4u; rt x5=w-apprr;
  top y2=h+uo; bot y4=-oo; top y5=h; bot y6=bot y7=0;
  y3=0.5[y4,y2]; y1=0.45[y5,y6]; y8=0.45[y6,y5];
  x1-x8=hthick; x11-x3=hThick;
  x7=min(x6-u,x8+(x1-x2)*((y8-y7)/(y2-y1)));
  tmp_path:=z1 up_to_left z2 left_to_down z3 down_to_right z4;
  tmpp_path:=z6..z7 left_to_up z8;
  tmppp_path=z4 right_to_up z5;
  bbbowl(z2,z3,z4,hThick) tmp_path;
  hbbowl(z2,z1,(x1,y8),x1-x8) tmp_path;
  hbbowl(z7,z8,(x8,y1),x1-x8) tmpp_path;
  t1=xpart(tmppp_path intersectiontimes tmpp_path);
  t2=xpart(tmppp_path intersectiontimes bowl_path);
  draw z1..z1 & tmp_path & subpath (0,t1) of tmppp_path;
  draw subpath (t2,2) of tmppp_path; draw tmpp_path;
  square_end5(up); square_end6(right);
  labels(1,2,3,4,5,6,7,8);
  math_fit(0,0);
endchar;

iff not variant_a:
beginchar(bbalpha,10u#+2appr#,x_height#,0);
  "Lowercase Greek alpha";
  italcorr x_height#*slant-.5u#;
  save tmp_path; path tmp_path[]; numeric t[];
  pickup circle.nib;
  % cross
  y10=y9'l=0; y1'=y9r=h; x10=x9r=w-apprr; x1'=x9'l=x10-5u;
  adjust_slanted_bar(1',10,10',1)(thick,1);
  adjust_slanted_bar(9'l,9r,9'r,9l)(thin,-1);
  z9'=0.5[z9'r,z9'l]; z9=0.5[z9r,z9l];
  % curves
  top y3=top y12=h+uo; bot y5=-oo; y4=0.5[y3,y5]; lft x4=apprl-ho;
  slope:=(y1'-y1)/(x1'-x1);
  hellipse_set(4,3,2,1); hellipse_set(4,12,11,10);
  slope:=(y9-y9')/(x9-x9'); hellipse_set(4,5,6,9);
  tmp_path1=z1---z2...z3{left};
  tmp_path2=z10---z11...z12{left}..z3;
  tmp_path3=z5{right}...z6---z9;
  t1=xpart(tmp_path3 intersectiontimes tmp_path1);
  t2=xpart(tmp_path3 intersectiontimes tmp_path2);
  z7=point t1 of tmp_path3; z8=point t2 of tmp_path3;
  tmp_path4=z2{z2-z1}...z3 left_to_down z4 down_to_right z5
  & subpath (0,t1) of tmp_path3;
  bbbowl(z3,z4,z5,hThick) tmp_path4;
  ortho_penpos2(thin,z1'-z1); ortho_penpos11(thin,z10'-z10);
  ortho_penpos8(thin,z9-z8);
  penpos1(diag_width(thin,z1'-z1),0);
  penpos10(diag_width(thin,z10'-z10),0);
  y1a-y1=thin; z1a-z1=z10a-z10=whatever*(z1'-z1);
  draw tmp_path4; draw subpath (1,3) of tmp_path2;
  penstroke z1e..z2e; penstroke z10e..z11e; penstroke z8e..z9e;
  fill z1a--z10a--z10--z1--cycle;
  penlabels(1,2,8,9,9',10,11);
  labels(1',1a,3,4,5,6,7,10',10a);
  math_fit(0,0);
endchar;

beginchar(bbbeta,8u#+2appr#,asc_height#,desc_depth#);
  "Lowercase Greek beta";
  italcorr 0.8asc_height#*slant-.5u#;
  pickup circle.nib;
  lft x1=lft x2=apprl; x3=x5=0.5[x1,x4]; rt x4=w-apprr; rt x6=w-apprr+ho;
  bot y1=-d; y2=0.5[y5,y4]; top y3=h+oo; y4=0.5[y5,y3]; top y5=x_height;
  y6=0.5[y7,y5]; x8=x1+hthick;
  if ab_down_factor>0: bot y7=-oo;
    x7=ab_down_factor[(x1+x6)/2,(x1+x3+2x6)/4];
    y8=ab_down_factor[top 0,y5];
  else: bot y7=bot y8=0; x7=0.5[x1,x6]; fi
  tmp_path:=z1..z2 up_to_right z3 right_to_down z4 down_to_left z5
  & z5 right_to_down z6 down_to_left z7
  if ab_down_factor>0: left_to_up z8 else: ..z8 fi;
  draw tmp_path;
  bbbowl(z5,z6,z7,hThick) tmp_path;
  bbbowl(z3,z4,z5,max(0,x4-x.bowl.mid)) tmp_path;
  hbbowl(z3,z2,z1,hthick) tmp_path;
  pickup square.nib draw z1..z.bowl.bot;
  square_end5(left);
  labels(1,2,3,4,5,6,7,8);
  math_fit(0,0);
endchar;

beginchar(bbgamma,8u#+2appr#,x_height#,desc_depth#);
  "Lowercase Greek gamma";
  italcorr x_height#*slant-0.5u#;
  pickup circle.nib;
  y1=y12r=h; y2'=y12'l=bot y7=-d-oo;
  x1=x12'l=apprl; x2'=x12r=w-apprr;
  adjust_slanted_bar(1,2',2,1')(thick,1);
  adjust_slanted_bar(12'l,12r,12'r,12l)(thin,-1);
  z12=0.5[z12r,z12l]; z12'=0.5[z12'r,z12'l];
  a:=diag_width(thin,z1-z1');
  penpos1(a,0); penpos2(a,0);
  y1-y1a=thin; z1-z1a=z2-z2a=whatever*(z1-z1');
  forsuffixes $=,r,l:
    z11$=whatever[z2,z2']; z11$=whatever[z12$,z12'$];
  endfor
  z10=whatever[z1,z1']; z10=whatever[z12,z12'];
  x7=0.5[apprl,w-apprr];
  lft x8=apprl+hround 1.95u; x6-x5=0.5[thin,thick];
  0.5[x5,x6]-x7=x7-x8;
  slope:=(y1'-y1)/(x1'-x1);
  ellipse_set(7,5,3,1); ellipse_set(7,6,4,2);
  slope:=(y12'r-y12r)/(x12'r-x12r); ellipse_set(7,8,9,12);
  ortho_penpos3(thin,z1-z3); ortho_penpos4(thin,z2-z4);
  draw z4{z4-z2}...z6 down_to_left z7 left_to_up z8...z9--z10;
  draw z3{z3-z1}...z5 down_to_left z7;
  penstroke z1e..z3e; penstroke z2e..z4e;
  penstroke z11e..z12e; fill z1--z2--z2a--z1a--cycle;
  penlabels(1,2,3,4,14,12,12'); labels(1',1a,2',2a,5,6,7,8,9,10);
  math_fit(0,0);
endchar;

%beginchar(bbgamma,8u#+2appr#,x_height#,desc_depth#);
%  "Lowercase Greek gamma";
%  italcorr x_height#*slant-0.5u#;
%  pickup circle.nib;
%  y1=y14r=h; y4=y15l=-0.3d;
%  x1=apprl; x14r=w-apprr;
%  rt x4=rt x6=w-apprr+ho-hround u;
%  x15l=lft x10=apprl+hround u;
%  x8=0.5[x6,x10-hthick/2]; bot y8=-d-oo; x6-x17=hthick;
%  adjust_slanted_bar(1,4,2,3)(thick,1);
%  adjust_slanted_bar(14r,15l,14l,15r)(thin,-1);
%  z13r=whatever[z14r,z15r]; z13l=whatever[z14l,z15l];
%  z13r=whatever[z2,z4]; z13l=whatever[z2,z4];
%  z12=whatever[z1,z3]; z12=whatever[0.5[z14l,z14r],0.5[z15l,z15r]];
%  y1-y1a=thin; z1a=whatever[z1,z3]; z2-z2a=z1-z1a;
%  slope:=(y3-y1)/(x3-x1); ellipse_set(8,6,5,2); ellipse_set(8,17,16,1);
%  slope:=(y15r-y14r)/(x15r-x14r); ellipse_set(8,10,11,12);
%  penpos1(diag_width(thin,z1-z3),0);
%  penpos2(diag_width(thin,z1-z3),0);
%  ortho_penpos5(thin,z2-z5); ortho_penpos16(thin,z1-z16);
%  z7=z6 downleft z8; z9=z8 leftup z10; z18=z17 downleft z8;
%  penstroke z1e..z16e; penstroke z2e..z5e; penstroke z13e..z14e;
%  fill z1--z2--z2a--z1a--cycle;
%  draw z5{z5-z2}...z6{down}...z7{z8-z6}...z8{left}...z9{z10-z8}
%  ...z10{up}...z11---z12;
%  draw z16{z16-z1}...z17{down}...z18{z8-z17}...z8{left};
%  penlabels(1,2,5,,13,14,15,16);
%  labels(1a,2a,3,4,6,7,8,9,10,11,12,17,18);
%  math_fit(0,0);
%endchar;

beginchar(bbdelta,8u#+2appr#,asc_height#,0);
  "Lowercase Greek delta";
  italcorr asc_height#*slant-2u#;
  pickup circle.nib;
  top y1=h; y2=y0=y1; bot y10=-oo; y8=y12; y13=y7;
  bot y6=x_height;
  x6-x0=6u;
  rt x1=w-apprr-hround 1.5u; lft x4=apprl+hround u; x2=0.3[x4,x1];
  x6=x10=0.5[x12,x8]; rt x8=w-apprr+ho; lft x12=apprl-ho;
  slope:=(y0-y6)/(x0-x6); ellipse_set(2,4,5,6); ellipse_set(10,8,7,6);
  x15-x12=x8-x17=hThick; x7-x6=x6-x13;
  tmp_path:=z1..z2 left_to_down z4...z5---z6---z7...z8
  down_to_left z10 left_to_up z12...z13...z6;
  z15=tmp_path intersectionpoint ((x15,y10)..(x15,y12));
  z16=tmp_path intersectionpoint ((x15,y12)..(x15,y6));
  z17=tmp_path intersectionpoint ((x17,y10)..(x17,y12));
  z18=tmp_path intersectionpoint ((x17,y8)..(x17,y6));
  draw tmp_path; draw z15..z16; draw z17..z18;
  square_end1(right);
  labels(0,0a,1,2,3,4,5,6,7,8,9,10,11,12,13,14);
  math_fit(0,0);
endchar;

iff known bbepsilon:
beginchar(bbepsilon,6u#+2appr#,x_height#,0);
  "Lowercase Greek epsilon";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  rt x1=rt x5=w-apprr; top y1=h; x2=0.75[lft x3,rt x1]; y2=y1;
  lft x3=apprl-ho; bot y3=vround 0.5h; bot y4=bot y5=0; x4=x2;
  tmp_path:=z1..z2 left_to_down z3 down_to_right z4..z5;
  draw tmp_path; bbbowl(z2,z3,z4,hThick) tmp_path;
  z6=bowl_path intersectionpoint (z3..(w,y3));
  rt x7=hround(w-apprr-0.5u); y7=y3;
  draw z6..z7;
  square_end1(right);
  square_end5(right);
  square_end7(right);
  labels(1,2,3,4,5,6,7,8,9);
  math_fit(0,0);
endchar;

beginchar(bbzeta,8u#+2appr#,asc_height#,desc_depth#);
  "Lowercase Greek zeta";
  italcorr x_height#*slant-2u#;
  pickup circle.nib;
  top y1=h; top y2=top y3=top y4=vround(y1-0.25(h-x_height));
  bot y6=bot y7=0; bot y9=-d;
  y5=0.3[y6,y4]; y8=0.5[y9,y7];
  lft x1=apprl+hround 2u; lft x5=apprl-ho;
  rt x3=w-apprr-hround 1.5u; rt x8=w-apprr+ho;
  x2=0.7[x1,x3];
  x4=0.85[x5,x3];
  x6-x5=x8-x7=0.44(x8-x5);
  x9=good.x(0.5[x5,x8]);
  tmp_path:=z1 down_to_right z2..z3 & z3..z4 left_to_down z5
  down_to_right z6...z7right_to_down z8 down_to_left z9;
  draw tmp_path;
  bbbowl(z4,z5,z6,hThick) tmp_path;
  bbbowl(z7,z8,z9,hThick) tmp_path;
  square_end1(up);
  square_end3(right);
  square_end9(left);
  labels(1,2,3,4,5,6,7,8,9);
  math_fit(0,0);
endchar;

beginchar(bbeta,8u#+2appr#,x_height#,desc_depth#);
  "Lowercase Greek eta";
  italcorr 0.75x_height#*slant-.5u#;
  complete_n;
  math_fit(0,0);
endchar;

iff known bbtheta:
beginchar(bbtheta,8u#+2appr#,asc_height#,0);
  "Lowercase Greek theta";
  italcorr 0.6asc_height#*slant+ho#-.5u#;
  pickup circle.nib;
  bbcircle1(apprl-ho,w-apprr+ho,h+oo,-oo); draw last_path;
  bbbowl(z1b,z1a,z1d,hThick) last_path; x2=x.bowl.top;
  bbbowl(z1b,z1c,z1d,hThick) last_path; x3=x.bowl.top;
  y2=y3=good.y(0.5[y1b,y1d]); draw z2..z3; labels(2,3);
  math_fit(0,0);
endchar;

beginchar(bbiota,6u#+2appr#,x_height#,0);
  "Lower Greek iota";
% no italic correction
  pickup circle.nib;
  rt x1=w-apprr; x2=0.5[x1,x4]; lft x3=lft x4=apprl;
  bot y2=-oo; top y4=h; y1=y3=good.y(0.3[y2,y4]);
  tmp_path:=z1 down_to_left z2 left_to_up z3..z4;
  draw tmp_path;
  hbbowl(z2,z3,z4,hthick) tmp_path;
  pickup square.nib; draw z4..z.bowl.bot;
  square_end1(up); labels(1,2,3,4,5,6);
  math_fit(0,0);
endchar;

iff known bbkappa:
beginchar(bbkappa,9u#+2appr#,x_height#,0); "Lower Greek kappa";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  lft x1=lft x3=apprl; x2-x1=hthick; x4=x5=x2;
  bot y1=0; y2=y1; top y3=h; y4=y3;
  x6r=w-apprr; y6r=h; y5=0.4*h;
  adjust_slanted_bar(5,6r,5a,6)(0.5thin,-1);
  z6-z6l=z6r-z6; ortho_penpos5(thin,z6-z5);
  z7=(w-apprr,0); top z8b=(0.25[x3,x4],h);
  adjust_slanted_bar(8b,7,7b,8)(thick,1);
  z9=whatever[z5,z6]; z9=whatever[z7,z7b];
  z10=whatever[z5,z6]; z10=whatever[z8,z8b];
  y7a-y7=y8a-y8=thin; z7a=whatever[z7,z7b]; z8a=whatever[z8,z8b];
  penpos7(diag_width(thin,z7b-z7),0);
  penpos8(diag_width(thin,z8b-z8),0);
  ortho_penpos9(thin, z7b-z7); ortho_penpos10(thin, z8b-z8);
  pickup square.nib; draw z1--z2--z4--z3--cycle;
  penstroke z5e..z6e; penstroke z7e..z9e; penstroke z8e..z10e;
  fill z7--z8--z8a--z7a--cycle;
  labels(1,2,3,4,5a,7a,7b,8a,8b); penlabels(5,6,7,8,9,10);
  math_fit(0,0);
endchar;

beginchar(bblambda,9u#+2appr#,asc_height#,0);
  "Lowercase Greek lambda";
% no italic correction
  x1=apprl; x5=w-apprr;
  y2=y3=max(x_height,0.6h)-0.5thin; y1=y4=y5=0; y6=y7=h;
  numeric a,x,y; a=(abs(x5-x1)-2y2*slant)/(2y2); y=thick/(2y2);
  x=thick*(-a*y+sqrt(1+(a**2)-(y**2)))/(1-(y**2));
  x3-x2=x5-x4=x7-x6=x; x2-x1=x4-x2; z6=whatever[z4,z2];
  a:=diag_width(thin,z2-z4);
  penpos1(diag_width(thin,z2-z1),0);
  penpos4(a,0); penpos5(a,0); penpos6(a,0); penpos7(a,0);
  forsuffixes $=r,l:
    z2$-z1$=whatever*(z2-z1); z2$=whatever[z2,z4];
  endfor
  y6-y6a=thin; z6-z6a=z7-z7a=z4a-z4=z5a-z5=whatever*(z6-z4);
  penstroke z1e..z2e; penstroke z4e..z6e; penstroke z5e..z7e;
  fill z4--z5--z5a--z4a--cycle; fill z6--z7--z7a--z6a--cycle;
  penlabels(1,2,3,4,5,6,7); labels(4a,5a,6a,7a);
  math_fit(0,0);
endchar;

beginchar(bbmu,8u#+2appr#,x_height#,desc_depth#); "Lowercase Greek mu";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  bot y1=0; y2=y1; top y3=h; y4=y3=y7=y8; bot y5=bot y6=-d;
  rt x1=w-apprr; x3=x1; lft x7=lft x5=apprl;
  x1-x2=x3-x4=x8-x7=x6-x5=hthick;
  if uy_factor>0: numeric t;
    x9=x2; y9=uy_factor[y2,y4]; bot y10=-oo; x10=0.5[x7,0.5[x2,x1]];
    x11=x7; y11=0.7[y7,y10];
    tmp_path:=z9 down_to_left z10 left_to_up z11;
    t=xpart(tmp_path intersectiontimes (z8..z6));
    z14=point t of tmp_path;
    draw subpath (0,t) of tmp_path;
    labels(10,11);
  else: z9=(x6,y1); draw z2..z9; fi
  pickup square.nib; draw z1--z2--z4--z3--cycle;
  draw z5--z6--z8--z7--cycle;
  labels(0,1,2,3,4,5,6,7,8,9);
  math_fit(0,0);
endchar;

beginchar(bbnu,8u#+2appr#,x_height#,0); "Lowercase Greek nu";
  italcorr x_height#*slant+ho#-.5u#;
  pickup circle.nib;
  top y2=h; y2=y3=y6=y7; bot y4=bot y5=0;
  lft x3=lft x4=apprl; rt x6=w-apprr+ho;
  x2-x3=hthick; x6-x7=hThick; x5=rt x4;
  tmp_path:=z5 right_to_up z6;
  z8=tmp_path intersectionpoint (z7..(x7,y5));
  z1=tmp_path intersectionpoint (z2..(x2,y5));
  draw tmp_path; draw z1..z2; draw z7..z8;
  pickup square.nib; draw z2--z3--z4; draw z6..z7;
  labels(1,2,3,4,5,6,7,8);
  math_fit(0,0);
endchar;

beginchar(bbxi,8u#+2appr#,asc_height#,desc_depth#);
  "Lowercase Greek xi";
  italcorr x_height#*slant-2.5u#;
  pickup circle.nib;
  top y1=h; top y2=top y3=top y4=vround(y1-0.25(h-x_height));
  top y6=top y7=top y8=vround 0.5h; bot y10=bot y11=0; bot y13=-d;
  y5=0.5[y6,y4]; y9=0.4[y10,y8]; y12=0.5[y13,y11];
  lft x1=apprl+hround 2u; lft x5=apprl; lft x9=apprl-ho;
  rt x3=rt x7=w-apprr-hround 2u; rt x12=w-apprr+ho;
  x2=0.7[x1,x3];
  x4=0.85[x5,x3];
  x6=0.7[x5,x7];
  x8=0.8[x9,x7];
  x10-x9=x12-x11=0.44(x12-x9);
  x13=good.x 0.5[x9,x12];
  tmp_path:=z1 down_to_right z2..z3 & z3..z4 left_to_down z5
  down_to_right z6..z7 & z7..z8 left_to_down z9 down_to_right z10
  ...z11 right_to_down z12 down_to_left z13;
  draw tmp_path;
  bbbowl(z8,z9,z10,hThick) tmp_path;
  bbbowl(z4,z5,z6,max(0,x.bowl.mid-x5)) tmp_path;
  bbbowl(z11,z12,z13,hThick) tmp_path;
  square_end1(up);
  square_end3(right);
  square_end7(right);
  square_end13(left);
  labels(1,2,3,4,5,6,7,8,9,10,11,12,13);
  math_fit(0,0);
endchar;

iff known bbomicron:
beginchar(bbomicron,8u#+2appr#,x_height#,0); "Lowercase Greek omicron";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  pickup circle.nib;
  bbcircle1(apprl-ho,w-apprr+ho,x_height+uo,-oo); draw last_path;
  bbbowl(z1b,z1a,z1d,hThick) last_path;
  bbbowl(z1b,z1c,z1d,hThick) last_path;
  math_fit(0,0);
endchar;

iff known bbpi:
beginchar(bbpi,9u#+2appr#,x_height#,0); "Lowercase Greek pi";
  italcorr x_height#*slant;
  pickup circle.nib; top y1=h; apprl-lft x1=rt x2-w+apprr=hround 0.5u;
  y1=y2=y3=y6=y7=y10; bot y4=0; y4=y5=y8=y9;
  lft x3-apprl=lft x4-apprl=w-apprr-rt x10=w-apprr-rt x9=hround 0.75u;
  x10-x7=x9-x8=x6-x3=x5-x4=hthick; pickup square.nib;
  draw z1..z2; draw z3--z4--z5--z6; draw z7--z8--z9--z10;
  labels(1,2,3,4,5,6,7,8,9,10);
  math_fit(0,0);
endchar;

iff known bbrho:
beginchar(bbrho,8u#+2appr#,x_height#,desc_depth#);
  "Lowercase Greek rho";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  pickup circle.nib; numeric t;
  bot y1=-d; top y3=h+uo; bot y5=-oo; y2=y4=0.5[y5,y3];
  lft x2=lft x1=apprl; rt x4=w-apprr+ho; x3=x5=0.5[x2,x4];
  tmp_path:=z1..z2 up_to_right z3 right_to_down
  z4 down_to_left z5 left_to_up z2;
  bbbowl(z3,z4,z5,hThick) tmp_path;
  hbbowl(z3,z2,z1,hthick) tmp_path;
  t=5+xpart(subpath (5,infinity) of tmp_path
    intersectiontimes bowl_path);
  draw subpath (0,t) of tmp_path;
  pickup square.nib; draw z.bowl.bot..z1;
  penlabels(1,2,3,4,5);
  math_fit(0,0);
endchar;

iff known bbsigma:
beginchar(bbsigma,8u#+2appr#,x_height#,0);
  "Lowercase Greek sigma";
  italcorr x_height#*slant+.5u#;
  pickup circle.nib;
  rt x1=hround(w-apprr+u); x2=x4=0.5[x3,x5];
  lft x3=apprl-ho; rt x5=rt x6=w-apprr;
  top y1=top y2=h; y3=y5=0.5[y4,y2];
  bot y4=-oo; y6=y1;
  tmp_path:=z1..z2 left_to_down z3 down_to_right
  z4 right_to_up z5..z6;
  draw tmp_path;
  bbbowl(z2,z3,z4,hThick) tmp_path;
  hbbowl(z4,z5,z6,hthick) tmp_path;
  square_end1(right);
  labels(1,2,3,4,5,6,7,8,9,10);
  math_fit(0,0);
endchar;

beginchar(bbtau,7u#+2appr#,x_height#,0);
  "Lowercase Greek tau";
  italcorr x_height#*slant;
  pickup circle.nib; center_bar(1,2); bot y1=bot y2=0;
  apprl-lft x5=rt x6-w+apprr=hround 0.5u; top y5=top y6=h;
  z3=(x1,y5); z4=(x2,y5); pickup square.nib; draw z5..z6;
  draw z3--z1--z2--z4; labels(1,2,3,4,5,6);
  math_fit(0,0);
endchar;

beginchar(bbupsilon,8u#+2appr#,x_height#,0);
  "Lowercase Greek upsilon";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  rt x1=rt x2=w-apprr; lft x4=lft x5=apprl; x3=0.5[x2,x4];
  top y1=top y5=h; bot y3=-oo; y2=y4=1/3[y3,y1];
  tmp_path:=z1..z2 down_to_left z3 left_to_up z4..z5;
  draw tmp_path;
  hbbowl(z3,z4,z5,hthick) tmp_path;
  pickup square.nib; draw z5..z.bowl.bot;
  square_end1(up); labels(1,2,3,4,5);
  math_fit(0,0);
endchar;

iff known bbphi:
beginchar(bbphi,10u#+2appr#,asc_height#,desc_depth#);
  "Lowercase Greek phi";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  center_stem(2,3); bot y2=-d; top y3=h;
  bbcircle1(apprl-ho,w-apprr+ho,x_height+oo,-oo); draw last_path;
  bbbowl(z1b,z1a,z1d,hThick) last_path;
  bbbowl(z1b,z1c,z1d,hThick) last_path;
  pickup square.nib; draw z2..z3;
  labels(2,3);
  math_fit(0,0);
endchar;

beginchar(bbchi,9u#+2appr#,x_height#,desc_depth#);
  "Lowercase Greek khi";
  italcorr x_height#*slant-0.5u#;
  complete_X(0.35u);
  math_fit(0,0);
endchar;

beginchar(bbpsi,10u#+2appr#,asc_height#,desc_depth#);
  "Lowercase Greek psi";
  italcorr x_height#*slant-.5u#;
  center_stem(1,2,6);
  bot y1=-d; top y2=h;
  top y4=top y8=x_height; y5=y7=0.5[y4,y6]; bot y6=-oo;
  lft x4=lft x5=apprl; rt x7=rt x8=w-apprr;
  tmp_path:=z4..z5 down_to_right z6 right_to_up z7..z8;
  draw tmp_path;
  hbbowl(z6,z5,z4,hthick) tmp_path; z3=z.bowl.bot;
  hbbowl(z6,z7,z8,hthick) tmp_path; z9=z.bowl.bot;
  pickup square.nib; draw z1..z2; draw z3..z4; draw z8..z9;
  labels(1,2,3,4,5,6,7,8,9);
  math_fit(0,0);
endchar;

beginchar(bbomega,12u#+2appr#,x_height#,0);
  "Lowercase Greek omega";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  center_stem(4,5); top y1=top y8=h; y2=y7=0.42[y3,y1];
  bot y3=bot y6=-oo; y4=0.35h; top y5=vround(2h/3);
  lft x2=apprl-ho; rt x7=w-apprr+ho;
  rt x1=hround max(0.3[lft x2,rt x7],x2+hThick+1.5thin);
  x1-x2=x7-x8; x3=0.25[x2,x7]; x7-x6=x3-x2; x9-x2=x7-x11=hThick;
  z1'-z1=(z2-z1) yscaled 1/4; z8'-z8=(z7-z8) yscaled 1/4;
  tmp_path:=z1{z1'-z1}...z2 down_to_right
  z3 right_to_up z4 & z4down_to_right z6 right_to_up z7
  ...z8{z8-z8'};
  z9=tmp_path intersectionpoint ((x9,y1)..(x9,y2));
  z10=tmp_path intersectionpoint ((x9,y2)..(x9,y3));
  z11=tmp_path intersectionpoint ((x11,y1)..(x11,y2));
  z12=tmp_path intersectionpoint ((x11,y2)..(x11,y3));
  draw tmp_path; draw z4..z5; draw z9..z10; draw z11..z12;
  square_end5(up);
  square_end1(z1-z1');
  square_end8(z8-z8');
  labels(range 1 thru 12);
  math_fit(0,0);
endchar;

% Variants

iff known bbvarbeta:
beginchar(bbvarbeta,8u#+2appr#,asc_height#,0);
  "Lowercase Greek variant beta";
  italcorr 0.8asc_height#*slant-.5u#;
  pickup circle.nib;
  numeric t[];
  lft x5=lft x9=apprl-ho; rt x7=w-apprr+ho;
  lft x1=min(apprl+hround(4u/3)-eps,lft x5+hThick);
  rt x3=w-apprr-hround(u/3)+eps; x2=x4=0.5[x1,x3];
  x6=x8=0.5[x5,x7];
  top y4=h+oo; bot y6=-oo; top y8=x_height+oo;
  y2=good.y 1/3[y8,y4]; y5=0.5[y6,y4];
  y1=y3=0.5[y2,y4]; y7=y9=0.5[y6,y8];
  tmp_path:= z1 down_to_right z2 right_to_up z3
  up_to_left z4 left_to_down z5 down_to_right
  z6 right_to_up z7 up_to_left z8 left_to_down z9;
  bbbowl(z4,z5,z6,hThick) subpath (6,infinity) of tmp_path;
  t1=xpart(subpath (0,4) of tmp_path intersectiontimes bowl_path);
  t2=12+xpart(subpath (12,16) of tmp_path intersectiontimes bowl_path);
  draw subpath (t1,t2) of tmp_path;
  bbbowl(z8,z7,z6,hThick) tmp_path;
  labels(range 1 thru 15);
  math_fit(0,0);
endchar;

iff known bbvarepsilon:
beginchar(bbvarepsilon,6u#+2appr#,x_height#,0);
  "Lowercase Greek variant epsilon";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  top y2=h+uo; bot y8=-oo; bot y4=vround 0.5h; y4=y5=y6;
  y1=0.76[y4,y2]; y9=0.76[y5,y8];
  y3=0.5[y4,y2]; y7=0.5[y6,y8];
  rt x1=rt x9=w-apprr; rt x5=w-apprr-hround 1.5u;
  lft x3=lft x7=apprl-ho; x4=x2; x6=x8; x10-x3=hThick;
  tmp_path:=reverse elliptic_arc(3,2,1) & z3 down_to_right z4..z5;
  tmpp_path:=reverse elliptic_arc(7,8,9) & z7 up_to_right z6..z5;
  bbbowl(z6,z7,z8,hThick) tmpp_path;
  bbbowl(z2,z3,z4,max(0,x.bowl.mid-x3)) tmp_path;
  draw tmp_path; draw tmpp_path;
  square_end1(z1-z1');
  square_end5(right);
  square_end9(z9-z9');
  labels(1,1',2,3,4,5,6,7,8,9,9');
  math_fit(0,0);
endchar;

iff known bbvartheta:
beginchar(bbvartheta,8u#+2appr#,asc_height#,0);
  "Lowercase Greek variant theta";
  italcorr 0.7asc_height#*slant+ho#-.5u#;
  pickup circle.nib; numeric t;
  top y6=h+oo; bot y4=-oo; rt x5=w-apprr+ho; lft x3=apprl-ho;
  y3=y2=y5=y9=good.y 0.5[y4,y6]; x4=x6=0.5[x3,x5];
  x2-x3=hThick; x7=good.x 0[x2,x3]; y7=0.35[y6,y9];
  rt x9=w-apprr+hround u; z8=z5;
  tmp_path:=z3 down_to_right z4 right_to_up z5
  up_to_left z6 left_to_down z7 down_to_right z8;
  hbbowl(z4,z3,z3,x2-x3) tmp_path;
  bbbowl(z6,z5,z4,hThick) tmp_path;
  t=8+xpart(subpath (8,10) of tmp_path intersectiontimes bowl_path);
  draw subpath (0,t) of tmp_path;
  y2r=y3r=top y2; y3l=y2l=bot y2; y3a=y2a=y2;
  x3r=x3a=lft x3; x2r=x2a=rt x2; x2l=x2; x3l=x3;
  draw z5..z9;
  fill z3l--z2l--z2a--z2r--z3r--z3a--cycle;
  square_end9(right);
  labels(2,3,4,5,6,7,8,9,2a,2l,2r,3a,3l,3r);
  math_fit(0,0);
endchar;

iff known bbvarkappa:
beginchar(bbvarkappa,9u#+2appr#,x_height#,0);
  "Lowercase Greek variant kappa";
  italcorr x_height#*slant-0.2u#;
  pickup circle.nib;
  x1r=w-apprr+0.3u; x4l=apprl-0.3u; y1r=h; y4l=-d;
  adjust_slanted_bar(1r,4l,2l,3r)(thick+thin,-1);
  a:=diag_width(thin,z1r-z3r);
  penpos1(a,0); penpos2(a,0); penpos3(a,0); penpos4(a,0);
  y1-y1a=thin; z1a=whatever[z1,z3];
  z1-z1a=z2-z2a=z3a-z3=z4a-z4;
  top y5=top y12=h; bot y8=bot y9=0; lft x5=apprl; rt x9=w-apprr;
  z8=whatever[z2,z4]; z12=whatever[z1,z3];
  rt x6-apprl=w-apprr-lft x10=hround 3u; slope:=(y1-y3)/(x1-x3);
  ellipse_set(5,6,7,8); ellipse_set(9,10,11,12);
  penstroke z1e..z3e; penstroke z2e..z4e;
  fill z1--z1a--z2a--z2--cycle; fill z3--z3a--z4a--z4--cycle;
  draw z5 right_to_down z6...z7---z8;
  draw z9 left_to_up z10...z11---z12;
  square_end5(left); square_end9(right);
  penlabels(1,2,3,4); labels(1a,2a,3a,4a,5,6,7,8,9,10,11,12);
  math_fit(0,0);
endchar;

iff known bbvarpi:
beginchar(bbvarpi,12u#+2appr#,x_height#,0);
  "Lowercase Greek variant pi";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  center_stem(1,4);
  top y1=h; y1=y7=y8; bot y3=bot y5=-oo;
  top y4=vround 0.6h; y2=y6=0.4[y3,y1];
  lft x2+ho=lft x7=apprl; rt x6-ho=rt x8=w-apprr;
  x3=0.45[x2,x4]; x5=0.45[x6,x4];
  tmp_path:=z1 left_to_down z2 down_to_right z3 right_to_up z4
  & z4 down_to_right z5 right_to_up z6 up_to_left z1;
  draw tmp_path;
  bbbowl(z1,z2,z3,hThick) tmp_path;
  bbbowl(z1,z6,z5,hThick) tmp_path;
  pickup square.nib; draw z7..z8; square_end4(up);
  labels(1,2,3,4,5,6,7,8,9,10,11,12);
  math_fit(0,0);
endchar;

iff known bbvarrho:
beginchar(bbvarrho,8u#+2appr#,x_height#,desc_depth#);
  "Lowercase Greek variant rho";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  pickup circle.nib; numeric t;
  rt x1=w-apprr; lft x3=lft x4=apprl; rt x6=w-apprr+ho;
  x2=x5=x7=0.5[x4,x6];
  bot y1=bot y2=-d; y3=0; top y5=h+uo; bot y7=-oo;
  y4=y6=0.5[y7,y5];
  tmp_path:=z1..z2 left_to_up z3..z4 up_to_right z5
  right_to_down z6 down_to_left z7 left_to_up z4;
  hbbowl(z5,z4,z4,hthick) tmp_path;
  hbbowl(z2,z3,z4,hthick) subpath (0,5) of tmp_path;
  t=8+xpart(subpath (8,12) of tmp_path intersectiontimes bowl_path);
  draw subpath (0,t) of tmp_path;
  bbbowl(z5,z6,z7,hThick) tmp_path;
  square_end1(right);
  labels(1,2,3,4,5,6,7);
  math_fit(0,0);
endchar;

iff known bbvarsigma:
beginchar(bbvarsigma,7u#+2appr#,x_height#,desc_depth#);
  "Lowercase Greek variant sigma";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  top y1=h; y2=0.4[y3,y1]; bot y3=0; y4=0.5[y3,y5]; bot y5=-d;
  rt x1=w-apprr; lft x2=apprl-ho; rt x4=w-apprr+ho;
  x3=0.5[x2,x4]; x5=good.x(x3-0.5u);
  tmp_path:=z1left_to_down z2 down_to_right
  z3 right_to_down z4 down_to_left z5;
  draw tmp_path;
  bbbowl(z1,z2,z3,hThick) tmp_path;
  bbbowl(z3,z4,z5,hThick) tmp_path;
  square_end1(right); square_end5(left);
  labels(1,2,3,4,5,6,7,8,9);
  math_fit(0,0);
endchar;

%beginchar(bbvarsigma,7u#+2appr#,x_height#,comma_size#-dot_size#);
%  "Lowercase Greek variant sigma";
%  italcorr x_height#*slant-.5u#;
%  pickup circle.nib;
%  slope:=-x_height/30u;
%  top y1'=top y2=h+oo; bot y8=bot y9'=-d;
%  y5=good.y max(0.5thin,1/3[y8,y2]);
%  rt x1=w-apprr; lft x3=apprl-ho; rt x7=w-apprr+ho;
%  x2=x5=0.5[x3,x7]; x9=good.x(0.5[x3,x7]-0.5u);
%  x8=0.4[x7,x9]; x1'=0.5[x1,x2]; x9'=0.5[x9,x8];
%  x10=x3+hThick; x12=x7-hThick;
%  y1=good.y(y1'+slope*(x1-x1'));
%  y9=good.y(y9'+slope*(x9-x9'));
%  ellipse_set(2,3,4,5); ellipse_set(8,7,6,5);
%  tmp_path:=z1{z1'-z1}...z2 left_to_down
%  z3...z4---z6...z7 down_to_left z8...z9{z9-z9'};
%  z10=tmp_path intersectionpoint ((x10,y3)..(x10,y5));
%  z11=tmp_path intersectionpoint ((x10,y3)..(x10,y2));
%  z12=tmp_path intersectionpoint ((x12,y7)..(x12,y5));
%  z13=tmp_path intersectionpoint ((x12,y7)..(x12,y8));
%  draw tmp_path; draw z10..z11; draw z12..z13;
%  square_end1(z1-z1'); square_end9(z9-z9');
%  labels(1,1',2,3,4,5,6,7,8,9,9',10,11,12,13);
%  math_fit(0,0);
%endchar;

iff known bbvarphi:
beginchar(bbvarphi,10u#+2appr#,x_height#,desc_depth#);
  "Lowercase Greek variant phi";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  center_stem(1,2,5); bot y1=-d; y2=0.7[y5,y3];
  top y3=top y7=h+oo; y4=y6=0.5[y5,y3]; bot y5=-oo;
  x3=0.3[x2,x4]; rt x4=w-apprr+ho; lft x6=apprl-ho;
  rt x7=lft x1-hround 0.25u;
  tmp_path:=z1..z2 up_to_right z3 right_to_down z4
  down_to_left z5 left_to_up z6 up_to_right z7;
  draw tmp_path;
  bbbowl(z7,z6,z5,hThick) tmp_path;
  bbbowl(z3,z4,z5,hThick) tmp_path;
  square_end1(down);
  square_end7(right);
  labels(1,2,3,4,5,6,7);
  math_fit(0,0);
endchar;

% Ionian extension
% (Carl B. Boyer, ``A History of Mathematics'';
% Yannis Haralambous and Claus Thull,
% ``Typesetting Modern Greek with 128 Character Codes''.)
% One should also cite Sylvio Levy for his talentuous work
% on Greek letters.

iff known bbdigamma:
beginchar(bbdigamma,10u#+2appr#,x_height#,desc_depth#);
  "Lowercase Ionian digamma";
  italcorr x_height#*slant+.5u#;
  pickup circle.nib;
  top y1=vround 0.9h; top y3=h+oo; bot y9=-oo;
  y5=good.y 0.3[y9,y3]; y7=good.y 0.7[y9,y3];
  y4=0.42[y5,y3]; y8=.384[y7,y9]; y10=0.3[y9,y5];
  rt x1=w-apprr+hround u; lft x4=apprl-ho;
  rt x8=w-apprr-hround u+ho; lft x10=x5;
  x3=0.5[x4,x8]; z2=0.5[z1,z3]; x5=0.25[x4,x8];
  x7=0.75[x4,x8]; z6=0.5[z5,z7];
  tmp_path:=z1{left}...z2{(z3-z1) xscaled 0.5}...z3
  left_to_down z4 down_to_right z5...z6{(z6-z5) xscaled 1/3}
  ...z7 right_to_down z8 & elliptic_arc(8,9,10);
  x16=good.x x9; y16=-d;
  penpos15(thin*(1++slant),0); penpos16(thin*(1++slant),0);
  z15=tmp_path intersectionpoint (z16..(x16,y10));
  draw tmp_path;
  bbbowl(z3,z4,z5,hThick) tmp_path;
  bbbowl(z7,z8,z9,hThick) tmp_path;
  penstroke z15e..z16e;
  square_end1(right); square_end10(z10-z10');
  labels(1,2,3,4,5,6,7,8,9,10,10'); penlabels(15,16);
  math_fit(0,0);
endchar;

iff known bbkoppa:
beginchar(bbkoppa,8u#+2appr#,x_height#,desc_depth#);
  "Lowercase Ionian koppa";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  center_stem(2,3); penpos2(thin*(1++slant),0);
  penpos3(thin*(1++slant),0); y3=-d; y2=y1d;
  bbcircle1(apprl-ho,w-apprr+ho,x_height+uo,-oo); draw last_path;
  bbbowl(z1b,z1a,z1d,hThick) last_path;
  bbbowl(z1b,z1c,z1d,hThick) last_path;
  penstroke z2e..z3e;
  penlabels(2,3);
  math_fit(0,0);
endchar;

% I won't use it, but I think it would have been nice
% that `koppa' looked as a reverse `rho'.
%beginchar(bbkoppa,8u#+2appr#,x_height#,desc_depth#);
%  "Lowercase Ionian koppa";
%  italcorr 0.6x_height#*slant+ho#-.5u#;
%  pickup circle.nib; numeric t;
%  bot y2=bot y3=-d; top y5=h+uo; bot y7=-oo; y4=y6=0.5[y7,y5];
%  rt x4=rt x3=w-apprr; lft x6=apprl-ho; x5=x7=0.5[x4,x6];
%  x3-x2=hthick; x9-x6=hThick;
%  tmp_path:=z3..z4 up_to_left z5 left_to_down
%  z6 down_to_right z7 right_to_up z4;
%  t=xpart(tmp_path intersectiontimes (z2..(x2,y4)));
%  z8=point t of tmp_path;
%  z1=tmp_path intersectionpoint ((x2,y4)..(x2,y5));
%  z9=tmp_path intersectionpoint ((x9,y7)..(x9,y6));
%  z10=tmp_path intersectionpoint ((x9,y6)..(x9,y5));
%  draw subpath (0,t) of tmp_path; draw z1..z2; draw z9..z10;
%  pickup square.nib; draw z2..z3;
%  penlabels(1,2,3,4,5,6,7,8,9,10);
%  math_fit(0,0);
%endchar;

iff known bbsampi:
beginchar(bbsampi,10u#+2appr#,asc_height#,0);
  "Lowercase Ionian sampi";
  % no italic correction
  x1=apprl; x5=w-apprr;
  y2=y3=max(x_height,2h/3)-thin; y1=y4=y5=0; y6=y7=h;
  numeric a,x,y; a=(abs(x5-x1)-2y2*slant)/(2y2); y=thick/(2y2);
  x=thick*(-a*y+sqrt(1+(a**2)-(y**2)))/(1-(y**2));
  x3-x2=x5-x4=x7-x6=x; x2-x1=x4-x2; z6=whatever[z4,z2];
  a:=diag_width(thin,z2-z4);
  penpos1(diag_width(thin,z2-z1),0);
  penpos4(a,0); penpos5(a,0); penpos6(a,0); penpos7(a,0);
  y6-y6a=thin; z6-z6a=z7-z7a=z4a-z4=z5a-z5=whatever*(z6-z4);
  z8=0.5[z1,z4]; z9=0.5[z2,z4]; penpos8(diag_width(thin,z9-z8),0);
  forsuffixes $=l,r:
    z2$-z1$=whatever*(z2-z1); z2$=whatever[z2,z4];
    z9$=whatever[z4,z6]; z9$-z8$=whatever*(z9-z8);
  endfor
  penstroke z1e..z2e; penstroke z4e..z6e; penstroke z5e..z7e;
  penstroke z8e..z9e;
  fill z4--z5--z5a--z4a--cycle; fill z6--z7--z7a--z6a--cycle;
  penlabels(1,2,3,4,5,6,7,8,9); labels(4a,5a,6a,7a);
  math_fit(0,0);
endchar;

iff known bbvardigamma:
beginchar(bbvardigamma,7.5u#+2appr#,x_height#,desc_depth#);
  "Lowercase Ionian variant digamma";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib; rt x1=w-apprr; lft x2=lft x3=apprl;
  x4=x5=x3+hthick; lft x6=x4; rt x7=w-apprr-hround u;
  top y1=top y2=top y5=h; bot y3=bot y4=-d;
  bot y6=bot y7=vround 0.5(h-d); pickup square.nib;
  draw z1--z2--z3--z4--z5; draw z6..z7;
  labels(1,2,3,4,5,6,7);
  math_fit(0,0);
endchar;

iff known bbvarkoppa:
beginchar(bbvarkoppa,8u#+2appr#,asc_height#,desc_depth#);
  "Lowercase Ionian variant koppa";
  italcorr 0.4[asc_height#,-desc_depth#]*slant-.5u#;
  pickup circle.nib;
  y4r=vround 0.4[-d,h]; y5l+d=h-y4r;
  bot y1=bot y4=y4r; top y2=top y3=h;
  top y5=top y6=y5l; bot y7=bot y8=-d;
  lft x1=lft x2=apprl; rt x6=rt x7=w-apprr;
  x4-x1=x3-x2=x6-x5=x7-x8=hthick; x4r=rt x4; x5l=lft x5;
  adjust_slanted_bar(4r,5l,4l,5r)(thin,1);
  penstroke z4e..z5e; pickup square.nib;
  draw z1--z2--z3--z4--cycle; draw z5--z6--z7--z8--cycle;
  labels(1,2,3,6,7,8); penlabels(4,5);
  math_fit(0,0);
endchar;

iff known bbslash_lambda:
beginchar(bbslash_lambda,9u#+2appr#,asc_height#,0);
  "Slashed lowercase Greek lambda";
  italcorr x_height#*slant-.5u#;
  x1=x8=apprl; x5=x11=w-apprr;
  y2+0.5thin=y3+0.5thin=y8r=y11r=max(x_height,0.6h);
  y1=y4=y5=0; y6=y7=h;
  numeric a,x,y; a=(abs(x5-x1)-2y2*slant)/(2y2); y=thick/(2y2);
  x=thick*(-a*y+sqrt(1+(a**2)-(y**2)))/(1-(y**2));
  x3-x2=x5-x4=x7-x6=x; x2-x1=x4-x2; z6=whatever[z4,z2];
  a:=diag_width(thin,z2-z4);
  penpos1(diag_width(thin,z2-z1),0);
  penpos4(a,0); penpos5(a,0); penpos6(a,0); penpos7(a,0);
  forsuffixes $=r,l:
    z2$-z1$=whatever*(z2-z1); z2$=whatever[z2,z4];
  endfor
  y6-y6a=thin; z6-z6a=z7-z7a=z4a-z4=z5a-z5=whatever*(z6-z4);
  penpos8(thin,90); penpos11(thin,90);
  forsuffixes $=,r,l:
    y8$=y9$=y10$; z9$=whatever[z4,z6]; z10$=whatever[z5,z7];
  endfor
  penstroke z1e..z2e; penstroke z4e..z6e; penstroke z5e..z7e;
  penstroke z8e..z9e; penstroke z10e..z11e;
  fill z4--z5--z5a--z4a--cycle; fill z6--z7--z7a--z6a--cycle;
  penlabels(1,2,3,4,5,6,7,8,9,10,11); labels(4a,5a,6a,7a);
  math_fit(0,0);
endchar;