[comp.text.tex] Send me your Metafont modes

karl@apple-gunkies.ai.mit.edu (Karl Berry) (03/08/91)

I am attempting to collect all extant Metafont mode_def's, and am asking
for your contributions.  Here is my reasoning.

To date, most sites each have their own ``local modes'' file, as the
Metafontbook suggests.  But these modes are rarely developed locally
(nor should they be).  Instead, a larger file (waits.mf, for example) is
copied, and extraneous definitions removed.  This is what I did myself
at the sites at which I've installed Metafont.

But I now believe this is the wrong approach.  Instead, we should all be
using the *same* local file, thereby ensuring consistency in the fonts
generated between sites.  This will not take up much memory space in
Metafont.  I counted the number of ``output devices'' for which there
are users in TUGboat, and came up with around 100.  This many mode_def's
only takes up a few hundred words of memory, a small price to pay for
portability.

Furthermore, having one master modes file has another important
advantage.  The auxiliary definitions for producing
1) GF specials with mode information,
2) TFM header bytes with the ``Xerox world'' font information,
and 3) corrected fonts for write-write printers
can be placed there, thus ensuring that this information is propagated
as widely as possible.

Finally, many Metafont installers have questions about using the modes
file (perhaps the most common is ``why do my output files always have
the extension .2602gf?'').  Answers to prosaic questions like this are
usually present in the Metafontbook, but are not always easily found.
All such information can be collected in this one file.

So, I solicit your mode_def's.  The list of what I have now is below.
If you have additional ones, or if you did experiments to find good
values for any of the mode_def's below, please send them on to me or
Doug Henderson <dlatex@cmsa.berkeley.edu>; Doug has been maintaining a
mode_def list for several years, and he and I are cooperating in this.

