diff options
Diffstat (limited to 'Master/texmf-dist/doc/generic/knuth-errata/cm85.bug')
-rw-r--r-- | Master/texmf-dist/doc/generic/knuth-errata/cm85.bug | 1906 |
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.) |