summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/knuth/errata/cm85.bug
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-05-23 00:17:44 +0000
committerKarl Berry <karl@freefriends.org>2009-05-23 00:17:44 +0000
commitcfd5aee575d84f09834ffcf92e5ad51c7cac38ca (patch)
tree9bb827d3c2a6f3d57148a6b4c9312a9f559acaaa /Master/texmf-dist/doc/generic/knuth/errata/cm85.bug
parentac7c62d7555a6cebca926dc51ebc39cb235982db (diff)
move tex-refs and knuth out of texmf-doc
git-svn-id: svn://tug.org/texlive/trunk@13409 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/generic/knuth/errata/cm85.bug')
-rw-r--r--Master/texmf-dist/doc/generic/knuth/errata/cm85.bug1906
1 files changed, 1906 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/knuth/errata/cm85.bug b/Master/texmf-dist/doc/generic/knuth/errata/cm85.bug
new file mode 100644
index 00000000000..d8cbea6442d
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/knuth/errata/cm85.bug
@@ -0,0 +1,1906 @@
+This file is a log of changes made to the "new generation" of Computer Modern
+fonts, after the first output proofs were ready. I had a great deal of
+advice from Neenie Billawala, Matthew Carter, and Richard Southall while
+I was making these revisions.
+
+Entries are in chronological order; thus the most recent news appears
+at the bottom of the file.
+
+-------------------------------------------------------------------------------
+ Changes based on the proofsheets of April 26, 1985
+ACCENT.MF:
+ lower the idots, umlauts, and tilde (MC)
+ Polish ell cross: longer stroke in bold
+CMBASE.MF:
+COMLIG.MF:
+ double quotes too close together in bold (MC)
+CSCSPU.MF:
+ SS made from two S's
+GREEKU.MF:
+ Gamma: .25u longer arm
+ Lambda: too narrow (MC,NB)
+ Xi: 1u wider; shorten middle serifs (MC)
+ top and bottom strokes to be arms (NB)
+ Psi: more super; thin the lower curve (MC)
+ add points 3' and 7' for crisp sans
+ Omega: redo the bottom, curl 0 becomes vertical (MC)
+ thin from hair to vair at points 3 and 5
+PUNCT.MF:
+ Monospace period, comma, colon, semicolon made heavier (MC)
+ROMAN.MF:
+ ligs=2 gets ff, fi, etc.; ligs=1 gets only --, '', etc.
+ II kerning introduced
+ kern between a and ' in csc
+ROMAND.MF:
+ 0: med_curve decreased to curve; y2l and y4l raised
+ 1: cap_bar changed to bar in the top stroke
+ sans-serif serifs also use bar as the slab height
+ 2: lighten cap_curve and cap_stem slightly (RS)
+ move point 3 down by .5vair (MC)
+ 4: thin the diagonal still more (NB)
+ bar line moves up one pixel when there's a serif below it
+ 6: move bulb to the right (MC)
+ make the lower left curve more_super (RS,NB)
+ 9: make the upper right curve more_super (RS,NB)
+ROMANL.MF:
+ a: bulb positioned by its center rather than the left (MC)
+ c: right terminals moved closer to the edge (MC,NB)
+ more pull on the inside left (RS)
+ e: less left sidebar in monospace (MC)
+ bold versions to be wider (MC)
+ more pull on inside left (MC,RS)
+ g: lower edge of loop goes one pixel lower
+ varg: point 6 raised above baseline (MC)
+ y0 calculated so that it works when x7l=stem_edge
+ lower arc goes one pixel lower
+ i: monospace version gets more left sidebar (MC)
+ dot moves slightly right (NB)
+ stem'' increased to stem' (MC,RS,NB)
+ slab replaces tiny in correction for dot-too-close
+ j: diminish monospace sidebars (MC)
+ shift slightly to right (MC)
+ k: serif right_jut decreased .8 to .6
+ bug fixed in alpha2 (had y1 not y11)(MC,RS,NB)
+ decreased diagonal weights
+ "if abs(angle(z3-z4)-45)<2:y4:=y3-(x3-x4);fi" rejected; moves y4 down too much
+ n: omit pull inside the arch (MC,RS)
+ introduce stem_shift, shifts this character and others slightly right (MC)
+ o: raise y2l and y4l (RS)
+ s: reduced sidebearing in sans (MC)
+ increased thickness at edges (.35 to .5) (RS)
+ changed to super_arc, and made it more_super (RS)
+ raised the top of upper barb to equal top of the character (RS)
+ removed typo (`tiny' for `fine')
+ reduced flare in upper terminal of sans, and rounded it properly
+ t: width to grow in bold case
+ height made independent of bar_height
+ slightly longer bar (MC)
+ v: decreased left stem (RS)
+ w: decreased stems (MC,RS)
+ monospace version drops middle from 2/3 to .6 and lengthens inner serifs
+ x: decreased left stem
+ y: decreased left stem
+ z: lighter diagonal, longer upper arm (MC,RS,NB)
+ROMANP.MF:
+ $: tau eliminated
+ROMANU.MF:
+ A: decrease right stem (MC)
+ make the bar thinner (MC,NB)
+ bar position based on y0 rather than bar_height
+ C: use cap_band instead of vair' at top and bottom (RS)
+ correct typo: x2l to be reset, not y2l
+ E: middle arm .35u longer, but beak reduced from .7 to .6 (MC)
+ F: top arm .25u longer; middle arm as E (MC)
+ G: same as C; also the bar is raised one pixel
+ J: slightly longer upper left serif
+ K: lower diagonal thinned and moved outward
+ M: monospace version raised still more in middle
+ N: diagonal thinned (MC,RS)
+ O: y2l and y4l raised
+ R: tail should move to the right (MC,RS,NB)
+ bold case gets wider (RS,NB)
+ S: changed as s (RS)
+ V: took stem_corr off the left stem (MC)
+ W: monospace version takes center down from 2/3 to .6, lengthens inner jut
+ X: took stem_corr off the left stem (MC)
+ Y: took stem_corr off the left stem (MC)
+ Z: diagonal made lighter in sans (MC)
+ upper arm made longer (MC,RS)
+ROMLIG.MF:
+ equalize stem weights (RS,NB)
+ROMSPL.MF:
+ ae, oe: incorporate changes of a and e and o
+ ss: more stem weight, less curve weight, less bulb (MC,NB)
+ dotless i,j: see i,j
+ROMSPU.MF:
+ AE: middle arm changes as E (MC)
+ if hefty and monospace, avoid the serif on middle arm
+ bars not aligned if hefty
+ if monospace, middle stem moves to right
+ OE: middle arm changes as in AE (MC)
+ middle stem lightened
+ROMSUB.MF:
+ blankspace: not so close to sides
+SYM.MF:
+CMR10.MF etc:
+ bar_height raised in the quote and bold fonts (MC,NB)
+ comma_depth in cmtt10 increased from 40 to 50 (MC)
+ cap_notch_cut decreased in cmsc10, cmsx10
+ apex_o decreased in cmr10, cmb10, cmbx10, cmbx5, cmcsc10, cmtt10
+ o decreased in cmb10
+ cap_jut decreased from 39 to 34 in cmb10; cap_serif_fit increased 5 to 6
+ cmbx5 gets smaller beak, fudge, cap_ess; more apex_corr
+GENERAL:
+ "robustness" added when points like x8r of "a" are calculated
+ (this affects a,b,d,varg,j,p,q,t,u,dj,ae,6,9,f_stroke)
+ "robustness" also added to avoid curl at end of paths
+ (this affects c,e,s,C,G,S,1,5,ae,oe,breve,parens)
+ "term" subroutine adds robustness for sans-serif terminals
+ (this affects C,G,J,S,f_stroke,j,ss,ae,oe,2,3,5,6,9,$,&,?,@)
+ code revised to use "pos" instead of "penpos" when possible
+ Changes based on the proofsheets of May and June, 1985
+ROMAND.MF:
+ 1: use o instead of apex_o
+ 4: bar line height shouldn't depend on bar_height
+ 5: sans-serif lower terminal position raised; depends on upper left edge
+ bug in arm at top (0 for 90) made all hefty arms too small
+ 9: disappears at link
+ROMANU.MF:
+ B: middle bar positioned by its middle, not its bottom (RS)
+ serifed lobes thickened slightly at bottom (RS)
+ C: lower terminal is tilted the other way
+ C,G: upper terminal in sans-serif is tilted slightly
+ upper barb is darkened
+ J: tilt the lower terminal
+ K: lighten the main diagonal (serif case) (RS)
+ lighten the upper diagonal (sans-serif case) (RS)
+ M: remove apex_corr (RS)
+ N: lighten the diagonal
+ P: too light below counter (RS)
+ Q: sharpen upper right corner of sans-serif tail (RS)
+ top of tail thickened and moved slightly left
+ S: less super at upper left and lower right (MC)
+ barb to go below baseline
+ barbs darkened
+ add weight at top, bottom in sans_serif version (RS)
+ tilt the lower terminal like the upper one
+ top weight needs to be maxed with fine.breadth
+ W: top middle stems allowed to overlap in serifed case
+ second inner serif made no longer than left outer serif (MC)
+ ceiling must become floor, to ensure that x5r>=x4r-mid_corr
+ Z: diagonal still too heavy, because previous change was ineffective
+ beaks made darker
+ better positioning of y2 and y3 when tiny is zero
+CSCSPU.MF:
+ J,SS: changes from J and S
+ROMANL.MF:
+ a: inappropriate uses of "fine" are removed
+ bh introduced to guard against "wild" bar heights
+ thin_join introduced at point 9
+ robustness logic changed so that x8l-x8r<=u
+ c: too much weight constrast between strokes in sans_serif (RS)
+ top terminal lowered to match a
+ bottom terminal tilted the other way
+ d: fine.breadth should have been thin_join as in b, p, q
+ e: 1+xpart changed to xpart
+ bottom terminal tilted the other way
+ g: sans-serif ear to use z0l and z0r
+ h,m,n: left inner serifs stay at jut length
+ i,l: mod_width for better fit at lowres
+ j: reposition stem for better fit (use .5w+2.5u, not w-2.5u)
+ remove bug in "pos" change
+ k: upper diagonal serif lengthened from 1.2jut to 1.4jut (RS)
+ diagonals made still lighter
+ r: thin_join introduced
+ s: barb to go below baseline
+ barbs darkened
+ add weight at top, bottom in sans_serif version (RS)
+ tilt the lower terminal like the upper one (RS)
+ top weight needs to be maxed with fine.breadth
+ t: bar extended still more at right (RS)
+ v: decreased the width by .25width_adj#
+ w: overlap allowed as in W
+ second inner serif made no longer than left outer serif (MC)
+ ceiling must become floor, to ensure that x5r>=x4r-mid_corr
+ x: decreased the width by .5width_adj# (RS)
+ y: sans-serif tail curls up too far (RS)
+ z: beaks too light; decrease the diagonal to compensate (RS)
+ better positioning of y2 and y3 when tiny is zero
+ROMSPL.MF:
+ dotless i and j: as i and j
+ ae and oe: bottom terminal tilted the other way
+ ae: corrected as a
+ROMSPU.MF:
+ AE: x12 based on x1l rather than x1, works better in bold cases (RS)
+ OE: left curve not to be pulled
+GREEKU.MF:
+ Phi and Psi: middle parts must keep away from the serifs
+ROMANP.MF:
+ $: strengthened the terminals in sans-serif case, and tilted them
+ &: opened the eye by moving point 8 left .5u (RS)
+ ?: tilted the sans-serif terminal and moved it down a little more
+PUNCT.MF:
+ %: move the diagonal a bit left at the top
+ ( and ): 3.5( changed to 3(.
+ [ and ]: round changed to ceiling and floor, avoids disappearing brackets
+ @: inner a placed by its edges instead of its stem centers (RS)
+ITALL.MF:
+ f: lower bulb moved left; .5 changed to .6 between bulb and stem
+ k: bug in lower right stroke (missing e's)
+ l: bug in italic correction for math fitting (u not u#)
+ m: avoid hooks in monospace version
+ p: lengthed left serif at bottom from .5jut to .75jut
+ x: bulbs moved .25u further out; .5 used between bulb and stem
+ w: avoid hook in monospace version
+ITALIG.MF:
+ all five: changed like f
+ fi: made 1u less wide
+ fl,ffl: made .5u less wide, bulb now touches the l stem
+ ffi: made .75u less wide
+GREEKL.MF:
+ beta, gamma, zeta, xi, omega, varepsilon: +eps at the tight turns
+ gamma: final diagonal should be more slanted (MC)
+ zeta: as tall as xi, shallower diagonal slant (MC)
+ kappa: bug in lower right stroke (missing e's)
+ xi: raise the bottom diagonal and distort arc slightly (MC)
+ chi: introduce slight curve in main diagonal stroke
+ varphi: too wide at right half bowl (MC)
+ITALMS.MF:
+ wp: bulb smaller, bottom a little more open
+ITALD.MF:
+ 5: changed like 5 in ROMAND
+OLDDIG.MF:
+ 2: top a bit narrower, bottom a bit wider (MC)
+ 5: changed like 5 in ROMAND
+SYM.MF:
+ plus-minus: shift depends on u not asc_height
+SYMBOL.MF:
+ minus-plus: shift depends on u not asc_height
+ up-and-down arrows (characters '154 and '155): taller and deeper
+ clubsuit: wider
+ spadesuit: y1+1 changed to y1+.75 (also in clubsuit)
+ROMAN.MF:
+ eliminated kerning between L and O,C,G,Q,U (also in TEXTIT and CSC)
+MATHEX.MF:
+ font_x_height needed to be set, for positioning of accents
+CMB10.MF:
+ dishing is too much (on all bold fonts)
+CMR5.MF:
+ letter_fit decreased 10 to 5
+CMBX5.MF:
+ fudge should be 1 (cap_stem 8=:7 in aps mode was too much)
+ decrease letter_fit drastically; this means f-ligatures must come back
+ lowercase parameters increased by 2/36
+CMBI10.MF:
+ lowercase serifs too short. (same change to all the italic fonts)
+CMSX10.MF:
+ decrease `ess' (RS)
+CMTC10.MF:
+ fudge is too much in lowercase
+CMCC10.MF:
+ lowercase more extended
+ much less letterspace in caps
+ increase lower.cap_curve, decrease lower.o
+CMSQI8.MF:
+ slope shouldn't be so much (RS)
+ increase `ess' (RS)
+
+GENERAL:
+ serif-abutment corrections changed to +1 instead of +2
+ vround used for vertical rounding
+
+CMBASE.MF:
+ new way to set shrink_fit (0,1,2) for monotonicity with letter_fit
+ letter_fit not included in mono_charwd
+ fine must be positive (else we lose barbs)
+ thin_join must be positive (else h_stroke gives a bad pos)
+ Changes based on the `version 0' test fonts of July 12
+[not showing hundreds of changes to the `typography' of the programs]
+
+Driver files in general:
+Frequency info (from MANUAL.TEX[tex,dek]) was used to order the ligtables
+font_xheight changed to font_x_height (a change to PLAIN.MF)
+
+Program files in general:
+ use `hround' instead of `round' wherever granularity might be wanted
+ less_rounded was taken out; autorounded occasionally put in
+ arm($,$$,...), the value of y$$ was adjusted by eps (lower) or -eps (upper)
+
+Parameter files in general:
+ new 12pt and 17+pt fonts; more sans serif fonts
+ new comment at bottom of all parameter files: `switch to the driver file'
+
+ACCENT.MF:
+ ^: eps subtracted from y1 (helps avoid degenerate equations in ultralowres)
+ '`: eps added to y1
+
+ROMAN.MF:
+ kern entry for gj had the wrong sign
+ kerns for v removed in sans serif
+ new kern for aj in serif case
+ new kern for ar in sans serif
+
+ROMAND.MF:
+ 3: pos3 needed to be maxed with fine.breadth
+ y1r,y9r needed to be adjusted by eps
+ 6,9: keep x1 on the correct side of x2 at lowlowres
+ (this change also affects OLDDIG, ITALD, and ITALMS partial sign)
+
+ROMANP.MF:
+ $: less_tense bulbs
+
+ROMSPL.MF:
+ ss: ensure x5 not > x4l at low resolutions
+
+ROMLIG.MF:
+ itc shouldn't include the slant...
+
+COMLIG.MF:
+ em dash should be one em wide (add letter_fit# to the adjustments)
+
+BIGOP.MF:
+ \displaystyle coproduct sign had 1.2bracket instead of 1.8bracket
+ charlist syntax changed from commas to colons
+
+BIGDEL.MF:
+ extensible double arrow: position wasn't computed as in top and bottom
+ charlist syntax changed from commas to colons
+
+BIGACC.MF:
+ charlist syntax changed from commas to colons
+
+ITALL.MF:
+ c: point 1 made definitely greater than point 2, for lowlowres
+ q: x4 increased by eps, for lowlowres path intersection
+ r: x4 based on w, not 5u
+ s: max(ess,fine.breadth)
+ add eps and 2eps for lowlowres case (cmmi6 at 100/in)
+
+ITALMS.MF:
+ wp: x6r must not be less than x1r at lowlowres
+
+TSETSL.MF:
+ gamma: last time's bugfix from GREEKL needs to be here too
+
+GREEKL.MF:
+ omega: add 2eps to x4-x6
+ lambda: make sure that y3>y4 at lowlowres
+ zeta: make sure that x2>x0 at lowlowres
+ varsigma: make sure that x1>x2 at lowlowres
+
+CMFIB8.MF:
+ decreased serif_fit, cap_serif_fit; increased curve, cap_curve
+
+CMBASE.MF:
+ l,r made newinternals
+ serif darkness and skew switches now done with boolean variables
+ comma and ammoc: 2eps addedto/subtractedfrom position of x@2
+ mod_width now called change_width
+ ess and cap_ess initialized to preserve ratios with stem and cap_stem
+ mode="string" had to be handled properly
+ ^ and ! changed to t_ and o_, as per new PLAIN conventions
+ make cmchar "outer"
+ t_ is now `relaxed' if it is useless
+ soft is now softjoin in PLAIN (we must set join_radius:=u)
+ eps is now in PLAIN
+ vair is vrounded but at least 1; also slab, etc.
+ cal nibs, yscaled by cap_hair not vair
+ autorounding and smoothing turned off
+
+ROMANL.MF:
+ a: `footed' version is .25u tighter at the right
+ b,d,varg,p,q: x4l position relative to .5(w-serif_fit) not 5u
+ e: testpath uses .r not .l (because of cmss10)
+ f: added 1 at right for monospace lowres versions
+ varg: robust sans-serif terminal at tail
+ m: missing `round' in r adjustment caused noninteger chardx
+ r: x4 based on w, not 5.25u
+ s: watch out that ess isn't so small that badpos error occurs (also ROMANU)
+ barbs made longer; based on middle stroke not just h
+ t: sans-serif terminal made more robust in extreme cases
+ w: in non-monospace hefty serif case, the middle point comes to .8h not h
+ y: robust sans-serif terminal at tail
+
+ROMANU.MF:
+ E: good.y used in y9
+
+PUNCT.MF:
+ []: side_thickness needed to be maxed with crisp.breadth
+ +1 or -1 makes lowres versions more distinctive
+ #: tricky part lost at low resolution
+
+SYMBOL.MF:
+ angle brackets: +1 and -1 to make lowres versions more distinctive
+ aleph: eps added so that y5 will be well defined at lowlowres
+
+SYM.MF:
+ integral sign: bulbs need to be in right direction at lowlowres
+
+CALU.MF:
+ A: apex moved slightly down
+ D: less flat at top, slightly lower lobe
+ F: u less right sidebar
+ H: soft corner at upper left
+ I: middle stroke more like J, upper bar a little further right
+ K: introduce t_ in case of aspect_ratio
+ L: darker
+ M: lighter first diagonal; clean the joins
+ N: lighter diagonal; clean bottom right; .5u less right sidebar
+ O: shortened the inner stroke
+ P: stem comes lower
+ Q: tail not so long at left
+ R: not so flat at top; diagonal less tense; tail less high
+ T: narrower, also changed like I, .5u less right sidebar,
+ heavier, not so high at right
+ U: less extreme curve at lower left
+ V: cleaned up at bottom; lighter first diagonal; slightly wider
+ W: changed like V, but double
+ X: new design, less rigid
+ Y: new design based more on V than U
+ Z: tighter at right, heavier at top and bottom
+
+CMSS10.MF:
+ decreased notch_cut and bar_height
+
+%Note: The following can presumably be deleted; I removed it from CMBASE because
+% I don't think it is used any more:
+vardef parallel_pos(expr d,u,v,w) = % point at distance $d$ from $u$,
+ % on the line through $w$ that's parallel to |u..v|
+ pair p_; p_=w+whatever*(u-v)=u+whatever*(u-v) rotated 90;
+ numeric d_; d_=length(u-p_); % distance from $w$ to |u..v|
+ if d_>=d: p_ else: p_+(d+-+d_)*unitvector(v-u) fi enddef;
+ Changes subsequent to `Version 1' as released on October 7, 1985.
+
+1. thin_join should be subject to blacker:
+@x in CMBASE.MF, the font_setup routine
+ define_whole_pixels(letter_fit,thin_join,fine,crisp,tiny);
+ define_whole_vertical_pixels(body_height,asc_height,
+ cap_height,fig_height,x_height,comma_depth,desc_depth,serif_drop);
+ define_whole_blacker_pixels(hair,stem,curve,flare,
+@y
+ define_whole_pixels(letter_fit,fine,crisp,tiny);
+ define_whole_vertical_pixels(body_height,asc_height,
+ cap_height,fig_height,x_height,comma_depth,desc_depth,serif_drop);
+ define_whole_blacker_pixels(thin_join,hair,stem,curve,flare,
+@z
+@x
+ if thin_join=0: thin_join:=1; fi
+@y
+@z
+[Note, December 11: My first correction also introduced the statement
+ if fine<thin_join: fine:=thin_join; fi
+in place of
+ if fine=0: fine:=1; fi
+but I can't understand why I would do such a stupid thing!]
+
+2. A new subroutine needed in CMBASE.MF (for cases with aspect_ratio<>1):
+vardef Vround primary y = y_:=vround y;
+ if y_<min_Vround: min_Vround else: y_ fi enddef;
+newinternal y_,min_Vround;
+
+@x related changes to the font_setup routine (in CMBASE.MF):
+ forsuffixes $=vair,bar,slab,cap_bar,cap_band:
+ $:=vround($.#*hppp+blacker); if $<=1: $:=1; fi endfor
+@y
+ define_whole_vertical_blacker_pixels(vair,bar,slab,cap_bar,cap_band);
+@z
+@x
+ vair':=max(1,vround(vair+vair_corr));
+ vstem:=max(1,vround .8[vair,stem]);
+ cap_vstem:=max(1,vround .8[vair,cap_stem]);
+@y
+ vair':=vround(vair+vair_corr);
+ vstem:=vround .8[vair,stem]; cap_vstem:=vround .8[vair,cap_stem];
+@z
+@x
+ pickup pencircle scaled rule_thickness; rule.nib:=savepen;
+@y
+ min_Vround:=max(fine.breadth,crisp.breadth,tiny.breadth);
+ forsuffixes $=vair,bar,slab,cap_bar,cap_band,vair',vstem,cap_vstem:
+ if $<min_Vround: $:=min_Vround; fi endfor
+ pickup pencircle scaled rule_thickness; rule.nib:=savepen;
+@z
+
+The Vround routine is substituted for vround in the programs for
+ Macron, line 6 (in ACCENT.MF)
+ Variant epsilon, line 5 (in GREEKL.MF)
+ Sigma, line 6 (in GREEKU.MF)
+ Omega, line 14 (in GREEKU.MF)
+ 2, line 6 (in OLDDIG.MF and ROMAND.MF)
+ 7, lines 6 and 8 (in OLDDIG.MF and ROMAND.MF)
+ g, lines 6 and 8 (in ROMANL.MF)
+ s, line 6 (in ROMANL.MF)
+ y, line 9 (in ROMANL.MF)
+ z, line 6 (in ROMANL.MF)
+ &, line 39 (in ROMANP.MF)
+ ?, line 18 (in ROMANP.MF)
+ Spanish open ?, line 17 (in ROMANP.MF)
+ Z, line 6 (in ROMANU.MF)
+ smile and frown, line 4 (in ROMMS.MF)
+
+3. Typo in program for oe ligature.
+@x in file ROMSPL.MF
+else: left_curve=max(tiny.breadth,hround(curve-2stem_corr));
+@y
+else: left_curve=max(fine.breadth,hround(curve-2stem_corr));
+@z
+
+4. Forgotten update to program for SS.
+@x in file CSCSPU.MF
+pickup fine.nib; pos2(max(fine.breadth,s_slab-vround vair_corr),-90);
+pos0(cap_ess,theta); pos7(s_slab,-90);
+x2+x7=2x0=w; x7-x2=if serifs: u else: 0 fi; top y2l=h+o; bot y7r=-o;
+y0=.52h; lft x3l=hround u; rt x6r=hround(w-u);
+x3r-x3l=x6r-x6l=hround .5[s_slab,cap_ess] -fine;
+@y
+numeric ess'; ess'=max(fine.breadth,cap_ess);
+pickup fine.nib; pos2(max(fine.breadth,s_slab-vround vair_corr),-90);
+pos0(ess',theta); pos7(s_slab,-90);
+x2+x7=2x0=w; x7-x2=if serifs: u else: 0 fi; top y2l=h+o; bot y7r=-o;
+y0=.52h; lft x3l=hround u; rt x6r=hround(w-u);
+x3r-x3l=x6r-x6l=hround .5[s_slab,ess']-fine;
+@z
+
+5. Hairline in `k' was overcorrected. (Pavel Curtis)
+@x in file ROMANL.MF
+stem3=max(tiny.breadth,hround(fudged.hair-4stem_corr));
+@y
+stem3=max(tiny.breadth,hround(fudged.hair if hefty:-\\4stem_corr fi));
+@z
+
+6. Too much kerning in "We", etc., in sans-serif fonts
+@x in file ROMAN.MF and TEXSET.MF
+ ligtable "F": "V": "W": "o" kern kk#, "e" kern kk#, "u" kern kk#,
+ "r" kern kk#, "a" kern kk#, "A" kern kkk#,
+@y
+ 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
+@z
+@x in file TITLE.MF
+ ligtable "F": "V": "W": "A" kern kkk#,
+@y
+ ligtable "F": "V": "W": "A" kern if serifs: kkk# else: kk#\\fi,
+@z
+@x in file CSC.MF
+ ligtable "F": "V": "W": "a" kern kkk#, "A" kern kkk#,
+@y
+ ligtable "F": "V": "W": if serifs: "a" kern kkk#, "A" kern kkk#,
+ else: "a" kern kk#, "A" kern kk#, fi
+@z
+@x in file CSC.MF
+ ligtable "f": "v": "w": "a" kern kkk#,
+@y
+ ligtable "f": "v": "w": "a" kern if serifs: kkk# else: kk#\\fi,
+@z
+
+7. dish serifs need to be more robust when dishing is very small.
+@x in file CMBASE.MF
+ if y$<y$$: dish_out=bot y$; dish_in=dish_out+dish;
+ else: dish_out=top y$; dish_in=dish_out-dish; fi
+ erase fill\\(x@1,dish_out)..(x$,dish_in){right}..(x@@1,dish_out)--cycle;
+@y
+ if y$<y$$: dish_out=bot y$; dish_in=dish_out+dish; let rev_=reverse;
+ else: dish_out=top y$; dish_in=dish_out-dish; let rev_=relax; fi
+ erase fill rev_
+ ((x@1,dish_out)..(x$,dish_in){right}..(x@@1,dish_out)--cycle);
+@z
+
+8. more robustness in case thin_join is too big
+@x in file ROMANL.MF, program for "b"
+pos4(vair,90); pos5(curve,0);
+pos6(vair,-90); penpos7(x3l-x3r,-180);
+rt x3l=1/3[rt x2,edge]; y3=1/8[bar_height,x_height];
+@y
+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];
+@z
+@x ibid, program for "d"
+pos4(vair,90); pos5(curve,180);
+pos6(vair,270); penpos7(x3r-x3l,360);
+lft x3l=1/3[lft x2,edge]; y3=1/8[bar_height,x_height];
+@y
+pos4(vair,90); pos5(curve,180); pos6(vair,270); penpos7(x3r-x3l,360);
+lft x3l=min(lft x3l-(rt x3r-tiny.rt x2r),1/3[lft x2,edge]);
+y3=1/8[bar_height,x_height];
+@z
+@x ibid, program for variant "g"
+pos4(vair,90); pos5(curve,180);
+pos6(vair,270); penpos7(x3r-x3l,360);
+lft x3l=2/3[lft x2,edge]; y3=bar_height;
+@y
+pos4(vair,90); pos5(curve,180); pos6(vair,270); penpos7(x3r-x3l,360);
+lft x3l=min(lft x3l-(rt x3r-tiny.rt x2r),2/3[lft x2,edge]); y3=bar_height;
+@z
+@x ibid, program for "p"
+rt x3l=1/3[rt x2,edge]; y3=1/8[bar_height,x_height];
+@y
+rt x3l=max(rt x3l-(lft x3r-tiny.lft x2l), 1/3[rt x2,edge]);
+y3=1/8[bar_height,x_height];
+@z
+@x ibid, program for "q"
+lft x3l=2/3[lft x2,edge]; y3=bar_height;
+@y
+lft x3l=min(lft x3l-(rt x3r-tiny.rt x2r),2/3[lft x2,edge]); y3=bar_height;
+@z
+@x ibid, proram for "q"
+x6l=x4l-.2u; bot y6r=-oo;
+lft x7l=1/3[lft x2,edge]; y7=min(y3,y6+y4-y3+.6vair);
+@y
+x6l=x4l-.2u; bot y6r=-oo; y7=min(y3,y6+y4-y3+.6vair);
+lft x7l=min(lft x7l-(rt x7r-tiny.rt x2r),1/3[lft x2,edge]);
+@z
+
+9. More robust "c" and "e" and "C"
+@x in file ROMANL.MF, program for "c"
+ (x,y4l)=whatever[z4r,z5l]; x4l:=x;
+@y
+ (x,y4l)=whatever[z4r,z5l]; x4l:=min(x,x4l+.5u);
+@z
+@x ibid, program for "e"
+ (x,y4l)=whatever[z4r,z5]; x4l:=x;
+@y
+ (x,y4l)=whatever[z4r,z5]; x4l:=min(x,x4l+.5u);
+@z
+@x in file ROMSPL.MF, programs for "ae" and "oe"
+ (x,y14l)=whatever[z14r,z15]; x14l:=x;
+@y
+ (x,y14l)=whatever[z14r,z15]; x14l:=min(x,x14l+.5u);
+@z
+@x in file ROMANU.MF, programs for "C" and "G"
+ (x2l',y2l)=whatever[z2r,z1l]; x2l:=x2l';
+ (x4l',y4l)=whatever[z4r,z5l]; x4l:=x4l';
+@y
+ (x2l',y2l)=whatever[z2r,z1l]; x2l:=min(x2l',x2l+.5u);
+ (x4l',y4l)=whatever[z4r,z5l]; x4l:=min(x4l',x4l+.5u);
+@z
+
+10. More robust foot in "a"
+@x in file ROMANL.MF
+ filldraw stroke z5'e---z10e...z11e{right}; % foot
+@y
+ pos12(shaved_stem,0); x11=x12; top y12=slab+eps;
+ filldraw z5'l---z10l...z11l{right}--z11r
+ --z12r{left}...z10r+.75(z12-z11)---z5'r--cycle; % foot
+@z
+
+11. Barbs less sharp
+@x in file ROMANU.MF, programs for "C" and "G"
+ x6=x1r; top y6=h+o; x1r-x1'=2cap_curve-fine; y1'=y1;
+ path upper_arc; upper_arc=z1{x2-x1,10(y2-y1)}..z2{left};
+ numeric t; t=xpart(upper_arc intersectiontimes (z6--z1'));
+ filldraw z1r--z6--subpath(t,0) of upper_arc--cycle; % barb
+@y [actually "G" had something similar but not identical]
+ pos6(.3[fine.breadth,cap_hair],0); x6r=x1r; top y6=h+o;
+ x1r-x1'=2cap_curve-fine; y1'=y1;
+ path upper_arc; upper_arc=z1{x2-x1,10(y2-y1)}..z2{left};
+ numeric t; t=xpart(upper_arc intersectiontimes (z6l--z1'));
+ filldraw z1r--z6r--z6l--subpath(t,0) of upper_arc--cycle; % barb
+@z
+@x ibid, program for "S"
+ x10=x1l; top y10=top y2l; x9=x8r; bot y9=bot y7r;
+ x1l-x1'=x8'-x8r=1.6cap_curve-fine; y1'=y1; y8'=y8;
+ numeric t; t=xpart(upper_arc intersectiontimes(z10--z1'));
+ filldraw z1l--z10--subpath(t,0) of upper_arc--cycle; % upper barb
+ t:=xpart(lower_arc intersectiontimes(z9--z8'));
+ filldraw z8r--z9--subpath(t,1) of lower_arc--cycle; % lower barb
+@y
+ pos10(.3[fine.breadth,cap_hair],0); pos9(.3[fine.breadth,cap_hair],0);
+ x10r=x1l; top y10=top y2l; x9l=x8r; bot y9=bot y7r;
+ x1l-x1'=x8'-x8r=1.6cap_curve-fine; y1'=y1; y8'=y8;
+ numeric t; t=xpart(upper_arc intersectiontimes(z10l--z1'));
+ filldraw z1l--z10r--z10l--subpath(t,0) of upper_arc--cycle; % upper barb
+ t:=xpart(lower_arc intersectiontimes(z9r--z8'));
+ filldraw z8r--z9l--z9r--subpath(t,1) of lower_arc--cycle; % lower barb
+@z [the same change goes into file CSCSPU.MF, the program for two S's]
+@x in file ROMANL.MF, program for "s"
+ x10=x1l; top y10=top y2l; x9=x8r; bot y9=bot y7r;
+ x1l-x1'=x8'-x8r=1.6curve-fine; y1'=y1; y8'=y8;
+ numeric t; t=xpart(upper_arc intersectiontimes(z10--z1'));
+ filldraw z1l--z10--subpath(t,0) of upper_arc--cycle; % upper barb
+ t:=xpart(lower_arc intersectiontimes(z9--z8'));
+ filldraw z8r--z9--subpath(t,1) of lower_arc--cycle; % lower barb
+@y
+ pos10(.3[fine.breadth,cap_hair],0); pos9(.3[fine.breadth,cap_hair],0);
+ x10r=x1l; top y10=top y2l; x9l=x8r; bot y9=bot y7r;
+ x1l-x1'=x8'-x8r=1.6cap_curve-fine; y1'=y1; y8'=y8;
+ numeric t; t=xpart(upper_arc intersectiontimes(z10l--z1'));
+ filldraw z1l--z10r--z10l--subpath(t,0) of upper_arc--cycle; % upper barb
+ t:=xpart(lower_arc intersectiontimes(z9r--z8'));
+ filldraw z8r--z9l--z9r--subpath(t,1) of lower_arc--cycle; % lower barb
+@z
+
+12. Italic ampersand more robust
+@x in file ITALP
+ & pulled_arc.e(9,10)...{dir(theta+90)}z11e; % bowls, loop, and stem
+@y
+ & {{interim superness:=more_super; pulled_arc.e(9,10)}}
+ ..tension .9 and 1..{dir(theta+100)}z11e; % bowls, loop, and stem
+@z
+
+13. h_stroke more robust (esp in case of typewriter-style m)
+@x in file CMBASE
+ pickup fine.nib; pos@0(thin_join,180);
+@y
+ penpos@0(min(rt x$r-lft x$l,thin_join)-fine,180); pickup fine.nib;
+@z
+
+14. eliminate dishing in conflict with arm.
+Put a new subroutine into CMBASE.MF:
+def nodish_serif(suffix $,$$,@)(expr left_darkness,left_jut)
+ (suffix @@)(expr right_darkness,right_jut) suffix modifier =
+ serif($,$$,@,left_darkness,-left_jut) modifier;
+ serif($,$$,@@,right_darkness,right_jut) modifier; enddef;
+
+Now use this instead of dish_serif in the following places:
+GREEKU: Gamma, upper serif
+ Pi, both upper serifs (fix erroneous comments!)
+SYMBOL: Amalgamation, both lower serifs (fix erroneous comments!)
+ROMANU: B, both serifs
+ D, both serifs
+ E, both serifs
+ F, upper serif
+ L, lower serif
+ P, upper serif
+ R, upper serif
+ T, upper bracketing
+ROMSPU: AE, upper and lower middle serifs
+
+15. Change #2 wasn't quite good enough!
+@x in CMBASE
+ min_Vround:=max(fine.breadth,crisp.breadth,tiny.breadth);
+@y
+ min_Vround:=max(fine.breadth,crisp.breadth,tiny.breadth);
+ if min_Vround<vround min_Vround: min_Vround:=vround min_Vround; fi
+ if flare<vround flare: flare:=vround flare; fi
+@z
+
+16. body_depth# is now called paren_depth#, since body_depth is
+computed differently. (This is a cosmetic change only; it affects
+files CMBASE, PUNCT, SYM, SYMBOL, and ROMMS.)
+
+17. more robust Sigma
+@x in GREEKU, page 9
+top y1=h; bot y2=h-slab; bot y4=0; x3l-x1l=4/11(w-2u); y3=.5h;
+@y
+top y1=h; bot y2=h-slab-eps; bot y4=0; x3l-x1l=4/11(w-2u); y3=.5h;
+@z
+@x in BIGOP, page 7
+top_arm_thickness=rule_thickness;
+@y
+top_arm_thickness=Vround rule_thickness;
+@z
+@x in BIGOP, page 7 (this change needed twice)
+top y1=0; bot y2=-top_arm_thickness; bot y4=-d; y3=-.5d;
+@y
+top y1=0; bot y2=-top_arm_thickness-eps; bot y4=-d; y3=-.5d;
+@z
+
+18. yet another refinement of change #2
+@x in CMBASE
+ forsuffixes $=vair,bar,slab,cap_bar,cap_band,vair',vstem,cap_vstem:
+@y
+ forsuffixes $=vair,bar,slab,cap_bar,cap_band,vair',vstem,cap_vstem,bold:
+@z
+
+19. slightly more robust `k'
+@x in ROMANL
+top y3=x_height; rt x3r=hround(r-letter_fit-.7u-right_jut);
+bot y6=0; rt x6r=hround(r-letter_fit-.3u-right_jut);
+@y
+top y3=x_height; rt x3r=hround(r-letter_fit-.7u-right_jut)+eps;
+bot y6=0; rt x6r=hround(r-letter_fit-.3u-right_jut)+eps;
+@z
+
+20. small parameter changes for consistency
+@x in CMBX6
+dish#:=.9/36pt#; % amount erased at top or bottom of serifs
+@y
+dish#:=.8/36pt#; % amount erased at top or bottom of serifs
+@z
+@x in CMBX5
+dish#:=.75/36pt#; % amount erased at top or bottom of serifs
+@y
+dish#:=.7/36pt#; % amount erased at top or bottom of serifs
+@z
+@x in CMSS9 and CMSSI9 [these two lines are not consecutive in the files!]
+notch_cut#:=23/36pt#; % maximum breadth above or below notches
+cap_notch_cut#:=29/36pt#; % max breadth above/below uppercase notches
+@y
+notch_cut#:=17/36pt#; % maximum breadth above or below notches
+cap_notch_cut#:=24/36pt#; % max breadth above/below uppercase notches
+@z
+@x in CMSS8 and CMSSI8 [these two lines are not consecutive in the files!]
+notch_cut#:=21/36pt#; % maximum breadth above or below notches
+cap_notch_cut#:=27/36pt#; % max breadth above/below uppercase notches
+@y
+notch_cut#:=16/36pt#; % maximum breadth above or below notches
+cap_notch_cut#:=22/36pt#; % max breadth above/below uppercase notches
+@z
+@x in CMTI9
+cap_hair#:=10/36pt#; % uppercase hairline breadth
+@y
+cap_hair#:=11/36pt#; % uppercase hairline breadth
+@z
+@x in CMTI8
+cap_hair#:=9.5/36pt#; % uppercase hairline breadth
+@y
+cap_hair#:=11/36pt#; % uppercase hairline breadth
+@z
+@x in CMTI7
+cap_hair#:=9/36pt#; % uppercase hairline breadth
+@y
+cap_hair#:=10.5/36pt#; % uppercase hairline breadth
+@z
+@x in CMTCSC10
+lower.cap_notch_cut#:=24pt#; % max breadth above/below uppercase notches
+@y
+lower.cap_notch_cut#:=24/36pt#; % max breadth above/below uppercase notches
+@z
+
+21. New parameter file CMFI10 was added; font_identifier is "CMFI".
+Also changed the name `cmit10' to `cmitt10'; font_identifier is "CMITT".
+
+22. Still more changes for robustness (based on resolution h120 x v108).
+@x in ROMAND and ITALD, "5"
+bot y5=vround(.53h-vair); top y6r=vround .61803h+o;
+@y
+bot y5=vround(.53h-vair); top y6r=max(vround .61803h+o,top y6r+y5+eps-y6l);
+@z
+@x in OLDDIG, "5"
+bot y5=vround(.53[-d,h]-vair); top y6r=(vround .61803[-d,h])+o;
+@y
+bot y5=vround(.53[-d,h]-vair);
+top y6r=max((vround .61803[-d,h])+o,top y6r+y5+eps-y6l);
+@z
+@x in ROMANU, "C"
+ bot y1=vround max(.6h,x_height-.5vair); y5=good.y .95(h-y1);
+@y
+ bot y1=min(vround max(.6h,x_height-.5vair),bot y2l-eps);
+ y5=max(good.y .95(h-y1),y4l+eps);
+@z
+@x in ROMANU, "G"
+ bot y1=vround max(.6h,x_height-.5vair);
+@y
+ bot y1=min(vround max(.6h,x_height-.5vair),bot y2l-eps);
+@z
+@x in GREEKL page 6 and TSETSL page 8
+y1=.9h; top y2l=h+oo; top y8r=x_height+oo; y4=y8;
+@y
+top y2l=h+oo; y1=min(.9h,y2r-eps); top y8r=x_height+oo; y4=y8;
+@z
+@x in GREEKL page 16
+x6=x7=w-2u; x8=.5w+.5u; y6=-.3d; y8=-3/4d-oo; bot y7r=-d-oo;
+@y
+x6=x7=w-2u; x8=.5w+.5u; y6=-.3d; bot y7r=-d-oo; y8=max(-3/4d-oo,y7l);
+@z
+@x in ITALL page 12, ITALMS page 6, ITALSP page 4
+lft x5r=hround-.5u; x4=1/3(w-u);
+@y
+x4=1/3(w-u); lft x5r=min(hround-.5u,lft x5r+x4-x5l-eps);
+@z
+@x in ROMANL, "g"
+x11=x13=.5w; bot y13r=-d-oo-1; x14=w-x12; z10'l=z10l;
+@y
+x11=x13=max(.5w,x10+eps); bot y13r=-d-oo-1; x14=w-x12; z10'l=z10l;
+@z
+@x in ROMANL, "s"
+ filldraw stroke z1e..tension.9..{left}z2e; % upper arc and terminal
+ filldraw stroke z7e{left}..z8e; fi % lower arc and terminal
+@y
+ filldraw stroke term.e(2,1,right,.9,4); % upper arc and terminal
+ filldraw stroke term.e(7,8,left,1,4); fi % lower arc and terminal
+@z
+@x in ROMANL, "c"
+ filldraw stroke pulled_super_arc.e(2,3)(.7superpull)
+ & pulled_super_arc.e(3,4)(.5superpull)
+ ..tension .9 and 1..z5e; fi % arc and lower terminal
+@y
+ forsuffixes e=l,r: path p.e; p.e=z4e{right}..tension .9 and 1..z5e;
+ if angle direction 1 of p.e>75:
+ p.e:=z4e{right}..tension atleast.9 and 1..{dir 75}z5e; fi endfor
+ filldraw stroke pulled_super_arc.e(2,3)(.7superpull)
+ & pulled_super_arc.e(3,4)(.5superpull) & p.e; fi % arc and lower terminal
+@z
+@x in ROMSPL, page 5
+lft x8r=hround(stem_edge+.5u+1); x7=max(x8l+eps,.4[lft x8r,x6]);
+@y
+lft x8r=min(hround(stem_edge+.5u+1),lft x8r+x6r-2eps-x8l);
+x7=max(x8l+eps,.4[lft x8r,x6]);
+@z
+@x in ROMAND and OLDDIG, "2"
+ lft x1r=hround .75u; bot y1l=vround .7h; y1r:=good.y y1r; x1l:=good.x x1l;
+@y
+ lft x1r=hround .75u; bot y1l=vround .7h; y1r:=good.y y1r+eps; x1l:=good.x x1l;
+@z
+@x in SYMBOL, page 42 (Fraktur R)
+z=(z20{up}...{right}z21)intersectionpoint(z22l--z22l+(h,0) rotated theta);
+@y
+path p; p=z20{up}...(z21--(w,y21));
+z=p intersectionpoint(z22l--z22l+(h,0) rotated theta);
+@z
+
+23. Another consequence of change 2:
+"vround" should be "Vround" in the BIGDEL programs for extensible arrows
+(five times).
+Also five times in the BIGOP programs for summation, product, coproduct.
+
+24. Cosmetic change to bring CMBASE in line with PLAIN.
+@x in CMBASE.MF
+def pickup secondary q =
+ if numeric q: currentpen:=pen_[q];
+ pen_top:=pen_top_[q]; pen_bot:=pen_bot_[q];
+ pen_lft:=pen_lft_[q]; pen_rt:=pen_rt_[q];
+ currentpen_path:=pen_path_[q];
+ if known breadth_[q]: currentbreadth:=breadth_[q]; fi
+ else: currentpen:=q yscaled aspect_ratio;
+ pen_top:=(ypart penoffset left of currentpen)_o_;
+ pen_bot:=(ypart penoffset right of currentpen)_o_;
+ pen_lft:=xpart penoffset down of currentpen;
+ pen_rt:=xpart penoffset up of currentpen;
+ path currentpen_path;
+ fi enddef;
+@y
+def numeric_pickup_ primary q =
+ currentpen:=pen_[q];
+ pen_lft:=pen_lft_[q]; pen_rt:=pen_rt_[q];
+ pen_top:=pen_top_[q]; pen_bot:=pen_bot_[q];
+ currentpen_path:=pen_path_[q];
+ if known breadth_[q]: currentbreadth:=breadth_[q]; fi enddef;
+@z
+
+25. false italic correction in lambda of texset fonts (Feb 25, 1986)
+@x in TEXSET
+mode_setup; font_setup;
+@y
+mode_setup; font_setup; mono_charic#:=0;
+@z
+@x ibid
+slant:=mono_charic#:=0; % the remaining characters will not be slanted
+@y
+slant:=0; % the remaining characters will not be slanted
+@z
+[now remove the occurrences of `charic:=0;' in TSETSL, as they are unnecessary]
+
+*** The above changes are incorporated into the published book,
+*** Computer Modern Typefaces; this is "Version 2" (released March 5, 1986).
+ Changes subsequent to `Version 2' as published in C&T, Volume E:
+
+@x in GREEKU
+numeric shaved_stem; shaved_stem=hround .9[vair,.85cap_stem];
+@y
+numeric shaved_stem; shaved_stem=hround .9[vair,.85cap_stem];
+if shaved_stem<crisp.breadth: shaved_stem:=crisp.breadth; fi
+@z
+
+@x in CMSS9 [this affects the TFM file to a small extent!]
+fig_height#:=236/36pt#; % height of numerals
+@y
+fig_height#:=212/36pt#; % height of numerals
+@z
+
+@x in CMSSI9 [this affects the TFM file in ten hts and eleven italcorrs]
+fig_height#:=236/36pt#; % height of numerals
+@y
+fig_height#:=212/36pt#; % height of numerals
+@z
+
+@x in CMR17 [no change to TFM file]
+curve#:=41/36pt#; % lowercase curve breadth
+@y
+curve#:=40/36pt#; % lowercase curve breadth
+@z
+@x
+cap_stem#:=40/36pt#; % uppercase stem breadth
+cap_curve#:=48/36pt#; % uppercase curve breadth
+@y
+cap_stem#:=41/36pt#; % uppercase stem breadth
+cap_curve#:=47/36pt#; % uppercase curve breadth
+@z
+@x
+serif_drop#:=17/36pt#; % vertical drop of sloped serifs
+@y
+serif_drop#:=7/36pt#; % vertical drop of sloped serifs
+@z
+
+@x in ROMAND [this fixes the `disappearing hairline' in some lowres 8's]
+ lower_side=hround(.5[hair,stem]+stem_corr);
+@y
+ lower_side=hround(.5[hair,stem]+stem_corr);
+ if lower_side>1.2upper_side: upper_side:=lower_side; fi
+@z
+% Note: the SAME change should also be made in files ITALD and OLDDIG
+
+@x in ITALL [this fixes italic ell especially at low resolutions]
+top y1=h; x1=x2; filldraw stroke z1e--z2e; % stem
+@y
+top y1=h; x1=x2; filldraw stroke z1e--z2'e; % stem
+@z
+
+@x in SYM, the plus-or-minus character
+x1=x2=.5w; lft x3=lft=x5=hround u-eps; x4=x6=w-x3;
+@y
+x1=x2=.5w; lft x3=lft x5=hround u-eps; x4=x6=w-x3;
+@z actually the code worked but it was "infelicitous"
+
+@x in SYMBOL, the minus-or-plus character
+x1=x2=.5w; lft x3=lft=x5=hround u-eps; x4=x6=w-x3;
+@y
+x1=x2=.5w; lft x3=lft x5=hround u-eps; x4=x6=w-x3;
+@z actually the code worked but it was "infelicitous"
+
+@x in ROMANU, letter J [fixes a bug if dish=0 and crisp<tiny and serifs]
+ bulb(3,4,5); % bulb
+@y
+ pickup tiny.nib; bulb(3,4,5); % bulb
+@z
+
+@x in ROMANL, letter w [makes notch_cut more useful]
+ else: fill diag_end(6r,5r,1,1,5l,6l)--.5[z5l,z6l]
+ --.5[z5r,z6r]--cycle;% middle stem
+@y
+ else: fill diag_end(6r,5r,1,1,5l,6l)--.9[z5l,z6l]
+ ..{z5-z6}.1[z5r,z6r]--cycle; % middle stem
+@z the same change applies also to letter W in ROMANU
+
+@x in CMBASE, makes lowres types (especially TT) look better
+ define_blacker_pixels(notch_cut,cap_notch_cut);
+@y
+ define_blacker_pixels(notch_cut,cap_notch_cut);
+ forsuffixes $=notch_cut,cap_notch_cut: if $<3: $:=3; fi endfor
+@z
+
+@x in BIGOP, the \displaystyle coproduct sign
+lft x11=hround u; x1l-x11=x2l-x12=x22-x2r=hround cap_jut;
+@y
+lft x11=hround u; x1l-x11=x2l-x12=x22-x2r=hround 1.6cap_jut;
+@z
+
+@x in ROMANL, the letter m
+lft x1l=hround(2.5u-.5stem); x1l=x1'l=x2l=x2'l;
+lft x3l=hround(.5w-.5stem); x5-x3=x3-x1;
+if not monospace: r:=hround(x5+x1)-l; fi % change width for better fit
+@y
+lft x1l=hround(2.5u-.5stem); x1l=x1'l=x2l=x2'l; % stem, sic
+lft x3l=hround(.5w-.5mfudged.stem); x5-x3=x3-x1;
+if not monospace: r:=hround(x5+x1)+r-w; fi % change width for better fit
+@z
+
+@x a new routine for CMBASE, following change_width
+@y
+def center_on(expr x) = if not monospace: % change width for symmetric fit
+ r:=r+2x-w; w:=2x; fi enddef;
+@z
+@x in SYMBOL, the elementary division operator
+x3-.5dot_size=hround(.5w-.5dot_size); w:=r:=2x3;
+@y
+x3-.5dot_size=hround(.5w-.5dot_size); center_on(x3);
+@z
+Similarly, whenever the construction "w:=r:=2x*" appears, change it to
+"center_on(x*)". This happens in the programs for elementary division operator
+(as noted above), large triangle, large inverted triangle, lattice top,
+lattice bottom, dagger mark, double dagger mark, club/diamond/heart/spade suit
+(all in SYMBOL), plus the diamond operator and universal quantifier in SYM.
+The following additional change needs to be made in the programs
+for lattice top and lattice bottom:
+@x
+x1=x2=good.x .5w; center_on(x1); lft x3=hround u; x4=r-x3;
+@y
+x1=x2=good.x .5w; center_on(x1); lft x3=hround u; x4=w-x3;
+@z
+
+@x in SYMBOL, at end of zero-width slash
+labels(1,2); zero_width; endchar;
+@y
+labels(5,6); zero_width; endchar;
+@z
+
+@x in ROMANU, the letter Q (this change simply labels point 8 on proofs)
+math_fit(-.3cap_height#*slant-.5u#,ic#); penlabels(1,2,3,4,5,6,7); endchar;
+@y
+math_fit(-.3cap_height#*slant-.5u#,ic#);
+penlabels(1,2,3,4,5,6,7,8); endchar;
+@z
+
+@x in ROMANL, the letter i (this change by Jonathan Kew makes the dot rounder)
+if serifs: x3r=max(x1r,x1+.5(dot_diam-tiny)-.2jut) else: x3=x1-.5 fi;
+@y
+if serifs: x3r=max(x1r,hround(x1+.5dot_diam-.2jut)-.5tiny)
+else: x3=x1-.5 fi;
+@z
+
+-----------Improvements made in January 1992
+[No change to TFM files]
+@x in cmbase (improve lowres as suggested by John Hobby)
+def normal_adjust_fit(expr left_adjustment,right_adjustment) =
+ l:=-hround(left_adjustment*hppp)-letter_fit;
+ interim xoffset:=-l;
+ charwd:=charwd+2letter_fit#+left_adjustment+right_adjustment;
+ r:=l+hround(charwd*hppp)-shrink_fit;
+ w:=r-hround(right_adjustment*hppp)-letter_fit;
+ enddef;
+
+def mono_adjust_fit(expr left_adjustment,right_adjustment) =
+ numeric expansion_factor;
+ mono_charwd#=2letter_fit#
+ +expansion_factor*(charwd+left_adjustment+right_adjustment);
+ forsuffixes $=u,jut,cap_jut,beak_jut,apex_corr:
+ $:=$.#*expansion_factor*hppp; endfor
+ l:=-hround(left_adjustment*expansion_factor*hppp)-letter_fit;
+ interim xoffset:=-l;
+ r:=l+mono_charwd-shrink_fit;
+ w:=r-hround(right_adjustment*expansion_factor*hppp)-letter_fit;
+ charwd:=mono_charwd#; charic:=mono_charic#;
+ enddef;
+@y
+def do_expansion(expr expansion_factor) =
+ forsuffixes $=u,jut,cap_jut,beak_jut,apex_corr:
+ $:=$.#*expansion_factor*hppp; endfor
+enddef;
+
+def normal_adjust_fit(expr left_adjustment,right_adjustment) =
+ numeric charwd_in; charwd_in=charwd;
+ l:=-hround(left_adjustment*hppp)-letter_fit;
+ interim xoffset:=-l;
+ charwd:=charwd+2letter_fit#+left_adjustment+right_adjustment;
+ r:=l+hround(charwd*hppp)-shrink_fit;
+ w:=r-hround(right_adjustment*hppp)-letter_fit;
+ do_expansion(w/(charwd_in*hppp));
+ enddef;
+
+def mono_adjust_fit(expr left_adjustment,right_adjustment) =
+ numeric charwd_in; charwd_in=charwd;
+ numeric expansion_factor;
+ mono_charwd#=2letter_fit#
+ +expansion_factor*(charwd+left_adjustment+right_adjustment);
+ l:=-hround(left_adjustment*expansion_factor*hppp)-letter_fit;
+ interim xoffset:=-l;
+ r:=l+mono_charwd-shrink_fit;
+ w:=r-hround(right_adjustment*expansion_factor*hppp)-letter_fit;
+ charwd:=mono_charwd#; charic:=mono_charic#;
+ do_expansion(w/(charwd_in*hppp));
+ enddef;
+@z
+@x in SYM, Downward arrow
+pos3(bar,90); pos4(bar,90);
+lft x1l=hround(.5w-.5rule_thickness); y1+.5rule_thickness=h;
+x0=x1=x2; bot y0=-d; x0-x3=x4-x0=3u+eps;
+y3=y4=y0+.24asc_height+eps;
+pos5(bar,angle(z4-z0)); z5l=z0;
+pos6(bar,angle(z3-z0)); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y (make arrowheads heavier, as suggested by Zapf)
+pos3(rule_thickness,90); pos4(rule_thickness,90);
+lft x1l=hround(.5w-.5rule_thickness); y1+.5rule_thickness=h;
+x0=x1=x2; bot y0=-d; x0-x3=x4-x0=if monospace:3u else:4u fi+eps;
+y3=y4=y0+if monospace:.24 else:.36 fi asc_height+eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x in SYM, Upward arrow
+pos3(bar,90); pos4(bar,90);
+lft x1l=hround(.5w-.5rule_thickness); y1-.5rule_thickness=-d;
+x0=x1=x2; top y0=h; x0-x3=x4-x0=3u+eps;
+y3=y4=y0-.24asc_height-eps;
+pos5(bar,angle(z4-z0)); z5l=z0;
+pos6(bar,angle(z3-z0)); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos3(rule_thickness,90); pos4(rule_thickness,90);
+lft x1l=hround(.5w-.5rule_thickness); y1-.5rule_thickness=-d;
+x0=x1=x2; top y0=h; x0-x3=x4-x0=if monospace:3u else:4u fi+eps;
+y3=y4=y0-if monospace:.24 else:.36 fi asc_height-eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x in SYM, Leftward arrow
+pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
+y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
+y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
+pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos1(rule_thickness,90); pos2(rule_thickness,90);
+pos3(rule_thickness,0); pos4(rule_thickness,0);
+y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
+y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
+x3=x4=x0+if monospace:3u else:4u fi+eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x in SYM, Rightward arrow
+pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
+y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
+y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0-4u-eps;
+pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos1(rule_thickness,90); pos2(rule_thickness,90);
+pos3(rule_thickness,0); pos4(rule_thickness,0);
+y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
+y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
+x3=x4=x0-if monospace:3u else:4u fi-eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x in SYM, Left-and-right arrow
+pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
+y0=y1=y2=math_axis if monospace:+vround.3asc_height fi; lft x0=hround u;
+if monospace: x1+.5rule_thickness=hround(w-u) else: x1=.5w fi;
+y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
+pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos1(rule_thickness,90); pos2(rule_thickness,90);
+pos3(rule_thickness,0); pos4(rule_thickness,0);
+y0=y1=y2=math_axis if monospace:+vround.3asc_height fi; lft x0=hround u;
+if monospace: x1+.5rule_thickness=hround(w-u) else: x1=.5w fi;
+y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
+x3=x4=x0+if monospace:3u else:4u fi+eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x ibid
+pos11(rule_thickness,90); pos12(rule_thickness,90); pos13(bar,0); pos14(bar,0);
+y10=y11=y12=math_axis if monospace:-vround.3asc_height fi;
+rt x10=hround(w-u);
+if monospace: x11-.5rule_thickness=hround u else: x11=.5w fi;
+y13-y10=y10-y14=.24asc_height+eps; x13=x14=x10-3u-eps;
+pos15(bar,angle(z14-z10)); z15l=z10; pos16(bar,angle(z13-z10)); z16l=z10;
+z19=.381966[.5[z13,z14],z10];
+@y
+pos11(rule_thickness,90); pos12(rule_thickness,90);
+pos13(rule_thickness,0); pos14(rule_thickness,0);
+y10=y11=y12=math_axis if monospace:-vround.3asc_height fi;
+rt x10=hround(w-u);
+if monospace: x11-.5rule_thickness=hround u else: x11=.5w fi;
+y13-y10=y10-y14=if monospace:.24 else:.36 fi asc_height+eps;
+x13=x14=x10-if monospace:3u else:4u fi-eps;
+pos15(rule_thickness,angle(z14-z10)); z15l=z10;
+pos16(rule_thickness,angle(z13-z10)); z16l=z10;
+z19=.2[.5[z13,z14],z10];
+@z
+@x in SYMBOL, Up-and-down arrow
+pos3(bar,90); pos4(bar,90);
+lft x1l=hround(.5w-.5rule_thickness); y1=.5[-d,h];
+x0=x1=x2; bot y0=-d-o; x0-x3=x4-x0=3u+eps;
+y3=y4=y0+.24asc_height+eps;
+pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos3(rule_thickness,90); pos4(rule_thickness,90);
+lft x1l=hround(.5w-.5rule_thickness); y1=.5[-d,h];
+x0=x1=x2; bot y0=-d-o; x0-x3=x4-x0=4u+eps;
+y3=y4=y0+.36asc_height+eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x ibid
+pos13(bar,90); pos14(bar,90);
+x10=x11=x12; top y10=h+o; x10-x13=x14-x10=3u+eps;
+y13=y14=y10-.36asc_height-eps;
+pos15(bar,angle(z14-z10)); z15l=z10;
+pos16(bar,angle(z13-z10)); z16l=z10;
+z19=.381966[.5[z13,z14],z10];
+@y
+pos13(rule_thickness,90); pos14(rule_thickness,90);
+x10=x11=x12; top y10=h+o; x10-x13=x14-x10=4u+eps;
+y13=y14=y10-.24asc_height-eps;
+pos15(rule_thickness,angle(z14-z10)); z15l=z10;
+pos16(rule_thickness,angle(z13-z10)); z16l=z10;
+z19=.2[.5[z13,z14],z10];
+@z
+@x in SYMBOL, Northeast arrow
+pos3(bar,theta); pos4(bar,theta);
+y3=y0; x4=x0; x0-x3=y0-y4=delta+eps;
+pos5(bar,-90); z5l=z0; pos6(bar,-180); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos3(rule_thickness,theta); pos4(rule_thickness,theta);
+z3-z0=(-4u,.36asc_height) rotated theta;
+z4-z0=(-4u,-.36asc_height) rotated theta;
+pos5(rule_thickness,-90); z5l=z0; pos6(rule_thickness,-180); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x in SYMBOL, Southeast arrow
+pos3(bar,theta); pos4(bar,theta);
+x3=x0; y4=y0; y3-y0=x0-x4=delta+eps;
+pos5(bar,180); z5l=z0; pos6(bar,90); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos3(rule_thickness,theta); pos4(rule_thickness,theta);
+z3-z0=(-4u,.36asc_height) rotated theta;
+z4-z0=(-4u,-.36asc_height) rotated theta;
+pos5(rule_thickness,180); z5l=z0; pos6(rule_thickness,90); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x in SYMBOL, Northwest arrow
+pos3(bar,-180+theta); pos4(bar,-180+theta);
+x3=x0; y4=y0; x4-x0=y0-y3=delta+eps;
+pos5(bar,0); z5l=z0; pos6(bar,-90); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos3(rule_thickness,-180+theta); pos4(rule_thickness,-180+theta);
+z4-z0=(4u,.36asc_height) rotated theta;
+z3-z0=(4u,-.36asc_height) rotated theta;
+pos5(rule_thickness,0); z5l=z0; pos6(rule_thickness,-90); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x in SYMBOL, Southwest arrow
+pos3(bar,-180+theta); pos4(bar,-180+theta);
+y3=y0; x4=x0; x3-x0=y4-y0=delta+eps;
+pos5(bar,90); z5l=z0; pos6(bar,0); z6l=z0;
+z9=.381966[.5[z3,z4],z0];
+@y
+pos3(rule_thickness,-180+theta); pos4(rule_thickness,-180+theta);
+z4-z0=(4u,.36asc_height) rotated theta;
+z3-z0=(4u,-.36asc_height) rotated theta;
+pos5(rule_thickness,90); z5l=z0; pos6(rule_thickness,0); z6l=z0;
+z9=.2[.5[z3,z4],z0];
+@z
+@x in ROMMS, Leftward top half arrow
+pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
+y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
+y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
+pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
+@y
+pos1(rule_thickness,90); pos2(rule_thickness,90);
+pos3(rule_thickness,0); pos4(rule_thickness,0);
+y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
+y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0+4u+eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+@z
+@x in ROMMS, Leftward bottom half arrow
+pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
+y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
+y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
+pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
+@y
+pos1(rule_thickness,90); pos2(rule_thickness,90);
+pos3(rule_thickness,0); pos4(rule_thickness,0);
+y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
+y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0+4u+eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+@z
+@x in ROMMS, Rightward top half arrow
+pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
+y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
+y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0-3u-eps;
+pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
+@y
+pos1(rule_thickness,90); pos2(rule_thickness,90);
+pos3(rule_thickness,0); pos4(rule_thickness,0);
+y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
+y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0-4u-eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+@z
+@x in ROMMS, Rightward bottom half arrow
+pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
+y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
+y3-y0=y0-y4=.asc_height+eps; x3=x4=x0-3u-eps;
+pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
+@y
+pos1(rule_thickness,90); pos2(rule_thickness,90);
+pos3(rule_thickness,0); pos4(rule_thickness,0);
+y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
+y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0-4u-eps;
+pos5(rule_thickness,angle(z4-z0)); z5l=z0;
+pos6(rule_thickness,angle(z3-z0)); z6l=z0;
+@z
+@x in CALU, Calligraphic F
+top y1=top y6=h; z2=.5[z3,z1]+bend;
+bot y3=-o; y4=.1h; y5=y2; y7=.9h;
+draw flex(z1,z2,z3) softjoin (z3...{x4-x3,5(y4-y3)}z4); % stem
+draw z1-flourish_change{up}...z1---z6...{down}z7; % upper bar
+@y
+top y1=top y6=h; z2=.5[z3,z1]+1.2bend;
+bot y3=-o; y4=.1h; y5=y2; y7=.9h;
+draw flex(z1,z2,z3) softjoin (z3...{x4-x3,5(y4-y3)}z4); % stem
+draw z1-flourish_change{up}...(z1-(u,0))---z6...{down}z7; % upper bar
+@z
+@x in CALU, Calligraphic H
+lft x1=lft x3=0; rt x4=rt x6=.8w; rt x9=w;
+top y1=top y4=h; bot y3=-o; bot y6=bot_flourish_line; y9=y6+.1h;
+z2=.6[z3,z1]+bend; z5=.4[z6,z4]-2bend;
+path p[]; p1=flex(z1,z2,z3); p2=flex(z4,z5,z6);
+p3=(-w,.55h)--(2w,.55h);
+lft z7=p3 intersectionpoint p1; rt z8=p3 intersectionpoint p2;
+draw (z1-flourish_change{up}....z1-(u,0)---z1) softjoin p1; % left stem
+@y
+lft x1=lft x3=.5u; rt x4=rt x6=.8w-.6u; rt x9=w;
+top y1=top y4=h; bot y3=-.06h; bot y6=bot_flourish_line; y9=y6+.1h;
+z2=.6[z3,z1]+bend; z5=.4[z6,z4]-bend;
+path p[]; p1=flex(z1,z2,z3); p2=flex(z4,z5,z6);
+p3=(-w,.45h)--(2w,.45h);
+rt z7+2bend=p3 intersectionpoint p1; rt z8=p3 intersectionpoint p2;
+draw (z1-flourish_change-bend{curl2}....z1-(u,0)---z1) softjoin p1; % left stem
+@z
+@x in CALU, Calligraphic I
+lft x0=0; x1=.9w; x2=x4=.5w; x5=.2w; x6=.75w; rt x7=w;
+@y
+lft x0=0; x1=.9w; x2=x4=.5w; x5=.2w; x6=.8w; rt x7=1.05w;
+@z
+@x in CALU, Calligraphic T
+x1=x3=.5w; lft x4=0; x5=w-x6=.25w; rt x7=w;
+x1=.47w; x3=.5w; lft x4=0; x5=w-x6=.25w; rt x7=1.05w;
+z2=.5[z3,z1]+bend;
+x1-x8=x9-x1=2u; y8=y9=y3;
+z0=1/3[z1,z6];
+draw z0{left}...z2{down}...{left}z8; % stem
+draw z8--z9; % foot
+draw z4{up}...z5{right}...z6{right}...{up}z7; % arms
+math_fit(.5u#-5/7h#*slant,-u#); labels(1,2,3,4,5,6,7,8,9); endchar;
+@y
+x1=.47w; x3=.5w; lft x4=0; x5=.25w; x6=.85w; rt x7=1.05w;
+top y1=h; bot y3=-.1h; y4=3/4h; top y5=top y6=h; top y7=1.05h;
+z2=.3[z3,z1]+bend;
+top y0=y1; x0=x2;
+z8=(2u,.2h);
+draw z0---z2...z3; % stem
+draw z4{curl 2}...z5{right}...z6{right}...{up}z7; % arms
+math_fit(.5u#-5/7h#*slant,-u#); labels(1,2,3,4,5,6,7); endchar;
+@z
+@x in GREEKL, lowercase delta
+pos1(hair,-180); pos2(vair,-90);
+numeric theta; theta=angle(18u,-h);
+pos3(stem,theta+90); pos4(stem,theta+90); pos5(1/4[hair,stem],20);
+pos6(vair,-90); pos7(curve,-180); pos8(vair,-270);
+rt x1l=hround(w-2u+.5hair); x2=.5w; x3r=3u; rt x5r=hround(w-u);
+x4=x6=x8=.5w+.5u; lft x7r=hround(1.5u-.5curve);
+top y2l=h+oo; y1=min(.9h,y2r-eps); top y8r=x_height+oo; y4=y8;
+z4-z3=whatever*(18u,-h); y5=y7=.5[y6,y8]; bot y6=-oo;
+filldraw stroke z1e{x2-x1,3(y2-y1)}...z2e{left}...z3e---z4e
+ ....z5e{down}...pulled_arc.e(6,7) & pulled_arc.e(7,8); % hook and bowl
+math_fit(-.3x_height#*slant+.5curve#-u#,.7x_height#*slant-.5u#);
+penlabels(1,2,3,4,5,6,7,8); endchar;
+@y
+x0=-u; y0=1.1h;
+numeric light_flare; light_flare=2/3[vair,flare];
+x1=w-2u-.5light_flare; y1=h-.5light_flare;
+numeric theta; theta=angle (z1-z0);
+pos1(light_flare,theta-90); pos2(.2[vair,light_flare],-90); pos3(vair,theta);
+x2=x3+u; y2=h;
+x4=x6=.5w+.5u; top y8r=x_height+oo; z4=z8;
+pos6(vair,-90); pos7(stem,-180); pos8(vair,-270);
+pos4(stem,angle(z4-z0)+90); pos5(stem,30);
+z3=.5[.5[z1,z4],z0];
+y5+.1x_height=y7=.5[y6,y8]; bot y6=-oo;
+lft x7r=hround(1.4u-.5stem); rt x5r=hround(w-u);
+filldraw stroke z1e{z0-z1e}....z2e....z3e{(z0-z1)rotated 90}
+ ...z4e{z4e-.8[z4,z0]}
+ ....z5e{down}...pulled_arc.e(6,7) & pulled_arc.e(7,8); % hook and bowl
+filldraw z1r{z1r-z0}...z1l{z0-z1l}--cycle; % bulb
+math_fit(-.3x_height#*slant+.5curve#-u#,.7x_height#*slant-.5u#);
+penlabels(0,1,2,3,4,5,6,7,8); endchar;
+@z
+@x in TSETSL, lowercase delta for extended ASCII
+pos1(hair,-180); pos2(vair,-90);
+numeric theta; theta=angle(18u,-h);
+pos3(stem,theta+90); pos4(stem,theta+90); pos5(1/4[hair,stem],20);
+pos6(vair,-90); pos7(curve,-180); pos8(vair,-270);
+rt x1l=hround(w-2u+.5hair); x2=.5w; x3r=3u; rt x5r=hround(w-u);
+x4=x6=x8=.5w+.5u; lft x7r=hround(1.5u-.5curve);
+top y2l=h+oo; y1=min(.9h,y2r-eps); top y8r=x_height+oo; y4=y8;
+z4-z3=whatever*(18u,-h); y5=y7=.5[y6,y8]; bot y6=-oo;
+filldraw stroke z1e{x2-x1,3(y2-y1)}...z2e{left}...z3e---z4e
+ ....z5e{down}...pulled_arc.e(6,7) & pulled_arc.e(7,8); % hook and bowl
+penlabels(1,2,3,4,5,6,7,8); endchar;
+@y this next line differs from GREEKL, but the other lines agree
+x0=-u; y0=1.05h;
+numeric light_flare; light_flare=2/3[vair,flare];
+x1=w-2u-.5light_flare; y1=h-.5light_flare;
+numeric theta; theta=angle (z1-z0);
+pos1(light_flare,theta-90); pos2(.2[vair,light_flare],-90); pos3(vair,theta);
+x2=x3+u; y2=h;
+x4=x6=.5w+.5u; top y8r=x_height+oo; z4=z8;
+pos6(vair,-90); pos7(stem,-180); pos8(vair,-270);
+pos4(stem,angle(z4-z0)+90); pos5(stem,30);
+z3=.5[.5[z1,z4],z0];
+y5+.1x_height=y7=.5[y6,y8]; bot y6=-oo;
+lft x7r=hround(1.4u-.5stem); rt x5r=hround(w-u);
+filldraw stroke z1e{z0-z1e}....z2e....z3e{(z0-z1)rotated 90}
+ ...z4e{z4e-.8[z4,z0]}
+ ....z5e{down}...pulled_arc.e(6,7) & pulled_arc.e(7,8); % hook and bowl
+filldraw z1r{z1r-z0}...z1l{z0-z1l}--cycle; % bulb
+penlabels(0,1,2,3,4,5,6,7,8); endchar;
+@z
+
+----------- Changes made after the fourth printing (1993) of Volume E
+
+@x in CSCSPU, letter J [fixes a bug if dish=0 and crisp<tiny and serifs]
+ bulb(3,4,5); % bulb
+@y
+ pickup tiny.nib; bulb(3,4,5); % bulb
+@z
+
+@x in BIGDEL, two harmless bugs caught by Robert Hunt
+"Extensible vertical arrow--extension module";
+@y
+cmchar "Extensible vertical arrow--extension module";
+@z
+@x
+"Extensible double vertical arrow--extension module";
+@y
+cmchar "Extensible double vertical arrow--extension module";
+@z
+
+@x in GREEKU, letter Phi (hi-res glitch found by Robert Hunt)
+lft x1l=lft x2l=hround(.5w-.5cap_stem); top y1=h; bot y2=0;
+@y
+lft x1l=lft x2l=hround(.5w-.5shaved_stem); top y1=h; bot y2=0;
+@z
+@x in GREEKU, letter Psi similarly
+lft x1l=lft x2l=hround(.5w-.5cap_stem); top y1=h; bot y2=0;
+@y
+lft x1l=lft x2l=hround(.5w-.5shaved_stem); top y1=h; bot y2=0;
+@z
+
+@x in BIGOP, teststyle integral sign
+x5=.5[x4,x6]; x4-x6=1.2u; lft x5r=hround(.5w-.5stem);
+@y
+x5=.5[x4,x6]; x4-x6=1.2u; lft x5r=hround(.5w-.5curve);
+@z
+@x same, displaystyle integral sign
+x5=.5[x4,x6]; x4-x6=4.8u; lft x5r=hround(.5w-.5stem);
+@y
+x5=.5[x4,x6]; x4-x6=4.8u; lft x5r=hround(.5w-.5max_size);
+@z
+@x same, textstyle contour integral sign
+x5=.5[x4,x6]; x4-x6=1.2u; lft x5r=hround(.5w-.5stem);
+@y
+x5=.5[x4,x6]; x4-x6=1.2u; lft x5r=hround(.5w-.5curve);
+@z
+@x same, displaystyle contour integral sign
+x5=.5[x4,x6]; x4-x6=4.8u; lft x5r=hround(.5w-.5stem);
+@y
+x5=.5[x4,x6]; x4-x6=4.8u; lft x5r=hround(.5w-.5max_size);
+@z
+
+@x in ITALMS, the partial differential sign
+path p; p=pulled_super_arc.l(3,4)(pull);
+@y
+path p; {{interim superness:=more_super; p=pulled_super_arc.l(3,4)(pull)}};
+@z
+
+@x in SYMBOL, the elementary division operator
+beginarithchar(oct"004"); pickup rule.nib;
+x3-.5dot_size=hround(.5w-.5dot_size); center_on(x3);
+y3+.5dot_size=vround(math_axis+math_spread[.5x_height,.6x_height]+.5dot_size);
+@y note that pickup rule.nib leaves currentbreadth unchanged
+beginarithchar(oct"004"); pickup fine.nib; pickup rule.nib;
+numeric del; del=dot_size-currentbreadth; % currentbreadth=fine
+x3-.5del=good.x(.5w-.5del); center_on(x3);
+y3+.5del=good.y(math_axis+math_spread[.5x_height,.6x_height]+.5del);
+@z
+
+@x in CMBASE, compute_spread can force even spreads for better rounding
+ spread:=ceiling(spread#*hppp)+eps; enddef;
+@y
+ spread:=2ceiling(spread#*hppp/2)+eps; enddef;
+@z
+
+@x in CMBASE, better diag_ratio routine avoids overflow in hi-res chars
+ numeric a_,b_; b_=b/y; a_=a*a-b_*b_;
+ (a*(c++y*sqrt a_)-b_*c)/a_/y enddef;
+@y
+ numeric a_,b_,c_; b_=b/y; c_=c/y; a_=a*a-b_*b_;
+ (a*(c_++sqrt a_)-b_*c_)/a_ enddef;
+@z
+
+@x in ROMAND, numeral 3, allow hi-res cminch to run without overflow (MacKay)
+x4=1/3[x5,x3l]; z4=z5+whatever*(150u,h);
+@y
+x4=1/3[x5,x3l]; z4=z5+whatever*(15u,.1h);
+@z
+
+@x in ITALP, the Sterling sign (bug caught by Yannis Haralambous)
+lft x6r=hround u; x7=3u; x8=w-3.5u; rt x9r=hround(w-u);
+@y
+lft x6r=hround u; x7=3u; x8=w-3.5u; rt x9l=hround(w-u);
+@z
+
+@x in GREEKL, lowercase omega, I made minor changes for new edition of TAOCP:
+y1+.5hair=h; x1=x2+.75u; pos1(hair,angle(2(x1-x2),y1-y2)+90);
+@y
+y1+.5hair=h; x1=x2+.75u; pos1(hair+dw,angle(2(x1-x2),y1-y2)+90);
+@z
+@x
+x3=.5[x2,x4]; x7+.25u=.5[x6,x8]; rt x8r=hround(w-.5u);
+@y
+x3=.5[x2,x4]; x7-.25u=.5[x6,x8]; rt x8r=hround(w-.5u);
+@z
+
+@x in GREEKL, lowercase beta, I made minor changes for new edition of TAOCP:
+pos3(stem,0); pos4(vair,-90); pos5(hair,-180);
+pos6(vair,-270); pos7(curve,-360); pos8(vair,-450); pos9(hair,-540);
+x0=x1=x9; lft x0l=hround(1.5u-.5hair); x2=x4=x6=x8=.5w+.25u;
+rt x3r=hround(w-1.5u); rt x7r=hround(w-1.5u+.5curve); rt x5l=hround(x4-u);
+bot y0=-d; y1=top y6r=x_height; top y2r=h+oo; y3=.5[y2,y4];
+y5=.5[y4,y6]; top y6r-bot y4r=vstem+eps; bot y8=-oo; y7=y9=.5[y6,y8];
+@y (this change also is made in TSETSL)
+pos3(.8[hair,stem],0); pos4(vair,-90); pos5(hair,-180);
+pos6(vair,-270); pos7(stem,-360); pos8(vair,-450); pos9(hair,-540);
+x0=x1=x9; lft x0l=hround(1.5u-.5hair); x2=x4=x6=x8=.5w-.25u;
+rt x3r=hround(w-1.75u); rt x7r=hround(w-u); rt x5l=hround(x4-u);
+bot y0=-d; y1=top y6r=x_height; top y2r=h+oo; y3=.5[y2,y4];
+y5=.5[y4,y6]; top y6r-bot y4r=vstem+eps; bot y8=-oo; y7=y9=.55[y6,y8];
+@z
+
+@x in ROMANU, less overshoot on uppercase sans serif C (for Vol 2 of TAOCP)
+ top y1r=vround .95h+o; top y2r=h+o; y3=.5h;
+ bot y4r=-o; bot y5r=vround .08h-o; y5l:=good.y y5l; x5l:=good.x x5l;
+@y
+ top y1r=vround .95h+oo; top y2r=h+oo; y3=.5h;
+ bot y4r=-oo; bot y5r=vround .08h-oo; y5l:=good.y y5l; x5l:=good.x x5l;
+@z
+
+@x in ROMANU, likewise for G
+ top y1r=vround .93h+o; top y2r=h+o; y3=.5h;
+ bot y4r=-o; bot y5r=vround .07h-o;
+@y
+ top y1r=vround .93h+oo; top y2r=h+oo; y3=.5h;
+ bot y4r=-oo; bot y5r=vround .07h-oo;
+@z
+
+@x in SYMBOL, spade suit, a cosmetic change that doesn't affect any fonts:
+labels(1,2,3,5,6,10,11,12,13,14,15); endchar;
+@y
+labels(1,2,3,5,6,7,8,9,10,11,12,13,14,15); endchar;
+@z
+
+@x in CMBASE, sloped_serif.l never used $$ except rarely in letter p
+ y@0=max(y@2l-bracket,y$$)-eps;
+@y and in letter p, it was wrong to do so! (but not in any normal font)
+ y@0=y@2l-bracket-eps;
+@z
+@x sloped_serif.r never used $$ in any reasonable way at all
+ y@0=min(y@2l+bracket,y$$)+eps;
+@y
+ y@0=y@2l+bracket+eps;
+@z
+
+in ITALD, programs for 6 and 9: same change as above for partial derivative
+in OLDDIG, programs for 6 and 9: same change as above for partial derivative
+in ROMAND, programs for 6 and 9: same change as above for partial derivative
+in TSETSL, program for partial derivative: same change as above
+
+@x in ROMANL, slight change to cmss10 and cmssbx10 `g' improves meta-ness
+loop_top=Vround .77[vair,fudged.stem];
+@y
+loop_top=if serifs: Vround .77[vair,fudged.stem] else: vair fi;
+@z
+
+@x in CMBASE, recent change shouldn't clobber a_, b_, and c_ of plain.mf
+ numeric a_,b_,c_; b_=b/y; c_=c/y; a_=a*a-b_*b_;
+ (a*(c_++sqrt a_)-b_*c_)/a_ enddef;
+@y
+ numeric aa_,bb_,cc_; bb_=b/y; cc_=c/y; aa_=a*a-bb_*bb_;
+ (a*(cc_++sqrt aa_)-bb_*cc_)/aa_ enddef;
+@z
+
+@x in ITALMS, Arrow (vector) accent
+lft x1=hround .5u; x2=w-x1; y1=y2=good.x .7[x_height,asc_height];
+@y a correction of almost purely academic interest
+lft x1=hround .5u; x2=w-x1; y1=y2=good.y .7[x_height,asc_height];
+@z
+
+the following patches make the arrows more robust, but essentially unchanged
+@x in SYM, Downward arrow
+ --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@y
+ ---z1r..z1l---subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@z
+@x in SYM, Upward arrow
+ --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@y
+ ---z1r..z1l---subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@z
+@x in SYM, Leftward arrow
+ --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@y
+ ---z1l..z1r---subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@z
+@x in SYM, Rightward arrow
+ --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@y
+ ---z1l..z1r---subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@z
+@x in SYM, Left-and-right arrow
+ --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@y
+ ---z1l..z1r---subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@z
+@x ibid
+ --z12l---z11l..z11r---z12r--subpath (t,0) of\\(z13l{z19-z13}..z15r)
+@y
+ ---z11l..z11r---subpath (t,0) of\\(z13l{z19-z13}..z15r)
+@z
+@x in SYMBOL, Up-and-down arrow
+ --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@y
+ ---z1r..z1l---subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@z
+@x ibid
+ --z12r---z11r..z11l---z12l--subpath (t,0) of\\(z13l{z19-z13}..z15r)
+@y
+ ---z11r..z11l---subpath (t,0) of\\(z13l{z19-z13}..z15r)
+@z
+@x in SYMBOL, Northeast arrow
+ --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@y
+ ---z1l..z1r---subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@z
+@x in SYMBOL, Southeast arrow
+ --z2l---z1l..z1r---z2r
+ --subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@y
+ ---z1l..z1r---subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@z
+@x in SYMBOL, Northwest arrow
+ --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@y
+ ---z1l..z1r---subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@z
+@x in SYMBOL, Southwest arrow
+ --z2l---z1l..z1r---z2r
+ --subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@y
+ ---z1l..z1r---subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@z
+@x in ROMMS, Leftward top half arrow
+filldraw z0--(x0,y2l)---z1l..z1r---z2r
+ ..subpath (t,0) of\\(z3r..{2(x0-x3),y0-y3}z5r)
+@y
+filldraw z0--(x0,y2l)--z1l{right}..{left}z1r
+ --subpath (t,0) of\\(z3r..{2(x0-x3),y0-y3}z5r)
+@z
+@x in ROMMS, Leftward bottom half arrow
+filldraw z0{2(x4-x0),y4-y0}..z4l
+ --subpath (0,t) of\\(z4r..{2(x0-x4),y0-y4}z6r)
+@y
+ --z1l{right}..{left}z1r--(x0,y2r)--cycle; % arrowhead and stem
+@z
+@x in ROMMS, Rightward top half arrow
+filldraw z0--(x0,y2l)---z1l..z1r---z2r
+ ..subpath (t,0) of\\(z3l..{2(x0-x3),y0-y3}z5r)
+@y
+filldraw z0--(x0,y2l)--z1l{left}..{right}z1r
+ --subpath (t,0) of\\(z3l..{2(x0-x3),y0-y3}z5r)
+@z
+@x in ROMMS, Rightward bottom half arrow
+ ..z2l---z1l..z1r---(x0,y2r)--cycle; % arrowhead and stem
+@y
+ --z1l{left}..{right}z1r--(x0,y2r)--cycle; % arrowhead and stem
+@z
+@x in BIGDEL, Extensible vertical arrow--top
+ --z2r---z1r--z1l---z2l--subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@y
+ --z1r--z1l--subpath (t,0) of\\(z3l{z9-z3}..z5r)
+@z
+@x in BIGDEL, Extensible vertical arrow--bottom
+ --z2r---z1r--z1l---z2l--subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@y
+ --z1r--z1l--subpath (t,0) of\\(z3r{z9-z3}..z5r)
+@z
+
+@x in ROMLIG, the ligature fi
+ x13=x11-.5; top y14r=min(2x_height,h+1); top y11=x_height;
+@y make the center of the dot consistent with ordinary i, in sans-serif fonts
+ x13=x11-.5; top y14r=min(10/7x_height+.5bulb_diam,h)+1; top y11=x_height;
+@z
+@x in ROMLIG, the ligature ffi
+ x23=x21-.5; top y24r=min(2x_height,h+1); top y21=x_height;
+@y same corrections as to fi
+ x23=x21-.5; top y24r=min(10/7x_height+.5bulb_diam,h)+1; top y21=x_height;
+@z
+
+@x in SYMBOL, the circle operator
+lft x6=hround u; x2=w-x6; top y8=h; y2=math_axis;
+@y this correction makes it a circle even at small size, low resolution
+lft x6=hround u; x2=w-x6; top y8=h; y8-y4=x2-x6;
+@z
+@x in SYMBOL, the bullet
+lft x6=hround u; x2=w-x6; top y8=h; y2=math_axis; circle_points;
+@y likewise
+lft x6=hround u; x2=w-x6; top y8=h; y8-y4=x2-x6; circle_points;
+@z
+
+@x in ROMAND, the numeral 2
+ ..z3e{down}.. z4e---z5e--z6e; % stroke
+@y it's more robust to avoid --- next to -- (in case of tiny loops)
+ ..z3e{down}..{z5e-z4e}z4e--z5e--z6e; % stroke
+@z
+@x in OLDDIG, oldstyle numeral 2
+ ..z3e{down}.. z4e---z5e--z6e; % stroke
+@y likewise
+ ..z3e{down}..{z5e-z4e}z4e--z5e--z6e; % stroke
+@z
+
+@x in CSC, after the second font_setup
+extra_endchar:=extra_endchar&"charcode:=charcode+code_offset";
+@y
+extra_endchar:=extra_endchar&"charcode:=charcode+code_offset;";
+@z
+
+@x in ACCENT, in program for Breve
+numeric mid_thickness; mid_thickness=vround 1/3[vair,stem];
+@y
+numeric mid_thickness; mid_thickness=Vround 1/3[vair,stem];
+@z
+
+@x in CMBASE, a more robust arm routine fixes the 7 in cmbx5,6,7,8
+ filldraw z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l] ]...z@2
+ ---z$l--z$r--z@0--z$$r--cycle; % arm and beak
+@y
+ path p_; p_= z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l] ]...z@2
+ ---z$l--z$r--z@0--z$$r--cycle;
+ if (y$$>y$) <> (ypart precontrol 1 of p_ > ypart postcontrol 1 of p_):
+ p_:=z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l] ]
+ ---z$l--z$r--z@0--z$$r--cycle; fi
+ filldraw p_; % arm and beak
+@z
+
+@x in CALU, I decided in July 2005 that I really wanted a less swashy F
+top y1=top y6=h; z2=.5[z3,z1]+1.2bend;
+bot y3=-o; y4=.1h; y5=y2; y7=.9h;
+draw flex(z1,z2,z3) softjoin (z3...{x4-x3,5(y4-y3)}z4); % stem
+draw z1-flourish_change{up}...(z1-(u,0))---z6...{down}z7; % upper bar
+@y
+top y1=top y6=h; z2=.5[z3,z1]+bend;
+bot y3=-o; y4=.1h; y5=y2; y7=.9h;
+draw flex(z1,z2,z3) softjoin (z3...{x4-x3,5(y4-y3)}z4); % stem
+draw z1-flourish_change+(0,.15asc_height){up}...{right}(z1-(2u,0))
+ ---z6...{down}z7; % upper bar
+@z
+
+@x in SYMBOL, two points of Hardy's asymptotic equivalence sign were unlabeled
+labels(1,2,3,4); endchar;
+@y
+labels(1,2,3,4,5,6); endchar;
+@z
+
+@x in GREEKL, correct a tiny notch that can show up at hires (Charles Duan)
+filldraw z1l--z2l--z--z1r--cycle; % stem
+@y
+filldraw z1l--z2l...(x3,y2l)...z--z1r--cycle; % stem
+@z
+
+@x in GREEKL, make almost-invisible semantic corrections to beta
+x0=x1=x9; lft x0l=hround(1.5u-.5hair); x2=x4=x6=x8=.5w-.25u;
+@y
+x0=x1=x9; lft x0r=hround(1.5u-.5hair); x2=x4=x6=x8=.5w-.25u;
+@z
+@x
+y5=.5[y4,y6]; top y6r-bot y4r=vstem+eps; bot y8=-oo; y7=y9=.55[y6,y8];
+@y
+y5=.5[y4,y6]; top y6r-bot y4r=vstem+eps; bot y8r=-oo; y7=y9=.55[y6,y8];
+@z
+@x and also to delta
+y5+.1x_height=y7=.5[y6,y8]; bot y6=-oo;
+@y
+y5+.1x_height=y7=.5[y6,y8]; bot y6r=-oo;
+@z
+@x and also to phi
+top y1=x_height+oo; y2=y4=.5[y1,y3]; bot y3=-oo;
+@y
+top y1r=x_height+oo; y2=y4=.5[y1,y3]; bot y3r=-oo;
+@z
+
+-----------Here I draw the line with respect to further changes
+
+(I sincerely believe there won't be any more!)
+
+I absolutely guarantee that the TFM files will never change again.
+(Otherwise I would consider zeroing the depth of italic 7,
+which I admit is strange... we can live with it.)