The current version of this file is appended to this message (it is
about 20K big).  If you save it, please name it `modes.mf'.  You can
also get it by ftp from ftp.cs.umb.edu [192.12.26.23], in
pub/tex/modes.mf.  I will also send it by email if you cannot ftp, at
least until the file is at some mail-server accessible site.  I will
post announcements whenever there is a revision.  (I don't expect that
to happen frequently!)

karl@cs.umb.edu


% Compiled 1991 by Karl Berry from modes collected by Doug Henderson,
% Pierre MacKay, and others.  This file is in the public domain.  Please
% change this file to add new modes (and send them to {\tt
% karl@cs.umb.edu} or {\tt dlatex@cmsa.berkeley.edu}), and to change the
% definitions of |localfont|, |screen_cols|, and |screen_rows| at the
% end of file (see explanations below).
% 
%%% def mode_def
%%% addto font_size coding_scheme font_face_byte landscape landscape_
% 
% @mffile{
%   author = "Pierre MacKay, Doug Henderson, et al."
%   version = "0.2",
%   date = "6 March 1991"
%   filename = "modes.mf",
%   contact = "Karl Berry",
%   email = "karl@cs.umb.edu"
%   address = "135 Center Hill Rd. // Plymouth, MA 02360"
%   checksum = "716   3035  23048",
%   codetable = "ISO/ASCII",
%   supported = "yes",
%   docstring = "
% This file collects all known \MF\ modes, some of which have not been
% tested.  It also makes definitions to put specials in the \MF\ GF
% output identifying the mode, and to put the coding scheme and other
% so-called Xerox-world information in the TFM output.  Finally, it
% defines some code to handle write-white devices better; this code
% comes into play if a |mode_def| includes the statement 
% |let font_setup = white_setup;|.  This only works for those fonts
% which follow Computer Modern's conventions for using |font_setup|.
% 
% This file follows a naming convention that has emerged in the
% discussion of |mode_def|s in {\sl TUGboat}.
% 
% \item{1)} The print engine is identified wherever possible,
%   rather than the printer which incorporates that engine.
% 
% \item{2)} Because |mode_def| names may not contain digits,
%   each digit is spelled out; e.g., {\tt RicohFourZeroEightZero}.
% 
% \item{3)} For historical reasons, some modes have synonyms of all
%   lowercase letters, e.g., `cx' for `CanonCX'.  These abbreviations
%   mostly come from {\tt waits.mf}, a predecessor to this file.
%
% This file is typically loaded when making a \MF\ base; for example,
% the command line {\tt inimf plain input modes} makes a file {\tt
% plain.base} (or {\tt plain.bas'}, or something like that) with all the
% modes herein defined (plain itself defines modes called |proof|,
% |smoke|, and |lowres|.)
% 
% A user selects a particular mode when s/he runs \MF, by assigning to
% the variable |mode|.  For example, typing
% {\tt \char`\\mode:=CanonCX; input cmr10}
% sets up values appropriate for the CanonCX engine.
% 
% If no mode is assigned, the default is |proof| mode, as stated in {\sl
% The \MF book}.  This is the cause of the ``{\tt .2602gf}'' files which
% are a periodic question in the \TeX\ community.
% 
% Every site should define the mode |localfont| to be a synonym for the
% mode most commonly used there.  This file defines |localfont| to be
% |CanonCX|.  The values for |screen_rows| and |screen_cols|, which
% determine how big \MF's window for online output is, should perhaps
% also be changed; individual users should definitely change them to
% their own tastes.
% 
% This file defines {\tt ?} to type out a list of all the known
% |mode_def|s (once only).
% 
% A |mode_def| is a \MF\ definition that typically consists of a series
% of assignments to various device-specific variables, either primitive
% or defined in plain.  These variables include the following (page
% numbers refer to {\sl The \MF book\/}:
% 
% |proofing|: says whether to put additional specials in the GF file for
%   use in making proofsheets with the assistance of, e.g., the utility
%   program {\tt GFtoDVI} (page 323--4).
% 
% |fontmaking|: if nonzero at the end of the job, \MF\ makes a TFM file
%   (page 315).
% 
% |tracingtitles|: if nonzero, strings that appear as \MF\ statements
%   are typed on the terminal (page 187).
% 
% |pixels_per_inch|: the horizontal resolution; the \MF\ primitive
%   |hppp| (which is what determines the extension on the GF filename, as
%   among other things) is computed from this (page 94).
%
% |aspect_ratio|: the ratio of the vertical resolution to the horizontal
%   resolution (page 94).
% 
% |blacker|: a correction added to the width of stems and similar
%   features, to account for devices which would otherwise make them too
%   light (page 93).  (Write-white devices are best handled in more
%   complicated ways than just adding to |blacker|, as explained above.)
% 
% |fillin|: a correction factor for diagonals and other features which
%   would otherwise be ``filled in'' (page 94).  An ideal device would
%   have |fillin=0| (page 94).
% 
% |o_correction|: a correction factor for the ``overshoot'' of curves
%   beyond the baseline (or x-height, or some other line).  High
%   resolution curves look better with overshoot, so such devices should
%   have |o_correction=1|; but at low resolutions, the overshoot appears
%   to simply be a distortion (page 93).
% 
% Neenie Billawala's article in the April 1987 issue of {\sl TUGboat}
% describes how to test your printer for the best set of values for the
% magic numbers above.
% 
% P.S.: You can run this file through {\tt mft} to generate a \TeX\
% file, if you like reading typeset output instead of computer screens.
%"
% }

base_version:=base_version&"/modes";

% This definition is invoked by all the modes, after |pixels_per_inch|
% has been defined, thus saving some space and time.
% 
def common_mode_setup_ =
  proofing := 0;
  fontmaking := 1;
  tracingtitles := if pixels_per_inch > 700: 1 else: 0 fi;
enddef;

% Here are macros to add specials with mode information to the GF file.

def mode_special (suffix $) =
  string s, d;
  s := str$;
  d := decimal scantokens s;
  special s & " := " & d & ";"
enddef;

def font_mode_specials =
  if fontmaking > 0:
    begingroup;
      save d, s, p, p_p_i;
      string p;
      
      interim warningcheck := 0; % In case |pixels_per_inch>4096|.
      
      % We need the old |pixels_per_inch| to compute the true device
      % resolution.
      p_p_i = pixels_per_inch / mag;
      
      % But now we want to change |pixels_per_inch|, so we |save| the
      % old value.
      save pixels_per_inch;
      pixels_per_inch := p_p_i;
      
      special jobname;
      mode_special (mag);
      
      p := if string mode:
             mode
           else:
             substring (0, length (mode_name[mode]) - 1) of mode_name[mode]
           fi;
      special "mode := " & p & ";";
      
      mode_special (pixels_per_inch);
      if aspect_ratio <> 1:
        mode_special (aspect_ratio);
      fi;
      mode_special (blacker);
      mode_special (fillin);
      mode_special (o_correction);
      endgroup;
    fi
enddef;


% Here are macros for Xerox-world font info, which can be useful even
% if you never use a Xerox printer.  For instance, {\tt crudetype} uses
% the |coding_scheme| and it is nice to have the font family on record.
% Some of this goes into the TFM file; we also put it into the GF file.

% Make the string |s| be |n| bytes long.
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;

% The string |s| names the font family, e.g., {\tt CMR}.
def font_family expr s =
  headerbyte 49: BCPL_string(s, 20);
  special "identifier " & s
enddef;

% The string |s| names the encoding scheme, e.g., {\tt TEX TEXT}.
def coding_scheme expr s =
  headerbyte 9: BCPL_string(s, 40);
  special "codingscheme " & s
enddef;

% The integer |x| gives the family member number, which should be
% between 0 and 255.
def font_face_byte expr x =
  headerbyte 72: x;
  special "fontfacebyte";
  numspecial x
enddef;

% So users can say |if known Xerox_world: $\ldots$ fi|
Xerox_world := 1;

% Redefine |bye| to produce all this extra information.
inner end;
def bye =
  if fontmaking > 0:
    font_family font_identifier_;
    coding_scheme font_coding_scheme_;
    font_face_byte max (0, 254 - round 2designsize); 
    font_mode_specials;
  fi;
  end.
enddef;

outer bye,end;


% Here are macros to handle write-white printers.
%
% The basic correction for write-white fonts occurs in the definition of
% |font_setup|.  This can be used to overwrite the write-black
% definition in {\tt 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 $
 % Write-white {\it only:}
 min_Vround:=max(fine.breadth,crisp.breadth,tiny.breadth,2);
 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,
 % Write-white {\it only:}
 fudged.stem,fudged.cap_stem: $:=max($,2); endfor
 enddef;


% Here are definitions to change to ``landscape'' mode.  You just say
% {\tt mode := whatever; landscape; ...}, and when |mode_setup| is
% executed, the |aspect_ratio| will be inverted, and |pixels_per_inch|
% changed.
def landscape =
  extra_setup := extra_setup & "landscape_;";
enddef;

def landscape_ =
  begingroup
    interim warningcheck := 0;
    pixels_per_inch := aspect_ratio * pixels_per_inch;
    aspect_ratio := 1 / aspect_ratio;
  endgroup
enddef;


% Here are the modes, given in alphabetical order (without regard to case).

% From {\tt rokicki@neon.stanford.edu}.
mode_def amiga =			% Commodore Amiga.
  pixels_per_inch := 100;
  blacker := 0;
  fillin := 0;
  o_correction := .2;
  common_mode_setup_;
enddef;

mode_def aps =                          % Autologic APS-Micro5
  pixels_per_inch := 722.909;
  blacker := .2;
  fillin := .2;
  o_correction := 1;
  common_mode_setup_;
enddef;

mode_def bitgraph =                     % BBN Bitgraph at 118dpi
  pixels_per_inch := 118;
  blacker := .55;
  fillin := .1;
  o_correction := .3;
  common_mode_setup_;
enddef;

mode_def boise =                        % HP 2680A
  pixels_per_inch := 180;
  blacker := .55;
  fillin := .1;
  o_correction := .3;
  common_mode_setup_;
enddef;

mode_def CanonCX =                      % e.g., Apple LaserWriter
  pixels_per_inch := 300;
  blacker := 0;
  fillin := .2;
  o_correction := .6;
  common_mode_setup_;
enddef;
cx := CanonCX;
corona := CanonCX;
imagen := CanonCX;
laserwriter := CanonCX;

mode_def CanonLBPTen =                  % e.g., Symbolics LGP-10
  pixels_per_inch := 240;
  blacker := .2;
  fillin := .2;
  o_correction := .4;
  common_mode_setup_;
enddef;
canon := CanonLBPTen;

% The Chelgraph IBX is the machine introduced to North American \TeX\
% users by Type~2000 in Mill Valley, California; telephone
% (415)~388-8873.  Since the machine's stated output resolution is only
% 2000\thinspace dpi this truly spectacular 9600\thinspace dpi must be
% used for translation to anaaaa outline font description.  This
% |mode_def| has been tested and used in a publication of the University
% of Washington Press.  These values from Pierre MacKay, based on Lance
% Carnes' crs values, at magstep~1.8.
mode_def ChelgraphIBX =			% Chelgraph IBX
  begingroup interim warningcheck := 0;
    pixels_per_inch := 4000 + 4000 + 1600 endgroup;
  blacker := 4;
  fillin := 0;
  o_correction := 1;
  common_mode_setup_;
enddef;

% From {\tt rokicki@cs.umb.edu}.
mode_def CItohThreeOneZero =		% CItoh 310
  pixels_per_inch := 240;
  aspect_ratio := 144 / pixels_per_inch;
  blacker := 0;
  fillin := 0;
  o_correction := .2;
  common_mode_setup_;
enddef;
cthreeten := CItohThreeOneZero;

mode_def CompugraphicEightSixZeroZero =	% Compugraphic 8600
  pixels_per_inch := 1301.5;
  aspect_ratio := 1569 / pixels_per_inch;
  blacker := .2;
  fillin := .2;
  o_correction := 1;
  common_mode_setup_;
enddef;
cg := CompugraphicEightSixZeroZero;

% This has a resolution of |5333 + 1/3| pixels per inch.
mode_def crs =                          % Alphatype CRS
  begingroup interim warningcheck := 0;
    pixels_per_inch := 4000 + 4000/3 endgroup;
  blacker := 4; 
  fillin := 0;
  o_correction := 1;
  common_mode_setup_;
enddef;

% At least magstep 2 is recommended at this low resolution.
mode_def DataDisc =                     % DataDisc
  pixels_per_inch := 70;
  blacker := 0;
  fillin := 0;
  o_correction := .2;
  common_mode_setup_;
enddef;
DD := DataDisc;

mode_def DataDiscNew =                  % DataDisc with special aspect ratio
  DataDisc_;
  aspect_ratio := 4/3;
enddef;
newDD := DataDiscNew;

mode_def dover =                        % Xerox Dover
  pixels_per_inch := 384;
  blacker := 1.2;
  fillin := 0;
  o_correction := .6;
  common_mode_setup_;
enddef;

% These values from Charles Karney, {\sl TUGboat} 8(2), page 133.
mode_def epson =                        % Epson
  pixels_per_inch := 240;
  aspect_ratio := 216 / pixels_per_inch;
  blacker := 0;
  fillin := 0;
  o_correction := .2;
  common_mode_setup_;
enddef;
epshi := epson;

mode_def epsonlo =			% Epson at 120dpi
  epson_;
  pixels_per_inch := 120;
  aspect_ratio := 144 / pixels_per_inch;
enddef;
epslo := epsonlo;

% Perhaps the value for |fillin| should be 0.
mode_def imagewriter =                  % Apple ImageWriter
  pixels_per_inch := 144;
  blacker := 0;
  fillin := 0.3;
  o_correction := .2;
  common_mode_setup_;
enddef;
iw := imagewriter;

mode_def LinotypeOneZeroZeroLo =	% Linotype Linotronic 100 at 635dpi
  LinotypeOneZeroZero_;
  pixels_per_inch := 635;
enddef;
linolo := LinotypeOneZeroZeroLo;

% Perhaps the values for |blacker|, |fillin|, and |o_correction| should
% all be zero?
mode_def LinotypeOneZeroZero =          % Linotype Linotronic 100
  pixels_per_inch := 1270;
  blacker := .2;                % Copied from |aps|---conjectural.
  fillin := .2;                 % (ditto)
  o_correction := 1;            % (ditto)
  common_mode_setup_;
enddef;
linoone := LinotypeOneZeroZero;
linohi := LinotypeOneZeroZero;

mode_def LinotypeThreeZeroZero =        % Linotype Linotronic 300
  pixels_per_inch := 2540;
  blacker := .2;                % Copied from |aps|---conjectural.
  fillin := .2;                 % (ditto)
  o_correction := 1;            % (ditto)
  common_mode_setup_;
enddef;
linothree := LinotypeThreeZeroZero;
linosuper := LinotypeThreeZeroZero;

% These values from {\tt karl@cs.umb.edu}.  |blacker = .8| or more
% thickens dots, to their detriment.  |blacker = .6| produces two-pixel
% stems, which looks pretty good for {\tt cmr}, but it's a little dark
% for {\tt cmti}, and {\tt cmbx} and {\tt cmr} then turn out the same.
% |o_correction = 1| made no difference.  |fillin = 1| made no
% difference.
mode_def lview =                        % Sigma L-View monitor
  pixels_per_inch := 118.06;
  aspect_ratio := 109.25 / pixels_per_inch;
  blacker := 0;
  fillin := 0;
  o_correction := 0;
  common_mode_setup_;
enddef;

% This |mode_def| is untested.
mode_def MacMagnified =                 % Mac screens at magstep 1
  pixels_per_inch := 86.4;
  blacker := .35;
  fillin := .1;
  o_correction := .3;
  common_mode_setup_;
enddef;
bettermac := MacMagnified;

% This |mode_def| is untested.
mode_def MacTrueSize =                  % Mac screens at 72dpi
  pixels_per_inch := 72;
  blacker := .35;
  fillin := .1;
  o_correction := .3;
  common_mode_setup_;
enddef;
truemac := MacTrue;

% From {\tt rokicki@neon.stanford.edu}.
mode_def NEC =				% NEC
  pixels_per_inch := 180;
  blacker := 0;
  fillin := 0;
  o_correction := .2;
  common_mode_setup_;
enddef;

% This is the same as |CanonCX|, except for the resolution.
mode_def NEChi =			% NEC at 360dpi
  CanonCX_;
  pixels_per_inch := 360;
enddef;

% From {\tt rokicki@neon.stanford.edu}.
mode_def NeXTprinter =			% NeXT 400dpi
  CanonCX_;
  pixels_per_inch := 400;
enddef;
nexthi := NeXTprinter;

% From {\tt rokicki@neon.stanford.edu}.
mode_def NeXTscreen =			% 100dpi NeXT monitor
  pixels_per_inch := 100;
  blacker := 0;
  fillin := 0;
  o_correction := 0;
  common_mode_setup_;
enddef;
nextscreen := NeXTscreen;

% From {\tt rokicki@neon.stanford.edu}.
mode_def okidata =			% Okidata
  pixels_per_inch := 240;
  blacker := 0;
  fillin := 0;
  o_correction := .2;
  aspect_ratio := 288 / pixels_per_inch;
  common_mode_setup_;
enddef;
okihi := okidata;

mode_def OneTwoZero =                   % e.g., high-resolution Suns
  pixels_per_inch := 120;
  blacker := .35;
  fillin := .1;
  o_correction := .3;
  common_mode_setup_;
enddef;

% This is a write-white PostScript laser-setter, made by a Xerox
% subsidiary.  It has a bizarre nonsquare resolution.  Headquarters in
% Minnesota; telephone: (612) 456-1400.  At this resolution, the
% write-white correction may not matter, but it is safer to turn it on
% anyway.  This |mode_def| not yet tested in production.
mode_def PrintwareSevenTwoZeroIQ =	% Printware 720IQ
  let font_setup = white_setup;
  pixels_per_inch := 1200;
  aspect_ratio := 600 / pixels_per_inch;
  blacker := 0;
  fillin := 0;
  o_correction := 1;
  common_mode_setup_;
enddef;

mode_def qms =                          % QMS (Xerox engine)
  pixels_per_inch := 300;
  blacker := .75;               % Conjectural.
  fillin := 0;                  % (ditto)
  o_correction := .5;           % (ditto)
  common_mode_setup_;
enddef;

% These values from Stan Osborne, {\sl TUGboat} 8(2), page 134.
mode_def RicohFourZeroEightZero =       % e.g., the TI Omnilaser
  let font_setup = white_setup;
  pixels_per_inch := 300;
  blacker := .2;
  fillin := -.2;
  o_correction := .5;
  common_mode_setup_;
enddef;
ricoh := RicohFourZeroEightZero;

mode_def sun =                          % Sun and BBN Bitgraph at true size
  pixels_per_inch := 82;
  aspect_ratio := 78 / pixels_per_inch;
  blacker := 0;
  fillin := 0;
  o_correction := 0;
  common_mode_setup_;
  enddef;

mode_def supre =                        % Ultre*setter at 2400dpi
  pixels_per_inch := 2400;
  blacker := 0;
  fillin := 0;
  o_correction := 1;
  common_mode_setup_;
enddef;

mode_def toshiba =                      % Toshiba 13XX
  pixels_per_inch := 180;
  blacker := 0;
  fillin := 0;
  o_correction := .2;
  common_mode_setup_;
enddef;

mode_def ultre =                        % Ultre*setter at 1200dpi
  pixels_per_inch := 1200;
  blacker := 0;
  fillin := 0;
  o_correction := 1;
  common_mode_setup_;
enddef;

% The worst problem is toner irregularity.
mode_def VarityperSixZeroZero =         % Varityper Laser 600
  pixels_per_inch := 600;
  blacker := 0;
  fillin := 0;
  o_correction := 1;
  common_mode_setup_;
enddef;
varityper := VarityperSixZeroZero;

mode_def help =                         % What modes are defined?
 for i = 1 upto number_of_modes:
   message mode_name[i];
 endfor; 
 % Doesn't make sense to be able to do this twice, so forget this
 % definition after it's been used.
 save ?;
enddef;

let ? = help_;

% These variables determine the size of \MF's (window system) window for
% online output.  These numbers should match whatever the window system
% is told, or bizarre positioning of the output in the window results.
% Properly implemented online device drivers will use these values as
% the default size.
screen_cols := 400;
screen_rows := 600;

% The mode most commonly used to make fonts here.
localfont := CanonCX;

%%\bye
%%%% 
%%%% Local variables:
%%%% page-delimiter: "^% here are"
%%%% End: