diff --git a/Doc/doc/doc.tex b/Doc/doc/doc.tex new file mode 100644 index 00000000000..a2d0336bdc2 --- /dev/null +++ b/Doc/doc/doc.tex @@ -0,0 +1,644 @@ +\documentclass{howto} +\usepackage{ltxmarkup} + +\title{Documenting Python} + +\input{boilerplate} + +% Now override the stuff that includes author information: + +\author{Fred L. Drake, Jr.} +\authoraddress{ + Corporation for National Research Initiatives (CNRI) \\ + 1895 Preston White Drive, Reston, Va 20191, USA \\ + E-mail: \email{fdrake@acm.org} +} +\date{\today} + + +\begin{document} + +\maketitle + +\begin{abstract} +\noindent +The Python language documentation 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. +Maintaining the documentation requires substantial effort, in part +because selecting the correct markup to use is not always easy. + +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. +\end{abstract} + +\tableofcontents + + +\section{Introduction} + + 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 aspects of the + documentation could be 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. + + [Who is this document for?] + + [What does it cover?] + +\section{Directory Structure} + + 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 subdirectory \file{Doc/}, but + is independent of the Python source distribution. + + 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, + three-character names. + + \term{Format-Specific Output} + Most output formats have a directory provided which contains a + \file{Makefile} which controls the generation of that format + and provides storage for the formatted documents. The only + variation within this category is the Portable Document Format + (PDF) and PostScript versions are placed in the directories + \file{paper-a4/} and \file{paper-letter/}. + + \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. + \end{definitions} + +\section{Document 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 \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 + more broad. 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 + the standard \emph{Macintosh Library Modules} and \emph{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{Python-specific Markup} + + \subsection{Information Units \label{info-units}} + + Most of the environments should be described here: \env{excdesc}, + \env{funcdesc}, etc. + + \begin{envdesc}{datadesc}{\{\var{name}\}} + \end{envdesc} + \begin{envdesc}{datadesc}{\{\var{name}\}} + Like \env{datadesc}, but without creating any index entries. + \end{envdesc} + + \begin{envdesc}{excdesc}{\{\var{name}\}} + Describe an exception. This may be either a string exception or + a class exception. + \end{envdesc} + + \begin{envdesc}{funcdesc}{\{\var{name}\}\{\var{parameter list}\}} + \end{envdesc} + \begin{envdesc}{funcdescni}{\{\var{name}\}\{\var{parameter list}\}} + Like \env{funcdesc}, but without creating any index entries. + \end{envdesc} + + \begin{envdesc}{classdesc}{\{\var{name}\}\{\var{constructor parameter list}\}} + \end{envdesc} + + \begin{envdesc}{memberdesc}{\{\var{name}\}} + \end{envdesc} + \begin{envdesc}{memberdescni}{\{\var{name}\}} + Like \env{memberdesc}, but without creating any index entries. + \end{envdesc} + + \begin{envdesc}{methoddesc}{{[}\var{class name}{]}\{\var{name}\}\{\var{parameter list}\}} + \end{envdesc} + \begin{envdesc}{methoddescni}{{[}\var{class name}{]}\{\var{name}\}\{\var{parameter list}\}} + Like \env{methoddesc}, but without creating any index entries. + \end{envdesc} + + + \subsection{Inline Markup} + + This is where to explain \macro{code}, \macro{function}, + \macro{email}, etc. + + + \subsection{Module-specific 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{SomeOS} +\modulesynopsis{Access to the SPAM facility of SomeOS.} +\moduleauthor{John Doe}{john.doe@frobnication.org} +\end{verbatim} + + \begin{macrodesc}{declaremodule}{{[}\var{key}{]}\{\var{type}\}\{\var{name}\}} + Requires two parameters: module type (standard, builtin, + extension), 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 underscores, and should be the name with the + underscore's stripped. This should be the first thing after the + \macro{section} used to introduce the module. + \end{macrodesc} + + \begin{macrodesc}{platform}{\{\var{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. + \end{macrodesc} + + \begin{macrodesc}{modulesynopsis}{\{\var{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 typically placed just 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}{\{\var{name}\}\{\var{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} + + This markup is used when describing a selection of modules. For + example, the \emph{Macintosh Library Modules} document uses this + to help provide an overview of the modules in the collection, and + many chapters in the \emph{Python Library Reference} use it for + the same purpose. + + \begin{macrodesc}{localmoduletable}{} + No parameters. 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} + + 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 SGML; 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 environments are all built on top of the + \env{tabular} environment. + + \begin{envdesc}{tableii}{\{\var{colspec}\}\{\var{col1font}\}\{\var{heading1}\}\{\var{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 \code{textrm}. The + column headings are taken from the values \var{heading1} and + \var{heading2}. + \end{envdesc} + + \begin{macrodesc}{lineii}{\{\var{column1}\}\{\var{column2}\}} + Create a single table row within a \env{tableii} 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}{\{\var{colspec}\}\{\var{col1font}\}\{\var{heading1}\}\{\var{heading2}\}\{\var{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{macrodesc}{lineiii}{\{\var{column1}\}\{\var{column2}\}\{\var{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}{\{\var{colspec}\}\{\var{col1font}\}\{\var{heading1}\}\{\var{heading2}\}\{\var{heading3}\}\{\var{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{macrodesc}{lineiv}{\{\var{column1}\}\{\var{column2}\}\{\var{column3}\}\{\var{column4}\}} + Like the \macro{lineiii} macro, but with a fourth column. The + text for the fourth column is given by \var{column4}. + \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 use by + the user, but is created by the \macro{localmoduletable} macro. + + + \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} environment. This environment defines some + additional macros to support creating reference entries in a + reasonable manner. + + \begin{envdesc}{seealso}{} + This environment creates a ``See also:'' heading and defines the + markup used to describe individual references. + \end{envdesc} + + \begin{macrodesc}{seemodule}{{[}\var{key}{]}\{\var{name}\}\{\var{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. + \end{macrodesc} + + \begin{macrodesc}{seetext}{\{\var{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. + \end{macrodesc} + + + \subsection{Index-generating Markup \label{indexing}} + + Effective index generation for technical documents can be very + difficult, especially for someone familliar 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, hopefully, is + an expert in the area she is writing on. + + The truly difficult aspects of index generation are not something + which the documentation tools can help with, unfortunately. Ease + of producing the index once content decisions are make 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 prologue: + + \begin{macrodesc}{makemodindex}{} + This should be used in the document prologue if a ``Module + Index'' is desired for a document containing reference material + on many modules. This causes a data file + \code{lib\macro{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}{\{\var{name}\}} + \end{macrodesc} + + \begin{macrodesc}{exindex}{\{\var{exception}\}} + \end{macrodesc} + + \begin{macrodesc}{kwindex}{\{\var{keyword}\}} + \end{macrodesc} + + \begin{macrodesc}{obindex}{\{\var{object type}\}} + \end{macrodesc} + + \begin{macrodesc}{opindex}{\{\var{operator}\}} + \end{macrodesc} + + \begin{macrodesc}{refmodindex}{{[}\var{key}{]}\{\var{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}{{[}\var{key}{]}\{\var{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}{{[}\var{key}{]}\{\var{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}{{[}\var{key}{]}\{\var{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}{\{\var{statement}\}} + \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}{\{\var{word1}\}\{\var{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}{\{\var{word1}\}\{\var{word2}\}\{\var{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}{\{\var{word1}\}\{\var{word2}\}\{\var{word3}\}\{\var{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} + + +\section{Special Names} + + 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, 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. + + \begin{description} + \item[POSIX] + The name assigned to a particular group of standards. This is + always uppercase. + + \item[Python] + The name of our favorite programming language is always + capitalized. + \end{description} + + +\section{Processing Tools} + + \subsection{External Tools} + + 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. + + \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 only 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 + only 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}] + This is 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. + + \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 only 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} + + 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 still only useful + in the context of building the standard documentation, but some + are more general. + + \begin{description} + \item[\program{mkhowto}] + \end{description} + + +\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 this documentation. 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 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 is 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. + + [Eventual migration to SGML/XML.] + + \subsection{Discussion Forums \label{discussion}} + + Discussion of the future of the Python documentation and related + topics takes place in the ``Doc-SIG'' special interest group. + Information on the group, including mailing list archives and + subscriptions, 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{python-docs@python.org}. This may include comments + about formatting, content, or grammatical errors. + +\end{document}