\documentclass{howto}
\usepackage{ltxmarkup}

\title{Documenting Python}

\makeindex

\input{boilerplate}

% Now override the stuff that includes author information;
% Guido did *not* write this one!

\author{Fred L. Drake, Jr.}
\authoraddress{
        PythonLabs \\
        Email: \email{fdrake@acm.org}
}


\begin{document}

\maketitle

\begin{abstract}
\noindent
The Python language has a substantial body of
documentation, much of it contributed by various authors.  The markup
used for the Python documentation is based on \LaTeX{} and requires a
significant set of macros written specifically for documenting Python.
This document describes the macros introduced to support Python
documentation and how they should be used to support a wide range of
output formats.

This document describes the document classes and special markup used
in the Python documentation.  Authors may use this guide, in
conjunction with the template files provided with the
distribution, to create or maintain whole documents or sections.

If you're interested in contributing to Python's documentation,
there's no need to learn \LaTeX{} if you're not so inclined; plain
text contributions are more than welcome as well.
\end{abstract}

\tableofcontents


\section{Introduction \label{intro}}

  Python's documentation has long been considered to be good for a
  free programming language.  There are a number of reasons for this,
  the most important being the early commitment of Python's creator,
  Guido van Rossum, to providing documentation on the language and its
  libraries, and the continuing involvement of the user community in
  providing assistance for creating and maintaining documentation.

  The involvement of the community takes many forms, from authoring to
  bug reports to just plain complaining when the documentation could
  be more complete or easier to use.  All of these forms of input from
  the community have proved useful during the time I've been involved
  in maintaining the documentation.

  This document is aimed at authors and potential authors of
  documentation for Python.  More specifically, it is for people
  contributing to the standard documentation and developing additional
  documents using the same tools as the standard documents.  This
  guide will be less useful for authors using the Python documentation
  tools for topics other than Python, and less useful still for
  authors not using the tools at all.

  The material in this guide is intended to assist authors using the
  Python documentation tools.  It includes information on the source
  distribution of the standard documentation, a discussion of the
  document types, reference material on the markup defined in the
  document classes, a list of the external tools needed for processing
  documents, and reference material on the tools provided with the
  documentation resources.  At the end, there is also a section
  discussing future directions for the Python documentation and where
  to turn for more information.

  If your interest is in contributing to the Python documentation, but
  you don't have the time or inclination to learn \LaTeX{} and the
  markup structures documented here, there's a welcoming place for you
  among the Python contributors as well.  Any time you feel that you
  can clarify existing documentation or provide documentation that's
  missing, the existing documentation team will gladly work with you
  to integrate your text, dealing with the markup for you.  Please
  don't let the material in this document stand between the
  documentation and your desire to help out!

