Texinfo, Version 3
==================

This is the README file for version 3 of the Texinfo distribution.
Files within this distribution have their own version and edition
numbers.  When you refer to a file, please mention its own number, as
well as the version number of the Texinfo distribution.

PLEASE REPORT BUGS TO: bug-texinfo@prep.ai.mit.edu

Texinfo is a documentation system that uses a single source file to
produce both on-line information and printed output.  This means that
instead of writing two different documents, one for the on-line help
or other on-line information and the other for a typeset manual or
other printed work, you need write only one document.  When the work
is revised, you need revise only one document.  You can read the
on-line information, known as an "Info file", with an Info
documentation-reading program.  By convention, Texinfo source file
names end with a `.texi' or `.texinfo' extension.  Texinfo is
described in the Texinfo manual (the file ./texinfo.texi).

You can write and format Texinfo files into Info files within GNU Emacs,
and read them using the Emacs Info reader.  If you do not have Emacs,
you can format Texinfo files into Info files using `makeinfo' and read
them using `info'.  Use TeX, which is not included in this package (see
`How to Obtain TeX' in the Texinfo manual for information), to typeset
Texinfo files for printing.

For instructions on compiling and installing info, makeinfo, texi2dvi,
and texindex, please read the file `INSTALL'.  The Emacs Lisp files are
not installed by default; to install them, use `make install' in the
`emacs' subdirectory.  The Info tree uses a file `dir' as its root node;
a sample `dir' file is included in the distribution, but not installed
anywhere. Use it or not as you like.

This distribution includes (but is not limited to) the following files:

    README                      This file.

    INTRODUCTION                This file tells you how to create
                                readable files from the Texinfo source
                                files in this distribution.

Texinfo source files:

    texinfo.texi                This manual describes Texinfo.  It
                                tells how to use Texinfo to write
                                documentation, how to use Texinfo mode
                                in GNU Emacs, how to use TeX,
                                makeinfo, and the Emacs Lisp Texinfo
                                formatting commands.

    info.texi                   This manual tells you how to use 
                                Info.  This document comes as part of
                                GNU Emacs.  If you do not have Emacs,
                                you can format this Texinfo source
                                file with makeinfo or TeX and then
                                read the resulting Info file with the
                                standalone Info reader that is part of
                                this distribution.

    info-stnd.texi              This manual tells you how to use
                                the standalone GNU Info reader that is
                                included in this distribution as a C
                                source file, `info.c'.

    makeinfo.texi               This manual tells you how to use
                                makeinfo.  The same information is
                                contained in a chapter of the Texinfo
                                manual; it has been extracted here for
                                your convenience.


Printing related files:

    texinfo.tex                 This TeX definitions file tells
                                the TeX program how to typeset a
                                Texinfo file into a DVI file ready for
                                printing.

    texindex.c                  This file contains the source for
                                the `texindex' program that generates
                                sorted indices used by TeX when
                                typesetting a file for printing.

    texi2dvi                    This is a shell script for
                                producing an indexed DVI file using
                                TeX and texindex. Must be used if the
                                source document uses Texinfo @macros.


GNU Emacs related files:

    texinfmt.el                 This Emacs Lisp file provides the
                                functions that GNU Emacs uses to
                                format a Texinfo file into an Info
                                file.

    texinfo.el                  This file provides Texinfo mode
                                for GNU Emacs.

    texnfo-upd.el               These files provides commands to
    texnfo-tex.el               help you write Texinfo files
    makeinfo.el                 using GNU Emacs Texinfo mode.

    detexinfo.el                This extra utility file contains functions 
                                to remove Texinfo commands from a
                                Texinfo source file.

    info.el                     These are the standard GNU Emacs
    informat.el                 Info reading and support files,
                                included here for your convenience.
 

Source files for standalone C programs:

    makeinfo.c                  This file contains the source for
                                the `makeinfo' program that you can
                                use to create an Info file from a
                                Texinfo file.

    info.c                      This file contains the source for
                                the `info' program that you can use to
                                view Info files on an ASCII terminal.

    getopt.c                    Various support files
    getopt1.c
    getopt.h


C Installation files:

    configure                   This file creates creates a Makefile 
                                which in turn creates an `info' or
                                `makeinfo' executable, or a C sources
                                distribution.

    configure.in                This is a template for creating 
                                `configure' using m4 macros.

    Makefile.in                 This is a template for `configure' 
                                to use to make a Makefile.
                               

Other files:

    NEWS                        This contains a summary of new
                                features since the first edition 
                                of Texinfo.

    info.1                      This is a `man' page that briefly 
                                describes the standalone `info'
                                program.

    fixfonts                    This is a shell script to install the 
                                `lcircle10' TeX fonts as an alias for
                                the `circle10' fonts.  In some older
                                TeX distributions the names are
                                different.

    tex3patch                   This handles a bug for version
                                3.0 of TeX that does not occur in
                                more recent versions.
