You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2481 lines
71 KiB
2481 lines
71 KiB
% This file generates most of the figures for The METAFONTbook
|
|
|
|
lcode_:=" /"; % suppress overflow labels
|
|
grayfont black;
|
|
|
|
def clear_all = clearit; clearxy; pickup standardpen;
|
|
proofrulethickness 0;
|
|
enddef;
|
|
|
|
def heavy_dot expr z =
|
|
makelabel.top("",z-(1,0));
|
|
makelabel.top("",z+(1,0));
|
|
makelabel.top("",z-(0,1));
|
|
makelabel.top("",z+(0,1));
|
|
makelabel.top("",z+(1,1)/sqrt2);
|
|
makelabel.top("",z+(1,-1)/sqrt2);
|
|
makelabel.top("",z-(1,1)/sqrt2);
|
|
makelabel.top("",z-(1,-1)/sqrt2);
|
|
enddef;
|
|
|
|
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 slanted slant yscaled aspect_ratio;
|
|
enddef;
|
|
|
|
mode=proof; mode_setup;
|
|
standardpen=savepen;
|
|
|
|
"Figure 2a"; % 6 points and a grid
|
|
clear_all;
|
|
pair offset; offset=(.5,.5);
|
|
z1=(0,100)+offset;
|
|
z2=(100,100)+offset;
|
|
z3=(200,100)+offset;
|
|
z4=(0,0)+offset;
|
|
z5=(100,0)+offset;
|
|
z6=(200,0)+offset;
|
|
proofrulethickness .8;
|
|
proofrule (z1+(0,5),z4-(0,5)); proofrule (z4-(5,0),z6+(5,0));
|
|
makelabel.top("1 ",z1);
|
|
makelabel.top("2 ",z2);
|
|
makelabel.top("3 ",z3);
|
|
makelabel.bot("4 ",z4);
|
|
makelabel.bot("5 ",z5);
|
|
makelabel.bot("6 ",z6);
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
pickup pencircle;
|
|
for x=10 step 10 until 200: draw (x,-5)+offset..(x,105)+offset; endfor
|
|
for y=10 step 10 until 100: draw (-5,y)+offset..(205,y)+offset; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure A2a"; % 6 points and a grid and two more points
|
|
clear_all;
|
|
proofoffset(30,0);
|
|
pair offset; offset=(.5,.5);
|
|
z1=(0,100)+offset;
|
|
z2=(100,100)+offset;
|
|
z3=(200,100)+offset;
|
|
z4=(0,0)+offset;
|
|
z5=(100,0)+offset;
|
|
z6=(200,0)+offset;
|
|
proofrulethickness .8;
|
|
proofrule (z1+(0,5),z4-(0,5)); proofrule (z4-(5,0),z6+(5,0));
|
|
makelabel.top("1 ",z1);
|
|
makelabel.top("2 ",z2);
|
|
makelabel.top("3 ",z3);
|
|
makelabel.bot("4 ",z4);
|
|
makelabel.bot("5 ",z5);
|
|
makelabel.bot("6 ",z6);
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
makelabel.lft("(-5,15)",(-5,15)+offset);
|
|
makelabel.top("(60,30) ",(60,30)+offset);
|
|
%makelabel.top(" ,30) ",(60,30)+offset);
|
|
%makelabel.top("(60 ",(60,30)+offset);
|
|
heavy_dot (-5,15)+offset;
|
|
heavy_dot (60,30)+offset;
|
|
pickup pencircle;
|
|
for x=10 step 10 until 200: draw (x,-5)+offset..(x,105)+offset; endfor
|
|
for y=10 step 10 until 100: draw (-5,y)+offset..(205,y)+offset; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 2b"; % 6 points and a line
|
|
clear_all;
|
|
z1=(0,100);
|
|
z2=(100,100);
|
|
z3=(200,100);
|
|
z4=(0,0);
|
|
z5=(100,0);
|
|
z6=(200,0);
|
|
draw (x1-epsilon,y1)..(x6,y6);
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.lft("2",z2);
|
|
makelabel.rt("3",z3);
|
|
makelabel.lft("4",z4);
|
|
makelabel.lft("5",z5);
|
|
makelabel.rt(" 6",z6);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 2c"; % 6 points and three lines (hex symbol, version 1)
|
|
clear_all;
|
|
z1=(0,100);
|
|
z2=(100,100);
|
|
z3=(200,100);
|
|
z4=(0,0);
|
|
z5=(100,0);
|
|
z6=(200,0);
|
|
draw z1..z6; draw z2..z5; draw z3..z4;
|
|
for k=1 upto 6: drawdot z[k]; endfor
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.lft("2 ",z2);
|
|
makelabel.rt(" 3",z3);
|
|
makelabel.lft("4 ",z4);
|
|
makelabel.lft("5 ",z5);
|
|
makelabel.rt(" 6",z6);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 2d"; % hex symbols with top and bottom adjusted
|
|
clear_all;
|
|
top z1=(0,100);
|
|
top z2=(100,100);
|
|
top z3=(200,100);
|
|
bot z4=(0,0);
|
|
bot z5=(100,0);
|
|
bot z6=(200,0);
|
|
draw z1..z6; draw z2..z5; draw z3..z4;
|
|
for k=1 upto 6: drawdot z[k]; endfor
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.lft("2 ",z2);
|
|
makelabel.rt(" 3",z3);
|
|
makelabel.lft("4 ",z4);
|
|
makelabel.lft("5 ",z5);
|
|
makelabel.rt(" 6",z6);
|
|
showit;
|
|
clearxy; pair offset; offset=(250,0);
|
|
pickup pencircle scaled .6pt;
|
|
top z1=(0,100)+offset;
|
|
top z2=(100,100)+offset;
|
|
top z3=(200,100)+offset;
|
|
bot z4=(0,0)+offset;
|
|
bot z5=(100,0)+offset;
|
|
bot z6=(200,0)+offset;
|
|
draw z1..z6; draw z2..z5; draw z3..z4;
|
|
for k=1 upto 6: drawdot z[k]; endfor
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.lft("2 ",z2);
|
|
makelabel.rt(" 3",z3);
|
|
makelabel.lft("4 ",z4);
|
|
makelabel.lft("5 ",z5);
|
|
makelabel.rt(" 6",z6);
|
|
proofrule ((-5,100),(210,100)+offset);
|
|
proofrule ((-5,0),(210,0)+offset);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 2e"; % stick-letter A
|
|
b#:=250/36pt#; a#:=150/36pt#; s#:=30/36pt#;
|
|
define_pixels(b,a,s);
|
|
def A(expr alpha)=
|
|
beginchar (incr(charcode),s#+a#+s#,b#,0);
|
|
pickup standardpen;
|
|
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;
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.lft("2 ",z2);
|
|
makelabel.top("3 ",z3);
|
|
makelabel.rt(" 4",z4);
|
|
makelabel.rt(" 5",z5);
|
|
endchar; enddef;
|
|
|
|
A((3-sqrt5)/2); % (area above bar / area below) = golden ratio
|
|
|
|
"Figure 3a"; % 4 points and 3 midpoints
|
|
clear_all;
|
|
z1=(.5,.5); z2=(40.5,80.5); z3=(150.5,100.5); z4=(300.5,.5);
|
|
z12=1/2[z1,z2]; z23=1/2[z2,z3]; z34=1/2[z3,z4];
|
|
pickup pencircle;
|
|
draw z1--z2--z3--z4;
|
|
heavy_dot z1; heavy_dot z2; heavy_dot z3; heavy_dot z4;
|
|
makelabel.lft("1",z1);
|
|
makelabel.lft("2",z2);
|
|
makelabel.top(" 3",z3);
|
|
makelabel.rt("4",z4);
|
|
makelabel.rt("12",z12);
|
|
makelabel.bot(" 23",z23);
|
|
makelabel.bot("34 ",z34);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3b"; % 4 points and 6 midpoints
|
|
clear_all;
|
|
z1=(.5,.5); z2=(40.5,80.5); z3=(150.5,100.5); z4=(300.5,.5);
|
|
z12=1/2[z1,z2]; z23=1/2[z2,z3]; z34=1/2[z3,z4];
|
|
z123=1/2[z12,z23]; z234=1/2[z23,z34]; z1234=1/2[z123,z234];
|
|
heavy_dot z1; heavy_dot z2; heavy_dot z3; heavy_dot z4;
|
|
pickup pencircle;
|
|
draw z1--z2--z3--z4; draw z12--z23--z34; draw z123--z234;
|
|
makelabel.lft("1",z1);
|
|
makelabel.lft("2",z2);
|
|
makelabel.top(" 3",z3);
|
|
makelabel.rt("4",z4);
|
|
makelabel.lft("12",z12);
|
|
makelabel.top("23 ",z23);
|
|
makelabel.rt("34",z34);
|
|
makelabel.bot(" 123",z123);
|
|
makelabel.bot("234 ",z234);
|
|
makelabel.bot("1234",z1234);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3c"; % 4 points and infinitely many midpoints
|
|
clear_all;
|
|
z1=(.5,.5); z2=(40.5,80.5); z3=(150.5,100.5); z4=(300.5,.5);
|
|
heavy_dot z1; heavy_dot z2; heavy_dot z3; heavy_dot z4;
|
|
pickup pencircle;
|
|
|
|
def makedot(expr x)= special " 1";
|
|
numspecial xpart x; numspecial ypart x enddef;
|
|
|
|
def recurse(expr a,b,c,d)=
|
|
dist:=abs(a-d);
|
|
if dist>4:
|
|
begingroup save e,f,g,h,i,j; pair e,f,g,h,i,j;
|
|
e=(a+b)/2; makedot(e);
|
|
f=(b+c)/2; makedot(f);
|
|
g=(c+d)/2; makedot(g);
|
|
h=(e+f)/2; makedot(h);
|
|
i=(f+g)/2; makedot(i);
|
|
j=(h+i)/2; makedot(j);
|
|
if dist>20: draw a--b--c--d; draw e--f--g; draw h--i; fi
|
|
recurse(a,e,h,j); recurse(j,i,g,d);
|
|
endgroup;
|
|
fi enddef;
|
|
|
|
makedot(z1); makedot(z2); makedot(z3); makedot(z4); recurse(z1,z2,z3,z4);
|
|
makelabel.bot.nodot("ignore",(160,-10)); % kludge for GFtoEPS!
|
|
shipit;
|
|
|
|
"Figure 3d"; % 4 points and various cubics
|
|
clear_all;
|
|
z1=(0,0); z2=5/6(40,80); z3=5/6(150,100); z4=5/6(300,0);
|
|
draw z1..controls z2 and z3..z4;
|
|
drawdot z1; drawdot z4;
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.lft("2",z2);
|
|
makelabel.rt("3",z3);
|
|
makelabel.rt(" 4",z4);
|
|
pair offset; offset:=(325,0);
|
|
draw (z1..controls z3 and z2..z4) shifted offset;
|
|
drawdot z1+offset; drawdot z4+offset;
|
|
makelabel.lft("1 ",z1+offset);
|
|
makelabel.lft("3",z2+offset);
|
|
makelabel.rt("2",z3+offset);
|
|
makelabel.rt(" 4",z4+offset);
|
|
offset:=(0,-100);
|
|
draw (z2..controls z1 and z3..z4) shifted offset;
|
|
drawdot z2+offset; drawdot z4+offset;
|
|
makelabel.lft("2",z1+offset);
|
|
makelabel.lft("1 ",z2+offset);
|
|
makelabel.rt("3",z3+offset);
|
|
makelabel.rt(" 4",z4+offset);
|
|
offset:=(325,-100);
|
|
draw (z1..controls z4 and z2..z3) shifted offset;
|
|
drawdot z1+offset; drawdot z3+offset;
|
|
makelabel.lft("1 ",z1+offset);
|
|
makelabel.lft("3",z2+offset);
|
|
makelabel.rt(" 4",z3+offset);
|
|
makelabel.rt("2",z4+offset);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3e"; % example curves with automatic control points
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z4..z1..z2..z6;
|
|
draw p;
|
|
drawdot z4; drawdot z6;
|
|
makelabel.bot.nodot(" 1",z1);
|
|
makelabel.top.nodot(" 2",z2);
|
|
makelabel.rt.nodot("3",z3+(2,0));
|
|
makelabel.rt.nodot(" 4",z4);
|
|
makelabel.rt.nodot("5",z5+(2,0));
|
|
makelabel.rt.nodot(" 6",z6);
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
pair offset; offset=(325,0);
|
|
p:=(z5..z4..z1..z3..z6..z5) shifted offset; draw p;
|
|
drawdot z5+offset;
|
|
makelabel.bot.nodot(" 1",z1+offset);
|
|
makelabel.top.nodot("2",z2+offset+(0,2));
|
|
makelabel.bot.nodot("3 ",z3+offset);
|
|
makelabel.top.nodot(" 4",z4+offset);
|
|
makelabel.top.nodot("5",z5+offset+(0,5));
|
|
makelabel.top.nodot("6 ",z6+offset);
|
|
for k=1 upto 6: heavy_dot z[k]+offset; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3f"; % bean shape with automatic control points
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4..z1..z3..z6..cycle;
|
|
draw p;
|
|
makelabel.bot.nodot(" 1",z1);
|
|
makelabel.bot.nodot("2",z2-(0,2));
|
|
makelabel.bot.nodot("3 ",z3);
|
|
makelabel.top.nodot(" 4",z4+(-1,1));
|
|
makelabel.top.nodot("5",z5+(0,5));
|
|
makelabel.top.nodot("6 ",z6+(1,1));
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3g"; % bean shape with more tension between 1 and 3
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4..z1..tension1.2..z3..z6..cycle;
|
|
draw p;
|
|
makelabel.bot.nodot(" 1",z1);
|
|
makelabel.bot.nodot("2",z2-(0,2));
|
|
makelabel.bot.nodot("3 ",z3);
|
|
makelabel.top.nodot(" 4",z4+(-1,1));
|
|
makelabel.top.nodot("5",z5+(0,5));
|
|
makelabel.top.nodot("6 ",z6+(1,1));
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3h"; % bean shape with more tension before and after 1
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4..tension 1 and 1.5..z1..tension 1.5 and 1..z3..z6..cycle;
|
|
draw p;
|
|
makelabel.bot.nodot(" 1",z1);
|
|
makelabel.bot.nodot("2",z2-(0,2));
|
|
makelabel.bot.nodot("3 ",z3);
|
|
makelabel.top.nodot(" 4",z4+(-1,1));
|
|
makelabel.top.nodot("5",z5+(0,5));
|
|
makelabel.top.nodot("6 ",z6+(1,1));
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3i"; % bean shape with straight bottom
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4{left}..z1..z3..z6{left}..cycle;
|
|
draw p;
|
|
makelabel.bot.nodot(" 1",z1-(1,1));
|
|
makelabel.bot.nodot("2",z2-(0,2));
|
|
makelabel.bot.nodot("3 ",z3+(1,-1));
|
|
makelabel.top.nodot(" 4",z4+(0,5));
|
|
makelabel.top.nodot("5",z5+(0,5));
|
|
makelabel.top.nodot("6 ",z6+(0,5));
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3j"; % example with direction specified
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z4..z2{z3-z4}..z3;
|
|
draw p;
|
|
makelabel.rt.nodot("1",z1+(0,-9));
|
|
makelabel.rt.nodot("2",z2+(1,-11));
|
|
makelabel.rt.nodot("3",z3+(1,-11));
|
|
makelabel.rt.nodot("4",z4+(1,-11));
|
|
makelabel.rt.nodot("5",z5+(0,-9));
|
|
makelabel.rt.nodot("6",z6+(0,-9));
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3k"; % wiggly shape for exercise
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4{z4-z2}..z1..z3..z6{z2-z6}..cycle;
|
|
draw p;
|
|
makelabel.bot.nodot(" 1",z1-(2,2));
|
|
makelabel.bot.nodot("2",z2-(0,2));
|
|
makelabel.bot.nodot("3 ",z3+(2,-2));
|
|
makelabel.bot.nodot(" 4",z4);
|
|
makelabel.top.nodot("5",z5+(0,5));
|
|
makelabel.bot.nodot("6 ",z6);
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3l"; % examples of varying curl
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z4{curl0}..z2{z3-z4}..{curl0}z3;
|
|
draw p;
|
|
drawdot z4; drawdot z3;
|
|
makelabel.rt.nodot("1",z1+(0,-9));
|
|
makelabel.rt.nodot("2",z2+(1,-11));
|
|
makelabel.rt.nodot("3",z3+(1,-11));
|
|
makelabel.rt.nodot("4",z4+(1,-11));
|
|
makelabel.rt.nodot("5",z5+(0,-9));
|
|
makelabel.rt.nodot("6",z6+(0,-9));
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
pair offset; offset=(325,0);
|
|
p:=(z4{curl2}..z2{z3-z4}..{curl2}z3) shifted offset; draw p;
|
|
drawdot z4+offset; drawdot z3+offset;
|
|
makelabel.rt.nodot("1",z1+(0,-9)+offset);
|
|
makelabel.rt.nodot("2",z2+(1,-11)+offset);
|
|
makelabel.rt.nodot("3",z3+(1,-11)+offset);
|
|
makelabel.rt.nodot("4",z4+(1,-11)+offset);
|
|
makelabel.rt.nodot("5",z5+(0,-9)+offset);
|
|
makelabel.rt.nodot("6",z6+(0,-9)+offset);
|
|
for k=1 upto 6: heavy_dot z[k]+offset; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3m"; % two directions specified
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z4{z2-z4}..z6{down};
|
|
draw p;
|
|
drawdot z4; drawdot z6;
|
|
makelabel.rt.nodot("1",z1+(2,0));
|
|
makelabel.rt.nodot("2",z2+(2,0));
|
|
makelabel.rt.nodot("3",z3+(2,0));
|
|
makelabel.bot.nodot(" 4",z4);
|
|
makelabel.rt.nodot("5",z5+(2,0));
|
|
makelabel.rt.nodot(" 6",z6);
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
for k=1 upto length p: heavy_dot postcontrol k-1 of p;
|
|
heavy_dot precontrol k of p; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 3n"; % two control points specified
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z4..controls z1 and z2..z6;
|
|
draw p;
|
|
drawdot z4; drawdot z6;
|
|
makelabel.rt.nodot("1",z1+(2,0));
|
|
makelabel.rt.nodot("2",z2+(2,0));
|
|
makelabel.rt.nodot("3",z3+(2,0));
|
|
makelabel.rt.nodot(" 4",z4);
|
|
makelabel.rt.nodot("5",z5+(2,0));
|
|
makelabel.rt.nodot(" 6",z6);
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 4a"; % bean shape with elliptical pens
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4..z1..z3..z6..cycle;
|
|
pickup pencircle xscaled .8pt yscaled .2pt rotated 30;
|
|
draw p;
|
|
makelabel.bot(" 1",z1);
|
|
makelabel.bot("2",z2);
|
|
makelabel.bot(" 3",z3);
|
|
makelabel.top("4 ",z4);
|
|
makelabel.top("",z5); makelabel.top.nodot("5",z5+(0,5));
|
|
makelabel.top("",z6); makelabel.top.nodot("6 ",z6+(1,1));
|
|
pair offset; offset=(325,0);
|
|
pickup pencircle xscaled .8pt rotated 30;
|
|
draw p shifted offset;
|
|
makelabel.bot(" 1",z1+offset);
|
|
makelabel.bot("2",z2+offset);
|
|
makelabel.bot(" 3",z3+offset);
|
|
makelabel.top("4 ",z4+offset);
|
|
makelabel.top("",z5+offset); makelabel.top.nodot("5",z5+(0,5)+offset);
|
|
makelabel.top("",z6+offset); makelabel.top.nodot("6 ",z6+(1,1)+offset);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 4b"; % T of METAFONT logo
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(suffix c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(str c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
|
|
beginlogochar(T,13);
|
|
if odd(w-ph): w:=w+1; fi % allows a symmetric stem
|
|
x1+x2=2x3=2x4=w; lft.x1=-epsilon; % I tried s-o instead; was not as good
|
|
y1=y2=y3; top.y1=h; bot.y4=-o;
|
|
draw z1..z2; draw z3..z4;
|
|
labels.rt(2,3);
|
|
makelabel.top("1",z1);
|
|
makelabel.top("4",z4);
|
|
endchar;
|
|
|
|
"Figure 4c"; % M of METAFONT logo
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(suffix c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(str c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
|
|
beginlogochar(M,18);
|
|
x1+x5=x2+x4=2x3=w; x1=x2=leftstemloc;
|
|
y1=y5; y2=y4; bot.y1=-o; top y2=h+o; y3=y1+yy;
|
|
draw z1--z2--z3--z4--z5;
|
|
labels.rt(3,5);
|
|
makelabel.lft("1",z1);
|
|
makelabel.bot("2",z2);
|
|
makelabel.bot("4",z4);
|
|
endchar;
|
|
|
|
"Figure 4d"; % solid kidney bean
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4..z1..z3..z6..cycle;
|
|
fill p;
|
|
makelabel.bot(" 1",z1);
|
|
makelabel.bot("2",z2);
|
|
makelabel.bot("3 ",z3);
|
|
makelabel.top(" 4",z4);
|
|
makelabel.top("5",z5);
|
|
makelabel.top("6 ",z6);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 4e"; % black triangle character for exercises
|
|
beginchar(oct"170", 5pt#, 6.25pt#, 0);
|
|
t:=(2-sqrt3)/2;
|
|
x1=x2=w-x3+.5-t=round .43pt; y3=.5+floor.5h; % MANUAL font has it different!
|
|
%x1=x2=w-x3=round .43pt; y3=.5+floor.5h;
|
|
z1-z2=(z3-z2) rotated 60;
|
|
y2:=t+round(y2-t); y1:=h-y2;
|
|
fill z1--z2--z3--cycle;
|
|
labels.lft(1,2); labels.rt(3); endchar;
|
|
|
|
"Figure 4f"; % black bean with white holes
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4..z1..z3..z6..cycle;
|
|
fill p;
|
|
unfill 1/4[z4,z2]..3/4[z4,z2]..cycle;
|
|
unfill 1/4[z6,z2]..3/4[z6,z2]..cycle;
|
|
makelabel.bot(" 1",z1);
|
|
makelabel.bot("2",z2);
|
|
makelabel.bot("3 ",z3);
|
|
makelabel.top(" 4",z4);
|
|
makelabel.top("5",z5);
|
|
makelabel.top("6 ",z6);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 4g"; % black bean with skewed interior cutout
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z5..z4..z1..z3..z6..cycle;
|
|
fill p;
|
|
z0=(.8[x1,x2],.5[y1,y4]);
|
|
for k=1 upto 6: z[k]'=.2[z[k],z0]; endfor
|
|
unfill z5'..z4'..z1'..z3'..z6'..cycle;
|
|
makelabel.bot("0",z0);
|
|
makelabel.top("1 ",z1);
|
|
makelabel.top("2",z2);
|
|
makelabel.top(" 3",z3);
|
|
makelabel.bot("4 ",z4);
|
|
makelabel.bot("5",z5);
|
|
makelabel.bot(" 6",z6);
|
|
makelabel.bot(" 1'",z1');
|
|
makelabel.bot(" 2'",z2');
|
|
makelabel.bot("3' ",z3');
|
|
makelabel.top(" 4'",z4');
|
|
makelabel.top("5'",z5');
|
|
makelabel.top("6' ",z6');
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 4h"; % sample penstroke
|
|
clear_all;
|
|
penpos1(1.2pt,30); penpos2(1.0pt,45); penpos3(0.8pt,90);
|
|
z1=(0,2pt); z2=(4pt,0); x3=9pt; y3l=y2r;
|
|
penstroke z1e..z2e{right}..z3e{right};
|
|
labels.top(2r,3r);
|
|
labels.bot(2l,3l);
|
|
labels.rt(3,1r);
|
|
labels.lft(1l,2);
|
|
makelabel.top("1 ",z1);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 4i"; % cyclic penstroke example
|
|
clear_all;
|
|
d:=25;
|
|
penpos1(d,30);
|
|
penpos2(d,60);
|
|
penpos3(d,210);
|
|
penpos4(d,240);
|
|
y1=.51y2r; y2r=175; y3=.49y2r; y4r=0;
|
|
x1r=175; x2=x4=.5x1r; x3r=0;
|
|
penstroke z1e{up}..z2e{left}..z3e{down}..z4e{right}..cycle;
|
|
labels.lft(1l,2,3r,4);
|
|
labels.rt(1r,3l);
|
|
labels.top(2r,3,4l);
|
|
labels.bot(1,2l,4r);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 4j"; % I from IOnian font
|
|
clear_all;
|
|
em#:=10pt#; cap#:=7pt#;
|
|
bar#:=.8pt#;
|
|
stem#:=.9pt#;
|
|
thin#:=.8pt#;
|
|
thick#:=1pt#;
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick,bar,stem);
|
|
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;
|
|
labels.top(1,2,1r);
|
|
labels.lft(2l);
|
|
labels.rt(2r);
|
|
labels.bot(3,3l);
|
|
makelabel("",z1l); makelabel("",z3r);
|
|
makelabel.lft.nodot("1l",z1l-(0,2));
|
|
makelabel.rt.nodot("3r",z3r+(0,2));
|
|
endchar;
|
|
|
|
"Figure 4k"; % fixed pens versus penstrokes
|
|
clear_all;
|
|
z1=(0,0); z2=(150,0);
|
|
pickup pencircle xscaled 0.8pt rotated 25;
|
|
draw z1..z2..cycle;
|
|
labels.lft(1,2);
|
|
clearxy;
|
|
pair offset; offset=(250,0);
|
|
penpos1(0.8pt,25); penpos2(0.8pt,25);
|
|
z1=(0,0)+offset; z2=(150,0)+offset;
|
|
penstroke z1e..z2e..cycle;
|
|
labels.lft(1l,2l);
|
|
labels.rt(1r,2r);
|
|
labels.bot(1,2);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 4l"; % hex symbol with pen-pressure adjustments
|
|
%b#:=1.0pt#; define_blacker_pixels(b); % FOR INITIAL TESTS ONLY
|
|
%beginchar(0,500/36pt#,250/36pt#,0); % that's magnified 2.5 as in the type
|
|
b#:=0.4pt#; define_blacker_pixels(b);
|
|
beginchar(0,200/36pt#,100/36pt#,0);
|
|
pickup pencircle scaled b;
|
|
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);
|
|
draw z2..z5;
|
|
for k=1 upto 6: drawdot z[k]; endfor
|
|
z1'=.25[z1,z6]; z6'=.75[z1,z6];
|
|
z3'=.25[z3,z4]; z4'=.75[z3,z4];
|
|
theta1:=angle(z6-z1)+90;
|
|
theta3:=angle(z4-z3)+90;
|
|
penpos1'(b,theta1); penpos6'(b,theta1); penpos7(.6b,theta1);
|
|
penpos3'(b,theta3); penpos4'(b,theta3); penpos8(.6b,theta3);
|
|
z7=z8=.5[z1,z6];
|
|
draw z1..z1'; draw z6'..z6;
|
|
penstroke z1'e{z6'-z1'}..z7e..{z6'-z1'}z6'e;
|
|
draw z3..z3'; draw z4'..z4;
|
|
penstroke z3'e{z4'-z3'}..z8e..{z4'-z3'}z4'e;
|
|
labels.top(1'r,3'l,4'l,6'r);
|
|
labels.bot(1'l,3'r,4'r,6'l);
|
|
forsuffixes $=1',3',4',6': makelabel("",z$); endfor
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.lft("2 ",z2);
|
|
makelabel.rt(" 3",z3);
|
|
makelabel.lft("4 ",z4);
|
|
makelabel.lft("5 ",z5);
|
|
makelabel.rt(" 6",z6);
|
|
makelabel.top("8l ",z8l);
|
|
makelabel.top(" 7r",z7r);
|
|
makelabel.bot("7l ",z7l);
|
|
makelabel.bot(" 8r",z8r);
|
|
endchar;
|
|
|
|
"Figure 4m"; % same, cut sharp at the terminals, and inside the box
|
|
%b#:=1.0pt#; define_blacker_pixels(b); % FOR INITIAL TESTS ONLY
|
|
%beginchar(0,500/36pt#,250/36pt#,0); % that's magnified 2.5 as in the type
|
|
b#:=0.4pt#; define_blacker_pixels(b);
|
|
beginchar(0,200/36pt#,100/36pt#,0);
|
|
pickup pencircle scaled b;
|
|
w:=2good.x .5w;
|
|
x1l=x4l=0;x2=x5=.5w;x3r=x6r=w;
|
|
y1r=y2=y3l=h; y4r=y5=y6l=0;
|
|
z1'=.25[z1,z6]; z6'=.75[z1,z6]; theta1:=angle(w,-h)+90;
|
|
z3'=.25[z3,z4]; z4'=.75[z3,z4]; theta3:=angle(-w,-h)+90;
|
|
z7=z8=.5[z1,z6];
|
|
penpos1(b,theta1); penpos6(b,theta1);
|
|
penpos1'(b,theta1); penpos6'(b,theta1); penpos7(.6b,theta1);
|
|
penpos3(b,theta3); penpos4(b,theta3);
|
|
penpos3'(b,theta3); penpos4'(b,theta3); penpos8(.6b,theta3);
|
|
penstroke z1e..z1'e{z6'-z1'}..z7e..{z6'-z1'}z6'e..z6e;
|
|
penpos2(b,0); penpos5(b,0); penstroke z2e..z5e;
|
|
penstroke z3e..z3'e{z4'-z3'}..z8e..{z4'-z3'}z4'e..z4e;
|
|
penlabels(1,1',3,3',4,4',6,6');
|
|
labels.top(1r,1'r,2,3l,3'l,4l,4'l,6r,6'r);
|
|
labels.bot(1l,1'l,3r,3'r,4r,4'r,5,6l,6'l);
|
|
labels.lft(2l,5l);
|
|
labels.rt(2r,5r);
|
|
forsuffixes $=1,1',3,3',4,4',6,6': makelabel("",z$); endfor
|
|
makelabel.top("8l ",z8l);
|
|
makelabel.top(" 7r",z7r);
|
|
makelabel.bot("7l ",z7l);
|
|
makelabel.bot(" 8r",z8r);
|
|
endchar;
|
|
|
|
"Figure A5a"; % S from IOnian font
|
|
clear_all;
|
|
em#:=10pt#; cap#:=7pt#;
|
|
slab#:=.8pt#;
|
|
stem#:=.9pt#;
|
|
thin#:=.8pt#;
|
|
thick#:=5/6pt#;
|
|
o#:=1/5pt#;
|
|
define_corrected_pixels(o);
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick,slab,stem);
|
|
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;
|
|
|
|
"Figure 8a"; % twenty points on p2
|
|
clear_all;
|
|
path p[]; p1=(0,0)..(3,3); p2=(0,0)..(3,3)..cycle;
|
|
transform t; t=identity scaled 60 shifted (50,0);
|
|
pair zz;
|
|
z=(1.5,1.5) transformed t;
|
|
pickup pencircle;
|
|
draw p2 transformed t;
|
|
for n=0 upto 19: zz:=point n/10 of p2 transformed t;
|
|
heavy_dot zz;
|
|
makelabel.top.nodot(decimal(n/10) if n mod 10=0:&".0" fi,
|
|
.09[zz,z] shifted(.05xpart(z-zz),-6.5)); endfor
|
|
%.1[zz,z] shifted(.1xpart(z-zz),-8)); endfor
|
|
shipit;
|
|
showit;
|
|
|
|
"Figure 11a"; % E of METAFONT logo
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(suffix c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(str c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
|
|
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.rt(1,2,3);
|
|
labels.lft(4,5,6);
|
|
endchar;
|
|
|
|
"Figure 12a"; % cmr10 left parenthesis
|
|
u#:=20/36pt#;
|
|
tiny#:=0;
|
|
axis#:=90/36pt#;
|
|
hheight#:=250/36pt#;
|
|
border#:=20/36pt#;
|
|
hair#:=8/36pt#;
|
|
thin#:=9/36pt#;
|
|
thick#:=25/36pt#;
|
|
slant:=0;
|
|
rulethickness:=.4pt#;
|
|
|
|
font_setup;
|
|
beginchar("(",7u#, hheight#+border#, hheight#+border#-2axis#);
|
|
italcorr (hheight#+border#)*slant-.5u#;
|
|
pickup tinypen;
|
|
penpos1(hair-tiny,0); penpos3(hair-tiny,0);
|
|
penpos2(.75[thin,thick]-tiny,0);
|
|
rt x1r = rt x3r = w-u; lft x2l = x1-4u;
|
|
top y1=h; y2=.5[y1,y3]=axis;
|
|
filldraw z1l{curl 4}..z2l..{curl 4}z3l--
|
|
z3r{curl 4}..z2r..{curl 4}z1r--cycle;
|
|
labels.top(3,2);
|
|
labels.bot(1);
|
|
labels.lft(1l,2l,3l);
|
|
labels.rt(1r,2r,3r);
|
|
endchar;
|
|
|
|
"Figure 12b"; % cmbx10 left parenthesis
|
|
u#:=23/36pt#;
|
|
tiny#:=0;
|
|
axis#:=90/36pt#;
|
|
hheight#:=250/36pt#;
|
|
border#:=20/36pt#;
|
|
hair#:=13/36pt#;
|
|
thin#:=17/36pt#;
|
|
thick#:=41/36pt#;
|
|
slant:=0;
|
|
|
|
font_setup;
|
|
beginchar("(",7u#, hheight#+border#, hheight#+border#-2axis#);
|
|
italcorr (hheight#+border#)*slant-.5u#;
|
|
pickup tinypen;
|
|
penpos1(hair-tiny,0); penpos3(hair-tiny,0);
|
|
penpos2(.75[thin,thick]-tiny,0);
|
|
rt x1r = rt x3r = w-u; lft x2l = x1-4u;
|
|
top y1=h; y2=.5[y1,y3]=axis;
|
|
filldraw z1l{curl 4}..z2l..{curl 4}z3l--
|
|
z3r{curl 4}..z2r..{curl 4}z1r--cycle;
|
|
labels.top(3,2);
|
|
labels.bot(1);
|
|
labels.lft(1l,2l,3l);
|
|
labels.rt(1r,2r,3r);
|
|
endchar;
|
|
|
|
"Figure 12c"; % cmvtt10 left parenthesis
|
|
u#:=21/36pt#;
|
|
tiny#:=22/36pt#;
|
|
axis#:=110/36pt#;
|
|
hheight#:=220/36pt#;
|
|
border#:=30/36pt#;
|
|
hair#:=22/36pt#;
|
|
thin#:=25/36pt#;
|
|
thick#:=25/36pt#;
|
|
slant:=0;
|
|
|
|
font_setup;
|
|
beginchar("(",7u#, hheight#+border#, hheight#+border#-2axis#);
|
|
italcorr (hheight#+border#)*slant-.5u#;
|
|
pickup tinypen;
|
|
penpos1(hair-tiny,0); penpos3(hair-tiny,0);
|
|
penpos2(.75[thin,thick]-tiny,0);
|
|
rt x1r = rt x3r = w-u; lft x2l = x1-4u;
|
|
top y1=h; y2=.5[y1,y3]=axis;
|
|
filldraw z1l{curl 4}..z2l..{curl 4}z3l--
|
|
z3r{curl 4}..z2r..{curl 4}z1r--cycle;
|
|
labels.top(3,2);
|
|
labels.bot(1);
|
|
labels.lft(1l,2l,3l);
|
|
labels.rt(1r,2r,3r);
|
|
endchar;
|
|
|
|
"Figure 12d"; % cmssdc10 left parenthesis
|
|
u#:=19/36pt#;
|
|
tiny#:=8/36pt#;
|
|
axis#:=95/36pt#;
|
|
hheight#:=250/36pt#;
|
|
border#:=20/36pt#;
|
|
hair#:=23/36pt#;
|
|
thin#:=40/36pt#;
|
|
thick#:=40/36pt#;
|
|
slant:=0;
|
|
|
|
font_setup;
|
|
beginchar("(",7u#, hheight#+border#, hheight#+border#-2axis#);
|
|
italcorr (hheight#+border#)*slant-.5u#;
|
|
pickup tinypen;
|
|
penpos1(hair-tiny,0); penpos3(hair-tiny,0);
|
|
penpos2(.75[thin,thick]-tiny,0);
|
|
rt x1r = rt x3r = w-u; lft x2l = x1-4u;
|
|
top y1=h; y2=.5[y1,y3]=axis;
|
|
filldraw z1l{curl 4}..z2l..{curl 4}z3l--
|
|
z3r{curl 4}..z2r..{curl 4}z1r--cycle;
|
|
labels.top(3,2);
|
|
labels.bot(1);
|
|
labels.lft(1l,2l,3l);
|
|
labels.rt(1r,2r,3r);
|
|
endchar;
|
|
|
|
"Figure 12e"; % cmti10 left parenthesis
|
|
u#:=18.4/36pt#;
|
|
tiny#:=7/36;
|
|
axis#:=90/36pt#;
|
|
hheight#:=250/36pt#;
|
|
border#:=20/36pt#;
|
|
hair#:=8/36pt#;
|
|
thin#:=11/36pt#;
|
|
thick#:=23/36pt#;
|
|
slant:=.25;
|
|
|
|
font_setup;
|
|
beginchar("(",7u#, hheight#+border#, hheight#+border#-2axis#);
|
|
italcorr (hheight#+border#)*slant-.5u#;
|
|
pickup tinypen;
|
|
penpos1(hair-tiny,0); penpos3(hair-tiny,0);
|
|
penpos2(.75[thin,thick]-tiny,0);
|
|
rt x1r = rt x3r = w-u; lft x2l = x1-4u;
|
|
top y1=h; y2=.5[y1,y3]=axis;
|
|
filldraw z1l{curl 4}..z2l..{curl 4}z3l--
|
|
z3r{curl 4}..z2r..{curl 4}z1r--cycle;
|
|
labels.top(3,2);
|
|
labels.bot(1);
|
|
labels.lft(1l,2l,3l);
|
|
labels.rt(1r,2r,3r);
|
|
endchar;
|
|
currenttransform:=identity yscaled aspect_ratio;
|
|
|
|
"Figure 12f"; % Dangerous bend symbol
|
|
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 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);
|
|
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
|
|
x36=w-x31; x36-x31=8u; x32=x33=x36; x31=x34=x35;
|
|
y31=-y36=12/27h; y32=-y35=9/27h; y33=-y34=3/27h;
|
|
pickup pencircle scaled heavyline;
|
|
draw z32{z32-z31}..z33---z34..z35{z36-z35}; % the dangerous bend
|
|
pickup penrazor xscaled heavyline rotated (angle(z32-z31)+90);
|
|
draw z31--z32; draw z35--z36; % upper and lower bars
|
|
labels.top(11,15,2a,4b,4,2,32,34);
|
|
labels.bot(10,14,2b,4a,33,35);
|
|
labels.lft(1a,3b,12,13,21,36);
|
|
labels.rt(1,1b,3a,3,16,20,17,31);
|
|
endchar;
|
|
|
|
"Figure 13a"; % Possible cube
|
|
clear_all;
|
|
fudge_factor:=1/2;
|
|
s#:=5pt#*fudge_factor; define_pixels(s); % side of the square
|
|
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*fudge_factor);
|
|
draw z5--z6--z8--z7--cycle;
|
|
pickup pencircle scaled (1.6pt*fudge_factor);
|
|
erase draw z2--z4--z3;
|
|
pickup pencircle scaled (.4pt*fudge_factor);
|
|
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);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 14a"; % El Palo Alto
|
|
begingroup save flex; clear_all;
|
|
def flex(text t) = % puts dots into normal flex
|
|
hide(n_:=0;
|
|
for z=t: z_[incr n_]:=z; makelabel("",z); endfor
|
|
dz_:=z_[n_]-z_1)
|
|
z_1 for k=2 upto n_-1: ...z_[k]{dz_} endfor ...z_[n_] enddef;
|
|
|
|
def grid= proofoffset (30,0);
|
|
for y:=0 step 50 until 650: proofrule((-110,y),(110,y));
|
|
makelabel.lft.nodot(str[y],(100,y+5));
|
|
endfor;
|
|
for x:=-100 step 50 until 100: proofrule((x,-10),(x,660));endfor enddef;
|
|
|
|
path branch[],trunk;
|
|
|
|
branch1=
|
|
flex((0,660),(-9,633),(-22,610))
|
|
&flex((-22,610),(-3,622),(17,617))
|
|
&flex((17,617),(7,637),(0,660))
|
|
&cycle;
|
|
|
|
branch2=
|
|
flex((30,570),(10,590),(-1,616))
|
|
&flex((-1,616),(-11,592),(-29,576),(-32,562))
|
|
&flex((-32,562),(-10,577),(30,570))
|
|
&cycle;
|
|
|
|
branch3=
|
|
flex((-1,570),(-17,550),(-40,535))
|
|
&flex((-40,535),(-45,510),(-60,477))
|
|
&flex((-60,477),(-20,505),(40,512))
|
|
&flex((40,512),(31,532),(8,550),(-1,570))
|
|
&cycle;
|
|
|
|
branch4=
|
|
flex((0,509),(-14,492),(-32,481))
|
|
&flex((-32,481),(-42,455),(-62,430))
|
|
&flex((-62,430),(-20,450),(42,448))
|
|
&flex((42,448),(38,465),(4,493),(0,509))
|
|
&cycle;
|
|
|
|
branch5=
|
|
flex((-22,470),(-23,435),(-44,410))
|
|
&flex((-44,410),(-10,421),(35,420))
|
|
&flex((35,420),(15,455),(-22,470))
|
|
&cycle;
|
|
|
|
branch6=
|
|
flex((18,375),(9,396),(5,420))
|
|
&flex((5,420),(-5,410),(-50,375),(-50,350))
|
|
&flex((-50,350),(-25,375),(18,375))
|
|
&cycle;
|
|
|
|
branch7=
|
|
flex((0,400),(-13,373),(-30,350))
|
|
&flex((-30,350),(0,358),(30,350))
|
|
&flex((30,350),(13,373),(0,400))
|
|
&cycle;
|
|
|
|
branch8=
|
|
flex((50,275),(45,310),(3,360))
|
|
&flex((3,360),(-20,330),(-70,300),(-100,266))
|
|
&flex((-100,266),(-75,278),(-60,266))
|
|
&flex((-60,266),(0,310),(50,275))
|
|
&cycle;
|
|
|
|
branch9=
|
|
flex((10,333),(-15,290),(-43,256))
|
|
&flex((-43,256),(8,262),(58,245))
|
|
&flex((58,245),(34,275),(10,333))
|
|
&cycle;
|
|
|
|
branch10=
|
|
flex((8,262),(-21,249),(-55,240))
|
|
&flex((-55,240),(-51,232),(-53,220))
|
|
&flex((-53,220),(-28,229),(27,235))
|
|
&flex((27,235),(16,246),(8,262))
|
|
&cycle;
|
|
|
|
branch11=
|
|
flex((0,250),(-25,220),(-70,195))
|
|
&flex((-70,195),(-78,180),(-90,170))
|
|
&flex((-90,170),(-5,188),(74,183))
|
|
&flex((74,183),(34,214),(0,250))
|
|
&cycle;
|
|
|
|
branch12=
|
|
flex((8,215),(-35,175),(-72,155))
|
|
&flex((-72,155),(-75,130),(-92,110),(-95,88))
|
|
&flex((-95,88),(-65,117),(-54,104))
|
|
&flex((-54,104),(10,151),(35,142))..flex((42,130),(60,123),(76,124))
|
|
&flex((76,124),(62,146),(26,180),(8,215))&cycle;
|
|
|
|
trunk=(0,660)---(-12,70)..{curl 5}(-28,-8)
|
|
&flex((-28,-8),(-16,-4),(-10,-11))
|
|
&flex((-10,-11),(0,-5),(14,-10))
|
|
&flex((14,-10),(20,-6),(29,-11))
|
|
&(29,-11){curl 4}..(10,100)---cycle;
|
|
|
|
makelabel("",(-12,70));
|
|
makelabel("",(10,100));
|
|
|
|
pickup pencircle scaled 2;
|
|
draw trunk;
|
|
for n=1 upto 12: draw branch[n]; endfor
|
|
grid;
|
|
showit;shipit;
|
|
endgroup;
|
|
|
|
"Figure 14b"; % Detail of one branch
|
|
clear_all;
|
|
pair zz[];
|
|
zz1=(0,509);
|
|
zz2=(-14,492);
|
|
zz3=(-32,481);
|
|
zz4=(-42,455);
|
|
zz5=(-62,430);
|
|
zz6=(-20,450);
|
|
zz7=(42,448);
|
|
zz8=(38,465);
|
|
zz9=(4,493);
|
|
for n=1 upto 9: z[n]=(zz[n]+(62,-430)) scaled 2.5; endfor
|
|
pickup pencircle;
|
|
filldraw flex(z1,z2,z3)&flex(z3,z4,z5)
|
|
&flex(z5,z6,z7)&flex(z7,z8,z9,z1)&cycle;
|
|
labels.lft(2,3,4,5);
|
|
labels.rt(1,7,8,9);
|
|
labels.bot(6);
|
|
showit; shipit;
|
|
|
|
"Figure 14c"; % superellipses
|
|
clear_all;
|
|
w:=100; h:=150;
|
|
pickup pencircle xscaled 0.7pt yscaled 0.2pt rotated 30;
|
|
forsuffixes ss=65,70,75,80: s:=ss/100;
|
|
draw superellipse((w,.5h),(.5w,h),(0,.5h),(.5w,0),s) shifted (150/.05(s-.65),0);
|
|
makelabel.top.nodot("."&str ss,(.5w,.45h) shifted (150/.05(s-.65),0));
|
|
endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 14d"; % demo of joinery
|
|
clear_all;
|
|
pickup standardpen;
|
|
z0=(0,100); z1=(50,0); z2=(180,0);
|
|
for n=3 upto 9: z[n]=z[n-3]+(200,0); endfor
|
|
draw z0..z1---z2...{up}z3
|
|
& z3..z4--z5...{up}z6
|
|
& z6...z7---z8..{up}z9;
|
|
makelabel.bot("0 ",z0);
|
|
makelabel.bot("6 ",z6);
|
|
labels.bot(3,9);
|
|
labels.rt(1,4,7);
|
|
labels.lft(2,5,8);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 14e"; % JofA logo
|
|
beginchar("A",29mm#*.22,25mm#*.22,0);
|
|
interim autorounding:=0; interim smoothing:=0;
|
|
if odd(w-h): h:=h-1; fi
|
|
thick#:=2mm#*.22; thin#:=5/4mm#*.22;
|
|
define_whole_blacker_pixels(thick,thin);
|
|
forsuffixes @=a,b,c: transform @;
|
|
forsuffixes e=l,r: path @e,@'e; numeric t@[]e; endfor endfor
|
|
penpos1(thick,0); penpos2(thick,90); penpos3(thick,180); penpos4(thick,270);
|
|
penpos5(thick,0); penpos6(thick,90); penpos7(thick,180); penpos8(thick,270);
|
|
x2=x4=x6=x8=.5[x5,x7]=.5w; x1r=w; x3r=0; x5-x7=y6-y8;
|
|
y1=y3=y5=y7=.5[y6,y8]=.5h; y2r=h; y4r=0; y6r=round.75h;
|
|
forsuffixes e=l,r: a.e=b'e=c'e=superellipse(z1e,z2e,z3e,z4e,.75);
|
|
a'e=b.e=c.e=superellipse(z5e,z6e,z7e,z8e,.72); endfor
|
|
penpos.a1(thin,0); penpos.a5(whatever,-90); penpos.a9(thin,180);
|
|
x.a1l-x.a9l=1/3(x5l-x7l); x.a5=.5w; y.a1=y.a9; y.a5r=4/7h;
|
|
x.a3l=x.a1l; x.a3r=x.a1r; x.a4r=1/6[x.a3r,x1l]; x0=.5w; y0=.52h;
|
|
x.a6l+x.a4l=x.a6r+x.a4r=x.a7l+x.a3l=x.a7r+x.a3r=x.a9+x.a1=w;
|
|
y.a3r=y.a4r=y.a6r=y.a7r=.2[y2l,y0]; y.a3l=y.a4l=y.a6l=y.a7l=y.a3r-thin;
|
|
z.a4l=z.a4r+(thin,0)rotated(angle(z.a4r-z.a5r)+90)
|
|
+whatever*(z.a4r-z.a5r); z.a4l-z.a5l=whatever*(z.a4r-z.a5r);
|
|
z=a.r intersectionpoint (z0--(w,0)); y.a1-y.a5=length(z-z0);
|
|
b=identity shifted(0,y0-y.a1)rotatedaround(z0,90-angle(z0-(w,0)));
|
|
c=b reflectedabout (z2,z4);
|
|
for n=1,3,4,5,6,7,9: forsuffixes e=l,,r: forsuffixes @=b,c:
|
|
z@[n]e=z.a[n]e transformed @; endfor endfor endfor
|
|
forsuffixes e=l,r: forsuffixes @=a,b,c:
|
|
z@2e=@r intersectionpoint (z@1e--z@3e);
|
|
z@8e=@r intersectionpoint (z@9e--z@7e);
|
|
t@1e=xpart(@e intersectiontimes (z@1l--z@3l));
|
|
t@9e=xpart(@e intersectiontimes (z@9l--z@7l));
|
|
t@4e=xpart(@'e intersectiontimes (z@5r--z@4l));
|
|
t@6e=xpart(@'e intersectiontimes (z@5r--z@6l)); endfor endfor
|
|
penstroke subpath(t.a9e,t.b6e) of a.e;
|
|
penstroke subpath(t.b4e,t.c4e) of b'e;
|
|
penstroke subpath(t.c6e,t.a1e+8) of c'e;
|
|
penstroke subpath(t.a6e,t.b9e) of a'e;
|
|
penstroke subpath(t.b1e,t.c1e) of b.e;
|
|
penstroke subpath(t.c9e,t.a4e+8) of c.e;
|
|
forsuffixes @=a,b,c:
|
|
penstroke z@2e--z@3e--z@4e--z@5e--z@6e--z@7e--z@8e; endfor
|
|
labels.lft(0,1l,3r,3,5l,7r,7,a1l,a2l,a3l,a6l,
|
|
a6r,a8r,a9r,b2l,b5,b5r,b9,c1,c2r,c5l);
|
|
labels.rt(1,1r,3l,5,5r,7l,a1r,a2r,a4l,a4r,a7l,
|
|
a9l,b1,b2r,b5l,c2l,c5,c5r,c9);
|
|
labels.top(2r,2,2l,4l,6r,6,6l,8l,a3r,a7r,a8l,
|
|
b1l,b3l,b3r,b6r,b6l,b8r,b9r,c1l,c3l,c3r,c6r,c6l,c8r,c9r);
|
|
labels.bot(2r,2,2l,4,4r,8,8r,a1,a5l,a5,a5r,a9,
|
|
b1r,b4l,b4r,b7l,b7r,b8l,c1r,c4l,c4r,c7l,c7r,c8l);
|
|
makelabel("",z.b9l);
|
|
makelabel("",z.c9l);
|
|
makelabel.lft.nodot("b9l",z.b9l-(0,3));
|
|
makelabel.rt.nodot("c9l",z.c9l-(0,3));
|
|
endchar;
|
|
|
|
"Figure 15a"; % four u's
|
|
beginchar("4",11pt#,11pt#,0);
|
|
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...z2{right}...{up}z3;
|
|
addto currentpicture also currentpicture transformed t;
|
|
addto currentpicture also currentpicture transformed(t transformed t);
|
|
labels.bot(1,3); labels.rt(2); endchar;
|
|
|
|
"Figure 16a"; % circular pen polygon
|
|
clear_all;
|
|
path p;
|
|
p=makepath(pencircle scaled 20) scaled 10 shifted (110,110);
|
|
if length p<>32: error; fi
|
|
fill p;
|
|
for k=1 upto length p: heavy_dot point k of p; endfor
|
|
for x=0 step 10 until 220: proofrule((x,0),(x,220)); endfor
|
|
for y=0 step 10 until 220: proofrule((0,y),(220,y)); endfor
|
|
proofrulethickness .8;
|
|
proofrule ((0,110),(220,110)); proofrule ((110,0),(110,220));
|
|
makelabel.bot.nodot("ignore",(160,-10)); % kludge for GFtoEPS!
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 16b"; % elliptical pen polygon
|
|
clear_all;
|
|
path p;
|
|
p=makepath(pencircle xscaled 30 yscaled 20) scaled 10 shifted (160,110);
|
|
if length p<>40: error; fi
|
|
fill p;
|
|
for k=1 upto length p: heavy_dot point k of p; endfor
|
|
for x=0 step 10 until 320: proofrule((x,0),(x,220)); endfor
|
|
for y=0 step 10 until 220: proofrule((0,y),(320,y)); endfor
|
|
proofrulethickness .8;
|
|
proofrule ((0,110),(320,110)); proofrule ((160,0),(160,220));
|
|
makelabel.bot.nodot("ignore",(160,-10)); % kludge for GFtoEPS!
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 16c"; % elliptical pen hexagon
|
|
clear_all;
|
|
path p;
|
|
p=makepath((pencircle xscaled 30) yscaled 20) scaled 10 shifted (160,110);
|
|
if length p<>6: error; fi
|
|
fill p;
|
|
for k=1 upto length p: heavy_dot point k of p; endfor
|
|
for x=0 step 10 until 320: proofrule((x,0),(x,220)); endfor
|
|
for y=0 step 10 until 220: proofrule((0,y),(320,y)); endfor
|
|
proofrulethickness .8;
|
|
proofrule ((0,110),(320,110)); proofrule ((160,0),(160,220));
|
|
makelabel.bot.nodot("ignore",(160,-10)); % kludge for GFtoEPS!
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 16d"; % cutoff version of Figure 3n
|
|
clear_all;
|
|
z1=(0,100); z2=(100,100); z3=(200,100);
|
|
z4=(0,0); z5=(100,0); z6=(200,0);
|
|
path p; p=z4..controls z1 and z2..z6;
|
|
cutdraw p;
|
|
makelabel.rt.nodot("1",z1+(2,0));
|
|
makelabel.rt.nodot("2",z2+(2,0));
|
|
makelabel.rt.nodot("3",z3+(2,0));
|
|
makelabel.rt.nodot(" 4",z4);
|
|
makelabel.rt.nodot("5",z5+(2,0));
|
|
makelabel.rt.nodot(" 6",z6);
|
|
for k=1 upto 6: heavy_dot z[k]; endfor;
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 16e"; % cutoff version of Figure 4b
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(suffix c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(str c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
|
|
beginlogochar(T,13);
|
|
if odd(w-ph): w:=w+1; fi % allows a symmetric stem
|
|
x1+x2=2x3=2x4=w; lft.x1=0;
|
|
y1=y2=y3; top.y1=h; y4=0;
|
|
draw z1--z2;
|
|
cutoff(z1,170);
|
|
cutoff(z2,-10);
|
|
draw z3--z4;
|
|
cutoff(z4,-80);
|
|
labels.rt(1);
|
|
labels.lft(2);
|
|
labels.bot(3);
|
|
makelabel.top("4",z4);
|
|
endchar;
|
|
|
|
"Figure 16f"; % tilde with pencircle
|
|
clear_all;
|
|
pickup pencircle xscaled .8pt yscaled .2pt rotated 50;
|
|
z1=(0,0); z4=(200,30);
|
|
z2-z1=z4-z3=whatever*dir 50;
|
|
y2-y1=3(y4-y1);
|
|
draw z1..controls z2 and z3..z4;
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.rt(" 4",z4);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 16g"; % tilde with pensquare
|
|
clear_all;
|
|
pickup pensquare xscaled .8pt yscaled .2pt rotated 50;
|
|
z1=(0,0); z4=(200,30);
|
|
z2-z1=z4-z3=whatever*dir 50;
|
|
y2-y1=3(y4-y1);
|
|
draw z1..controls z2 and z3..z4;
|
|
makelabel.lft("1 ",z1);
|
|
makelabel.rt(" 4",z4);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 16h"; % fancy serif with pencircle
|
|
clear_all;
|
|
pickup pencircle xscaled .8pt yscaled .2pt rotated 20;
|
|
z1=(20,175); bot z3=(0,0);
|
|
z4=(50,0); z6=(25,175);
|
|
x2=x1; z2=z3+whatever*dir 20;
|
|
x5=x6; z5=z4+whatever*dir -20;
|
|
pair dishing; dishing=(8,0) rotated 20;
|
|
filldraw z1..controls z2..z3
|
|
--(flex(z3,.5[z3,z4]+dishing,z4))shifted(0,-epsilon)
|
|
-- z4..controls z5..z6--cycle;
|
|
showit;
|
|
labels.lft(1,2,3);
|
|
labels.rt(4,5,6);
|
|
shipit;
|
|
|
|
"Figure 16i"; % fancy serif with pensquare
|
|
clear_all;
|
|
pickup pensquare xscaled .8pt yscaled .2pt rotated 20;
|
|
z1=(20,175); bot z3=(0,0);
|
|
z4=(50,0); z6=(25,175);
|
|
x2=x1; z2=z3+whatever*dir 20;
|
|
x5=x6; z5=z4+whatever*dir -20;
|
|
pair dishing; dishing=(8,0) rotated 20;
|
|
filldraw z1..controls z2..z3
|
|
--(flex(z3,.5[z3,z4]+dishing,z4))shifted(0,-epsilon)
|
|
-- z4..controls z5..z6--cycle;
|
|
showit;
|
|
labels.lft(1,2,3);
|
|
labels.rt(4,5,6);
|
|
shipit;
|
|
|
|
"Figure 18a"; % O of METAFONT logo
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(expr c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
|
|
def super_half(suffix i,j,k) =
|
|
draw z.i{0,y.j-y.i}
|
|
... (.8[x.j,x.i],.8[y.i,y.j]){z.j-z.i}
|
|
... z.j{x.k-x.i,0}
|
|
... (.8[x.j,x.k],.8[y.k,y.j]){z.k-z.j}
|
|
... z.k{0,y.k-y.j} enddef;
|
|
|
|
beginlogochar("O",15);
|
|
x1=x4=.5w; top y1=h+o; bot y4=-o;
|
|
x2=w-x3=good.x(1.5u+s);
|
|
y2=y3=barheight;
|
|
super_half(2,1,3); super_half(3,4,2);
|
|
labels.lft(2); labels.rt(1,3,4); endchar;
|
|
|
|
"Figure A18a"; % A of METAFONT logo
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(expr c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
|
|
def super_half(suffix i,j,k) =
|
|
draw z.i{0,y.j-y.i}
|
|
... (.8[x.j,x.i],.8[y.i,y.j]){z.j-z.i}
|
|
... z.j{x.k-x.i,0}
|
|
... (.8[x.j,x.k],.8[y.k,y.j]){z.k-z.j}
|
|
... z.k{0,y.k-y.j} enddef;
|
|
|
|
beginlogochar("A",15);
|
|
x1=.5w;
|
|
x2=x4=leftstemloc;
|
|
x3=x5=w-x2;
|
|
top y1=h+o;
|
|
y2=y3=barheight;
|
|
bot y4=bot y5=-o;
|
|
draw z4--z2--z3--z5;
|
|
super_half(2,1,3);
|
|
labels.top(2,3,4,5);
|
|
labels.rt(1);
|
|
endchar;
|
|
|
|
"Figure 18b"; % serif points
|
|
clear_all;
|
|
def serif(suffix $)(expr breadth,theta,left_jut,right_jut)=
|
|
penpos$(breadth/abs sind theta,0);
|
|
z$a-z$l=z$f-z$r=(bracket/abs sind theta)*dir theta;
|
|
y$c=y$d; y$b=y$e=y$; y$b-y$c=if theta<0:-fi slab;
|
|
x$b=x$c=x$l-left_jut; x$d=x$e=x$r+right_jut;
|
|
enddef;
|
|
|
|
def serif_edge suffix $ =
|
|
(serif_bracket($a,$l,$b)--z$c
|
|
--z$d--reverse serif_bracket($f,$r,$e)) enddef;
|
|
|
|
def serif_bracket(suffix i,j,k) =
|
|
(z.i{z.j-z.i}...serif_darkness[z.j,.5[z.i,z.k] ]{z.k-z.i}
|
|
...z.k{z.k-z.j}) enddef;
|
|
|
|
serif_darkness:=1/4; slab:=50; bracket:=175;
|
|
z$=(150,slab);
|
|
serif($,100,75,80,90);
|
|
pickup pencircle scaled 2; draw serif_edge $;
|
|
labels.lft($l,$a);
|
|
labels.rt($,$r,$f);
|
|
labels.top($b,$e);
|
|
labels.bot($c,$d);
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 18c"; % AI by outlines
|
|
clear_all;
|
|
def serif(suffix $)(expr breadth,theta,left_jut,right_jut)=
|
|
penpos$(breadth/abs sind theta,0);
|
|
z$a-z$l=z$f-z$r=(bracket/abs sind theta)*dir theta;
|
|
y$c=y$d; y$b=y$e=y$; y$b-y$c=if theta<0:-fi slab;
|
|
x$b=x$c=x$l-left_jut; x$d=x$e=x$r+right_jut;
|
|
enddef;
|
|
|
|
def serif_edge suffix $ =
|
|
(serif_bracket($a,$l,$b)--z$c
|
|
--z$d--reverse serif_bracket($f,$r,$e)) enddef;
|
|
|
|
def serif_bracket(suffix i,j,k) =
|
|
(z.i{z.j-z.i}...serif_darkness[z.j,.5[z.i,z.k] ]{z.k-z.i}
|
|
...z.k{z.k-z.j}) enddef;
|
|
|
|
serif_darkness:=1/3;
|
|
slab#:=1/4pt#;
|
|
bracket#:=1pt#;
|
|
jut#:=.9pt#;
|
|
u#:=3/5pt#;
|
|
ht#:=7pt#;
|
|
thin#:=.5pt#;
|
|
thick#:=1.1pt#;
|
|
define_pixels(slab,bracket,jut,u,ht,thin,thick);
|
|
|
|
beginchar("A",13u#,ht#,0);
|
|
z1=(.5w,round 1.05h); x4l=w-x5r=u; y4l=y5r=slab;
|
|
numeric theta[]; theta4=angle(z1-z4l); theta5=angle(z1-z5r);
|
|
serif(4,thin,theta4,.6jut,jut); serif(5,thick,theta5,jut,.6jut);
|
|
z0=z4r+whatever*dir theta4=z5l+whatever*dir theta5;
|
|
fill z1--serif_edge4--z0 & z0--serif_edge5--z1 & cycle;
|
|
penpos2(whatever,theta4); penpos3(whatever,theta5);
|
|
y2r=y3r=.5[y4,y0]; y2l=y3l=y2r-thin;
|
|
z2=whatever[z1,z4r]; z3=whatever[z1,z5l];
|
|
penstroke z2e--z3e;
|
|
labels.lft(3,5l,5,4a,5a);
|
|
labels.rt(2,4r,4f,5f);
|
|
labels.top(1,2r,3r,4l,5r,4b,4e,5b,5e);
|
|
labels.bot(0,2l,3l,4,4c,4d,5c,5d);
|
|
|
|
ww:=w; % special hacks to get two on one
|
|
picture tmp; tmp:=currentpicture;
|
|
proofrule((w,-d.o_),(w,h.o_));
|
|
endgroup;
|
|
|
|
beginchar("I",6u#,ht#,0);
|
|
currentpicture:=tmp;
|
|
currenttransform:=currenttransform shifted(ww,0);
|
|
x1=x2=.5w; y1=h-y2; y2=slab;
|
|
serif(1,thick,-90,1.1jut,1.1jut); serif(2,thick,90,1.1jut,1.1jut);
|
|
fill serif_edge 2 -- reverse serif_edge 1 -- cycle;
|
|
w:=w+ww;
|
|
labels.lft(1a,2a,1l);
|
|
labels.rt(1f,2f,1,1r);
|
|
labels.top(2l,2,2r,2e,1c,1d);
|
|
labels.bot(2d,1b,1e);
|
|
makelabel("",z2b); makelabel("",z2c);
|
|
makelabel.rt.nodot("2b",z2b+(0,3));
|
|
makelabel.rt.nodot("2c",z2c-(0,3));
|
|
endchar;
|
|
|
|
currenttransform:=identity yscaled aspect_ratio;
|
|
|
|
"Figure A18b"; % H by outlines
|
|
clear_all;
|
|
def serif(suffix $)(expr breadth,theta,left_jut,right_jut)=
|
|
penpos$(breadth/abs sind theta,0);
|
|
z$a-z$l=z$f-z$r=(bracket/abs sind theta)*dir theta;
|
|
y$c=y$d; y$b=y$e=y$; y$b-y$c=if theta<0:-fi slab;
|
|
x$b=x$c=x$l-left_jut; x$d=x$e=x$r+right_jut;
|
|
enddef;
|
|
|
|
def serif_edge suffix $ =
|
|
(serif_bracket($a,$l,$b)--z$c
|
|
--z$d--reverse serif_bracket($f,$r,$e)) enddef;
|
|
|
|
def serif_bracket(suffix i,j,k) =
|
|
(z.i{z.j-z.i}...serif_darkness[z.j,.5[z.i,z.k] ]{z.k-z.i}
|
|
...z.k{z.k-z.j}) enddef;
|
|
|
|
serif_darkness:=1/3;
|
|
slab#:=1/4pt#;
|
|
bracket#:=1pt#;
|
|
jut#:=.9pt#;
|
|
u#:=3/5pt#;
|
|
ht#:=7pt#;
|
|
thin#:=.5pt#;
|
|
thick#:=1.1pt#;
|
|
define_pixels(slab,bracket,jut,u,ht,thin,thick);
|
|
|
|
beginchar("H",13u#,ht#,0);
|
|
x1=x2=x5=3u; x3=x4=x6=w-x1; y1c=y3c=h; y2c=y4c=0;
|
|
serif(1,thick,-90,jut,jut);
|
|
serif(2,thick,90,jut,jut);
|
|
serif(3,thick,-90,jut,jut);
|
|
serif(4,thick,90,jut,jut);
|
|
fill serif_edge 2 -- reverse serif_edge 1 -- cycle;
|
|
fill serif_edge 4 -- reverse serif_edge 3 -- cycle;
|
|
penpos5(thin,90); penpos6(thin,90);
|
|
y5=y6=.52h; penstroke z5e--z6e;
|
|
labels.lft(1a,2a,3a,4a,5,1,2,1l,2l,3l,4l);
|
|
labels.rt(1f,2f,3f,4f,6,3,4,1r,2r,3r,4r);
|
|
labels.top(1c,1d,2b,2e,4b,4e,3c,3d,5r,6r);
|
|
labels.bot(1b,1e,2c,2d,4c,4d,3b,3e,5l,6l);
|
|
endchar;
|
|
|
|
"Figure 18d"; % AI by broadpen
|
|
clear_all;
|
|
def bot_serif(suffix $)(expr xx,theta,left_jut,right_jut)=
|
|
penpos$(xx,0);
|
|
z$a-z$l=z$f-z$r=(bracket/abs sind theta)*dir theta;
|
|
y$c=top y$l; y$d=y$r; x$c=x$l-left_jut; x$d=x$r+right_jut;
|
|
z$b=z$l+whatever*dir theta=z$c+whatever*dir phi;
|
|
z$e=z$r+whatever*dir theta=z$d+whatever*dir -phi;
|
|
enddef;
|
|
|
|
def top_serif(suffix $)(expr xx,theta,left_jut,right_jut)=
|
|
penpos$(xx,0);
|
|
z$a-z$l=z$f-z$r=(bracket/abs sind theta)*dir theta;
|
|
%y$c=top y$l; y$d=y$r; x$c=x$l-left_jut; x$d=x$r+right_jut;
|
|
y$c=y$d=y$; x$c=x$l-left_jut; x$d=x$r+right_jut;
|
|
z$b=z$l+whatever*dir theta=z$c+whatever*dir -phi;
|
|
z$e=z$r+whatever*dir theta=z$d+whatever*dir phi;
|
|
enddef;
|
|
|
|
def bot_serif_edge suffix $ =
|
|
(z$a..controls z$b..z$c
|
|
--(flex(z$c,.5[z$c,z$d]+dishing,z$d)) shifted (0,-epsilon)
|
|
-- z$d..controls z$e..z$f) enddef;
|
|
|
|
def top_serif_edge suffix $ =
|
|
(z$a..controls z$b..z$c
|
|
--(flex(z$c,.5[z$c,z$d]-dishing,z$d)) shifted (0,+epsilon)
|
|
-- z$d..controls z$e..z$f) enddef;
|
|
|
|
phi:=20;
|
|
pair dishing; dishing:=(1/4pt,0) rotated phi;
|
|
bracket#:=1pt#;
|
|
jut#:=.9pt#;
|
|
u#:=3/5pt#;
|
|
ht#:=7pt#;
|
|
px#:=.8pt#;
|
|
py#:=.2pt#;
|
|
xx#:=.3pt#;
|
|
define_pixels(bracket,jut,u,ht,px,py,xx);
|
|
|
|
pickup pensquare xscaled px yscaled py rotated phi; broad_pen:=savepen;
|
|
|
|
beginchar("A",13u#,ht#,0); pickup broad_pen;
|
|
z1=(.5w,top h); lft x4l=w-rt x5r=1.2u; y4l=y5r=0;
|
|
numeric theta[]; theta4=angle(z1-z4l); theta5=angle(z1-z5r);
|
|
numeric xxx;
|
|
px*sind(theta5-phi)+xxx*sind theta5 = px*cosd phi+xx;
|
|
bot_serif(4,0,theta4,.8jut,.8jut);
|
|
bot_serif(5,xxx,theta5,.6jut,.8jut);
|
|
z0=z4r+whatever*dir theta4=z5l+whatever*dir theta5;
|
|
filldraw z1--bot_serif_edge4--z0 & z0--bot_serif_edge5--z1 & cycle;
|
|
top y2=top y3=.45 bot y0; z2=whatever[z1,z4r]; z3=whatever[z1,z5l];
|
|
draw z2--z3;
|
|
labels.lft(4a,4b,4c,4,5l,5a,5c);
|
|
labels.rt(4f,4e,5r,5d,5e,5f);
|
|
labels.top(1,2,3,5b);
|
|
labels.bot(0,4d,5);
|
|
|
|
ww:=w; % special hacks to get two on one
|
|
picture tmp; tmp:=currentpicture;
|
|
proofrule((w,-d.o_),(w,h.o_));
|
|
endgroup;
|
|
|
|
beginchar("I",6u#,ht#,0); pickup broad_pen;
|
|
currentpicture:=tmp;
|
|
currenttransform:=currenttransform shifted(ww,0);
|
|
x1=x2=.5w; y1=h; y2=0;
|
|
top_serif(1,xx,-90,1.1jut,1.1jut);
|
|
bot_serif(2,xx,90,1.1jut,1.1jut);
|
|
filldraw bot_serif_edge 2 -- reverse top_serif_edge 1 -- cycle;
|
|
labels.lft(1l,2l,1a,1b,1c,2a,2b);
|
|
labels.rt(1r,2r,1d,1e,1f,2d,2e,2f);
|
|
labels.top(1);
|
|
labels.bot(2,2c);
|
|
w:=w+ww;
|
|
endchar;
|
|
|
|
currenttransform:=identity yscaled aspect_ratio;
|
|
|
|
"Figure A18c"; % H by broadpen
|
|
clear_all;
|
|
def bot_serif(suffix $)(expr xx,theta,left_jut,right_jut)=
|
|
penpos$(xx,0);
|
|
z$a-z$l=z$f-z$r=(bracket/abs sind theta)*dir theta;
|
|
y$c=top y$l; y$d=y$r; x$c=x$l-left_jut; x$d=x$r+right_jut;
|
|
z$b=z$l+whatever*dir theta=z$c+whatever*dir phi;
|
|
z$e=z$r+whatever*dir theta=z$d+whatever*dir -phi;
|
|
enddef;
|
|
|
|
def top_serif(suffix $)(expr xx,theta,left_jut,right_jut)=
|
|
penpos$(xx,0);
|
|
z$a-z$l=z$f-z$r=(bracket/abs sind theta)*dir theta;
|
|
y$c=y$d=y$; x$c=x$l-left_jut; x$d=x$r+right_jut;
|
|
z$b=z$l+whatever*dir theta=z$c+whatever*dir -phi;
|
|
z$e=z$r+whatever*dir theta=z$d+whatever*dir phi;
|
|
enddef;
|
|
|
|
def bot_serif_edge suffix $ =
|
|
(z$a..controls z$b..z$c
|
|
--(flex(z$c,.5[z$c,z$d]+dishing,z$d))shifted (0,-epsilon)
|
|
-- z$d..controls z$e..z$f) enddef;
|
|
|
|
def top_serif_edge suffix $ =
|
|
(z$a..controls z$b..z$c
|
|
--(flex(z$c,.5[z$c,z$d]-dishing,z$d))shifted (0,+epsilon)
|
|
-- z$d..controls z$e..z$f) enddef;
|
|
|
|
phi:=20;
|
|
pair dishing; dishing:=(1/4pt,0) rotated phi;
|
|
bracket#:=1pt#;
|
|
jut#:=.9pt#;
|
|
u#:=3/5pt#;
|
|
ht#:=7pt#;
|
|
px#:=.8pt#;
|
|
py#:=.2pt#;
|
|
xx#:=.3pt#;
|
|
define_pixels(bracket,jut,u,ht,px,py,xx);
|
|
|
|
pickup pensquare xscaled px yscaled py rotated phi; broad_pen:=savepen;
|
|
|
|
beginchar("H",13u#,ht#,0); pickup broad_pen;
|
|
x1=x2=x5=3u; x3=x4=x6=w-x1; y1=y3=h; y2=y4=0;
|
|
top_serif(1,xx,-90,jut,jut);
|
|
bot_serif(2,xx,90,jut,jut);
|
|
top_serif(3,xx,-90,jut,jut);
|
|
bot_serif(4,xx,90,jut,jut);
|
|
filldraw bot_serif_edge 2 -- reverse top_serif_edge 1 -- cycle;
|
|
filldraw bot_serif_edge 4 -- reverse top_serif_edge 3 -- cycle;
|
|
y5=y6=.52h; draw z5--z6;
|
|
labels.lft(l1,2l,3l,4l,1a,1b,1c,2a,2b,2c,3a,3b,3c,4a,4b,4c);
|
|
labels.rt(1r,2r,3r,4r,1d,1e,1f,2d,2e,2f,3d,3e,3f,4d,4e,4f);
|
|
labels.top(1,3);
|
|
labels.bot(2,4,5,6);
|
|
endchar;
|
|
|
|
currenttransform:=identity yscaled aspect_ratio;
|
|
|
|
"Figure 20a"; % example of `solve'
|
|
clear_all;
|
|
z1=(0,25); z2=(100,100); z3=(300,100); z4=(320,0);
|
|
vardef upward(expr x)=
|
|
ypart direction 1 of (z1{z2-z1}..(x,y2)..{z4-z3}z4)>0 enddef;
|
|
z=(solve upward(x2,x3),y2);
|
|
pickup pencircle scaled 4;
|
|
draw z1{z2-z1}..z..{z4-z3}z4;
|
|
pickup pencircle scaled 2;
|
|
draw z1--z2; draw z3--z4;
|
|
makelabel.lft("z1 ",z1);
|
|
makelabel.lft("z2 ",z2);
|
|
makelabel.rt(" z3",z3);
|
|
makelabel.rt(" z4",z4);
|
|
makelabel.top.nodot("z",z+(0,2));
|
|
forsuffixes $=1,2,3,4,: heavy_dot z$; endfor
|
|
showit;
|
|
shipit;
|
|
|
|
"Figure 21a"; % N of METAFONT logo
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(expr c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
|
|
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.top(1,3,4);
|
|
labels.bot(2,5);
|
|
endchar;
|
|
|
|
"Figure 21b"; % random N of METAFONT logo, nine-point size
|
|
randomseed:=1;
|
|
|
|
vardef noise=normaldeviate*.1pt enddef;
|
|
|
|
ht#:=.9*6pt#;
|
|
xgap#:=.9*0.6pt#;
|
|
u#:=.91*4/9pt#;
|
|
s#:=.08pt#;
|
|
o#:=1/10pt#;
|
|
px#:=.9*2/3pt#;
|
|
ygap#:=(ht#/13.5u#)*xgap#;
|
|
leftstemloc#:=2.5u#+s#;
|
|
barheight#:=.45ht#;
|
|
define_pixels(s,u,xgap,ygap,leftstemloc,barheight);
|
|
py#:=.9px#; define_blacker_pixels(px,py);
|
|
pickup pencircle xscaled px yscaled py; logo_pen:=savepen;
|
|
define_corrected_pixels(o);
|
|
|
|
def beginlogochar(expr c,n) =
|
|
beginchar(c,n*u#+2s#,ht#,0); pickup logo_pen enddef;
|
|
|
|
beginlogochar("N",15);
|
|
x1=leftstemloc+noise;
|
|
x2=leftstemloc+noise;
|
|
x4=w-leftstemloc+noise;
|
|
x5=w-leftstemloc+noise;
|
|
bot y1=noise-o;
|
|
top y2=h+o+noise;
|
|
y3=y4+ygap+noise;
|
|
bot y4=noise-o;
|
|
top y5=h+o+noise;
|
|
z3=whatever[z4,z5];
|
|
draw z1--z2--z3; draw z4--z5;
|
|
labels.top(1,3,4);
|
|
labels.bot(2,5);
|
|
endchar;
|
|
|
|
"Figure 21c"; % random N of METAFONT logo, nine-point size
|
|
randomseed:=2;
|
|
|
|
vardef noise=normaldeviate*.1pt enddef;
|
|
|
|
ht#:=.9*6pt#;
|
|
xgap#:=.9*0.6pt#;
|
|
u#:=.91*4/9pt#;
|
|
s#:=.08pt#;
|
|
o#:=1/10pt#;
|
|
px#:=.9*2/3pt#;
|
|
ygap#:=(ht#/13.5u#)*xgap#;
|
|
leftstemloc#:=2.5u#+s#;
|
|
barheight#:=.45ht#;
|
|
define_pixels(s,u,xgap,ygap,leftstemloc,barheight);
|
|
py#:=.9px#; define_blacker_pixels(px,py);
|
|
pickup pencircle xscaled px yscaled py; logo_pen:=savepen;
|
|
define_corrected_pixels(o);
|
|
|
|
def beginlogochar(expr c,n) =
|
|
beginchar(c,n*u#+2s#,ht#,0); pickup logo_pen enddef;
|
|
|
|
beginlogochar("N",15);
|
|
x1=leftstemloc+noise;
|
|
x2=leftstemloc+noise;
|
|
x4=w-leftstemloc+noise;
|
|
x5=w-leftstemloc+noise;
|
|
bot y1=noise-o;
|
|
top y2=h+o+noise;
|
|
y3=y4+ygap+noise;
|
|
bot y4=noise-o;
|
|
top y5=h+o+noise;
|
|
z3=whatever[z4,z5];
|
|
draw z1--z2--z3; draw z4--z5;
|
|
labels.top(1,3,4);
|
|
labels.bot(2,5);
|
|
endchar;
|
|
|
|
"Figure 21d"; % random N of METAFONT logo, nine-point size
|
|
randomseed:=3;
|
|
|
|
vardef noise=normaldeviate*.1pt enddef;
|
|
|
|
ht#:=.9*6pt#;
|
|
xgap#:=.9*0.6pt#;
|
|
u#:=.91*4/9pt#;
|
|
s#:=.08pt#;
|
|
o#:=1/10pt#;
|
|
px#:=.9*2/3pt#;
|
|
ygap#:=(ht#/13.5u#)*xgap#;
|
|
leftstemloc#:=2.5u#+s#;
|
|
barheight#:=.45ht#;
|
|
define_pixels(s,u,xgap,ygap,leftstemloc,barheight);
|
|
py#:=.9px#; define_blacker_pixels(px,py);
|
|
pickup pencircle xscaled px yscaled py; logo_pen:=savepen;
|
|
define_corrected_pixels(o);
|
|
|
|
def beginlogochar(expr c,n) =
|
|
beginchar(c,n*u#+2s#,ht#,0); pickup logo_pen enddef;
|
|
|
|
beginlogochar("N",15);
|
|
x1=leftstemloc+noise;
|
|
x2=leftstemloc+noise;
|
|
x4=w-leftstemloc+noise;
|
|
x5=w-leftstemloc+noise;
|
|
bot y1=noise-o;
|
|
top y2=h+o+noise;
|
|
y3=y4+ygap+noise;
|
|
bot y4=noise-o;
|
|
top y5=h+o+noise;
|
|
z3=whatever[z4,z5];
|
|
draw z1--z2--z3; draw z4--z5;
|
|
labels.top(1,3,4);
|
|
labels.bot(2,5);
|
|
endchar;
|
|
|
|
"Figure 24a"; % Ionian O at 200 pixels/inch
|
|
ss:=10;
|
|
begingroup interim hppp:=200/72.27; % lowres parameters
|
|
interim blacker:=.65; % make pens a bit blacker
|
|
interim o_correction:=.4; % but don't overshoot as much
|
|
em#:=10pt#; cap#:=7pt#;
|
|
thin#:=1/3pt#; thick#:=5/6pt#;
|
|
o#:=1/5pt#;
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick);
|
|
define_corrected_pixels(o);
|
|
curve_sidebar:=round 1/18em;
|
|
pair u,uu,v;
|
|
beginchar("O",0.8em#,cap#,0);
|
|
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) scaled ss;
|
|
for m=0 upto w: proofrule((m*ss,0),(m*ss,h*ss)); endfor
|
|
for n=0 upto h: proofrule((0,n*ss),(w*ss,n*ss)); endfor
|
|
proofrulethickness 1;
|
|
forsuffixes e=l,r:
|
|
u:=round((point 0 of path_.e)/ss);
|
|
for t=0 step 1/64 until 4:
|
|
v:=round((point t of path_.e)/ss);
|
|
if u<>v: if abs(u-v)=1: proofrule(u*ss,v*ss);
|
|
else: del:=1/128; tt:=t-del;
|
|
forever: uu:=round((point tt of path_.e)/ss);
|
|
exitif abs(u-uu)=1;
|
|
if del=epsilon:ddt;fi
|
|
del:=del/2;
|
|
tt:=tt if uu=u:+ else:-fi del; endfor
|
|
proofrule(u*ss,uu*ss); proofrule(uu*ss,v*ss); fi
|
|
u:=v; fi endfor
|
|
endfor
|
|
showit;
|
|
shipit;
|
|
endgroup;
|
|
endgroup;
|
|
numeric u,uu,v;
|
|
|
|
"Figure 24b"; % Ionian O at 200 pixels/inch, unrounded position
|
|
ss:=10;
|
|
begingroup interim hppp:=200/72.27; % lowres parameters
|
|
interim blacker:=.65; % make pens a bit blacker
|
|
interim o_correction:=.4; % but don't overshoot as much
|
|
em#:=10pt#; cap#:=7pt#;
|
|
thin#:=1/3pt#; thick#:=5/6pt#;
|
|
o#:=1/5pt#;
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick);
|
|
define_corrected_pixels(o);
|
|
curve_sidebar:= 1/18em;
|
|
pair u,uu,v;
|
|
beginchar("O",0.8em#,cap#,0);
|
|
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) scaled ss;
|
|
for m=0 upto w: proofrule((m*ss,0),(m*ss,h*ss)); endfor
|
|
for n=0 upto h: proofrule((0,n*ss),(w*ss,n*ss)); endfor
|
|
proofrulethickness 1;
|
|
forsuffixes e=l,r:
|
|
u:=round((point 0 of path_.e)/ss);
|
|
for t=0 step 1/64 until 4:
|
|
v:=round((point t of path_.e)/ss);
|
|
if u<>v: if abs(u-v)=1: proofrule(u*ss,v*ss);
|
|
else: del:=1/128; tt:=t-del;
|
|
forever: uu:=round((point tt of path_.e)/ss);
|
|
exitif abs(u-uu)=1;
|
|
if del=epsilon:ddt;fi
|
|
del:=del/2;
|
|
tt:=tt if uu=u:+ else:-fi del; endfor
|
|
proofrule(u*ss,uu*ss); proofrule(uu*ss,v*ss); fi
|
|
u:=v; fi endfor
|
|
endfor
|
|
showit;
|
|
shipit;
|
|
endgroup;
|
|
endgroup;
|
|
numeric u,uu,v;
|
|
|
|
"Figure 24c"; % Fig 24b shifted right .05 pixel
|
|
ss:=10;
|
|
begingroup interim hppp:=200/72.27; % lowres parameters
|
|
interim blacker:=.65; % make pens a bit blacker
|
|
interim o_correction:=.4; % but don't overshoot as much
|
|
em#:=10pt#; cap#:=7pt#;
|
|
thin#:=1/3pt#; thick#:=5/6pt#;
|
|
o#:=1/5pt#;
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick);
|
|
define_corrected_pixels(o);
|
|
curve_sidebar:= 1/18em;
|
|
pair u,uu,v;
|
|
beginchar("O",0.8em#,cap#,0);
|
|
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) shifted (.05,0) scaled ss;
|
|
for m=0 upto w: proofrule((m*ss,0),(m*ss,h*ss)); endfor
|
|
for n=0 upto h: proofrule((0,n*ss),(w*ss,n*ss)); endfor
|
|
proofrulethickness 1;
|
|
forsuffixes e=l,r:
|
|
u:=round((point 0 of path_.e)/ss);
|
|
for t=0 step 1/64 until 4:
|
|
v:=round((point t of path_.e)/ss);
|
|
if u<>v: if abs(u-v)=1: proofrule(u*ss,v*ss);
|
|
else: del:=1/128; tt:=t-del;
|
|
forever: uu:=round((point tt of path_.e)/ss);
|
|
exitif abs(u-uu)=1;
|
|
if del=epsilon:ddt;fi
|
|
del:=del/2;
|
|
tt:=tt if uu=u:+ else:-fi del; endfor
|
|
proofrule(u*ss,uu*ss); proofrule(uu*ss,v*ss); fi
|
|
u:=v; fi endfor
|
|
endfor
|
|
showit;
|
|
shipit;
|
|
endgroup;
|
|
endgroup;
|
|
numeric u,uu,v;
|
|
|
|
"Figure 24d"; % Fig 24c shifted right .05 pixel
|
|
ss:=10;
|
|
begingroup interim hppp:=200/72.27; % lowres parameters
|
|
interim blacker:=.65; % make pens a bit blacker
|
|
interim o_correction:=.4; % but don't overshoot as much
|
|
em#:=10pt#; cap#:=7pt#;
|
|
thin#:=1/3pt#; thick#:=5/6pt#;
|
|
o#:=1/5pt#;
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick);
|
|
define_corrected_pixels(o);
|
|
curve_sidebar:= 1/18em;
|
|
pair u,uu,v;
|
|
beginchar("O",0.8em#,cap#,0);
|
|
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) shifted (.1,0) scaled ss;
|
|
for m=0 upto w: proofrule((m*ss,0),(m*ss,h*ss)); endfor
|
|
for n=0 upto h: proofrule((0,n*ss),(w*ss,n*ss)); endfor
|
|
proofrulethickness 1;
|
|
forsuffixes e=l,r:
|
|
u:=round((point 0 of path_.e)/ss);
|
|
for t=0 step 1/64 until 4:
|
|
v:=round((point t of path_.e)/ss);
|
|
if u<>v: if abs(u-v)=1: proofrule(u*ss,v*ss);
|
|
else: del:=1/128; tt:=t-del;
|
|
forever: uu:=round((point tt of path_.e)/ss);
|
|
exitif abs(u-uu)=1;
|
|
if del=epsilon:ddt;fi
|
|
del:=del/2;
|
|
tt:=tt if uu=u:+ else:-fi del; endfor
|
|
proofrule(u*ss,uu*ss); proofrule(uu*ss,v*ss); fi
|
|
u:=v; fi endfor
|
|
endfor
|
|
showit;
|
|
shipit;
|
|
endgroup;
|
|
endgroup;
|
|
numeric u,uu,v;
|
|
|
|
"Figure 24e"; % hash mark
|
|
numeric u;
|
|
u#:=10/18pt#; define_pixels(u);
|
|
beginchar(0,15u#,250/36pt#,70/36pt#);
|
|
pickup pencircle scaled (.4pt+blacker);
|
|
lft x1=round u-eps; x3=x1; x2=x4=w-x1;
|
|
y1=y2=good.y(.5[-d,h]+1.1pt); y3=y4=h-d-y1;
|
|
draw z1--z2; draw z3--z4;
|
|
lft x6=round 3u; x7=w-x6;
|
|
x8=good.x .5w; x5-x6=x7-x8;
|
|
top y5=top y7=h+eps; bot y6=bot y8=-d-eps;
|
|
draw z5--z6; draw z7--z8;
|
|
labels.top(6,8);
|
|
labels.bot(5,7);
|
|
labels.lft(2,4);
|
|
labels.rt(1,3);
|
|
endchar;
|
|
|
|
"Figure 24f"; % Ionian O at 200 pixels/inch, autorounding=1
|
|
ss:=10;
|
|
begingroup interim hppp:=200/72.27; % lowres parameters
|
|
interim blacker:=.65; % make pens a bit blacker
|
|
interim o_correction:=.4; % but don't overshoot as much
|
|
em#:=10pt#; cap#:=7pt#;
|
|
thin#:=1/3pt#; thick#:=5/6pt#;
|
|
o#:=1/5pt#;
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick);
|
|
define_corrected_pixels(o);
|
|
curve_sidebar:= 1/18em;
|
|
interim autorounding:=1;
|
|
interim granularity:=10;
|
|
beginchar("O",0.8em#,cap#,0);
|
|
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) scaled ss;
|
|
for m=0 upto w: proofrule((m*ss,0),(m*ss,h*ss)); endfor
|
|
for n=0 upto h: proofrule((0,n*ss),(w*ss,n*ss)); endfor
|
|
proofrulethickness 1;
|
|
pair u;
|
|
for v= % pairs gotten from tracingedges on a separate run!
|
|
(2,9), (2,6), (3,6), (3,4), (4,4), (4,3), (5,3), (5,2), (6,2),
|
|
(6,1), (8,1), (8,0), (14,0), (14,1), (16,1), (16,2), (17,2), (17,3),
|
|
(18,3), (18,4), (19,4), (19,7), (20,7), (20,13), (19,13), (19,15),
|
|
(18,15), (18,16), (17,16), (17,17), (16,17), (16,18), (14,18), (14,19),
|
|
(8,19), (8,18), (6,18), (6,17), (5,17), (5,16), (4,16), (4,15), (3,15),
|
|
(3,12), (2,12), (2,9)
|
|
:if known u: proofrule(u*ss,v*ss) ; fi
|
|
u:=v; endfor
|
|
|
|
pair u;
|
|
for v=
|
|
(4,9), (4,7), (5,7), (5,5), (6,5),
|
|
(6,4), (7,4), (7,3), (9,3), (9,2), (14,2), (14,3), (15,3), (15,4), (16,4),
|
|
(16,5), (17,5), (17,7), (18,7), (18,12), (17,12), (17,14), (16,14),
|
|
(16,15), (15,15), (15,16), (13,16), (13,17), (8,17), (8,16), (7,16),
|
|
(7,15), (6,15), (6,14), (5,14), (5,12), (4,12), (4,9)
|
|
:if known u: proofrule(u*ss,v*ss) ; fi
|
|
u:=v; endfor
|
|
showit;
|
|
shipit;
|
|
endgroup;
|
|
endgroup;
|
|
numeric u;
|
|
|
|
"Figure 24g"; % Ionian O at 200 pixels/inch, autorounding=2
|
|
ss:=10;
|
|
begingroup interim hppp:=200/72.27; % lowres parameters
|
|
interim blacker:=.65; % make pens a bit blacker
|
|
interim o_correction:=.4; % but don't overshoot as much
|
|
em#:=10pt#; cap#:=7pt#;
|
|
thin#:=1/3pt#; thick#:=5/6pt#;
|
|
o#:=1/5pt#;
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick);
|
|
define_corrected_pixels(o);
|
|
curve_sidebar:= 1/18em;
|
|
interim autorounding:=2;
|
|
interim granularity:=10;
|
|
beginchar("O",0.8em#,cap#,0);
|
|
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) scaled ss;
|
|
for m=0 upto w: proofrule((m*ss,0),(m*ss,h*ss)); endfor
|
|
for n=0 upto h: proofrule((0,n*ss),(w*ss,n*ss)); endfor
|
|
proofrulethickness 1;
|
|
pair u;
|
|
for v=
|
|
(2,9), (2,6), (3,6),
|
|
(3,4), (4,4), (4,3), (5,3), (5,2), (6,2), (6,1), (8,1), (8,0), (14,0),
|
|
(14,1), (16,1), (16,2), (17,2), (17,3), (18,3), (18,4), (19,4), (19,7),
|
|
(20,7), (20,13), (19,13), (19,15), (18,15), (18,16), (17,16), (17,17),
|
|
(16,17), (16,18), (14,18), (14,19), (8,19), (8,18), (6,18), (6,17),
|
|
(5,17), (5,16), (4,16), (4,15), (3,15), (3,12), (2,12), (2,9)
|
|
:if known u: proofrule(u*ss,v*ss) ; fi
|
|
u:=v; endfor
|
|
|
|
pair u;
|
|
for v=
|
|
(4,9), (4,7), (5,7), (5,5), (6,5),
|
|
(6,4), (7,4), (7,3), (9,3), (9,2), (13,2), (13,3), (15,3), (15,4), (16,4),
|
|
(16,5), (17,5), (17,7), (18,7), (18,12), (17,12), (17,14), (16,14),
|
|
(16,15), (15,15), (15,16), (13,16), (13,17), (9,17), (9,16), (7,16),
|
|
(7,15), (6,15), (6,14), (5,14), (5,12), (4,12), (4,9)
|
|
:if known u: proofrule(u*ss,v*ss) ; fi
|
|
u:=v; endfor
|
|
showit;
|
|
shipit;
|
|
endgroup;
|
|
endgroup;
|
|
numeric u;
|
|
|
|
"Figure 24h"; % Ionian O at 200 pixels/inch, autorounding=0, smoothing=1
|
|
ss:=10;
|
|
begingroup interim hppp:=200/72.27; % lowres parameters
|
|
interim blacker:=.65; % make pens a bit blacker
|
|
interim o_correction:=.4; % but don't overshoot as much
|
|
em#:=10pt#; cap#:=7pt#;
|
|
thin#:=1/3pt#; thick#:=5/6pt#;
|
|
o#:=1/5pt#;
|
|
define_pixels(em,cap);
|
|
define_blacker_pixels(thin,thick);
|
|
define_corrected_pixels(o);
|
|
curve_sidebar:= 1/18em;
|
|
beginchar("O",0.8em#,cap#,0);
|
|
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) scaled ss;
|
|
for m=0 upto w: proofrule((m*ss,0),(m*ss,h*ss)); endfor
|
|
for n=0 upto h: proofrule((0,n*ss),(w*ss,n*ss)); endfor
|
|
proofrulethickness 1;
|
|
pair u;
|
|
for v=
|
|
(2,9), (2,5), (3,5),
|
|
(3,3), (4,3), (4,2), (6,2), (6,1), (8,1), (8,0), (14,0), (14,1), (16,1),
|
|
(16,2), (17,2), (17,3), (18,3), (18,4), (19,4), (19,6), (20,6), (20,14),
|
|
(19,14), (19,16), (18,16), (18,17), (16,17), (16,18), (14,18), (14,19),
|
|
(8,19), (8,18), (6,18), (6,17), (5,17), (5,16), (4,16), (4,15), (3,15),
|
|
(3,13), (2,13), (2,9)
|
|
:if known u: proofrule(u*ss,v*ss) ; fi
|
|
u:=v; endfor
|
|
|
|
pair u;
|
|
for v=
|
|
(4,10), (4,9), (5,9), (5,5), (6,5),
|
|
(6,4), (7,4), (7,3), (8,3), (8,2), (14,2), (14,3), (15,3), (15,4), (16,4),
|
|
(16,6), (17,6), (17,8), (18,8), (18,10), (17,10), (17,13), (16,13),
|
|
(16,15), (15,15), (15,16), (14,16), (14,17), (8,17), (8,16), (7,16),
|
|
(7,15), (6,15), (6,13), (5,13), (5,11), (4,11), (4,10)
|
|
:if known u: proofrule(u*ss,v*ss) ; fi
|
|
u:=v; endfor
|
|
showit;
|
|
shipit;
|
|
endgroup;
|
|
endgroup;
|
|
numeric u;
|
|
|
|
"Figure 27a"; % Modification of Fig. 14b
|
|
clear_all;
|
|
pair zz[];
|
|
zz1=(0,509);
|
|
zz2=(-14,492);
|
|
zz3=(-32,481);
|
|
zz4=(-42,455);
|
|
zz5=(-62,430);
|
|
zz6=(-20,452);
|
|
zz7=(42,448);
|
|
zz8=(38,465);
|
|
zz9=(4,493);
|
|
for n=1 upto 9: z[n-1]=(zz[n]+(62,-430)) scaled 2.5; heavy_dot z[n-1]; endfor
|
|
pickup pencircle scaled 3;
|
|
draw flex(z0,z1,z2)&flex(z2,z3,z4)
|
|
&flex(z4,z5,z6)&flex(z6,z7,z8,z0)&cycle;
|
|
labels.lft(1,2,3,4);
|
|
labels.rt(0,6,7,8);
|
|
labels.bot(5);
|
|
showit; shipit;
|
|
|
|
"Figure Da"; % Neenie's problem
|
|
clear_all;
|
|
z1l=(0,240-y); z1r=(15,288-y);
|
|
z0l-z0r=z1l-z1r; z0r=(144,189-y); y0l=0;
|
|
pickup pencircle scaled 2;
|
|
numeric a,b,c,d;
|
|
a=x1l; b=y1r; (c,d)=z0r;
|
|
draw z0l--z0r--z1r--z1l--cycle;
|
|
proofrule((a,d),(a,b)); proofrule((a,b),(a-d+b,b));
|
|
for z=z0l,z0r,z1l,z1r,(a,b): heavy_dot z; endfor
|
|
makelabel.bot.nodot("<=",z1r+(3,-8));
|
|
makelabel.lft("(a,b)",(a,b));
|
|
makelabel.top("z1r",z1r);
|
|
makelabel.lft("z1l",z1l);
|
|
makelabel.rt("(c,d)",z0r);
|
|
makelabel.lft("z0r ",z0r);
|
|
makelabel.lft("z0l ",z0l);
|
|
showit; shipit;
|
|
|
|
"Figure Ea"; % T of METAFONT logo, with italic correction
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(suffix c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(str c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
slant:=0;
|
|
|
|
beginlogochar(T,13);
|
|
italcorr h#*slant+.5u#;
|
|
if odd(w-ph): w:=w+1; fi % allows a symmetric stem
|
|
x1+x2=2x3=2x4=w; lft.x1=-epsilon; % I tried s-o instead; was not as good
|
|
y1=y2=y3; top.y1=h; bot.y4=-o;
|
|
draw z1..z2; draw z3..z4;
|
|
labels.rt(2,3);
|
|
makelabel.top("1",z1);
|
|
makelabel.top("4",z4);
|
|
endchar;
|
|
|
|
"Figure Eb"; % F of METAFONT logo
|
|
alpha:=.45; % controls bar location and similar things
|
|
beta:=.2; % controls squareness of bowls
|
|
numeric h#, xx#, yy#, o#, s#, u#, ph#, pv#;
|
|
numeric leftstemloc, barheight;
|
|
h#=6; % height of characters, in pt
|
|
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
|
|
ph#=2/3; % horizontal thickness of pen, in pt
|
|
yy#=xx#; define_whole_pixels(xx,yy);
|
|
define_pixels(s,u);
|
|
define_corrected_pixels(o);
|
|
pv#=.9ph#; define_blacker_pixels(ph,pv);
|
|
pickup pencircle xscaled ph yscaled pv;
|
|
logo_pen:=savepen;
|
|
leftstemloc:=good.x((2.5u#+s#)*pt);
|
|
barheight:=good.y(alpha*h#*pt);
|
|
def beginlogochar(suffix c)(expr n) = % code c; width is n units plus sidebars
|
|
beginchar(str c,n*u#+2s#,h#,0); pickup logo_pen enddef;
|
|
|
|
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.rt(2,3);
|
|
labels.lft(4,5);
|
|
labels.top(1);
|
|
endchar;
|
|
|
|
"Figure Ec"; % cmr10 period
|
|
u#:=20/36pt#;
|
|
dot_diam#:=38/36pt#;
|
|
body_height#:=270/36pt#; % height of tallest characters
|
|
asc_height#:=250/36pt#; % height of lowercase ascenders
|
|
x_height#:=155/36pt#; % height of lowercase without ascenders
|
|
bar_height#:=87/36pt#; % height of crossbar in lowercase e
|
|
desc_depth#:=70/36pt#; % depth of lowercase descenders
|
|
body_depth#:=90/36pt#;
|
|
fine#:=7/36pt#;
|
|
|
|
define_pixels(u);
|
|
define_whole_blacker_pixels(dot_diam,fine);
|
|
define_whole_vertical_pixels(body_height,asc_height,x_height,bar_height,
|
|
desc_depth,body_depth);
|
|
|
|
beginchar(".",5u#,dot_diam#,0);
|
|
def makebox(text rule) =
|
|
for y=0,asc_height,body_height,x_height,bar_height,-desc_depth,-body_depth:
|
|
rule((0,y),(w,y)); endfor % horizontals
|
|
for x=0,w: rule((x,-body_depth),(x,body_height)); endfor % verticals
|
|
for x=u step u until w-1:
|
|
rule((x,-body_depth),(x,body_height)); endfor % more verticals
|
|
if charic<>0:
|
|
rule((w+charic*pt,h.o_),(w+charic*pt,.5h.o_)); fi % italic correction
|
|
enddef;
|
|
pickup pencircle scaled fine;
|
|
penpos1(dot_diam-fine,0); penpos2(dot_diam-fine,90);
|
|
x1l=good.x(x1l+.5w-x1); bot y2l=0; z1=z2;
|
|
filldraw z1l...z2l...z1r...z2r...cycle; % roundish dot
|
|
labels.lft(1,1l);
|
|
labels.rt(2,1r);
|
|
labels.top(2r);
|
|
labels.bot(2l);
|
|
endchar;
|
|
|
|
"Figure Ed"; % cmr10 emdash
|
|
u#:=20/36pt#;
|
|
dot_diam#:=38/36pt#;
|
|
body_height#:=270/36pt#; % height of tallest characters
|
|
asc_height#:=250/36pt#; % height of lowercase ascenders
|
|
x_height#:=155/36pt#; % height of lowercase without ascenders
|
|
bar_height#:=87/36pt#; % height of crossbar in lowercase e
|
|
desc_depth#:=70/36pt#; % depth of lowercase descenders
|
|
body_depth#:=90/36pt#;
|
|
vair#:=8/36pt#; % vertical diameter of hairlines
|
|
|
|
define_pixels(u);
|
|
define_whole_blacker_pixels(dot_diam,vair);
|
|
define_whole_vertical_pixels(body_height,asc_height,x_height,bar_height,
|
|
desc_depth,body_depth);
|
|
|
|
beginchar(oct"174",18u#,x_height#,0);
|
|
def makebox(text rule) =
|
|
for y=0,asc_height,body_height,x_height,bar_height,-desc_depth,-body_depth:
|
|
rule((0,y),(w,y)); endfor % horizontals
|
|
for x=0,w: rule((x,-body_depth),(x,body_height)); endfor % verticals
|
|
for x=u step u until w-1:
|
|
rule((x,-body_depth),(x,body_height)); endfor % more verticals
|
|
if charic<>0:
|
|
rule((w+charic*pt,h.o_),(w+charic*pt,.5h.o_)); fi % italic correction
|
|
enddef;
|
|
italcorr .61803x_height#*0 + .5u#;
|
|
pickup nullpen;
|
|
penpos1(vair,90); penpos2(vair,90);
|
|
y1r=y2r=good.y(y1r+.61803h-y1);
|
|
lft x1=-eps; rt x2=w+eps;
|
|
penstroke z1e--z2e; % crossbar
|
|
labels.lft(1);
|
|
labels.rt(2);
|
|
labels.top(1r,2r);
|
|
labels.bot(1l,2l);
|
|
endchar;
|
|
|
|
bye
|
|
|