%% 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 CASUAL Computer Duerer fonts. %% join_radius:=.1pt; pair xeps, yeps; xeps=(eps,0); yeps=(0,eps); numeric P_width#; P_width#=cap_jut#+3thick#+1/4side#-1/2thin#; define_pixels(P_width); numeric t[]; % tensions t.l=1.25; t.r=1; numeric axis; axis=1; % H.\ Zapf would not put the axis as oblique as did % D\"urer. This quantity measures this obliqueness. % $0\leq axix\leq1$; $axis=1$ corresponds to D\"urer % $axis=2$ corresponds to vertical axis. numeric tail_corr; tail_corr=1/8; cmchar "The letter A (casual)"; beginchar("A", 2u#+2cap_jut#+.8side#, cap_height#, 0); adjust_fit(cap_serif_fit#, cap_serif_fit#); top y3=top y2=h+apex_o; 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+.5u; rt x4r=w-x1l; bot y1=bot y4=0; x3r=x2l+apex_corr; hround(w/2)=.5[x2,x3]; z0=whatever[z1r,z2r]=whatever[z3l,z4l]; pos0'(.6thick,0);z0'r=whatever[z4r,z3r]; z0'l=whatever[z1l,z2l]; fill z0--diag_end(0,4l,1,1,4r,3r)--z0'r--z0'l--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 if serifs: cap_jut:=10/7 cap_jut; bracket:=10/7 bracket; pickup tiny.nib; prime_points_inside(1,2); prime_points_inside(4,3); numeric jut_factor; jut_factor:=7/8; serif(1',2,a,eta,-cap_jut); serif(4',3,d,eta,cap_jut); bracket:=jut_factor*bracket; serif(1',2,b,eta,jut_factor*cap_jut); serif(4',3,c,eta,-jut_factor*cap_jut); flourish(1,0',4,e,.65eta); fi penlabels(0,0',1,2,3,4,5,6); endchar; cmchar "The letter B (casual)"; 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 pos5(thick,0); pos7(thin,90); lft z3r=lft z2l; rt z3l=rt z2r+(0,thick+thin); z3=.5[z3r,z3l]; x4l=x3l+thick; y4r=y3r-o; top y4l=bot y4r+thin; 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]; pair where.r, where.l; where.l=down; where.r=(1,-.3); forsuffixes t=l,r: z4't=z4t+(thin,0); endfor z4'=.5[z4'r,z4'l]; filldraw stroke z3e{where.e}...z4'e..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); fi penlabels(1,2,3,4,5,6,7,8,9,10,11,12); penlabels(6',7'); endchar; cmchar "The letter C (casual)"; beginchar("C",2u#+.9side#, cap_height#, 0); adjust_fit(0, 0); pickup tiny.nib; numeric alpha; alpha=w-u-thick; pos2(1.3thin, 90); x2=.5[x3r,x0r]; top y2r=h+o;% topmost pen position pos3(thick,180); lft z3r=(u,h/2); pos4(1.4thin, 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,h)--(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]; y5l:=y5r+2thick; y1l:=y1r-1.5thick; x1l:=x1r+.5thin; numeric slope_factor; slope_factor=3/4; filldraw z1r{-1,slope_factor}..{left}z2r..pulled_arc.r(2,3)&pulled_arc.r(3,4).. {right}z4r..{1,slope_factor}z5r ..(z5r+xeps)--(z5l+xeps).. reverse (z1l..{left}z2l..pulled_arc.l(2,3)&pulled_arc.l(3,4)..{right}z4l..z5l) ..(z1l+xeps)--(z1r+xeps)..cycle; penlabels(0,1,2,3,4,5); endchar; cmchar "The letter D (casual)"; beginchar("D", side#+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=2oo; top y1=h; filldraw stroke z1e--z2e; % stem pos3(thin, 90); pos5(thick, 0); x3=x1; top y3r=h; z7r=z2l; pos4(thin,90); pos6(thin, -90); bot y6r=-o; x4r=x6r=hround(w/2); top y4r=h; y5=good.y .51[y4,y6]; rt x5r=good.x (w-.5u); z7r=z2l; x7l=x2r; y7l=y2r+bracket; z7=.5[z7r,z7l]; pair where.r, where.l; where.l=up; where.r=(-1,.4); filldraw stroke z3e{right}..pulled_super_arc.e(4,5,eta)&pulled_super_arc.e(5,6,eta) ..{where.e}z7e; % lobe if serifs: serif(1, 2, a, eta, -cap_jut); fi penlabels(1,2,3,4,5,6,7); endchar; cmchar "The letter E (casual)"; numeric topbar_; topbar_=3/4; %17/30 % 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-1.2vstretch*thick); arm(3,4,d,eta,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,eta,x9-x4-thick); % lower arm if serifs: serif(1,2,a,eta,-cap_jut); if not monospace: temp_:=slab; slab:=thin; serif(2,1,c,eta,cap_jut); slab:=temp_; fi antiserif(2,1,b,eta,jut); fi penlabels(0,1,2,3,4,5,6,7,8,9); endchar; % end of "E" cmchar "The letter F (casual)"; numeric topbar_; topbar_=3/4; % 17/30 % 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-1.2vstretch*thick); arm(3,4,d,eta,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 (casual)"; beginchar("G",2u#+.9side#, cap_height#, 0); adjust_fit(0, .5cap_serif_fit#); if monospace: pickup fine.nib; else: pickup tiny.nib;fi % This code is identical to that for the lette C. numeric alpha; alpha=w-u-thick; pos2(1.3thin, 90); x2=.5[x3r,x0r]; top y2r=h+o;% topmost pen position pos3(thick,180); lft z3r=(u,h/2); pos4(1.4thin, 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]; %x1l:=x1l+thin; y1l:=y1r-1.2thick-2tiny; y5l:=y5r+2thick; y1l:=y1r-1.5thick; x1l:=x1r+.5thin; % Now for addtional G work! path p,p',line.o, line.i; p=z1r..{left}z2r..pulled_arc.r(2,3)&pulled_arc.r(3,4)..{right}z4r..tension 0.9..z5r; p'= reverse (z1l..tension 0.9..{left}z2l..pulled_arc.l(2,3)&pulled_arc.l(3,4)..{right}z4l ..tension 0.9..z5l); pos7(thick,0); top rt z7r=(w-0u-cap_jut,.9h/2); 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; x6r=x7r; x6l=x7l; bot y6r=ypart point t1 of p; bot y6l=ypart point t2 of p'; z6=.5[z6r,z6l]; filldraw subpath(0,t1) of p--subpath(t2,infinity) of p'..(z1l+(eps,0))--cycle; filldraw stroke z6e--z7e; if serifs: serif(7,6,a,serif_darkness,-cap_jut); fi % serif(7,6,b,serif_darkness, cap_jut); fi penlabels(0,1,2,3,4,5,6,7); endchar; cmchar "The letter H (casual)"; beginchar("H", u#+2cap_jut#+.9side#, 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; % end of "H" cmchar "The letter I (casual)"; beginchar("I", .5u#+2cap_jut#+cap_stem#+.5u#, cap_height#,0); adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib; 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, eta, -cap_jut); serif(1, 2, b, eta, cap_jut); % top lft,rt serif(2, 1, c, eta, -cap_jut); serif(2, 1, d, eta, cap_jut); % bot lft,rt fi penlabels(1, 2); endchar; cmchar "The letter J (casual)"; beginchar("J",u#+3thick#,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; x2=x1; bot y2=0; lft x3=.5u; bot y3r=-d; filldraw stroke z1e--z2e{down}..{left}z3e; serif(1,2,a,serif_darkness,-cap_jut); % serif(1,2,b,serif_darkness,cap_jut); 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=dslab; 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); z.g -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 filldraw z5r--z5l--z7l{z7l-z5l}..{right}z6l--z6r{left}..{durer1-durer4}z7r --cycle; % lower diagonal stroke 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:=.75old_brack;cap_jut:=.75old_jut; %serif(3,4,e,serif_darkness,-cap_jut); bracket:=2old_brack; cap_jut:=old_jut; serif(3,4,f,.6serif_darkness,cap_jut); cap_jut:=old_jut; bracket:=old_brack; fi penlabels(0,1,2,3,4,5,6,7); endchar; cmchar "The letter L (casual)"; numeric topbar_; topbar_=3/4; % 17/30; % 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,eta,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 (casual)"; beginchar("M", u#+2cap_jut#+side#, 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 (casual)"; 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 (casual)"; beginchar("O", 2u#+side#, cap_height#, 0); adjust_fit(0,0); x2r=u; x4r=w-u; y1r=h+o; y3r=-o; z0=(w/2,h/2); z0=.5[z5,z6]; numeric axis_angle; axis_angle=angle( (x4r,y1r)-(x2r,y3r) ); axis_angle:=axis_angle*axis; 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--(1.5w,y4))rotatedaround(z0,axis_angle+90); 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--(1.5w,y4))rotatedaround(z0, axis_angle); z41r=diag intersectionpoint p; penpos41(thick, axis_angle); x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180); if monospace: x2l:=x21l; x4l:=x43l; fi p'= z1l{left}..z21l...z2l{down}..z32l..z3l{right}..z43l..z4l{up} ..z41l..{left}cycle; fill p; unfill p'; penlabels(0,1,2,3,4,5,6,21,32,43,41); endchar; cmchar "The letter P (casual)"; 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(thin,-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; x7=.75[rt x1r, x6]; pos7(thin, -90); filldraw stroke pulled_super_arc.e(4,5,eta)&pulled_super_arc.e(5,6,eta)..z7e; if serifs: serif(1,2,a,eta,-cap_jut); serif(2,1,b,eta,-cap_jut); serif(2,1,c,eta,cap_jut); fi penlabels(1,2,3,4,5,6,7); endchar; cmchar "The letter Q (casual)"; beginchar("Q", 2u#+side#, cap_height#, 0); adjust_fit(0,0); x2r=u; x4r=w-u; y1r=h+o; y3r=-o; z0=(w/2,h/2); z0=.5[z5,z6]; numeric axis_angle; axis_angle=angle( (x4r,y1r)-(x2r,y3r) ); axis_angle:=axis_angle*axis; 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--(1.5w,y4))rotatedaround(z0,axis_angle+90); 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--(1.5w,y4))rotatedaround(z0, axis_angle); z41r=diag intersectionpoint p; penpos41(thick, axis_angle); x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180); if monospace: x2l:=x21l; x4l:=x43l; fi p'= z1l{left}..z21l...z2l{down}..z32l..z3l{right}..z43l..z4l{up} ..z41l..{left}cycle; 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); 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; 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 (casual)"; 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(if serifs: dslab else:thin fi,-90); top y3r=top y4r=h; x3=x1; x4=x1r+thick; x6=x4; y6=hround h/2; rt x5r=hround(.5u+P_width); y5=.5[y4,y6]; y7=y6; x7=.75[rt x1r, x6]; pos7(if serifs:dslab else:thin fi,-90); filldraw stroke z3e--z4e..pulled_super_arc.e(4,5,eta)& pulled_super_arc.e(5,6,eta)..z7e; path p; p=pulled_super_arc.r(5,6,eta)..z7r; numeric half_letter_width; 2half_letter_width+1/2u=w; half_letter_width:=half_letter_width+1/2u; 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'=(.4[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(1/2thin,90); z10l=(w,0); fill z0l--z8l...{right}z10l--z10r{-w,1/4h}..z9r--z0r--cycle; % tail if serifs: serif(1,2,a,eta,-cap_jut); serif(2,1,b,eta,-cap_jut); serif(2,1,c,eta,cap_jut); fi penlabels(0,1,2,3,4,5,6,7,8,9,10); labels(0'); endchar; cmchar "The Knuthian S (casual)"; 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=-3/4h/(xpart durer4-xpart durer3); pos0(thick,diag_angle); x0=.52[xpart durer1, xpart durer2]; y0=h/2; pos2(thin,-90); top y2l=h+o; x2=x0+thin; lft x3l=u+2/3thick; rt x3r=lft x3l+5/6thick; if not monospace: if x2-rt x3r