From 9efcba16ec708dc826905166f21a807b7f78d28c Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 15 Feb 2014 00:19:09 +0000 Subject: new package knuth-lib (named per ctan), for knuth files that make tfms; also reinstate manfnt.tfm, previously in misc and needed by plain.tex git-svn-id: svn://tug.org/texlive/trunk@32971 c570f23f-e606-0410-a88d-b1316a301751 --- .../fonts/source/public/knuth-lib/grayf.mf | 82 +++ .../fonts/source/public/knuth-lib/manfnt.mf | 788 +++++++++++++++++++++ .../fonts/source/public/knuth-lib/slant.mf | 32 + 3 files changed, 902 insertions(+) create mode 100644 Master/texmf-dist/fonts/source/public/knuth-lib/grayf.mf create mode 100644 Master/texmf-dist/fonts/source/public/knuth-lib/manfnt.mf create mode 100644 Master/texmf-dist/fonts/source/public/knuth-lib/slant.mf (limited to 'Master/texmf-dist/fonts/source/public/knuth-lib') diff --git a/Master/texmf-dist/fonts/source/public/knuth-lib/grayf.mf b/Master/texmf-dist/fonts/source/public/knuth-lib/grayf.mf new file mode 100644 index 00000000000..1a34e18fd1b --- /dev/null +++ b/Master/texmf-dist/fonts/source/public/knuth-lib/grayf.mf @@ -0,0 +1,82 @@ +% More-or-less general gray font generator +% See Appendix H of The METAFONTbook for how to use it + +forsuffixes m = mag,rep: + if unknown m: m := 1; + elseif (m<1) or (m<>floor m): + errmessage "Sorry, " & str m & " must be a positive integer"; + m := 1; fi endfor + +mg := mag; mag := 1; mode_setup; +if mg>1: hppp := hppp*mg; vppp := vppp*mg; + extra_endchar:= + "if charcode>0:currentpicture:=currentpicture scaled mg;fi" + & extra_endchar; fi; + +if picture pix_picture: rep := 1; + cull pix_picture keeping (1,infinity); +else: for z=(0,2),(1,0),(2,3),(3,1): + fill unitsquare shifted z; endfor + if not boolean lightweight: addto currentpicture also + currentpicture rotated 90 xscaled -1; fi + if unknown scale: scale := max(1,round(pixels_per_inch/300)); fi + pix_wd := pix_ht := 4scale; + if rep>1: picture pix; + currentpicture := currentpicture shifted-(1,1); pix := currentpicture; + for r=1 upto rep-1: addto currentpicture also pix shifted(4r,0); endfor + cullit; pix := currentpicture; + for r=1 upto rep-1: addto currentpicture also pix shifted(0,4r); endfor + unfill unitsquare xscaled 4rep yscaled 2 shifted-(1,1); + unfill unitsquare yscaled 4rep xscaled 2 shifted-(1,1); cullit; fi + picture pix_picture; pix_picture := currentpicture scaled scale; + pix_wd := pix_ht := 4scale*rep; fi + +def # = *72.27/pixels_per_inch enddef; +if unknown dotsize: dotsize := 2.5pix_wd/rep; fi + +beginchar(0,1.2dotsize#,1.2dotsize#,0); +fill fullcircle scaled dotsize scaled mg; endchar; + +numeric a[]; newinternal b,k; +def next_binary = + k := 0; forever: if k>b: a[incr b] := 0; fi + exitif a[k]=0; a[k] := 0; k := k+1; endfor + a[k] := 1 enddef; +def next_special_binary = + if a[0]=1: for k=0 upto b: a[k] := 0; endfor a[incr b] + else: k := 0; forever: exitif a[incr k]=1; endfor + a[k-1] fi := 1 enddef; + +def make_char = + clearit; next_binary; + for k=0 upto b: if a[k]=1: + addto currentpicture also pix_picture shifted(0,-k*pix_ht); fi endfor + charcode := charcode+1; chardp := b*charht; + scantokens extra_endchar; shipout currentpicture enddef; + +charwd := pix_wd#; charht := pix_ht#; chardx := pix_wd*mg; +b := -1; + +if boolean large_pixels: + for k=1 upto 7: make_char; charlist k:k+120; endfor + charcode := 120; b := -1; + addto pix_picture also pix_picture shifted (chardx,0); + charwd := 2charwd; chardx := 2chardx; + for k=1 upto 7: make_char; endfor +else: for k=1 upto 63: make_char; endfor + let next_binary = next_special_binary; + for k=64 upto 120: make_char; endfor + for k=121,122: charcode := k; + addto currentpicture also currentpicture shifted (chardx,0); + charwd := 2charwd; chardx := 2chardx; + scantokens extra_endchar; shipout currentpicture; endfor + charlist 120:121:122; fi + +font_coding_scheme "GFGRAY"; +font_size 8(pix_wd#); +font_normal_space pix_wd#; +font_x_height pix_ht#; +font_quad pix_wd#; +fontdimen 8: if known rulethickness: rulethickness + else: pix_wd#/(2rep) fi; +bye. diff --git a/Master/texmf-dist/fonts/source/public/knuth-lib/manfnt.mf b/Master/texmf-dist/fonts/source/public/knuth-lib/manfnt.mf new file mode 100644 index 00000000000..0c85e0864b0 --- /dev/null +++ b/Master/texmf-dist/fonts/source/public/knuth-lib/manfnt.mf @@ -0,0 +1,788 @@ +% Special font for the TeX and METAFONT manuals +% This file was prepared "hastily" and hasn't been "polished". +% In particular, some characters won't work when aspect_ratio<>1. + +font_size 10pt#; +em#:=10pt#; ht#:=250/36pt#; +mode_setup; + +font_identifier "MANFNT"; +font_coding_scheme "PI"; + +message "Hex symbols"; +width1#=.4pt#*(ht#/(100/36pt#)); +width2#=.6pt#*(ht#/(100/36pt#)); +define_blacker_pixels(width1,width2); + +beginchar(1,2ht#,ht#,0); "Original hex"; % \hexa +pickup pencircle scaled width1; +w:=2good.x .5w; +x1=x4=good.x 0; x2=x5=.5w; x3=x6=good.x w; +y1=y2=y3=good.y h; y4=y5=y6=good.y 0; +draw z1..z6; draw z2..z5; draw z3..z4; +for k=1 upto 6: drawdot z[k]; endfor +labels (1,2,3,4,5,6); endchar; + +beginchar(2,2ht#,ht#,0); "Top/bot adjusted hex"; % \hexb +pickup pencircle scaled width1; +w:=2good.x .5w; +x1=x4=good.x 0; x2=x5=.5w; x3=x6=good.x w; +top y1=h; y1=y2=y3; bot y4=0; y4=y5=y6; +draw z1..z6; draw z2..z5; draw z3..z4; +for k=1 upto 6: drawdot z[k]; endfor +labels (1,2,3,4,5,6); endchar; + +beginchar(3,2ht#,ht#,0); "Bold top/bot adjusted hex"; % \hexc +pickup pencircle scaled width2; +w:=2good.x .5w; +x1=x4=good.x 0; x2=x5=.5w; x3=x6=good.x w; +top y1=h; y1=y2=y3; bot y4=0; y4=y5=y6; +draw z1..z6; draw z2..z5; draw z3..z4; +for k=1 upto 6: drawdot z[k]; endfor +labels (1,2,3,4,5,6); endchar; + +beginchar(4,2ht#,ht#,0); "Bold top/bot/lft/rt adjusted hex"; % \hexd +pickup pencircle scaled width2; +w:=2good.x .5w; +lft x1=0; x1=x4; x2=x5=.5w; rt x3=w-1; x3=x6; +top y1=h; y1=y2=y3; bot y4=0; y4=y5=y6; +draw z1..z6; draw z2..z5; draw z3..z4; +for k=1 upto 6: drawdot z[k]; endfor +labels (1,2,3,4,5,6); endchar; + +beginchar(5,2ht#,ht#,0); "Hex corrected for darkness in the center"; % \hexe +pickup pencircle scaled width1; +w:=2good.x .5w; +top z1=(0,h); top z2=(.5w,h); top z3=(w,h); +bot z4=(0,0); bot z5=(.5w,0); bot z6=(w,0); +for k=1 upto 6: drawdot z[k]; endfor +z1'=.25[z1,z6]; z6'=.75[z1,z6]; theta1:=angle(z6-z1)+90; +z3'=.25[z3,z4]; z4'=.75[z3,z4]; theta3:=angle(z4-z3)+90; +z7=z8=.5[z1,z6]; +penpos1'(width1,theta1); penpos6'(width1,theta1); penpos7(.6width1,theta1); +penpos3'(width1,theta3); penpos4'(width1,theta3); penpos8(.6width1,theta3); +draw z1..z1'; penstroke z1'e{z6'-z1'}..z7e..{z6'-z1'}z6'e; draw z6'..z6; +draw z2..z5; +draw z3..z3'; penstroke z3'e{z4'-z3'}..z8e..{z4'-z3'}z4'e; draw z4'..z4; +penlabels(1,1',7,2,3,3',8,4,4',5,6,6'); endchar; + +message "Stick A's"; +b#:=250/36pt#; a#:=150/36pt#; s#:=30/36pt#; +standardwidth#:=.4pt#; +darkwidth#:=.8pt#; lightwidth#:=.2pt#; +define_blacker_pixels(standardwidth,darkwidth,lightwidth); +define_pixels(b,a,s); +def stick_A(expr alpha)(text pentype)= +beginchar (incr(charcode),s#+a#+s#,b#,0); +pickup pentype; +bot z1=(good.x s,0); z5=z1+(a,0); +z3=(1/2[x1,x5],good.y b); +z2=alpha[z1,z3]; z4=alpha[z5,z3]; +draw z1..z3; draw z3..z5; draw z2..z4; +drawdot z1; drawdot z5; drawdot z3; +labels(1,2,3,4,5); endchar; enddef; +charcode:=5; % the first A will be number 6 + +stick_A((3-sqrt5)/2, % (area above bar / area below) = golden ratio % \Aa + pencircle scaled standardwidth); + +for alpha=.2 step .05 until .5+10epsilon: + stick_A(alpha,pencircle scaled standardwidth); endfor % chars 7..13 + +beginchar(14,s#+a#+s#,b#,0); +pickup pencircle scaled standardwidth; +bot z1=(good.x s,0); z5=z1+(a,0); +z3=(1/2[x1,x5],good.y b); +z4-z2=whatever*dir20; 1/2[y2,y4]=2/3[y3,y1]; +z2=whatever[z1,z3]; z4=whatever[z3,z5]; +draw z1..z3; draw z3..z5; draw z2..z4; +drawdot z1; drawdot z5; drawdot z3; +labels(1,2,3,4,5); endchar; + +stick_A((3-sqrt5)/2,pencircle xscaled darkwidth yscaled lightwidth); % \Ab=15 +stick_A((3-sqrt5)/2, + pencircle xscaled darkwidth yscaled lightwidth rotated 30); % \Ac=16 + +message "Kidney beans"; +standardwidth#:=.4pt#; +darkwidth#:=.8pt#; lightwidth#:=.2pt#; +define_blacker_pixels(standardwidth,darkwidth,lightwidth); +b#:=100/36pt#; +define_pixels(b); +def bean(text pentype)= +beginchar (incr(charcode),2b#,1.5b#,0); +pickup pentype; +z1=(0,b); z2=(b,b); z3=(2b,b); +z4=(0,0); z5=(b,0); z6=(2b,0); +draw z5..z4..z1..z3..z6..cycle; +labels(1,2,3,4,5,6); endchar; enddef; +charcode:=16; % the first bean will be number 17 + +bean(pencircle scaled standardwidth); % \beana=17 +bean(pencircle scaled darkwidth); % \beanb=18 +bean(pencircle xscaled darkwidth yscaled lightwidth); % \beanc=19 +bean(pencircle xscaled darkwidth yscaled lightwidth rotated 30); % \beand=20 + +message "Pen nibs"; +bigthickwidth#:=8pt#; littlethickwidth#:=2pt#; +define_blacker_pixels(bigthickwidth,littlethickwidth); + +beginchar(21,bigthickwidth#,0,0); % \niba +pickup pencircle xscaled bigthickwidth yscaled littlethickwidth; +lft z1=(0,good.y 0); +drawdot z1; +labels(1); endchar; + +beginchar(22,bigthickwidth#,0,0); % \nibb +pickup pencircle xscaled bigthickwidth yscaled littlethickwidth rotated 30; +lft z1=(0,good.y 0); +drawdot z1; +labels(1); endchar; + +beginchar(23,littlethickwidth#,0,0); % \nibc +pickup pencircle yscaled bigthickwidth xscaled littlethickwidth; +lft z1=(0,good.y 0); +drawdot z1; +labels(1); endchar; + +message "Ionian letters"; +em#:=10pt#; cap#:=7pt#; +thin#:=1/3pt#; thick#:=5/6pt#; +slab#:=.8pt#; +stem#:=.9pt#; +o#:=1/5pt#; + +define_pixels(em,cap); +define_blacker_pixels(thin,thick,slab,stem); +define_corrected_pixels(o); + +curve_sidebar=round 1/18em; + +%vardef pentaper@#(expr lt,rt) = % dropped from PLAIN +% x@#l:=lt[x@#l,x@#]; x@#r:=rt[x@#r,x@#]; +% y@#l:=lt[y@#l,y@#]; y@#r:=rt[y@#r,y@#] enddef; + + +% ill-fated example wasn't attractive enough by itself: +%bar:=slab; +%beginchar(24,0.6em#,cap#,0); % "The letter T"; \IOT=24 +%penpos1(bar,70); +%penpos2(bar,35); +%penpos4(bar,35); +%penpos5(bar,55); +%x1=0; y1r=h; y2r=y4r=.2[y1r,y1]; y5l=.3[y1l,y1]; +%x2l=1/3[x1l,x5l]; x4l=2/3[x1l,x5l]; x5=w; +%penpos6(stem,20); pentaper6(.1,0); +%penpos3(x6r-x6l,0); +%penpos7(stem,10); +%y3=y2; x3=.5w; +%x6r=x3r; y6=2/3h; +%x7=x6; y7=0; +%penstroke z1e{curl infinity}..z2e..z4e..{curl infinity}z5e; +%penstroke z3e..z6e{down}..z7e; +%labels.top(1r,2l,2,2r,4l,4,4r,6); +%labels.lft(1,1l,6l); +%labels.rt(5,5r,5l,6r); +%labels.bot(3l,3,3r,7,7r,7l); +%endchar; + +beginchar(25,5/9em#,cap#,0); % "The letter S"; /IOS=25 +penpos1(slab,70); +penpos2(.5slab,80); +penpos3(.5[slab,thick],200); +penpos5(.5[slab,thick],210); +penpos6(.7slab,80); +penpos7(.25[slab,thick],72); +x1=x5; y1r=.94h+o; +x2=x4=x6=.5w; y2r=h+o; y4=.54h; y6l=-o; +x3r=.04em; y3=.5[y4,y2]; +x5l=w-.03em; y5=.5[y4,y6]; +.5[x7l,x7]=.04em; y7l=.12h-o; +path trial; trial=z3{down}..z4..{down}z5; +pair dz; dz=direction 1 of trial; +penpos4(thick,angle dz-90); +penstroke z1e..z2e{left}..z3e{down}..z4e{dz}..z5e{down}..z6e{left}..z7e; +labels.lft(2,3r,5r,6,7); +labels.rt(1,3l,4,5l); +labels.top(1r,2r,3,4l,5,6r,7r); +labels.bot(1l,2l,4r,6l,7l); +endchar; + +beginchar(26,0.8em#,cap#,0); % "The letter O"; \IOO=26 + penpos1(thick,10); penpos2(.1[thin,thick],90-10); + penpos3(thick,180+10); penpos4(thin,270-10); + x1l=w-x3l=curve_sidebar; x2=x4=.5w; + y1=.49h; y2l=-o; y3=.51h; y4l=h+o; + penstroke z1e{down}..z2e{right}..z3e{up}..z4e{left}..cycle; + penlabels(1,2,3,4); endchar; + +beginchar(27,.35em#,cap#,0); % "The letter I"; \IOI=27 + penpos1(stem,15); penpos2(.9stem,12); penpos3(stem,10); + x1=x2=x3=.5w; y1=h; y2=.55h; y3=0; x2l:=1/6[x2l,x2]; + penstroke z1e..z2e{down}..z3e; + penlabels(1,2,3); endchar; + +%ligtable 24: 24 kern .05em#, 26 kern -.05em#; % TT and TO are adjusted + +message "Cubes and such"; +s#:=5pt#; define_pixels(s); % side of the square +beginchar(28,5/3s#,4/3s#,0); % "Possible cube"; \cubea=28 +z1=(-epsilon,-epsilon); z2=(s+epsilon,-epsilon); + z3=(-epsilon,s+epsilon); z4=(s+epsilon,s+epsilon); +for k=1 upto 4: z[k+4]=z[k]+(2/3s,1/3s); endfor +pickup pencircle scaled .4pt; +draw z5--z6--z8--z7--cycle; +pickup pencircle scaled 1.6pt; +erase draw z2--z4--z3; +pickup pencircle scaled .4pt; +draw z1--z2--z4--z3--cycle; +for k=1 upto 4: draw z[k]--z[k+4]; endfor +labels.top(1,2,5,6); +labels.bot(3,4,7,8); +endchar; + +beginchar(29,5/3s#,4/3s#,0); % "Impossible cube"; \cubeb=29 +z1=(-epsilon,-epsilon); z2=(s+epsilon,-epsilon); + z3=(-epsilon,s+epsilon); z4=(s+epsilon,s+epsilon); +for k=1 upto 4: z[k+4]=z[k]+(2/3s,1/3s); endfor +pickup pencircle scaled .4pt; +draw z3--z4; draw z5--z6; +cullit; pickup pencircle scaled 1.6pt; +undraw z7--1/2[z7,z5]; + undraw z2--1/2[z2,z4]; +cullit; pickup pencircle scaled .4pt; +draw z3--z1--z2--z4; + draw z5--z7--z8--z6; +for k=1 upto 4: draw z[k]--z[k+4]; endfor +labels.top(1,2,5,6); +labels.bot(3,4,7,8); +endchar; + +beginchar(30,10pt#,7pt#,2pt#); % bicentennial star +pair center; center=(.5w,2pt); +numeric radius; radius=5pt; +for k=0 upto 4: z[k]=center+(radius,0) rotated(90+360/5k); endfor +def :: = ..tension 5.. enddef; +path star; star=z0::z2::z4::z1::z3::cycle; +pickup pencircle scaled .4pt; draw star; +cullit; pickup pencircle scaled 1.6pt; +for k=0 upto 4: undraw subpath(k+.55,k+.7) of star; endfor +cullit; pickup pencircle scaled .4pt; +for k=0 upto 4: draw subpath(k+.47,k+.8) of star; endfor +labels(0,1,2,3,4); endchar; + +beginchar(31,2/3*11pt#,.5*11pt#,0); % \oneu=31 +pickup pencircle scaled 3/4pt yscaled 1/3 rotated 30; +save ww; ww=3/2w; +save t; transform t; +t=identity rotatedaround((.5ww,h),-90); +x2=.35ww; x3=good.x .6ww; +y2=good.y .2h; top y3=round .8h+eps; +save p; path p; p=z2{right}...{up}z3; +top z1=point .5 of p transformed t; +draw (z1...p); +labels(1,2,3); endchar; + +beginchar(38,11pt#,11pt#,0); % \fouru=38 +pickup pencircle scaled 3/4pt yscaled 1/3 rotated 30; +save t; transform t; +t=identity rotatedaround((.5w,.5h),-90); +x2=.35w; x3=good.x .6w; +y2=good.y .1h; top y3=round .4h+eps; +save p; path p; p=z2{right}...{up}z3; +top z1=point .5 of p transformed t; +draw (z1...p); +addto currentpicture also currentpicture transformed t; +addto currentpicture also currentpicture transformed(t transformed t); +labels.bot(1,3); labels.rt(2); endchar; + +beginchar(39,11pt#,11pt#,0); % \fourc=39 +pickup pencircle scaled 3/4pt yscaled 1/3 rotated 30; +save t; transform t; +t=identity rotatedaround((.5w,.5h),-90); +x2=.35w; x3=good.x .6w; +y2=good.y .1h; top y3=round .4h+eps; +save p; path p; p=z2{right}...{up}z3; +top z1=point .5 of p transformed t; +draw (z1...p) rotatedaround((.5w,.5h),-45) + withpen pencircle scaled 3/4pt yscaled 1/3 rotated-15; +addto currentpicture also currentpicture transformed t; +addto currentpicture also currentpicture transformed(t transformed t); +labels.bot(1,3); labels.rt(2); endchar; + +message "Circle variations"; + +beginchar(32,5pt#,5pt#,0); "Quarter circle"; % \circa +pickup pencircle scaled (.4pt+blacker); +draw quartercircle scaled 10pt; endchar; + +beginchar(33,5pt#,5pt#,0); "Filled quarter circle"; % \circb +fill ((0,0)--quartercircle--cycle) scaled 10pt; endchar; + +beginchar(34,5pt#,5pt#,0); "Rotated quarter circle"; % \circc +pickup pencircle scaled (.4pt+blacker); +draw quartercircle rotated 90 scaled 10pt shifted (5pt,0); endchar; + +beginchar(35,5pt#*sqrt2,5pt#,0); "Cone"; % \circd +pickup pencircle scaled (.4pt+blacker); +draw ((0,0)--quartercircle--cycle) + rotated 45 scaled 10pt shifted (.5w,0); endchar; + +beginchar(36,10pt#,7.5pt#,2.5pt#); "Concentric circles"; % \circe +pickup pencircle scaled (.4pt+blacker); +for D=.2w,.6w,w: + draw fullcircle scaled D shifted (.5w,.5[-d,h]); + endfor endchar; + +beginchar(37,10pt#,7.5pt#,2.5pt#); "Concentric diamonds"; % \circf +pickup pencircle scaled (.4pt+blacker); +for D=.2w,.6w,w: + draw unitsquare shifted -(.5,.5) rotated 45 + scaled (D/sqrt2) shifted (.5w,.5[-d,h]); + endfor endchar; + +message "Miscellaneous symbols"; % mostly from the old manfnt + +beginchar(oct"171",15pt#,7.5pt#,2.5pt#); % arrow for errata lists +curve#:=30/36pt#; dcurve#:=60/36pt#; bar#:=25/36pt#; +define_whole_blacker_pixels(curve,dcurve,bar); +penpos1(curve,90); penpos2(curve,90); penpos3(dcurve,90); +penpos4(dcurve,90); penpos5(curve,90); penpos6(curve,90); +y1r=vround(y1r-(y1-.5[-d,h])); y2=y5=y6=y1=y0; y4l=-d; y3r=h; +x1=0; x2=.1w; x3=.2w; x4=.55w; x5=.65w; +x2l:=x2l+.25curve; x5r:=x5r-.25curve; +penstroke z1e--z2e--z3e--z4e--z5e; % crooked arrow +penpos13(bar,0); penpos14(bar,0); x0=w; +y13-y0=y0-y14=.24h+eps; x13=x14=7/8w-eps; +penpos15(.5bar,angle(z14-z0)); z15l=z0; penpos16(.5bar,angle(z13-z0)); z16l=z0; +z19=.381966[.5[z13,z14],z0]; +numeric t; path p; p=z14l{z19-z14}..z16r; +t=xpart(p intersectiontimes((0,y6l)--(w,y6l))); x6=xpart point t of p; +filldraw z0..{z14-z19}z14r--subpath (0,t) of\\(z14l{z19-z14}..z16r) + --z6l--z5l--z5r--z6r--subpath (t,0) of\\(z13l{z19-z13}..z15r) + --z13r{z19-z13}..z0 & cycle; % arrowhead and link +penlabels(range 1 thru 19); endchar; + +beginchar(oct"170", 5pt#, 6.25pt#, 0); "Triangle for exercises"; +x1=x2=w-x3=round .43pt; y3=.5+floor.5h; +z1-z2=(z3-z2) rotated 60; +y1:=.5sqrt3+round(y1-.5sqrt3); y2:=h-y1; +fill z1--z2--z3--cycle; +labels(1,2,3); endchar; + +beginchar("6",256/36pt#,250/36pt#,0); % upper triangle for Addison-Wesley logo +x1=round 5/36pt; x2=round .5w; x2-x1=x3-x2=(y2-y1)/(sqrt 3); +y1=y3=0; fill z1--z2--z3--cycle; labels(1,2,3); endchar; + +beginchar("7",256/36pt#,250/36pt#,0); % lower triangle for Addison-Wesley logo +x1=round 5/36pt; x2=round .5w; x2-x1=x3-x2=(y1-y2)/(sqrt 3); +y1=y3; y2=0; fill z1--z2--z3--cycle; labels(1,2,3); endchar; + +def font_setup= +define_pixels(u,tiny,axis,hheight,border); +define_blacker_pixels(hair,thin,thick,rulethickness); +pickup if tiny<.5: nullpen else: pencircle scaled tiny fi; +tinypen:=savepen; +currenttransform:=identity yscaled aspect_ratio slanted slant; +enddef; + +% typical cmr10 parameters +u#:=20/36pt#; +tiny#:=0; +axis#:=90/36pt#; +hheight#:=250/36pt#; +border#:=20/36pt#; +hair#:=8/36pt#; +thin#:=9/36pt#; +thick#:=25/36pt#; +fixwidth:=0; +slant:=0; +rulethickness#:=.4pt#; + +baselinedistance#:=11pt#; +heavyline#:=50/36pt#; +font_setup; +define_whole_pixels(baselinedistance); +define_blacker_pixels(heavyline); + +beginchar(127,25u#,hheight#+border#,0); "Dangerous bend sign"; +pickup pencircle scaled rulethickness; +top y1=25/27h; lft x4=0; +x1+x1=x1a+x1b=x4b+x2a=x4+x2=x4a+x2b=x3b+x3a=x3+x3=w; +x4a=x4b=x4+u; x3b=x1a=x1-2u; +y4+y4=y4a+y4b=y3b+y1a=y3+y1=y3a+y1b=y2b+y2a=y2+y2=0; +y1a=y1b=y1-2/27h; y4b=y2a=y4+4/27h; +draw z1a..z1..z1b---z2a..z2..z2b--- + z3a..z3..z3b---z4a..z4..z4b---cycle; % signboard +x10=x11=x12=x13=good.x(.5w-u); x14=x15=x16=x17=w-x10; +y10=y14=28/27h+epsilon; bot y13=-baselinedistance; +z11=(z10..z13) intersectionpoint (z1a{z1a-z4b}..z1{right}); +y15=y11; y16=y12=-y11; y17=y20=y21=y13; +draw z11--z10--z14--z15; draw z12--z13; draw z16--z17; % signpost +x20=w-x21; x21-x20=16u; draw z20--z21; % ground level +x38=w-x31; x38-x31=8u; x32=x34=x38; x31=x35=x37; +y31=-y38=12/27h; y32=-y37=9/27h; y34=-y35=3/27h; +pickup pencircle scaled heavyline; +draw z32{z32-z31}..z34---z35..z37{z38-z37}; % the dangerous bend +pickup penrazor xscaled heavyline rotated (angle(z32-z31)+90); +draw z31--z32; draw z37--z38; % upper and lower bars +labels(1,1a,1b,2,2a,2b,3,3a,3b,4,4a,4b,10,11,12,13,14,15,16,17,20,21, + 31,32,33,34,35,36,37,38); +picture dbend; dbend=currentpicture; +endchar; +beginchar(126,25u#,hheight#+border#,0); "Lefthanded ditto"; +currentpicture:=dbend reflectedabout((.5w,0),(.5w,h)); +endchar; +beginchar(0,25u#,hheight#+border#,0); "Reverse video ditto"; +fill (0,-11pt)--(w,-11pt)--(w,h)--(0,h)--cycle; +addto currentpicture also -dbend; +endchar; + +beginchar(oct"140",3.75pt#,7pt#,4/3pt#); "special 1/7 for a quotation"; +currenttransform:=currenttransform slanted(2/7/aspect_ratio); +y3=y4=.5[h,-d]=.5[y2,y5]; y5=y6; +x1=x2=x7=.5w; x5+x6=x3+x4=w; x5=x3+1/6pt; +pickup pencircle xscaled .5pt yscaled .35pt; +bot y2=top y3+pt; top y1=h; bot y7=-d; lft x3=0; % y2 moved up 1/3pt (Feb 5) +draw z1..z2; draw z3..z4; +draw z5--z6..{down}z7; +labels(1,2,3,4,5,6,7); +endchar; +currenttransform:=currenttransform slanted(-2/7/aspect_ratio); + +% Circumscribed circles +pickup pencircle scaled(.4pt+blacker); rpen:=savepen; +def begincircle(expr code,units,depth,asp,superness)= +beginchar(code,units*20/36pt#,0,0); pickup rpen; +aa:=.5(w++depth*pt/asp); +x2=x4=.5[x1,x3]=.5w; y1=y3=.5[y2,y4]=-.5round(depth*pt); +x1=good.x(x2+aa); y2=good.y(y1+asp*aa); +draw superellipse(z1,z2,z3,z4,superness); labels(1,2,3,4) enddef; + +"Ellipse for floating-point mod operator"; % also for pseudo coin top +begincircle(oct"130",29,5,.5,.75786); endchar; + +"Edge and bottom of pseudo coin"; +begincircle(oct"133",29,5,.5,.75786); charht:=2pt#; +erase fill rt z1--(rt x1,top y2)--(lft x3,top y2)--lft z3--cycle; +x0=x1; x5=x3; y0=y5=y1+2pt; draw z0--z1; draw z3--z5; labels(0,5); endchar; + +"Circle to enclose two digits"; +begincircle(oct"131",19,7.5,1,.75786); endchar; + +"Circle to enclose an exponent of 2"; +begincircle(oct"132",9,6,1,1/sqrt2); endchar; + +% Now we do the \qc font from TeXbook Appendix D +pickup pencircle scaled ceiling pt; ptpen:=savepen; + +beginchar("a",10pt#,5.5pt#,4.5pt#); pickup ptpen; % W to S +bot y1=lft x2=0; x2=.5[x1,x1+w]; y1=.5[y2,y2+h+d]; +draw z1{right}..{down}z2; labels(1,2); endchar; + +beginchar("b",10pt#,5.5pt#,4.5pt#); pickup ptpen; % W to N +bot y1=lft x2=0; x2=.5[x1,x1+w]; y1=.5[y2,y2-h-d]; +draw z1{right}..{up}z2; labels(1,2); endchar; + +beginchar("c",10pt#,5.5pt#,4.5pt#); pickup ptpen; % E to N +bot y1=lft x2=0; x2=.5[x1,x1-w]; y1=.5[y2,y2-h-d]; +draw z1{left}..{up}z2; labels(1,2); endchar; + +beginchar("d",10pt#,5.5pt#,4.5pt#); pickup ptpen; % E to S +bot y1=lft x2=0; x2=.5[x1,x1-w]; y1=.5[y2,y2+h+d]; +draw z1{left}..{down}z2; labels(1,2); endchar; + +fontdimen 8: pt#; % rule thickness in \qc + +message "METAFONT logo"; + +def arc(suffix i,j) = + (z.i{0,y.j-y.i}.. + (beta[x.i,x.j],beta[y.j,y.i]){z.j-z.i}.. + z.j{x.j-x.i,0}) enddef; + +def double_arc(suffix i,j,k) = + arc(i,j) & reverse arc(k,j) enddef; + +alpha:=.45; % controls bar location and similar things +beta:=.2; % controls squareness of bowls + +def setparameters(text parameter_equations) = + string code.M,code.E,code.T,code.A,code.F,code.O,code.N; + numeric h#, xx#, yy#, o#, s#, u#, px#, py#; + numeric leftstemloc, barheight; + parameter_equations; + yy#=(h#/13.5u#)*xx#; define_whole_pixels(xx,yy); + define_pixels(s,u); + define_corrected_pixels(o); + py#=.9px#; define_blacker_pixels(px,py); + pickup pencircle xscaled px yscaled py; + logo_pen:=savepen; + leftstemloc:=good.x((2.5u#+s#)*pt); + barheight:=good.y(alpha*h#*pt); + ligtable code.T: code.A kern -.5u#; + ligtable code.F: code.O kern -u#; +enddef; + +def beginlogochar(suffix c)(expr n) = % code c; width is n units plus sidebars + beginchar(code.c,n*u#+2s#,h#,0); pickup logo_pen enddef; + +def do_it = +beginlogochar(M,18); +x1=x2=leftstemloc; x4=x5=w-x1; x3=w-x3; +y1=y5; y2=y4; bot.y1=-o; top y2=h+o; y3=y1+yy; +draw z1--z2--z3--z4--z5; +labels(1,2,3,4,5); +endchar; + +beginlogochar(E,14); +x1=x2=x3=leftstemloc; x4=x6=w-x1+o; x5=x4-xx; +y1=y6; y2=y5; y3=y4; bot.y1=0; top.y3=h; y2=barheight; +draw z6--z1--z3--z4; draw z2..z5; +labels(1,2,3,4,5,6); +endchar; + +beginlogochar(T,13); +italcorr h#*slant+.5u#; +if odd(w-px): w:=w+1; fi % allows a symmetric stem +lft x1=-epsilon; x2=w-x1; x3=x4=.5w; % I tried lft x1=s-o; not as good +y1=y2=y3; top.y1=h; bot.y4=-o; +draw z1..z2; draw z3..z4; +labels(1,2,3,4); +endchar; + +beginlogochar(A,15); % changed from 16 on Oct 16! +x1+x4=x2+x3=2x5=w; x1=x2=leftstemloc; +y1=y4; y2=y3; bot.y1=-o; top.y5=h+o; y2=barheight; +draw double_arc(2,5,3); draw z1--z2--z3--z4; +labels(1,2,3,4,5); +endchar; + +beginlogochar(F,14); +x1=x2=x3=leftstemloc; x4=w-x1+o; x5=x4-xx; +y2=y5; y3=y4; bot.y1=-o; top.y3=h; y2=barheight; +draw z1--z3--z4; draw z2..z5; +labels(1,2,3,4,5); +endchar; + +beginlogochar(O,15); +x1+x2=x3+x4=w; x1=good.x(1.5u+s); x3=x4; +bot.y3=-o; top.y4=h+o; y1=y2=barheight; +draw double_arc(1,4,2); draw double_arc(2,3,1); +labels(1,2,3,4); +endchar; + +beginlogochar(N,15); +x1+x4=x1+x3=x2+x5=w; x1=x2=leftstemloc; +y1=y4=y3-yy; bot.y1=-o; y2=y5; top.y5=h+o; +draw z1--z2--z3; draw z4..z5; +labels(1,2,3,4,5); +endchar; +enddef; % the end of "do_it" + +% ten-point size +message " ten point"; +setparameters(h#=6; % height of characters, in pt +slant:=0; + xx#=0.6; % extra length of certain features, in pt + u#=4/9; % unit width, in pt + s#=0; % extra sidebar, in pt + o#=1/9; % overshoot of curves, in pt + px#=2/3; % horizontal thickness of pen, in pt + code.M="M"; code.E="E"; code.T="T"; code.A="A"; + code.F="F"; code.O="O"; code.N="N") +do_it; + +currenttransform:=currenttransform slanted(.25/aspect_ratio); +% ten-point size, slanted: 89:;<=>: = METAFONT! +message " slanted ten point"; +setparameters(h#=6; % height of characters, in pt +slant:=.25; + xx#=0.6; % extra length of certain features, in pt + u#=4/9; % unit width, in pt + s#=0; % extra sidebar, in pt + o#=1/9; % overshoot of curves, in pt + px#=2/3; % horizontal thickness of pen, in pt + code.M="8"; code.E="9"; code.T=":"; code.A=";"; + code.F="<"; code.O="="; code.N=">") +do_it; +currenttransform:=currenttransform slanted(-.25/aspect_ratio); + +% nine-point size: hijklmnj = METAFONT! +message " nine point"; +setparameters(h#=.9*6; % height of characters, in pt +slant:=0; + xx#=.9*0.6; % extra length of certain features, in pt + u#=.91*4/9; % unit width, in pt + s#=.08; % extra sidebar, in pt + o#=1/10; % overshoot of curves, in pt + px#=.9*2/3; % horizontal thickness of pen, in pt + code.M="h"; code.E="i"; code.T="j"; code.A="k"; + code.F="l"; code.O="m"; code.N="n") +do_it; +font_quad 18u#+2s#; % we take spacing from the 9-point logo font +font_normal_space 6u#+2s#; +font_normal_stretch 3u#; +font_normal_shrink 2u#; + +% eight-point size: opqrstuq = METAFONT! +message " eight point"; +setparameters(h#=.8*6; % height of characters, in pt +slant:=0; + xx#=.8*0.6; % extra length of certain features, in pt + u#=.82*4/9; % unit width, in pt + s#=.2; % extra sidebar, in pt + o#=1/12; % overshoot of curves, in pt + px#=.8*2/3; % horizontal thickness of pen, in pt + code.M="o"; code.E="p"; code.T="q"; code.A="r"; + code.F="s"; code.O="t"; code.N="u") +do_it; + +% eight-point size, magnified 10/8: /0123451 = METAFONT! +message " magnified eight point"; +setparameters(h#=.8*6*10/8; % height of characters, in pt +slant:=0; + xx#=.8*0.6*10/8; % extra length of certain features, in pt + u#=.82*4/9*10/8; % unit width, in pt + s#=.2*10/8; % extra sidebar, in pt + o#=1/12*10/8; % overshoot of curves, in pt + px#=.8*2/3*10/8; % horizontal thickness of pen, in pt + code.M="/"; code.E="0"; code.T="1"; code.A="2"; + code.F="3"; code.O="4"; code.N="5") +do_it; + +currenttransform:=currenttransform slanted(2/7/aspect_ratio); +% eight-point size, slanted: \]^_efg^ = METAFONT! +message " slanted eight point"; +slant:=2/7; +setparameters(h#=.8*6; % height of characters, in pt + xx#=.8*0.6; % extra length of certain features, in pt + u#=.82*4/9; % unit width, in pt + s#=.2; % extra sidebar, in pt + o#=1/12; % overshoot of curves, in pt + px#=.8*2/3; % horizontal thickness of pen, in pt + code.M="\"; code.E="]"; code.T="^"; code.A="_"; + code.F="e"; code.O="f"; code.N="g") +do_it; +currenttransform:=currenttransform slanted(-2/7/aspect_ratio); + +% special size for the title page: ()*+,-.* = METAFONT! +message " title page size"; +setparameters(h#=250/9; % height of characters, in pt (same as cmssc40) +slant:=0; + xx#=2.9; % extra length of certain features, in pt + u#=(1+sqrt5)/2; % unit width, in pt + s#=.2; % extra sidebar, in pt + o#=4/9; % overshoot of curves, in pt + px#=4; % horizontal thickness of pen, in pt + code.M="("; code.E=")"; code.T="*"; code.A="+"; + code.F=","; code.O="-"; code.N=".") +do_it; + +currenttransform:=currenttransform slanted(-1/9/aspect_ratio); +% backslanted skinny bold: BCDGHIJD = METAFONT! +message " weird skinny bold condensed"; +setparameters(h#=25; % height of characters, in pt +slant:=-1/9; % leftward bias + xx#=1.5; % extra length of certain features, in pt + u#=3/9; % unit width, in pt + s#=1/3; % extra sidebar, in pt + o#=2/9; % overshoot of curves, in pt + px#=1; % horizontal thickness of pen, in pt + code.M="B"; code.E="C"; code.T="D"; code.A="G"; + code.F="H"; code.O="I"; code.N="J") +do_it; +currenttransform:=currenttransform slanted(+1/9/aspect_ratio); + +% ultrawide light: KLUVWvwU = METAFONT! +message " weird light extended"; +setparameters(h#=6; % height of characters, in pt +slant:=0; + xx#=2; % extra length of certain features, in pt + u#=4/3; % unit width, in pt + s#=-2/3; % extra sidebar, in pt + o#=1/9; % overshoot of curves, in pt + px#=1/3; % horizontal thickness of pen, in pt + code.M="K"; code.E="L"; code.T="U"; code.A="V"; + code.F="W"; code.O="v"; code.N="w") +do_it; + +message "Pixel symbols"; + +beginchar("P",722.7/722.909pt#,722.7/722.909pt#,0); % 1pt pixel +pickup pencircle scaled .2pt; +top lft z1=(0,.8h); top rt z2=(.8w,.8h); +bot lft z3=(0,0); bot rt z4=(.8w,0); +draw z1--z4; draw z2--z3; endchar; + +beginchar("Q",722.7/722.909pt#,722.7/722.909pt#,0); % 1pt nonpixel +pickup pencircle scaled .2pt; +drawdot(.4w,.4h); endchar; + +beginchar("R",3*722.7/722.909pt#,3*722.7/722.909pt#,0); % 3pt pixel +pickup pencircle scaled .3pt; +interim autorounding:=0; +top lft z1=(0,.9h); top z2=(.45w,.9h); top rt z3=(.9w,.9h); +lft z4=(0,.45h); rt z5=(.9w,.45h); +bot lft z6=(0,0); bot z7=(.45w,0); bot rt z8=(.9w,0); +draw z1+(-50epsilon,50epsilon)--z8+(50epsilon,-50epsilon); +draw z2+(0,50epsilon)--z7-(0,50epsilon); +draw z3+(50epsilon,50epsilon)--z6-(50epsilon,50epsilon); +draw z4-(50epsilon,0)--z5+(50epsilon,0); endchar; + +beginchar("S",3*722.7/722.909pt#,3*722.7/722.909pt#,0); % 3pt nonpixel +pickup pencircle scaled .3pt; +drawdot(.45w,.45h); endchar; + +message "Gothic d"; + +beginchar("?",4pt#,8pt#,0); + % taken from NB, but my changes may have spoiled it +stem_length#:=10/6.7pt#; define_blacker_pixels(stem_length); +xheight:=6pt; +penpos1 (2*stem_length,30); % normal points +penpos2 (2*stem_length,30); % normal points +penpos3 (2*stem_length,30); % normal points +penpos4 (2*stem_length,30); % normal points + +x1l=x2=0; y1r=xheight; y2l=0; + penpos40(stem_length,30); z40r=round z1; + penpos41(stem_length,40); x40r=x41r=x42r; y41=.5[y40,y42]; + penpos42(stem_length,30); y42l=y2; +fill z40r--(x40r,y42l)--z42l...z41l{up}...z40l--cycle; % left stem + +x3=x4r=w; y3=y1; y4=y2; + penpos50(stem_length,30); z50l=round z3l; + penpos51(stem_length,40); x50l=x51l=x52l; y51=.5[y50,y52]; + penpos52(stem_length,30); y52l=y4; +fill z52l--(x52l,y50r)--z50r...z51r{down}...z52r--cycle; % right stem + + penpos10(stem_length,30); z10=z42; + penpos11(stem_length,25); x11=.5[x10,x12]; y10l=y11=y12r; + penpos12(stem_length,30); x12r=x4; % redundant: y12l=0; + penpos14(stem_length*(1+cosd30),30); z14l=z12l; + penpos15(.07stem_length,120); z15l=z14r; +fill z10l...z11l{z12-z10}...z12l--z14r + --z15r{z14l-z14r}...z11r{z10-z12}...z10r--cycle; % lower join + +numeric ch; ch=10; % Neenie's version was more like ch=7.5 (steeper) +numeric s_length[]; + s_length0*cosd(30-ch)=stem_length*cosd 30; + s_length1*cosd(40-ch)=stem_length*cosd 40; +pair corner; corner=z50r; +vardef f(expr theta)= + save x,y; penpos60(s_length0,theta); y60r=h; x60l=0; + angle(z60r-corner)floor mag): + errmessage "Sorry, mag must be a positive integer"; mag := 1; fi + +mg := mag; mag := 1; mode_setup; u# := u*72.27/pixels_per_inch; +pixels_per_inch := pixels_per_inch*mg; fix_units; + +define_whole_pixels(u); define_blacker_pixels(r); +pickup pencircle scaled r; ruler := savepen; + +for k=1 upto n: + beginchar(k,k*u#*s,n*u#,0); + pickup ruler; draw origin--(k*u*s,k*u); + unfill (lft-1,bot -1)--(rt 1,bot -1) + --(rt 1,0)--(lft-1,0)--cycle; + unfill ((lft -1,0)--(rt 1,0) + --(rt 1,top 1)--(lft -1,top 1)--cycle) shifted (k*u*s,k*u); + endchar; endfor + +font_size 16pt#; +font_slant s; +fontdimen 8: r#; +font_coding_scheme "GFSLANT"; +bye. -- cgit v1.2.3