Directory lout/include

This directory contains Lout source files for the standard packages.
The following listing classifies them into types of files.

Setup files (containing mainly lists of options settable by the user)
---------------------------------------------------------------------

   Setup files for basic document types (choose one):

       doc              The OrdinarySetup package
       report           The ReportSetup package
       book             The BookSetup package
       slides           The OverheadsSetup package
       picture          The IllustrationSetup package

   Setup files for special-purpose packages (choose any combination):

       tbl              The Tbl table formatting package
       tab              The Tab table formatting package (OBSOLETE, use tbl)
       eq               The Eq equation formatting package
       diag             The Diag diagram drawing package
       fig              The Fig advanced graphics package (OBSOLETE, use diag)
       graph            The Graph graph drawing package
       pas              The Pas Pascal progam printing package
       modula           The Modula Modula-2 progam printing package
       latin2           The Latin2 (Eastern European characters) package
       russian          The Russian language package

   Setup files for program formatting packages (choose any combination):

       cprint           C and C++
       eiffel           Eiffel
       blue             Blue
       perl             Perl + Pod
       pod              Pod
       python           Python

Source files (containing Lout and PostScript source code for the packages)
--------------------------------------------------------------------------

       bsf              The BasicSetup package
       bsf.lpg          A PostScript prepend file needed by BasicSetup
       dsf              The DocumentSetup package
       docf             The OrdinarySetup package
       reportf          The ReportSetup package
       bookf            The BookSetup package
       slidesf          The OverheadsSetup package
       picturef         The IllustrationSetup package

       tabf             The Tab table formatting package (OBSOLETE)
       tabf.lpg         A PostScript prepend file needed by tabf (OBSOLETE)
       tblf             The Tbl table formatting package
       tblf.lpg         A PostScript prepend file needed by tblf
       eqf              The Eq equation formatting package
       figf             The Fig advanced graphics package (OBSOLETE)
       figf.lpg         A PostScript prepend file needed by figf (OBSOLETE)
       diagf            The Diag diagram drawing package
       diagf.etc        A file included by diagf
       diagf.lpg        A PostScript prepend file needed by diagf
       graphf           The Graph graph drawing package
       graphf.etc       A file included by graphf
       graphf.lpg       A PostScript prepend file needed by graphf
       pasf             Pascal
       modulaf          Modula-2
       latin2.fd        Latin2 font definitions file (placeholder file)
       russian.fd       Russian font definitions file (placeholder file)

       cprintf          C and C++
       eiffelf          Eiffel
       bluef            Blue
       perlf            Perl
       podf             Pod
       pythonf          Python

Miscellaneous
-------------

       langdefs         Standard language definitions file
       mydefs           Empty file for if the user doesn't have a mydefs
       ts               The ToySetup package (an expert users' intro. example)
       init             A Lout source file used during installation (lout -x)


Jeffrey H. Kingston
8 April 2000
