% Copyright 1993 Gilles F. Robert. % You may freely use, modify and/or distribute this file. % This statement added 2008/11/14 by Clea F. Rees on the basis of the email exchange archived at http://lists.debian.org/debian-tex-maint/2008/05/msg00040.html. % % Computer Modern Blackboard upper case: % Was romanu.mf; modified for blackboard letter % Gilles F. ROBERT (29-03-93) v1.0 % These letters were originally coded by D. E. Knuth in November, 1979, % inspired by the Monotype faces used in {\sl The Art of Computer Programming}. % Sans serif designs by Richard Southall were added in April, 1982. % The programs were revised for the new \MF\ conventions in 1985. % modified March 93 by Gilles F. ROBERT for blackboard letters % Character codes \0101 through \0132 are generated. cmchar "The letter A"; beginchar("A",13u#,cap_height#,0); adjust_fit(cap_serif_fit#,cap_serif_fit#); numeric left_stem,right_stem,outer_jut,alpha; right_stem=cap_stem-stem_corr; left_stem=max(min(cap_hair if hefty: -3stem_corr fi,.5right_stem),tiny); pen_duplicate(1,2); outer_jut=.8cap_jut; x.G1l=w-x4r=l+letter_fit+outer_jut+.5u; y1=y4=0; x2-x1=x4-x3; x3r=x.D2r+apex_corr; y2=y3=h+apex_o+apex_oo; alpha=diag_ratio(2,left_stem+cap_interspace,y2-y1,x4r-x.G1l-apex_corr); penpos1(alpha*left_stem,0); penpos2(alpha*left_stem,0); penpos3(alpha*right_stem,0); penpos4(alpha*right_stem,0); Delta_x = hround(alpha*(cap_interspace+left_stem)); z0=whatever[z.D1r,z.D2r]=whatever[z3l,z4l]; if y0lower_notch: {left}(x4'-1,lower_notch){up}... fi {z5-z6}diag_in(6r,5r,1,5l)--cycle; % diagonal else: penpos6(whatever,90); z6l=z4l; if xpart((z.D1r-z.G1l) rotated (-angle(z.G1l-z6l)+90))cap_notch_cut: y0:=cap_notch_cut; fill z0+.5right{up}...{z4-z3}diag_end(3l,4l,1,1,4r,3r) --diag_end(4r,3r,1,1,D2l,D1l)--diag_end(D2l,D1l,1,1,D1r,D2r){z2-z1} ...{down}z0+.5left--cycle; % left and right diagonals else: fill z0--diag_end(0,4l,1,1,4r,3r)--diag_end(4r,3r,1,1,D2l,D1l) --diag_end(D2l,D1l,1,1,D1r,0)--cycle; fi % left and right diagonals fill diag_end(G2l,G1l,1,1,G1r,G2r)--diag_end(G1r,G2r,1,1,G2l,G1l)--cycle; % lower left diagonal if serifs: numeric inner_jut; pickup tiny.nib; prime_points_inside(1,2); prime_points_inside(4,3); prime_points_inside(2,1); pen_duplicate(1',2'); if rt x.D1'r+cap_jut+.5u+1<=lft x4'l-cap_jut: inner_jut=cap_jut; else: rt x.D1'r+inner_jut+.5u+1=lft x4'l-inner_jut; fi dish_biserif(1',2,a,1/3,outer_jut,ab,1/3,b,1/2,inner_jut); % left serif mid_biserif(2',1,ab',1/3); % lower terminal dish_serif(4',3,c,.6,inner_jut,d,1/2,outer_jut)(dark); % right serif else: mid_biserif(1,2,ab,1/3); % upper terminal mid_biserif(2,1,ab',1/3); fi % lower terminal math_fit(.75u#-cap_height#*slant,ic#-4u#); penlabels(0,G1,D1,G2,D2,3,4); endchar; cmchar "The letter W"; beginchar("W",18u#,cap_height#,0); italcorr cap_height#*slant+.25u#; adjust_fit(cap_serif_fit#,cap_serif_fit#); numeric stem[],outer_jut,upper_notch,alpha,mid_corr; outer_jut=.7cap_jut; x.G1l=w-x8r=l+letter_fit+outer_jut+.25u; stem1=fudged.cap_stem-stem_corr; stem4=min(fudged.hair if hefty:-2stem_corr fi,stem1); stem2=stem4 if hefty:-2stem_corr fi; stem3=stem1 if hefty:-2stem_corr fi; pen_duplicate(1,2); x2-x1=x4-x3=x6-x5=x8-x7; x.D2r=x3r; x6l+apex_corr=x7l; y1=y8=h; y2=y3=y6=y7=-apex_o; y4=y5=if monospace: vround .6 fi\\ h; mid_corr=if monospace or hefty:-apex_corr else: 1/3jut fi; alpha=diag_ratio(4,stem2-stem3+stem4,y1-y2,x8r-x.G1l+mid_corr-2apex_corr+cap_interspace); penpos1(alpha*.5stem1,0); penpos2(alpha*.5stem1,0); penpos3(alpha*stem2,0); penpos4(alpha*stem2,0); penpos5(alpha*stem3,0); penpos6(alpha*stem3,0); penpos7(alpha*stem4,0); penpos8(alpha*stem4,0); Delta_x = hround(alpha*(cap_interspace+.5stem1)); x4l-x1l=floor(x4l-x1l+.5(x5r+mid_corr-x4r)); % |x5r+mid_corr| $\approx$ |x4r| z23=whatever[z.D1r,z.D2r]=whatever[z3l,z4l]; z45=whatever[z3r,z4r]=whatever[z5l,z6l]; z67=whatever[z5r,z6r]=whatever[z7l,z8l]; upper_notch=y4-cap_notch_cut; fill diag_end(D1l,D2l,1,1,3r,4r){z4-z3} ...if y45cap_notch_cut:(x67,cap_notch_cut)+.5right{down} --(x67,cap_notch_cut)+.5left{up} else: z67&z67 fi ...{z5-z6}special_diag_end(6,5,4,3){z3-z4} ...if y23>cap_notch_cut:(x23,cap_notch_cut)+.5right{down} --(x23,cap_notch_cut)+.5left{up} else: z23&z23 fi ...{z1-z2}diag_end(D2r,D1r,1,1,D1l,D2l)--cycle; % diagonals fill diag_end(G2r,G1r,1,1,G1l,G2l)--diag_end(G1l,G2l,1,1,G2r,G1r)--cycle; % lower left diagonal if serifs: numeric inner_jut[]; pickup tiny.nib; prime_points_inside(1,2); prime_points_inside(5,6); prime_points_inside(8,7); prime_points_inside(2,1); pen_duplicate(1',2'); if monospace: inner_jut1=inner_jut4=1.5cap_jut; elseif hefty: inner_jut1=inner_jut4=cap_jut; else: fill diag_end(6r,5r,1,1,5l,6l)--.9[z5l,z6l] ..{z5-z6}.1[z5r,z6r]--cycle; % middle stem inner_jut2=.7inner_jut1; inner_jut4=1.1inner_jut3; if rt x.D1'r+cap_jut+.5u+1<=lft x5'l-.7cap_jut: inner_jut1=cap_jut; else: rt x.D1'r+inner_jut1+.5u+1=lft x5'l-inner_jut2; fi if rt x5'r+cap_jut+.5u+1<=lft x8'l-1.1cap_jut: inner_jut3=cap_jut; else: rt x5'r+inner_jut3+.5u+1=lft x8'l-inner_jut4; fi dish_serif(5',6,e,1/3,inner_jut2,f,1/2,inner_jut3); fi % middle serif dish_biserif(1',2,a,1/3,outer_jut,ab,1/3,b,1/2,inner_jut1); % left serif mid_biserif(2',1,ab',1/3); % lower left terminal dish_serif(8',7,c,.6,inner_jut4,d,1/2,outer_jut)(dark); % right serif else: mid_biserif(1,2,ab,1/3); % left serif mid_biserif(2,1,ab',1/3); fi % lower left terminal math_fit(.75u#-cap_height#*slant,ic#-2.5u#); penlabels(0,G1,D1,G2,D2,3,4,5,6,7,8,23,45,67); endchar; cmchar "The letter X"; beginchar("X",13u#,cap_height#,0); italcorr cap_height#*slant-.25u#; adjust_fit(cap_serif_fit#,cap_serif_fit#); numeric stem[],outer_jut,xjut,alpha[]; stem1=cap_stem-2stem_corr; stem2=min(cap_hair,stem1); outer_jut=.75cap_jut; xjut= if serifs: (stem1-stem2)/4 else: 0 fi; pen_duplicate(1,4); x.G1l=l+letter_fit+.5u+outer_jut; x2r=r-letter_fit-u-outer_jut-xjut; x3l=l+letter_fit+.25u+outer_jut+xjut; x.D4r=r-letter_fit-.25u-outer_jut; y1=y2=h; y3=y4=0; alpha1=diag_ratio(1,stem1+cap_interspace,h,x.D4r-x.G1l); alpha2=diag_ratio(1,stem2,h,x2r-x3l); penpos1(alpha1*.5stem1,0); penpos2(alpha2*stem2,0); penpos3(alpha2*stem2,0); penpos4(alpha1*.5stem1,0); Delta_x = hround(alpha1*(cap_interspace+.5stem1)); if hefty: z12=whatever[z2l,z3l]=whatever[z.D1r,z.D4r]; z13=whatever[z2l,z3l]=whatever[z.G1l,z.G4l]; z24=whatever[z2r,z3r]=whatever[z.D1r,z.D4r]; z34=whatever[z2r,z3r]=whatever[z.G1l,z.G4l]; fill diag_end(12,D1r,.5,1,D1l,D4l)--diag_end(D1l,D4l,.5,1,D4r,24)--z24 --diag_end(24,2r,1,.5,2l,12)--z12--cycle; % upper diagonals fill diag_end(34,G4l,.5,1,G4r,G1r)--diag_end(G4r,G1r,.5,1,G1l,13)--z13 --diag_end(13,3l,1,.5,3r,34)--z34--cycle; % lower diagonals else: forsuffixes e=l,,r: forsuffixes $=G,D: z$0e = whatever[z2e,z3e] = whatever[z$1,z$4]; endfor endfor fill diag_end(D4r,D1r,.5,1,D1l,D4l) --diag_end(D1l,D4l,.5,1,D4r,D1r)--cycle; % upper left diagonal fill diag_end(G4r,G1r,.5,1,G1l,G4l) --diag_end(G1l,G4l,.5,1,G4r,G1r)--cycle; % lower left diagonal fill z.D0l--z.D0r--diag_end(D0r,2r,.5,1,2l,D0l)--cycle; % upper right diagonal fill diag_end(G0l,3l,.5,1,3r,G0r)--z.G0r--z.G0l--cycle; fi % lower right diagonal if serifs: numeric inner_jut[]; pickup tiny.nib; prime_points_inside(1,4); prime_points_inside(4,1); pen_duplicate(1',4'); prime_points_inside(2,3); prime_points_inside(3,2); if rt x.D1'r+cap_jut+.5u+1<=lft x2'l-cap_jut-xjut: inner_jut1=cap_jut; else: rt x.D1'r+inner_jut1+.5u+1=lft x2'l-inner_jut1-xjut; fi if rt x3'r+cap_jut+.5u+1<=lft x.G4'l-cap_jut-xjut: inner_jut2=cap_jut; else: rt x3'r+inner_jut2+.5u+1=lft x.G4'l-inner_jut2-xjut; fi dish_biserif(1',4,a,1/3,outer_jut,ab,1/2,b,2/3,inner_jut1); % upper left serif dish_biserif(4',1,c,2/3,inner_jut2,cd,1/2,d,1/3,outer_jut); % lower right serif dish_serif(2',3,e,2/3,inner_jut1+xjut, f,1/2,outer_jut+xjut)(dark); % upper right serif dish_serif(3',2,g,1/2,outer_jut+xjut, h,2/3,inner_jut2+xjut)(dark); % lower left serif else: mid_biserif(1,4,ab,1/2); % upper left terminal mid_biserif(4,1,cd,1/2); fi % lower right terminal math_fit(0,.5ic#); penlabels(0,G0,D0,G1,D1,2,3,G4,D4,12,13,24,34); endchar; cmchar "The letter Y"; beginchar("Y",13u#,cap_height#,0); italcorr cap_height#*slant+.45u#; adjust_fit(cap_serif_fit#,cap_serif_fit#); numeric left_stem,right_stem,outer_jut,dy,alpha; left_stem=cap_stem-stem_corr; right_stem=min(cap_hair if hefty:-2stem_corr fi,left_stem); pen_duplicate(1,2,5,6);numeric theta; outer_jut=.75cap_jut; x.G1l=w-x4r=l+letter_fit+outer_jut+.05u; x.G2l=x.G5l=hround(.5w-.5left_stem-.5cap_interspace); x3r=x.D5r; y1l=y4=h; y2l=y3=y5=.4h; %dy=y1-y2; alpha=((x2l-x1l)++dy)/dy; %pair dz; forsuffixes $=1,2,6: z$r-z$=z$-z$l=endfor .5dz; penpos5(.5left_stem,0); penpos6(.5left_stem,0); x5=x6; y6=0; theta = angle(z2l-z1l)+90; alpha = 1/cosd(.5theta); penpos3(alpha*right_stem,0); penpos4(alpha*right_stem,0); penpos1(alpha*.5left_stem,0);penpos2(.5left_stem,theta); %dz=(alpha*.5left_stem,0)rotated theta; x5=x6; y6=0; Delta_x = hround(alpha*(cap_interspace+.5left_stem)); z0=whatever[z.D1r,z.D2r]=whatever[z3l,z4l]; if y0>y2+cap_notch_cut: y0:=y2+cap_notch_cut; fill z0+.5right{up}...{z4-z3}diag_end(3l,4l,1,1,4r,3r)--z.D5r --diag_end(D5r,D6r,1,1,D6l,D5l)--z.D5l--diag_end(D2l,D1l,1,1,D1r,D2r){z2-z1} ...{down}z0+.5left--cycle; % diagonals and stem else: fill z0--diag_end(0,4l,1,1,4r,3r)--z.D5r --diag_end(D5r,D6r,1,1,D6l,D5l)--z.D5l % z.D5l=z.D2l --diag_end(D2l,D1l,1,1,D1r,0)--cycle; fi % diagonals and stem fill z.G2r..z.G5r--diag_end(G5r,G6r,1,1,G6l,G5l)--z.G5l--diag_end(G2l,G1l,1,1,G1r,G2r)--cycle; if serifs: numeric inner_jut; pickup tiny.nib; prime_points_inside(1,2); prime_points_inside(4,3); prime_points_inside(6,5); pen_duplicate(1',6'); if rt x.D1'r+cap_jut+.5u+1<=lft x4'l-cap_jut: inner_jut=cap_jut; else: rt x.D1'r+inner_jut+.5u+1=lft x4'l-inner_jut; fi dish_biserif(1',2,a,1/3,outer_jut,ab,1/3,b,1/2,inner_jut); % upper left serif dish_serif(4',3,c,.6,inner_jut,d,1/2,outer_jut)(dark); % upper right serif dish_biserif(6',5,e,1/3,cap_jut,ef,1/3,f,1/3,cap_jut); % lower serif else: mid_biserif(1,2,ab,1/3); % upper left terminal mid_biserif(6,5,ef,1/3); fi % lower terminal math_fit(.5u#-cap_height#*slant,ic#-4u#); penlabels(0,G1,D1,G2,D2,3,4,G5,D5,G6,D6); endchar; cmchar "The letter Z"; beginchar("Z",11u#,cap_height#,0); italcorr cap_height#*slant-.5u#; adjust_fit(0,0); numeric arm_thickness[],z_stem; if hefty: arm_thickness1=Vround(slab-vair_corr); arm_thickness2=slab; z_stem=max(.8[vair,.5cap_stem],tiny+eps); else: arm_thickness1=slab; arm_thickness2=vround(slab+vair_corr); z_stem=max(.9[vair,.5cap_stem],tiny+eps); fi pen_duplicate(1,2,3,4); pickup tiny.nib; x3l=x4l=w-x1r=w-x2r; lft x.G3l=hround u; top y1=h; y2=min(y1,h-2/3arm_thickness1); bot y4=0; y3=max(y4,2/3arm_thickness2); numeric alpha; alpha=diag_ratio(1,z_stem+cap_interspace-tiny,y2-y3,x.D2r-x.G3l); penpos1(alpha*(z_stem-tiny),0);penpos2(alpha*(z_stem-tiny),0); penpos3(alpha*(z_stem-tiny),0);penpos4(alpha*(z_stem-tiny),0); Delta_x = hround(alpha*(cap_interspace+z_stem)); pair delta; delta=penoffset z3-z2 of currentpen; double fill top lft z1l--z2l+delta---z3l+delta..lft z3l---lft z4l..bot z4l ---bot rt z4r--z3r-delta---z2r-delta..rt z2r---rt z1r..top z1r ---cycle; % double diagonal pickup crisp.nib; pos5(arm_thickness1,90); pos6(hair,180); top y5r=h; x5=x.D1; lft x6r=hround 1.25u; y6=good.y(y5l-beak)-eps; arm(5,6,a,beak_darkness**.8,-.4beak_jut); % upper arm and beak pos7(arm_thickness2,-90); pos8(hair,0); bot y7r=0; x7=x.G4; rt x8r=hround(w-.9u); y8=good.y(y7l+1.2beak)+eps; arm(7,8,b,beak_darkness**.9,.6beak_jut); % lower arm and beak math_fit(0,.5ic#); penlabels(G1,D1,G2,D2,G3,D3,G4,D4,5,6,7,8); endchar;