summaryrefslogtreecommitdiff
path: root/fonts/cmoefont
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/cmoefont
Initial commit
Diffstat (limited to 'fonts/cmoefont')
-rw-r--r--fonts/cmoefont/cmoebx10.mf78
-rw-r--r--fonts/cmoefont/cmoer10.mf80
-rw-r--r--fonts/cmoefont/cmoesc10.mf111
-rw-r--r--fonts/cmoefont/cmoesl10.mf77
-rw-r--r--fonts/cmoefont/cmoeti10.mf78
-rw-r--r--fonts/cmoefont/cmoett10.mf76
-rw-r--r--fonts/cmoefont/oeit.mf61
-rw-r--r--fonts/cmoefont/oeitl.mf86
-rw-r--r--fonts/cmoefont/oerm.mf70
-rw-r--r--fonts/cmoefont/oerml.mf128
-rw-r--r--fonts/cmoefont/oermu.mf88
-rw-r--r--fonts/cmoefont/oesc.mf44
-rw-r--r--fonts/cmoefont/ogonek.mf17
-rw-r--r--fonts/cmoefont/readme23
14 files changed, 1017 insertions, 0 deletions
diff --git a/fonts/cmoefont/cmoebx10.mf b/fonts/cmoefont/cmoebx10.mf
new file mode 100644
index 0000000000..923eb22105
--- /dev/null
+++ b/fonts/cmoefont/cmoebx10.mf
@@ -0,0 +1,78 @@
+
+% old english
+
+% Computer Modern Bold Extended Roman 10 point
+if unknown cmbase: input cmbase fi
+
+font_identifier:="CMBX"; font_size 10pt#;
+
+u#:=23/36pt#; % unit width
+width_adj#:=11/36pt#; % width adjustment for certain characters
+serif_fit#:=0pt#; % extra sidebar near lowercase serifs
+cap_serif_fit#:=7/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#:=247/36pt#; % height of caps
+fig_height#:=232/36pt#; % height of numerals
+x_height#:=160/36pt#; % height of lowercase without ascenders
+math_axis#:=90/36pt#; % axis of symmetry for math symbols
+bar_height#:=85/36pt#; % height of crossbar in lowercase e
+comma_depth#:=70/36pt#; % depth of comma below baseline
+desc_depth#:=70/36pt#; % depth of lowercase descenders
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=13/36pt#; % diameter of rounded corners
+fine#:=10/36pt#; % diameter of sharply rounded corners
+thin_join#:=10/36pt#; % width of extrafine details
+hair#:=17/36pt#; % lowercase hairline breadth
+stem#:=41/36pt#; % lowercase stem breadth
+curve#:=46/36pt#; % lowercase curve breadth
+ess#:=38/36pt#; % breadth in middle of lowercase s
+flare#:=45/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=56/36pt#; % diameter of dots
+cap_hair#:=19/36pt#; % uppercase hairline breadth
+cap_stem#:=51/36pt#; % uppercase stem breadth
+cap_curve#:=55/36pt#; % uppercase curve breadth
+cap_ess#:=53/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.6pt#; % thickness of lines in math symbols
+
+dish#:=1/36pt#; % amount erased at top or bottom of serifs
+bracket#:=10/36pt#; % vertical distance from serif base to tangent
+jut#:=25/36pt#; % protrusion of lowercase serifs
+cap_jut#:=39/36pt#; % protrusion of uppercase serifs
+beak_jut#:=11/36pt#; % horizontal protrusion of beak serifs
+beak#:=70/36pt#; % vertical protrusion of beak serifs
+vair#:=13/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % maximum breadth above or below notches
+bar#:=17/36pt#; % lowercase bar thickness
+slab#:=17/36pt#; % serif and arm thickness
+cap_bar#:=17/36pt#; % uppercase bar thickness
+cap_band#:=17/36pt#; % uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % max breadth above/below uppercase notches
+serif_drop#:=3/36pt#; % vertical drop of sloped serifs
+stem_corr#:=2/36pt#; % for small refinements of stem breadth
+vair_corr#:=1.5/36pt#; % for small refinements of hairline height
+apex_corr#:=0pt#; % extra width at diagonal junctions
+
+o#:=4/36pt#; % amount of overshoot for curves
+apex_o#:=3/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=0; % tilt ratio $(\Delta x/\Delta y)$
+fudge:=1; % factor applied to weights of heavy characters
+math_spread:=.5; % extra openness of math symbols
+superness:=8/11; % parameter for superellipses
+superpull:=1/8; % extra openness inside bowls
+beak_darkness:=.4; % fraction of triangle inside beak serifs
+ligs:=2; % level of ligatures to be included
+
+square_dots:=false; % should dots be square?
+hefty:=false; % should we try hard not to be overweight?
+serifs:=true; % should serifs and bulbs be attached?
+monospace:=false; % should all characters have the same width?
+variant_g:=false; % should an italic-style g be used?
+low_asterisk:=false; % should the asterisk be centered at the axis?
+math_fitting:=false; % should math-mode spacing be used?
+
+generate oerm ; % switch to the driver file
diff --git a/fonts/cmoefont/cmoer10.mf b/fonts/cmoefont/cmoer10.mf
new file mode 100644
index 0000000000..7138803d67
--- /dev/null
+++ b/fonts/cmoefont/cmoer10.mf
@@ -0,0 +1,80 @@
+
+% variant for old english letters
+
+% Computer Modern Roman 10 point
+if unknown cmbase: input cmbase fi
+
+font_identifier:="CMR"; font_size 10pt#;
+
+u#:=20/36pt#; % unit width
+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
+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
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=8/36pt#; % diameter of rounded corners
+fine#:=7/36pt#; % diameter of sharply rounded corners
+thin_join#:=7/36pt#; % width of extrafine details
+hair#:=9/36pt#; % lowercase hairline breadth
+stem#:=25/36pt#; % lowercase stem breadth
+curve#:=30/36pt#; % lowercase curve breadth
+ess#:=27/36pt#; % breadth in middle of lowercase s
+flare#:=33/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=38/36pt#; % diameter of dots
+cap_hair#:=11/36pt#; % uppercase hairline breadth
+cap_stem#:=32/36pt#; % uppercase stem breadth
+cap_curve#:=37/36pt#; % uppercase curve breadth
+cap_ess#:=35/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.4pt#; % thickness of lines in math symbols
+
+dish#:=1/36pt#; % amount erased at top or bottom of serifs
+bracket#:=20/36pt#; % vertical distance from serif base to tangent
+jut#:=28/36pt#; % protrusion of lowercase serifs
+cap_jut#:=37/36pt#; % protrusion of uppercase serifs
+beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs
+beak#:=70/36pt#; % vertical protrusion of beak serifs
+vair#:=8/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % maximum breadth above or below notches
+bar#:=11/36pt#; % lowercase bar thickness
+slab#:=11/36pt#; % serif and arm thickness
+cap_bar#:=11/36pt#; % uppercase bar thickness
+cap_band#:=11/36pt#; % uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % max breadth above/below uppercase notches
+serif_drop#:=4/36pt#; % vertical drop of sloped serifs
+stem_corr#:=1/36pt#; % for small refinements of stem breadth
+vair_corr#:=1/36pt#; % for small refinements of hairline height
+apex_corr#:=0pt#; % extra width at diagonal junctions
+
+o#:=8/36pt#; % amount of overshoot for curves
+apex_o#:=8/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=0; % tilt ratio $(\Delta x/\Delta y)$
+fudge:=1; % factor applied to weights of heavy characters
+math_spread:=0; % extra openness of math symbols
+superness:=1/sqrt2; % parameter for superellipses
+superpull:=1/6; % extra openness inside bowls
+beak_darkness:=11/30; % fraction of triangle inside beak serifs
+ligs:=2; % level of ligatures to be included
+
+square_dots:=false; % should dots be square?
+hefty:=false; % should we try hard not to be overweight?
+serifs:=true; % should serifs and bulbs be attached?
+monospace:=false; % should all characters have the same width?
+variant_g:=false; % should an italic-style g be used?
+low_asterisk:=false; % should the asterisk be centered at the axis?
+math_fitting:=false; % should math-mode spacing be used?
+% oegen rather than roman
+thorn_code := ASCII "t" ; Thorn_code := ASCII "T" ; edh_code := ASCII "d" ;
+varthorn_code := ASCII "z" ;
+generate oerm % switch to the driver file
diff --git a/fonts/cmoefont/cmoesc10.mf b/fonts/cmoefont/cmoesc10.mf
new file mode 100644
index 0000000000..26755dc417
--- /dev/null
+++ b/fonts/cmoefont/cmoesc10.mf
@@ -0,0 +1,111 @@
+% Computer Modern Roman Caps and Small Caps 10 point
+%% for old english
+if unknown cmbase: input cmbase fi
+
+font_identifier:="CMCSC"; font_size 10pt#;
+
+% first come parameters used to set the uppercase letters
+% (including some for lowercase that aren't actually used)
+u#:=21/36pt#; % unit width
+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#:=5/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
+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
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=8/36pt#; % diameter of rounded corners
+fine#:=7/36pt#; % diameter of sharply rounded corners
+thin_join#:=7/36pt#; % width of extrafine details
+hair#:=9/36pt#; % lowercase hairline breadth
+stem#:=25/36pt#; % lowercase stem breadth
+curve#:=30/36pt#; % lowercase curve breadth
+ess#:=27/36pt#; % breadth in middle of lowercase s
+flare#:=33/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=38/36pt#; % diameter of dots
+cap_hair#:=11/36pt#; % uppercase hairline breadth
+cap_stem#:=32/36pt#; % uppercase stem breadth
+cap_curve#:=37/36pt#; % uppercase curve breadth
+cap_ess#:=35/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.4pt#; % thickness of lines in math symbols
+
+dish#:=1/36pt#; % amount erased at top or bottom of serifs
+bracket#:=20/36pt#; % vertical distance from serif base to tangent
+jut#:=28/36pt#; % protrusion of lowercase serifs
+cap_jut#:=37/36pt#; % protrusion of uppercase serifs
+beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs
+beak#:=70/36pt#; % vertical protrusion of beak serifs
+vair#:=8/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % maximum breadth above or below notches
+bar#:=11/36pt#; % lowercase bar thickness
+slab#:=11/36pt#; % serif and arm thickness
+cap_bar#:=11/36pt#; % uppercase bar thickness
+cap_band#:=11/36pt#; % uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % max breadth above/below uppercase notches
+serif_drop#:=4/36pt#; % vertical drop of sloped serifs
+stem_corr#:=1/36pt#; % for small refinements of stem breadth
+vair_corr#:=1/36pt#; % for small refinements of hairline height
+apex_corr#:=0pt#; % extra width at diagonal junctions
+
+o#:=8/36pt#; % amount of overshoot for curves
+apex_o#:=8/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=0; % tilt ratio $(\Delta x/\Delta y)$
+fudge:=1; % factor applied to weights of heavy characters
+math_spread:=0; % extra openness of math symbols
+superness:=1/sqrt2; % parameter for superellipses
+superpull:=1/6; % extra openness inside bowls
+beak_darkness:=11/30; % fraction of triangle inside beak serifs
+ligs:=1; % level of ligatures to be included
+
+square_dots:=false; % should dots be square?
+hefty:=false; % should we try hard not to be overweight?
+serifs:=true; % should serifs and bulbs be attached?
+monospace:=false; % should all characters have the same width?
+variant_g:=false; % should an italic-style g be used?
+low_asterisk:=false; % should the asterisk be centered at the axis?
+math_fitting:=false; % should math-mode spacing be used?
+
+% now come replacements used to set the lowercase caps
+
+lower.u#:=16/36pt#; % unit width
+lower.width_adj#:=0pt#; % width adjustment for certain characters
+lower.cap_serif_fit#:=4/36pt#; % extra sidebar near uppercase serifs
+lower.letter_fit#:=2.4/36pt#; % extra space added to all sidebars
+
+lower.body_height#:=200/36pt#; % height of tallest characters
+lower.cap_height#:=185/36pt#; % height of caps
+lower.x_height#:=116/36pt#; % height of lowercase without ascenders
+lower.bar_height#:=65/36pt#; % height of crossbar in lowercase e
+lower.comma_depth#:=52/36pt#; % depth of comma below baseline
+
+lower.flare#:=25/36pt#; % diameter of bulbs or breadth of terminals
+lower.cap_hair#:=9.1/36pt#; % uppercase hairline breadth
+lower.stem#:=21/36pt#; % lowercase stem breadth
+lower.cap_stem#:=26/36pt#; % uppercase stem breadth
+lower.cap_curve#:=31/36pt#; % uppercase curve breadth
+lower.cap_ess#:=28/36pt#; % breadth in middle of uppercase s
+
+lower.cap_jut#:=26/36pt#; % protrusion of uppercase serifs
+lower.beak_jut#:=7/36pt#; % horizontal protrusion of beak serifs
+lower.beak#:=52/36pt#; % vertical protrusion of beak serifs
+lower.slab#:=9.1/36pt#; % serif and arm thickness
+lower.cap_bar#:=9.1/36pt#; % uppercase bar thickness
+lower.cap_band#:=9.1/36pt#; % uppercase thickness above/below lobes
+lower.cap_notch_cut#:=10pt#; % max breadth above/below uppercase notches
+
+lower.o#:=5/36pt#; % amount of overshoot for curves
+lower.apex_o#:=4/36pt#; % amount of overshoot for diagonal junctions
+
+lower.fudge:=1; % factor applied to weights of heavy characters
+
+generate oesc % switch to the driver file
diff --git a/fonts/cmoefont/cmoesl10.mf b/fonts/cmoefont/cmoesl10.mf
new file mode 100644
index 0000000000..c434d10f03
--- /dev/null
+++ b/fonts/cmoefont/cmoesl10.mf
@@ -0,0 +1,77 @@
+
+% Computer Modern Slanted Roman 10 point
+%% variant for Old English font
+if unknown cmbase: input cmbase fi
+
+font_identifier:="CMSL"; font_size 10pt#;
+
+u#:=20/36pt#; % unit width
+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
+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
+
+crisp#:=0pt#; % diameter of serif corners
+tiny#:=8/36pt#; % diameter of rounded corners
+fine#:=7/36pt#; % diameter of sharply rounded corners
+thin_join#:=7/36pt#; % width of extrafine details
+hair#:=9/36pt#; % lowercase hairline breadth
+stem#:=25/36pt#; % lowercase stem breadth
+curve#:=30/36pt#; % lowercase curve breadth
+ess#:=27/36pt#; % breadth in middle of lowercase s
+flare#:=33/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=38/36pt#; % diameter of dots
+cap_hair#:=11/36pt#; % uppercase hairline breadth
+cap_stem#:=32/36pt#; % uppercase stem breadth
+cap_curve#:=37/36pt#; % uppercase curve breadth
+cap_ess#:=35/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.4pt#; % thickness of lines in math symbols
+
+dish#:=1/36pt#; % amount erased at top or bottom of serifs
+bracket#:=20/36pt#; % vertical distance from serif base to tangent
+jut#:=28/36pt#; % protrusion of lowercase serifs
+cap_jut#:=37/36pt#; % protrusion of uppercase serifs
+beak_jut#:=10/36pt#; % horizontal protrusion of beak serifs
+beak#:=70/36pt#; % vertical protrusion of beak serifs
+vair#:=8/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % maximum breadth above or below notches
+bar#:=11/36pt#; % lowercase bar thickness
+slab#:=11/36pt#; % serif and arm thickness
+cap_bar#:=11/36pt#; % uppercase bar thickness
+cap_band#:=11/36pt#; % uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % max breadth above/below uppercase notches
+serif_drop#:=4/36pt#; % vertical drop of sloped serifs
+stem_corr#:=1/36pt#; % for small refinements of stem breadth
+vair_corr#:=1/36pt#; % for small refinements of hairline height
+apex_corr#:=0pt#; % extra width at diagonal junctions
+
+o#:=8/36pt#; % amount of overshoot for curves
+apex_o#:=8/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=1/6; % tilt ratio $(\Delta x/\Delta y)$
+fudge:=1; % factor applied to weights of heavy characters
+math_spread:=0; % extra openness of math symbols
+superness:=1/sqrt2; % parameter for superellipses
+superpull:=1/6; % extra openness inside bowls
+beak_darkness:=11/30; % fraction of triangle inside beak serifs
+ligs:=2; % level of ligatures to be included
+
+square_dots:=false; % should dots be square?
+hefty:=false; % should we try hard not to be overweight?
+serifs:=true; % should serifs and bulbs be attached?
+monospace:=false; % should all characters have the same width?
+variant_g:=false; % should an italic-style g be used?
+low_asterisk:=false; % should the asterisk be centered at the axis?
+math_fitting:=false; % should math-mode spacing be used?
+
+generate oerm % switch to the driver file
diff --git a/fonts/cmoefont/cmoeti10.mf b/fonts/cmoefont/cmoeti10.mf
new file mode 100644
index 0000000000..bc12b766b8
--- /dev/null
+++ b/fonts/cmoefont/cmoeti10.mf
@@ -0,0 +1,78 @@
+
+% Old English italic letters
+
+% Computer Modern Text Italic 10 point
+if unknown cmbase: input cmbase fi
+
+font_identifier:="CMTI"; font_size 10pt#;
+
+u#:=18.4/36pt#; % unit width
+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#:=9.2/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
+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
+
+crisp#:=8/36pt#; % diameter of serif corners
+tiny#:=8/36pt#; % diameter of rounded corners
+fine#:=7/36pt#; % diameter of sharply rounded corners
+thin_join#:=7/36pt#; % width of extrafine details
+hair#:=11/36pt#; % lowercase hairline breadth
+stem#:=23/36pt#; % lowercase stem breadth
+curve#:=28/36pt#; % lowercase curve breadth
+ess#:=27/36pt#; % breadth in middle of lowercase s
+flare#:=29/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=38/36pt#; % diameter of dots
+cap_hair#:=11/36pt#; % uppercase hairline breadth
+cap_stem#:=29/36pt#; % uppercase stem breadth
+cap_curve#:=34/36pt#; % uppercase curve breadth
+cap_ess#:=31/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=.4pt#; % thickness of lines in math symbols
+
+dish#:=1/36pt#; % amount erased at top or bottom of serifs
+bracket#:=20/36pt#; % vertical distance from serif base to tangent
+jut#:=30/36pt#; % protrusion of lowercase serifs
+cap_jut#:=34/36pt#; % protrusion of uppercase serifs
+beak_jut#:=9/36pt#; % horizontal protrusion of beak serifs
+beak#:=70/36pt#; % vertical protrusion of beak serifs
+vair#:=8/36pt#; % vertical diameter of hairlines
+notch_cut#:=10pt#; % maximum breadth above or below notches
+bar#:=11/36pt#; % lowercase bar thickness
+slab#:=11/36pt#; % serif and arm thickness
+cap_bar#:=11/36pt#; % uppercase bar thickness
+cap_band#:=11/36pt#; % uppercase thickness above/below lobes
+cap_notch_cut#:=10pt#; % max breadth above/below uppercase notches
+serif_drop#:=4/36pt#; % vertical drop of sloped serifs
+stem_corr#:=1/36pt#; % for small refinements of stem breadth
+vair_corr#:=1/36pt#; % for small refinements of hairline height
+apex_corr#:=0pt#; % extra width at diagonal junctions
+
+o#:=8/36pt#; % amount of overshoot for curves
+apex_o#:=8/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=.25; % tilt ratio $(\Delta x/\Delta y)$
+fudge:=1; % factor applied to weights of heavy characters
+math_spread:=0; % extra openness of math symbols
+superness:=1/sqrt2; % parameter for superellipses
+superpull:=1/6; % extra openness inside bowls
+beak_darkness:=11/30; % fraction of triangle inside beak serifs
+ligs:=2; % level of ligatures to be included
+
+square_dots:=false; % should dots be square?
+hefty:=false; % should we try hard not to be overweight?
+serifs:=true; % should serifs and bulbs be attached?
+monospace:=false; % should all characters have the same width?
+variant_g:=true; % should an italic-style g be used?
+low_asterisk:=false; % should the asterisk be centered at the axis?
+math_fitting:=false; % should math-mode spacing be used?
+
+generate oeit % switch to the driver file
diff --git a/fonts/cmoefont/cmoett10.mf b/fonts/cmoefont/cmoett10.mf
new file mode 100644
index 0000000000..c654cc273f
--- /dev/null
+++ b/fonts/cmoefont/cmoett10.mf
@@ -0,0 +1,76 @@
+
+% Computer Modern Typewriter Text for use with 10 point
+if unknown cmbase: input cmbase fi
+
+font_identifier:="CMTT"; font_size 10pt#;
+
+u#:=21/36pt#; % unit width
+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
+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
+
+crisp#:=22/36pt#; % diameter of serif corners
+tiny#:=22/36pt#; % diameter of rounded corners
+fine#:=21/36pt#; % diameter of sharply rounded corners
+thin_join#:=21/36pt#; % width of extrafine details
+hair#:=25/36pt#; % lowercase hairline breadth
+stem#:=25/36pt#; % lowercase stem breadth
+curve#:=25/36pt#; % lowercase curve breadth
+ess#:=22/36pt#; % breadth in middle of lowercase s
+flare#:=32/36pt#; % diameter of bulbs or breadth of terminals
+dot_size#:=36/36pt#; % diameter of dots
+cap_hair#:=25/36pt#; % uppercase hairline breadth
+cap_stem#:=25/36pt#; % uppercase stem breadth
+cap_curve#:=25/36pt#; % uppercase curve breadth
+cap_ess#:=25/36pt#; % breadth in middle of uppercase s
+rule_thickness#:=25/36pt#; % thickness of lines in math symbols
+
+dish#:=0pt#; % amount erased at top or bottom of serifs
+bracket#:=0pt#; % vertical distance from serif base to tangent
+jut#:=34/36pt#; % protrusion of lowercase serifs
+cap_jut#:=34/36pt#; % protrusion of uppercase serifs
+beak_jut#:=0pt#; % horizontal protrusion of beak serifs
+beak#:=34/36pt#; % vertical protrusion of beak serifs
+vair#:=22/36pt#; % vertical diameter of hairlines
+notch_cut#:=25/36pt#; % maximum breadth above or below notches
+bar#:=22/36pt#; % lowercase bar thickness
+slab#:=22/36pt#; % serif and arm thickness
+cap_bar#:=22/36pt#; % uppercase bar thickness
+cap_band#:=22/36pt#; % uppercase thickness above/below lobes
+cap_notch_cut#:=25/36pt#; % max breadth above/below uppercase notches
+serif_drop#:=0pt#; % vertical drop of sloped serifs
+stem_corr#:=0pt#; % for small refinements of stem breadth
+vair_corr#:=0pt#; % for small refinements of hairline height
+apex_corr#:=10/36pt#; % extra width at diagonal junctions
+
+o#:=4/36pt#; % amount of overshoot for curves
+apex_o#:=3/36pt#; % amount of overshoot for diagonal junctions
+
+slant:=0; % tilt ratio $(\Delta x/\Delta y)$
+fudge:=0.81; % factor applied to weights of heavy characters
+math_spread:=-1; % extra openness of math symbols
+superness:=1/sqrt2; % parameter for superellipses
+superpull:=0; % extra openness inside bowls
+beak_darkness:=0; % fraction of triangle inside beak serifs
+ligs:=0; % level of ligatures to be included
+
+square_dots:=false; % should dots be square?
+hefty:=true; % should we try hard not to be overweight?
+serifs:=true; % should serifs and bulbs be attached?
+monospace:=true; % should all characters have the same width?
+variant_g:=false; % should an italic-style g be used?
+low_asterisk:=true; % should the asterisk be centered at the axis?
+math_fitting:=false; % should math-mode spacing be used?
+
+generate oerm % switch to the driver file
diff --git a/fonts/cmoefont/oeit.mf b/fonts/cmoefont/oeit.mf
new file mode 100644
index 0000000000..273e49a037
--- /dev/null
+++ b/fonts/cmoefont/oeit.mf
@@ -0,0 +1,61 @@
+
+% Old English italic
+
+% The Computer Modern Text Italic family (by D. E. Knuth, 1979--1985)
+mode_setup; font_setup;
+slantfont slant4 ;
+
+input oeitl; % lower case (minuscules)
+input ogonek ; % ogonek accent
+%input italsp; % lowercase specials (dotless \i, ligature \ae, etc.)
+%if ligs>1: font_coding_scheme:="TeX text";
+% spanish_shriek=oct"074"; spanish_query=oct"076";
+% input italig; % letter ligatures
+%else: font_coding_scheme:=if ligs=0: "TeX typewriter text"
+% else: "TeX text without f-ligatures" fi;
+% spanish_shriek=oct"016"; spanish_query=oct"017"; 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#;
+ letter_fit#:=letter_fit:=0;
+else: font_normal_space 6u#+2letter_fit#;
+ font_normal_stretch 3u#; font_normal_shrink 2u#;
+ font_quad 18u#+4letter_fit#;
+ font_extra_space 2u#; fi
+
+input oermu; % upper case (majuscules)
+%input greeku; % upper case greek letters
+%input itald; % numerals
+%input italp; % ampersand, question marks, currency sign
+%input romspu; % uppercase specials (\AE, \OE, \O)
+%input punct; % punctuation symbols common to roman and italic text
+%input accent; % accents common to roman and italic text
+%if ligs>0: input comlig; fi % ligatures common with roman text
+%if ligs<=1: input romsub; fi % substitutes for ligatures
+%
+%ligtable "!": "`" =: spanish_shriek;
+%ligtable "?": "`" =: spanish_query;
+
+%if not monospace:
+% k#:=-.5u#; kk#:=-1.5u#; kkk#:=-2u#; % three degrees of kerning
+% ligtable "d": "w": "l": "l" kern +u#;
+% ligtable "F": "V": "o" kern kk#, "e" kern kk#,
+% "u" kern kk#, "r" kern kk#, "a" kern kk#, "A" kern kkk#,
+% "K": "X": "O" kern k#, "C" kern k#, "G" kern k#, "Q" kern k#;
+% ligtable "T": "y" kern kk#,
+% "Y": "e" kern kk#, "o" kern kk#, "r" kern kk#, "a" kern kk#, "u" kern kk#,
+% "P": "W": "A" kern kk#;
+% ligtable "O": "D": "X" kern k#, "W" kern k#, "A" kern k#,
+% "V" kern k#, "Y" kern k#;
+% ligtable "A": "R": "n" kern k#, "l" kern k#, "r" kern k#, "u" kern k#,
+% "m" kern k#, "t" kern k#, "i" kern k#, "C" kern k#, "O" kern k#, "G" kern k#,
+% "h" kern k#, "b" kern k#, "U" kern k#, "k" kern k#, "v" kern k#, "w" kern k#,
+% "Q" kern k#, "L": "T" kern kk#, "Y" kern kk#, "V" kern kkk#, "W" kern kkk#,
+% "b": "c": "e": "o": "p": "r": "e" kern -u#, "a" kern -u#, "o" kern -u#,
+% "d" kern -u#, "c" kern -u#, "g" kern -u#, "q" kern -u#;
+% ligtable "n": "'" kern kkk#; fi
+% there are ligature/kern programs for |"f"| in the {\tt italig} file
+% and for |"-"|, |"`"|, and |"'"| in the {\tt comlig} file
+bye.
diff --git a/fonts/cmoefont/oeitl.mf b/fonts/cmoefont/oeitl.mf
new file mode 100644
index 0000000000..8edd4acc19
--- /dev/null
+++ b/fonts/cmoefont/oeitl.mf
@@ -0,0 +1,86 @@
+
+cmchar "The letter yogh";
+beginchar("g",9u#,x_height#,desc_depth#);
+italcorr x_height#*slant-.5serif_fit#-.3u#;
+adjust_fit(0,0);
+numeric arm_thickness,arm_thickness#,z_stem;
+arm_thickness# = .7[hair#,stem#] ;
+define_whole_vertical_blacker_pixels(arm_thickness) ;
+z_stem = .1[vair,stem] ;
+pickup tiny.nib; rt x1r=rt x2r=hround(w-1.2u);
+top y1=h; y2=min(y1,h-2/3arm_thickness);
+lft x3l = hround .45w ; y3 = .7bar_height ;
+numeric alpha; alpha=diag_ratio(1,z_stem-tiny,y2-y3,x2r-x3l-slant*(y2-y3));
+penpos1(alpha*(z_stem-tiny),0); penpos2(alpha*(z_stem-tiny),0);
+penpos3(alpha*(z_stem-tiny),0);
+pair delta; delta=penoffset z3-z1 of currentpen;
+fill top lft z1l--z1l+delta---z3l+delta..lft z3l
+ ..bot z3r--z3r-delta---rt z1r..top z1r
+ ---cycle; % diagonal
+z99 = rt z1r ; z98 = z99 + (u,0) ; % for cutting away
+z97 = z99 + 2u*(z3-z1) ; z96 = z97 + (u,0) ;
+pickup crisp.nib; pos5(arm_thickness,90); pos6(hair,180);
+top y5r=h; x5=x1; lft x6r=hround .75u; y6=good.y(y5l-beak/1.6)-eps;
+arm(5,6,a,beak_darkness,-.4beak_jut); % upper arm and beak
+% now cut away the excess arm
+erase fill z99 --- z98 --- z96 --- z97 --- cycle ;
+pickup fine.nib ;
+pos10'(vair,90) ; pos11(curve,0) ;
+pos12(.1[vair,curve],-90) ;
+z10' - z3 = whatever*dir 30 ;
+x10' = x3 + u ; x10 = x10' ; y10r = good.y y10'r ; pos10(vair,90) ;
+bot y12r = -d-oo ; x12 = .5w ;
+y11 = .5[y10,y12] ; rt x11r = hround(w-.9u) ;
+z3' = z3 ; z3'l = z3r ; z3'r = z3l ;
+filldraw stroke z3'e .. z10e{right} ;
+filldraw stroke pulled_arc.e(10,11) & pulled_arc.e(11,12) ;
+if serifs: pos13(hair,-180) ; y13=-.1d ; lft x13r = hround .8u ;
+ pos14(flare,-180) ; bulb(12,13,14) ;
+else: pos13(5/7[vair,flare],angle(-3u,-h)) ;
+lft x13r = hround .9u ; y13 = -.1d ;
+x13l := good.x x13l ; y13l := good.y y13l ;
+filldraw stroke term.e(12,13,left,1,4) ; fi
+penlabels(1,2,3,4,5,6,7,8,10,11,12,13,14); endchar;
+
+cmchar "Italic letter edh";
+beginchar("d",9u#,asc_height#,0);
+italcorr .7x_height#*slant+.5curve#-u# if math_fitting:-.5u# fi;
+adjust_fit(0,0); pickup fine.nib;
+pos1(vair,90); pos2(curve,180); pos3(vair,270); pos4(curve,360);
+x1=x3=.5w; lft x2r=hround(1.5u-.5curve); x4=w-x2;
+top y1r=vround(x_height)+oo; y2=y4=.5[y1,y3]; bot y3r=-oo;
+y4' = y4 ; x4'l = x4l ; pos4'(hair,360) ;
+filldraw stroke pulled_arc.e(1,2) & pulled_arc.e(2,3)
+ & pulled_arc.e(3,4) -- pulled_arc.e(4',1); % bowl
+pickup crisp.nib ;
+pos5(.5[hair,vair],40) ; z4'' = z4 ; pos4''(curve,360) ;
+x5 = 3u ; top y5r = h ;
+filldraw stroke z5e .. tension 1.1 and 0.9 .. z4''e{down} ;
+path p ;
+p = z5 .. tension 1.1 and 0.9 .. z4{down} ;
+z6 = ((0,.6[x_height,asc_height]) -- (w,.5[x_height,asc_height]))
+ intersectionpoint p ;
+pos6'(.5[vair,hair],-60) ; pos 6''(.5[vair,hair],-60) ;
+top y6''l = vround .95h ; z6'' = z6 + whatever*dir30;
+z6 = .5[z6',z6''] ; filldraw stroke z6'e -- z6''e ;
+math_fit(-.3x_height#*slant+.5curve#-u#,ic#); penlabels(1,2,3,4); endchar;
+
+cmchar "Italic letter thorn";
+beginchar("t",8u#,asc_height#,desc_depth#);
+italcorr .7x_height#*slant+.5curve# if math_fitting:-.5u# fi;
+adjust_fit(0,0); pickup fine.nib;
+x0=0; x2-.5stem=hround(1.5u-.5stem); y2 = 3/4x_height; pos2(stem,0) ;
+pos4(hair,-180); pos5(vair,-90); pos6(curve,0); pos7(vair,90);
+x4=x2; rt x6r=hround(w-1.5u+.5curve); x5=x7=.5[x4,x6];
+bot y5r=-oo; top y7r=vround(x_height)+oo; y4=y6=.5[y5,y7];
+filldraw stroke super_arc.e(4,5) & pulled_arc.e(5,6)
+ & pulled_arc.e(6,7) & super_arc.e(7,4); % bowl
+pickup tiny.nib; pos2'(stem,0); pos3(stem,0);
+z2=z2'; x3=x2; bot y3=-d; filldraw stroke z2'e--z3e; % stem
+dish_serif(3,2',a,1/3,.75jut,b,1/3,jut); % serif
+x10 = x2 ; pos10(stem,0) ; top y10 =h ; % and top of stem
+filldraw stroke z10e -- z2e ; sloped_serif.l(10,2,c,1/3,jut,serif_drop) ;
+math_fit(-min(2/3x_height#*slant-.5hair#-.5u#,
+ 2u#-.5stem#-desc_depth#*slant),ic#);
+penlabels(0,1,2,3,4,5,6,7); endchar;
+
diff --git a/fonts/cmoefont/oerm.mf b/fonts/cmoefont/oerm.mf
new file mode 100644
index 0000000000..3cce1d1f8b
--- /dev/null
+++ b/fonts/cmoefont/oerm.mf
@@ -0,0 +1,70 @@
+
+% old english driver
+
+% The Computer Modern Roman family of fonts (by D. E. Knuth, 1979--1985)
+
+if ligs>1: font_coding_scheme:="TeX text";
+ spanish_shriek=oct"074"; spanish_query=oct"076";
+else: font_coding_scheme:=if ligs=0: "TeX typewriter text"
+ else: "TeX text without f-ligatures" fi;
+ spanish_shriek=oct"016"; spanish_query=oct"017"; fi
+
+mode_setup; font_setup;
+
+input oerml ; % old e
+input oermu; % upper case (majuscules)
+input ogonek ; % ogonek accent
+%input romanl; % lower case (minuscules)
+%input greeku; % upper case Greek letters
+%input romand; % numerals
+%input romanp; % ampersand, question marks, currency sign
+%input romspl; % lowercase specials (dotless \i, ligature \ae, etc.)
+%input romspu; % uppercase specials (\AE, \OE, \O)
+%input punct; % punctuation symbols common to roman and italic text
+%input accent; % accents common to roman and italic text
+%if ligs>1: input romlig; fi % letter ligatures
+%if ligs>0: input comlig; fi % ligatures common with italic text
+%if ligs<=1: input romsub; fi % substitutes for ligatures
+
+%ligtable "!": "`" =: spanish_shriek;
+%ligtable "?": "`" =: spanish_query;
+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 "k": if serifs: "v": "a" kern -u#, fi\\"w": "e" kern k#,
+% "a" kern k#, "o" kern k#, "c" kern k#;
+% ligtable "P": "A" kern kk#,
+% "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
+% "K": "X": "O" kern k#, "C" kern k#, "G" kern k#, "Q" kern k#;
+% 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#;
+% ligtable "O": "D": "X" kern k#, "W" kern k#, "A" kern k#,
+% "V" kern k#, "Y" kern k#;
+% 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 "A": if serifs: "R": fi\\ "t" kern k#,
+% "C" kern k#, "O" kern k#, "G" kern k#, "U" kern k#, "Q" kern k#,
+% "L": "T" kern kk#, "Y" kern kk#, "V" kern kkk#, "W" kern kkk#;
+% ligtable "g": "j" kern -k#; % logjam
+% ligtable "I": "I" kern -k#; % Richard III
+fi
+% % there are ligature/kern programs for |"f"| in the {\tt romlig} file
+% % and for |"-"|, |"`"|, and |"'"| in the {\tt comlig} file
+bye.
diff --git a/fonts/cmoefont/oerml.mf b/fonts/cmoefont/oerml.mf
new file mode 100644
index 0000000000..0506e0e1db
--- /dev/null
+++ b/fonts/cmoefont/oerml.mf
@@ -0,0 +1,128 @@
+
+cmchar "The letter thorn";
+beginchar("t",10u#+serif_fit#,asc_height#,desc_depth#);
+italcorr .5x_height#*slant+min(.5curve#-u#,-.25u#);
+adjust_fit(serif_fit#,0);
+pickup tiny.nib; pos1(stem',0); pos2(stem,0);
+pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
+lft x1l=hround(2.5u-.5stem'); top y1=h ;
+numeric edge; edge=rt x2r;
+pickup fine.nib; pos3(if hefty:thin_join else: hair fi,180);
+pos4(vair',90); pos5(curve,0); pos6(vair,-90); penpos7(x3l-x3r,-180);
+rt x3l=max(rt x3l-(lft x3r-tiny.lft x2l), 1/3[rt x2,edge]);
+y3=1/8[bar_height,x_height];
+x4l=w-.5(w-serif_fit)+.5u; top y4r=x_height+oo;
+rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.5x_height;
+x6l=x4l-.2u; bot y6r=-oo;
+x7=x3; y7=min(y3,y6+y4-y3+.6vair);
+(x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
+(x',y6r)=whatever[z7l,z6l]; x6r:=min(x',.5[x5r,x6]);
+filldraw stroke z3e{up}...{right}z4e&super_arc.e(4,5)
+ &super_arc.e(5,6)&z6e{left}...{up}z7e; % bowl
+y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
+pickup tiny.nib; bot y2=-d;
+filldraw stroke z1e--z0'e--z0e--z2e; % stem
+pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
+z7'=z2; x8l=x7'l; bot y8=0;
+filldraw stroke z7'e--z8e; % point
+if serifs: sloped_serif.l(1,0',a,1/3,jut,serif_drop); % upper serif
+ dish_serif(2,0,b,1/3,jut,c,1/3,jut); fi % lower serif
+penlabels(0,1,2,3,4,5,6,7,8); endchar;
+
+
+cmchar "The letter edh";
+beginchar("d",9u#,asc_height#,0);
+italcorr .7x_height#*slant + u# ;
+adjust_fit(if monospace: .5u#,.5u# else: 0,0 fi);
+oh := vround x_height ;
+penpos1(vair,90); penpos3(vair',-90);
+penpos2(curve,180); penpos4(curve,0); penpos4'(hair,0) ;
+x2r=hround max(.5u,1.25u-.5curve);
+x4r=w-x2r; x1=x3=.5w; y1r=oh + vround 1.5oo; y3r=-oo;
+y2=y4=.5oh-vair_corr; y2l:=y4l:=.52oh;
+x4'l = x4l ; y4 = y4' ;
+penstroke pulled_arc.e(1,2) & pulled_arc.e(2,3)
+ & pulled_arc.e(3,4) -- pulled_arc.e(4',1) & cycle; % bowl
+fill z4l -- z4r -- z4-(0,u) -- cycle ; % fill in a little gap!
+penpos5(.5[vair,hair],40) ;
+x5 = 3u ; top y5r = h ;
+penstroke z5e .. tension 1.1 and 0.9 .. z4e{down} ;
+path p ;
+p = z5 .. tension 1.1 and 0.9 .. z4{down} ;
+z6 = ((0,.6[x_height,asc_height]) -- (w,.5[x_height,asc_height]))
+ intersectionpoint p ;
+penpos6'(.5[vair,hair],-60) ; penpos 6''(.5[vair,hair],-60) ;
+top y6''l = h ; z6'' = z6 + whatever*dir30;
+z6 = .5[z6',z6''] ; filldraw stroke z6'e -- z6''e ;
+penlabels(1,2,3,4,5,6,6',6''); endchar;
+
+
+cmchar "The letter yogh";
+beginchar("g",9u#,x_height#,desc_depth#);
+italcorr x_height#*slant-.5serif_fit#-.3u#;
+adjust_fit(0,0);
+numeric arm_thickness,arm_thickness#,z_stem ;
+arm_thickness# = .7[hair#,stem#] ;
+define_whole_vertical_blacker_pixels(arm_thickness) ;
+z_stem = .1[vair,stem] ;
+pickup tiny.nib; rt x1r=rt x2r=hround(w-1.2u);
+top y1=h; y2=min(y1,h-2/3arm_thickness);
+lft x3l = hround .45w ; y3 = .7bar_height ;
+numeric alpha; alpha=diag_ratio(1,z_stem-tiny,y2-y3,x2r-x3l-slant*(y2-y3));
+penpos1(alpha*(z_stem-tiny),0); penpos2(alpha*(z_stem-tiny),0);
+penpos3(alpha*(z_stem-tiny),0);
+pair delta; delta=penoffset z3-z1 of currentpen;
+fill top lft z1l--z1l+delta---z3l+delta..lft z3l
+ ..bot z3r--z3r-delta---rt z1r..top z1r
+ ---cycle; % diagonal
+z99 = rt z1r ; z98 = z99 + (u,0) ; % for cutting away
+z97 = z99 + 2u*(z3-z1) ; z96 = z97 + (u,0) ;
+pickup crisp.nib; pos5(arm_thickness,90); pos6(hair,180);
+top y5r=h; x5=x1; lft x6r=hround .75u; y6=good.y(y5l-beak/1.6)-eps;
+arm(5,6,a,beak_darkness,-.4beak_jut); % upper arm and beak
+% now cut away the excess arm
+erase fill z99 --- z98 --- z96 --- z97 --- cycle ;
+pickup fine.nib ;
+pos10'(vair,90) ; pos11(curve,0) ;
+pos12(.1[vair,curve],-90) ;
+z10' - z3 = whatever*dir 30 ;
+x10' = x3 + u ; x10 = x10' ; y10r = good.y y10'r ; pos10(vair,90) ;
+bot y12r = -d-oo ; x12 = .5w ;
+y11 = .5[y10,y12] ; rt x11r = hround(w-.9u) ;
+z3' = z3 ; z3'l = z3r ; z3'r = z3l ;
+filldraw stroke z3'e .. z10e{right} ;
+filldraw stroke pulled_arc.e(10,11) & pulled_arc.e(11,12) ;
+if serifs: pos13(hair,-180) ; y13=-.1d ; lft x13r = hround .8u ;
+ pos14(flare,-180) ; bulb(12,13,14) ;
+else: pos13(5/7[vair,flare],angle(-3u,-h)) ;
+lft x13r = hround .9u ; y13 = -.1d ;
+x13l := good.x x13l ; y13l := good.y y13l ;
+filldraw stroke term.e(12,13,left,1,4) ; fi
+penlabels(1,2,3,4,5,6,7,8,10,11,12,13,14); endchar;
+
+cmchar "Knuth's lowercase thorn";
+beginchar("u",10u#+serif_fit#,asc_height#,desc_depth#);
+italcorr .5x_height#*slant+min(.5curve#-.85u#,-.1u#);
+adjust_fit(serif_fit#,0);
+pickup tiny.nib; pos1(stem',0); pos2(stem,0);
+pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
+lft x1l=hround(2.5u-.5stem'); top y1=h;
+numeric edge; edge=rt x2r;
+pickup fine.nib; pos3(if hefty:thin_join else: hair fi,180);
+pos4(vair',90); pos5(curve,0); pos6(vair,-90);
+rt x3l=1/3[rt x2,edge]; y3=1/8[bar_height,x_height];
+x4l=w-.5(w-serif_fit)+.5u; top y4r=x_height+oo;
+rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.5x_height;
+x6=x3; bot y6r=-oo;
+(x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
+filldraw stroke z3e{up}...{right}z4e&super_arc.e(4,5)
+ &z5e{down}...{5(x6-x5),y6-y5}z6e; % bowl
+y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
+pickup tiny.nib; bot y2=-d;
+filldraw stroke z1e--z0'e--z0e--z2e; % stem
+pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
+z7'=z2; x8l=x7'l; bot y8=0;
+filldraw stroke z7'e--z8e; % point
+if serifs: sloped_serif.l(1,0',a,1/3,jut,serif_drop); % upper serif
+ dish_serif(2,0,b,1/3,jut,c,1/3,0); fi % lower serif
+penlabels(0,1,2,3,4,5,6,8); endchar;
diff --git a/fonts/cmoefont/oermu.mf b/fonts/cmoefont/oermu.mf
new file mode 100644
index 0000000000..2a20280e23
--- /dev/null
+++ b/fonts/cmoefont/oermu.mf
@@ -0,0 +1,88 @@
+cmchar "The letter Yogh";
+beginchar("G",11u#,cap_height#,0);
+italcorr cap_height#*slant-.5serif_fit#-.3u#;
+adjust_fit(0,0);
+numeric arm_thickness,arm_thickness#,z_stem;
+arm_thickness# = .7[cap_hair#,cap_stem#] ;
+define_whole_vertical_blacker_pixels(arm_thickness) ;
+z_stem = .1[vair,cap_stem] ;
+pickup tiny.nib; rt x1r=rt x2r=hround(w-1.2u);
+top y1=h; y2=min(y1,h-2/3arm_thickness);
+lft x3l = hround .45w ; bot y3 = vround .6h ;
+numeric alpha; alpha=diag_ratio(1,z_stem-tiny,y2-y3,x2r-x3l-slant*(y2-y3));
+penpos1(alpha*(z_stem-tiny),0); penpos2(alpha*(z_stem-tiny),0);
+penpos3(alpha*(z_stem-tiny),0);
+pair delta; delta=penoffset z3-z1 of currentpen;
+fill top lft z1l--z1l+delta---z3l+delta..lft z3l
+ ..bot z3r--z3r-delta---rt z1r..top z1r
+ ---cycle; % diagonal
+z99 = rt z1r ; z98 = z99 + (u,0) ; % for cutting away
+z97 = z99 + 2u*(z3-z1) ; z96 = z97 + (u,0) ;
+pickup crisp.nib; pos5(arm_thickness,90); pos6(cap_hair,180);
+top y5r=h; x5=x1; lft x6r=hround .75u; y6=good.y(y5l-beak/1.6)-eps;
+arm(5,6,a,beak_darkness**.8,-.4beak_jut); % upper arm and beak
+% now cut away the excess arm
+erase fill z99 --- z98 --- z96 --- z97 --- cycle ;
+pickup fine.nib ;
+pos10'(vair,90) ; pos11(cap_curve,0) ;
+pos12(.1[vair,cap_curve],-90) ;
+z10' - z3 = whatever*dir 30 ;
+x10' = x3 + u ; x10 = x10' ; y10r = good.y y10'r ; pos10(vair,90) ;
+bot y12r = -o ; x12 = .5w ;
+y11 = .5[y10,y12] ; rt x11r = hround(w-.9u) ;
+z3' = z3 ; z3'l = z3r ; z3'r = z3l ;
+filldraw stroke z3'e .. z10e{right} ;
+filldraw stroke pulled_arc.e(10,11) & pulled_arc.e(11,12) ;
+if serifs: pos13(hair,-180) ; y13=.8bar_height ; lft x13r = hround .8u ;
+ pos14(flare,-180) ; bulb(12,13,14) ;
+else: pos13(5/7[vair,flare],angle(-3u,-h)) ;
+lft x13r = hround .9u ; y13 = .8bar_height ;
+x13l := good.x x13l ; y13l := good.y y13l ;
+filldraw stroke term.e(12,13,left,1,4) ; fi
+penlabels(1,2,3,4,5,6,7,8,10,11,12,13,14); endchar;
+
+cmchar "The letter Thorn" ;
+beginchar("T",12u#,cap_height#,0);
+italcorr .7cap_height#*slant-.5u#;
+adjust_fit(cap_serif_fit#,0);
+pickup tiny.nib; penpos1(cap_stem-tiny,0); penpos2(cap_stem-tiny,0);
+pos0(cap_stem',0); pos0'(cap_stem,0);
+pos8(cap_stem',0); pos8'(cap_stem,0);
+lft x1l=hround max(2u,3u-.5cap_stem'); top y1=h; bot y2=0;
+x1l=x2l=x0l=x0'l=x8l=x8'l; y0=y0'=y7; y8=y8'=y3;
+penpos3(.5[vair,cap_band],90); penpos4(.5[vair,cap_band],90);
+penpos5(cap_curve if hefty:-3stem_corr fi,0);
+penpos6(.5[vair,cap_band],-90); penpos7(.5[vair,cap_band],-90);
+y4=y3; y5=.5[y4l,y6l]; y6=y7;
+x3=x1 ; .5[y3r, y7r]=vround .52h; y3r = vround 0.78h ;
+x7=x2; x4=x6=.5w+.75u; x5r=hround(w-u);
+x4l:=x6l:=x4-.25cap_curve;
+filldraw stroke z1e--z8'e--z8e--z0e--z0'e--z2e; % stem
+fill stroke z3e..pulled_arc.e(4,5) & pulled_arc.e(5,6)..z7e; % lobe
+if serifs: dish_serif(1,0,a,1/3,cap_jut,b,1/3,cap_jut); % upper serif
+ dish_serif(2,0',c,1/3,cap_jut,d,1/3,cap_jut); fi % lower serif
+math_fit(0,ic#-2.5u#); penlabels(0,1,2,3,4,5,6,7); endchar;
+
+cmchar "The letter Edh";
+beginchar("D",13.5u#,cap_height#,0);
+italcorr .7cap_height#*slant-.5u#;
+adjust_fit(cap_serif_fit#,0);
+pickup tiny.nib; pos1(cap_stem',0); pos2(cap_stem',0);
+lft x1l=lft x2l=hround max(2u,3u-.5cap_stem'); top y1=h; bot y2=0;
+filldraw stroke z1e--z2e; % stem
+penpos3(cap_band,90); penpos4(cap_band,90);
+penpos5(cap_curve-stem_corr,0);
+penpos6(cap_band,-90); penpos7(cap_band,-90);
+z3r=top z1; y4=y3; y5=.51[y4,y6]; y6=y7;
+z7r=bot z2; x4=x6=.5w+.25u; x5r=hround(w-u);
+x4l:=x6l:=x4-.25cap_curve;
+fill stroke z3e..pulled_arc.e(4,5) & pulled_arc.e(5,6)..z7e; % lobe
+if serifs: nodish_serif(1,2,a,1/3,cap_jut,b,1/3,.5cap_jut); % upper serif
+ nodish_serif(2,1,c,1/3,cap_jut,d,1/3,.5cap_jut); fi % lower serif
+pickup crisp.nib ; % now the edh bar
+pos8(cap_band,90) ; pos9(cap_band,90) ;
+top y8r = vround(.52h + .5cap_band) ; y9 = y8 ;
+lft x8 = 0 ; x1 - x8 = x9 - x1 ;
+filldraw stroke z8e --- z9e ;
+math_fit(0,ic#-.5u#); penlabels(1,2,3,4,5,6,7); endchar;
+
diff --git a/fonts/cmoefont/oesc.mf b/fonts/cmoefont/oesc.mf
new file mode 100644
index 0000000000..f59f3aad64
--- /dev/null
+++ b/fonts/cmoefont/oesc.mf
@@ -0,0 +1,44 @@
+% Caps and Small Caps in Computer Modern Roman
+%%% changed for old english
+
+font_coding_scheme:=if ligs=0: "TeX typewriter text"
+ else: "TeX text without f-ligatures" fi;
+spanish_shriek=oct"016"; spanish_query=oct"017";
+
+mode_setup; font_setup;
+input oermu; % upper case (majuscules)
+%input greeku; % upper case greek letters
+%input romand; % numerals
+%input romanp; % ampersand, question marks, currency sign
+%input romspu; % uppercase specials (\AE, \OE, \O)
+%input punct; % punctuation symbols common to all roman and italic
+%input accent; % accents common to roman and italic text
+%input romsub; % substitutes for ligatures
+input ogonek; % ogonek accent
+%if ligs>0: input comlig; fi % ligatures common with italic
+
+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#; fi
+
+%%% fine lower
+forsuffixes $= u, width_adj, cap_serif_fit, letter_fit,
+ body_height, cap_height, x_height, bar_height, comma_depth,
+ flare, cap_hair, stem, cap_stem, cap_curve, cap_ess,
+ cap_jut, beak_jut, beak, slab, cap_bar, cap_band, cap_notch_cut,
+ o, apex_o: $.#:=lower.$.#; endfor
+fudge:=lower.fudge;
+font_setup; % now try again with |lower| settings
+extra_endchar:=extra_endchar&"charcode:=charcode+code_offset";
+code_offset:=ASCII"a" - ASCII"A";
+input oermu; % majuscules (in lowercase positions)
+%code_offset:=-3;
+%input romspu; % \AE, \OE, \O\ (in positions of \ae, \oe, \o)
+code_offset:=0;
+%input cscspu; % substitutes for the remaining characters of romspl
+bye.
diff --git a/fonts/cmoefont/ogonek.mf b/fonts/cmoefont/ogonek.mf
new file mode 100644
index 0000000000..64a2fca7e7
--- /dev/null
+++ b/fonts/cmoefont/ogonek.mf
@@ -0,0 +1,17 @@
+cmchar "ogonek accent" ;
+beginchar("n",8u#,0,.875desc_depth#) ;
+adjust_fit(0,0) ;
+x1 = .5w+ 1.5u ;
+if serifs: pickup crisp.nib; pos1(hair,-25);
+pos2(.8[vair,stem],45) ; pos3(vair,140) ;
+x1 = x2+.5u ; y2 = .8[y1,y5] ;
+ rt x3l = w ; y3 = .4[y5,y1] ;
+ x5 = 2/5[x2,x3] ; bot y5 =-d ;
+pos5(.6[vair,stem],90) ;
+bot y1 = o ;
+lft x4l = hround(x1-u) ; y4 = .5[y1,y2] ;
+pos4(.4[hair,stem],0) ;
+filldraw stroke z1e ..tension 1.2 .. z4e ..z2e .. z5e ..tension 1.2 .. z3e ;
+fi
+penlabels(1,2,3,4,5);
+endchar ;
diff --git a/fonts/cmoefont/readme b/fonts/cmoefont/readme
new file mode 100644
index 0000000000..30a2b57752
--- /dev/null
+++ b/fonts/cmoefont/readme
@@ -0,0 +1,23 @@
+This directory contains programs for Old English letters.
+
+The fonts created have:
+D capital eth
+d eth
+T capital thorn
+t thorn
+G capital yogh
+g yogh
+n Polish ogonek accent
+
+The thorn is the style that looks like p and b combined. The roman derived
+fonts (i.e. not cmoeti10) also have
+u lower-case thorn with side bowl pointing top right (the traditional shape;
+ I happen to think that the other shape blends better with CM); this code
+ is Knuth's, from the cmman font.
+
+
+To make the fonts, just run Metafont on cmoer10 etc; other sizes and styles
+can be make by adapting the CM parameter and driver files in the obvious way.
+
+Julian Bradfield
+jcb@lfcs.ed.ac.uk