diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/fge/fgerm.mf |
Initial commit
Diffstat (limited to 'fonts/fge/fgerm.mf')
-rw-r--r-- | fonts/fge/fgerm.mf | 1516 |
1 files changed, 1516 insertions, 0 deletions
diff --git a/fonts/fge/fgerm.mf b/fonts/fge/fgerm.mf new file mode 100644 index 0000000000..8e121eee21 --- /dev/null +++ b/fonts/fge/fgerm.mf @@ -0,0 +1,1516 @@ +% fgerm.mf : fge roman charcters +% J.J. Green 2005-2006 + +mode_setup; +font_setup; + +proofing := 2; + +% The Russell class -- the class of all classes which +% are not members of themselves. + +cmchar "Overturned A"; +beginchar("A", 13u#, x_height#, desc_depth#); + adjust_fit(cap_serif_fit#, cap_serif_fit#); + + numeric left_stem, right_stem, outer_jut, alpha; + right_stem = cap_stem-stem_corr; + left_stem = min(cap_hair, right_stem); + outer_jut = 0.8cap_jut; + + w-x1l = x4r = l+letter_fit+outer_jut+0.5u; + y1 = y4 = h; + x2-x1 = x4-x3; + x3r = x2r+apex_corr; + y2 = y3 = -d-apex_o-apex_oo; + + alpha = diag_ratio(2, left_stem, y2-y1, x4r-x1l-apex_corr); + penpos1(alpha*left_stem, 180); + penpos2(alpha*left_stem, 180); + penpos3(alpha*right_stem, 180); + penpos4(alpha*right_stem, 180); + + z0=whatever[z1r, z2r]=whatever[z3l, z4l]; + + fill z0--diag_end(0, 4l, 1, 1, 4r, 3r)--diag_end(4r, 3r, 1, 1, 2l, 1l) + --diag_end(2l, 1l, 1, 1, 1r, 0)--cycle; + + penpos5(whatever, angle(z2-z1)); z5=whatever[z1, z2]; + penpos6(whatever, angle(z3-z4)); z6=whatever[z3, z4]; + y6 = y5; + y5 = 5/12(h-y0); + y5r-y5l = y6r-y6l = cap_band; + + penstroke z5e--z6e; % bar line + + numeric inner_jut; + + % for the reversed serifs it is easier to introduce + % new control points which are "the right way around" + % since prime_points_inside() and dish_serif() + % have the left & right sides of the points hard-coded + + penpos11(alpha*left_stem, 0); + penpos12(alpha*left_stem, 0); + z11 = z1; + z12 = z2; + + penpos13(alpha*right_stem, 0); + penpos14(alpha*right_stem, 0); + z13 = z3; + z14 = z4; + + pickup tiny.nib; + prime_points_inside(11, 12); + prime_points_inside(14, 13); + + inner_jut = cap_jut; + + dish_serif(11', 12, a, 0.6, inner_jut, b, 1/2, outer_jut)(dark); + dish_serif(14', 13, c, 1/3, outer_jut, d, 1/2, inner_jut); + + penlabels(0, 1, 2, 3, 4, 5, 6); + +endchar; + +% rotated eszett + +beginchar(oct "031", 4.5u#+max(4.5u#, .5stem#+flare#+curve#), x_height#, desc_depth#); + adjust_fit(0, serif_fit#); + + pickup tiny.nib; + + pos1(stem', 0); + pos2(stem', 0); + + rt x1r = rt x2r = hround(w-2.5u+.5stem'); + top y1 = h; + y2 = y4 = 0.5[0, y3]; + + penpos3(vair-fine, 270); + fine.bot y3r = -d-oo; + + filldraw stroke z1e--z2e; % stem + + numeric stem_edge, curve'; + stem_edge = lft x1l; + curve' = hround .5[stem', curve]; + pickup fine.nib; + pos4(curve', 180); + pos5(vair, 90); + pos2'(stem', 0); + z2' = z2; + x3 = 0.5[x2, x4]; + lft x4r = hround(u); + bot y5l = 0; + rt x5 = hround(stem_edge-u); + filldraw stroke pulled_super_arc.e(2', 3)(.5superpull) + & pulled_super_arc.e(3, 4)(.5superpull) + & pulled_super_arc.e(4, 5)(.5superpull); % upper bowl + + pos5'(vair, 270); + z5' = z5; + pos6(curve', 180); + pos7(vair, 90); + lft x6r = hround(0.5u)+3eps; + y6 = .6x_height; + top y7r = x_height+oo; + pos8(hair, 0); + rt x8r = hround(stem_edge-.5u-1); + x7 = 0.4[rt x8r, x6]; + filldraw stroke pulled_super_arc.e(5', 6)(.5superpull) + & pulled_super_arc.e(6, 7)(.5superpull); % lower bowl + + pos9(5/7[vair, flare], 0); + y9-(x9-lft x9r) = vround 0.93x_height; + + bulb(7, 8, 9); % bulb + + dish_serif(1, 2, b, 0, epsilon, c, 1/3, jut); % serif + + penlabels(0, 1, 2, 3, 4, 5, 6, 7, 8); + +endchar; + +% rotated 2, 3, B, C, taken from romanu.mf +% +% here we use that +% u# := 20/36pt#; +% cap_height# := 246/36pt#; +% fig_height# := 232/36pt# +% and so cap_height/u = 11.6, fig_height/u = 12.3 + +cmchar "downward 2"; +beginchar("2", 14u#, x_height#, 0); + adjust_fit(0, 0); + + numeric arm_thickness, hair_vair; + + hair_vair = 0.25[vair, hair]; + arm_thickness = Vround(if hefty:slab+2stem_corr else:.4[stem, cap_stem] fi); + + pickup crisp.nib; + + pos7(arm_thickness, 0); + pos8(hair, 90); + rt x7r = hround(w-0.9u); + bot y7 = 0; + top y8r = h+o/2; + x8 = good.x(x7l-beak/2) - eps; + + varm(7, 8, a, 0.3beak_darkness, beak_jut); % arm and beak + + pickup fine.nib; + + pos2(slab, 180); + pos3(.4[curve, cap_curve], 90); + + lft x2r = 0.9u; + y2 = h/2; + top y3r = h+o/2; + x3 = x0; + + numeric bulb_diam; + bulb_diam=hround(flare+2/3(cap_stem-stem)); + + pos0(bulb_diam, -90); + pos1(cap_hair, -90); + + bot y0r = -o/2; + x1 + 0.5 bulb_diam = 1/3(w-1.8u) + 0.9u; + %(x2l, y) = whatever[z1l, z2r]; + %y2l := y; + dlbulb(2, 1, 0); % bulb and arc + + pos4(0.25[hair_vair, cap_stem], 90); + pos5(hair_vair, 90); + pos6(hair_vair, 90); + + x5 + arm_thickness = w - 0.9u; + x4 = 0.3[x5, x3]; + rt x6 = w - 0.9u - slab; + bot y6 = crisp.bot y7; + + z4l = whatever[z6l, (0.50w, y3l)]; + z5l = whatever[z6l, z4l]; + + % erase excess at left + erase fill z4l--z6l--bot z6l--(x4l, bot y6l)--cycle; + + % stroke + filldraw stroke z2e{up}..tension atleast .9 and atleast 1 + ..z3e{right}..{z5e-z4e}z4e--z5e--z6e; + + penlabels(0, 1, 2, 3, 4, 5, 6, 7, 8); +endchar; + +cmchar "upward 2"; +beginchar("4", 14u#, x_height#, 0); + adjust_fit(0, 0); + + numeric arm_thickness, hair_vair; + + hair_vair = 0.25[vair, hair]; + arm_thickness = Vround(if hefty:slab+2stem_corr else:.4[stem, cap_stem] fi); + + pickup crisp.nib; + + pos7(arm_thickness, 180); + pos8(hair, -90); + lft x7r = hround(0.9u); + top y7 = h; + bot y8r = -o/2; + x8 = good.x(x7l+beak/2) + eps; + + varm(7, 8, a, .3beak_darkness, -beak_jut); % arm and beak + + pickup fine.nib; + + pos2(slab, 0); + pos3(.4[curve, cap_curve], -90); + + rt x2r = w-0.9u; + y2 = h/2; + bot y3r = -o/2; + x3 = x0; + + numeric bulb_diam; + bulb_diam=hround(flare+2/3(cap_stem-stem)); + + pos0(bulb_diam, 90); + pos1(cap_hair, 90); + + top y0r = h+o/2; + x1 - 0.5 bulb_diam = 2/3(w-1.8u) + 0.9u; + %(x2l, y) = whatever[z1l, z2r]; + %y2l := y; + dlbulb(2, 1, 0); % bulb and arc + + pos4(0.25[hair_vair, cap_stem], -90); + pos5(hair_vair, -90); + pos6(hair_vair, -90); + + x5 = arm_thickness + 0.9u; + x4 = 0.3[x5, x3]; + lft x6 = 0.9u + slab; + top y6 = crisp.top y7; + + z4l = whatever[z6l, (0.50w, y3l)]; + z5l = whatever[z6l, z4l]; + + erase fill z4l--z6l--top z6l--(x4l, top y6l)--cycle; + + % stroke + filldraw stroke z2e{down}..tension atleast .9 and atleast 1 + ..z3e{left}..{z5e-z4e}z4e--z5e--z6e; + + penlabels(0, 1, 2, 3, 4, 5, 6, 7, 8); +endchar; + +cmchar "downward 3"; +beginchar("3", 14u#, x_height#, 0); + adjust_fit(0, 0); + + numeric top_thickness, mid_thickness, bot_thickness; + + top_thickness=max(fine.breadth, vround(slab-2vair_corr)); + mid_thickness=max(fine.breadth, vround 2/3vair); + bot_thickness=max(fine.breadth, vround(slab-vair_corr)); + + pickup fine.nib; + + pos2(top_thickness, 180); + lft x2r = 0.9u; + + pos3(max(fine.breadth, .6[curve, cap_curve]-stem_corr), 90); + top y3r=hround(h-0.75u+o); + + pos4(vair, 0); + pos5(vair, 0); + pos6(mid_thickness, 180); + y2 = y6 = y8 = 0.5[0.75u, y7]; + + pos7(cap_curve, 90); + top y7r = hround(h+o); + bot y5 = min(vround 3u, bot y6)-eps; + + pos8(bot_thickness, 0); + rt x8r = w-0.9u; + + x3 = 0.55[lft x4l, rt x2l]; + x7 = 0.5[lft x6l, rt x8l]; + lft x5l = hround(0.9u+.46(w-1.8u)-0.5vair); + + x5r = x6l; + + y4 = 1/3[y5, y3l]; + z4 = z5 + whatever*(-0.1fig_height, 15u); + + filldraw stroke pulled_super_arc.e(2, 3)(.5superpull) + & z3e{right}...z4e---z5e; % upper bowl + filldraw z5r--z6l--z6r--z5l---cycle; % middle tip + filldraw stroke pulled_super_arc.e(6, 7)(.5superpull) + & pulled_super_arc.e(7, 8)(.5superpull); % lower bowl + + numeric bulb_diam[]; + + bulb_diam1 = flare + 0.5(cap_stem-stem); + bulb_diam2 = flare + cap_stem-stem; + + pos0(bulb_diam1, -90); + pos1(hair, -90); + lft y0r = hround 0.25u; + x0 = x3; + + dlbulb(2, 1, 0); % upper bulb + + pos10(bulb_diam2, 270); + pos9(cap_hair, -90); + bot y10r = hround(-0.25u); + + x10 = 0.9u + 0.7(w-1.8u) + 0.5bulb_diam2; + + drbulb(8, 9, 10); % lower bulb + + penlabels(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); +endchar; + +cmchar "upward B"; +beginchar("D", 13u#, x_height#, 0); + + numeric left_stem, right_curve, middle_weight; + left_stem = cap_stem - hround 2stem_corr; + middle_weight = 0.6vair + 0.5; + + pickup tiny.nib; + + pos1(left_stem, -90); + pos2(left_stem, -90); + bot y1r = bot y2r = 0; + lft x1 = u; + rt x2 = w-u; + filldraw stroke z1e--z2e; % stem + + penpos3(cap_band, 180); + penpos4(cap_band, 180); + penpos6(middle_weight, 0); + penpos7(middle_weight, 0); + penpos8(middle_weight, 180); + penpos9(middle_weight, 180); + penpos5(right_curve-stem_corr, 90); + penpos10(right_curve, 90); + penpos11(cap_band, 0); + penpos12(cap_band, 0); + + z3r = lft z1; + x4 = x3; + x5 = 0.5[x4, x6]; + x6 = x7; + x8l-x7l = vair; + z12r = rt z2; + x11 = x12; + x10 = 0.5[x11, x9]; + x8 = x9; + 0.5[x7l, x8l] = u+0.48(w-2u); + y4 = y6; + y9 = y11 = y4+0.5u; + y7 = y8 = y1; + y9l := y4+0.25u; + y5r = vround(h+o-0.5u); + y10r = vround(h+o); + + right_curve = cap_curve-stem_corr; + y4 = 0.45[y1, h+o]; + + y6l := y6l-0.5u; + y11l := y11l-0.5u; + + fill stroke z3e..super_arc.e(4, 5) & super_arc.e(5, 6)..z7e; % upper lobe + fill stroke z8e..super_arc.e(9, 10) & super_arc.e(10, 11)..z12e; % lower lobe + + hserif(1, 2, a, 1/3, -cap_jut); + hserif(1, 2, b, 1/3, 1/2cap_jut); + hserif(2, 1, c, 1/3, -cap_jut); + hserif(2, 1, d, 1/3, 1/2cap_jut); + + math_fit(0, 0.5ic#); + penlabels(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + +endchar; + +cmchar "downward B"; +beginchar("B", 13u#, x_height#, 0); + + numeric left_stem, right_curve, middle_weight; + left_stem = cap_stem - hround 2stem_corr; + middle_weight = 0.6vair + 0.5; + + pickup tiny.nib; + + pos1(left_stem, -90); + pos2(left_stem, -90); + top y1l = top y2l = h; + rt x1 = w-u; + lft x2 = u; + filldraw stroke z1e--z2e; % stem + + penpos3(cap_band, 0); + penpos4(cap_band, 0); + penpos6(middle_weight, 180); + penpos7(middle_weight, 180); + penpos8(middle_weight, 0); + penpos9(middle_weight, 0); + penpos5(right_curve-stem_corr, -90); + penpos10(right_curve, -90); + penpos11(cap_band, 180); + penpos12(cap_band, 180); + + z3r = rt z1; + x4 = x3; + x5 = 0.5[x4, x6]; + x6 = x7; + x7l-x8l = vair; + z12r = lft z2; + x11 = x12; + x10 = 0.5[x11, x9]; + x8 = x9; + 0.5[x7l, x8l] = u+0.52(w-2u); + y4 = y6; + y9 = y11 = y4-0.5u; + y7 = y8 = y1; + y9l := y4+0.25u; + y5r = vround(0.5u-o); + y10r = vround(-o); + + right_curve = cap_curve-stem_corr; + y4 = 0.45[y1, -o]; + + y6l := y6l+0.5u; + y11l := y11l+0.5u; + + fill stroke z3e..super_arc.e(4, 5) & super_arc.e(5, 6)..z7e; % upper lobe + fill stroke z8e..super_arc.e(9, 10) & super_arc.e(10, 11)..z12e; % lower lobe + + hserif(1, 2, a, 1/3, cap_jut); + hserif(1, 2, b, 1/3, -1/2cap_jut); + hserif(2, 1, c, 1/3, cap_jut); + hserif(2, 1, d, 1/3, -1/2cap_jut); + + math_fit(0, 0.5ic#); + penlabels(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); + +endchar; + +% unlike the others there is no way to squeeze the +% rotated C to an x-height character, nor cap-height. +% So although on the baseline, this rather awkwardly +% ascends half way between them + +cmchar "upward C"; +beginchar("C", 13u#, cap_height#, 0); + adjust_fit(0, 0); + + pickup fine.nib; + + pos1(cap_hair, 90); + pos2(cap_band, 180); + pos3(cap_curve, -90); + pos4(cap_band, 0); + pos5(hair, 90); + + top y1r = top y5r = 0.5[x_height, h]; + bot y3r = -o; + y2 = y4 = 0.55[y3, y1]; + + lft x2r = u; + rt x4r = hround(w-u); + x3 = 0.5[x2, x4]; + + rt x1 = u + 0.4(w-2u); + lft x5 = w - u - 0.95(x1-u); + (x2l, y2l') = whatever[z2r, z1l]; y2l := min(y2l', y2l+.5u); + (x4l, y4l') = whatever[z4r, z5l]; y4l := min(y4l', y4l+.5u); + filldraw stroke z1e{10(x2-x1), y2-y1} + ...pulled_arc.e(2, 3) & pulled_arc.e(3, 4)...{left}z5e; % arc + + pos6(0.3[fine.breadth, cap_hair], 90); + y6r = y1r; + lft x6 = u; + y1r-y1'=2cap_curve-fine; + x1'=x1; + + path upper_arc; + + upper_arc=z1{10(x2-x1), y2-y1}..z2{down}; + + numeric t; + + t = xpart(upper_arc intersectiontimes (z6l--z1')); + + filldraw z1r--z6r--z6l--subpath(t, 0) of upper_arc--cycle; % barb + + math_fit(-.3cap_height#*slant-.5u#, .5ic#); + penlabels(1, 1', 2, 3, 4, 5, 6); +endchar; + +% fletched arrows, which are 4u longer than the cm +% right and up arrows. These are not identical -- the +% head on the upward arrow is slighty wider than the +% rightward + +numeric fwdt, fjut, fang; + +fwdt := 2/3 rule_thickness; +fjut := 1.3; +fang := 60; + +vardef fletch(suffix $, $$, @) = + fletchLR($, $$, @, fang, 90, fwdt, fjut); + fletchLR($, $$, @', -fang, -90, fwdt, fjut); +enddef; + +vardef fletchLR(suffix $, $$, @)(expr a, r, wdt, len) = + numeric b, c; + b := angle(z$$-z$); + z@1 = z$ + len * ((z$$-z$) rotated a); + z@2 = z@1 + whatever*((z$ - z@1) rotated r); + z@2 = z$$ + whatever*((z$$ - z$) rotated a); + z@3 = z@4 = z$; + c := angle(z@1-z@2); + penpos@1(wdt, c); + penpos@2(wdt, c+180); + penpos@3(wdt, b-r); + penpos@4(wdt, b+180); + penstroke z@4e--z@1e...z@2e{z$-z@1}...{z$-z$$}z@3e; + penlabels(@1, @2, @3); +enddef; + +cmchar "Upward arrow with fletching"; +beginchar(oct "042", 8u#, asc_height#+2u#, asc_depth#+2u#); + adjust_fit(0, 0); + + pickup crisp.nib; + + pos1(rule_thickness, 0); + pos2(rule_thickness, 0); + pos3(rule_thickness, 90); + pos4(rule_thickness, 90); + + numeric headh, headw; + + headw := (w-u)/2+eps; + headh := 0.36*w/(9u)*asc_height+eps; + + lft x1l = hround(0.5w - 0.5rule_thickness); + + x0 = x1 = x2; + top y0 = h; + x0-x3 = x4-x0 = headw; + y3 = y4 = y0 - headh; + + pos5(rule_thickness, angle(z4-z0)); + z5l=z0; + + pos6(rule_thickness, angle(z3-z0)); + z6l=z0; + z9 = 0.2[0.5[z3, z4], z0]; + + numeric rake; + + rake = y5l - y3r; + + y1 - 0.5 rule_thickness - rake = -d; + + numeric t; path p; + + p=z4l{z9-z4}..z6r; + t=xpart(p intersectiontimes((x2r, -d)--(x2r, h))); y2=ypart point t of p; + + filldraw z0..{z4-z9}z4r--subpath (0, t) of\\(z4l{z9-z4}..z6r) + ---z1r---z1l---subpath (t, 0) of\\(z3l{z9-z3}..z5r) + --z3r{z9-z3}..z0 & cycle; % arrowhead and stem + + penlabels(0, 2, 3, 4, 5, 6, 9); + + % fletching + + x10 = x11 = x12 = x13 = x1; + y11-y10 = y12-y11 = y13-y12 = 3/5rake; % fletch separation + y11 = y1; + + fletch(11, 10, a); + fletch(12, 11, b); + fletch(13, 12, c); + + labels(10, 11, 12, 13); + +endchar; + +cmchar "Rightward arrow with fletching"; +compute_spread(0.45x_height#, 0.55x_height#); +beginchar(oct "041", 22u#, v_center(spread#+rule_thickness#)); + adjust_fit(0, 0); + + pickup crisp.nib; + + pos1(rule_thickness, 90); + pos2(rule_thickness, 90); + pos3(rule_thickness, 0); + pos4(rule_thickness, 0); + + y0 = y1 = y2 = math_axis; + rt x0 = hround(w-u); + + numeric headw, headh; + + headw = 0.26 asc_height+eps; + headh = 4u + eps; + + y3-y0 = y0-y4 = headw; + x3 = x4 = x0 - headh; + + pos5(rule_thickness, angle(z4-z0)); + pos6(rule_thickness, angle(z3-z0)); + + z5l = z0; + z6l = z0; + z9 = 0.2[0.5[z3, z4], z0]; + + numeric rake; + + rake = x5l - x3r; + + x1 = hround(2u + 3/5rake); + + numeric t; path p; p=z4l{z9-z4}..z6r; + + t=xpart(p intersectiontimes((0, y2l)--(w, y2l))); x2=xpart point t of p; + + filldraw z0..{z4-z9}z4r--subpath (0, t) of\\(z4l{z9-z4}..z6r) + ---z1l---z1r---subpath (t, 0) of\\(z3l{z9-z3}..z5r) + --z3r{z9-z3}..z0 & cycle; % arrowhead and stem + + penlabels(0, 1, 2, 3, 4, 5, 6, 9); + + % fletching + + y10 = y11 = y12 = y13 = math_axis; + + x11-x10 = x12-x11 = x13-x12 = 3/5rake; + x11 = hround x1; + + fletch(11, 10, a); + fletch(12, 11, b); + fletch(13, 12, c); + + labels(10, 11, 12, 13); + +endchar; + +% these struckout numerals are lifted directly from +% romand.mf, with the strikeout added at the end + +cmchar "Reverse struckout 0"; +beginchar("0", 9u#, fig_height#, 0); + adjust_fit(0, 0); + + penpos1(vair, 90); + penpos3(vair, -90); + penpos2(curve, 180); + penpos4(curve, 0); + + interim superness := sqrt(more_super*hein_super); + + x2r = hround max(.7u, 1.45u-.5curve); + x4r = w-x2r; + x1 = x3 = 0.5w; + y1r = h+o; + y3r = -o; + y2=y4 = 0.5h-vair_corr; + y2l := y4l := 0.52h; + + penstroke pulled_arc.e(1, 2) + & pulled_arc.e(2, 3) + & pulled_arc.e(3, 4) + & pulled_arc.e(4, 1) & cycle; % bowl + + penlabels(1, 2, 3, 4); + + % the strikeout + + pickup rule.nib; + + bot y5 = 0; + top y6 = y1r + y3r; + x5 = x4r; + x6 = x2r; + + draw z5--z6; + labels(5, 6); + +endchar; + +cmchar "Reverse struckout 1"; +beginchar("1", 9u#, fig_height#, 0); + adjust_fit(0, 0); + + numeric light_stem; + light_stem=hround .4[stem', cap_stem']; + + pickup tiny.nib; + pos1(light_stem, 0); + pos2(light_stem, 0); + + lft x1l=lft x2l=hround(.5(w+.5u)-.5cap_stem'); + top y1=h+o; + bot y2=0; + + filldraw stroke z1e--z2e; % stem + + if not serifs: save slab; slab=bar; fi + + dish_serif(2, 1, a, 1/3, min(2.25u, lft x2l-1.5u), + b, 1/3, min(2.25u, w-1.25u-rt x2r)); % serif + + pickup crisp.nib; + + pos3(slab, -90); + pos4(bar, -90); + + top y3l=h+o; + top y4l=if monospace: .8 else: .9 fi\\ h+o; + + lft x4=max(1.25u, tiny.lft x1l-2.35u); + tiny.rt x1r=lft x3+.25[tiny, hair]; + + erase fill z3l{x4l-x3l, 3(y4l-y3l)}...z4l{left} + --(x4l, h+o+1)--(x3l, h+o+1)--cycle; % erase excess at top + + filldraw stroke z3e{x4e-x3e, 3(y4e-y3e)}..z4e{left}; % point + + penlabels(1, 2, 3, 4); + + % the strikeout -- possible raise z6 a little + + pickup rule.nib; + + y4r - top y5 = bot y6 - y2; + top y5 = x_height; + x5 = w-x6 = x4; + + draw z5--z6; + + labels(5, 6); + +endchar; + +% this is used with \mathaccent, but unlike the computer modern +% math accents it starts on the baseline, rather than at x_height. +% Knuth uses some dark magic in the cm sources to place this +% correctly with respect to the character to be accented, I couldn't +% reproduce it. So, this is like the cm accents, but with x_height +% subtracted from the heights +% +% This rather nice version (much better than my effort) was taken +% from ibyacc4.mf, part of the ibycus font for classical greek by +% Pierre A. MacKay, from work by Silvio Levy's realization of a +% classic Didot cut of Greek type from around 1800. + +def smooth(suffix $, @)(expr dot_size, depth, shear) = + pickup fine.nib; + + pos$(dot_size, 90); + pos@1(vair, 90); + pos@2(vair, 0); + pos@3(vair, -90); + + z@1r = z$r; + y@1l := y$; + rt x@2r = hround(x$ + 0.5 depth + 0.5 shear); + x@3 - 0.5 vair = hround(x$ - 0.5 dot_size + shear); + y@2 = 0.5[y@1, y@3]; + bot y@3r = vround(top y@1r - depth); + + path pp; + pp = (z@2{down}...z@3); + + % position a vertical path through the right side of the bulb + x@1' = x@1 + 0.5 dot_size; + + % At the intersection of that path with SL's tail, get the direction + pair d@@; + d@@ = (direction (xpart( + (z@2{down}...z@3) + intersectiontimes + ((x@1', 0){up}--(x@1', y@1)))) + of (z@2{down}...z@3)); + + % Tilt a pen at a right angle to that direction + pos@3'(vair, angle(d@@) + 90); + + % Place it at the intersection. This will be the new end of the tail. + z@3' = directionpoint d@@ of(z@2{down}...z@3); + y_ := ypart((z@1{right}...z@2{down}...z@3) + intersectiontimes (z$l{right}..{left}z$r)); + if y_ < 0: + y_ := 1; + fi + filldraw z$r{left}..subpath (0, y_) of (z$l{right}..{left}z$r)--cycle; % dot + filldraw stroke z@1e{right}...z@2e{down}...{d@@}z@3'e; + + penlabels(@1, @2, @3); +enddef; + +def rough(suffix $, @)(expr dot_size, depth, shear) = + pickup fine.nib; + + pos$(dot_size, 90); + pos@1(vair, 90); + pos@2(vair, 180); + pos@3(vair, -90); + + z@1r = z$r; + y@1l := y$; + lft x@2r = hround(x$ - 0.5 depth + 0.5 shear); + x@3 + 0.5 vair = x$ + 0.5 dot_size + shear; + y@2 = 0.5 [y@1, y@3]; + bot y@3r = vround(top y@1r - depth); + + % position a vertical path through the left side of the bulb + x@1' = x@1 - 0.5 dot_size; + + % At the intersection of that path with SL's tail, get the direction + pair d@@; + d@@ = ( direction (xpart( (z@2{down}...z@3) + intersectiontimes + ((x@1', 0){up}--(x@1', y@1)))) + of (z@2{down}...z@3)); + + % Tilt a pen at a right angle to that direction + pos@3'(vair, angle(d@@) - 90); + + % Place it at the intersection. This will be the new end of the tail. + z@3' = directionpoint d@@ of(z@2{down}...z@3); + y_ := ypart((z@1{left}...z@2{down}...z@3) + intersectiontimes (z$l{left}..{right}z$r)); + if y_ < 0: + y_ := 1; + fi + filldraw z$r{right}..subpath (0,y_) of (z$l{left}..{right}z$r)--cycle; % dot + filldraw stroke z@1e{left}...z@2e{down}...{d@@}z@3'e; + + penlabels(@1, @2, @3); +enddef; + +cmchar "Spiritus Lenis accent (tailed)"; +beginchar(oct "025", 9u#, min(asc_height#-x_height#, x_height#), 0); + + adjust_fit(0, 0); + + numeric dot_diam#; + dot_diam# = 3/4dot_size#; + define_whole_blacker_pixels(dot_diam); + + x1 = 0.5w - o; + y1 = h; + + smooth(1, a, dot_size, 3/4h, 0); + +endchar; + +% this is my effort -- closer to the form used by Pohl, +% a blunted crecent. + +cmchar "Spiritus Lenis accent (crescent)"; +beginchar(oct "026", 9u#, min(asc_height#-x_height#, x_height#), 0); + + numeric rake; + + rake = 10; + + penpos1(hair, 270+rake); + penpos2(0.3[hair, stem], 180); + penpos3(hair, 90-rake); + + x1 = x3 = 0.5w - o; + y1 = h; + y3l = max(h/3, o+hair); + y2+y2 = y1+y3; + x2 - x1 = 0.65*(y1-y3); + + penstroke z1e{dir(rake)}..z2e..{dir(180-rake)}z3e; + + penlabels(1, 2, 3); + +endchar; + +cmchar "Spiritus Asper accent (tailed)"; +beginchar(oct "023", 9u#, min(asc_height#-x_height#, x_height#), 0); + + adjust_fit(0, 0); + + numeric dot_diam#; + dot_diam# = 3/4dot_size#; + define_whole_blacker_pixels(dot_diam); + + x1 = 0.5w - o; + y1 = h; + + rough(1, a, dot_size, 3/4h, 0); + +endchar; + +cmchar "Spiritus Asper accent (crescent)"; +beginchar(oct "024", 9u#, min(asc_height#-x_height#, x_height#), 0); + + numeric rake; + + rake = 10; + + penpos1(hair, 90-rake); + penpos2(0.3[hair, stem], 180); + penpos3(hair, 270+rake); + + x1 = x3 = 0.5w - o; + y1 = h; + y3r = max(h/3, o+hair); + y2+y2 = y1+y3; + x1 - x2 = 0.65*(y1-y3); + + penstroke z1e{dir(180-rake)}..z2e..{dir(rake)}z3e; + + penlabels(1, 2, 3); + +endchar; + +% This is the archaic long s with mid bar, used by +% Frege as the successor functon. The upright stroke +% is that of Computer Modern's f, but the bar runs +% along the math-axis rather than the x-height. + +cmchar "Long s with midline bar"; +beginchar("s", 5.5u#, asc_height#, 0); + adjust_fit(0, 0); + + pickup tiny.nib; + pos1(stem', 0); + lft x1l = hround(2.5u-0.5stem'); + + pickup fine.nib; + numeric bulb_diam; + bulb_diam = hround 0.8[stem, flare]; + pos2(bulb_diam, 0); + y2 + 0.5bulb_diam = 0.9[x_height, h+oo]; + lft x2l = hround(w-0.75u+0.5); + + f_stroke(1, 2, a, b, c, jut, 1.25jut); + + pickup crisp.nib; + pos3(bar, 90); + pos4(bar, 90); + y3 = y4 = math_axis; + lft x3 = hround(0.5u - 1); + rt x4 = hround(w - 1/3u); + + filldraw stroke z3e--z4e; + + penlabels(1, 2, 3, 4); + +endchar; + +cmchar "Roman U with flourish"; +beginchar("U", 15u#, cap_height#, desc_depth#); + adjust_fit(cap_serif_fit#, cap_serif_fit#); + + numeric colsep; + + % distance between columns + + colsep := 0.20h; + + pickup fine.nib; + + % 4-1-2-3-5 is the main part of the U + + pos1(cap_stem, 180); + pos2(0.25[cap_hair, cap_stem], 270); + pos3(cap_hair, 0); + pos4(cap_stem, 180); + pos5(cap_hair, 0); + + x1r = w-x3r; + x3l - x1l = colsep; + + x4 = x1; + x3 = x5; + + x2 = 0.5(x1l+x3l); + y1 = y3 = 0.5(x3-x1)-d; + y2r = -d-o; + + % 6 & 7 control the bulb on the right arm of the U + % note that the top of the bulb is aligned with the + % height, not h+o -- that is on purpose + + pos6(cap_hair, 270); + pos7(cap_stem, 90); + + y4l = 0.72h; + y5l = 0.82h; + + x6 = x5 + 0.6colsep; + y6l = h; + + filldraw stroke z4e..z1e{down}..z2e{right}..z3e{up}..z5e; + vbulb(5, 6, 7); + + % 9-10-11-12 is the flourish + + pos9(cap_hair, 270); + + bot y9r = bot y10r = 0; + x9l = w-x10r = 0.5u; + + pos11(cap_hair, 50); + pos12(0.25[cap_hair, cap_stem], 270); + + x11l = x12 = x4 - 0.9colsep; + y11 = y4; + y12l = h+o; + + z11l-z10l = whatever*(z11r-z10r); + z9l-z10l = whatever*(z9r-z10r); + + z10 = 0.5[z10l, z10r]; + + % the curved stroke from the left arm of the U + + filldraw stroke z4e{up}..{left}z12e..{z10-z11}z11e; + + % the flourish itself + + filldraw stroke z9e--z10e; + filldraw stroke z10e--z11e; + + penlabels(1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12); + +endchar; + +% overturned c with spur; this is a modified version of +% the code in romanl.mf +% +% not sure I'm entirely happy with the spur + +cmchar "Overturned c with spur"; +beginchar("c", 8u#, asc_height#, 0); + adjust_fit(0, 0); + + pickup fine.nib; + + pos2(vair', 270); + pos4(vair', 90); + + x2 = x4 = 0.5(w-u); + bot y2r = -oo; + top y4r = vround(x_height + 1.5oo); + + pos3(curve, 0); + + rt x3r = w - hround max(0.6u, 1.35u - 0.5curve); + y3 = 0.5x_height; + + pos1(hair, 180); + pos0(flare, 180); + + y1 = x_height - + min(bar_height + 0.5flare + 2vair' + 2, + 0.9[bar_height, x_height] - 0.5flare); + + lft x1r = 0.7u; + + bulb(2, 1, 0); + + pos5(hair, 180); + lft x5r = 0.5u; + y5 = x_height - max(good.y(0.5bar_height-0.9), x_height-y4l-vair'); + (x, y4l) = whatever[z4r, z5l]; + x4l := min(x, x4l+.5u); + + filldraw stroke pulled_super_arc.e(2, 3)(0.7superpull) + & pulled_super_arc.e(3, 4)(0.5superpull) + ..tension .9 and 1..{x5-x4, 5(y5-y4)}z5e; + + path pth; + numeric tp, theta; + + theta = 25; + + pos6(stem, theta-90); + pos7(hair, 90+theta); + + top y6l = asc_height; + + pth = z4{left}..tension .9 and 1..{x5-x4, 5(y5-y4)}z5; + + z7 = directionpoint dir(180+theta) of pth; + x6 = x7; + + filldraw stroke z7e{dir(theta)}..{dir(180+theta)}z6e; + + penlabels(0, 1, 2, 3, 4, 5, 6, 7); + +endchar; + +cmchar "Overturned e with spur"; +beginchar("e", 7.25u#+max(0.75u#, 0.5curve#), asc_height#, 0); + adjust_fit(0, 0); + + numeric left_curve, right_curve, rbar_height; + + rbar_height = x_height - bar_height; + + left_curve + 6stem_corr = right_curve = curve; + + if right_curve<tiny.breadth: right_curve:=tiny.breadth; fi + if left_curve<tiny.breadth: left_curve:=tiny.breadth; fi + + pickup tiny.nib; + + pos1(left_curve, 180); + pos2(vair, 270); + pos3(right_curve, 0); + + y1 = good.y rbar_height; + bot y2r = -oo; + y0l = top y1; + lft x1r = hround max(0.5u, 1.25u-0.5left_curve); + rt x3r = hround min(w-0.5u, w-u+0.5right_curve); + x2 = 0.5w-0.25u; + + {{ + interim superness := more_super; + filldraw stroke super_arc.e(1, 2); + }}; + + y3 = 0.5 [y2, y4]; + top y4r = x_height + vround 1.5oo; + x4 = x2 + 0.25u; + + pos4(vair', 90); + pos5(hair, 180); + + y5 = min(good.y(0.5[rbar_height, x_height]+0.9), y4l-vair); + + x5r = x1r; + (x, y4l) = whathever[z4r, z5]; + x4l := min(x, x4l+0.5u); + + filldraw stroke pulled_arc.e(2, 3) & pulled_arc.e(3, 4) + ... {x5-x4, 5(y5-y4)}z5e; + + path testpath; + + testpath = super_arc.r(2, 3) & super_arc.r(3, 4); + + y1'r = y0r = y0l - 0.6[thin_join, vair]; + y1'l = y0l; + x1'l = x1'r = x1; + + forsuffixes $ = l, r: + x0$ = xpart(((w, y0$)--(x1, y0$)) intersectionpoint testpath); + endfor; + + fill stroke z0e--z1'e; + + path pth; + numeric tp, theta; + + theta = 25; + + pos6(stem, theta-90); + pos7(hair, 90+theta); + + top y6l = asc_height; + + pth = super_arc.r(3, 4) ... {x5-x4, 5(y5-y4)}z5; + + z7 = directionpoint dir(180+theta) of pth; + x6 = x7; + + filldraw stroke z7e{dir(theta)}..{dir(180+theta)}z6e; + + penlabels(0, 1, 2, 3, 4, 5, 6, 7); + +endchar; + +% Reverse solidus -- in contrast the the cm backslash +% this is stressed, an oblique slab of the width of +% capital stems. The dimensions also are those of +% capitals, whearas the cm backslash has the dimensions +% of delimiters. + +cmchar "Reverse solidus"; +beginchar(oct "113", 9u#, cap_height#, 0); + adjust_fit(0, 0); + + pickup fine.nib; + + pos1(cap_stem, 0); + pos2(cap_stem, 0); + + lft x1l = u; + rt x2r = w - u; + top y1 = cap_height; + bot y2 = 0; + + filldraw stroke z1e--z2e; + + penlabels(1, 2); + +endchar; + +% the left-angle, a funny looking thing, made from a single +% stroke of an eliptic pen. The upstroke is bowed inward, +% barely perceptibly + +cmchar "Left-angle"; +beginchar(oct "150", 11u#, cap_height#, 0); + adjust_fit(0, 0); + + numeric theta, bow, elbow; + + elbow := x_height + 0.5*(cap_height-x_height); + + x1 = x3 = w - 0.5u - 0.4cap_stem; + y1 = 0; cap_height - y3 = 0.4cap_stem; + y2 = elbow; + x2 = 0.5u + 0.4cap_stem; + + theta := angle(z2-z1)-90; + bow := 5; + + pickup pencircle xscaled cap_hair yscaled cap_stem rotated theta; + draw z1{dir(theta+90-bow)}...{dir(theta+90+bow)}z2--z3; + + penlabels(1, 2, 3); + +endchar; + +cmchar "Variant Infinity"; +beginchar("infty", 18u#, x_height#, 0); + adjust_fit(0, 0); + + numeric theta, psi; + theta = 70; + psi = 40; + + penrad = hair; + + y1 = y3 = y4 = y6 = 7/16x_height; + x1 = w - x6 = 0.5u + penrad; + 2x3 = 2x4 = x1 + x6; + 2x2 = x1 + x3; + 2x5 = x4 + x6; + y2 = y5 = penrad - oo; + + pickup pencircle scaled 2penrad; + + draw z1{dir(-theta)}...z2...{dir(theta)}z3; + draw z4{dir(-theta)}...z5...{dir(theta)}z6; + + penlabels(1, 2, 3, 4, 5, 6); + + % this is the overbar + + pickup fine.nib; + + pos7(hair, 90+psi); + pos8(2penrad, 90); + pos9(hair, 90-psi); + + x7 = w - x9 = 0.32[x1, x2]; + y7 = y9 = 11/16x_height; + 2x8 = x7 + x9; + top y8r = o + h; + + filldraw stroke z7e{dir psi}...z8e...{dir -psi}z9e; + + penlabels(7, 8, 9); + +endchar; + +% This is series of small cups, caps and bars. Although +% most of these are binary operators, Pohle sets these +% much tighter than the other operators in the text, but +% not quite as tight as ordinary terms. +% We simulate this behaviour by declaring them \mathord +% in the style file (rather than \mathbin), but add a liile +% extra spacing around them with cupcap_fit + +def cupcap_fit = adjust_fit(24/36pt#, 24/36pt#) enddef; + +cmchar "upwards opened bracket"; +beginchar(oct "114", 14u#, x_height#, 0); + cupcap_fit; + + pickup rule.nib; + + lft x1 = hround(u - eps); + x2 = w - x1; + bot y1 = bot y2 = 0; + + x3 = x1; + x4 = x2; + + y3 = y4 = 1/3x_height; + + draw z3--z1--z2--z4; + + labels(1, 2, 3); + +endchar; + +cmchar "Small bar acute"; +beginchar(oct "115", 10u#, x_height#, 0); + cupcap_fit; + + pickup rule.nib; + + lft x1 = hround(u - eps); + x2 = w - x1; + bot y1 = bot y2 = 0; + + draw z1--z2; + + labels(1, 2); + + pickup crisp.nib; + + x4 + 0.5stem = hround(2/3w); + x5 = 2/3[x4, w-x4]; + y4 + 0.5stem = x_height + oo; + y5 = 1/2x_height; + + numeric theta; + theta = angle(z5-z4) + 90; + pos4(stem, theta); + pos5(hair, theta); + + filldraw circ_stroke z4e--z5e; + + penlabels(4, 5); + +endchar; + +cmchar "Small cup"; +beginchar(oct "116", 10u#, x_height#, 0); + cupcap_fit; + + pickup rule.nib; + + lft x1 = hround(u - eps); + x2 = w - x1; + y1 = y2 = 0.5x_height; + x3 = good.x 0.5w; + bot y3 = -oo; + + draw z1..z3..z2; + + labels(1, 2, 3); + +endchar; + +cmchar "Small bar over cap"; +beginchar(oct "117", 10u#, x_height#, 0); + cupcap_fit; + + pickup rule.nib; + + lft x1 = hround(u - eps); + x2 = w - x1; + y1 = y2 = 1/3x_height; + x3 = good.x 0.5w; + y3 = 2/3x_height; + + draw z1..z3..z2; + + labels(1, 2, 3); + + x4 = x1; + x5 = x2; + + top y4 = top y5 = x_height; + + draw z4--z5; + + labels(4, 5); + +endchar; + +cmchar "Small cup over bar"; +beginchar(oct "120", 10u#, x_height#, 0); + cupcap_fit; + + pickup rule.nib; + + lft x1 = hround(u - eps); + x2 = w - x1; + top y1 = top y2 = x_height + oo; + x3 = good.x 0.5w; + y3 = 2/3x_height; + + draw z1..z3..z2; + + labels(1, 2, 3); + + x4 = x1; + x5 = x2; + + y4 = y5 = 1/3x_height; + + draw z4--z5; + + labels(4, 5); + +endchar; + +cmchar "Small cap over bar"; +beginchar(oct "121", 10u#, x_height#, 0); + cupcap_fit; + + pickup rule.nib; + + lft x1 = hround(u - eps); + x2 = w - x1; + y1 = y2 = 2/3x_height; + x3 = good.x 0.5w; + top y3 = x_height + oo; + + draw z1..z3..z2; + + labels(1, 2, 3); + + x4 = x1; + x5 = x2; + + y4 = y5 = 1/3x_height; + + draw z4--z5; + + labels(4, 5); + +endchar; + +cmchar "Small cup with acute"; +beginchar(oct "122", 10u#, x_height#, 0); + cupcap_fit; + + pickup rule.nib; + + lft x1 = hround(u - eps); + x2 = w - x1; + y1 = y2 = 1/3x_height; + x3 = good.x 0.5w; + bot y3 = -oo; + + draw z1..z3..z2; + + labels(1, 2, 3); + + pickup crisp.nib; + + x4 + 0.5stem = hround(2/3w); + x5 = 2/3[x4, w-x4]; + y4 + 0.5stem = x_height + oo; + y5 = 1/2x_height; + + numeric theta; + theta = angle(z5-z4) + 90; + pos4(stem, theta); + pos5(hair, theta); + + filldraw circ_stroke z4e--z5e; + + penlabels(4, 5); + +endchar; + +cmchar "Small raised cap"; +beginchar(oct "123", 10u#, x_height#, 0); + cupcap_fit; + + pickup rule.nib; + + lft x1 = hround(u - eps); + x2 = w - x1; + y1 = y2 = 0.5x_height; + x3 = good.x 0.5w; + top y3 = x_height + oo; + + draw z1..z3..z2; + + labels(1, 2, 3); + +endchar; + +end |