% At the end, three "if" statements will be incomplete % (from the routines for C, G, and U, which call adjust_fit conditionally) if unknown cmbase: input cmbase fi % omit if CMMF can be assumed def generate suffix t=enddef; input cmbx9; % in the FGbook I used "nnncmbx scaled \magstep2" ligs:=1; font_identifier "NNNNNN"; def pre_n = let endchar=endfor; let ;=do_n semi_ for xxx= : enddef; def pre_N = let endchar=endfor; let ;=do_N semi_ for xxx= : enddef; def do_n = let ;=semi_; let endchar=endchar_; pickup tiny.nib; pos1(stem,0); pos2(stem,0); numeric shaved_stem; shaved_stem=hround(stem-2stem_corr); pos1'(shaved_stem,0); pos2'(shaved_stem,0); pos3(stem,0); lft x1l=hround(2.5u-.5stem); x1l=x1'l=x2l=x2'l; x3=w-x1; top y1=x_height+min(oo,serif_drop); bot y2=0; y1=y1'; y2=y2'; filldraw stroke z1'e--z2'e; % left stem h_stroke(2,a,3,4); % arch and right stem if serifs: sloped_serif.l(1',2',b,1/3,jut,serif_drop); % upper left serif numeric inner_jut; pickup tiny.nib; if rt x2r+jut+.5u+1<=lft x4l-jut: inner_jut=jut; else: rt x2r+jut+.5u+1=lft x4l-inner_jut; fi if inner_jut<0: inner_jut:=0; fi dish_serif(2,1,c,1/3,jut,d,1/3,jut); % lower left serif dish_serif(4,3,e,1/3,inner_jut,f,1/3,jut); fi % lower right serif penlabels(1,2,3,4); endchar; enddef; def do_N = let ;=semi_; let endchar=endchar_; numeric thin_stem; thin_stem=hround(fudged.hair+stem_corr); pickup tiny.nib; pos1(thin_stem,0); pos2(thin_stem,0); pos3(thin_stem,0); pos4(thin_stem,0); pickup tiny.nib; top y1=top y3=cap_height; bot y2=bot y4=0; x1=x2; x3=x4; x1l=w-x3r; rt x3r=hround min(w-2u,w-3u+.5fudged.cap_stem); filldraw stroke z1e--z2e; % left stem filldraw stroke z3e--z4e; % right stem if hefty: penpos5(fudged.cap_stem,0); penpos6(fudged.cap_stem,0); x5l=x1; x6r=x4; y5=cap_height; y6=0; numeric upper_notch,lower_notch; upper_notch=cap_height-cap_notch_cut; lower_notch=cap_notch_cut; x1'=rt x1r; z1'=whatever[z5l,z6l]; x4'=lft x4l; z4'=whatever[z5r,z6r]; fill z5l.. if y1'lower_notch: {left}(x4'-1,lower_notch){up}... fi {z5-z6}diag_in(6r,5r,1,5l)--cycle; % diagonal else: penpos5(whatever,0); penpos6(whatever,90); z5l=z1l; z6l=z4l; z7=z6l+(max(eps,cap_stem-3stem_corr-tiny),0) rotated (angle(z5l-z6l)-90); z5r=z7+whatever*(z5l-z6l); z6r=z7+whatever*(z5l-z6l); filldraw stroke z5e..z6e; fi % diagonal if serifs: if hefty: serif(1,2,a,1/3,-cap_jut); % upper left serif else: serif(5,6,a,1/3,-cap_jut); fi % upper left serif dish_serif(2,1,b,1/2,cap_jut,c,1/2,cap_jut)(dark); % lower left serif dish_serif(3,4,e,1/2,cap_jut,f,1/2,cap_jut)(dark); fi % upper right serif endchar; enddef; mode_setup; font_setup; let mode_setup=\; let font_setup=\; let adjust_fit_ = adjust_fit; def adjust_fit(expr left_adjustment,right_adjustment) = adjust_fit_(left_adjustment,right_adjustment); if (charcode>=ASCII "A")and(charcode<=ASCII "Z") and(charcode<>ASCII "I"): let next_=pre_N elseif (charcode>=ASCII "a")and(charcode<=ASCII "z"): let next_=pre_n else: let next_=\ fi; next_ enddef; input roman