%% This file is public domain.
%% Originally written 1990, Alan Hoenig.
%% Notice added by Clea F. Rees 2010/12/13 following correspondence between Alan Hoenig and Karl Berry.

% Program files for formal Computer Duerer fonts.
% Modified 24-July-1990 DAH: Split lines longer than 80 columns
%%
def checkthin=
if thin-currentbreadth<eps: thin:=currentbreadth+eps; fi; 
if thin-currentbreadth<eps: thin:=currentbreadth+eps; fi enddef;
 
numeric P_width#; P_width#=cap_jut#+3thick#+1/4side#-thin#;
define_pixels(P_width); 
 
pair xeps, yeps; xeps=(eps,0); yeps=(0,eps);
numeric tail_corr; tail_corr=1/8; 
numeric cap_jut_factor; cap_jut_factor=8/7;
 
cmchar "The letter A";
beginchar("A", 2u#+2cap_jut#+.8side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#);
top y3=top y2=h if not monospace: + apex_o fi;
numeric alpha[]; alpha1=((h+cap_jut)++(w/2))/(h+cap_jut);
penpos1(alpha1*thin,0); penpos2(alpha1*thin,0); 
penpos3(alpha1*thick,0); penpos4(alpha1*thick,0);
lft x1l=cap_jut_factor*cap_jut+.5u; rt x4r=w-x1l; 
bot y1=bot y4=0 if monospace: +1/2 crisp fi;
x3r=x2l+apex_corr; hround(w/2)=.5[x2,x3];
z0=whatever[z1r,z2r]=whatever[z3l,z4l];
fill z0--diag_end(0,4l,1,1,4r,3r)--z3r..z2l--diag_end(2l,1l,1,1,1r,0)
  --z0..cycle;  % diagonals
top y5r=top y6r=hround(h/2); top y5r-bot y5l=top y6r-bot y6l=thin;
penpos5(whatever, angle(z2-z1)); penpos6(whatever, angle(z3-z4));
z5=whatever[z1,z2]; z6=whatever[z3,z4];
penstroke z5e--z6e; % bar line
pickup tiny.nib;
numeric top_bar; top_bar=top y5r-bot y6l;
if monospace: pickup pencircle scaled 0pt; 
 pos11(top_bar,90); pos12(top_bar,90);
 top y11r=top y12r=h; w/2=.5[x11,x12]; x12-x11=apex_corr+2cap_jut;
 fill z11l--z12l{right}..tension atleast.95..{left}z12r--z11r{left}..
 tension atleast.95..{right}cycle; 
 penlabels(11,12); fi
if serifs: bracket:=10/7 bracket; cap_jut:=cap_jut_factor*cap_jut;
 pickup tiny.nib; numeric jut_factor; 
 if monospace: jut_factor:=1; else: jut_factor:=3/4; fi
 % Durer called for a |jut_factor| of |1/2|, but this gives a too-puny
 % inner serif.
 serif(1,2,a,.8serif_darkness,-cap_jut);serif(4,3,d,.8serif_darkness, cap_jut); 
 bracket:=jut_factor*bracket; if monospace: jut_factor:=.6; fi
 serif(1,2,b,7/8 serif_darkness,jut_factor*cap_jut); 
 serif(4,3,c,7/8 serif_darkness,-jut_factor*cap_jut);
 fi
penlabels(0,1,2,3,4,5,6); endchar;
 
cmchar "The letter B";
beginchar("B",u#+cap_jut#+4thick#+1/4 side#-thin#, cap_height#, 0);
adjust_fit(cap_serif_fit#,0); pickup tiny.nib;
pos1(thick,0); pos2(thick,0); lft x1l=lft x2l=.5u+cap_jut;
 bot y2=0; top y1=h; filldraw stroke z1e--z2e; % vertical stem
pos3(thin,-90); pos5(thick,0); pos7(thin,90);
z3r=z2; y4l=y3l; x4l=x3l+thick; y4r=y3r; x4r=x4l+thick-1/2thin; z4=.5[z4l,z4r];
y7l=h/2; x7l=x1; y6l=y7l; x6l=x4l; top y6r-bot y6l=thin; x6r=x4r; 
z6=.5[z6r,z6l];
rt x5r=hround(w-.5u); y5=.5[y4r,y6r];
filldraw stroke z3e--z4e..pulled_arc.e(4,5)&pulled_arc.e(5,6)..z6e--z7e;
 % bottom lobe
pos7'(thin,-90); pos8(thick,0); pos10(thin,90);
z7'=z7; z6'=z6; x6'r=x4r; x6'l=x4l; y6'r=y7'r; y6'l=y7'l;
z10r=z1; x9r=x6'r; x9l=x6'l; y9r=y10r; top y9r-bot y9l=thin; z9=.5[z9r,z9l];
rt x8r=lft x5l; y8=.5[y6r,y9r];
filldraw stroke z7'e--z6'e..pulled_arc.e(6',8)&pulled_arc.e(8,9)
 ..z9e--z10e; % upper lobe
if serifs: serif(1,2,a, serif_darkness,-cap_jut); 
  serif(2,1,b,serif_darkness,-cap_jut);
 numeric tempa_, tempb_; tempa_=slab; tempb_=bracket;
 slab:=thin; bracket:=2/3cap_jut; serif(2,1,c,serif_darkness,2/3cap_jut); 
 slab:=tempa_; bracket:=tempb_; fi
penlabels(1,2,3,4,5,6,7,8,9,10,11,12); 
penlabels(6',7'); endchar;
 
cmchar "The letter C";
beginchar("C",2u#+.9side#, cap_height#, 0);  
adjust_fit(0, 0); if monospace: pickup fine.nib; else: pickup tiny.nib;fi
numeric alpha; alpha=w-u-thick;    
pos2(thin, 90); x2=.5[x3r,x0r]; top y2r=h+o;% topmost pen position
pos3(thick,180); lft z3r=(u,h/2);
pos4(thin, 270); x4=x2; bot y4r=-o;
pos0(thick,0); lft z0l=(w+thick-u,h/2); 
path p, p', line.u, line.b; line.u=(alpha,1.5h)--(alpha,h/2); 
 line.b=(.5[alpha,x0],0)--(.5[alpha,x0],h/2);
p=pulled_arc.r(0,2)&pulled_arc.r(2,3)&pulled_arc.r(3,4)
  &pulled_arc.r(4,0)&cycle;
p'=pulled_arc.l(0,2)&pulled_arc.l(2,3)&pulled_arc.l(3,4)
  &pulled_arc.l(4,0)&cycle;
z'1l=line.u intersectionpoint p'; z'1r=line.u intersectionpoint p; 
bot rt z1l=z'1l; top rt z1r=z'1r; z1=.5[z1l,z1r];
z'5l=line.b intersectionpoint p'; z'5r=line.b intersectionpoint p;
top rt z5l=z'5l; bot rt z5r=z'5r; z5=.5[z5r, z5l];
if not monospace: x1l:=x1l+.6thin; y1l:=y1r-1.75thick-2tiny;
 y5r:=y5r-o; y5l:=2thick+y5r-2tiny; fi
if monospace: x1:=x1l:=x1r:=x5; y1:=y1-thin; y1l:=y1l-thin; y1r:=y1r-.6thin; fi
 % readjust to have a better opening in CDTT
numeric slope_factor; if monospace:slope_factor=4/3; else:slope_factor=3/4; fi
filldraw 
 z1r{-1,slope_factor}...{left}z2r..pulled_arc.r(2,3)&
 pulled_arc.r(3,4)..{right}z4r..tension 0.9..z5r--
 reverse
  (z1l..tension 0.9..{left}z2l..pulled_arc.l(2,3)&pulled_arc.l(3,4)..{right}z4l
  ..tension 0.9..z5l)
 ..(z1l+(eps,0))--(z1r+(eps,0))..cycle;
penlabels(0,1,2,3,4,5); endchar;
 
cmchar "The letter D";
beginchar("D", cap_jut#+.9side#+u#, cap_height#, 0);
adjust_fit(cap_serif_fit#,0);
pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0);
lft x1l=.5u+cap_jut; x2=x1; bot y2=0; top y1=h; 
filldraw stroke z1e--z2e; % stem
pos3(thin, 90); pos5(thick, 0); pos7(thin, -90);
x3=x7=x1; top y3r=h; bot y7r=0; 
y5=good.y h/2; rt x5r=good.x (w-.5u);
if not monospace: x4r=x6r=hround(w/2); top y4r=h; bot y6r=0; 
  bot y4l=vround(h-thin); top y6l=vround thin; 
  x4l=x6l;  2(lft x5l-x4l)=y4l-y6l;
  z4=.5[z4l, z4r]; z6=.5[z6l, z6r];
  else: pos4(thin,90); pos6(thin,-90); x4=x6=hround w/2; top y4r=h; bot y6r=0; 
fi
filldraw stroke z3e{right}...pulled_super_arc.e(4,5,eta)&
  pulled_super_arc.e(5,6,eta)...{left}z7e; % lobe
if serifs: serif(1, 2, a, serif_darkness, -cap_jut); 
           serif(2, 1, b, serif_darkness, -cap_jut);
  if not monospace: numeric temp_; temp_=slab; slab:=thin; 
    serif(2, 1, c, serif_darkness, cap_jut); slab:=temp_; fi fi
penlabels(1,2,3,4,5,6,7); endchar;
 
cmchar "The letter E";
numeric topbar_; if monospace: topbar_=11/15; 
  else: topbar_=17/30; fi % Duerer's wierd value
beginchar("E", hstretch*(topbar_+1/6)*side#+u#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); 
pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0);
lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % stem
pickup crisp.nib; % prepare for arms and serifs
pos3(thin,90); pos4(dslab,0); 
x1=x3; top y3r=h; rt x4l=topbar_*side; 
 bot y4=vround(h-if monospace: 2 fi vstretch*thick);
arm(3,4,d,serif_darkness,0); % top arm and beak
pos5(thin,-90); pos0(thin,90); pos6(dslab,0); pos7(dslab,0);
x5=x0=x1; y5=y0=hround(h/2); rt x6r=rt x7r=max(x4l-hstretch*thick,rt 
x1r+1/5side);
top y6-bot y7=2vstretch*jut; y5=.5[y6,y7];
arm(5,6,e,eta,0); arm(0,7,f,eta,0);  % middle arms and beaks
pos8(thin,-90); pos9(dslab,0); x8=x2; bot y8r=0; rt x9r=hround(w-.5u);
y9=y8r+thin+vstretch*1/6side; 
foot(8,9,g,serif_darkness,x9-x4-thick); % lower arm 
if serifs: serif(1,2,a,serif_darkness,-cap_jut); 
           serif(2,1,b,serif_darkness,-cap_jut);
  if not monospace: temp_:=slab; slab:=thin; 
    serif(2,1,c,serif_darkness,cap_jut); 
    slab:=temp_; fi fi
penlabels(0,1,2,3,4,5,6,7,8,9); endchar; % end of "E"
 
cmchar "The letter F";
numeric topbar_; if monospace: topbar_=11/15; 
  else: topbar_=17/30; fi % Duerer's wierd value
beginchar("F", hstretch*(topbar_+1/6)*side#-u#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); 
pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0);
lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % stem
pickup crisp.nib; % prepare for arms and serifs
pos3(thin,90); pos4(dslab,0); 
x1=x3; top y3r=h; rt x4l=topbar_*side; 
 bot y4=vround(h-if monospace: 2 fi vstretch*thick);
arm(3,4,d,serif_darkness,0); % top arm and beak
pos5(thin,-90); pos0(thin,90); pos6(dslab,0); pos7(dslab,0);
x5=x0=x1; y5=y0=hround(h/2); rt x6r=rt x7r=max(x4l-hstretch*thick,rt 
x1r+1/5side);
top y6-bot y7=2vstretch*jut; y5=.5[y6,y7];
arm(5,6,e,eta,0); arm(0,7,f,eta,0);  % middle arms and beaks
if serifs: serif(1,2,a,serif_darkness,-cap_jut); 
 serif(2,1,b,serif_darkness,-cap_jut); serif(2,1,c,serif_darkness, cap_jut);
 fi
penlabels(0,1,2,3,4,5,6,7); endchar; % end of "F"
 
cmchar "The letter G";
beginchar("G",2u#+.9side#, cap_height#, 0);  
adjust_fit(0, cap_serif_fit#); 
if monospace: pickup fine.nib; else: pickup tiny.nib;fi
% This code is identical to that for the letter C.
numeric alpha; alpha=w-u-thick;    
pos2(thin, 90); x2=.5[x3r,x0r]; top y2r=h+o;% topmost pen position
pos3(thick,180); lft z3r=(u,h/2);
pos4(thin, 270); x4=x2; bot y4r=-o;
pos0(thick,0); lft z0l=(w+thick-u,h/2); 
path p, p', line.u, line.b; line.u=(alpha,1.5h)--(alpha,h/2); 
 line.b=(.5[alpha,x0],0)--(.5[alpha,x0],h/2);
p=pulled_arc.r(0,2)&pulled_arc.r(2,3)&pulled_arc.r(3,4)
  &pulled_arc.r(4,0)&cycle;
p'=pulled_arc.l(0,2)&pulled_arc.l(2,3)&pulled_arc.l(3,4)
  &pulled_arc.l(4,0)&cycle;
z'1l=line.u intersectionpoint p'; z'1r=line.u intersectionpoint p; 
bot rt z1l=z'1l; top rt z1r=z'1r; z1=.5[z1l,z1r];
z'5l=line.b intersectionpoint p'; z'5r=line.b intersectionpoint p;
top rt z5l=z'5l; bot rt z5r=z'5r; z5=.5[z5r, z5l];
if not monospace: x1l:=x1l+.6thin; y1l:=y1r-1.75thick-2tiny;
 y5r:=y5r-o; y5l:=2thick+y5r-2tiny; fi
if monospace: x1:=x1l:=x1r:=x5; y1:=y1-thin; y1l:=y1l-thin; y1r:=y1r-.6thin; fi
 % readjust to have a better opening in CDTT
numeric slope_factor; if monospace:slope_factor=4/3; else:slope_factor=3/4; fi
% Addtional G work (preceding program is the same as that for letter C)!
path p,p',line.o, line.i;
p=z1r{-1,slope_factor}..{left}pulled_arc.r(2,3)&
 pulled_arc.r(3,4){right}..tension 0.9..z5r;
p'= reverse
  (z1l..tension 0.9..{left}pulled_arc.l(2,3)&pulled_arc.l(3,4){right}
  ..tension 0.9..z5l);
pos7(thick,0); 
top rt z7r=(w-0u-cap_jut,.9h/2);
numeric counter; counter=0;
forever: 
 counter:=counter+1;
 line.o:=z7r--(x7r,-2o); line.i:=(z7r-(thick,0))--(x7r-thick,-2o);
 numeric t[],tt[];
 (t1,tt1)=p intersectiontimes line.o; (t2,tt2)=p' intersectiontimes line.i;
 exitif t1*t2>0; forsuffixes $$=l, r: x7$$:=x7$$-.1u; endfor 
 x7:=x7-.1u; endfor 
x6r=x7r; x6l=x7l; bot y6r=ypart point t1 of p; bot y6l=ypart point t2 of p';
z6=.5[z6r,z6l];
p:= subpath(0,t1) of p..(z6r-xeps+yeps)--(z6l+xeps+yeps)..
 subpath(t2,infinity) of p'..(z1l+xeps)--cycle; 
filldraw p;
filldraw z6l--z7l--z7r--z6r--cycle;
if serifs: serif(7,6,a,serif_darkness,-cap_jut); 
 serif(7,6,b,serif_darkness, cap_jut); fi
penlabels(0,1,2,3,4,5,6,7); endchar;
 
cmchar "The letter H";
beginchar("H", u#+2cap_jut#+.8side#, cap_height#,0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
forsuffixes t=1,2,3,4: pos.t(thick,0); endfor
lft x1l=lft x2l=.5u+cap_jut; bot y2=0; top y1=h;
filldraw stroke z1e--z2e; % left vertical stem
x3=x4=w-x1; y3=y1; y4=y2; 
filldraw stroke z3e--z4e; % right vertical stem
pos5(thin, 90); pos6(thin,90);
x5=.5[x1r,x1l]; x6=w-x5; top y5r=top y6r=h/2;
filldraw stroke z5e--z6e; % horizontal crossbar
if serifs: 
 serif(1,2,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,cap_jut); 
 serif(2,1,c,serif_darkness,-cap_jut); serif(2,1,d,serif_darkness,cap_jut); 
 serif(3,4,e,serif_darkness,-cap_jut); serif(3,4,f,serif_darkness,cap_jut); 
 serif(4,3,g,serif_darkness,-cap_jut); serif(4,3,h,serif_darkness,cap_jut); fi
labels(1,2,3,4,5,6); endchar;
 
cmchar "The letter I";
beginchar("I", .5u#+2cap_jut#+cap_stem#+.5u#, cap_height#,0);
adjust_fit(cap_serif_fit#, cap_serif_fit#);
pickup tiny.nib; checkthin; pos1(cap_stem,0); pos2(cap_stem,0);
x1=x2=hround(w/2); top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % vertical stem
if serifs: 
  serif(1, 2, a, serif_darkness, -cap_jut); 
  serif(1, 2, b, serif_darkness, cap_jut); % top lft,rt
  serif(2, 1, c, serif_darkness, -cap_jut); 
  serif(2, 1, d, serif_darkness, cap_jut); % bot lft,rt
fi
penlabels(1, 2); endchar;
 
cmchar "The letter J";
beginchar("J",u#+3thick#+cap_jut#,cap_height#, 1/4 cap_height#);
adjust_fit(0, cap_serif_fit#); pickup tiny.nib;
pos1(thick,0); pos2(thick,0); pos3(thin, -90);
top y1=h; rt x1r=w-.5u-cap_jut; x2=x1; bot y2=0; lft x3=.5u; bot y3r=-d;
filldraw stroke z1e--z2e{down}..{left}z3e;
if serifs: serif(1,2,a,serif_darkness,-cap_jut);
 serif(1,2,b,serif_darkness,cap_jut); fi
penlabels(1,2,3); endchar;
 
cmchar "The letter K";
beginchar("K", 3/2u#+cap_jut#+.9side#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); pickup tiny.nib;
pair durer[]; % represent D\"urer's corner points
durer1=(.5u,h); durer2=(w-u,h); durer3=(xpart durer1,0); 
 durer4=(xpart durer2,0);
numeric diag_angle[]; diag_angle1=angle(durer2-durer3);
diag_angle2=angle(durer1-durer4);
numeric alpha; alpha=((xpart durer2 - xpart durer1)++h)/h;
pos1(thick,0); pos2(thick,0); lft x1l=lft x2l=.5u+cap_jut;
 top y1=h; bot y2=0; filldraw stroke z1e--z2e; % left stem
pos3(alpha*thin,0); pos4(alpha*thin,0); rt x4r=rt x1r; y4=h/2;
top y3=h; z3r-z4r=whatever*(durer2-durer3);
z0=whatever[z1r,z2r]=whatever[z3l,z4l]; 
filldraw z0--z3l--z3r--z4r--cycle; % upper diagonal stroke
pos5(thick,diag_angle1); z5=whatever[z3,z4]; 
z0-z5l=whatever*(durer1-durer4);
numeric nibs; nibs=.5thin;
if monospace or not serifs: nibs:=thin; fi
pos6(nibs,90); bot rt z6l=durer4;
z5l-z7l=whatever*(durer1-durer4); z.g=(xpart durer2-thin,h/2);
z.g-z7l=whatever*(durer2-durer3);
z.h=(xpart durer2, h/4); 
if monospace or not serifs: z.g else: z.h fi-z7r=whatever*(durer2-durer3);
z5r-z7r=whatever*(durer1-durer4);
if serifs or not monospace: % reset x7 if necessary
 if (x7r-x1l)/(x6-x1l)>.82: numeric temp; temp=x7r; x7r:=.82*(x6-x1l)+x1l;
  temp:=temp-x7r; x7l:=x7l-temp; fi fi %!!!Bug--Missing fi on this line.
filldraw z5r--z5l--z7l{z7l-z5l}..{right}z6l--z6r{left}..{durer1-durer4}z7r
 --cycle;
if serifs: 
 numeric old_jut, old_brack; old_jut=cap_jut; old_brack=bracket;
 serif(1,2,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,cap_jut); 
 serif(2,1,c,serif_darkness,-cap_jut); serif(2,1,d,serif_darkness,cap_jut);
 bracket:=.5old_brack;cap_jut:=.5old_jut;
 if not monospace: serif(3,4,e,serif_darkness,-cap_jut); fi
 bracket:=2old_brack; cap_jut:=2old_jut; 
  serif(3,4,f,.6serif_darkness,if monospace:.7 fi cap_jut);
 cap_jut:=old_jut; bracket:=old_brack;
 fi
penlabels(0,1,2,3,4,5,6,7); endchar;
 
cmchar "The letter L";
numeric topbar_; if monospace: topbar_=11/15; 
  else: topbar_=17/30; fi % Duerer's wierd value
beginchar("L", hstretch*(topbar_+1/6)*side#+u#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); 
pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0);
lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % stem
pickup crisp.nib; % prepare for arms and serifs
pos3(thin,90); pos4(dslab,0); 
rt x4l=topbar_*side; bot y4=vround(h-vstretch*thick);
pos8(thin,-90); pos9(dslab,0); x8=x2; bot y8r=0; rt x9r=hround(w-.5u);
y9=y8r+thin+vstretch*1/6side; foot(8,9,g,serif_darkness,x9-x4-thick); 
  % lower arm 
if serifs: serif(1,2,a,serif_darkness,-cap_jut); 
 serif(2,1,b,serif_darkness,-cap_jut); serif(1,2,d,serif_darkness,cap_jut);
 if not monospace: temp_:=slab; slab:=thin; 
  serif(2,1,c,serif_darkness,cap_jut); 
  slab:=temp_; fi fi
penlabels(0,1,2,3,4,5,6,7,8,9); endchar; % end of "L"
 
cmchar"The letter M";
beginchar("M", u#+2cap_jut#+.8side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
pos1(thin,0); pos2(thin,0); lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0;
pos3(thick,0); pos4(thick,0); x3r=x4r=w-x1l; top y3=h; bot y4=0;
filldraw stroke z1e--z2e; % left vertical stem
filldraw stroke z3e--z4e; % right vertical stem
numeric long, short, hypot, alpha; long=h-bracket; short=w/2-thin-cap_jut;
hypot=long++short; alpha=hypot/long;
pos5(alpha*thick,0); pos6(alpha*thick,0);
z5l=z1l; bot lft z6l=(w/2-.5currentbreadth,if not monospace:0 else:h/3 fi); 
pos7(alpha*thin,0); pos8(alpha*thin,0); 
z6l=z7r; z8l=z3l; z0=whatever[z5r,z6r]=whatever[z7l,z8l];
filldraw z5r--z0--z8l--z8r--z6l--z5l--cycle;
if serifs: 
 serif(2,1,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,-cap_jut); 
  % left serifs
 serif(3,4,c,serif_darkness, cap_jut); serif(4,3,d,serif_darkness, cap_jut); 
  % right serifs
 serif(2,1,e,serif_darkness,cap_jut); serif(4,3,f,serif_darkness,-cap_jut);
  % lower, inner serifs
 fi
penlabels(0,1,2,3,4,5,6,7,8); endchar;
 
cmchar "The letter N";
beginchar("N", u#+2cap_jut#+.8side#, cap_height#,0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
numeric long, short, hypot, alpha; long=h; short=side-2cap_jut;
hypot=long++short; alpha=hypot/long;
pos1(thin,0); pos2(thin,0); lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0;
pos3(thin,0); pos4(thin,0); x3=x4; x3r=w-x1l; y3=y1; y4=y2-o;
pos 5(alpha*thick,0); pos6(alpha*thick,0);
z5r=z1r; z6l=z4r; z0=whatever[z1r,z2r]=whatever[z5l,z6l]; % under notch point
z0'=whatever[z5r,z6r]=whatever[z3l,z4l];
filldraw z1r--z1l--z2l--z2r--z0--z6l--z3r--z3l--z0'--cycle;
if serifs: 
 serif(2,1,b,serif_darkness,-cap_jut); serif(2,1,c,serif_darkness,cap_jut);
  % bottom, left serifs
 serif(3,4,d,serif_darkness,-cap_jut);serif(3,4,e,serif_darkness,cap_jut);
  % top right serifs
 z.a=(x1l-1.5cap_jut,y1); pickup tiny.nib; filldraw 
  z0{z0-z4r}..{left}(z.a-(0,eps))..z.a--z1r--cycle;
  fi
penlabels(0,0',1,2,3,4,5,6); endchar;
 
cmchar "The letter O";
beginchar("O", 2u#+side#, cap_height#, 0);
adjust_fit(0,0); pair durer[];
x2r=u; x4r=w-u; y1r=h+o; y3r=-o; z0=(w/2,h/2);
z0=.5[z5,z6]; numeric axis_angle;
durer1=(x2r,y1r-o); durer2=(x4r, ypart durer1);
durer3=(xpart durer1, y3r+o); durer4=(xpart durer2, ypart durer3);
axis_angle=angle(durer2-durer3);
z5-z6=(thick,0)rotated axis_angle;
y2r=y6; y4r=y5; x1r=x5; x3r=x6;
forsuffixes $=1,2,3,4: z$=.5[z$l,z$r]; endfor
x1l=x3r; y1l-y6=y6-y3r; x5-x2l=x4r-x5; y2l=y4r;
x3l=x1r; y1r-y5=y5-y3l; x4l-x6=x6-x2r; y4l=y2r;
path p,p';
p=pulled_arc.r(1,2)&reverse pulled_arc.r(3,2)&
  pulled_arc.r(3,4)&reverse pulled_arc.r(1,4)&cycle;
path anti_diag; anti_diag=z0--durer1;
z21r=p intersectionpoint anti_diag; penpos21(thin, axis_angle+90);
x43r=w-x21r; y43r=h-y21r; penpos43(thin, axis_angle+270);
path diag; diag=z0--durer2;
z41r=diag intersectionpoint p; penpos41(thick, axis_angle);
x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180);
if not monospace: p'=
  z1l{left}..z21l..z2l{down}..z32l..
  z3l{right}..z43l..
  z4l{up}..z41l..{left}cycle;
 else:p'=z1l..z21l..z32l..z3l..z43l..z41l..cycle; fi
fill p; unfill p';
penlabels(0,1,2,3,4,5,6,21,32,43,41); endchar;
 
cmchar "The letter P";
beginchar("P", 1.5u#+P_width#, cap_height#, 0);
adjust_fit(cap_serif_fit#, 0);
pickup tiny.nib; pos1(thick,0); pos2(thick,0);
top lft z1l=(.5u+cap_jut,h); bot lft z2l=(.5u+cap_jut,0);
filldraw stroke z1e--z2e; % vertical stem
pos3(thin,90); pos4(thin,90); pos5(thick,0); 
pos6(if not monospace and serifs: .5thin else:thin fi,-90); 
top y3r=top y4r=h; x3=x1; x4=x1r+thick; filldraw stroke z3e--z4e;
x6=x4; y6=hround h/2; rt x5r=hround(w-u); y5=.5[y4,y6];
y7=y6; if serifs: x7=.75[rt x1r, x6]; else: x7=x3; fi 
pos7(if not monospace and serifs:.5thin else:thin fi,-90); 
filldraw stroke pulled_super_arc.e(4,5,eta)&pulled_super_arc.e(5,6,eta)
 ..z7e; % lobe
if serifs: serif(1,2,a,serif_darkness,-cap_jut); 
 serif(2,1,b,serif_darkness,-cap_jut);
 serif(2,1,c,serif_darkness,cap_jut); fi
penlabels(1,2,3,4,5,6,7); endchar;
 
cmchar "The letter Q";
beginchar("Q", 2u#+side#, cap_height#, 0);
adjust_fit(0,0); pair durer[];
x2r=u; x4r=w-u; y1r=h+o; y3r=-o; z0=(w/2,h/2);
z0=.5[z5,z6]; numeric axis_angle;
durer1=(x2r,y1r-o); durer2=(x4r, ypart durer1);
durer3=(xpart durer1, y3r+o); durer4=(xpart durer2, ypart durer3);
axis_angle=angle(durer2-durer3);
z5-z6=(thick,0)rotated axis_angle;
y2r=y6; y4r=y5; x1r=x5; x3r=x6;
forsuffixes $=1,2,3,4: z$=.5[z$l,z$r]; endfor
x1l=x3r; y1l-y6=y6-y3r; x5-x2l=x4r-x5; y2l=y4r;
x3l=x1r; y1r-y5=y5-y3l; x4l-x6=x6-x2r; y4l=y2r;
path p,p';
p=pulled_arc.r(1,2)&reverse pulled_arc.r(3,2)&
  pulled_arc.r(3,4)&reverse pulled_arc.r(1,4)&cycle;
path anti_diag; anti_diag=z0--durer1;
z21r=p intersectionpoint anti_diag; penpos21(thin, axis_angle+90);
x43r=w-x21r; y43r=h-y21r; penpos43(thin, axis_angle+270);
path diag; diag=z0--durer2;
z41r=diag intersectionpoint p; penpos41(thick, axis_angle);
x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180);
if not monospace: p'=
  z1l{left}..z21l..z2l{down}..z32l..
  z3l{right}..z43l..
  z4l{up}..z41l..{left}cycle;
 else:p'=z1l..z21l..z32l..z3l..z43l..z41l..cycle; fi
fill p; unfill p';
% now for the tail!
numeric thick',thick''; thick'=(1-tail_corr)*thick; thick''=(1+tail_corr)*thick;
numeric tail_slope; tail_slope=-20/36; % measured from D\"urer's figure
z10r=p intersectionpoint (z0--(x4r,0));
z10l=p intersectionpoint (quartercircle rotated 180 scaled 2thick' 
 shifted z10r);
y12r-y10r=tail_slope*(x12r-x10r); x12r=4/3x4r;
numeric tail_angle; tail_angle=angle(z10r-z12r)-90;
penpos12(thick',tail_angle);
penpos11(thick'', tail_angle); z11=(x4r,0);
if not monospace:
 x14=19/8 x4r; y14=-3/8h; penpos14(max(2,eps),90);
 numeric tail_length; tail_length=x14-x10r;
 penpos13(max(2,tail_corr*thick),90); 
 x13=x14-1/9tail_length; y13=(1+.25tail_corr)*y14;
 fi
fill stroke z10.e..z11.e..z12.e if not monospace:..z13.e{right}..z14.e fi;
penlabels(0,1,2,3,4,5,6,10,11,12,13,14,15); endchar;
 
cmchar "The letter R";
beginchar("R", .5u#+max(cap_jut#+.9side#,1.5P_width#), cap_height#,0);
adjust_fit(cap_serif_fit#,0);
pickup tiny.nib; pos1(thick,0); pos2(thick,0);
top lft z1l=(.5u+cap_jut,h); bot lft z2l=(.5u+cap_jut,0);
filldraw stroke z1e--z2e; % vertical stem
pos3(thin,90); pos4(thin,90); pos5(thick,0); 
pos6(thin, -90); 
top y3r=top y4r=h; x3=x1; x4=x1r+thick; 
x6=x4; y6=hround h/2; rt x5r=hround(.5u+P_width if not monospace:
 +1/2thin fi); y5=.5[y4,y6];
y7=y6; x7=x3; pos7(thin, -90); 
filldraw stroke z3e--pulled_super_arc.e(4,5,eta)&
 pulled_super_arc.e(5,6,eta)..z7e; % lobe
numeric half_letter_width; 2half_letter_width+1/2u=w;
if serifs: half_letter_width:=half_letter_width+1/2u; 
 else: half_letter_width:=half_letter_width-1.6thin; fi
path p; p=pulled_super_arc.r(5,6,eta)..z7r;
z0r=p intersectionpoint ((half_letter_width,0)--(half_letter_width,h));
path circ_; circ_= (((halfcircle scaled 2thick) rotated 180) shifted z0r);
z0l= p intersectionpoint circ_;
if not monospace: z0'=(.45[half_letter_width,w],0); 
 else: z0'=(.42[half_letter_width,w],0); fi 
numeric tail_angle; tail_angle=angle(z0l-z0'); 
penpos8(thick, tail_angle-90); z8l=whatever[z0', z0l]; 
 x8=1/5[half_letter_width,w]; 
penpos9(2/3thick,tail_angle-90); z9r=whatever[z0r, z8r]; 
 x9r=.5[half_letter_width, w]; 
%penpos10(if monospace:1/2 fi dslab,90); z10l=(w,0); 
penpos10(if monospace:1/2 dslab else: .5thin fi,90); z10l=(w,0); 
fill z0l--z8l...{right}z10l--z10r{-w,1/4h}..z9r--z0r--cycle; % tail 
if serifs: serif(1,2,a,serif_darkness,-cap_jut); 
 serif(2,1,b,serif_darkness,-cap_jut); 
 serif(2,1,c,serif_darkness,cap_jut); fi 
penlabels(0,1,2,3,4,5,6,7,8,9,10); labels(0'); endchar;
 
cmchar "The Knuthian S";
beginchar("S", 2u#+1/2 side# if not monospace:+thick# fi, cap_height#, 0);
adjust_fit(0,0); pickup tiny.nib;
pair durer[]; % points to contain corner coords of Durer square
ypart durer3=ypart durer4=0; xpart durer4-xpart durer1=side; 
xpart durer1=u-1.5thick;
durer1=(xpart durer3, h); durer2=(xpart durer 4, ypart durer1);
numeric slope, diag_angle; diag_angle=angle(durer2-durer3);
slope=-if not monospace: 3/4 else: 1/2 fi h/(xpart durer4-xpart durer3);
pos0(thick,diag_angle); x0=.52[xpart durer1, xpart durer2];
y0=h/2;
lft x3l=u if not monospace:+2/3thick fi; rt x3r=lft x3l+5/6thick;
pos2(thin,-diag_angle); top y2l=h+o; 
if x0-x3r>thick: x2l=x0 if monospace:+.4thin fi; else:
 x2l=x0r; slope:=-1/2; fi
%if not monospace:
% if x2-rt x3r<thick: x2:=lft x3r+thick; x2l:=x2r:=x2; fi fi
ellipse_set(2l,3l,4l,0l); ellipse_set(2r,3r,4r,0r);
pos7(thin,-diag_angle); x7r=x0; bot y7r=-o; rt x6r=w-if monospace:.75 fi u; 
 lft x6l=rt x6r-thick;
ellipse_set(7l,6l,5l,0l); ellipse_set(7r,6r,5r,0r); 
pos1(max(currentbreadth+eps,5/6 thick),-90); 
top y1l=h+o-thin; rt x1=x0+2thick+o;
pos8(1.5thick,-80);lft x8r=u; bot y8r=thin-o;
if not monospace:
 filldraw z1l..z2l{left}..{down}z3l..z4l--z5l..{down}z6l..{left}z7l..z8l
 --z8r..{right}z7r..{up}z6r..z5r--z4r..{up}z3r..{right}z2r..z1r--cycle;
 else: draw z1l..z2l{left}..{down}z3l..z4l--z5l..{down}z6l..{left}z7l..z8l;
 draw z8r..{right}z7r..{up}z6r..z5r--z4r..{up}z3r..{right}z2r..z1r;
 fi
penlabels(0,1,2,3,4,5,6,7,8); endchar;
 
cmchar "The letter T";
beginchar("T",2u#+.9side#, cap_height#,0);
adjust_fit(0,0); pickup tiny.nib;
pos1(thick,0); pos2(thick,0); .5[x1r,x1l]=w/2; .5[x2r,x2l]=w/2;
top y1=h; bot y2=0; filldraw stroke z1e--z2e; % central stem
numeric alpha, stroke_angle; stroke_angle=55; 
if monospace: alpha=1; else: alpha=sqrt2; fi
if not serifs: stroke_angle:=90; alpha:=1; fi % sans-serif values
pos3(alpha*thin,stroke_angle); pos4(alpha*thin,stroke_angle); 
lft x3l=u; top y3r=h; x4r=w-x3l; y4=y3;
filldraw stroke z3e--z4e; % top horizontal
if serifs: 
 serif(2,1,a,serif_darkness,-cap_jut);serif(2,1,b,serif_darkness,cap_jut);
 T_flourish(3,4,c,.75serif_darkness,.5serif_darkness);
 T_flourish(4,3,d,.5serif_darkness,.75serif_darkness);
 fi
penlabels(1,2,3,4); endchar;
 
cmchar "The letter U";
beginchar("U", u#+2cap_jut#+.8side#, cap_height#,0);
adjust_fit(cap_serif_fit#, cap_serif_fit#);
pickup tiny.nib; pos1(thick,0); pos2(thick,0); pos2'(thick,180);
pos3(thin,-90); pos4(thin,0); pos5(thin,0);
x1=x2; x3=.5[x1,x5]; x4=x5; x1l=w-x5r;
top y1=top y5=h; y2=y4=1/3h; bot y3r=-o; z2'=z2;
lft x1l=hround .5u+cap_jut;
filldraw stroke z1e--z2e; % left stem
filldraw stroke pulled_super_arc.e(2',3,eta)
  & pulled_super_arc.e(3,4,eta)&z4e--z5e;
if serifs: serif(1,2,a,serif_darkness,-cap_jut); 
  serif(1,2,b,serif_darkness,cap_jut); 
  serif(5,4,c,serif_darkness,-cap_jut); serif(5,4,d,serif_darkness,cap_jut); fi
penlabels(1,2,3,4,5); endchar;
 
cmchar "The letter V";
beginchar("V",2cap_jut_factor*cap_jut#+.8side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
numeric alpha; alpha=((h+cap_jut)++(w/2))/(h+cap_jut);
pos1(alpha*thick,0); pos2(alpha*thick,0);
pos3(alpha*thin,0); pos4(alpha*thin,0);
top y1=top y4=h; lft x1l=cap_jut_factor*cap_jut; x4r=w-x1l;
lft x2l=hround w/2; x3r=x2l; bot y2=bot y3=-apex_o;
z0=whatever[z1r,z2r]=whatever[z3l,z4l]; % notch point
filldraw z0--diag_end(0,4l,1,1,4r,3r)--z2l
 --diag_end(2l,1l,1,1,1r,0)--cycle;
if serifs: bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
 pickup tiny.nib; numeric jut_factor;
 if monospace: jut_factor=1; else: jut_factor=3/4; fi
 serif(1,2,a,.8serif_darkness,-cap_jut); serif(4,3,d,.8serif_darkness,cap_jut);
 bracket:=jut_factor*bracket;
 serif(1,2,b,7/8 serif_darkness, jut_factor*cap_jut);
 serif(4,3,c,7/8 serif_darkness,-jut_factor*cap_jut); fi
penlabels(0,1,2,3,4); endchar;
 
cmchar "The letter W";
numeric alpha; 
 alpha=((cap_height#+cap_jut#)++(.4side#+cap_jut_factor*cap_jut#))/
            (cap_height#+cap_jut#);
beginchar("W", 2cap_jut_factor*cap_jut#+1.6side#-alpha*thick#, cap_height#, 0);
adjust_fit(.5cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
mid_corr=if monospace: -apex_corr else: 1/3jut fi;
pos1(alpha*thick,0); pos2(alpha*thick,0);
pos3(alpha*thin,0); pos4(alpha*thin,0);
pos5(alpha*thick,0); pos6(alpha*thick,0);
pos7(alpha*thin,0); pos8(alpha*thin,0);
numeric V_width; V_width=2cap_jut_factor*cap_jut+4/5side;
if not monospace:
 top y1=top y4=h; lft x1l=cap_jut_factor*cap_jut; x4r=V_width-x1l;
 lft x2l=hround V_width/2; x3r=x2l; bot y2=bot y3=-apex_o;
 pair shift_amt; ypart shift_amt=0; 
 xpart shift_amt=V_width-2cap_jut_factor*cap_jut-alpha*(thick);
 z0=whatever[z1r,z2r]=whatever[z3l,z4l]; % notch point
 path p; p=z0--diag_end(0,4l,1,1,4r,3r)--z2l
  --diag_end(2l,1l,1,1,1r,0)--cycle;
 filldraw p; filldraw (p shifted shift_amt); % the 2 V's
 forsuffixes t=1,2,3,4: z[t+4]=z.t shifted shift_amt; endfor
else: top y1=h; lft x1l=cap_jut_factor*cap_jut; bot y2=bot y3=-apex_o;
 x2l+apex_corr=x3l; 
 x8=w-x1; y8=y1; x2-x1=x4-x3=x6-x5=x8-x7;
 x6l+apex_corr=x7l; y6=y7=y2; 
 y4:=vround .6h; y5=y4; 
 x5=x4;
 y4l:=y4r:=y4; % ??
 z0 =whatever[z1r,z2r]; 
 z0'=whatever[z7l,z8l]; y0=y0'=h/9;
 z45=whatever[z3r,z4r]=whatever[z5l,z6l];
 filldraw z0--diag_end(0,4l,1,1,4r,3r)--z2l--diag_end(2l,1l,1,1,1r,0)--cycle;
 filldraw z0'--diag_end(0',8l,1,1,8r,7r)--z7l--diag_end(7l,5l,1,1,5r,0')
  --cycle; fi 
if serifs: bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
 pickup tiny.nib; numeric jut_factor;
 if monospace: jut_factor=1.8; else: jut_factor=3/4; fi
 serif(1,2,a,.8serif_darkness,-cap_jut); 
 serif(8,7,f,.8serif_darkness,cap_jut);
 if not monospace: serif(5,6,d,.8serif_darkness,cap_jut);
  serif(5,6,c,.8serif_darkness,-cap_jut); fi
 bracket:=jut_factor*bracket;
 serif(1,2,b,7/8 serif_darkness, jut_factor*cap_jut);
 serif(8,7,e,7/8 serif_darkness,-jut_factor*cap_jut); 
 fi
penlabels(0,0',1,2,3,4,5,6,7,8,45); endchar;
 
cmchar "The letter X";
beginchar("X", 2cap_jut_factor*cap_jut#+.8side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#);
numeric alpha; alpha=(h++(w-2cap_jut_factor*cap_jut))/h;
lft x1l=cap_jut_factor*cap_jut; top y1=h if monospace:-1/2 crisp fi; 
penpos1(alpha*thick, 0);
x4r=w-x1l; bot y4=0 if monospace:+1/2 crisp fi; penpos4(alpha*thick,0);
rt x2r=w-cap_jut_factor*cap_jut; y2=y1; penpos2(alpha*thin,0);
x3l=w-x2r; y3=y4; penpos3(alpha*thin,0);
fill diag_end(4r,1r,.5,1,1l,4l)--diag_end(1l,4l,.5,1,4r,1r)--cycle; %lft diag
fill diag_end(2l,3l,.5,1,3r,2r)--diag_end(3r,2r,.5,1,2l,3l)--cycle; % rt diag
if serifs: bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
 pickup tiny.nib; numeric jut_factor;
 if monospace: cap_jut:=.5cap_jut; jut_factor=1; else: jut_factor=3/4; fi
 serif(1,4,a,.8serif_darkness,-cap_jut);serif(4,1,d,.8serif_darkness,cap_jut);
 serif(2,3,f,.8serif_darkness,cap_jut);serif(3,2,g,.8serif_darkness,-cap_jut);
 bracket:=jut_factor*bracket;
 serif(1,4,b,7/8 serif_darkness,.75cap_jut);
 serif(4,1,c,7/8 serif_darkness,-.75cap_jut);
 serif(2,3,e,7/8 serif_darkness,-.75cap_jut);
 serif(3,2,h,7/8 serif_darkness,.75cap_jut); fi
penlabels(1,2,3,4); endchar;
 
cmchar "The letter Y";
beginchar("Y", 2cap_jut_factor*cap_jut#+.8side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup pencircle scaled 0pt;
numeric alpha, long, short, hypot; long=h/2; 
short=.5(w-thick)-cap_jut_factor*cap_jut;
 hypot=long++short; alpha=hypot/long;
penpos1(thick,0); lft x1l=cap_jut_factor*cap_jut if monospace:+.5tiny fi;
top y1=h if monospace:-.5tiny fi;
penpos4(thin,0); x4r=w-x1l; y4=y1;
penpos2(thick,0); penpos3(thin,0); 
penpos5(thick,0); penpos6(thick,0);
x5=x6=w/2; bot y6=0 if monospace:+.5tiny fi; 
y5=if not monospace: h/2 else:3h/8 fi;
x2l=x5l; x3r=x5r; y2=y3=if not monospace:h/2 else: 3h/8 fi;
z0=whatever[z1r, z2r]=whatever[z3l,z4l]; % notch point
fill z1l--z5l--z6l--z6r--z5r--z4r--z4l--z0--z1r--cycle;
if serifs: numeric jut_factor;
 serif(6,5,e,serif_darkness,-.7cap_jut); serif(6,5,f,serif_darkness,.7cap_jut); 
  % bottom serifs
 bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
 if monospace: cap_jut:=.5cap_jut; jut_factor=1; else: jut_factor=3/4; fi
 serif(1,2,a,serif_darkness,-.7cap_jut);serif(4,3,d,serif_darkness,.7cap_jut);
  % top, outer serifs
 bracket:=jut_factor*bracket;
 if monospace: cap_jut:=1.5cap_jut; fi
 serif(1,2,b,7/8 serif_darkness,.6cap_jut);
 serif(4,3,c,7/8 serif_darkness,-.6cap_jut); % top, inner serifs
 fi
penlabels(0,1,2,3,4,5,6); endchar; % End of "Y"
 
cmchar "The letter Z";
beginchar("Z", 2u#+.8side#, cap_height#,0);
adjust_fit(0, 0); pickup tiny.nib;
numeric alpha, long, short, hypot;
long=h; short=w-2u-thick; hypot=long++short;
alpha=hypot/long;
pos1(thin,90); pos2(thin,90); pos3(alpha*thick, 0); 
pos4(alpha*thick, 0); pos5(thin,-90); pos6(thin,-90);
rt x3r=w-u; top y3=h; x4l=w-x3r; bot y4=0;
top y1r=h; lft x1=u; y2=y1; rt x2=x3;
bot y5r=bot y6r=0; lft x5=x4; rt x6=w-u;
filldraw stroke z1e--z2e; % top bar
filldraw stroke z3e--z4e; % diagonal
filldraw stroke z5e--z6e; % bottom bar
if serifs: pickup crisp.nib; % prepare for arms and serifs
 pos7(thin, 90); pos8(dslab,180); z7=z2; lft x8r=u; 
 bot y8=h-if monospace:2 fi vstretch*thick;
 arm(7,8,a,serif_darkness,0); % upper dropped serif
 pos9(thin,-90); z9=z5; pos10(dslab,0); rt x10r=w-u; 
 top y10=if monospace: 2.5 fi vstretch*thick;
 arm(9,10,b,serif_darkness,0); fi
penlabels(1,2,3,4,5,6,7,8,9,10); endchar;
 
 
