summaryrefslogtreecommitdiff
path: root/fonts/duerer
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/duerer
Initial commit
Diffstat (limited to 'fonts/duerer')
-rw-r--r--fonts/duerer/README28
-rw-r--r--fonts/duerer/cdb10.mf73
-rw-r--r--fonts/duerer/cdi10.mf73
-rw-r--r--fonts/duerer/cdr10.mf74
-rw-r--r--fonts/duerer/cdsl10.mf74
-rw-r--r--fonts/duerer/cdss10.mf73
-rw-r--r--fonts/duerer/cdtt10.mf73
-rw-r--r--fonts/duerer/dromani.mf647
-rw-r--r--fonts/duerer/dromanu.mf732
-rw-r--r--fonts/duerer/dtitle.mf238
10 files changed, 2085 insertions, 0 deletions
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
+<http://tug.org/TUGboat/tb11-3/tb29hoenig.pdf> 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 <http://tug.org/TUGboat/tb11-3/tb29hoenig.pdf> 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 x3r<thick: x2:=lft x3r+thick; x2l:=x2r:=x2; fi fi
+ellipse_set(2l,3l,4l,0l); ellipse_set(2r,3r,4r,0r);
+pos7(thin,-90); x7=x0; y7=-o; rt x6r=w-u; lft x6l=rt x6r-thick;
+ellipse_set(7l,6l,5l,0l); ellipse_set(7r,6r,5r,0r);
+pos1(5/6 thick,-90); top y1l=h+o-thin; rt x1=x0+2thick+o;
+pos8(1.5thick,-80);lft x8r=u; bot y8r=thin-o;
+filldraw z1l..z2l{left}..{down}z3l..z4l--z5l..{down}z6l..{left}z7l..z8l
+ --z8r..{right}z7r..{up}z6r..z5r--z4r..{up}z3r..{right}z2r..z1r--cycle;
+penlabels(0,1,2,3,4,5,6,7,8); endchar;
+
+cmchar "The letter T (casual)";
+beginchar("T",2u#+.9side#, cap_height#,0);
+adjust_fit(0,0); pickup tiny.nib;
+pos1(thick,0); pos2(thick,0); .5[x1r,x1l]=w/2; .5[x2r,x2l]=w/2;
+top y1=h; bot y2=0; filldraw stroke z1e--z2e; % central stem
+numeric alpha, stroke_angle; stroke_angle=55;
+if monospace: alpha=1; else: alpha=sqrt2; fi
+if not serifs: stroke_angle:=90; alpha:=1; fi % sans-serif values
+pos3(alpha*thin,stroke_angle); pos4(alpha*thin,stroke_angle);
+lft x3l=u; top y3r=h; x4r=w-x3l; y4=y3;
+filldraw stroke z3e--z4e; % top horizontal
+numeric old_jut; old_jut=cap_jut;
+if serifs:
+ serif(2,1,a,serif_darkness,-cap_jut);serif(2,1,b,serif_darkness,cap_jut);
+ cap_jut:=.6old_jut;
+ T_flourish(3,4,c,serif_darkness,-.5serif_darkness); cap_jut:=old_jut;
+ fi
+penlabels(1,2,3,4); endchar;
+
+cmchar "The letter U (casual)";
+beginchar("U", u#+2cap_jut#+.9side#, cap_height#,0);
+adjust_fit(cap_serif_fit#, cap_serif_fit#);
+pickup tiny.nib; pos1(thick,0); pos2(thick,0); pos2'(thick,180);
+pos3(0[thin,thick],-90); pos4(thin,0); pos5(thin,0);
+x1=x2; x3=.5[x1,x5]; x4=x5; x1l=w-x5r;
+top y1=top y5=h; y2=y4=1/3h; bot y3r=-o; z2'=z2;
+lft x1l=hround .5u+cap_jut;
+filldraw stroke z1e--z2e; % left stem
+filldraw stroke pulled_super_arc.e(2',3,eta)
+ & pulled_super_arc.e(3,4,eta)&z4e--z5e;
+if serifs: serif(1,2,a,eta,-cap_jut); serif(1,2,b,eta,cap_jut);
+ serif(5,4,c,eta,-cap_jut); serif(5,4,d,eta,cap_jut);
+ fi
+penlabels(1,2,3,4,5); endchar;
+
+cmchar "The letter V (casual)";
+beginchar("V", 20/7 cap_jut#+.9side#, cap_height#, 0);
+adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
+numeric alpha; alpha=((h+cap_jut)++(w/2))/(h+cap_jut);
+pos1(alpha*thick,0); pos2(alpha*thick,0);
+pos3(alpha*thin,0); pos4(alpha*thin,0);
+top y1=top y4=h; lft x1l=10/7 cap_jut; x4r=w-x1l;
+lft x2l=hround w/2; x3r=x2l; bot y2=bot y3=-apex_o;
+z0=whatever[z1r,z2r]=whatever[z3l,z4l]; % notch point
+filldraw z0--diag_end(0,4l,1,4,4r,3r)--z2l
+ --diag_end(2l,1l,1,1,1r,0)--cycle;
+if serifs: bracket:=10/7 bracket; cap_jut:=10/7 cap_jut;
+ pickup tiny.nib; numeric jut_factor; jut_factor=9/8;
+ serif(1,2,a,.8serif_darkness,-.8cap_jut);
+ serif(1,2,b,.8serif_darkness,.6cap_jut);
+ bracket:=jut_factor*bracket;
+ serif(4,3,d,2/3serif_darkness,.8jut_factor*cap_jut);
+ serif(4,3,c,2/3serif_darkness,-2/3jut_factor*cap_jut);
+ fi
+penlabels(0,1,2,3,4); endchar; % End of "V" (casual)
+
+cmchar "The letter W (casual)";
+numeric alpha;
+ alpha=((cap_height#+cap_jut#)++(.4side#+10/7cap_jut#))/(cap_height#+cap_jut#);
+beginchar("W", 20/7 cap_jut#+1.6side#-alpha*thick#, cap_height#, 0);
+adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
+mid_corr=if monospace: -apex_corr else: 1/3jut fi;
+pos1(alpha*thick,0); pos2(alpha*thick,0);
+pos3(alpha*thin,0); pos4(alpha*thin,0);
+pos5(alpha*thick,0); pos6(alpha*thick,0);
+pos7(alpha*thin,0); pos8(alpha*thin,0);
+numeric V_width; V_width=20/7 cap_jut+4/5side;
+top y1=top y4=h; lft x1l=10/7 cap_jut; x4r=V_width-x1l;
+lft x2l=hround V_width/2; x3r=x2l; bot y2=bot y3=-apex_o;
+pair shift_amt; ypart shift_amt=0;
+xpart shift_amt=V_width-20/7cap_jut-alpha*(thick);
+z0=whatever[z1r,z2r]=whatever[z3l,z4l]; % notch point
+path p; p=z0--diag_end(0,4l,1,1,4r,3r)--z2l
+ --diag_end(2l,1l,1,1,1r,0)--cycle;
+filldraw p; filldraw (p shifted shift_amt); % the 2 V's
+forsuffixes t=1,2,3,4: z[t+4]=z.t shifted shift_amt; endfor
+if serifs: bracket:=10/7 bracket; cap_jut:=10/7 cap_jut;
+ pickup tiny.nib; numeric jut_factor; jut_factor=9/8;
+ serif(1,2,a,.8serif_darkness,-.7cap_jut);
+ serif(8,7,f,.8serif_darkness,.7cap_jut);
+ %serif(5,6,d,.8serif_darkness,.6cap_jut);
+ %serif(5,6,c,.8serif_darkness,-.6cap_jut);
+ bracket:=jut_factor*bracket;
+ serif(1,2,b,.6serif_darkness, .6cap_jut);
+ serif(8,7,e,.7serif_darkness,-.6cap_jut);
+ fi
+penlabels(0,0',1,2,3,4,5,6,7,8,45); endchar; % End of "W" (casual)
+
+cmchar "The letter X";
+beginchar("X", 20/7cap_jut#+.9side#, cap_height#, 0);
+adjust_fit(0cap_serif_fit#,0cap_serif_fit#); pickup tiny.nib
+numeric alpha; alpha=(h++(w-20/7cap_jut))/h;
+lft x1l=.8cap_jut; top y1=h; pos1(alpha*thick, 0);
+x4r=w-x1l; bot y4=0; pos4(alpha*thick,0);
+x2r=w-x1l; y2=y1; pos2(alpha*thin,0);
+x3l=w-x2r; y3=y4; pos3(alpha*thin,0);
+filldraw diag_end(4r,1r,.5,1,1l,4l)--diag_end(1l,4l,.5,1,4r,1r)--cycle; %lft diag
+filldraw diag_end(2l,3l,.5,1,3r,2r)--diag_end(3r,2r,.5,1,2l,3l)--cycle; % rt diag
+if serifs: bracket:=10/7 bracket; cap_jut:=.7cap_jut;
+ pickup tiny.nib;
+ serif(1,4,a,.6serif_darkness,-.8cap_jut);serif(4,1,d,.6serif_darkness,.8cap_jut);
+ serif(2,3,f,.7serif_darkness,.8cap_jut);serif(3,2,g,.7serif_darkness,-.8cap_jut);
+ serif(1,4,b,.5 serif_darkness,.6cap_jut);
+ serif(4,1,c,.5 serif_darkness,-.6cap_jut);
+ serif(2,3,e,.5 serif_darkness,-.6cap_jut);
+ serif(3,2,h,.5 serif_darkness,.6cap_jut); fi
+penlabels(1,2,3,4); endchar;
+
+cmchar "The letter Y (casual)";
+beginchar("Y", 2cap_jut#+1.0side#, cap_height#, 0);
+adjust_fit(0cap_serif_fit#, 0cap_serif_fit#); pickup pencircle scaled 0pt;
+pickup tiny.nib;
+numeric alpha, long, short, hypot; long=h/2;
+short=.5(w-thick)-cap_jut;
+ hypot=long++short; alpha=hypot/long;
+pos1(thick,0); lft x1l=cap_jut+.5crisp; top y1=h;
+pos4(thin,0); x4r=w-x1l; y4=y1;
+pos2(thick,0); pos3(thin,0);
+pos5(thick,0); pos6(thick,0);
+x5=x6=w/2; bot y6=0; y5=h/2;
+x2l=x5l; x3r=x5r; y2=y3=h/2;
+z0=whatever[z1r, z2r]=whatever[z3l,z4l]; % notch point
+filldraw z1l--z5l--z6l--z6r--z5r--z4r--z4l--z0--z1r--cycle;
+if serifs: numeric jut_factor;
+ serif(6,5,e,.4serif_darkness,-.6cap_jut); serif(6,5,f,.4serif_darkness,.6cap_jut);
+ % bottom serifs
+ serif(1,2,a,.4serif_darkness,-.6cap_jut);serif(4,3,d,.4serif_darkness,.6cap_jut);
+ % top, outer serifs
+ serif(1,2,b,.4serif_darkness,.4cap_jut);
+ serif(4,3,c,.4serif_darkness,-.4cap_jut); % top, inner serifs
+ fi
+penlabels(0,1,2,3,4,5,6); endchar; % End of "Y" (casual)
+
+cmchar "The letter Z (casual)";
+beginchar("Z", 2u#+.8side#, cap_height#,0);
+adjust_fit(0, 0); pickup tiny.nib;
+numeric alpha, long, short, hypot;
+long=h; short=w-2u-thick; hypot=long++short;
+alpha=hypot/long;
+pos1(thin,90); pos2(thin,90); pos3(alpha*thick, 0);
+pos4(alpha*thick, 0); pos5(thin,-90); pos6(thin,-90);
+rt x3r=w-u; top y3=h; x4l=w-x3r; bot y4=0;
+top y1r=h; lft x1=u; y2=y1; rt x2=x3;
+bot y5r=bot y6r=0; lft x5=x4; rt x6=w-u;
+%filldraw stroke z1e--z2e; % top bar
+filldraw stroke z3e--z4e; % diagonal
+filldraw stroke z5e--z6e; % bottom bar
+if serifs: pickup crisp.nib; % prepare for arms and serifs
+ pos7(thin, 90); pos8(dslab,180); z7=z2; lft x8r=u;
+ bot y8=h-1.3vstretch*thick;
+ arm(7,8,a,serif_darkness,0); % upper dropped serif
+ pos9(thin,-90); z9=z5; pos10(dslab,0); rt x10r=w-u;
+ top y10=1.33vstretch*thick;
+ arm(9,10,b,serif_darkness,0); fi
+penlabels(1,2,3,4,5,6,7,8,9,10); endchar;
+
+
diff --git a/fonts/duerer/dromanu.mf b/fonts/duerer/dromanu.mf
new file mode 100644
index 0000000000..24ad295335
--- /dev/null
+++ b/fonts/duerer/dromanu.mf
@@ -0,0 +1,732 @@
+%% 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 formal Computer Duerer fonts.
+% Modified 24-July-1990 DAH: Split lines longer than 80 columns
+%%
+def checkthin=
+if thin-currentbreadth<eps: thin:=currentbreadth+eps; fi;
+if thin-currentbreadth<eps: thin:=currentbreadth+eps; fi enddef;
+
+numeric P_width#; P_width#=cap_jut#+3thick#+1/4side#-thin#;
+define_pixels(P_width);
+
+pair xeps, yeps; xeps=(eps,0); yeps=(0,eps);
+numeric tail_corr; tail_corr=1/8;
+numeric cap_jut_factor; cap_jut_factor=8/7;
+
+cmchar "The letter A";
+beginchar("A", 2u#+2cap_jut#+.8side#, cap_height#, 0);
+adjust_fit(cap_serif_fit#, cap_serif_fit#);
+top y3=top y2=h if not monospace: + apex_o fi;
+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_factor*cap_jut+.5u; rt x4r=w-x1l;
+bot y1=bot y4=0 if monospace: +1/2 crisp fi;
+x3r=x2l+apex_corr; hround(w/2)=.5[x2,x3];
+z0=whatever[z1r,z2r]=whatever[z3l,z4l];
+fill z0--diag_end(0,4l,1,1,4r,3r)--z3r..z2l--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
+pickup tiny.nib;
+numeric top_bar; top_bar=top y5r-bot y6l;
+if monospace: pickup pencircle scaled 0pt;
+ pos11(top_bar,90); pos12(top_bar,90);
+ top y11r=top y12r=h; w/2=.5[x11,x12]; x12-x11=apex_corr+2cap_jut;
+ fill z11l--z12l{right}..tension atleast.95..{left}z12r--z11r{left}..
+ tension atleast.95..{right}cycle;
+ penlabels(11,12); fi
+if serifs: bracket:=10/7 bracket; cap_jut:=cap_jut_factor*cap_jut;
+ pickup tiny.nib; numeric jut_factor;
+ if monospace: jut_factor:=1; else: jut_factor:=3/4; fi
+ % Durer called for a |jut_factor| of |1/2|, but this gives a too-puny
+ % inner serif.
+ serif(1,2,a,.8serif_darkness,-cap_jut);serif(4,3,d,.8serif_darkness, cap_jut);
+ bracket:=jut_factor*bracket; if monospace: jut_factor:=.6; fi
+ serif(1,2,b,7/8 serif_darkness,jut_factor*cap_jut);
+ serif(4,3,c,7/8 serif_darkness,-jut_factor*cap_jut);
+ fi
+penlabels(0,1,2,3,4,5,6); endchar;
+
+cmchar "The letter B";
+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
+pos3(thin,-90); pos5(thick,0); pos7(thin,90);
+z3r=z2; y4l=y3l; x4l=x3l+thick; y4r=y3r; 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];
+filldraw stroke z3e--z4e..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);
+ serif(2,1,b,serif_darkness,-cap_jut);
+ numeric tempa_, tempb_; tempa_=slab; tempb_=bracket;
+ slab:=thin; bracket:=2/3cap_jut; serif(2,1,c,serif_darkness,2/3cap_jut);
+ slab:=tempa_; bracket:=tempb_; fi
+penlabels(1,2,3,4,5,6,7,8,9,10,11,12);
+penlabels(6',7'); endchar;
+
+cmchar "The letter C";
+beginchar("C",2u#+.9side#, cap_height#, 0);
+adjust_fit(0, 0); if monospace: pickup fine.nib; else: pickup tiny.nib;fi
+numeric alpha; alpha=w-u-thick;
+pos2(thin, 90); x2=.5[x3r,x0r]; top y2r=h+o;% topmost pen position
+pos3(thick,180); lft z3r=(u,h/2);
+pos4(thin, 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];
+if not monospace: x1l:=x1l+.6thin; y1l:=y1r-1.75thick-2tiny;
+ y5r:=y5r-o; y5l:=2thick+y5r-2tiny; fi
+if monospace: x1:=x1l:=x1r:=x5; y1:=y1-thin; y1l:=y1l-thin; y1r:=y1r-.6thin; fi
+ % readjust to have a better opening in CDTT
+numeric slope_factor; if monospace:slope_factor=4/3; else:slope_factor=3/4; fi
+filldraw
+ z1r{-1,slope_factor}...{left}z2r..pulled_arc.r(2,3)&
+ pulled_arc.r(3,4)..{right}z4r..tension 0.9..z5r--
+ reverse
+ (z1l..tension 0.9..{left}z2l..pulled_arc.l(2,3)&pulled_arc.l(3,4)..{right}z4l
+ ..tension 0.9..z5l)
+ ..(z1l+(eps,0))--(z1r+(eps,0))..cycle;
+penlabels(0,1,2,3,4,5); endchar;
+
+cmchar "The letter D";
+beginchar("D", cap_jut#+.9side#+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=0; top y1=h;
+filldraw stroke z1e--z2e; % stem
+pos3(thin, 90); pos5(thick, 0); pos7(thin, -90);
+x3=x7=x1; top y3r=h; bot y7r=0;
+y5=good.y h/2; rt x5r=good.x (w-.5u);
+if not monospace: x4r=x6r=hround(w/2); top y4r=h; bot y6r=0;
+ bot y4l=vround(h-thin); top y6l=vround thin;
+ x4l=x6l; 2(lft x5l-x4l)=y4l-y6l;
+ z4=.5[z4l, z4r]; z6=.5[z6l, z6r];
+ else: pos4(thin,90); pos6(thin,-90); x4=x6=hround w/2; top y4r=h; bot y6r=0;
+fi
+filldraw stroke z3e{right}...pulled_super_arc.e(4,5,eta)&
+ pulled_super_arc.e(5,6,eta)...{left}z7e; % lobe
+if serifs: serif(1, 2, a, serif_darkness, -cap_jut);
+ serif(2, 1, b, serif_darkness, -cap_jut);
+ if not monospace: numeric temp_; temp_=slab; slab:=thin;
+ serif(2, 1, c, serif_darkness, cap_jut); slab:=temp_; fi fi
+penlabels(1,2,3,4,5,6,7); endchar;
+
+cmchar "The letter E";
+numeric topbar_; if monospace: topbar_=11/15;
+ else: topbar_=17/30; fi % 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-if monospace: 2 fi vstretch*thick);
+arm(3,4,d,serif_darkness,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,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);
+ 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 "E"
+
+cmchar "The letter F";
+numeric topbar_; if monospace: topbar_=11/15;
+ else: topbar_=17/30; fi % 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-if monospace: 2 fi vstretch*thick);
+arm(3,4,d,serif_darkness,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";
+beginchar("G",2u#+.9side#, cap_height#, 0);
+adjust_fit(0, cap_serif_fit#);
+if monospace: pickup fine.nib; else: pickup tiny.nib;fi
+% This code is identical to that for the letter C.
+numeric alpha; alpha=w-u-thick;
+pos2(thin, 90); x2=.5[x3r,x0r]; top y2r=h+o;% topmost pen position
+pos3(thick,180); lft z3r=(u,h/2);
+pos4(thin, 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];
+if not monospace: x1l:=x1l+.6thin; y1l:=y1r-1.75thick-2tiny;
+ y5r:=y5r-o; y5l:=2thick+y5r-2tiny; fi
+if monospace: x1:=x1l:=x1r:=x5; y1:=y1-thin; y1l:=y1l-thin; y1r:=y1r-.6thin; fi
+ % readjust to have a better opening in CDTT
+numeric slope_factor; if monospace:slope_factor=4/3; else:slope_factor=3/4; fi
+% Addtional G work (preceding program is the same as that for letter C)!
+path p,p',line.o, line.i;
+p=z1r{-1,slope_factor}..{left}pulled_arc.r(2,3)&
+ pulled_arc.r(3,4){right}..tension 0.9..z5r;
+p'= reverse
+ (z1l..tension 0.9..{left}pulled_arc.l(2,3)&pulled_arc.l(3,4){right}
+ ..tension 0.9..z5l);
+pos7(thick,0);
+top rt z7r=(w-0u-cap_jut,.9h/2);
+numeric counter; counter=0;
+forever:
+ counter:=counter+1;
+ 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;
+ exitif t1*t2>0; 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<thick: x2:=lft x3r+thick; x2l:=x2r:=x2; fi fi
+ellipse_set(2l,3l,4l,0l); ellipse_set(2r,3r,4r,0r);
+pos7(thin,-diag_angle); x7r=x0; bot y7r=-o; rt x6r=w-if monospace:.75 fi u;
+ lft x6l=rt x6r-thick;
+ellipse_set(7l,6l,5l,0l); ellipse_set(7r,6r,5r,0r);
+pos1(max(currentbreadth+eps,5/6 thick),-90);
+top y1l=h+o-thin; rt x1=x0+2thick+o;
+pos8(1.5thick,-80);lft x8r=u; bot y8r=thin-o;
+if not monospace:
+ filldraw z1l..z2l{left}..{down}z3l..z4l--z5l..{down}z6l..{left}z7l..z8l
+ --z8r..{right}z7r..{up}z6r..z5r--z4r..{up}z3r..{right}z2r..z1r--cycle;
+ else: draw z1l..z2l{left}..{down}z3l..z4l--z5l..{down}z6l..{left}z7l..z8l;
+ draw z8r..{right}z7r..{up}z6r..z5r--z4r..{up}z3r..{right}z2r..z1r;
+ fi
+penlabels(0,1,2,3,4,5,6,7,8); endchar;
+
+cmchar "The letter T";
+beginchar("T",2u#+.9side#, cap_height#,0);
+adjust_fit(0,0); pickup tiny.nib;
+pos1(thick,0); pos2(thick,0); .5[x1r,x1l]=w/2; .5[x2r,x2l]=w/2;
+top y1=h; bot y2=0; filldraw stroke z1e--z2e; % central stem
+numeric alpha, stroke_angle; stroke_angle=55;
+if monospace: alpha=1; else: alpha=sqrt2; fi
+if not serifs: stroke_angle:=90; alpha:=1; fi % sans-serif values
+pos3(alpha*thin,stroke_angle); pos4(alpha*thin,stroke_angle);
+lft x3l=u; top y3r=h; x4r=w-x3l; y4=y3;
+filldraw stroke z3e--z4e; % top horizontal
+if serifs:
+ serif(2,1,a,serif_darkness,-cap_jut);serif(2,1,b,serif_darkness,cap_jut);
+ T_flourish(3,4,c,.75serif_darkness,.5serif_darkness);
+ T_flourish(4,3,d,.5serif_darkness,.75serif_darkness);
+ fi
+penlabels(1,2,3,4); endchar;
+
+cmchar "The letter U";
+beginchar("U", u#+2cap_jut#+.8side#, cap_height#,0);
+adjust_fit(cap_serif_fit#, cap_serif_fit#);
+pickup tiny.nib; pos1(thick,0); pos2(thick,0); pos2'(thick,180);
+pos3(thin,-90); pos4(thin,0); pos5(thin,0);
+x1=x2; x3=.5[x1,x5]; x4=x5; x1l=w-x5r;
+top y1=top y5=h; y2=y4=1/3h; bot y3r=-o; z2'=z2;
+lft x1l=hround .5u+cap_jut;
+filldraw stroke z1e--z2e; % left stem
+filldraw stroke pulled_super_arc.e(2',3,eta)
+ & pulled_super_arc.e(3,4,eta)&z4e--z5e;
+if serifs: serif(1,2,a,serif_darkness,-cap_jut);
+ serif(1,2,b,serif_darkness,cap_jut);
+ serif(5,4,c,serif_darkness,-cap_jut); serif(5,4,d,serif_darkness,cap_jut); fi
+penlabels(1,2,3,4,5); endchar;
+
+cmchar "The letter V";
+beginchar("V",2cap_jut_factor*cap_jut#+.8side#, cap_height#, 0);
+adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
+numeric alpha; alpha=((h+cap_jut)++(w/2))/(h+cap_jut);
+pos1(alpha*thick,0); pos2(alpha*thick,0);
+pos3(alpha*thin,0); pos4(alpha*thin,0);
+top y1=top y4=h; lft x1l=cap_jut_factor*cap_jut; x4r=w-x1l;
+lft x2l=hround w/2; x3r=x2l; bot y2=bot y3=-apex_o;
+z0=whatever[z1r,z2r]=whatever[z3l,z4l]; % notch point
+filldraw z0--diag_end(0,4l,1,1,4r,3r)--z2l
+ --diag_end(2l,1l,1,1,1r,0)--cycle;
+if serifs: bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
+ pickup tiny.nib; numeric jut_factor;
+ if monospace: jut_factor=1; else: jut_factor=3/4; fi
+ serif(1,2,a,.8serif_darkness,-cap_jut); serif(4,3,d,.8serif_darkness,cap_jut);
+ bracket:=jut_factor*bracket;
+ serif(1,2,b,7/8 serif_darkness, jut_factor*cap_jut);
+ serif(4,3,c,7/8 serif_darkness,-jut_factor*cap_jut); fi
+penlabels(0,1,2,3,4); endchar;
+
+cmchar "The letter W";
+numeric alpha;
+ alpha=((cap_height#+cap_jut#)++(.4side#+cap_jut_factor*cap_jut#))/
+ (cap_height#+cap_jut#);
+beginchar("W", 2cap_jut_factor*cap_jut#+1.6side#-alpha*thick#, cap_height#, 0);
+adjust_fit(.5cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
+mid_corr=if monospace: -apex_corr else: 1/3jut fi;
+pos1(alpha*thick,0); pos2(alpha*thick,0);
+pos3(alpha*thin,0); pos4(alpha*thin,0);
+pos5(alpha*thick,0); pos6(alpha*thick,0);
+pos7(alpha*thin,0); pos8(alpha*thin,0);
+numeric V_width; V_width=2cap_jut_factor*cap_jut+4/5side;
+if not monospace:
+ top y1=top y4=h; lft x1l=cap_jut_factor*cap_jut; x4r=V_width-x1l;
+ lft x2l=hround V_width/2; x3r=x2l; bot y2=bot y3=-apex_o;
+ pair shift_amt; ypart shift_amt=0;
+ xpart shift_amt=V_width-2cap_jut_factor*cap_jut-alpha*(thick);
+ z0=whatever[z1r,z2r]=whatever[z3l,z4l]; % notch point
+ path p; p=z0--diag_end(0,4l,1,1,4r,3r)--z2l
+ --diag_end(2l,1l,1,1,1r,0)--cycle;
+ filldraw p; filldraw (p shifted shift_amt); % the 2 V's
+ forsuffixes t=1,2,3,4: z[t+4]=z.t shifted shift_amt; endfor
+else: top y1=h; lft x1l=cap_jut_factor*cap_jut; bot y2=bot y3=-apex_o;
+ x2l+apex_corr=x3l;
+ x8=w-x1; y8=y1; x2-x1=x4-x3=x6-x5=x8-x7;
+ x6l+apex_corr=x7l; y6=y7=y2;
+ y4:=vround .6h; y5=y4;
+ x5=x4;
+ y4l:=y4r:=y4; % ??
+ z0 =whatever[z1r,z2r];
+ z0'=whatever[z7l,z8l]; y0=y0'=h/9;
+ z45=whatever[z3r,z4r]=whatever[z5l,z6l];
+ filldraw z0--diag_end(0,4l,1,1,4r,3r)--z2l--diag_end(2l,1l,1,1,1r,0)--cycle;
+ filldraw z0'--diag_end(0',8l,1,1,8r,7r)--z7l--diag_end(7l,5l,1,1,5r,0')
+ --cycle; fi
+if serifs: bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
+ pickup tiny.nib; numeric jut_factor;
+ if monospace: jut_factor=1.8; else: jut_factor=3/4; fi
+ serif(1,2,a,.8serif_darkness,-cap_jut);
+ serif(8,7,f,.8serif_darkness,cap_jut);
+ if not monospace: serif(5,6,d,.8serif_darkness,cap_jut);
+ serif(5,6,c,.8serif_darkness,-cap_jut); fi
+ bracket:=jut_factor*bracket;
+ serif(1,2,b,7/8 serif_darkness, jut_factor*cap_jut);
+ serif(8,7,e,7/8 serif_darkness,-jut_factor*cap_jut);
+ fi
+penlabels(0,0',1,2,3,4,5,6,7,8,45); endchar;
+
+cmchar "The letter X";
+beginchar("X", 2cap_jut_factor*cap_jut#+.8side#, cap_height#, 0);
+adjust_fit(cap_serif_fit#, cap_serif_fit#);
+numeric alpha; alpha=(h++(w-2cap_jut_factor*cap_jut))/h;
+lft x1l=cap_jut_factor*cap_jut; top y1=h if monospace:-1/2 crisp fi;
+penpos1(alpha*thick, 0);
+x4r=w-x1l; bot y4=0 if monospace:+1/2 crisp fi; penpos4(alpha*thick,0);
+rt x2r=w-cap_jut_factor*cap_jut; y2=y1; penpos2(alpha*thin,0);
+x3l=w-x2r; y3=y4; penpos3(alpha*thin,0);
+fill diag_end(4r,1r,.5,1,1l,4l)--diag_end(1l,4l,.5,1,4r,1r)--cycle; %lft diag
+fill diag_end(2l,3l,.5,1,3r,2r)--diag_end(3r,2r,.5,1,2l,3l)--cycle; % rt diag
+if serifs: bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
+ pickup tiny.nib; numeric jut_factor;
+ if monospace: cap_jut:=.5cap_jut; jut_factor=1; else: jut_factor=3/4; fi
+ serif(1,4,a,.8serif_darkness,-cap_jut);serif(4,1,d,.8serif_darkness,cap_jut);
+ serif(2,3,f,.8serif_darkness,cap_jut);serif(3,2,g,.8serif_darkness,-cap_jut);
+ bracket:=jut_factor*bracket;
+ serif(1,4,b,7/8 serif_darkness,.75cap_jut);
+ serif(4,1,c,7/8 serif_darkness,-.75cap_jut);
+ serif(2,3,e,7/8 serif_darkness,-.75cap_jut);
+ serif(3,2,h,7/8 serif_darkness,.75cap_jut); fi
+penlabels(1,2,3,4); endchar;
+
+cmchar "The letter Y";
+beginchar("Y", 2cap_jut_factor*cap_jut#+.8side#, cap_height#, 0);
+adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup pencircle scaled 0pt;
+numeric alpha, long, short, hypot; long=h/2;
+short=.5(w-thick)-cap_jut_factor*cap_jut;
+ hypot=long++short; alpha=hypot/long;
+penpos1(thick,0); lft x1l=cap_jut_factor*cap_jut if monospace:+.5tiny fi;
+top y1=h if monospace:-.5tiny fi;
+penpos4(thin,0); x4r=w-x1l; y4=y1;
+penpos2(thick,0); penpos3(thin,0);
+penpos5(thick,0); penpos6(thick,0);
+x5=x6=w/2; bot y6=0 if monospace:+.5tiny fi;
+y5=if not monospace: h/2 else:3h/8 fi;
+x2l=x5l; x3r=x5r; y2=y3=if not monospace:h/2 else: 3h/8 fi;
+z0=whatever[z1r, z2r]=whatever[z3l,z4l]; % notch point
+fill z1l--z5l--z6l--z6r--z5r--z4r--z4l--z0--z1r--cycle;
+if serifs: numeric jut_factor;
+ serif(6,5,e,serif_darkness,-.7cap_jut); serif(6,5,f,serif_darkness,.7cap_jut);
+ % bottom serifs
+ bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
+ if monospace: cap_jut:=.5cap_jut; jut_factor=1; else: jut_factor=3/4; fi
+ serif(1,2,a,serif_darkness,-.7cap_jut);serif(4,3,d,serif_darkness,.7cap_jut);
+ % top, outer serifs
+ bracket:=jut_factor*bracket;
+ if monospace: cap_jut:=1.5cap_jut; fi
+ serif(1,2,b,7/8 serif_darkness,.6cap_jut);
+ serif(4,3,c,7/8 serif_darkness,-.6cap_jut); % top, inner serifs
+ fi
+penlabels(0,1,2,3,4,5,6); endchar; % End of "Y"
+
+cmchar "The letter Z";
+beginchar("Z", 2u#+.8side#, cap_height#,0);
+adjust_fit(0, 0); pickup tiny.nib;
+numeric alpha, long, short, hypot;
+long=h; short=w-2u-thick; hypot=long++short;
+alpha=hypot/long;
+pos1(thin,90); pos2(thin,90); pos3(alpha*thick, 0);
+pos4(alpha*thick, 0); pos5(thin,-90); pos6(thin,-90);
+rt x3r=w-u; top y3=h; x4l=w-x3r; bot y4=0;
+top y1r=h; lft x1=u; y2=y1; rt x2=x3;
+bot y5r=bot y6r=0; lft x5=x4; rt x6=w-u;
+filldraw stroke z1e--z2e; % top bar
+filldraw stroke z3e--z4e; % diagonal
+filldraw stroke z5e--z6e; % bottom bar
+if serifs: pickup crisp.nib; % prepare for arms and serifs
+ pos7(thin, 90); pos8(dslab,180); z7=z2; lft x8r=u;
+ bot y8=h-if monospace:2 fi vstretch*thick;
+ arm(7,8,a,serif_darkness,0); % upper dropped serif
+ pos9(thin,-90); z9=z5; pos10(dslab,0); rt x10r=w-u;
+ top y10=if monospace: 2.5 fi vstretch*thick;
+ arm(9,10,b,serif_darkness,0); fi
+penlabels(1,2,3,4,5,6,7,8,9,10); endchar;
+
+
diff --git a/fonts/duerer/dtitle.mf b/fonts/duerer/dtitle.mf
new file mode 100644
index 0000000000..9db6d30742
--- /dev/null
+++ b/fonts/duerer/dtitle.mf
@@ -0,0 +1,238 @@
+%% 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 DTITLE.MF, adapted from Knuths title.mf (Jan 8, 1990).
+% This makes a short font (caps only)
+
+% This file also contains special macros universally needed in the durer font
+% but not in CM.BAS.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% MACRO SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+def formal=not informal enddef;
+
+vardef antiserif(suffix $,$$,@)(expr darkness, jut) suffix modifier=
+ % erases a serif-like region at |z_$| from |z_{$$}|
+pickup crisp.nib; pair downward; downward=z$-z$$;
+y@2=jut; x@1=lft x$l+jut; top y@1=bot y$;
+z@2-penoffset downward of currentpen=
+ z$l+penoffset downward of pen_[tiny.nib]+whatever*downward;
+erase filldraw z@2{downward}...darkness[(x@2,y@1), .5[z@2,z@1]]{z@1-z@2}
+ ...{right}z@1--(x@1,y@1-eps)--origin--(x@2-eps,y@2)--z@2&cycle;
+labels(@1, @2); enddef;
+
+
+let cm_arm=arm;
+
+vardef arm(suffix $,$$,@)(expr darkness, armjut) = % arm from |z$| to |z$$|
+numeric vjut_; vjut_= abs(bot y$l-bot y$$);
+x@0=good.x(x$$r-armjut); y@0=y$r;
+ if serifs: y@1=y$l; z@1=z$$l+whatever*(z$$r-z@0);
+ if x$$>=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<eps: slab:=eps fi;
+ define_corrected_pixels(o);
+ forsuffixes $=hair,stem,cap_stem:
+ fudged$.#:=fudge*$.#; fudged$:=hround(fudged$.#*hppp+blacker);
+ forever: exitif fudged$>.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<vround min_Vround: min_Vround:=vround min_Vround; fi
+ pickup pencircle scaled rule_thickness; rule.nib:=savepen;
+ currenttransform:=identity slanted slant
+ yscaled aspect_ratio scaled granularity;
+ if currenttransform=identity: let t_=relax
+ else: def t_ = transformed currenttransform enddef fi;
+ numeric paren_depth#; .5[body_height#,-paren_depth#]=math_axis#;
+ numeric asc_depth#; .5[asc_height#,-asc_depth#]=math_axis#;
+ body_depth:=desc_depth+body_height-asc_height;
+ shrink_fit:=1+hround(2letter_fit#*hppp)-2letter_fit;
+ if not string mode: if mode<=smoke: shrink_fit:=0; fi fi
+ enddef;
+
+def durer_font_setup= % contains special stuff for Durer fonts
+define_pixels(side,thick,thin);
+if not known dslab#: dslab=eps; fi
+enddef;
+
+vardef T_flourish(suffix at,from,aux)(expr top_dark, bot_dark)=
+ pickup tiny.nib; pair xeps_,yeps_; yeps_=(0,eps);
+ numeric stroke_angle_; stroke_angle_=angle(z.at.r-z.at.l);
+ numeric slab'; slab'=.6slab;
+ pos.at'(alpha*thin+alpha*cap_jut,stroke_angle_); z.at'=z.at;
+ if x.at<x.from: xeps_=(eps,0);% left flourish
+ rt x.aux2-lft x.at'r=alpha*slab';
+ x.aux1=x.at.r+bracket+slab';
+ else: xeps_=(-eps,0); % right flourish
+ rt x.at'r-lft x.aux2=alpha*slab';
+ x.aux1=x.at.r-bracket-slab'; fi
+y.aux1=y.at.r; y.aux4=y.at.l; z.aux1-z.aux4=whatever*(z.at.r-z.at.l);
+y.aux2=y.at'r; y.aux3=y.at'l; z.aux2-z.aux3=whatever*(z.at.r-z.at.l);
+if top_dark>=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.
+
+