From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- fonts/duerer/README | 28 ++ fonts/duerer/cdb10.mf | 73 +++++ fonts/duerer/cdi10.mf | 73 +++++ fonts/duerer/cdr10.mf | 74 +++++ fonts/duerer/cdsl10.mf | 74 +++++ fonts/duerer/cdss10.mf | 73 +++++ fonts/duerer/cdtt10.mf | 73 +++++ fonts/duerer/dromani.mf | 647 ++++++++++++++++++++++++++++++++++++++++++ fonts/duerer/dromanu.mf | 732 ++++++++++++++++++++++++++++++++++++++++++++++++ fonts/duerer/dtitle.mf | 238 ++++++++++++++++ 10 files changed, 2085 insertions(+) create mode 100644 fonts/duerer/README create mode 100644 fonts/duerer/cdb10.mf create mode 100644 fonts/duerer/cdi10.mf create mode 100644 fonts/duerer/cdr10.mf create mode 100644 fonts/duerer/cdsl10.mf create mode 100644 fonts/duerer/cdss10.mf create mode 100644 fonts/duerer/cdtt10.mf create mode 100644 fonts/duerer/dromani.mf create mode 100644 fonts/duerer/dromanu.mf create mode 100644 fonts/duerer/dtitle.mf (limited to 'fonts/duerer') diff --git a/fonts/duerer/README b/fonts/duerer/README new file mode 100644 index 0000000000..f482961eab --- /dev/null +++ b/fonts/duerer/README @@ -0,0 +1,28 @@ +This file is public domain. +Originally written 1990, Alan Hoenig. +This notice added by Clea F. Rees 2010/12/13 following correspondence between +Alan Hoenig and Karl Berry, who also suggested adding the included reference to + and renaming duerer.readme to +README. File list and references amended accordingly. + +This directory contains the "Computer Duerer" fonts designed by Alan Hoenig (see +the 1990 TUG Conference Proceedings for a full background on this or Alan +Hoenig's article at for further +details). The version here is for use as titling only and consists of the +uppercase letters A-Z. + +README This file + +cdb10.mf Computer Duerer Boldface +cdi10.mf Computer Duerer "Informal" (modeled in + part, after Stone Informal) This + font does not generate properly at + resolutions under ~400dpi. +cdr10.mf Computer Duerer Roman +cdsl10.mf Computer Duerer Slanted +cdss10.mf Computer Duerer Sans Serif +cdtt10.mf Computer Duerer Typewriter Type + +dromani.mf Low level MF files for the Computer +dromanu.mf Duerer fonts +dtitle.mf diff --git a/fonts/duerer/cdb10.mf b/fonts/duerer/cdb10.mf new file mode 100644 index 0000000000..29f9da4b82 --- /dev/null +++ b/fonts/duerer/cdb10.mf @@ -0,0 +1,73 @@ +%% This file is public domain. +%% Originally written 1990, Alan Hoenig. +%% Notice added by Clea F. Rees 2010/12/13 following correspondence between Alan Hoenig and Karl Berry. + +% This is CDB10.MF, Computer Durer Roman BOLD at 10 point design size. +% Parameters from CDR10.MF are used as much as possible. +if unknown cmbase: input cmbase fi + +font_identifier:="CDB"; font_size 10pt#; %% + +u#:=23/36pt#; % unit width +hstretch:=1.1; +vstretch:=1; +width_adj#:=0pt#; % width adjustment for certain characters +serif_fit#:=0pt#; % extra sidebar near lowercase serifs +cap_serif_fit#:=5/36pt#; % extra sidebar near uppercase serifs +letter_fit#:=0pt#; % extra space added to all sidebars + +body_height#:=270/36pt#; % height of tallest characters +asc_height#:=250/36pt#; % height of lowercase ascenders +cap_height#:=246/36pt#; % height of caps +fig_height#:=232/36pt#; % height of numerals +x_height#:=155/36pt#; % height of lowercase without ascenders +bar_height#:=87/36pt#; +math_axis#:=90/36pt#; % axis of symmetry for math symbols +bar_height#:=87/36pt#; % height of crossbar in lowercase e +comma_depth#:=70/36pt#; % depth of comma below baseline +desc_depth#:=70/36pt#; % depth of lowercase descenders + +% Durer's letters are based on units derived from the side of a square. +side#:=cap_height#; +thickfudge:=.15; thinfudge:=.4; +thick#:=thickfudge*side#; % thickness of all thick limbs in Roman font +thin#:=thinfudge*thick#; % thinness of all thin limbs +eta:=(2-sqrt2); % darkness for serifs; $\eta \approx 0.2929$ +serif_darkness:=eta; + +crisp#:=0pt#; % diameter of serif corners +tiny#:=0pt#; %% diameter of rounded corners +fine#:=7/36pt#; % diameter of sharply rounded corners +rule_thickness#:=.4pt#; % thickness of lines in math symbols + +cap_stem#:=thick#; % thickness of majuscule stems +stem#:=thick#; + +dish#:=1/36pt#; % amount erased at top or bottom of serifs +bracket#:=thick#; %% vertical distance from serif base to tangent +jut#:=.5thick#; %% protrusion of lowercase serifs +cap_jut#:=.75thick#; %% protrusion of uppercase serifs +beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs +slab#:=thin#; %% serif and arm thickness +dslab#=thin#; %%slab value used in Durer fonts + +hair#:=vair#:=thin#; + +o#:=8/36pt#; % amount of overshoot for curves +apex_o#:=thin#; % amount of overshoot for diagonal junctions +apex_corr#=0pt#; + +slant:=0; % tilt ratio $(\Delta x/\Delta y)$ +fudge:=1; % factor applied to weights of heavy characters +superness:=1/sqrt2; % parameter for superellipses +superpull:=0; % extra openness inside bowls +beak_darkness:=11/30; % fraction of triangle inside beak serifs + +boolean informal; +informal:=false; % generating informal font? +serifs:=true; % should serifs and bulbs be attached? +monospace:=false; % should all characters have the same width? + +boolean whole_font; whole_font:=false; + +generate dtitle %% switch to the driver file---Durer title diff --git a/fonts/duerer/cdi10.mf b/fonts/duerer/cdi10.mf new file mode 100644 index 0000000000..de9a7a4976 --- /dev/null +++ b/fonts/duerer/cdi10.mf @@ -0,0 +1,73 @@ +%% This file is public domain. +%% Originally written 1990, Alan Hoenig. +%% Notice added by Clea F. Rees 2010/12/13 following correspondence between Alan Hoenig and Karl Berry. + +% This is CDI10.MF, Computer Durer Roman at 10 point design size. +% Parameters from CDR10.MF are used as much as possible. +if unknown cmbase: input cmbase fi + +font_identifier:="CDI"; font_size 10pt#; %% + +u#:=22/36pt#; % unit width +hstretch:=1; +vstretch:=1.2; +width_adj#:=0pt#; % width adjustment for certain characters +serif_fit#:=0pt#; % extra sidebar near lowercase serifs +cap_serif_fit#:=5/36pt#; % extra sidebar near uppercase serifs +letter_fit#:=0pt#; % extra space added to all sidebars + +body_height#:=270/36pt#; % height of tallest characters +asc_height#:=250/36pt#; % height of lowercase ascenders +cap_height#:=246/36pt#; % height of caps +fig_height#:=232/36pt#; % height of numerals +x_height#:=155/36pt#; % height of lowercase without ascenders +bar_height#:=87/36pt#; +math_axis#:=90/36pt#; % axis of symmetry for math symbols +bar_height#:=87/36pt#; % height of crossbar in lowercase e +comma_depth#:=70/36pt#; % depth of comma below baseline +desc_depth#:=70/36pt#; % depth of lowercase descenders + +% Durer's letters are based on units derived from the side of a square. +side#:=cap_height#; +thickfudge:=.13; thinfudge:=.4; +thick#:=thickfudge*side#; % thickness of all thick limbs in Roman font +thin#:=thinfudge*thick#; % thinness of all thin limbs +eta:=.9(2-sqrt2); % darkness for serifs +serif_darkness:=eta; + +crisp#:=10/36pt#; % diameter of serif corners +tiny#:=10/36pt#; %% diameter of rounded corners +fine#:=7/36pt#; % diameter of sharply rounded corners +rule_thickness#:=.4pt#; % thickness of lines in math symbols + +cap_stem#:=thick#; % thickness of majuscule stems +stem#:=thick#; + +dish#:=1/36pt#; % amount erased at top or bottom of serifs +bracket#:=1.2thick#; %% vertical distance from serif base to tangent +jut#:=thick#; %% protrusion of lowercase serifs +cap_jut#:=1.0thick#; %% protrusion of uppercase serifs +beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs +slab#:=thin#; %% serif and arm thickness +dslab#=thin#; %%slab value used in Durer fonts + +hair#:=vair#:=thin#; + +o#:=8/36pt#; % amount of overshoot for curves +apex_o#:=thin#; % amount of overshoot for diagonal junctions +apex_corr#=0pt#; + +slant:=0; % tilt ratio $(\Delta x/\Delta y)$ +fudge:=1; % factor applied to weights of heavy characters +superness:=1/sqrt2; % parameter for superellipses +superpull:=1/6; % extra openness inside bowls +beak_darkness:=11/30; % fraction of triangle inside beak serifs + +boolean informal; +informal:=true; % generating informal font? +serifs:=true; % should serifs and bulbs be attached? +monospace:=false; % should all characters have the same width? + +boolean whole_font; whole_font=false; + +generate dtitle %% switch to the driver file---Durer title diff --git a/fonts/duerer/cdr10.mf b/fonts/duerer/cdr10.mf new file mode 100644 index 0000000000..2d09bc8f70 --- /dev/null +++ b/fonts/duerer/cdr10.mf @@ -0,0 +1,74 @@ +%% This file is public domain. +%% Originally written 1990, Alan Hoenig. +%% Notice added by Clea F. Rees 2010/12/13 following correspondence between Alan Hoenig and Karl Berry. + +% This is CDR10.MF, Computer Durer Roman at 10 point design size. +% Parameters from CMR10.MF are used as much as possible. +if unknown cmbase: input cmbase fi + +font_identifier:="CDR"; font_size 10pt#; %% + +u#:=20/36pt#; % unit width +hstretch:=1; % horizontal stretching factors; in lieu of u +vstretch:=1; % vertical stretching factor +width_adj#:=0pt#; % width adjustment for certain characters +serif_fit#:=0pt#; % extra sidebar near lowercase serifs +cap_serif_fit#:=5/36pt#; % extra sidebar near uppercase serifs +letter_fit#:=0pt#; % extra space added to all sidebars + +body_height#:=270/36pt#; % height of tallest characters +asc_height#:=250/36pt#; % height of lowercase ascenders +cap_height#:=246/36pt#; % height of caps +fig_height#:=232/36pt#; % height of numerals +x_height#:=155/36pt#; % height of lowercase without ascenders +bar_height#:=87/36pt#; +math_axis#:=90/36pt#; % axis of symmetry for math symbols +bar_height#:=87/36pt#; % height of crossbar in lowercase e +comma_depth#:=70/36pt#; % depth of comma below baseline +desc_depth#:=70/36pt#; % depth of lowercase descenders + +% Durer's letters are based on units derived from the side of a square. +side#:=cap_height#; +thickfudge:=1/9; thinfudge:=1/3; +thick#:=thickfudge*side#; % thickness of all thick limbs in Roman font +thin#:=thinfudge*thick#; % thinness of all thin limbs +eta:=2-sqrt2; % darkness for serifs; $\eta \approx 0.58$ +serif_darkness:=eta; + +crisp#:=0pt#; % diameter of serif corners +tiny#:=0pt#; %% diameter of rounded corners +fine#:=7/36pt#; % diameter of sharply rounded corners +rule_thickness#:=.4pt#; % thickness of lines in math symbols + +cap_stem#:=thick#; % thickness of majuscule stems +stem#:=thick#; + +dish#:=1/36pt#; % amount erased at top or bottom of serifs +bracket#:=thick#; %% vertical distance from serif base to tangent +jut#:=thick#; %% protrusion of lowercase serifs +cap_jut#:=thick#; %% protrusion of uppercase serifs +beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs +slab#:=eps*1pt#; %% serif and arm thickness +dslab#=0; %%slab value used in Durer fonts + +hair#:=vair#:=thin#; + +o#:=8/36pt#; % amount of overshoot for curves +apex_o#:=thin#; % amount of overshoot for diagonal junctions +apex_corr#=0pt#; + +slant:=0; % tilt ratio $(\Delta x/\Delta y)$ +fudge:=1; % factor applied to weights of heavy characters +superness:=1/sqrt2; % parameter for superellipses +superpull:=0; % extra openness inside bowls +beak_darkness:=11/30; % fraction of triangle inside beak serifs + +boolean informal; +informal:=false; % generating informal font? +serifs:=true; % should serifs and bulbs be attached? +monospace:=false; % should all characters have the same width? + +boolean whole_font; % try generating a complete font? +whole_font:=false; + +generate dtitle %% switch to the driver file---Durer title diff --git a/fonts/duerer/cdsl10.mf b/fonts/duerer/cdsl10.mf new file mode 100644 index 0000000000..c91949cd89 --- /dev/null +++ b/fonts/duerer/cdsl10.mf @@ -0,0 +1,74 @@ +%% This file is public domain. +%% Originally written 1990, Alan Hoenig. +%% Notice added by Clea F. Rees 2010/12/13 following correspondence between Alan Hoenig and Karl Berry. + +% This is CDR10.MF, Computer Durer Roman at 10 point design size. +% Parameters from CMR10.MF are used as much as possible. +if unknown cmbase: input cmbase fi + +font_identifier:="CDR"; font_size 10pt#; %% + +u#:=20/36pt#; % unit width +hstretch:=1; % horizontal stretching factors; in lieu of u +vstretch:=1; % vertical stretching factor +width_adj#:=0pt#; % width adjustment for certain characters +serif_fit#:=0pt#; % extra sidebar near lowercase serifs +cap_serif_fit#:=5/36pt#; % extra sidebar near uppercase serifs +letter_fit#:=0pt#; % extra space added to all sidebars + +body_height#:=270/36pt#; % height of tallest characters +asc_height#:=250/36pt#; % height of lowercase ascenders +cap_height#:=246/36pt#; % height of caps +fig_height#:=232/36pt#; % height of numerals +x_height#:=155/36pt#; % height of lowercase without ascenders +bar_height#:=87/36pt#; +math_axis#:=90/36pt#; % axis of symmetry for math symbols +bar_height#:=87/36pt#; % height of crossbar in lowercase e +comma_depth#:=70/36pt#; % depth of comma below baseline +desc_depth#:=70/36pt#; % depth of lowercase descenders + +% Durer's letters are based on units derived from the side of a square. +side#:=cap_height#; +thickfudge:=1/9; thinfudge:=1/3; +thick#:=thickfudge*side#; % thickness of all thick limbs in Roman font +thin#:=thinfudge*thick#; % thinness of all thin limbs +eta:=2-sqrt2; % darkness for serifs; $\eta \approx 0.58$ +serif_darkness:=eta; + +crisp#:=0pt#; % diameter of serif corners +tiny#:=0pt#; %% diameter of rounded corners +fine#:=7/36pt#; % diameter of sharply rounded corners +rule_thickness#:=.4pt#; % thickness of lines in math symbols + +cap_stem#:=thick#; % thickness of majuscule stems +stem#:=thick#; + +dish#:=1/36pt#; % amount erased at top or bottom of serifs +bracket#:=thick#; %% vertical distance from serif base to tangent +jut#:=thick#; %% protrusion of lowercase serifs +cap_jut#:=thick#; %% protrusion of uppercase serifs +beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs +slab#:=eps*1pt#; %% serif and arm thickness +dslab#=0; %%slab value used in Durer fonts + +hair#:=vair#:=thin#; + +o#:=8/36pt#; % amount of overshoot for curves +apex_o#:=thin#; % amount of overshoot for diagonal junctions +apex_corr#=0pt#; + +slant:=1/6; % tilt ratio $(\Delta x/\Delta y)$ +fudge:=1; % factor applied to weights of heavy characters +superness:=1/sqrt2; % parameter for superellipses +superpull:=0; % extra openness inside bowls +beak_darkness:=11/30; % fraction of triangle inside beak serifs + +boolean informal; +informal:=false; % generating informal font? +serifs:=true; % should serifs and bulbs be attached? +monospace:=false; % should all characters have the same width? + +boolean whole_font; % try generating a complete font? +whole_font:=false; + +generate dtitle %% switch to the driver file---Durer title diff --git a/fonts/duerer/cdss10.mf b/fonts/duerer/cdss10.mf new file mode 100644 index 0000000000..490512a112 --- /dev/null +++ b/fonts/duerer/cdss10.mf @@ -0,0 +1,73 @@ +%% This file is public domain. +%% Originally written 1990, Alan Hoenig. +%% Notice added by Clea F. Rees 2010/12/13 following correspondence between Alan Hoenig and Karl Berry. + +% This is CDSS10.MF, Computer Durer Sans Serif at 10 point design size. +% Parameters from CDR10.MF are used as much as possible. +if unknown cmbase: input cmbase fi + +font_identifier:="CDR"; font_size 10pt#; %% + +u#:=20/36pt#; % unit width +hstretch:=1; +vstretch:=1; +width_adj#:=0pt#; % width adjustment for certain characters +serif_fit#:=0pt#; % extra sidebar near lowercase serifs +cap_serif_fit#:=5/36pt#; % extra sidebar near uppercase serifs +letter_fit#:=10/36pt#; % extra space added to all sidebars + +body_height#:=270/36pt#; % height of tallest characters +asc_height#:=250/36pt#; % height of lowercase ascenders +cap_height#:=246/36pt#; % height of caps +fig_height#:=232/36pt#; % height of numerals +x_height#:=155/36pt#; % height of lowercase without ascenders +bar_height#:=87/36pt#; +math_axis#:=90/36pt#; % axis of symmetry for math symbols +bar_height#:=87/36pt#; % height of crossbar in lowercase e +comma_depth#:=70/36pt#; % depth of comma below baseline +desc_depth#:=70/36pt#; % depth of lowercase descenders + +% Durer's letters are based on units derived from the side of a square. +side#:=cap_height#; +thickfudge:=1/9; thinfudge:=1/2; +thick#:=thickfudge*side#; % thickness of all thick limbs in Roman font +thin#:=thinfudge*thick#; % thinness of all thin limbs +eta:=(2-sqrt2); % darkness for serifs +serif_darkness:=eta; + +crisp#:=0pt#; % diameter of serif corners +tiny#:=0pt#; %% diameter of rounded corners +fine#:=7/36pt#; % diameter of sharply rounded corners +rule_thickness#:=.4pt#; % thickness of lines in math symbols + +cap_stem#:=thick#; % thickness of majuscule stems +stem#:=thick#; + +dish#:=1/36pt#; % amount erased at top or bottom of serifs +bracket#:=thick#; %% vertical distance from serif base to tangent +jut#:=0; %% protrusion of lowercase serifs +cap_jut#:=0; %% protrusion of uppercase serifs +beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs +slab#:=eps*1pt#; %% serif and arm thickness +dslab#=0pt#; %%slab value used in Durer fonts + +hair#:=vair#:=thin#; + +o#:=8/36pt#; % amount of overshoot for curves +apex_o#:=thin#; % amount of overshoot for diagonal junctions +apex_corr#=0pt#; + +slant:=0; % tilt ratio $(\Delta x/\Delta y)$ +fudge:=1; % factor applied to weights of heavy characters +superness:=1/sqrt2; % parameter for superellipses +superpull:=1/6; % extra openness inside bowls +beak_darkness:=11/30; % fraction of triangle inside beak serifs + +boolean informal; +informal:=false; % generating informal font? +serifs:=false; % should serifs and bulbs be attached? +monospace:=false; % should all characters have the same width? + +boolean whole_font; whole_font:=false; + +generate dtitle %% switch to the driver file---Durer title diff --git a/fonts/duerer/cdtt10.mf b/fonts/duerer/cdtt10.mf new file mode 100644 index 0000000000..8ad4309b7b --- /dev/null +++ b/fonts/duerer/cdtt10.mf @@ -0,0 +1,73 @@ +%% This file is public domain. +%% Originally written 1990, Alan Hoenig. +%% Notice added by Clea F. Rees 2010/12/13 following correspondence between Alan Hoenig and Karl Berry. + +% This is CDTT10.MF, Computer Durer Typewriter Type at 10 point design size. +% Parameters from CDR10.MF are used as much as possible. +if unknown cmbase: input cmbase fi + +font_identifier:="CDTT"; font_size 10pt#; %% + +u#:=21/36pt#; % unit width +hstretch:=.9; +vstretch:=1; +width_adj#:=0pt#; % width adjustment for certain characters +serif_fit#:=0pt#; % extra sidebar near lowercase serifs +cap_serif_fit#:=0pt#; % extra sidebar near uppercase serifs +letter_fit#:=0pt#; % extra space added to all sidebars + +body_height#:=250/36pt#; % height of tallest characters +asc_height#:=220/36pt#; % height of lowercase ascenders +cap_height#:=220/36pt#; % height of caps +fig_height#:=220/36pt#; % height of numerals +x_height#:=155/36pt#; % height of lowercase without ascenders +bar_height#:=110/36pt#; +math_axis#:=110/36pt#; % axis of symmetry for math symbols +bar_height#:=79/36pt#; % height of crossbar in lowercase e +comma_depth#:=50/36pt#; % depth of comma below baseline +desc_depth#:=80/36pt#; % depth of lowercase descenders + +% Durer's letters are based on units derived from the side of a square. +side#:=.9cap_height#; +thickfudge:=.14; thinfudge:=.9; +thick#:=thickfudge*side#; % thickness of all thick limbs in Roman font +thin#:=thinfudge*thick#; % thinness of all thin limbs +eta:=2-sqrt2; % darkness for serifs +serif_darkness:=0; + +crisp#:=20/36pt#; % diameter of serif corners +tiny#:=20/36pt#; %% diameter of rounded corners +fine#:=7/36pt#; % diameter of sharply rounded corners +rule_thickness#:=.4pt#; % thickness of lines in math symbols + +cap_stem#:=thick#; % thickness of majuscule stems +stem#:=thick#; + +dish#:=0pt#; % amount erased at top or bottom of serifs +bracket#:=0; %% vertical distance from serif base to tangent +jut#:=thick#; %% protrusion of lowercase serifs +cap_jut#:=thick#; %% protrusion of uppercase serifs +beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs +slab#:=thin#; %% serif and arm thickness +dslab#=thin#; %%slab value used in Durer fonts + +hair#:=vair#:=thin#; + +o#:=4/36pt#; % amount of overshoot for curves +apex_o#:=thin#; % amount of overshoot for diagonal junctions +apex_corr#=3thick#; + +slant:=0; % tilt ratio $(\Delta x/\Delta y)$ +fudge:=.81; % factor applied to weights of heavy characters +superness:=1/sqrt2; % parameter for superellipses +superpull:=0; % extra openness inside bowls +beak_darkness:=0; % fraction of triangle inside beak serifs + +boolean informal; +informal:=false; % generating informal font? +serifs:=true; % should serifs and bulbs be attached? +monospace:=true; % should all characters have the same width? + +boolean whole_font; whole_font:=false; + +generate dtitle %% switch to the driver file---Durer title diff --git a/fonts/duerer/dromani.mf b/fonts/duerer/dromani.mf new file mode 100644 index 0000000000..d0766ebce8 --- /dev/null +++ b/fonts/duerer/dromani.mf @@ -0,0 +1,647 @@ +%% This file is public domain. +%% Originally written 1990, Alan Hoenig. +%% Notice added by Clea F. Rees 2010/12/13 following correspondence between Alan Hoenig and Karl Berry. + +%% Program files for CASUAL Computer Duerer fonts. +%% +join_radius:=.1pt; +pair xeps, yeps; xeps=(eps,0); yeps=(0,eps); + +numeric P_width#; P_width#=cap_jut#+3thick#+1/4side#-1/2thin#; +define_pixels(P_width); +numeric t[]; % tensions +t.l=1.25; t.r=1; + +numeric axis; axis=1; + % H.\ Zapf would not put the axis as oblique as did + % D\"urer. This quantity measures this obliqueness. + % $0\leq axix\leq1$; $axis=1$ corresponds to D\"urer + % $axis=2$ corresponds to vertical axis. +numeric tail_corr; tail_corr=1/8; + +cmchar "The letter A (casual)"; +beginchar("A", 2u#+2cap_jut#+.8side#, cap_height#, 0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); +top y3=top y2=h+apex_o; +numeric alpha[]; alpha1=((h+cap_jut)++(w/2))/(h+cap_jut); +penpos1(alpha1*thin,0); penpos2(alpha1*thin,0); +penpos3(alpha1*thick,0); penpos4(alpha1*thick,0); +lft x1l=cap_jut+.5u; rt x4r=w-x1l; bot y1=bot y4=0; +x3r=x2l+apex_corr; hround(w/2)=.5[x2,x3]; +z0=whatever[z1r,z2r]=whatever[z3l,z4l]; +pos0'(.6thick,0);z0'r=whatever[z4r,z3r]; z0'l=whatever[z1l,z2l]; +fill z0--diag_end(0,4l,1,1,4r,3r)--z0'r--z0'l--diag_end(2l,1l,1,1,1r,0) + --z0..cycle; % diagonals +top y5r=top y6r=hround(h/2); top y5r-bot y5l=top y6r-bot y6l=thin; +penpos5(whatever, angle(z2-z1)); penpos6(whatever, angle(z3-z4)); +z5=whatever[z1,z2]; z6=whatever[z3,z4]; +penstroke z5e--z6e; % bar line +if serifs: cap_jut:=10/7 cap_jut; bracket:=10/7 bracket; + pickup tiny.nib; prime_points_inside(1,2); prime_points_inside(4,3); + numeric jut_factor; jut_factor:=7/8; + serif(1',2,a,eta,-cap_jut); serif(4',3,d,eta,cap_jut); + bracket:=jut_factor*bracket; serif(1',2,b,eta,jut_factor*cap_jut); + serif(4',3,c,eta,-jut_factor*cap_jut); + flourish(1,0',4,e,.65eta); fi +penlabels(0,0',1,2,3,4,5,6); endchar; + +cmchar "The letter B (casual)"; +beginchar("B",u#+cap_jut#+4thick#+1/4 side#-thin#, cap_height#, 0); +adjust_fit(cap_serif_fit#,0); pickup tiny.nib; +pos1(thick,0); pos2(thick,0); lft x1l=lft x2l=.5u+cap_jut; + bot y2=0; top y1=h; filldraw stroke z1e--z2e; % vertical stem +pos5(thick,0); pos7(thin,90); +lft z3r=lft z2l; rt z3l=rt z2r+(0,thick+thin); z3=.5[z3r,z3l]; + x4l=x3l+thick; y4r=y3r-o; top y4l=bot y4r+thin; + x4r=x4l+thick-1/2thin; z4=.5[z4l,z4r]; +y7l=h/2; x7l=x1; y6l=y7l; x6l=x4l; top y6r-bot y6l=thin; x6r=x4r; z6=.5[z6r,z6l]; +rt x5r=hround(w-.5u); y5=.5[y4r,y6r]; +pair where.r, where.l; where.l=down; where.r=(1,-.3); +forsuffixes t=l,r: z4't=z4t+(thin,0); endfor z4'=.5[z4'r,z4'l]; +filldraw stroke z3e{where.e}...z4'e..pulled_arc.e(4',5)& + pulled_arc.e(5,6)..z6e--z7e; % bottom lobe +pos7'(thin,-90); pos8(thick,0); pos10(thin,90); +z7'=z7; z6'=z6; x6'r=x4r; x6'l=x4l; y6'r=y7'r; y6'l=y7'l; +z10r=z1; x9r=x6'r; x9l=x6'l; y9r=y10r; top y9r-bot y9l=thin; z9=.5[z9r,z9l]; +rt x8r=lft x5l; y8=.5[y6r,y9r]; +filldraw stroke z7'e--z6'e..pulled_arc.e(6',8)&pulled_arc.e(8,9) + ..z9e--z10e; % upper lobe +if serifs: serif(1,2,a, serif_darkness,-cap_jut); fi +penlabels(1,2,3,4,5,6,7,8,9,10,11,12); +penlabels(6',7'); endchar; + +cmchar "The letter C (casual)"; +beginchar("C",2u#+.9side#, cap_height#, 0); +adjust_fit(0, 0); pickup tiny.nib; +numeric alpha; alpha=w-u-thick; +pos2(1.3thin, 90); x2=.5[x3r,x0r]; top y2r=h+o;% topmost pen position +pos3(thick,180); lft z3r=(u,h/2); +pos4(1.4thin, 270); x4=x2; bot y4r=-o; +pos0(thick,0); lft z0l=(w+ thick-u,h/2); +path p, p', line.u, line.b; line.u=(alpha,h)--(alpha,h/2); + line.b=(.5[alpha,x0],0)--(.5[alpha,x0],h/2); +p=pulled_arc.r(0,2)&pulled_arc.r(2,3)&pulled_arc.r(3,4) + &pulled_arc.r(4,0)&cycle; +p'=pulled_arc.l(0,2)&pulled_arc.l(2,3)&pulled_arc.l(3,4) + &pulled_arc.l(4,0)&cycle; +z'1l=line.u intersectionpoint p'; z'1r=line.u intersectionpoint p; +bot rt z1l=z'1l; top rt z1r=z'1r; z1=.5[z1l,z1r]; +z'5l=line.b intersectionpoint p'; z'5r=line.b intersectionpoint p; +top rt z5l=z'5l; bot rt z5r=z'5r; z5=.5[z5r, z5l]; +y5l:=y5r+2thick; y1l:=y1r-1.5thick; x1l:=x1r+.5thin; +numeric slope_factor; slope_factor=3/4; +filldraw +z1r{-1,slope_factor}..{left}z2r..pulled_arc.r(2,3)&pulled_arc.r(3,4).. + {right}z4r..{1,slope_factor}z5r ..(z5r+xeps)--(z5l+xeps).. + reverse + (z1l..{left}z2l..pulled_arc.l(2,3)&pulled_arc.l(3,4)..{right}z4l..z5l) + ..(z1l+xeps)--(z1r+xeps)..cycle; +penlabels(0,1,2,3,4,5); endchar; + +cmchar "The letter D (casual)"; +beginchar("D", side#+u#, cap_height#, 0); +adjust_fit(cap_serif_fit#,0); +pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0); +lft x1l=.5u+cap_jut; x2=x1; bot y2=2oo; top y1=h; +filldraw stroke z1e--z2e; % stem +pos3(thin, 90); pos5(thick, 0); +x3=x1; top y3r=h; z7r=z2l; +pos4(thin,90); pos6(thin, -90); bot y6r=-o; +x4r=x6r=hround(w/2); top y4r=h; +y5=good.y .51[y4,y6]; rt x5r=good.x (w-.5u); +z7r=z2l; x7l=x2r; y7l=y2r+bracket; z7=.5[z7r,z7l]; +pair where.r, where.l; where.l=up; where.r=(-1,.4); +filldraw stroke + z3e{right}..pulled_super_arc.e(4,5,eta)&pulled_super_arc.e(5,6,eta) + ..{where.e}z7e; % lobe +if serifs: serif(1, 2, a, eta, -cap_jut); fi +penlabels(1,2,3,4,5,6,7); endchar; + +cmchar "The letter E (casual)"; +numeric topbar_; topbar_=3/4; %17/30 % Duerer's wierd value +beginchar("E", hstretch*(topbar_+1/6)*side#+u#, cap_height#,0); +adjust_fit(cap_serif_fit#,0); +pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0); +lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0; +filldraw stroke z1e--z2e; % stem +pickup crisp.nib; % prepare for arms and serifs +pos3(thin,90); pos4(dslab,0); +x1=x3; top y3r=h; rt x4l=topbar_*side; bot y4=vround(h-1.2vstretch*thick); +arm(3,4,d,eta,0); % top arm and beak +pos5(thin,-90); pos0(thin,90); pos6(dslab,0); pos7(dslab,0); +x5=x0=x1; y5=y0=hround(h/2); rt x6r=rt x7r=max(x4l-hstretch*thick,rt +x1r+1/5side); +top y6-bot y7=2vstretch*jut; y5=.5[y6,y7]; +arm(5,6,e,eta,0); arm(0,7,f,eta,0); % middle arms and beaks +pos8(thin,-90); pos9(dslab,0); x8=x2; bot y8r=0; rt x9r=hround(w-.5u); +y9=y8r+thin+vstretch*1/6side; foot(8,9,g,eta,x9-x4-thick); % lower arm +if serifs: serif(1,2,a,eta,-cap_jut); + if not monospace: temp_:=slab; slab:=thin; serif(2,1,c,eta,cap_jut); + slab:=temp_; fi + antiserif(2,1,b,eta,jut); fi +penlabels(0,1,2,3,4,5,6,7,8,9); endchar; % end of "E" + +cmchar "The letter F (casual)"; +numeric topbar_; topbar_=3/4; % 17/30 % Duerer's wierd value +beginchar("F", hstretch*(topbar_+1/6)*side#-u#, cap_height#,0); +adjust_fit(cap_serif_fit#,0); +pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0); +lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0; +filldraw stroke z1e--z2e; % stem +pickup crisp.nib; % prepare for arms and serifs +pos3(thin,90); pos4(dslab,0); +x1=x3; top y3r=h; rt x4l=topbar_*side; bot y4=vround(h-1.2vstretch*thick); +arm(3,4,d,eta,0); % top arm and beak +pos5(thin,-90); pos0(thin,90); pos6(dslab,0); pos7(dslab,0); +x5=x0=x1; y5=y0=hround(h/2); rt x6r=rt x7r=max(x4l-hstretch*thick,rt +x1r+1/5side); +top y6-bot y7=2vstretch*jut; y5=.5[y6,y7]; +arm(5,6,e,eta,0); arm(0,7,f,eta,0); % middle arms and beaks +if serifs: serif(1,2,a,serif_darkness,-cap_jut); + serif(2,1,b,serif_darkness,-cap_jut); serif(2,1,c,serif_darkness, cap_jut); + fi +penlabels(0,1,2,3,4,5,6,7); endchar; % end of "F" + +cmchar "The letter G (casual)"; +beginchar("G",2u#+.9side#, cap_height#, 0); +adjust_fit(0, .5cap_serif_fit#); +if monospace: pickup fine.nib; else: pickup tiny.nib;fi +% This code is identical to that for the lette C. +numeric alpha; alpha=w-u-thick; +pos2(1.3thin, 90); x2=.5[x3r,x0r]; top y2r=h+o;% topmost pen position +pos3(thick,180); lft z3r=(u,h/2); +pos4(1.4thin, 270); x4=x2; bot y4r=-o; +pos0(thick,0); lft z0l=(w+thick-u,h/2); +path p, p', line.u, line.b; line.u=(alpha,1.5h)--(alpha,h/2); + line.b=(.5[alpha,x0],0)--(.5[alpha,x0],h/2); +p=pulled_arc.r(0,2)&pulled_arc.r(2,3)&pulled_arc.r(3,4) + &pulled_arc.r(4,0)&cycle; +p'=pulled_arc.l(0,2)&pulled_arc.l(2,3)&pulled_arc.l(3,4) + &pulled_arc.l(4,0)&cycle; +z'1l=line.u intersectionpoint p'; z'1r=line.u intersectionpoint p; +bot rt z1l=z'1l; top rt z1r=z'1r; z1=.5[z1l,z1r]; +z'5l=line.b intersectionpoint p'; z'5r=line.b intersectionpoint p; +top rt z5l=z'5l; bot rt z5r=z'5r; z5=.5[z5r, z5l]; +%x1l:=x1l+thin; y1l:=y1r-1.2thick-2tiny; +y5l:=y5r+2thick; y1l:=y1r-1.5thick; x1l:=x1r+.5thin; +% Now for addtional G work! +path p,p',line.o, line.i; +p=z1r..{left}z2r..pulled_arc.r(2,3)&pulled_arc.r(3,4)..{right}z4r..tension +0.9..z5r; +p'= reverse + (z1l..tension 0.9..{left}z2l..pulled_arc.l(2,3)&pulled_arc.l(3,4)..{right}z4l + ..tension 0.9..z5l); +pos7(thick,0); top rt z7r=(w-0u-cap_jut,.9h/2); +line.o=z7r--(x7r,-2o); line.i=(z7r-(thick,0))--(x7r-thick,-2o); +numeric t[],tt[]; +(t1,tt1)=p intersectiontimes line.o; (t2,tt2)=p' intersectiontimes line.i; +x6r=x7r; x6l=x7l; bot y6r=ypart point t1 of p; bot y6l=ypart point t2 of p'; +z6=.5[z6r,z6l]; +filldraw subpath(0,t1) of p--subpath(t2,infinity) of p'..(z1l+(eps,0))--cycle; +filldraw stroke z6e--z7e; +if serifs: serif(7,6,a,serif_darkness,-cap_jut); fi +% serif(7,6,b,serif_darkness, cap_jut); fi +penlabels(0,1,2,3,4,5,6,7); endchar; + +cmchar "The letter H (casual)"; +beginchar("H", u#+2cap_jut#+.9side#, cap_height#,0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib; +forsuffixes t=1,2,3,4: pos.t(thick,0); endfor +lft x1l=lft x2l=.5u+cap_jut; bot y2=0; top y1=h; +filldraw stroke z1e--z2e; % left vertical stem +x3=x4=w-x1; y3=y1; y4=y2; +filldraw stroke z3e--z4e; % right vertical stem +pos5(thin, 90); pos6(thin,90); +x5=.5[x1r,x1l]; x6=w-x5; top y5r=top y6r=h/2; +filldraw stroke z5e--z6e; % horizontal crossbar +if serifs: + serif(1,2,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,cap_jut); + serif(2,1,c,serif_darkness,-cap_jut); serif(2,1,d,serif_darkness,cap_jut); + serif(3,4,e,serif_darkness,-cap_jut); serif(3,4,f,serif_darkness,cap_jut); + serif(4,3,g,serif_darkness,-cap_jut); serif(4,3,h,serif_darkness,cap_jut); fi +labels(1,2,3,4,5,6); endchar; % end of "H" + +cmchar "The letter I (casual)"; +beginchar("I", .5u#+2cap_jut#+cap_stem#+.5u#, cap_height#,0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); +pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0); +x1=x2=hround(w/2); top y1=h; bot y2=0; +filldraw stroke z1e--z2e; % vertical stem +if serifs: + serif(1, 2, a, eta, -cap_jut); serif(1, 2, b, eta, cap_jut); % top lft,rt + serif(2, 1, c, eta, -cap_jut); serif(2, 1, d, eta, cap_jut); % bot lft,rt +fi +penlabels(1, 2); endchar; + +cmchar "The letter J (casual)"; +beginchar("J",u#+3thick#,cap_height#, 1/4 cap_height#); +adjust_fit(0, cap_serif_fit#); pickup tiny.nib; +pos1(thick,0); pos2(thick,0); pos3(thin, -90); +top y1=h; rt x1r=w-.5u; x2=x1; bot y2=0; lft x3=.5u; bot y3r=-d; +filldraw stroke z1e--z2e{down}..{left}z3e; +serif(1,2,a,serif_darkness,-cap_jut); +% serif(1,2,b,serif_darkness,cap_jut); +penlabels(1,2,3); endchar; + +cmchar "The letter K"; +beginchar("K", 3/2u#+cap_jut#+.9side#, cap_height#,0); +adjust_fit(cap_serif_fit#,0); pickup tiny.nib; +pair durer[]; % represent D\"urer's corner points +durer1=(.5u,h); durer2=(w-u,h); durer3=(xpart durer1,0); + durer4=(xpart durer2,0); +numeric diag_angle[]; diag_angle1=angle(durer2-durer3); +diag_angle2=angle(durer1-durer4); +numeric alpha; alpha=((xpart durer2 - xpart durer1)++h)/h; +pos1(thick,0); pos2(thick,0); lft x1l=lft x2l=.5u+cap_jut; + top y1=h; bot y2=0; filldraw stroke z1e--z2e; % left stem +pos3(alpha*thin,0); pos4(alpha*thin,0); rt x4r=rt x1r; y4=h/2; +top y3=h; z3r-z4r=whatever*(durer2-durer3); +z0=whatever[z1r,z2r]=whatever[z3l,z4l]; +filldraw z0--z3l--z3r--z4r--cycle; % upper diagonal stroke +pos5(thick,diag_angle1); z5=whatever[z3,z4]; +z0-z5l=whatever*(durer1-durer4); +numeric nibs; nibs=dslab; +pos6(nibs,90); bot rt z6l=durer4; +z5l-z7l=whatever*(durer1-durer4); z.g=(xpart durer2-thin,h/2); +z.g-z7l=whatever*(durer2-durer3); z.h=(xpart durer2, h/4); +z.g -z7r=whatever*(durer2-durer3); +z5r-z7r=whatever*(durer1-durer4); +%if serifs or not monospace: % reset x7 if necessary +% if (x7r-x1l)/(x6-x1l)>.82: numeric temp; temp=x7r; x7r:=.82*(x6-x1l)+x1l; +% temp:=temp-x7r; x7l:=x7l-temp; fi +filldraw z5r--z5l--z7l{z7l-z5l}..{right}z6l--z6r{left}..{durer1-durer4}z7r + --cycle; % lower diagonal stroke +if serifs: + numeric old_jut, old_brack; old_jut=cap_jut; old_brack=bracket; + serif(1,2,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,cap_jut); + serif(2,1,c,serif_darkness,-cap_jut); serif(2,1,d,serif_darkness,cap_jut); + %bracket:=.75old_brack;cap_jut:=.75old_jut; + %serif(3,4,e,serif_darkness,-cap_jut); + bracket:=2old_brack; cap_jut:=old_jut; serif(3,4,f,.6serif_darkness,cap_jut); + cap_jut:=old_jut; bracket:=old_brack; + fi +penlabels(0,1,2,3,4,5,6,7); endchar; + +cmchar "The letter L (casual)"; +numeric topbar_; topbar_=3/4; % 17/30; % Duerer's wierd value +beginchar("L", hstretch*(topbar_+1/6)*side#+u#, cap_height#,0); +adjust_fit(cap_serif_fit#,0); +pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0); +lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0; +filldraw stroke z1e--z2e; % stem +pickup crisp.nib; % prepare for arms and serifs +pos3(thin,90); pos4(dslab,0); +rt x4l=topbar_*side; bot y4=vround(h-vstretch*thick); +pos8(thin,-90); pos9(dslab,0); x8=x2; bot y8r=0; rt x9r=hround(w-.5u); +y9=y8r+thin+vstretch*1/6side; foot(8,9,g,eta,x9-x4-thick); % lower arm +if serifs: serif(1,2,a,serif_darkness,-cap_jut); + serif(2,1,b,serif_darkness,-cap_jut); serif(1,2,d,serif_darkness,cap_jut); + if not monospace: temp_:=slab; slab:=thin; serif(2,1,c,serif_darkness,cap_jut); + slab:=temp_; fi fi +penlabels(0,1,2,3,4,5,6,7,8,9); endchar; % end of "L" + +cmchar"The letter M (casual)"; +beginchar("M", u#+2cap_jut#+side#, cap_height#, 0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib; +pos1(thin,0); pos2(thin,0); lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0; +pos3(thick,0); pos4(thick,0); x3r=x4r=w-x1l; top y3=h; bot y4=0; +filldraw stroke z1e--z2e; % left vertical stem +filldraw stroke z3e--z4e; % right vertical stem +numeric long, short, hypot, alpha; long=h-bracket; short=w/2-thin-cap_jut; +hypot=long++short; alpha=hypot/long; +pos5(alpha*thick,0); pos6(alpha*thick,0); +z5l=z1l; bot lft z6l=(w/2-.5currentbreadth,if not monospace:0 else:h/3 fi); +pos7(alpha*thin,0); pos8(alpha*thin,0); +z6l=z7r; z8l=z3l; z0=whatever[z5r,z6r]=whatever[z7l,z8l]; +filldraw z5r--z0--z8l--z8r--z6l--z5l--cycle; +if serifs: + serif(2,1,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,-cap_jut); + % left serifs + serif(3,4,c,serif_darkness, cap_jut); serif(4,3,d,serif_darkness, cap_jut); + % right serifs + serif(2,1,e,serif_darkness,cap_jut); serif(4,3,f,serif_darkness,-cap_jut); + % lower, inner serifs + fi +penlabels(0,1,2,3,4,5,6,7,8); endchar; + +cmchar "The letter N (casual)"; +beginchar("N", u#+2cap_jut#+.8side#, cap_height#,0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib; +numeric long, short, hypot, alpha; long=h; short=side-2cap_jut; +hypot=long++short; alpha=hypot/long; +pos1(thin,0); pos2(thin,0); lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0; +pos3(thin,0); pos4(thin,0); x3=x4; x3r=w-x1l; y3=y1; y4=y2-o; +pos 5(alpha*thick,0); pos6(alpha*thick,0); +z5r=z1r; z6l=z4r; z0=whatever[z1r,z2r]=whatever[z5l,z6l]; % under notch point +z0'=whatever[z5r,z6r]=whatever[z3l,z4l]; +filldraw z1r--z1l--z2l--z2r--z0--z6l--z3r--z3l--z0'--cycle; +if serifs: + serif(2,1,b,serif_darkness,-cap_jut); serif(2,1,c,serif_darkness,cap_jut); + % bottom, left serifs + serif(3,4,d,serif_darkness,-cap_jut);serif(3,4,e,serif_darkness,cap_jut); + % top right serifs + z.a=(x1l-1.5cap_jut,y1); pickup tiny.nib; filldraw + z0{z0-z4r}..{left}(z.a-(0,eps))..z.a--z1r--cycle; + fi +penlabels(0,0',1,2,3,4,5,6); endchar; + +cmchar "The letter O (casual)"; +beginchar("O", 2u#+side#, cap_height#, 0); +adjust_fit(0,0); +x2r=u; x4r=w-u; y1r=h+o; y3r=-o; z0=(w/2,h/2); +z0=.5[z5,z6]; numeric axis_angle; +axis_angle=angle( (x4r,y1r)-(x2r,y3r) ); +axis_angle:=axis_angle*axis; +z5-z6=(thick,0)rotated axis_angle; +y2r=y6; y4r=y5; x1r=x5; x3r=x6; +forsuffixes $=1,2,3,4: z$=.5[z$l,z$r]; endfor +x1l=x3r; y1l-y6=y6-y3r; x5-x2l=x4r-x5; y2l=y4r; +x3l=x1r; y1r-y5=y5-y3l; x4l-x6=x6-x2r; y4l=y2r; +path p,p'; +p=pulled_arc.r(1,2)&reverse pulled_arc.r(3,2)& + pulled_arc.r(3,4)&reverse pulled_arc.r(1,4)&cycle; +path anti_diag; anti_diag=(z0--(1.5w,y4))rotatedaround(z0,axis_angle+90); +z21r=p intersectionpoint anti_diag; penpos21(thin, axis_angle+90); +x43r=w-x21r; y43r=h-y21r; penpos43(thin, axis_angle+270); +path diag; diag=(z0--(1.5w,y4))rotatedaround(z0, axis_angle); +z41r=diag intersectionpoint p; penpos41(thick, axis_angle); +x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180); +if monospace: x2l:=x21l; x4l:=x43l; fi +p'= + z1l{left}..z21l...z2l{down}..z32l..z3l{right}..z43l..z4l{up} + ..z41l..{left}cycle; +fill p; unfill p'; +penlabels(0,1,2,3,4,5,6,21,32,43,41); endchar; + +cmchar "The letter P (casual)"; +beginchar("P", 1.5u#+P_width#, cap_height#, 0); +adjust_fit(cap_serif_fit#, 0); +pickup tiny.nib; pos1(thick,0); pos2(thick,0); +top lft z1l=(.5u+cap_jut,h); bot lft z2l=(.5u+cap_jut,0); +filldraw stroke z1e--z2e; % vertical stem +pos3(thin,90); pos4(thin,90); pos5(thick,0); +pos6(thin,-90); +top y3r=top y4r=h; x3=x1; x4=x1r+thick; filldraw stroke z3e--z4e; +x6=x4; y6=hround h/2; rt x5r=hround(w-u); y5=.5[y4,y6]; +y7=y6; x7=.75[rt x1r, x6]; +pos7(thin, -90); +filldraw stroke pulled_super_arc.e(4,5,eta)&pulled_super_arc.e(5,6,eta)..z7e; +if serifs: serif(1,2,a,eta,-cap_jut); serif(2,1,b,eta,-cap_jut); + serif(2,1,c,eta,cap_jut); fi +penlabels(1,2,3,4,5,6,7); endchar; + +cmchar "The letter Q (casual)"; +beginchar("Q", 2u#+side#, cap_height#, 0); +adjust_fit(0,0); +x2r=u; x4r=w-u; y1r=h+o; y3r=-o; z0=(w/2,h/2); +z0=.5[z5,z6]; numeric axis_angle; +axis_angle=angle( (x4r,y1r)-(x2r,y3r) ); +axis_angle:=axis_angle*axis; +z5-z6=(thick,0)rotated axis_angle; +y2r=y6; y4r=y5; x1r=x5; x3r=x6; +forsuffixes $=1,2,3,4: z$=.5[z$l,z$r]; endfor +x1l=x3r; y1l-y6=y6-y3r; x5-x2l=x4r-x5; y2l=y4r; +x3l=x1r; y1r-y5=y5-y3l; x4l-x6=x6-x2r; y4l=y2r; +path p,p'; +p=pulled_arc.r(1,2)&reverse pulled_arc.r(3,2)& + pulled_arc.r(3,4)&reverse pulled_arc.r(1,4)&cycle; +path anti_diag; anti_diag=(z0--(1.5w,y4))rotatedaround(z0,axis_angle+90); +z21r=p intersectionpoint anti_diag; penpos21(thin, axis_angle+90); +x43r=w-x21r; y43r=h-y21r; penpos43(thin, axis_angle+270); +path diag; diag=(z0--(1.5w,y4))rotatedaround(z0, axis_angle); +z41r=diag intersectionpoint p; penpos41(thick, axis_angle); +x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180); +if monospace: x2l:=x21l; x4l:=x43l; fi +p'= + z1l{left}..z21l...z2l{down}..z32l..z3l{right}..z43l..z4l{up} + ..z41l..{left}cycle; +fill p; unfill p'; +% now for the tail! +numeric thick',thick''; thick'=(1-tail_corr)*thick; thick''=(1+tail_corr)*thick; +numeric tail_slope; tail_slope=-20/36; % measured from D\"urer's figure +z10r=p intersectionpoint (z0--(x4r,0)); +z10l=p intersectionpoint (quartercircle rotated 180 scaled 2thick' + shifted z10r); +y12r-y10r=tail_slope*(x12r-x10r); x12r=4/3x4r; +numeric tail_angle; tail_angle=angle(z10r-z12r)-90; +penpos12(thick',tail_angle); +penpos11(thick'', tail_angle); z11=(x4r,0); +x14=19/8 x4r; y14=-3/8h; penpos14(max(2,eps),90); +numeric tail_length; tail_length=x14-x10r; +penpos13(max(2,tail_corr*thick),90); +x13=x14-1/9tail_length; y13=(1+.25tail_corr)*y14; +fill stroke z10.e..z11.e..z12.e if not monospace:..z13.e{right}..z14.e fi; +penlabels(0,1,2,3,4,5,6,10,11,12,13,14,15); endchar; + +cmchar "The letter R (casual)"; +beginchar("R", .5u#+max(cap_jut#+.9side#,1.5P_width#), cap_height#,0); +adjust_fit(cap_serif_fit#,0); +pickup tiny.nib; pos1(thick,0); pos2(thick,0); +top lft z1l=(.5u+cap_jut,h); bot lft z2l=(.5u+cap_jut,0); +filldraw stroke z1e--z2e; % vertical stem +pos3(thin,90); pos4(thin,90); pos5(thick,0); +pos6(if serifs: dslab else:thin fi,-90); +top y3r=top y4r=h; x3=x1; x4=x1r+thick; +x6=x4; y6=hround h/2; rt x5r=hround(.5u+P_width); y5=.5[y4,y6]; +y7=y6; x7=.75[rt x1r, x6]; +pos7(if serifs:dslab else:thin fi,-90); +filldraw stroke z3e--z4e..pulled_super_arc.e(4,5,eta)& + pulled_super_arc.e(5,6,eta)..z7e; +path p; p=pulled_super_arc.r(5,6,eta)..z7r; +numeric half_letter_width; 2half_letter_width+1/2u=w; +half_letter_width:=half_letter_width+1/2u; +z0r=p intersectionpoint ((half_letter_width,0)--(half_letter_width,h)); +path circ_; circ_= (((halfcircle scaled 2thick) rotated 180) shifted z0r); +z0l= p intersectionpoint circ_; +if not monospace: z0'=(.45[half_letter_width,w],0); + else: z0'=(.4[half_letter_width,w],0); fi +numeric tail_angle; tail_angle=angle(z0l-z0'); +penpos8(thick, tail_angle-90); z8l=whatever[z0', z0l]; + x8=1/5[half_letter_width,w]; +penpos9(2/3thick,tail_angle-90); z9r=whatever[z0r, z8r]; +x9r=.5[half_letter_width, w]; penpos10(1/2thin,90); z10l=(w,0); +fill z0l--z8l...{right}z10l--z10r{-w,1/4h}..z9r--z0r--cycle; % tail +if serifs: serif(1,2,a,eta,-cap_jut); serif(2,1,b,eta,-cap_jut); + serif(2,1,c,eta,cap_jut); fi +penlabels(0,1,2,3,4,5,6,7,8,9,10); labels(0'); endchar; + +cmchar "The Knuthian S (casual)"; +beginchar("S", 2u#+1/2 side# if not monospace:+thick# fi, cap_height#, 0); +adjust_fit(0,0); pickup tiny.nib; +pair durer[]; % points to contain corner coords of Durer square +ypart durer3=ypart durer4=0; xpart durer4-xpart durer1=side; +xpart durer1=u-1.5thick; +durer1=(xpart durer3, h); durer2=(xpart durer 4, ypart durer1); +numeric slope, diag_angle; diag_angle=angle(durer2-durer3); +slope=-3/4h/(xpart durer4-xpart durer3); +pos0(thick,diag_angle); x0=.52[xpart durer1, xpart durer2]; +y0=h/2; +pos2(thin,-90); top y2l=h+o; x2=x0+thin; lft x3l=u+2/3thick; rt x3r=lft x3l+5/6thick; +if not monospace: + if x2-rt x3r0; forsuffixes $$=l, r: x7$$:=x7$$-.1u; endfor + x7:=x7-.1u; endfor +x6r=x7r; x6l=x7l; bot y6r=ypart point t1 of p; bot y6l=ypart point t2 of p'; +z6=.5[z6r,z6l]; +p:= subpath(0,t1) of p..(z6r-xeps+yeps)--(z6l+xeps+yeps).. + subpath(t2,infinity) of p'..(z1l+xeps)--cycle; +filldraw p; +filldraw z6l--z7l--z7r--z6r--cycle; +if serifs: serif(7,6,a,serif_darkness,-cap_jut); + serif(7,6,b,serif_darkness, cap_jut); fi +penlabels(0,1,2,3,4,5,6,7); endchar; + +cmchar "The letter H"; +beginchar("H", u#+2cap_jut#+.8side#, cap_height#,0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib; +forsuffixes t=1,2,3,4: pos.t(thick,0); endfor +lft x1l=lft x2l=.5u+cap_jut; bot y2=0; top y1=h; +filldraw stroke z1e--z2e; % left vertical stem +x3=x4=w-x1; y3=y1; y4=y2; +filldraw stroke z3e--z4e; % right vertical stem +pos5(thin, 90); pos6(thin,90); +x5=.5[x1r,x1l]; x6=w-x5; top y5r=top y6r=h/2; +filldraw stroke z5e--z6e; % horizontal crossbar +if serifs: + serif(1,2,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,cap_jut); + serif(2,1,c,serif_darkness,-cap_jut); serif(2,1,d,serif_darkness,cap_jut); + serif(3,4,e,serif_darkness,-cap_jut); serif(3,4,f,serif_darkness,cap_jut); + serif(4,3,g,serif_darkness,-cap_jut); serif(4,3,h,serif_darkness,cap_jut); fi +labels(1,2,3,4,5,6); endchar; + +cmchar "The letter I"; +beginchar("I", .5u#+2cap_jut#+cap_stem#+.5u#, cap_height#,0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); +pickup tiny.nib; checkthin; pos1(cap_stem,0); pos2(cap_stem,0); +x1=x2=hround(w/2); top y1=h; bot y2=0; +filldraw stroke z1e--z2e; % vertical stem +if serifs: + serif(1, 2, a, serif_darkness, -cap_jut); + serif(1, 2, b, serif_darkness, cap_jut); % top lft,rt + serif(2, 1, c, serif_darkness, -cap_jut); + serif(2, 1, d, serif_darkness, cap_jut); % bot lft,rt +fi +penlabels(1, 2); endchar; + +cmchar "The letter J"; +beginchar("J",u#+3thick#+cap_jut#,cap_height#, 1/4 cap_height#); +adjust_fit(0, cap_serif_fit#); pickup tiny.nib; +pos1(thick,0); pos2(thick,0); pos3(thin, -90); +top y1=h; rt x1r=w-.5u-cap_jut; x2=x1; bot y2=0; lft x3=.5u; bot y3r=-d; +filldraw stroke z1e--z2e{down}..{left}z3e; +if serifs: serif(1,2,a,serif_darkness,-cap_jut); + serif(1,2,b,serif_darkness,cap_jut); fi +penlabels(1,2,3); endchar; + +cmchar "The letter K"; +beginchar("K", 3/2u#+cap_jut#+.9side#, cap_height#,0); +adjust_fit(cap_serif_fit#,0); pickup tiny.nib; +pair durer[]; % represent D\"urer's corner points +durer1=(.5u,h); durer2=(w-u,h); durer3=(xpart durer1,0); + durer4=(xpart durer2,0); +numeric diag_angle[]; diag_angle1=angle(durer2-durer3); +diag_angle2=angle(durer1-durer4); +numeric alpha; alpha=((xpart durer2 - xpart durer1)++h)/h; +pos1(thick,0); pos2(thick,0); lft x1l=lft x2l=.5u+cap_jut; + top y1=h; bot y2=0; filldraw stroke z1e--z2e; % left stem +pos3(alpha*thin,0); pos4(alpha*thin,0); rt x4r=rt x1r; y4=h/2; +top y3=h; z3r-z4r=whatever*(durer2-durer3); +z0=whatever[z1r,z2r]=whatever[z3l,z4l]; +filldraw z0--z3l--z3r--z4r--cycle; % upper diagonal stroke +pos5(thick,diag_angle1); z5=whatever[z3,z4]; +z0-z5l=whatever*(durer1-durer4); +numeric nibs; nibs=.5thin; +if monospace or not serifs: nibs:=thin; fi +pos6(nibs,90); bot rt z6l=durer4; +z5l-z7l=whatever*(durer1-durer4); z.g=(xpart durer2-thin,h/2); +z.g-z7l=whatever*(durer2-durer3); +z.h=(xpart durer2, h/4); +if monospace or not serifs: z.g else: z.h fi-z7r=whatever*(durer2-durer3); +z5r-z7r=whatever*(durer1-durer4); +if serifs or not monospace: % reset x7 if necessary + if (x7r-x1l)/(x6-x1l)>.82: numeric temp; temp=x7r; x7r:=.82*(x6-x1l)+x1l; + temp:=temp-x7r; x7l:=x7l-temp; fi fi %!!!Bug--Missing fi on this line. +filldraw z5r--z5l--z7l{z7l-z5l}..{right}z6l--z6r{left}..{durer1-durer4}z7r + --cycle; +if serifs: + numeric old_jut, old_brack; old_jut=cap_jut; old_brack=bracket; + serif(1,2,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,cap_jut); + serif(2,1,c,serif_darkness,-cap_jut); serif(2,1,d,serif_darkness,cap_jut); + bracket:=.5old_brack;cap_jut:=.5old_jut; + if not monospace: serif(3,4,e,serif_darkness,-cap_jut); fi + bracket:=2old_brack; cap_jut:=2old_jut; + serif(3,4,f,.6serif_darkness,if monospace:.7 fi cap_jut); + cap_jut:=old_jut; bracket:=old_brack; + fi +penlabels(0,1,2,3,4,5,6,7); endchar; + +cmchar "The letter L"; +numeric topbar_; if monospace: topbar_=11/15; + else: topbar_=17/30; fi % Duerer's wierd value +beginchar("L", hstretch*(topbar_+1/6)*side#+u#, cap_height#,0); +adjust_fit(cap_serif_fit#,0); +pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0); +lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0; +filldraw stroke z1e--z2e; % stem +pickup crisp.nib; % prepare for arms and serifs +pos3(thin,90); pos4(dslab,0); +rt x4l=topbar_*side; bot y4=vround(h-vstretch*thick); +pos8(thin,-90); pos9(dslab,0); x8=x2; bot y8r=0; rt x9r=hround(w-.5u); +y9=y8r+thin+vstretch*1/6side; foot(8,9,g,serif_darkness,x9-x4-thick); + % lower arm +if serifs: serif(1,2,a,serif_darkness,-cap_jut); + serif(2,1,b,serif_darkness,-cap_jut); serif(1,2,d,serif_darkness,cap_jut); + if not monospace: temp_:=slab; slab:=thin; + serif(2,1,c,serif_darkness,cap_jut); + slab:=temp_; fi fi +penlabels(0,1,2,3,4,5,6,7,8,9); endchar; % end of "L" + +cmchar"The letter M"; +beginchar("M", u#+2cap_jut#+.8side#, cap_height#, 0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib; +pos1(thin,0); pos2(thin,0); lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0; +pos3(thick,0); pos4(thick,0); x3r=x4r=w-x1l; top y3=h; bot y4=0; +filldraw stroke z1e--z2e; % left vertical stem +filldraw stroke z3e--z4e; % right vertical stem +numeric long, short, hypot, alpha; long=h-bracket; short=w/2-thin-cap_jut; +hypot=long++short; alpha=hypot/long; +pos5(alpha*thick,0); pos6(alpha*thick,0); +z5l=z1l; bot lft z6l=(w/2-.5currentbreadth,if not monospace:0 else:h/3 fi); +pos7(alpha*thin,0); pos8(alpha*thin,0); +z6l=z7r; z8l=z3l; z0=whatever[z5r,z6r]=whatever[z7l,z8l]; +filldraw z5r--z0--z8l--z8r--z6l--z5l--cycle; +if serifs: + serif(2,1,a,serif_darkness,-cap_jut); serif(1,2,b,serif_darkness,-cap_jut); + % left serifs + serif(3,4,c,serif_darkness, cap_jut); serif(4,3,d,serif_darkness, cap_jut); + % right serifs + serif(2,1,e,serif_darkness,cap_jut); serif(4,3,f,serif_darkness,-cap_jut); + % lower, inner serifs + fi +penlabels(0,1,2,3,4,5,6,7,8); endchar; + +cmchar "The letter N"; +beginchar("N", u#+2cap_jut#+.8side#, cap_height#,0); +adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib; +numeric long, short, hypot, alpha; long=h; short=side-2cap_jut; +hypot=long++short; alpha=hypot/long; +pos1(thin,0); pos2(thin,0); lft x1l=lft x2l=.5u+cap_jut; top y1=h; bot y2=0; +pos3(thin,0); pos4(thin,0); x3=x4; x3r=w-x1l; y3=y1; y4=y2-o; +pos 5(alpha*thick,0); pos6(alpha*thick,0); +z5r=z1r; z6l=z4r; z0=whatever[z1r,z2r]=whatever[z5l,z6l]; % under notch point +z0'=whatever[z5r,z6r]=whatever[z3l,z4l]; +filldraw z1r--z1l--z2l--z2r--z0--z6l--z3r--z3l--z0'--cycle; +if serifs: + serif(2,1,b,serif_darkness,-cap_jut); serif(2,1,c,serif_darkness,cap_jut); + % bottom, left serifs + serif(3,4,d,serif_darkness,-cap_jut);serif(3,4,e,serif_darkness,cap_jut); + % top right serifs + z.a=(x1l-1.5cap_jut,y1); pickup tiny.nib; filldraw + z0{z0-z4r}..{left}(z.a-(0,eps))..z.a--z1r--cycle; + fi +penlabels(0,0',1,2,3,4,5,6); endchar; + +cmchar "The letter O"; +beginchar("O", 2u#+side#, cap_height#, 0); +adjust_fit(0,0); pair durer[]; +x2r=u; x4r=w-u; y1r=h+o; y3r=-o; z0=(w/2,h/2); +z0=.5[z5,z6]; numeric axis_angle; +durer1=(x2r,y1r-o); durer2=(x4r, ypart durer1); +durer3=(xpart durer1, y3r+o); durer4=(xpart durer2, ypart durer3); +axis_angle=angle(durer2-durer3); +z5-z6=(thick,0)rotated axis_angle; +y2r=y6; y4r=y5; x1r=x5; x3r=x6; +forsuffixes $=1,2,3,4: z$=.5[z$l,z$r]; endfor +x1l=x3r; y1l-y6=y6-y3r; x5-x2l=x4r-x5; y2l=y4r; +x3l=x1r; y1r-y5=y5-y3l; x4l-x6=x6-x2r; y4l=y2r; +path p,p'; +p=pulled_arc.r(1,2)&reverse pulled_arc.r(3,2)& + pulled_arc.r(3,4)&reverse pulled_arc.r(1,4)&cycle; +path anti_diag; anti_diag=z0--durer1; +z21r=p intersectionpoint anti_diag; penpos21(thin, axis_angle+90); +x43r=w-x21r; y43r=h-y21r; penpos43(thin, axis_angle+270); +path diag; diag=z0--durer2; +z41r=diag intersectionpoint p; penpos41(thick, axis_angle); +x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180); +if not monospace: p'= + z1l{left}..z21l..z2l{down}..z32l.. + z3l{right}..z43l.. + z4l{up}..z41l..{left}cycle; + else:p'=z1l..z21l..z32l..z3l..z43l..z41l..cycle; fi +fill p; unfill p'; +penlabels(0,1,2,3,4,5,6,21,32,43,41); endchar; + +cmchar "The letter P"; +beginchar("P", 1.5u#+P_width#, cap_height#, 0); +adjust_fit(cap_serif_fit#, 0); +pickup tiny.nib; pos1(thick,0); pos2(thick,0); +top lft z1l=(.5u+cap_jut,h); bot lft z2l=(.5u+cap_jut,0); +filldraw stroke z1e--z2e; % vertical stem +pos3(thin,90); pos4(thin,90); pos5(thick,0); +pos6(if not monospace and serifs: .5thin else:thin fi,-90); +top y3r=top y4r=h; x3=x1; x4=x1r+thick; filldraw stroke z3e--z4e; +x6=x4; y6=hround h/2; rt x5r=hround(w-u); y5=.5[y4,y6]; +y7=y6; if serifs: x7=.75[rt x1r, x6]; else: x7=x3; fi +pos7(if not monospace and serifs:.5thin else:thin fi,-90); +filldraw stroke pulled_super_arc.e(4,5,eta)&pulled_super_arc.e(5,6,eta) + ..z7e; % lobe +if serifs: serif(1,2,a,serif_darkness,-cap_jut); + serif(2,1,b,serif_darkness,-cap_jut); + serif(2,1,c,serif_darkness,cap_jut); fi +penlabels(1,2,3,4,5,6,7); endchar; + +cmchar "The letter Q"; +beginchar("Q", 2u#+side#, cap_height#, 0); +adjust_fit(0,0); pair durer[]; +x2r=u; x4r=w-u; y1r=h+o; y3r=-o; z0=(w/2,h/2); +z0=.5[z5,z6]; numeric axis_angle; +durer1=(x2r,y1r-o); durer2=(x4r, ypart durer1); +durer3=(xpart durer1, y3r+o); durer4=(xpart durer2, ypart durer3); +axis_angle=angle(durer2-durer3); +z5-z6=(thick,0)rotated axis_angle; +y2r=y6; y4r=y5; x1r=x5; x3r=x6; +forsuffixes $=1,2,3,4: z$=.5[z$l,z$r]; endfor +x1l=x3r; y1l-y6=y6-y3r; x5-x2l=x4r-x5; y2l=y4r; +x3l=x1r; y1r-y5=y5-y3l; x4l-x6=x6-x2r; y4l=y2r; +path p,p'; +p=pulled_arc.r(1,2)&reverse pulled_arc.r(3,2)& + pulled_arc.r(3,4)&reverse pulled_arc.r(1,4)&cycle; +path anti_diag; anti_diag=z0--durer1; +z21r=p intersectionpoint anti_diag; penpos21(thin, axis_angle+90); +x43r=w-x21r; y43r=h-y21r; penpos43(thin, axis_angle+270); +path diag; diag=z0--durer2; +z41r=diag intersectionpoint p; penpos41(thick, axis_angle); +x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180); +if not monospace: p'= + z1l{left}..z21l..z2l{down}..z32l.. + z3l{right}..z43l.. + z4l{up}..z41l..{left}cycle; + else:p'=z1l..z21l..z32l..z3l..z43l..z41l..cycle; fi +fill p; unfill p'; +% now for the tail! +numeric thick',thick''; thick'=(1-tail_corr)*thick; thick''=(1+tail_corr)*thick; +numeric tail_slope; tail_slope=-20/36; % measured from D\"urer's figure +z10r=p intersectionpoint (z0--(x4r,0)); +z10l=p intersectionpoint (quartercircle rotated 180 scaled 2thick' + shifted z10r); +y12r-y10r=tail_slope*(x12r-x10r); x12r=4/3x4r; +numeric tail_angle; tail_angle=angle(z10r-z12r)-90; +penpos12(thick',tail_angle); +penpos11(thick'', tail_angle); z11=(x4r,0); +if not monospace: + x14=19/8 x4r; y14=-3/8h; penpos14(max(2,eps),90); + numeric tail_length; tail_length=x14-x10r; + penpos13(max(2,tail_corr*thick),90); + x13=x14-1/9tail_length; y13=(1+.25tail_corr)*y14; + fi +fill stroke z10.e..z11.e..z12.e if not monospace:..z13.e{right}..z14.e fi; +penlabels(0,1,2,3,4,5,6,10,11,12,13,14,15); endchar; + +cmchar "The letter R"; +beginchar("R", .5u#+max(cap_jut#+.9side#,1.5P_width#), cap_height#,0); +adjust_fit(cap_serif_fit#,0); +pickup tiny.nib; pos1(thick,0); pos2(thick,0); +top lft z1l=(.5u+cap_jut,h); bot lft z2l=(.5u+cap_jut,0); +filldraw stroke z1e--z2e; % vertical stem +pos3(thin,90); pos4(thin,90); pos5(thick,0); +pos6(thin, -90); +top y3r=top y4r=h; x3=x1; x4=x1r+thick; +x6=x4; y6=hround h/2; rt x5r=hround(.5u+P_width if not monospace: + +1/2thin fi); y5=.5[y4,y6]; +y7=y6; x7=x3; pos7(thin, -90); +filldraw stroke z3e--pulled_super_arc.e(4,5,eta)& + pulled_super_arc.e(5,6,eta)..z7e; % lobe +numeric half_letter_width; 2half_letter_width+1/2u=w; +if serifs: half_letter_width:=half_letter_width+1/2u; + else: half_letter_width:=half_letter_width-1.6thin; fi +path p; p=pulled_super_arc.r(5,6,eta)..z7r; +z0r=p intersectionpoint ((half_letter_width,0)--(half_letter_width,h)); +path circ_; circ_= (((halfcircle scaled 2thick) rotated 180) shifted z0r); +z0l= p intersectionpoint circ_; +if not monospace: z0'=(.45[half_letter_width,w],0); + else: z0'=(.42[half_letter_width,w],0); fi +numeric tail_angle; tail_angle=angle(z0l-z0'); +penpos8(thick, tail_angle-90); z8l=whatever[z0', z0l]; + x8=1/5[half_letter_width,w]; +penpos9(2/3thick,tail_angle-90); z9r=whatever[z0r, z8r]; + x9r=.5[half_letter_width, w]; +%penpos10(if monospace:1/2 fi dslab,90); z10l=(w,0); +penpos10(if monospace:1/2 dslab else: .5thin fi,90); z10l=(w,0); +fill z0l--z8l...{right}z10l--z10r{-w,1/4h}..z9r--z0r--cycle; % tail +if serifs: serif(1,2,a,serif_darkness,-cap_jut); + serif(2,1,b,serif_darkness,-cap_jut); + serif(2,1,c,serif_darkness,cap_jut); fi +penlabels(0,1,2,3,4,5,6,7,8,9,10); labels(0'); endchar; + +cmchar "The Knuthian S"; +beginchar("S", 2u#+1/2 side# if not monospace:+thick# fi, cap_height#, 0); +adjust_fit(0,0); pickup tiny.nib; +pair durer[]; % points to contain corner coords of Durer square +ypart durer3=ypart durer4=0; xpart durer4-xpart durer1=side; +xpart durer1=u-1.5thick; +durer1=(xpart durer3, h); durer2=(xpart durer 4, ypart durer1); +numeric slope, diag_angle; diag_angle=angle(durer2-durer3); +slope=-if not monospace: 3/4 else: 1/2 fi h/(xpart durer4-xpart durer3); +pos0(thick,diag_angle); x0=.52[xpart durer1, xpart durer2]; +y0=h/2; +lft x3l=u if not monospace:+2/3thick fi; rt x3r=lft x3l+5/6thick; +pos2(thin,-diag_angle); top y2l=h+o; +if x0-x3r>thick: x2l=x0 if monospace:+.4thin fi; else: + x2l=x0r; slope:=-1/2; fi +%if not monospace: +% if x2-rt x3r=x$: x@2=x@1 - vjut_; else: x@2=x@1+vjut_; fi y@2=y$l; + filldraw z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l]]{z@2-z$$l}... + z@2if x$$>=x$: {left} else: {right} fi + ---z$l--z$r--z@0--z$$r..cycle; % arm and beak + else: filldraw z$l--z$r--z@0--z$$r--cycle; fi % sans-serif arm + penlabels(@0,@1,@2); enddef; + +vardef foot(suffix $, $$, @)(expr darkness, armjut) = % curved beak on E and L +numeric vjut_; vjut_= abs(bot y$-bot y$$); +x@0=good.x(x$$r-armjut); y@0=y$r; +if x@0>w-.5u: x@0:=w-.5u; fi + if serifs: y@1=y$l; z@1=z$$l+whatever*(z$$r-z@0); + x@2=x@1-vjut_; y@2=y$l; + filldraw z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l] ]...z@2 + ---z$l--z$r--z@0..tension1.2..{up}z$$r..cycle; % arm and beak + else: filldraw z$l--z$r--(x$$r,y$r)--(x$$r,y$l)--cycle; fi + penlabels(@0,@1,@2); enddef; + +vardef flourish(suffix from, at, to, @) % flourish for top of `A' + (expr darkness)= + pickup pencircle scaled 0pt; % use this after all serifs have been drawn + pair downward; pair upward; + upward=z.at.l-z.from.l; downward=z.to.r-z.at.r; + top y@1=top y.at; x@1=.5[x.from,x.at]; + % leftmost point of flourish + numeric alpha[]; alpha1=angle(upward); + y@2=vround(top y.at-bracket/sind alpha1 ); lft z@2=whatever[z.at.l,z.from.l]; + % |z@2| lies on the `from' limb and marks the beginning of the flourish + x@1'=x@1; y@1'=y@1-.8min(tiny,thin); % point to give end of flourish some thickness + top y@3=y.at; z@3=whatever[z@2,z.at.l]; % |z@3| is like Knuth's `corner' point + filldraw z@2{upward}...darkness[.5[z@1',z@2],z@3]{z@1'-z@2} + ...z@1'{left}..{right}z@1--lft z.at.r--z@2..cycle; + labels(@1,@2,@3); enddef; + +vardef pulled_super_arc.l(suffix $, $$)(expr darkness)= + pair corner; + if y$=y$r: corner=(x$l, y$$l); + else: corner=(x$$l,y$l); fi + z$l{corner-z$l}...(darkness)[corner, .5[z$l, z$$l]]{z$$l-z$l} + ...{z$$l-corner}z$$l enddef; + +vardef pulled_super_arc.r(suffix $, $$)(expr darkness)= + pair corner; + if y$=y$r: corner=(x$r,y$$r); + else: corner=(x$$r, y$r); fi + z$r{corner-z$r}...(darkness)[corner, .5[z$r, z$$r]]{z$$r-z$r} + ...z$$r{z$$r-corner} enddef; + +vardef pulled_arc@#(suffix $, $$)= + pulled_super_arc@#($,$$)(eta) enddef; + +let cm_font_setup=font_setup; % Knuth's original font_setup + +def slim_font_setup = % trimmed font_setup for use with Durer caps only + if monospace: let adjust_fit=mono_adjust_fit; + def mfudged=fudged enddef; + mono_charic#:=body_height#*slant; + if mono_charic#<0: mono_charic#:=0; fi + mono_charwd#:=9u#; define_whole_pixels(mono_charwd); + else: let adjust_fit=normal_adjust_fit; + def mfudged= enddef; fi + define_pixels(u,width_adj,serif_fit,cap_serif_fit,jut,cap_jut,bar_height, + dish,bracket,beak_jut,apex_o,apex_corr); + define_whole_pixels(letter_fit,fine,crisp,tiny); + define_whole_vertical_pixels(body_height,asc_height, + cap_height,x_height,comma_depth,desc_depth); + define_whole_blacker_pixels(hair,stem,cap_stem); + define_whole_vertical_blacker_pixels(vair,dslab,slab); +if slab.9fudge*$; fudged$:=fudged$+1; endfor endfor + rule_thickness:=ceiling(rule_thickness#*hppp); + heavy_rule_thickness:=ceiling(3rule_thickness#*hppp); + oo:=vround(.5o#*hppp*o_correction)+eps; + apex_oo:=vround(.5apex_o#*hppp*o_correction)+eps; + lowres_fix(stem) 1.3; + ess:=(ess#/stem#)*stem; cap_ess:=(cap_ess#/cap_stem#)*cap_stem; + dw:=(curve#-stem#)*hppp; bold:=curve#*hppp+blacker; + dh#:=.6designsize; + more_super:=max(superness,sqrt .77superness); + hein_super:=max(superness,sqrt .81225258superness); % that's $2^{-.3}$ + clear_pen_memory; + if fine=0: fine:=1; fi + forsuffixes $=fine,crisp,tiny: +%%% fine $ %%%% temporary formatting convention for MFT + if $>fudged.hair: $:=fudged.hair; fi + $.breadth:=$; + pickup if $=0: nullpen else: pencircle scaled $; $:=$-eps fi; + $.nib:=savepen; breadth_[$.nib]:=$; + forsuffixes $$=lft,rt,top,bot: shiftdef($.$$,$$ 0); endfor endfor +%%% @ $ %%%% restore ordinary formatting for $ + min_Vround:=max(fine.breadth,crisp.breadth,tiny.breadth); + if min_Vround=0: z.aux0 =whatever[z.at.r,z.aux1]=whatever[z.aux2,z.aux3]; + filldraw z.aux1{z.at.r-z.aux1}.. + top_dark[z.aux0 ,.5[z.aux1,z.aux2]].. + if not monospace:{z.at'r-z.at}z.aux2-- + else: {z.at'r-z.at}(z.at'r+xeps_).. fi + z.at'r--2/3[z.at.r,z.at.l]--2/3[z.aux1,z.aux4]--cycle; fi +if bot_dark>=0: z.aux0'=whatever[z.at.l,z.aux4]=whatever[z.aux2,z.aux3]; + filldraw z.aux4{z.at.l-z.aux4}.. + bot_dark[z.aux0',.5[z.aux4,z.aux3]].. + if not monospace:{z.at'l-z.at}z.aux3-- + else: {z.at'l-z.at}(z.at'l+xeps_).. fi + z.at'l--2/3[z.at.l,z.at.r]--2/3[z.aux4,z.aux1]--cycle; fi +penlabels(aux1, aux2,aux3,aux4); +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% END OF MACROS %%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +font_coding_scheme:="ASCII caps and digits"; + +mode_setup; + +durer_font_setup; +if whole_font: font_setup; %slab:=eps; + define_whole_vertical_blacker_pixels(dslab,slab); + else: slim_font_setup; fi + +if informal: input dromani; % Durer upper case---informal style + else: input dromanu; fi % Durer upper case (majuscules) + +if whole_font: + input dromanl; + input dromand; + fi + +font_slant slant; font_x_height x_height#; +if monospace: font_normal_space 9u#; % no stretching or shrinking + font_quad 18u#; + font_extra_space 9u#; +else: font_normal_space 6u#+2letter_fit#; + font_normal_stretch 3u#; font_normal_shrink 2u#; + font_quad 18u#+4letter_fit#; + font_extra_space 2u#; + k#:=-.5u#; kk#:=-1.5u#; kkk#:=-2u#; % three degrees of kerning + ligtable "P": "T": "Y": "A" kern kk#; + ligtable "F": "V": "W": "A" kern if serifs: kkk# else: kk#fi, + "K": "X": "O" kern k#, "C" kern k#, "G" kern k#, "Q" kern k#; + ligtable "O": "D": "X" kern k#, "W" kern k#, "A" kern k#, + "V" kern k#, "Y" kern k#; + ligtable "A": if serifs: "R": fi + "C" kern k#, "O" kern k#, "G" kern k#, "U" kern k#, "Q" kern k#, + "L": "T" kern kk#, "Y" kern kkk#, "V" kern kk#, "W" kern kkk#; +ligtable "I": "I" kern -k#; fi % Richard III + +bye. + + ligtable "k": if serifs: "v": "a" kern -u#, fi "w": "e" kern k#, + "a" kern k#, "o" kern k#, "c" kern k#; + ligtable "P": + "y": "o" kern k#, "e" kern k#, "a" kern k#, "." kern kk#, "," kern kk#; + ligtable "F": "V": "W": if serifs: "o" kern kk#, "e" kern kk#, "u" kern kk#, + "r" kern kk#, "a" kern kk#, "A" kern kkk#, + else: "o" kern k#, "e" kern k#, "u" kern k#, + "r" kern k#, "a" kern k#, "A" kern kk#; fi + ligtable "T": "y" kern if serifs: k# else: kk# fi, + "Y": "e" kern kk#, "o" kern kk#, + "r" kern kk#, "a" kern kk#, "A" kern kk#, "u" kern kk#; + if serifs: ligtable "h": "m": "n": + "t" kern k#, "u" kern k#, "b" kern k#, "y" kern k#, "v" kern k#, "w" kern k#; + ligtable "c": "h" kern k#, "k" kern k#; fi + ligtable "o": "b": "p": "e" kern -k#, "o" kern -k#, "x" kern k#, + "d" kern -k#, "c" kern -k#, "q" kern -k#, + "a": if serifs: "v" kern k#, "j" kern u#, else: "r" kern k#, fi + "t": "y" kern k#, + "u": "w" kern k#; + ligtable "g": "j" kern -k#; % logjam + +bye. + + -- cgit v1.2.3