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

% It should be noticed that most of the work is contained
% in the last macros definitions of `mbbbase.mf'. This can
% be legitimated by the fact that lowercase letters must be quite
% homogeneous. Also, variants should be easily made by
% changing few parameters (just for `thorn': from `p'
% whose height is `x_height' to 'thorn whose height is
% �asc_height') or by adding new features (accents, bars...).

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("a",8u#+2appr#,x_height#,0); "The letter a";
  italcorr 0.75x_height#*slant-.5u#;
  pickup circle.nib;
  lft x1=apprl+hround 0.2u;
  rt x3=w-apprr; x3=x4;
  top y2=h+uo; bot y4=0; y3=0.3[y2+oo-uo,y4]; 
  bot y1=vround max(0.72h,y3);
  tmp_path:=z4..z3 & elliptic_arc(3,2,1);
  hbbowl(z2,z3,z4,hthick) tmp_path;
  x11=x7=x.bowl.mid; lft x9=apprl-ho; x8=0.5[x9,0.5[x.bowl.mid,x4]];
  if ab_down_factor>0: bot y8=-oo; y7=ab_down_factor[y4,bot h];
  else: y8=y7=y4; fi
  top y11=min(vround 0.7h,top y3); slope:=(y11-y4)/16u;
  ellipse_set(8,9,10,11);
  tmpp_path:=z7 if ab_down_factor>0: down_to_left else: .. fi
  z8 left_to_up z9...z10---z11;
  if straight_bowl: bbbowl(z11,z9,z8,hThick) tmpp_path;
  else: begingroup interim superness:=superbowl;
      draw 0.5[z10,z11]{z10-z11}...(x9+hThick,y9) down_to_right z8;
    endgroup; fi
  draw tmp_path; draw tmpp_path;
  pickup square.nib; draw z4..z.bowl.bot;
  square_end1(z1-z1'); labels(range 1 thru 11);
  math_fit(0,0);
endchar;

iff not variant_a:
beginchar("a",8u#+2appr#,x_height#,0); "The letter a";
  italcorr x_height#*slant-.5u#;
  complete_left_lower(ab_down_factor,ab_up_factor);
  math_fit(0,0);
endchar;

beginchar("b",8u#+2appr#,asc_height#,0); "The letter b";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  complete_right_lower(ab_down_factor,ab_up_factor);
  math_fit(0,0);
endchar;

beginchar("c",7u#+2appr#,x_height#,0);
  "The letter c";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  x1=x5=w-apprr; lft x3=apprl-ho;
  top y2=h+uo; bot y4=-oo; y3=0.5[y4,y2];
  y1=0.707[y3,y2]; y5=0.707[y3,y4];
  tmp_path:=reverse elliptic_arc(3,2,1)&elliptic_arc(3,4,5);
  bbbowl(z2,z3,z4,hThick) tmp_path; draw tmp_path;
  square_end1(z1-z1');
  square_end5(z5-z5');
  labels(1,1',2,3,4,5,5');
  math_fit(0,0);
endchar;

beginchar("d",8u#+2appr#,asc_height#,0); "The letter d";
  italcorr asc_height#*slant-.5u#;
  complete_left_lower(ab_down_factor,ab_up_factor);
  math_fit(0,0);
endchar;

beginchar("e",8u#+2appr#,x_height#,0); "The letter e";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  numeric t; pickup circle.nib;
  rt x1=w-apprr+ho; lft x3=apprl-ho; x2=x4=0.5[x1,x3];
  top y2=h+uo; bot y4=-oo; y1=y3=good.y(0.5[y2,y4]);
  tmp_path:=superellipse(z1,z2,z3,z4,superness);
  t=xpart(tmp_path intersectiontimes
    (bot(w/2,0.25[y4,y2])..bot(w,0.25[y4,y2])));
  draw subpath (0,t) of tmp_path;
  z5=point t of tmp_path;
  bbbowl(z2,z3,z4,hThick) tmp_path;
  z6=(x.bowl.mid,y1);
  hbbowl(z2,z1,z1,hThick) tmp_path;
  x6r=x6l=x6; x1r=x1; x1m=x1l=rt x1;
  y6r=y1r=top y1; y1m=y1; y1l=y6l=bot y1;
  fill z1l--z1m--z1r--z6r--z6l--cycle;
  square_end5(direction t of tmp_path);
  labels(1,1r,1l,1m,2,3,4,5,6,6l,6r);
  math_fit(0,0);
endchar;

beginchar("f",hthick#+thin#+u#+2appr#,asc_height#,
    if variant_f: desc_depth# else: 0 fi);
  "The letter f";
  italcorr asc_height#*slant+1.5u#;
  pickup circle.nib; lft x1=apprl;
  x2-x1=hthick; x3=x2; x4-x3=hround 2u;
  top y3=top y4=x_height; draw z3..z4;
  complete_f_stroke(1,2,hround 3u,true);
  square_end4(right);
  labels(3,4);
  math_fit(0,0);
endchar;

beginchar("g",8u#+2appr#,x_height#,desc_depth#); "The letter g";
  italcorr x_height#*slant-.5u#;
  if variant_g:
    numeric t;
    pickup circle.nib;
    bbcircle1(apprl,w-apprr,x_height+uo,hround 0.25h); draw last_path;
    bbbowl(z1b,z1a,z1d,hthick) last_path;
    bbbowl(z1b,z1c,z1d,hthick) last_path;
    rt x3=w-apprr+hround 0.5u; top y3=h;
    y2=0.5[y1b,y3];
    t=xpart(last_path intersectiontimes ((x1b,y2)..(x1a,y2)));
    z2=point t of last_path; slope:=-d/20u;
    lft x4l=lft x10+ho=apprl; rt x8r=w-apprr+ho;
    x4r-x4l=x8r-x8l=hround 0.5[thin,thick]; x6=x9=x1b;
    y6=0; bot y9=-d-oo; ortho_penpos6(thick,(-1,-slope));
    forsuffixes $=l,r:
      ellipse_set(bowl.bot,4$,5$,6$); ellipse_set(9,8$,7$,6$);
      draw z.bowl.bot left_to_down z4$...z5$---z7$...z8$ down_to_left z9;
    endfor;
    y10=0.6[y9,y5l];
    draw z2{-direction t of last_path}...z3{right};
    draw z9 left_to_up z10 up_to_right z5l;
    square_end3(right);
    labels(2,3,9,10); penlabels(4,5,6,7,8);
  else:
    g_bar:=true; complete_left_lower(ab_down_factor,ab_up_factor);
  fi
  math_fit(0,0);
endchar;

beginchar("h",8u#+2appr#,asc_height#,0); "The letter h";
  italcorr 0.75x_height#*slant-.5u#;
  complete_n;
  math_fit(0,0);
endchar;

beginchar("i",hthick#+thin#+2appr#,
    min(asc_height#,10/7x_height#+0.5dot_size#),0);
  "The letter i";
  if square_dots: italcorr charht*slant-.5u#;
  else: italcorr (charht-0.4dot_size#)*slant-.5u#; fi
  center_bar(1,2); x1=x3=x5; x2=x4=x5';
  bot y1=bot y2=0; top y3=top y4=x_height;
  top y5'=h; bot y5=h-dot_size; dot(5,5');
  pickup square.nib; draw z1--z2--z4--z3--cycle;
  labels(1,2,3,4);
  math_fit(0,0);
endchar;

beginchar("j",hthick#+thin#+2appr#,
    min(asc_height#,10/7x_height#+0.5dot_size#),desc_depth#);
  "The letter j";
  if square_dots: italcorr charht*slant-.5u#;
  else: italcorr (charht-0.4dot_size#)*slant-.5u#; fi
  pickup circle.nib;
  y1=0; top y2=top y3=x_height;
  rt x1=rt x2=w-apprr; x2-x3=hthick;
  x5'=x2; x3=x5; top y5'=h; bot y5=h-dot_size;
  draw z2..j_curve1(4,x3,true); draw z3..z4;
  dot(5,5'); pickup square.nib; draw z2..z3;
  labels(1,2,3,4);
  math_fit(0,0);
endchar;

beginchar("k",9u#+2appr#,asc_height#,0); "The letter k";
  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=x_height; y5=0.4*x_height;
  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=(1[x3,x4],x_height);
  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("l",hthick#+thin#+2appr#,asc_height#,0); "The letter l";
  italcorr asc_height#*slant-.5u#;
  center_bar(1,2); x1=x3; x2=x4;
  bot y1=bot y2=0; top y3=top y4=h; pickup square.nib;
  draw z1--z2--z4--z3--cycle; labels(1,2,3,4);
  math_fit(0,0);
endchar;

beginchar("m",16u#-hthick#-thin#+2appr#,x_height#,0); "The letter m";
  italcorr 0.75x_height#*slant-.5u#;
  if hmn_factor > 0 :
    center_bar(0,8);
    bot y1=0; y0=y1=y2=y8=y12; top y3=top y4=h;
    top y6=top y10=h+oo; y11=0.3[y10,y12];
    y5=y9=hmn_factor[y4,y2]; y7=max(y9,y11);
    lft x1=lft x3=apprl; rt x11=rt x12=w-apprr;
    x7=x8=x9; x2=x4=x5=x1+hthick;
    x6=0.5[x5,x7]; x10=0.5[x9,x11];
    tmp_path:=z5 up_to_right z6 right_to_down z7..z8;
    tmpp_path:=z9 up_to_right z10 right_to_down z11..z12;
    draw tmp_path; draw tmpp_path;
    hbbowl(z6,z7,z8,hthick) tmp_path;
    hbbowl(z10,z11,z12,hthick) tmpp_path;
    pickup square.nib; draw z1--z2--z4--z3--cycle;
    draw z0..z8; draw z12..z.bowl.bot;
    labels(1,2,3,4,5,6,7,8,9,10,11,12);
  else:
    center_bar(8,11); x8=x9; x10=x11;
    bot y1=0; y1=y2=y7=y9=y10; top y3=h;
    y3=y4=y5=y8=y11; y6=0.7[y7,y5];
    lft x1=lft x3=apprl; rt x6=rt x7=w-apprr;
    x5=0.5[x11,x6]; x2-x1=x4-x3=hthick;
    tmp_path:=z3..z5 right_to_down z6..z7;
    draw tmp_path;
    hbbowl(z5,z6,z7,hthick) tmp_path;
    draw z8..z9; draw z10..z11;
    pickup square.nib; draw z4--z2--z1--z3; draw z9..z10;
    draw z7..z.bowl.bot; labels(1,2,3,4,5,6,7,8,9,10,11);
  fi
  math_fit(0,0);
endchar;

beginchar("n",8u#+2appr#,x_height#,0); "The letter n";
  italcorr 0.75x_height#*slant-.5u#;
  complete_n;
  math_fit(0,0);
endchar;

beginchar("o",8u#+2appr#,x_height#,0); "The letter o";
  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;

beginchar("p",8u#+2appr#,x_height#,desc_depth#); "The letter p";
  italcorr 0.6x_height#*slant+ho#-.5u#;
  complete_right_lower(ab_down_factor,ab_up_factor);
  math_fit(0,0);
endchar;

beginchar("q",8u#+2appr#,x_height#,desc_depth#); "The letter q";
  italcorr x_height#*slant-.5u#;
  complete_left_lower(ab_down_factor,ab_up_factor);
  math_fit(0,0);
endchar;

beginchar("r",5.5u#+2appr#,x_height#,0); "The letter r";
  italcorr x_height#*slant+.5u#;
  pickup circle.nib;
  lft x1=lft x3=apprl; x5=x2=x4=x1+hthick;
  bot y1=bot y2=0; top y3=h; y3=y4=y6=y7;
  rt x7=hround(w-apprr+u);
  x6=0.15[x7,x2]; y5=0.3[y2,y4];
  draw z5 up_to_right z6..z7;
  pickup square.nib; draw z1--z2--z4--z3--cycle;
  square_end7(right);
  labels(1,2,3,4,5,6,7);
  math_fit(0,0);
endchar;

beginchar("s",7u#+2appr#,x_height#,0);
  "The letter s";
  italcorr x_height#*slant+ho#-1.1u#;
  pickup circle.nib;
  slope:=-h/24u; 
  y5=0.52[y8,y2]; top y2=h+uo; bot y8=-oo;
  y2-y1=vround 0.12h; y9-y8=vround 0.175h;
  lft x3l=lft x9-(0.5thin*(sqrt2-1))=apprl-ho;
  rt x7r=w-apprr+ho; x7r-x1=hround 0.6u+(0.5thin*(sqrt2-1));
  x2=x5=x8=0.5[apprl,w-apprr];
  x3r-x3l=x7r-x7l=hround 0.5[thin,ess];
  ortho_penpos5(ess,(-1,-slope));
  forsuffixes $=r,l:
    ellipse_set(2,3.$,4.$,5.$); ellipse_set(8,7.$,6.$,5.$);
  endfor
  z1'-z1=(z2-z1)xscaled 1/3; z9-z9'=(z9-z8)xscaled 0.3;
  draw z1{z1'-z1}...z2 left_to_down z3l...z4l
  ---z6l...z7l down_to_left z8;
  draw z2 left_to_down z3r...z4r
  ---z6r...z7r down_to_left z8...{z9-z9'}z9;
  square_end1(z1-z1'); square_end9(z9-z9');
  labels(1,1',2,8,9,9'); penlabels(3,4,5,6,7);
  math_fit(0,0);
endchar;

beginchar("t",6u#+2appr#,min(asc_height#,10/7x_height#),0);
  "The letter t";
  italcorr x_height#*slant-0.5thin#-.5u#;
  pickup circle.nib;
  % the "t" part
  rt x1=rt x2=w-apprr; x3=0.5[x2,x4];
  lft x4=lft x5=apprl; rt x7=floor x1;
  top y6=top y7=x_height; bot y3=-oo;
  top y5=h; y2=y4=0.3[y3,y6];
  top y1=max(vround 0.42x_height,top y2);
  tmp_path:=z1..z2 down_to_left z3 left_to_up z4..z5;
  draw tmp_path;
  hbbowl(z3,z4,z5,hthick) tmp_path;
  x6=rt x.bowl.mid;
  pickup square.nib;
  draw z6..z7; draw z5..z.bowl.bot;
  square_end1(up);
  labels(1,2,3,4,5,6,7);
  math_fit(0,0);
endchar;

beginchar("u",8u#+2appr#,x_height#,0); "The letter u";
  italcorr x_height#*slant-.5u#;
  complete_u(uy_factor);
  math_fit(0,0);
endchar;

beginchar("v",7.6u#+2appr#,x_height#,0); "The letter v";
  italcorr x_height#*slant;
  complete_AV(-1,apprl-0.5u,w-apprr+0.5u);
  math_fit(0,0);
endchar;

beginchar("w",13u#+2appr#,x_height#,0); "The letter w";
  italcorr x_height#*slant-0.5u#;% not perfect...
  pickup circle.nib; 
  x1=apprl; x12=w-apprr; x6=x7=0.5[x1,x12];
  x5-x2=hthick; x2-x1=x7-x5=x8-x7=x12-x11;
  y1=y3=y6=y7=y9=y12=h; y2=y5=y8=y11=bot y4a=0;
  a:=diag_width(1,z1-z2);
  penpos1(thin*a,0); penpos2(thin*a,0); penpos3(thin*a,0);
  penpos8(thin*a,0); penpos9(thin*a,0);
  x3-x1=x9-x7=thick*a;
  z4a-z3=z10a-z9=whatever*(z2-z1);
  z4=whatever[z3,z4a]; z10=whatever[z9,z10a];
  if x4a>x5: z4=whatever[z5,z6]; z10=whatever[z11,z12];
  else: bot y4=bot y10=0; fi
  ortho_penpos4(thin,z3-z4a); ortho_penpos10(thin,z9-z10a);
  a:=diag_width(thin,z6-z5);
  penpos5(a,0); penpos11(a,0); penpos12(a,0);
  z6-z6l=z5-z5l; z7r-z7=z8r-z8;
  z6r=whatever[z7,z8]; z6r-z5r=whatever*(z6-z5);
  z7l=whatever[z5,z6]; z7l-z8l=whatever*(z7-z8);
  y1-y1a=thin; z1a=whatever[z1,z2];
  z1-z1a=z2a-z2=z3-z3a=z7-z7a=z8a-z8=z9-z9a;
  y5a-y5=thin; z5a=whatever[z5,z6];
  z5a-z5=z11a-z11;
  penstroke z1e..z2e; penstroke z3e..z4e;
  penstroke z9e..z10e; penstroke z11e..z12e;
  fill z5r--z5l--z6l--z6--z6r--cycle;
  fill z8r--z8l--z7l--z7--z7r--cycle;
  fill z1--z3--z3a--z1a--cycle; fill z2--z5--z5a--z2a--cycle;
  fill z7--z9--z9a--z7a--cycle; fill z8--z11--z11a--z8a--cycle;
  penlabels(1,2,3,4,5,6,7,8,9,10,11,12);
  labels(1a,2a,3a,4a,5a,8a,9a,10a,11a);
  math_fit(0,0);
endchar;

beginchar("x",8.8u#+2appr#,x_height#,0); "The letter x";
  italcorr x_height#*slant-0.5u#;
  complete_X(0.3u);
  math_fit(0,0);
endchar;

beginchar("y",8u#+2appr#,x_height#,desc_depth#); "The letter y";
  italcorr x_height#*slant-.5u#;
  if variant_y: y1=y3=y4=h; y5=0; y2=-d;
    x3=apprl; x1=w-apprr; x5=0.5[x3,x1];
    z2=whatever[z1,z5];
    a:=diag_width(1,z3-z5); x4-x3=a*thick;
    penpos3(thin*a,0); penpos4(thin*a,0);
    penpos1(diag_width(thin,z1-z2),0);
    penpos2(diag_width(thin,z1-z2),0);
    z6=whatever[z1,z2]; z6-z4=whatever*(z5-z3);
    y3-y3a=thin; z3a-z3=z4a-z4=whatever*(z5-z3);
    z5l=whatever[z1,z2]; z5l-z3l=whatever*(z5-z3);
    z6r-z6=z6-z6l=z5r-z5=z5-z5l;
    penstroke z1e..z2e; penstroke z3e..z5e; penstroke z4e..z6e;
    fill z3--z4--z4a--z3a--cycle;
    penlabels(1,2,3,4,5,6); labels(3a,4a);
  else: g_bar:=true; complete_u(uy_factor);
  fi
  math_fit(0,0);
endchar;

beginchar("z",7.6u#+2appr#,x_height#,0); "The letter z";
  italcorr x_height#*slant-.5u#;
  pickup circle.nib;
  z1l=(apprl-hround 0.15u,0); z2l=(w-apprr+hround 0.1u,0);
  z3r=(apprl,h); z4r=(w-apprr,h);
  penpos1(thin,90); penpos2(thin,90);
  penpos3(thin,90); penpos4(thin,90);
  z5l=z1r; z8r=z4l;
  adjust_slanted_bar(5l,8r,6r,7l)(thick+thin,-1);
  a:=diag_width(thin,z8r-z6r);
  penpos5(a,0); penpos6(a,0); penpos7(a,0); penpos8(a,0);
  penstroke z1e..z2e; penstroke z3e..z4e;
  penstroke z5e..z7e; penstroke z6e..z8e; 
  penlabels(1,2,3,4,5,6,7,8);
  math_fit(0,0);
endchar;

iff known bbdotless_i:
beginchar(bbdotless_i,max(hthick#+thin#,4u#)+2appr#,x_height#,0);
  "The dotless i";
  italcorr x_height#*slant-.5u#;% to be corrected ? answer: no.
  pickup circle.nib; center_bar(1,2); x1=x3; x2=x4;
  bot y1=bot y2=0; top y3=top y4=h; pickup square.nib;
  draw z1--z2--z4--z3--cycle; labels(1,2,3,4);
  math_fit(0,0);
endchar;

iff known bbdotless_j:
beginchar(bbdotless_j,max(hthick#+thin#,4u#)+2appr#,
    x_height#,desc_depth#);
  "The dotless j";
  italcorr x_height#*slant-.5u#;% to be corrected ? answer: no.
  pickup circle.nib;
  center_bar(3,2); x1=x2; y1=0; top y2=top y3=h;
  draw z2..j_curve1(4,x3,true); draw z3..z4;
  pickup square.nib; draw z2..z3;
  labels(1,2,3,4);
  math_fit(0,0);
endchar;