\section{Directory Structure \label{directories}}

  The source distribution for the standard Python documentation
  contains a large number of directories.  While third-party documents
  do not need to be placed into this structure or need to be placed
  within a similar structure, it can be helpful to know where to look
  for examples and tools when developing new documents using the
  Python documentation tools.  This section describes this directory
  structure.

  The documentation sources are usually placed within the Python
  source distribution as the top-level directory \file{Doc/}, but
  are not dependent on the Python source distribution in any way.

  The \file{Doc/} directory contains a few files and several
  subdirectories.  The files are mostly self-explanatory, including a
  \file{README} and a \file{Makefile}.  The directories fall into
  three categories:

  \begin{definitions}
    \term{Document Sources}
        The \LaTeX{} sources for each document are placed in a
        separate directory.  These directories are given short
        names which vaguely indicate the document in each:

        \begin{tableii}{p{.75in}|p{3in}}{filenq}{Directory}{Document Title}
          \lineii{api/}
            {\citetitle[../api/api.html]{The Python/C API}}
          \lineii{dist/}
            {\citetitle[../dist/dist.html]{Distributing Python Modules}}
          \lineii{doc/}
            {\citetitle[../doc/doc.html]{Documenting Python}}
          \lineii{ext/}
            {\citetitle[../ext/ext.html]
                       {Extending and Embedding the Python Interpreter}}
          \lineii{inst/}
            {\citetitle[../inst/inst.html]{Installing Python Modules}}
          \lineii{lib/}
            {\citetitle[../lib/lib.html]{Python Library Reference}}
          \lineii{mac/}
            {\citetitle[../mac/mac.html]{Macintosh Module Reference}}
          \lineii{ref/}
            {\citetitle[../ref/ref.html]{Python Reference Manual}}
          \lineii{tut/}
            {\citetitle[../tut/tut.html]{Python Tutorial}}
          \lineii{whatsnew/}
            {\citetitle[../whatsnew/whatsnew24.html]
                       {What's New in Python \shortversion}}
        \end{tableii}

    \term{Format-Specific Output}
        Most output formats have a directory which contains a
        \file{Makefile} which controls the generation of that format
        and provides storage for the formatted documents.  The only
        variations within this category are the Portable Document
        Format (PDF) and PostScript versions are placed in the
        directories \file{paper-a4/} and \file{paper-letter/} (this
        causes all the temporary files created by \LaTeX{} to be kept
        in the same place for each paper size, where they can be more
        easily ignored).

        \begin{tableii}{p{.75in}|p{3in}}{filenq}{Directory}{Output Formats}
          \lineii{html/}{HTML output}
          \lineii{info/}{GNU info output}
          \lineii{isilo/}{\ulink{iSilo}{http://www.isilo.com/}
                          documents (for Palm OS devices)}
          \lineii{paper-a4/}{PDF and PostScript, A4 paper}
          \lineii{paper-letter/}{PDF and PostScript, US-Letter paper}
        \end{tableii}

    \term{Supplemental Files}
        Some additional directories are used to store supplemental
        files used for the various processes.  Directories are
        included for the shared \LaTeX{} document classes, the
        \LaTeX2HTML support, template files for various document
        components, and the scripts used to perform various steps in
        the formatting processes.

        \begin{tableii}{p{.75in}|p{3in}}{filenq}{Directory}{Contents}
          \lineii{commontex/}{Document content shared among documents}
          \lineii{perl/}     {Support for \LaTeX2HTML processing}
          \lineii{templates/}{Example files for source documents}
          \lineii{texinputs/}{Style implementation for \LaTeX}
          \lineii{tools/}    {Custom processing scripts}
        \end{tableii}

  \end{definitions}


\section{Style Guide \label{style-guide}}

  The Python documentation should follow the \citetitle
  [http://developer.apple.com/documentation/UserExperience/Conceptual/APStyleGuide/AppleStyleGuide2003.pdf]
  {Apple Publications Style Guide} wherever possible.  This particular
  style guide was selected mostly because it seems reasonable and is
  easy to get online.

  Topics which are not covered in the Apple's style guide will be
  discussed in this document if necessary.

  Many special names are used in the Python documentation, including
  the names of operating systems, programming languages, standards
  bodies, and the like.  Many of these were assigned \LaTeX{} macros
  at some point in the distant past, and these macros lived on long
  past their usefulness.  In the current markup, most of these entities
  are not assigned any special markup, but the preferred spellings are
  given here to aid authors in maintaining the consistency of
  presentation in the Python documentation.

  Other terms and words deserve special mention as well; these conventions
  should be used to ensure consistency throughout the documentation:

  \begin{description}
    \item[CPU]
    For ``central processing unit.''  Many style guides say this
    should be spelled out on the first use (and if you must use it,
    do so!).  For the Python documentation, this abbreviation should
    be avoided since there's no reasonable way to predict which occurrence
    will be the first seen by the reader.  It is better to use the
    word ``processor'' instead.

    \item[\POSIX]
        The name assigned to a particular group of standards.  This is
        always uppercase.  Use the macro \macro{POSIX} to represent this
        name.

    \item[Python]
        The name of our favorite programming language is always
        capitalized.

    \item[Unicode]
        The name of a character set and matching encoding.  This is
        always written capitalized.

    \item[\UNIX]
        The name of the operating system developed at AT\&T Bell Labs
        in the early 1970s.  Use the macro \macro{UNIX} to use this
        name.
  \end{description}


\section{\LaTeX{} Primer \label{latex-primer}}

  This section is a brief introduction to \LaTeX{} concepts and
  syntax, to provide authors enough information to author documents
  productively without having to become ``\TeX{}nicians.''  This does
  not teach everything needed to know about writing \LaTeX{} for
  Python documentation; many of the standard ``environments'' are not
  described here (though you will learn how to mark something as an
  environment).

  Perhaps the most important concept to keep in mind while marking up
  Python documentation is that while \TeX{} is unstructured, \LaTeX{} was
  designed as a layer on top of \TeX{} which specifically supports
  structured markup.  The Python-specific markup is intended to extend
  the structure provided by standard \LaTeX{} document classes to
  support additional information specific to Python.

  \LaTeX{} documents contain two parts: the preamble and the body.
  The preamble is used to specify certain metadata about the document
  itself, such as the title, the list of authors, the date, and the
  \emph{class} the document belongs to.  Additional information used
  to control index generation and the use of bibliographic databases
  can also be placed in the preamble.  For most authors, the preamble
  can be most easily created by copying it from an existing document
  and modifying a few key pieces of information.

  The \dfn{class} of a document is used to place a document within a
  broad category of documents and set some fundamental formatting
  properties.  For Python documentation, two classes are used: the
  \code{manual} class and the \code{howto} class.  These classes also
  define the additional markup used to document Python concepts and
  structures.  Specific information about these classes is provided in
  section \ref{classes}, ``Document Classes,'' below.  The first thing
  in the preamble is the declaration of the document's class.

  After the class declaration, a number of \emph{macros} are used to
  provide further information about the document and setup any
  additional markup that is needed.  No output is generated from the
  preamble; it is an error to include free text in the preamble
  because it would cause output.

  The document body follows the preamble.  This contains all the
  printed components of the document marked up structurally.  Generic
  \LaTeX{} structures include hierarchical sections, numbered and
  bulleted lists, and special structures for the document abstract and
  indexes.

  \subsection{Syntax \label{latex-syntax}}

    There are some things that an author of Python documentation needs
    to know about \LaTeX{} syntax.

    A \dfn{comment} is started by the ``percent'' character
    (\character{\%}) and continues through the end of the line and all
    leading whitespace on the following line.  This is a little
    different from any programming language I know of, so an example
    is in order:

\begin{verbatim}
This is text.% comment
    This is more text.  % another comment
Still more text.
\end{verbatim}

    The first non-comment character following the first comment is the
    letter \character{T} on the second line; the leading whitespace on
    that line is consumed as part of the first comment.  This means
    that there is no space between the first and second sentences, so
    the period and letter \character{T} will be directly adjacent in
    the typeset document.

    Note also that though the first non-comment character after the
    second comment is the letter \character{S}, there is whitespace
    preceding the comment, so the two sentences are separated as
    expected.

    A \dfn{group} is an enclosure for a collection of text and
    commands which encloses the formatting context and constrains the
    scope of any changes to that context made by commands within the
    group.  Groups can be nested hierarchically.  The formatting
    context includes the font and the definition of additional macros
    (or overrides of macros defined in outer groups).  Syntactically,
    groups are enclosed in braces:

\begin{verbatim}
{text in a group}
\end{verbatim}

    An alternate syntax for a group using brackets, \code{[...]}, is
    used by macros and environment constructors which take optional
    parameters; brackets do not normally hold syntactic significance.
    A degenerate group, containing only one atomic bit of content,
    does not need to have an explicit group, unless it is required to
    avoid ambiguity.  Since Python tends toward the explicit, groups
    are also made explicit in the documentation markup.

    Groups are used only sparingly in the Python documentation, except
    for their use in marking parameters to macros and environments.

    A \dfn{macro} is usually a simple construct which is identified by
    name and can take some number of parameters.  In normal \LaTeX{}
    usage, one of these can be optional.  The markup is introduced
    using the backslash character (\character{\e}), and the name is
    given by alphabetic characters (no digits, hyphens, or
    underscores).  Required parameters should be marked as a group,
    and optional parameters should be marked using the alternate
    syntax for a group.

    For example, a macro which takes a single parameter
    would appear like this:

\begin{verbatim}
\name{parameter}
\end{verbatim}

    A macro which takes an optional parameter would be typed like this
    when the optional parameter is given:

\begin{verbatim}
\name[optional]
\end{verbatim}

    If both optional and required parameters are to be required, it
    looks like this:

\begin{verbatim}
\name[optional]{required}
\end{verbatim}

    A macro name may be followed by a space or newline; a space
    between the macro name and any parameters will be consumed, but
    this usage is not practiced in the Python documentation.  Such a
    space is still consumed if there are no parameters to the macro,
    in which case inserting an empty group (\code{\{\}}) or explicit
    word space (\samp{\e\ }) immediately after the macro name helps to
    avoid running the expansion of the macro into the following text.
    Macros which take no parameters but which should not be followed
    by a word space do not need special treatment if the following
    character in the document source if not a name character (such as
    punctuation).

    Each line of this example shows an appropriate way to write text
    which includes a macro which takes no parameters:

\begin{verbatim}
This \UNIX{} is followed by a space.
This \UNIX\ is also followed by a space.
\UNIX, followed by a comma, needs no additional markup.
\end{verbatim}

    An \dfn{environment} is a larger construct than a macro, and can
    be used for things with more content than would conveniently fit
    in a macro parameter.  They are primarily used when formatting
    parameters need to be changed before and after a large chunk of
    content, but the content itself needs to be highly flexible.  Code
    samples are presented using an environment, and descriptions of
    functions, methods, and classes are also marked using environments.

    Since the content of an environment is free-form and can consist
    of several paragraphs, they are actually marked using a pair of
    macros: \macro{begin} and \macro{end}.  These macros both take the
    name of the environment as a parameter.  An example is the
    environment used to mark the abstract of a document:

\begin{verbatim}
\begin{abstract}
  This is the text of the abstract.  It concisely explains what
  information is found in the document.

  It can consist of multiple paragraphs.
\end{abstract}
\end{verbatim}

    An environment can also have required and optional parameters of
    its own.  These follow the parameter of the \macro{begin} macro.
    This example shows an environment which takes a single required
    parameter:

\begin{verbatim}
\begin{datadesc}{controlnames}
  A 33-element string array that contains the \ASCII{} mnemonics for
  the thirty-two \ASCII{} control characters from 0 (NUL) to 0x1f
  (US), in order, plus the mnemonic \samp{SP} for the space character.
\end{datadesc}
\end{verbatim}

    There are a number of less-used marks in \LaTeX{} which are used
    to enter characters which are not found in \ASCII{} or which a
    considered special, or \emph{active} in \TeX{} or \LaTeX.  Given
    that these are often used adjacent to other characters, the markup
    required to produce the proper character may need to be followed
    by a space or an empty group, or the markup can be enclosed in a
    group.  Some which are found in Python documentation are:

\begin{tableii}{c|l}{textrm}{Character}{Markup}
  \lineii{\textasciicircum}{\code{\e textasciicircum}}
  \lineii{\textasciitilde}{\code{\e textasciitilde}}
  \lineii{\textgreater}{\code{\e textgreater}}
  \lineii{\textless}{\code{\e textless}}
  \lineii{\c c}{\code{\e c c}}
  \lineii{\"o}{\code{\e"o}}
  \lineii{\o}{\code{\e o}}
\end{tableii}


  \subsection{Hierarchical Structure \label{latex-structure}}

    \LaTeX{} expects documents to be arranged in a conventional,
    hierarchical way, with chapters, sections, sub-sections,
    appendixes, and the like.  These are marked using macros rather
    than environments, probably because the end of a section can be
    safely inferred when a section of equal or higher level starts.

    There are six ``levels'' of sectioning in the document classes
    used for Python documentation, and the deepest two
    levels\footnote{The deepest levels have the highest numbers in the
      table.} are not used.  The levels are:

      \begin{tableiii}{c|l|c}{textrm}{Level}{Macro Name}{Notes}
        \lineiii{1}{\macro{chapter}}{(1)}
        \lineiii{2}{\macro{section}}{}
        \lineiii{3}{\macro{subsection}}{}
        \lineiii{4}{\macro{subsubsection}}{}
        \lineiii{5}{\macro{paragraph}}{(2)}
        \lineiii{6}{\macro{subparagraph}}{}
      \end{tableiii}

    \noindent
    Notes:

    \begin{description}
      \item[(1)]
      Only used for the \code{manual} documents, as described in
      section \ref{classes}, ``Document Classes.''
      \item[(2)]
      Not the same as a paragraph of text; nobody seems to use this.
    \end{description}


  \subsection{Common Environments \label{latex-environments}}

    \LaTeX{} provides a variety of environments even without the
    additional markup provided by the Python-specific document classes
    introduced in the next section.  The following environments are
    provided as part of standard \LaTeX{} and are being used in the
    standard Python documentation; descriptions will be added here as
    time allows.

\begin{verbatim}
abstract
alltt
description
displaymath
document
enumerate
figure
flushleft
itemize
list
math
quotation
quote
sloppypar
verbatim
\end{verbatim}


\section{Document Classes \label{classes}}

  Two \LaTeX{} document classes are defined specifically for use with
  the Python documentation.  The \code{manual} class is for large
  documents which are sectioned into chapters, and the \code{howto}
  class is for smaller documents.

  The \code{manual} documents are larger and are used for most of the
  standard documents.  This document class is based on the standard
  \LaTeX{} \code{report} class and is formatted very much like a long
  technical report.  The \citetitle[../ref/ref.html]{Python Reference
  Manual} is a good example of a \code{manual} document, and the
  \citetitle[../lib/lib.html]{Python Library Reference} is a large
  example.

  The \code{howto} documents are shorter, and don't have the large
  structure of the \code{manual} documents.  This class is based on
  the standard \LaTeX{} \code{article} class and is formatted somewhat
  like the Linux Documentation Project's ``HOWTO'' series as done
  originally using the LinuxDoc software.  The original intent for the
  document class was that it serve a similar role as the LDP's HOWTO
  series, but the applicability of the class turns out to be somewhat
  broader.  This class is used for ``how-to'' documents (this
  document is an example) and for shorter reference manuals for small,
  fairly cohesive module libraries.  Examples of the later use include
\citetitle[http://starship.python.net/crew/fdrake/manuals/krb5py/krb5py.html]{Using
  Kerberos from Python}, which contains reference material for an
  extension package.  These documents are roughly equivalent to a
  single chapter from a larger work.


\section{Special Markup Constructs \label{special-constructs}}

  The Python document classes define a lot of new environments and
  macros.  This section contains the reference material for these
  facilities.  Documentation for ``standard'' \LaTeX{} constructs is
  not included here, though they are used in the Python documentation.

  \subsection{Markup for the Preamble \label{preamble-info}}

    \begin{macrodesc}{release}{\p{ver}}
      Set the version number for the software described in the
      document.
    \end{macrodesc}

    \begin{macrodesc}{setshortversion}{\p{sver}}
      Specify the ``short'' version number of the documented software
      to be \var{sver}.
    \end{macrodesc}

  \subsection{Meta-information Markup \label{meta-info}}

    \begin{macrodesc}{sectionauthor}{\p{author}\p{email}}
      Identifies the author of the current section.  \var{author}
      should be the author's name such that it can be used for
      presentation (though it isn't), and \var{email} should be the
      author's email address.  The domain name portion of
      the address should be lower case.

      No presentation is generated from this markup, but it is used to
      help keep track of contributions.
    \end{macrodesc}

  \subsection{Information Units \label{info-units}}

    XXX Explain terminology, or come up with something more ``lay.''

    There are a number of environments used to describe specific
    features provided by modules.  Each environment requires
    parameters needed to provide basic information about what is being
    described, and the environment content should be the description.
    Most of these environments make entries in the general index (if
    one is being produced for the document); if no index entry is
    desired, non-indexing variants are available for many of these
    environments.  The environments have names of the form
    \code{\var{feature}desc}, and the non-indexing variants are named
    \code{\var{feature}descni}.  The available variants are explicitly
    included in the list below.

    For each of these environments, the first parameter, \var{name},
    provides the name by which the feature is accessed.

    Environments which describe features of objects within a module,
    such as object methods or data attributes, allow an optional
    \var{type name} parameter.  When the feature is an attribute of
    class instances, \var{type name} only needs to be given if the
    class was not the most recently described class in the module; the
    \var{name} value from the most recent \env{classdesc} is implied.
    For features of built-in or extension types, the \var{type name}
    value should always be provided.  Another special case includes
    methods and members of general ``protocols,'' such as the
    formatter and writer protocols described for the
    \module{formatter} module: these may be documented without any
    specific implementation classes, and will always require the
    \var{type name} parameter to be provided.

    \begin{envdesc}{cfuncdesc}{\p{type}\p{name}\p{args}}
      Environment used to described a C function.  The \var{type}
      should be specified as a \keyword{typedef} name, \code{struct
      \var{tag}}, or the name of a primitive type.  If it is a pointer
      type, the trailing asterisk should not be preceded by a space.
      \var{name} should be the name of the function (or function-like
      pre-processor macro), and \var{args} should give the types and
      names of the parameters.  The names need to be given so they may
      be used in the description.
    \end{envdesc}

    \begin{envdesc}{cmemberdesc}{\p{container}\p{type}\p{name}}
      Description for a structure member.  \var{container} should be
      the \keyword{typedef} name, if there is one, otherwise if should
      be \samp{struct \var{tag}}.  The type of the member should given
      as \var{type}, and the name should be given as \var{name}.  The
      text of the description should include the range of values
      allowed, how the value should be interpreted, and whether the
      value can be changed.  References to structure members in text
      should use the \macro{member} macro.
    \end{envdesc}

    \begin{envdesc}{csimplemacrodesc}{\p{name}}
      Documentation for a ``simple'' macro.  Simple macros are macros
      which are used for code expansion, but which do not take
      arguments so cannot be described as functions.  This is not to
      be used for simple constant definitions.  Examples of it's use
      in the Python documentation include
      \csimplemacro{PyObject_HEAD} and
      \csimplemacro{Py_BEGIN_ALLOW_THREADS}.
    \end{envdesc}

    \begin{envdesc}{ctypedesc}{\op{tag}\p{name}}
      Environment used to described a C type.  The \var{name}
      parameter should be the \keyword{typedef} name.  If the type is
      defined as a \keyword{struct} without a \keyword{typedef},
      \var{name} should have the form \code{struct \var{tag}}.
      \var{name} will be added to the index unless \var{tag} is
      provided, in which case \var{tag} will be used instead.
      \var{tag} should not be used for a \keyword{typedef} name.
    \end{envdesc}

    \begin{envdesc}{cvardesc}{\p{type}\p{name}}
      Description of a global C variable.  \var{type} should be the
      \keyword{typedef} name, \code{struct \var{tag}}, or the name of
      a primitive type.  If variable has a pointer type, the trailing
      asterisk should \emph{not} be preceded by a space.
    \end{envdesc}

    \begin{envdesc}{datadesc}{\p{name}}
      This environment is used to document global data in a module,
      including both variables and values used as ``defined
      constants.''  Class and object attributes are not documented
      using this environment.
    \end{envdesc}
    \begin{envdesc}{datadescni}{\p{name}}
      Like \env{datadesc}, but without creating any index entries.
    \end{envdesc}

    \begin{envdesc}{excclassdesc}{\p{name}\p{constructor parameters}}
      Describe an exception defined by a class.  \var{constructor
      parameters} should not include the \var{self} parameter or
      the parentheses used in the call syntax.  To describe an
      exception class without describing the parameters to its
      constructor, use the \env{excdesc} environment.
    \end{envdesc}

    \begin{envdesc}{excdesc}{\p{name}}
      Describe an exception.  In the case of class exceptions, the
      constructor parameters are not described; use \env{excclassdesc}
      to describe an exception class and its constructor.
    \end{envdesc}

    \begin{envdesc}{funcdesc}{\p{name}\p{parameters}}
      Describe a module-level function.  \var{parameters} should
      not include the parentheses used in the call syntax.  Object
      methods are not documented using this environment.  Bound object
      methods placed in the module namespace as part of the public
      interface of the module are documented using this, as they are
      equivalent to normal functions for most purposes.

      The description should include information about the parameters
      required and how they are used (especially whether mutable
      objects passed as parameters are modified), side effects, and
      possible exceptions.  A small example may be provided.
    \end{envdesc}
    \begin{envdesc}{funcdescni}{\p{name}\p{parameters}}
      Like \env{funcdesc}, but without creating any index entries.
    \end{envdesc}

    \begin{envdesc}{classdesc}{\p{name}\p{constructor parameters}}
      Describe a class and its constructor.  \var{constructor
      parameters} should not include the \var{self} parameter or
      the parentheses used in the call syntax.
    \end{envdesc}

    \begin{envdesc}{classdesc*}{\p{name}}
      Describe a class without describing the constructor.  This can
      be used to describe classes that are merely containers for
      attributes or which should never be instantiated or subclassed
      by user code.
    \end{envdesc}

    \begin{envdesc}{memberdesc}{\op{type name}\p{name}}
      Describe an object data attribute.  The description should
      include information about the type of the data to be expected
      and whether it may be changed directly.
    \end{envdesc}
    \begin{envdesc}{memberdescni}{\op{type name}\p{name}}
      Like \env{memberdesc}, but without creating any index entries.
    \end{envdesc}

    \begin{envdesc}{methoddesc}{\op{type name}\p{name}\p{parameters}}
      Describe an object method.  \var{parameters} should not include
      the \var{self} parameter or the parentheses used in the call
      syntax.  The description should include similar information to
      that described for \env{funcdesc}.
    \end{envdesc}
    \begin{envdesc}{methoddescni}{\op{type name}\p{name}\p{parameters}}
      Like \env{methoddesc}, but without creating any index entries.
    \end{envdesc}


  \subsection{Showing Code Examples \label{showing-examples}}

    Examples of Python source code or interactive sessions are
    represented as \env{verbatim} environments.  This environment
    is a standard part of \LaTeX{}.  It is important to only use
    spaces for indentation in code examples since \TeX{} drops tabs
    instead of converting them to spaces.

    Representing an interactive session requires including the prompts
    and output along with the Python code.  No special markup is
    required for interactive sessions.  After the last line of input
    or output presented, there should not be an ``unused'' primary
    prompt; this is an example of what \emph{not} to do:

\begin{verbatim}
>>> 1 + 1
2
>>>
\end{verbatim}

    Within the \env{verbatim} environment, characters special to
    \LaTeX{} do not need to be specially marked in any way.  The entire
    example will be presented in a monospaced font; no attempt at
    ``pretty-printing'' is made, as the environment must work for
    non-Python code and non-code displays.  There should be no blank
    lines at the top or bottom of any \env{verbatim} display.

    Longer displays of verbatim text may be included by storing the
    example text in an external file containing only plain text.  The
    file may be included using the standard \macro{verbatiminput}
    macro; this macro takes a single argument naming the file
    containing the text.  For example, to include the Python source
    file \file{example.py}, use:

\begin{verbatim}
\verbatiminput{example.py}
\end{verbatim}

    Use of \macro{verbatiminput} allows easier use of special editing
    modes for the included file.  The file should be placed in the
    same directory as the \LaTeX{} files for the document.

    The Python Documentation Special Interest Group has discussed a
    number of approaches to creating pretty-printed code displays and
    interactive sessions; see the Doc-SIG area on the Python Web site
    for more information on this topic.


  \subsection{Inline Markup \label{inline-markup}}

    The macros described in this section are used to mark just about
    anything interesting in the document text.  They may be used in
    headings (though anything involving hyperlinks should be avoided
    there) as well as in the body text.

    \begin{macrodesc}{bfcode}{\p{text}}
      Like \macro{code}, but also makes the font bold-face.
    \end{macrodesc}

    \begin{macrodesc}{cdata}{\p{name}}
      The name of a C-language variable.
    \end{macrodesc}

    \begin{macrodesc}{cfunction}{\p{name}}
      The name of a C-language function.  \var{name} should include the
      function name and the trailing parentheses.
    \end{macrodesc}

    \begin{macrodesc}{character}{\p{char}}
      A character when discussing the character rather than a one-byte
      string value.  The character will be typeset as with \macro{samp}.
    \end{macrodesc}

    \begin{macrodesc}{citetitle}{\op{url}\p{title}}
      A title for a referenced publication.  If \var{url} is specified,
      the title will be made into a hyperlink when formatted as HTML.
    \end{macrodesc}

    \begin{macrodesc}{class}{\p{name}}
      A class name; a dotted name may be used.
    \end{macrodesc}

    \begin{macrodesc}{code}{\p{text}}
      A short code fragment or literal constant value.  Typically, it
      should not include any spaces since no quotation marks are
      added.
    \end{macrodesc}

    \begin{macrodesc}{constant}{\p{name}}
      The name of a ``defined'' constant.  This may be a C-language
      \code{\#define} or a Python variable that is not intended to be
      changed.
    \end{macrodesc}

    \begin{macrodesc}{csimplemacro}{\p{name}}
      The name of a ``simple'' macro.  Simple macros are macros
      which are used for code expansion, but which do not take
      arguments so cannot be described as functions.  This is not to
      be used for simple constant definitions.  Examples of it's use
      in the Python documentation include
      \csimplemacro{PyObject_HEAD} and
      \csimplemacro{Py_BEGIN_ALLOW_THREADS}.
    \end{macrodesc}

    \begin{macrodesc}{ctype}{\p{name}}
      The name of a C \keyword{typedef} or structure.  For structures
      defined without a \keyword{typedef}, use \code{\e ctype\{struct
      struct_tag\}} to make it clear that the \keyword{struct} is
      required.
    \end{macrodesc}

    \begin{macrodesc}{deprecated}{\p{version}\p{what to do}}
      Declare whatever is being described as being deprecated starting
      with release \var{version}.  The text given as \var{what to do}
      should recommend something to use instead.  It should be
      complete sentences.  The entire deprecation notice will be
      presented as a separate paragraph; it should either precede or
      succeed the description of the deprecated feature.
    \end{macrodesc}

    \begin{macrodesc}{dfn}{\p{term}}
      Mark the defining instance of \var{term} in the text.  (No index
      entries are generated.)
    \end{macrodesc}

    \begin{macrodesc}{e}{}
      Produces a backslash.  This is convenient in \macro{code},
      \macro{file}, and similar macros, and the \env{alltt}
      environment, and is only defined there.  To
      create a backslash in ordinary text (such as the contents of the
      \macro{citetitle} macro), use the standard \macro{textbackslash}
      macro.
    \end{macrodesc}

    \begin{macrodesc}{email}{\p{address}}
      An email address.  Note that this is \emph{not} hyperlinked in
      any of the possible output formats.  The domain name portion of
      the address should be lower case.
    \end{macrodesc}

    \begin{macrodesc}{emph}{\p{text}}
      Emphasized text; this will be presented in an italic font.
    \end{macrodesc}

    \begin{macrodesc}{envvar}{\p{name}}
      An environment variable.  Index entries are generated.
    \end{macrodesc}

    \begin{macrodesc}{exception}{\p{name}}
      The name of an exception.  A dotted name may be used.
    \end{macrodesc}

    \begin{macrodesc}{file}{\p{file or dir}}
      The name of a file or directory.  In the PDF and PostScript
      outputs, single quotes and a font change are used to indicate
      the file name, but no quotes are used in the HTML output.
      \warning{The \macro{file} macro cannot be used in the
      content of a section title due to processing limitations.}
    \end{macrodesc}

    \begin{macrodesc}{filenq}{\p{file or dir}}
      Like \macro{file}, but single quotes are never used.  This can
      be used in conjunction with tables if a column will only contain
      file or directory names.
      \warning{The \macro{filenq} macro cannot be used in the
      content of a section title due to processing limitations.}
    \end{macrodesc}

    \begin{macrodesc}{function}{\p{name}}
      The name of a Python function; dotted names may be used.
    \end{macrodesc}

    \begin{macrodesc}{infinity}{}
      The symbol for mathematical infinity: \infinity.  Some Web
      browsers are not able to render the HTML representation of this
      symbol properly, but support is growing.
    \end{macrodesc}

    \begin{macrodesc}{kbd}{\p{key sequence}}
      Mark a sequence of keystrokes.  What form \var{key sequence}
      takes may depend on platform- or application-specific
      conventions.  When there are no relevant conventions, the names
      of modifier keys should be spelled out, to improve accessibility
      for new users and non-native speakers.  For example, an
      \program{xemacs} key sequence may be marked like
      \code{\e kbd\{C-x C-f\}}, but without reference to a specific
      application or platform, the same sequence should be marked as
      \code{\e kbd\{Control-x Control-f\}}.
    \end{macrodesc}

    \begin{macrodesc}{keyword}{\p{name}}
      The name of a keyword in a programming language.
    \end{macrodesc}

    \begin{macrodesc}{mailheader}{\p{name}}
      The name of an \rfc{822}-style mail header.  This markup does
      not imply that the header is being used in an email message, but
      can be used to refer to any header of the same ``style.''  This
      is also used for headers defined by the various MIME
      specifications.  The header name should be entered in the same
      way it would normally be found in practice, with the
      camel-casing conventions being preferred where there is more
      than one common usage.  The colon which follows the name of the
      header should not be included.
      For example: \code{\e mailheader\{Content-Type\}}.
    \end{macrodesc}

    \begin{macrodesc}{makevar}{\p{name}}
      The name of a \program{make} variable.
    \end{macrodesc}

    \begin{macrodesc}{manpage}{\p{name}\p{section}}
      A reference to a \UNIX{} manual page.
    \end{macrodesc}

    \begin{macrodesc}{member}{\p{name}}
      The name of a data attribute of an object.
    \end{macrodesc}

    \begin{macrodesc}{method}{\p{name}}
      The name of a method of an object.  \var{name} should include the
      method name and the trailing parentheses.  A dotted name may be
      used.
    \end{macrodesc}

    \begin{macrodesc}{mimetype}{\p{name}}
      The name of a MIME type, or a component of a MIME type (the
      major or minor portion, taken alone).
    \end{macrodesc}

    \begin{macrodesc}{module}{\p{name}}
       The name of a module; a dotted name may be used.  This should
       also be used for package names.
    \end{macrodesc}

    \begin{macrodesc}{newsgroup}{\p{name}}
      The name of a Usenet newsgroup.
    \end{macrodesc}

    \begin{macrodesc}{note}{\p{text}}
      An especially important bit of information about an API that a
      user should be aware of when using whatever bit of API the
      note pertains to.  This should be the last thing in the
      paragraph as the end of the note is not visually marked in
      any way.  The content of \var{text} should be written in
      complete sentences and include all appropriate punctuation.
    \end{macrodesc}

    \begin{macrodesc}{pep}{\p{number}}
      A reference to a Python Enhancement Proposal.  This generates
      appropriate index entries.  The text \samp{PEP \var{number}} is
      generated; in the HTML output, this text is a hyperlink to an
      online copy of the specified PEP.
    \end{macrodesc}

    \begin{macrodesc}{plusminus}{}
      The symbol for indicating a value that may take a positive or
      negative value of a specified magnitude, typically represented
      by a plus sign placed over a minus sign.  For example:
      \code{\e plusminus 3\%{}}.
    \end{macrodesc}

    \begin{macrodesc}{program}{\p{name}}
      The name of an executable program.  This may differ from the
      file name for the executable for some platforms.  In particular,
      the \file{.exe} (or other) extension should be omitted for
      Windows programs.
    \end{macrodesc}

    \begin{macrodesc}{programopt}{\p{option}}
      A command-line option to an executable program.  Use this only
      for ``short'' options, and include the leading hyphen.
    \end{macrodesc}

    \begin{macrodesc}{longprogramopt}{\p{option}}
      A long command-line option to an executable program.  This
      should only be used for long option names which will be prefixed
      by two hyphens; the hyphens should not be provided as part of
      \var{option}.
    \end{macrodesc}

    \begin{macrodesc}{refmodule}{\op{key}\p{name}}
      Like \macro{module}, but create a hyperlink to the documentation
      for the named module.  Note that the corresponding
      \macro{declaremodule} must be in the same document.  If the
      \macro{declaremodule} defines a module key different from the
      module name, it must also be provided as \var{key} to the
      \macro{refmodule} macro.
    \end{macrodesc}

    \begin{macrodesc}{regexp}{\p{string}}
      Mark a regular expression.
    \end{macrodesc}

    \begin{macrodesc}{rfc}{\p{number}}
      A reference to an Internet Request for Comments.  This generates
      appropriate index entries.  The text \samp{RFC \var{number}} is
      generated; in the HTML output, this text is a hyperlink to an
      online copy of the specified RFC.
    \end{macrodesc}

    \begin{macrodesc}{samp}{\p{text}}
      A short code sample, but possibly longer than would be given
      using \macro{code}.  Since quotation marks are added, spaces are
      acceptable.
    \end{macrodesc}

    \begin{macrodesc}{shortversion}{}
      The ``short'' version number of the documented software, as
      specified using the \macro{setshortversion} macro in the
      preamble.  For Python, the short version number for a release is
      the first three characters of the \code{sys.version} value.  For
      example, versions 2.0b1 and 2.0.1 both have a short version of
      2.0.  This may not apply for all packages; if
      \macro{setshortversion} is not used, this produces an empty
      expansion.  See also the \macro{version} macro.
    \end{macrodesc}

    \begin{macrodesc}{strong}{\p{text}}
      Strongly emphasized text; this will be presented using a bold
      font.
    \end{macrodesc}

    \begin{macrodesc}{ulink}{\p{text}\p{url}}
      A hypertext link with a target specified by a URL, but for which
      the link text should not be the title of the resource.  For
      resources being referenced by name, use the \macro{citetitle}
      macro.  Not all formatted versions support arbitrary hypertext
      links.  Note that many characters are special to \LaTeX{} and
      this macro does not always do the right thing.  In particular,
      the tilde character (\character{\~}) is mis-handled; encoding it
      as a hex-sequence does work, use \samp{\%7e} in place of the
      tilde character.
    \end{macrodesc}

    \begin{macrodesc}{url}{\p{url}}
      A URL (or URN).  The URL will be presented as text.  In the HTML
      and PDF formatted versions, the URL will also be a hyperlink.
      This can be used when referring to external resources without
      specific titles; references to resources which have titles
      should be marked using the \macro{citetitle} macro.  See the
      comments about special characters in the description of the
      \macro{ulink} macro for special considerations.
    \end{macrodesc}

    \begin{macrodesc}{var}{\p{name}}
      The name of a variable or formal parameter in running text.
    \end{macrodesc}

    \begin{macrodesc}{version}{}
      The version number of the described software, as specified using
      \macro{release} in the preamble.  See also the
      \macro{shortversion} macro.
    \end{macrodesc}

    \begin{macrodesc}{warning}{\p{text}}
      An important bit of information about an API that a user should
      be very aware of when using whatever bit of API the warning
      pertains to.  This should be the last thing in the paragraph as
      the end of the warning is not visually marked in any way.  The
      content of \var{text} should be written in complete sentences
      and include all appropriate punctuation.  This differs from
      \macro{note} in that it is recommended over \macro{note} for
      information regarding security.
    \end{macrodesc}

    The following two macros are used to describe information that's
    associated with changes from one release to another.  For features
    which are described by a single paragraph, these are typically
    added as separate source lines at the end of the paragraph.  When
    adding these to features described by multiple paragraphs, they
    are usually collected in a single separate paragraph after the
    description.  When both \macro{versionadded} and
    \macro{versionchanged} are used, \macro{versionadded} should come
    first; the versions should be listed in chronological order.  Both
    of these should come before availability statements.  The location
    should be selected so the explanation makes sense and may vary as
    needed.

    \begin{macrodesc}{versionadded}{\op{explanation}\p{version}}
      The version of Python which added the described feature to the
      library or C API.  \var{explanation} should be a \emph{brief}
      explanation of the change consisting of a capitalized sentence
      fragment; a period will be appended by the formatting process.
      When this applies to an entire module, it should be placed at
      the top of the module section before any prose.
    \end{macrodesc}

    \begin{macrodesc}{versionchanged}{\op{explanation}\p{version}}
      The version of Python in which the named feature was changed in
      some way (new parameters, changed side effects, etc.).
      \var{explanation} should be a \emph{brief} explanation of the
      change consisting of a capitalized sentence fragment; a
      period will be appended by the formatting process.  This should
      not generally be applied to modules.
    \end{macrodesc}


  \subsection{Miscellaneous Text Markup \label{misc-text-markup}}

  In addition to the inline markup, some additional ``block'' markup
  is defined to make it easier to bring attention to various bits of
  text.  The markup described here serves this purpose, and is
  intended to be used when marking one or more paragraphs or other
  block constructs (such as \env{verbatim} environments).

  \begin{envdesc}{notice}{\op{type}}
    Label some paragraphs as being worthy of additional attention from
    the reader.  What sort of attention is warranted can be indicated
    by specifying the \var{type} of the notice.  The only values
    defined for \var{type} are \code{note} and \code{warning}; these
    are equivalent in intent to the inline markup of the same name.
    If \var{type} is omitted, \code{note} is used.  Additional values
    may be defined in the future.
  \end{envdesc}


  \subsection{Module-specific Markup \label{module-markup}}

  The markup described in this section is used to provide information
  about a module being documented.  A typical use of this markup
  appears at the top of the section used to document a module.  A
  typical example might look like this:

\begin{verbatim}
\section{\module{spam} ---
         Access to the SPAM facility}

\declaremodule{extension}{spam}
  \platform{Unix}
\modulesynopsis{Access to the SPAM facility of \UNIX.}
\moduleauthor{Jane Doe}{jane.doe@frobnitz.org}
\end{verbatim}

  Python packages\index{packages} --- collections of modules that can
  be described as a unit --- are documented using the same markup as
  modules.  The name for a module in a package should be typed in
  ``fully qualified'' form (it should include the package name).
  For example, a module ``foo'' in package ``bar'' should be marked as
  \code{\e module\{bar.foo\}}, and the beginning of the reference
  section would appear as:

\begin{verbatim}
\section{\module{bar.foo} ---
         Module from the \module{bar} package}

\declaremodule{extension}{bar.foo}
\modulesynopsis{Nifty module from the \module{bar} package.}
\moduleauthor{Jane Doe}{jane.doe@frobnitz.org}
\end{verbatim}

  Note that the name of a package is also marked using
  \macro{module}.

  \begin{macrodesc}{declaremodule}{\op{key}\p{type}\p{name}}
    Requires two parameters: module type (\samp{standard},
    \samp{builtin}, \samp{extension}, or \samp{}), and the module
    name.  An optional parameter should be given as the basis for the
    module's ``key'' used for linking to or referencing the section.
    The ``key'' should only be given if the module's name contains any
    underscores, and should be the name with the underscores stripped.
    Note that the \var{type} parameter must be one of the values
    listed above or an error will be printed.  For modules which are
    contained in packages, the fully-qualified name should be given as
    \var{name} parameter.  This should be the first thing after the
    \macro{section} used to introduce the module.
  \end{macrodesc}

  \begin{macrodesc}{platform}{\p{specifier}}
    Specifies the portability of the module.  \var{specifier} is a
    comma-separated list of keys that specify what platforms the
    module is available on.  The keys are short identifiers;
    examples that are in use include \samp{IRIX}, \samp{Mac},
    \samp{Windows}, and \samp{Unix}.  It is important to use a key
    which has already been used when applicable.  This is used to
    provide annotations in the Module Index and the HTML and GNU info
    output.
  \end{macrodesc}

  \begin{macrodesc}{modulesynopsis}{\p{text}}
    The \var{text} is a short, ``one line'' description of the
    module that can be used as part of the chapter introduction.
    This is must be placed after \macro{declaremodule}.
    The synopsis is used in building the contents of the table
    inserted as the \macro{localmoduletable}.  No text is
    produced at the point of the markup.
  \end{macrodesc}

  \begin{macrodesc}{moduleauthor}{\p{name}\p{email}}
    This macro is used to encode information about who authored a
    module.  This is currently not used to generate output, but can be
    used to help determine the origin of the module.
  \end{macrodesc}


  \subsection{Library-level Markup \label{library-markup}}

    This markup is used when describing a selection of modules.  For
    example, the \citetitle[../mac/mac.html]{Macintosh Library
    Modules} document uses this to help provide an overview of the
    modules in the collection, and many chapters in the
    \citetitle[../lib/lib.html]{Python Library Reference} use it for
    the same purpose.

  \begin{macrodesc}{localmoduletable}{}
    If a \file{.syn} file exists for the current
    chapter (or for the entire document in \code{howto} documents), a
    \env{synopsistable} is created with the contents loaded from the
    \file{.syn} file.
  \end{macrodesc}


  \subsection{Table Markup \label{table-markup}}

    There are three general-purpose table environments defined which
    should be used whenever possible.  These environments are defined
    to provide tables of specific widths and some convenience for
    formatting.  These environments are not meant to be general
    replacements for the standard \LaTeX{} table environments, but can
    be used for an advantage when the documents are processed using
    the tools for Python documentation processing.  In particular, the
    generated HTML looks good!  There is also an advantage for the
    eventual conversion of the documentation to XML (see section
    \ref{futures}, ``Future Directions'').

    Each environment is named \env{table\var{cols}}, where \var{cols}
    is the number of columns in the table specified in lower-case
    Roman numerals.  Within each of these environments, an additional
    macro, \macro{line\var{cols}}, is defined, where \var{cols}
    matches the \var{cols} value of the corresponding table
    environment.  These are supported for \var{cols} values of
    \code{ii}, \code{iii}, and \code{iv}.  These environments are all
    built on top of the \env{tabular} environment.  Variants based on
    the \env{longtable} environment are also provided.

    Note that all tables in the standard Python documentation use
    vertical lines between columns, and this must be specified in the
    markup for each table.  A general border around the outside of the
    table is not used, but would be the responsibility of the
    processor; the document markup should not include an exterior
    border.

    The \env{longtable}-based variants of the table environments are
    formatted with extra space before and after, so should only be
    used on tables which are long enough that splitting over multiple
    pages is reasonable; tables with fewer than twenty rows should
    never by marked using the long flavors of the table environments.
    The header row is repeated across the top of each part of the
    table.

    \begin{envdesc}{tableii}{\p{colspec}\p{col1font}\p{heading1}\p{heading2}}
      Create a two-column table using the \LaTeX{} column specifier
      \var{colspec}.  The column specifier should indicate vertical
      bars between columns as appropriate for the specific table, but
      should not specify vertical bars on the outside of the table
      (that is considered a stylesheet issue).  The \var{col1font}
      parameter is used as a stylistic treatment of the first column
      of the table: the first column is presented as
      \code{\e\var{col1font}\{column1\}}.  To avoid treating the first
      column specially, \var{col1font} may be \samp{textrm}.  The
      column headings are taken from the values \var{heading1} and
      \var{heading2}.
    \end{envdesc}

    \begin{envdesc}{longtableii}{\unspecified}
      Like \env{tableii}, but produces a table which may be broken
      across page boundaries.  The parameters are the same as for
      \env{tableii}.
    \end{envdesc}

    \begin{macrodesc}{lineii}{\p{column1}\p{column2}}
      Create a single table row within a \env{tableii} or
      \env{longtableii} environment.
      The text for the first column will be generated by applying the
      macro named by the \var{col1font} value when the \env{tableii}
      was opened.
    \end{macrodesc}

    \begin{envdesc}{tableiii}{\p{colspec}\p{col1font}\p{heading1}\p{heading2}\p{heading3}}
      Like the \env{tableii} environment, but with a third column.
      The heading for the third column is given by \var{heading3}.
    \end{envdesc}

    \begin{envdesc}{longtableiii}{\unspecified}
      Like \env{tableiii}, but produces a table which may be broken
      across page boundaries.  The parameters are the same as for
      \env{tableiii}.
    \end{envdesc}

    \begin{macrodesc}{lineiii}{\p{column1}\p{column2}\p{column3}}
      Like the \macro{lineii} macro, but with a third column.  The
      text for the third column is given by \var{column3}.
    \end{macrodesc}

    \begin{envdesc}{tableiv}{\p{colspec}\p{col1font}\p{heading1}\p{heading2}\p{heading3}\p{heading4}}
      Like the \env{tableiii} environment, but with a fourth column.
      The heading for the fourth column is given by \var{heading4}.
    \end{envdesc}

    \begin{envdesc}{longtableiv}{\unspecified}
      Like \env{tableiv}, but produces a table which may be broken
      across page boundaries.  The parameters are the same as for
      \env{tableiv}.
    \end{envdesc}

    \begin{macrodesc}{lineiv}{\p{column1}\p{column2}\p{column3}\p{column4}}
      Like the \macro{lineiii} macro, but with a fourth column.  The
      text for the fourth column is given by \var{column4}.
    \end{macrodesc}

    \begin{envdesc}{tablev}{\p{colspec}\p{col1font}\p{heading1}\p{heading2}\p{heading3}\p{heading4}\p{heading5}}
      Like the \env{tableiv} environment, but with a fifth column.
      The heading for the fifth column is given by \var{heading5}.
    \end{envdesc}

    \begin{envdesc}{longtablev}{\unspecified}
      Like \env{tablev}, but produces a table which may be broken
      across page boundaries.  The parameters are the same as for
      \env{tablev}.
    \end{envdesc}

    \begin{macrodesc}{linev}{\p{column1}\p{column2}\p{column3}\p{column4}\p{column5}}
      Like the \macro{lineiv} macro, but with a fifth column.  The
      text for the fifth column is given by \var{column5}.
    \end{macrodesc}


    An additional table-like environment is \env{synopsistable}.  The
    table generated by this environment contains two columns, and each
    row is defined by an alternate definition of
    \macro{modulesynopsis}.  This environment is not normally used by
    authors, but is created by the \macro{localmoduletable} macro.

    Here is a small example of a table given in the documentation for
    the \module{warnings} module; markup inside the table cells is
    minimal so the markup for the table itself is readily discernable.
    Here is the markup for the table:

\begin{verbatim}
\begin{tableii}{l|l}{exception}{Class}{Description}
  \lineii{Warning}
         {This is the base class of all warning category classes.  It
          is a subclass of \exception{Exception}.}
  \lineii{UserWarning}
         {The default category for \function{warn()}.}
  \lineii{DeprecationWarning}
         {Base category for warnings about deprecated features.}
  \lineii{SyntaxWarning}
         {Base category for warnings about dubious syntactic
          features.}
  \lineii{RuntimeWarning}
         {Base category for warnings about dubious runtime features.}
  \lineii{FutureWarning}
         {Base category for warnings about constructs that will change
         semantically in the future.}
\end{tableii}
\end{verbatim}

    Here is the resulting table:

\begin{tableii}{l|l}{exception}{Class}{Description}
  \lineii{Warning}
         {This is the base class of all warning category classes.  It
          is a subclass of \exception{Exception}.}
  \lineii{UserWarning}
         {The default category for \function{warn()}.}
  \lineii{DeprecationWarning}
         {Base category for warnings about deprecated features.}
  \lineii{SyntaxWarning}
         {Base category for warnings about dubious syntactic
          features.}
  \lineii{RuntimeWarning}
         {Base category for warnings about dubious runtime features.}
\end{tableii}

    Note that the class names are implicitly marked using the
    \macro{exception} macro, since that is given as the \var{col1font}
    value for the \env{tableii} environment.  To create a table using
    different markup for the first column, use \code{textrm} for the
    \var{col1font} value and mark each entry individually.

    To add a horizontal line between vertical sections of a table, use
    the standard \macro{hline} macro between the rows which should be
    separated:

\begin{verbatim}
\begin{tableii}{l|l}{constant}{Language}{Audience}
  \lineii{APL}{Masochists.}
  \lineii{BASIC}{First-time programmers on PC hardware.}
  \lineii{C}{\UNIX{} \&\ Linux kernel developers.}
    \hline
  \lineii{Python}{Everyone!}
\end{tableii}
\end{verbatim}

    Note that not all presentation formats are capable of displaying a
    horizontal rule in this position.  This is how the table looks in
    the format you're reading now:

\begin{tableii}{l|l}{constant}{Language}{Audience}
  \lineii{APL}{Masochists.}
  \lineii{C}{\UNIX{} \&\ Linux kernel developers.}
  \lineii{JavaScript}{Web developers.}
    \hline
  \lineii{Python}{Everyone!}
\end{tableii}


  \subsection{Reference List Markup \label{references}}

    Many sections include a list of references to module documentation
    or external documents.  These lists are created using the
    \env{seealso} or \env{seealso*} environments.  These environments
    define some additional macros to support creating reference
    entries in a reasonable manner.

    The \env{seealso} environment is typically placed in a section
    just before any sub-sections.  This is done to ensure that
    reference links related to the section are not hidden in a
    subsection in the hypertext renditions of the documentation.  For
    the HTML output, it is shown as a ``side bar,'' boxed off from the
    main flow of the text.  The \env{seealso*} environment is
    different in that it should be used when a list of references is
    being presented as part of the primary content; it is not
    specially set off from the text.

    \begin{envdesc}{seealso}{}
      This environment creates a ``See also:'' heading and defines the
      markup used to describe individual references.
    \end{envdesc}

    \begin{envdesc}{seealso*}{}
      This environment is used to create a list of references which
      form part of the main content.  It is not given a special
      header and is not set off from the main flow of the text.  It
      provides the same additional markup used to describe individual
      references.
    \end{envdesc}

    For each of the following macros, \var{why} should be one or more
    complete sentences, starting with a capital letter (unless it
    starts with an identifier, which should not be modified), and
    ending with the appropriate punctuation.

    These macros are only defined within the content of the
    \env{seealso} and \env{seealso*} environments.

    \begin{macrodesc}{seelink}{\p{url}\p{linktext}\p{why}}
      References to specific on-line resources should be given using
      the \macro{seelink} macro if they don't have a meaningful title
      but there is some short description of what's at the end of the
      link.  Online documents which have identifiable titles should be
      referenced using the \macro{seetitle} macro, using the optional
      parameter to that macro to provide the URL.
    \end{macrodesc}

    \begin{macrodesc}{seemodule}{\op{key}\p{name}\p{why}}
      Refer to another module.  \var{why} should be a brief
      explanation of why the reference may be interesting.  The module
      name is given in \var{name}, with the link key given in
      \var{key} if necessary.  In the HTML and PDF conversions, the
      module name will be a hyperlink to the referred-to module.
      \note{The module must be documented in the same
      document (the corresponding \macro{declaremodule} is required).}
    \end{macrodesc}

    \begin{macrodesc}{seepep}{\p{number}\p{title}\p{why}}
      Refer to an Python Enhancement Proposal (PEP).  \var{number}
      should be the official number assigned by the PEP Editor,
      \var{title} should be the human-readable title of the PEP as
      found in the official copy of the document, and \var{why} should
      explain what's interesting about the PEP.  This should be used
      to refer the reader to PEPs which specify interfaces or language
      features relevant to the material in the annotated section of the
      documentation.
    \end{macrodesc}

    \begin{macrodesc}{seerfc}{\p{number}\p{title}\p{why}}
      Refer to an IETF Request for Comments (RFC).  Otherwise very
      similar to \macro{seepep}.  This should be used
      to refer the reader to PEPs which specify protocols or data
      formats relevant to the material in the annotated section of the
      documentation.
    \end{macrodesc}

    \begin{macrodesc}{seetext}{\p{text}}
      Add arbitrary text \var{text} to the ``See also:'' list.  This
      can be used to refer to off-line materials or on-line materials
      using the \macro{url} macro.  This should consist of one or more
      complete sentences.
    \end{macrodesc}

    \begin{macrodesc}{seetitle}{\op{url}\p{title}\p{why}}
      Add a reference to an external document named \var{title}.  If
      \var{url} is given, the title is made a hyperlink in the HTML
      version of the documentation, and displayed below the title in
      the typeset versions of the documentation.
    \end{macrodesc}

    \begin{macrodesc}{seeurl}{\p{url}\p{why}}
      References to specific on-line resources should be given using
      the \macro{seeurl} macro if they don't have a meaningful title.
      Online documents which have identifiable titles should be
      referenced using the \macro{seetitle} macro, using the optional
      parameter to that macro to provide the URL.
    \end{macrodesc}


  \subsection{Index-generating Markup \label{indexing}}

    Effective index generation for technical documents can be very
    difficult, especially for someone familiar with the topic but not
    the creation of indexes.  Much of the difficulty arises in the
    area of terminology: including the terms an expert would use for a
    concept is not sufficient.  Coming up with the terms that a novice
    would look up is fairly difficult for an author who, typically, is
    an expert in the area she is writing on.

    The truly difficult aspects of index generation are not areas with
    which the documentation tools can help.  However, ease
    of producing the index once content decisions are made is within
    the scope of the tools.  Markup is provided which the processing
    software is able to use to generate a variety of kinds of index
    entry with minimal effort.  Additionally, many of the environments
    described in section \ref{info-units}, ``Information Units,'' will
    generate appropriate entries into the general and module indexes.

    The following macro can be used to control the generation of index
    data, and should be used in the document preamble:

    \begin{macrodesc}{makemodindex}{}
      This should be used in the document preamble if a ``Module
      Index'' is desired for a document containing reference material
      on many modules.  This causes a data file
      \code{lib\var{jobname}.idx} to be created from the
      \macro{declaremodule} macros.  This file can be processed by the
      \program{makeindex} program to generate a file which can be
      \macro{input} into the document at the desired location of the
      module index.
    \end{macrodesc}

    There are a number of macros that are useful for adding index
    entries for particular concepts, many of which are specific to
    programming languages or even Python.

    \begin{macrodesc}{bifuncindex}{\p{name}}
      Add an index entry referring to a built-in function named
      \var{name}; parentheses should not be included after
      \var{name}.
    \end{macrodesc}

    \begin{macrodesc}{exindex}{\p{exception}}
      Add a reference to an exception named \var{exception}.  The
      exception should be class-based.
    \end{macrodesc}

    \begin{macrodesc}{kwindex}{\p{keyword}}
      Add a reference to a language keyword (not a keyword parameter
      in a function or method call).
    \end{macrodesc}

    \begin{macrodesc}{obindex}{\p{object type}}
      Add an index entry for a built-in object type.
    \end{macrodesc}

    \begin{macrodesc}{opindex}{\p{operator}}
      Add a reference to an operator, such as \samp{+}.
    \end{macrodesc}

    \begin{macrodesc}{refmodindex}{\op{key}\p{module}}
      Add an index entry for module \var{module}; if \var{module}
      contains an underscore, the optional parameter \var{key} should
      be provided as the same string with underscores removed.  An
      index entry ``\var{module} (module)'' will be generated.  This
      is intended for use with non-standard modules implemented in
      Python.
    \end{macrodesc}

    \begin{macrodesc}{refexmodindex}{\op{key}\p{module}}
      As for \macro{refmodindex}, but the index entry will be
      ``\var{module} (extension module).''  This is intended for use
      with non-standard modules not implemented in Python.
    \end{macrodesc}

    \begin{macrodesc}{refbimodindex}{\op{key}\p{module}}
      As for \macro{refmodindex}, but the index entry will be
      ``\var{module} (built-in module).''  This is intended for use
      with standard modules not implemented in Python.
    \end{macrodesc}

    \begin{macrodesc}{refstmodindex}{\op{key}\p{module}}
      As for \macro{refmodindex}, but the index entry will be
      ``\var{module} (standard module).''  This is intended for use
      with standard modules implemented in Python.
    \end{macrodesc}

    \begin{macrodesc}{stindex}{\p{statement}}
      Add an index entry for a statement type, such as \keyword{print}
      or \keyword{try}/\keyword{finally}.

      XXX Need better examples of difference from \macro{kwindex}.
    \end{macrodesc}


    Additional macros are provided which are useful for conveniently
    creating general index entries which should appear at many places
    in the index by rotating a list of words.  These are simple macros
    that simply use \macro{index} to build some number of index
    entries.  Index entries build using these macros contain both
    primary and secondary text.

    \begin{macrodesc}{indexii}{\p{word1}\p{word2}}
      Build two index entries.  This is exactly equivalent to using
      \code{\e index\{\var{word1}!\var{word2}\}} and
      \code{\e index\{\var{word2}!\var{word1}\}}.
    \end{macrodesc}

    \begin{macrodesc}{indexiii}{\p{word1}\p{word2}\p{word3}}
      Build three index entries.  This is exactly equivalent to using
      \code{\e index\{\var{word1}!\var{word2} \var{word3}\}},
      \code{\e index\{\var{word2}!\var{word3}, \var{word1}\}}, and
      \code{\e index\{\var{word3}!\var{word1} \var{word2}\}}.
    \end{macrodesc}

    \begin{macrodesc}{indexiv}{\p{word1}\p{word2}\p{word3}\p{word4}}
      Build four index entries.  This is exactly equivalent to using
      \code{\e index\{\var{word1}!\var{word2} \var{word3} \var{word4}\}},
      \code{\e index\{\var{word2}!\var{word3} \var{word4}, \var{word1}\}},
      \code{\e index\{\var{word3}!\var{word4}, \var{word1} \var{word2}\}},
      and
      \code{\e index\{\var{word4}!\var{word1} \var{word2} \var{word3}\}}.
    \end{macrodesc}

  \subsection{Grammar Production Displays \label{grammar-displays}}

    Special markup is available for displaying the productions of a
    formal grammar.  The markup is simple and does not attempt to
    model all aspects of BNF (or any derived forms), but provides
    enough to allow context-free grammars to be displayed in a way
    that causes uses of a symbol to be rendered as hyperlinks to the
    definition of the symbol.  There is one environment and a pair of
    macros:

    \begin{envdesc}{productionlist}{\op{language}}
      This environment is used to enclose a group of productions.  The
      two macros are only defined within this environment.  If a
      document describes more than one language, the optional parameter
      \var{language} should be used to distinguish productions between
      languages.  The value of the parameter should be a short name
      that can be used as part of a filename; colons or other
      characters that can't be used in filename across platforms
      should be included.
    \end{envdesc}

    \begin{macrodesc}{production}{\p{name}\p{definition}}
      A production rule in the grammar.  The rule defines the symbol
      \var{name} to be \var{definition}.  \var{name} should not
      contain any markup, and the use of hyphens in a document which
      supports more than one grammar is undefined.  \var{definition}
      may contain \macro{token} macros and any additional content
      needed to describe the grammatical model of \var{symbol}.  Only
      one \macro{production} may be used to define a symbol ---
      multiple definitions are not allowed.
    \end{macrodesc}

    \begin{macrodesc}{token}{\p{name}}
      The name of a symbol defined by a \macro{production} macro, used
      in the \var{definition} of a symbol.  Where possible, this will
      be rendered as a hyperlink to the definition of the symbol
      \var{name}.
    \end{macrodesc}

    Note that the entire grammar does not need to be defined in a
    single \env{productionlist} environment; any number of
    groupings may be used to describe the grammar.  Every use of the
    \macro{token} must correspond to a \macro{production}.

    The following is an example taken from the
    \citetitle[../ref/identifiers.html]{Python Reference Manual}:

\begin{verbatim}
\begin{productionlist}
  \production{identifier}
             {(\token{letter}|"_") (\token{letter} | \token{digit} | "_")*}
  \production{letter}
             {\token{lowercase} | \token{uppercase}}
  \production{lowercase}
             {"a"..."z"}
  \production{uppercase}
             {"A"..."Z"}
  \production{digit}
             {"0"..."9"}
\end{productionlist}
\end{verbatim}


\subsection{Graphical Interface Components \label{gui-markup}}

  The components of graphical interfaces will be assigned markup, but
  most of the specifics have not been determined.

  \begin{macrodesc}{guilabel}{\p{label}}
    Labels presented as part of an interactive user interface should
    be marked using \macro{guilabel}.  This includes labels from
    text-based interfaces such as those created using \code{curses} or
    other text-based libraries.  Any label used in the interface
    should be marked with this macro, including button labels, window
    titles, field names, menu and menu selection names, and even
    values in selection lists.
  \end{macrodesc}

  \begin{macrodesc}{menuselection}{\p{menupath}}
    Menu selections should be marked using a combination of
    \macro{menuselection} and \macro{sub}.  This macro is used to mark
    a complete sequence of menu selections, including selecting
    submenus and choosing a specific operation, or any subsequence of
    such a sequence.  The names of individual selections should be
    separated by occurrences of \macro{sub}.

    For example, to mark the selection ``\menuselection{Start \sub
    Programs}'', use this markup:

\begin{verbatim}
\menuselection{Start \sub Programs}
\end{verbatim}

    When including a selection that includes some trailing indicator,
    such as the ellipsis some operating systems use to indicate that
    the command opens a dialog, the indicator should be omitted from
    the selection name.

    Individual selection names within the \macro{menuselection} should
    not be marked using \macro{guilabel} since that's implied by using
    \macro{menuselection}.
  \end{macrodesc}

  \begin{macrodesc}{sub}{}
    Separator for menu selections that include multiple levels.  This
    macro is only defined within the context of the
    \macro{menuselection} macro.
  \end{macrodesc}


\section{Processing Tools \label{tools}}

  \subsection{External Tools \label{tools-external}}

    Many tools are needed to be able to process the Python
    documentation if all supported formats are required.  This
    section lists the tools used and when each is required.  Consult
    the \file{Doc/README} file to see if there are specific version
    requirements for any of these.

    \begin{description}
      \item[\program{dvips}]
        This program is a typical part of \TeX{} installations.  It is
        used to generate PostScript from the ``device independent''
        \file{.dvi} files.  It is needed for the conversion to
        PostScript.

      \item[\program{emacs}]
        Emacs is the kitchen sink of programmers' editors, and a damn
        fine kitchen sink it is.  It also comes with some of the
        processing needed to support the proper menu structures for
        Texinfo documents when an info conversion is desired.  This is
        needed for the info conversion.  Using \program{xemacs}
        instead of FSF \program{emacs} may lead to instability in the
        conversion, but that's because nobody seems to maintain the
        Emacs Texinfo code in a portable manner.

      \item[\program{latex}]
        \LaTeX{} is a large and extensible macro package by Leslie
        Lamport, based on \TeX, a world-class typesetter by Donald
        Knuth.  It is used for the conversion to PostScript, and is
        needed for the HTML conversion as well (\LaTeX2HTML requires
        one of the intermediate files it creates).

      \item[\program{latex2html}]
        Probably the longest Perl script anyone ever attempted to
        maintain.  This converts \LaTeX{} documents to HTML documents,
        and does a pretty reasonable job.  It is required for the
        conversions to HTML and GNU info.

      \item[\program{lynx}]
        This is a text-mode Web browser which includes an
        HTML-to-plain text conversion.  This is used to convert
        \code{howto} documents to text.

      \item[\program{make}]
        Just about any version should work for the standard documents,
        but GNU \program{make} is required for the experimental
        processes in \file{Doc/tools/sgmlconv/}, at least while
        they're experimental.  This is not required for running the
        \program{mkhowto} script.

      \item[\program{makeindex}]
        This is a standard program for converting \LaTeX{} index data
        to a formatted index; it should be included with all \LaTeX{}
        installations.  It is needed for the PDF and PostScript
        conversions.

      \item[\program{makeinfo}]
        GNU \program{makeinfo} is used to convert Texinfo documents to
        GNU info files.  Since Texinfo is used as an intermediate
        format in the info conversion, this program is needed in that
        conversion.

      \item[\program{pdflatex}]
        pdf\TeX{} is a relatively new variant of \TeX, and is used to
        generate the PDF version of the manuals.  It is typically
        installed as part of most of the large \TeX{} distributions.
        \program{pdflatex} is pdf\TeX{} using the \LaTeX{} format.

      \item[\program{perl}]
        Perl is required for \LaTeX2HTML{} and one of the scripts used
        to post-process \LaTeX2HTML output, as well as the
        HTML-to-Texinfo conversion.  This is required for
        the HTML and GNU info conversions.

      \item[\program{python}]
        Python is used for many of the scripts in the
        \file{Doc/tools/} directory; it is required for all
        conversions.  This shouldn't be a problem if you're interested
        in writing documentation for Python!
    \end{description}


  \subsection{Internal Tools \label{tools-internal}}

    This section describes the various scripts that are used to
    implement various stages of document processing or to orchestrate
    entire build sequences.  Most of these tools are only useful
    in the context of building the standard documentation, but some
    are more general.

    \begin{description}
      \item[\program{mkhowto}]
        This is the primary script used to format third-party
        documents.  It contains all the logic needed to ``get it
        right.''  The proper way to use this script is to make a
        symbolic link to it or run it in place; the actual script file
        must be stored as part of the documentation source tree,
        though it may be used to format documents outside the tree.
        Use \program{mkhowto} \longprogramopt{help} for a list of
        command line options.

        \program{mkhowto} can be used for both \code{howto} and
        \code{manual} class documents.  It is usually a good idea to
        always use the latest version of this tool rather than a
        version from an older source release of Python.  It can be
        used to generate DVI, HTML, PDF, PostScript, and plain text
        documents.  The GNU info and iSilo formats will be supported
        by this script in some future version.

        Use the \longprogramopt{help} option on this script's command
        line to get a summary of options for this script.

        XXX  Need more here.
    \end{description}


  \subsection{Working on Cygwin \label{cygwin}}

    Installing the required tools under Cygwin under Cygwin can be a
    little tedious.  Most of the required packages can be installed
    using Cygwin's graphical installer, while netpbm and \LaTeX2HTML
    must be installed from source. 

    Start with a reasonably modern version of Cygwin.  If you haven't
    upgraded for a few years, now would be a good time.

    Using the Cygwin installer, make sure your Cygwin installation
    includes Perl, Python, and the \TeX{} packages.  Perl and Python
    are located under the \menuselection{Interpreters} heading.  The
    \TeX{} packages are located under the \menuselection{Text}
    heading, and are named \code{tetex-*}.  To ensure that all
    required packages are available, install every \code{tetex}
    package, except \code{tetex-x11}.  (There may be a more minimal
    set, but I've not spent time trying to minimize the installation.) 

    The netpbm package is used by \LaTeX2HTML, and \emph{must} be
    installed before \LaTeX2HTML can be successfully installed, even
    though its features will not be used for most Python
    documentation.  References to download locations are located in
    the \ulink{netpbm README}{http://netpbm.sourceforge.net/README}.
    Install from the latest stable source distribution according to
    the instructions.  (Note that binary packages of netpbm are
    sometimes available, but these may not work correctly with
    \LaTeX2HTML.)

    \LaTeX2HTML can be installed from the source archive, but only
    after munging one of the files in the distribution.  Download the
    source archive from the \LaTeX2HTML website
    \url{http://www.latex2html.org/} (or one of the many alternate
    sites) and unpack it to a build directory. In the top level of
    this build directory there will be a file named \file{L2hos.pm}.
    Open \file{L2hos.pm} in an editor, and near the bottom of the file
    replace the text \code{\$\textasciicircum{}O} with the text
    \code{'unix'}.  Proceed using this command to build and install
    the software:

\begin{verbatim}
% ./configure && make install
\end{verbatim}

    You should now be able to build at least the DVI, HTML, PDF, and
    PostScript versions of the formatted documentation.


\section{Including Graphics \label{graphics}}

  The standard documentation included with Python makes no use of
  diagrams or images; this is intentional.  The outside tools used to
  format the documentation have not always been suited to working with
  graphics.  As the tools have evolved and been improved by their
  maintainers, support for graphics has improved.

  The internal tools, starting with the \program{mkhowto} script, do
  not provide any direct support for graphics.  However,
  \program{mkhowto} will not interfere with graphics support in the
  external tools.

  Experience using graphics together with these tools and the
  \code{howto} and \code{manual} document classes is not extensive,
  but has been known to work.  The basic approach is this:

  \begin{enumerate}
    \item Create the image or graphic using your favorite
          application.

    \item Convert the image to a format supported by the conversion to
          your desired output format.  If you want to generate HTML or
          PostScript, you can convert the image or graphic to
          encapsulated PostScript (a \file{.eps} file); \LaTeX2HTML
          can convert that to a \file{.gif} file; it may be possible
          to provide a \file{.gif} file directly.  If you want to
          generate PDF, you need to provide an ``encapsulated'' PDF
          file.  This can be generated from encapsulated PostScript
          using the \program{epstopdf} tool provided with the te\TeX{}
          distribution on Linux and \UNIX.

    \item In your document, add this line to ``import'' the general
          graphics support package \code{graphicx}:

\begin{verbatim}
\usepackage{graphicx}
\end{verbatim}

    \item Where you want to include your graphic or image, include
          markup similar to this:

\begin{verbatim}
\begin{figure}
  \centering
  \includegraphics[width=5in]{myimage}
  \caption{Description of my image}
\end{figure}
\end{verbatim}

          In particular, note for the \macro{includegraphics} macro
          that no file extension is provided.  If you're only
          interested in one target format, you can include the
          extension of the appropriate input file, but to allow
          support for multiple formats, omitting the extension makes
          life easier.

    \item Run \program{mkhowto} normally.
  \end{enumerate}

  If you're working on systems which support some sort of
  \program{make} facility, you can use that to ensure the intermediate
  graphic formats are kept up to date.  This example shows a
  \file{Makefile} used to format a document containing a diagram
  created using the \program{dia} application:

\begin{verbatim}
default: pdf
all:     html pdf ps

html:   mydoc/mydoc.html
pdf:    mydoc.pdf
ps:     mydoc.ps

mydoc/mydoc.html:  mydoc.tex mygraphic.eps
        mkhowto --html $<

mydoc.pdf:  mydoc.tex mygraphic.pdf
        mkhowto --pdf $<

mydoc.ps:   mydoc.tex mygraphic.eps
        mkhowto --postscript $<

.SUFFIXES: .dia .eps .pdf

.dia.eps:
        dia --nosplash --export $@ $<

.eps.pdf:
        epstopdf $<
\end{verbatim} % $ <-- bow to font-lock


\section{Future Directions \label{futures}}

  The history of the Python documentation is full of changes, most of
  which have been fairly small and evolutionary.  There has been a
  great deal of discussion about making large changes in the markup
  languages and tools used to process the documentation.  This section
  deals with the nature of the changes and what appears to be the most
  likely path of future development.

  \subsection{Structured Documentation \label{structured}}

    Most of the small changes to the \LaTeX{} markup have been made
    with an eye to divorcing the markup from the presentation, making
    both a bit more maintainable.  Over the course of 1998, a large
    number of changes were made with exactly this in mind; previously,
    changes had been made but in a less systematic manner and with
    more concern for not needing to update the existing content.  The
    result has been a highly structured and semantically loaded markup
    language implemented in \LaTeX.  With almost no basic \TeX{} or
    \LaTeX{} markup in use, however, the markup syntax is about the
    only evidence of \LaTeX{} in the actual document sources.

    One side effect of this is that while we've been able to use
    standard ``engines'' for manipulating the documents, such as
    \LaTeX{} and \LaTeX2HTML, most of the actual transformations have
    been created specifically for Python.  The \LaTeX{} document
    classes and \LaTeX2HTML support are both complete implementations
    of the specific markup designed for these documents.

    Combining highly customized markup with the somewhat esoteric
    systems used to process the documents leads us to ask some
    questions:  Can we do this more easily?  and, Can we do this
    better?  After a great deal of discussion with the community, we
    have determined that actively pursuing modern structured
    documentation systems is worth some investment of time.

    There appear to be two real contenders in this arena: the Standard
    General Markup Language (SGML), and the Extensible Markup Language
    (XML).  Both of these standards have advantages and disadvantages,
    and many advantages are shared.

    SGML offers advantages which may appeal most to authors,
    especially those using ordinary text editors.  There are also
    additional abilities to define content models.  A number of
    high-quality tools with demonstrated maturity are available, but
    most are not free; for those which are, portability issues remain
    a problem.

    The advantages of XML include the availability of a large number
    of evolving tools.  Unfortunately, many of the associated
    standards are still evolving, and the tools will have to follow
    along.  This means that developing a robust tool set that uses
    more than the basic XML 1.0 recommendation is not possible in the
    short term.  The promised availability of a wide variety of
    high-quality tools which support some of the most important
    related standards is not immediate.  Many tools are likely to be
    free, and the portability issues of those which are, are not
    expected to be significant.

    It turns out that converting to an XML or SGML system holds
    promise for translators as well; how much can be done to ease the
    burden on translators remains to be seen, and may have some impact
    on the schema and specific technologies used.

    XXX Eventual migration to XML.

    The documentation will be moved to XML in the future, and tools
    are being written which will convert the documentation from the
    current format to something close to a finished version, to the
    extent that the desired information is already present in the
    documentation.  Some XSLT stylesheets have been started for
    presenting a preliminary XML version as HTML, but the results are
    fairly rough.

    The timeframe for the conversion is not clear since there doesn't
    seem to be much time available to work on this, but the apparent
    benefits are growing more substantial at a moderately rapid pace.


  \subsection{Discussion Forums \label{discussion}}

    Discussion of the future of the Python documentation and related
    topics takes place in the Documentation Special Interest Group, or
    ``Doc-SIG.''  Information on the group, including mailing list
    archives and subscription information, is available at
    \url{http://www.python.org/sigs/doc-sig/}.  The SIG is open to all
    interested parties.

    Comments and bug reports on the standard documents should be sent
    to \email{docs@python.org}.  This may include comments
    about formatting, content, grammatical and spelling errors, or
    this document.  You can also send comments on this document
    directly to the author at \email{fdrake@acm.org}.

\input{doc.ind}

\end{document}
