dhosek@jarthur.Claremont.EDU (dhosek) (02/28/90)
Getting MF to do what is desired counts as one of the "frequently asked questions". Here is the infrequently given answer (all you info compilers, take note): MF has one important difference from TeX: TeX needs no customization, MF does. It is difficult, but not impossible to use MF without a working MF and a customized plain.bas file. The first thing to do is create a file containing all the mode_def's that you'll need. A good basis for this is the file waits.mf which should be included with your MF distribution. If you can't find a mode_def for your output device anywhere, listings of settings are published periodically in TUGboat. We will, at this point, assume that you have a file called local.mf which has all the mode_def's that you need in it. The first step will be to regenerate plain.mf with the following command: inimf plain input local dump (if your MF installation does not except command line arguments, type everything beginning with "plain" at the ** prompt). You should now have a file plain.bas. This should be moved to the directory containing the base files on your system. If you are on a multi-user system and your system manager hasn't already done this, complain loudly until it is done. Now you are ready to use MF. The general syntax of MF is mf \mode=<mode_name>; mag=<magnification>; input <filename> where <mode_name> is the name of the mode_def that is relevant, <magnification> is either a floating point number with 1 indicating no magnification, 1.2 being 1.2 times magnification (TeX's \magnification 1200), etc. or magstep n which generates a font at the magstep specified (if you are unfamiliar with magsteps, see the appropriate pasages of the TeXbook and/or MFbook), and <filename> being the name of the file to generate. Thus, to generate cmr10 at 12pt for an epson printer you would type mf \mode=epson; mag=1.2; input cmr10 ----- What if you don't have inimf? First, if you paid for your copy of MF complain to whoever got your money. They should be shipping that as well. Once that is accomplished, you should create a file with the information in it for the mode_def. Note that the mode_def command and enddef are _not_ to be included. As an example, here is a file ln03.mf which contains a mode_def for the LN03 printer with a Ricoh LP engine: % This is ln03.mf as of 2/27/90 % mode_def courtesy of John Sauter proofing:=0; fontmaking:=1; tracingtitles:=0; pixels_per_inch:=300; blacker:=0.65; fillin:=-0.1; o_correction:=.5; to use this file, one would, rather than type \mode=<mode_name> on the MF command, use \smode="ln03"; e.g., mf \smode="ln03"; input cmr17 to generate ln03.300gf for an LN03 printer. -dh -- Important note: The Anti-Social Committee will not be meeting this week. UUCP: uunet!jarthur!dhosek Internet: dhosek@hmcvax.claremont.edu
rusty@garnet.berkeley.edu (rusty wright) (03/01/90)
For those that like to eyeball other people's local.mf here is what I use. This has mode def's that have been collected over the ages. Some of the more recent mode def's (the ones before white_setup) are from Doug Henderson. white_setup.mf follows in a separate article. % It is customary to input another file to supplement the PLAIN base. % This supplementary file adds analogous modes, corresponding to % local output devices, and it redefines `localfont' as appropriate. % The values of screen_rows and screen_cols should also be updated. % The auxiliary file should set base_version := base_version&"/localname". % Remember that the present file PLAIN.MF should not be changed; % all local changes should be confined to a separate file. % this file can be loaded after PLAIN.MF. % it introduces conventions that are commonly used at ucb css. base_version := base_version&"/ucb css"; message "Updating to "&base_name&" version "&base_version&"."; % screen default dimensions for SUN workstations graphic windows def sun_setup = screen_rows := 400; screen_cols := 480; enddef; % ibm color graphics (640x200) def ibm_color_graphics_setup = screen_rows:=200; screen_cols:=640; enddef; % ibm enhanced color graphics (640x350) % ibm enhanced mono graphics (640x350) def ibm_enhanced_color_graphics_setup = screen_rows:=350; screen_cols:=640; enddef; % hercules graphics card (720x348) def hercules_setup = screen_rows:=348; screen_cols:=720; enddef; % hp vectra pc (640x400) % at&t pc-6300 (olivetti m24) (640x400) % ncr pc6/pc4i (640x400) % toshiba t3100 (640x400) def hp_vectra_setup = screen_rows:=400; screen_cols:=640; enddef; % wyse wy-700 (1280x800) def wyse_wysevenzerozero_setup = screen_rows:=800; screen_cols:=1280; enddef; % mds genius vhr (736x1008) def mds_genius_vhr_setup = screen_rows:=1008; screen_cols:=736; enddef; % if a mode_def includes the statement: % let font_setup = white_setup % it will replace the cmbase.mf font_setup with this corrected version. input white_setup % what modes exist in this preload? mode_def help = for i=1 upto number_of_modes: message mode_name[i]; endfor; save ?; % only use this once. it doesn't make sense to repeat enddef; let ? = help_; % Here are conventions for local output devices: % copying aps mode: for the Linotype Linotronic 100 mode_def linoonezerozero = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % yes, show titles online pixels_per_inch := 1270; % that's roughly 18 per pt blacker := .2; % (this value is conjectural) fillin := .2; % (ditto) o_correction := 1; % (ditto) enddef; % copying aps mode: for the Linotype Linotronic 300 mode_def linothree = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 1; % yes, show titles online pixels_per_inch := 2540; % that's roughly 35 per pt blacker := .2; % (this value is conjectural) fillin := .2; % (ditto) o_correction := 1; % (ditto) enddef; % Apple LaserWriter mode (Canon engine) mode_def laserwriter = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles at all pixels_per_inch := 300; % the new Canon engine at 300/inch blacker := 0.3; % Canon engine isn't black enough fillin := 0.15; % very small compensation for diagonal fillin o_correction := .4; % but don't overshoot as much enddef; % sun mode: for the Sun Workstation for proofing mode_def sun = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles pixels_per_inch := 120; % really lowres blacker := 0.65; % make the pens a bit blacker fillin := 0.2; % compensate for diagonal fillin o_correction := 0.4; % don't overshoot as much enddef; % realsun mode: for the Sun Workstation for windows mode_def realsun = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles pixels_per_inch := 82; % really lowres blacker := 0.65; % make the pens a bit blacker fillin := 0.2; % compensate for diagonal fillin o_correction := 0.4; % don't overshoot as much enddef; % epson mode: for printers like the epson fx series mode_def epson = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 240; % lowres blacker := 0; % don't make the pens any blacker fillin := 0; % and don't compensate for fillin o_correction := 0.2; % but suppress most overshoots aspect_ratio := 9/10; % 216 dots/inch vertical enddef; % lowest possible resolution recommended mode_def lowest = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no don't show titles in the log pixels_per_inch := 101; % lowest DEK recommends blacker := 0; % no additional blackness fillin := 0; % no compensation for fillin o_correction := 1; % no reduction in overshoot enddef; % graphics mode mode_def graphics = proofing := 0; % no, we're not making proofs fontmaking := 0; % no, we are not making a font tracingtitles := 1; % yes, show titles in the log pixels_per_inch := 1000; o_correction := 1; % no reduction in overshoot enddef; % for onscreen viewing of CGA proofs (full screen) mode_def cgaoneproof = proofing := 2; % yes, we're making full proofs fontmaking := 0; % no, we're not making a font tracingtitles := 0; % no don't show titles online pixels_per_inch := 2602; % make it easy to view one char on screen blacker := 0; % no additional blackness fillin := 0; % no compensation for fillin o_correction := 1; % no reduction in overshoot aspect_ratio := 265/640; % adjust for screen skewing also enddef; % for onscreen viewing of CGA proofs (full screen) mode_def cgaomniproof = cgaoneproof_; % same as cgaoneproof except... pixels_per_inch := 1301; % make it easy to see 3 or 6 chars on screen enddef; % for onscreen viewing of CGA smoke proofs (tick marks) mode_def cgasmoke = cgaoneproof_; % same as cgaproof mode, except: proofing := 1; % yes, we're making unlabeled proofs extra_setup := extra_setup&"grayfont black"; % with solid black pixels let makebox=maketicks; % make the boxes less obtrusive enddef; % for onscreen viewing of EGA ?test proofs (full screen) mode_def egaoneproof = proofing := 2; % yes, we're making full proofs fontmaking := 0; % no, we're not making a font tracingtitles := 0; % no don't show titles online pixels_per_inch := 2602; % change to 1300 for use with 3test or 6test blacker := 0; % no additional blackness fillin := 0; % no compensation for fillin o_correction := 1; % no reduction in overshoot aspect_ratio := 500/640; % adjust for screen skewing also enddef; % for onscreen viewing of EGA 3test+6test proofs mode_def egaomniproof = egaoneproof_; % same as egaoneproof mode, except: pixels_per_inch := 1301; % make it easy to view on the screen enddef; % for onscreen viewing of EGA smoke proofs (tick marks) mode_def egasmoke = egaoneproof_; % same as egaoneproof mode, except: proofing := 1; % yes, we're making unlabeled proofs extra_setup := extra_setup&"grayfont black"; % with solid black pixels let makebox=maketicks; % make the boxes less obtrusive enddef; % for onscreen viewing of HGC proofs (full box) mode_def hgconeproof = proofing := 2; % yes, we're making full proofs fontmaking := 0; % no, we're not making a font tracingtitles := 0; % no don't show titles online pixels_per_inch := 2602; % make it easy to view one char on screen blacker := 0; % no additional blackness fillin := 0; % no compensation for fillin o_correction := 1; % no reduction in overshoot aspect_ratio := 520/720; % adjust for screen skewing also enddef; % for onscreen viewing of HGC proofs (full box) mode_def hgcomniproof = hgconeproof_; % same as hgconeproof, except... pixels_per_inch := 1301; % make it easy to view 3 or 6 chars on screen enddef; % for onscreen viewing of HGC smoke proofs (tick marks) mode_def hgcsmoke = hgconeproof_; % same as hgconeproof mode, except: proofing := 1; % yes, we're making unlabeled proofs extra_setup := extra_setup&"grayfont black"; % with solid black pixels let makebox=maketicks; % make the boxes less obtrusive enddef; % previewlow mode: for Textset previewer at lowest resolution mode_def previewlow = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles pixels_per_inch := 80; % really REALLY lowres blacker := 0.65; % make the pens a bit blacker fillin := 0.2; % compensate for diagonal fillin o_correction := 0.4; % don't overshoot as much enddef; % previewmed mode: for Textset previewer at medium resolution mode_def previewmed = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles pixels_per_inch := 118; % really lowres blacker := 0.65; % make the pens a bit blacker fillin := 0.2; % compensate for diagonal fillin o_correction := 0.4; % don't overshoot as much enddef; % previewhigh mode: for Textset previewer at highest resolution mode_def previewhigh = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles pixels_per_inch := 300; % not so lowres blacker := 0.65; % make the pens a bit blacker fillin := 0.2; % compensate for diagonal fillin o_correction := 0.4; % don't overshoot as much enddef; % mode for macintosh (72 dots per inch) mode_def macintosh = pixels_per_inch := 72; % ultra lowres blacker := 0; % imagewriter is black enough o_correction := 0.2; % don't overshoot too much fillin := 0; % it fills in the diagonals proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles enddef; % mode for Imagewriter (144 dots per inch) mode_def imagewriter = pixels_per_inch := 144; % lowres blacker := 0; % imagewriter is black enough o_correction := 0.2; % don't overshoot too much fillin := 0; % it fills in the diagonals proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles enddef; % Ricoh 4080: for the TI Omnilaser (Stan Osborne's values TUGboat 8,2,134) mode_def RicohFortyEighty = let font_setup = white_setup; % use the write-white font_setup proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles at all pixels_per_inch := 300; % Ricoh write-white engine. blacker := 0.2; % Don't overblack the small fonts fillin := -0.2; % reverse comp. for diagonal fillin o_correction := 0.5; % but don't overshoot as much enddef; % imagen mode: for the Imagen 8/300 (Canon engine) mode_def imagen = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 300; blacker := 0; % Canon engine is black enough fillin := 0.2; % and it tends to fill in diagonals o_correction := 0.6; % enddef; % canon mode: for the old Imagen (Canon LBP10) mode_def canon = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 240; blacker := 0.2; % make pens a wee bit blacker fillin := 0.2; % and compensate for fillin o_correction := 0.4; % but don't overshoot as much enddef; % for the QMS (Xerox engine) mode_def qms = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 300; blacker := 0.3; % (this value not yet tested) fillin := 0.2; % (ditto) o_correction := 0.5; % (ditto) enddef; % dover mode: for the Xerox Dover mode_def dover = proofing := 0.0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 384; blacker := 1.2; % make pens somewhat blacker fillin := 0.0; % no compensation for fillin o_correction := 0.6; % but don't overshoot as much enddef; % aps mode: for the Autologic APS-Micro5 mode_def aps = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 1; % yes, show titles online pixels_per_inch := 722.909; % that's roughly 10 per pt blacker := 0.2; % make pens a teeny bit blacker fillin := 0.2; % but compensate for diagonal fillin o_correction := 1; % and keep the full overshoot enddef; % crs mode: for the Alphatype CRS mode_def crs = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 1; % yes, show titles online begingroup interim warningcheck := 0; % (we need to go past 4096) pixels_per_inch := 4000+4000/3 % HIGH res endgroup; blacker := 4.0; % make pens a lot blacker fillin := 0.0; % but don't compensate for fillin o_correction := 1.0; % and keep the full overshoot enddef; % boise mode: for the HP 2680A mode_def boise = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 180; blacker := 0.55; % make pens a bit blacker fillin := 0.1; % and compensate for diagonal fillin o_correction := 0.3; % but don't overshoot much enddef; % DD mode: for the DataDisc (usually with mag=magstep 2=1.44) mode_def DD = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 70; % really lowres blacker := 0.0; % don't make the pens any blacker fillin := 0.0; % and don't compensate for fillin o_correction := 0.2; % but suppress most overshoots enddef; % newDD mode: for DataDisc with special aspect ratio mode_def newDD = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 70; % really lowres blacker := 0; % don't make the pens any blacker fillin := 0; % and don't compensate for fillin o_correction := .2; % but suppress most overshoots aspect_ratio := 4/3; % this is the new feature... enddef; % cg mode: for the Compugraphic 8600 mode_def cg = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 1; % yes, show titles online pixels_per_inch := 1301.5; % a bit less than 20 per pt blacker := .2; % make pens a teeny bit blacker fillin := .2; % but compensate for diagonal fillin o_correction := 1; % and keep the full overshoot aspect_ratio := 1569/1301.5; % strange, no? enddef; % corona mode: for the Corona LP-300 (Canon engine) mode_def corona = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are not making a font tracingtitles := 0; % no titles in the log pixels_per_inch := 300; blacker := .3; % (this value is conjectural) fillin := .2; % (ditto) o_correction := .6; % (ditto) enddef; % varityper mode: for the VT-600 version 42.5 mode_def varityper = proofing := 0; % no, we're not making proofs fontmaking := 1; % yes, we are making a font tracingtitles := 0; % no, don't show titles in the log pixels_per_inch := 600; blacker := 0; % (this value is conjectural) fillin := .2; % (ditto) o_correction := .6; % (ditto) enddef; % default ucb wssg output device localfont := laserwriter; % Macros to add mode information specials to fonts. def mode_special(suffix $) = string s, d; s := str$; d := decimal scantokens s; special s&" := "&d&";" enddef; def font_mode_specials = p_p_i = pixels_per_inch/mag; if fontmaking > 0: begingroup; save d, s, p; save pixels_per_inch; string p; pixels_per_inch := p_p_i; special jobname; mode_special(mag); p := substring(0,length(mode_name[mode])-1) of mode_name[mode]; special "mode := "&p&";"; mode_special(pixels_per_inch); mode_special(blacker); mode_special(fillin); mode_special(o_correction); endgroup; fi enddef; inner end; def bye = if fontmaking > 0: font_mode_specials; fi end enddef; outer bye, end; % Finally, here are macros for Xerox-world font info: % string s names the font family, e.g., "CMR" def font_family expr s = headerbyte 49: BCPL_string(s, 20); special "identifier "&s enddef; % string s names the scheme, e.g. "TEX TEXT" def coding_scheme expr s = headerbyte 9: BCPL_string(s, 40); special "codingscheme "&s enddef; % % integer x gives the family member number, def font_face_byte expr x = headerbyte 72: x; % which should be between 0 and 255 special "fontfacebyte"; numspecial x enddef; % string s becomes an n-byte BCPL string def BCPL_string(expr s, n) = for l := if length(s) >= n : n-1 else: length(s) fi: l for k := 1 upto l: , substring (k-1, k) of s endfor for k := l+2 upto n: , 0 endfor endfor enddef; -- -------------------------------------- rusty c. wright rusty@violet.berkeley.edu ucbvax!violet!rusty
rusty@garnet.berkeley.edu (rusty wright) (03/01/90)
Here is white_setup.mf. % The basic correction for write-white fonts occurs in the definition % font_setup. This can be used to overwrite the write-black % definition in cmbase.mf % def white_setup = if monospace: let adjust_fit=mono_adjust_fit; def mfudged=fudged enddef; mono_charic#:=body_height#*slant; if mono_charic#<0: mono_charic#:=0; fi mono_charwd#:=9u#; define_whole_pixels(mono_charwd); else: let adjust_fit=normal_adjust_fit; def mfudged= enddef; fi if math_fitting: let math_fit=do_math_fit else: let math_fit=ignore_math_fit fi; define_pixels(u,width_adj,serif_fit,cap_serif_fit,jut,cap_jut,beak, bar_height,dish,bracket,beak_jut,stem_corr,vair_corr,apex_corr); define_blacker_pixels(notch_cut,cap_notch_cut); forsuffixes $=notch_cut,cap_notch_cut: if $<3: $:=3; fi endfor 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, dot_size,cap_hair,cap_stem,cap_curve); define_whole_vertical_blacker_pixels(vair,bar,slab,cap_bar,cap_band); define_corrected_pixels(o,apex_o); forsuffixes $=hair,stem,cap_stem: fudged$.#:=fudge*$.#; fudged$:=hround(fudged$.#*hppp+blacker); forever: exitif fudged$>.9fudge*$; fudged$:=fudged$+1; endfor endfor rule_thickness:=ceiling(rule_thickness#*hppp); heavy_rule_thickness:=ceiling(3rule_thickness#*hppp); oo:=vround(.5o#*hppp*o_correction)+eps; apex_oo:=vround(.5apex_o#*hppp*o_correction)+eps; lowres_fix(stem,curve,flare) 1.3; lowres_fix(stem,curve) 1.2; lowres_fix(cap_stem,cap_curve) 1.2; lowres_fix(hair,cap_hair) 1.2; lowres_fix(cap_band,cap_bar,bar,slab) 1.2; stem':=hround(stem-stem_corr); cap_stem':=hround(cap_stem-stem_corr); vair':=vround(vair+vair_corr); vstem:=vround .8[vair,stem]; cap_vstem:=vround .8[vair,cap_stem]; ess:=(ess#/stem#)*stem; cap_ess:=(cap_ess#/cap_stem#)*cap_stem; dw:=(curve#-stem#)*hppp; bold:=curve#*hppp+blacker; dh#:=.6designsize; stem_shift#:=if serifs: 2stem_corr# else: 0 fi; more_super:=max(superness,sqrt .77superness); hein_super:=max(superness,sqrt .81225258superness); % that's $2^{-.3}$ clear_pen_memory; if fine=0: fine:=1; fi forsuffixes $=fine,crisp,tiny: %%% fine $ %%%% temporary formatting convention for MFT if $>fudged.hair: $:=fudged.hair; fi $.breadth:=$; pickup if $=0: nullpen else: pencircle scaled $; $:=$-eps fi; $.nib:=savepen; breadth_[$.nib]:=$; forsuffixes $$=lft,rt,top,bot: shiftdef($.$$,$$ 0); endfor endfor %%% @ $ %%%% restore ordinary formatting for $ min_Vround:=max(fine.breadth,crisp.breadth,tiny.breadth,2); % "WRITE WHITE" ONLY! if min_Vround<vround min_Vround: min_Vround:=vround min_Vround; fi if flare<vround flare: flare:=vround flare; fi forsuffixes $=vair,bar,slab,cap_bar,cap_band,vair',vstem,cap_vstem,bold: if $<min_Vround: $:=min_Vround; fi endfor pickup pencircle scaled rule_thickness; rule.nib:=savepen; math_axis:=good.y(math_axis#*hppp); pickup pencircle scaled if hefty:(.6[vair,fudged.hair]) else:fudged.hair fi; light_rule.nib:=savepen; pickup pencircle xscaled cap_curve yscaled cap_hair rotated 30; cal.nib:=savepen; pair cal.extension; cal.extension:=(.75cap_curve,0) rotated 30; pickup pencircle xscaled cap_curve yscaled cap_hair rotated 70; tilted.nib:=savepen; pickup pencircle xscaled curve yscaled cap_hair rotated 70; med_tilted.nib:=savepen; pickup pencircle xscaled cap_stem yscaled cap_hair rotated 30; med_cal.nib:=savepen; pickup pencircle xscaled stem yscaled cap_hair rotated 30; light_cal.nib:=savepen; pickup pencircle xscaled(cap_curve+dw) yscaled cap_hair rotated 30; heavy_cal.nib:=savepen; bot_flourish_line:=-.5u-o; pair bend; bend=(.5u,0); pair flourish_change; flourish_change=(4u,.2asc_height); join_radius:=u; currenttransform:=identity slanted slant yscaled aspect_ratio scaled granularity; if currenttransform=identity: let t_=relax else: def t_ = transformed currenttransform enddef fi; numeric paren_depth#; .5[body_height#,-paren_depth#]=math_axis#; numeric asc_depth#; .5[asc_height#,-asc_depth#]=math_axis#; body_depth:=desc_depth+body_height-asc_height; shrink_fit:=1+hround(2letter_fit#*hppp)-2letter_fit; if not string mode: if mode<=smoke: shrink_fit:=0; fi fi forsuffixes $=thin_join,hair,curve,flare,dot_size,cap_hair,cap_curve, vair,bar,slab,cap_bar,cap_band,stem',cap_stem',vair',fudged.hair, fudged.stem,fudged.cap_stem: $:=max($,2); endfor % "WRITE WHITE" ONLY! enddef; -- -------------------------------------- rusty c. wright rusty@violet.berkeley.edu ucbvax!violet!rusty