diff --git a/Doc/Makefile b/Doc/Makefile
index 8e23b96..6d23a4f 100644
--- a/Doc/Makefile
+++ b/Doc/Makefile
@@ -19,7 +19,7 @@
 # four.  You can also do "make lib" (etc.) to process individual
 # documents.
 #
-# There's one local style file: myformat.sty.  This defines a number
+# There's one local style file: python.sty.  This defines a number
 # of macros that are similar in name and intent as macros in Texinfo
 # (e.g. \code{...} and \emph{...}), as well as a number of
 # environments for formatting function and data definitions, also in
@@ -125,7 +125,7 @@
 	$(PDFLATEX) $*
 
 # Dependencies
-COMMONTEX=myformat.sty copyright.tex boilerplate.tex
+COMMONTEX=python.sty manual.cls copyright.tex boilerplate.tex
 
 $(DVIFILES): fix_hack $(COMMONTEX)
 
@@ -245,7 +245,7 @@
 
 l2h: l2hapi l2hext l2hlib l2htut
 
-l2htut: tut.dvi myformat.perl
+l2htut: tut.dvi manual.perl python.perl
 	$(L2H) $(L2HARGS) tut.tex
 	(cd tut; ../node2label.pl *.html)
 	sed 's/^<P CLASS=ABSTRACT>,/<P CLASS=ABSTRACT>/' \
@@ -253,7 +253,7 @@
 	mv tut/xxx tut/tut.html
 	ln -s tut.html tut/index.html || true
 
-l2hext: ext.dvi myformat.perl
+l2hext: ext.dvi manual.perl python.perl
 	$(L2H) $(L2HARGS) ext.tex
 	(cd ext; ../node2label.pl *.html)
 	sed 's/^<P CLASS=ABSTRACT>,/<P CLASS=ABSTRACT>/' \
@@ -261,7 +261,7 @@
 	mv ext/xxx ext/ext.html
 	ln -s ext.html ext/index.html || true
 
-l2hlib: lib.dvi myformat.perl
+l2hlib: lib.dvi manual.perl python.perl
 	./fix_libaux.sed <lib.aux >lib1.aux
 	mv lib1.aux lib.aux
 	if [ -d lib ] ; then rm -f lib/*.html ; fi
@@ -272,7 +272,7 @@
 	mv lib/xxx lib/lib.html
 	ln -s lib.html lib/index.html || true
 
-l2hapi: api.dvi myformat.perl
+l2hapi: api.dvi manual.perl python.perl
 	$(L2H) $(L2HARGS) api.tex
 	(cd api; ../node2label.pl *.html)
 	sed 's/^<P CLASS=ABSTRACT>,/<P CLASS=ABSTRACT>/' \
@@ -310,7 +310,7 @@
 # Housekeeping targets
 
 # Remove temporary files; all except the following:
-# - sources: .tex, .bib, .sty
+# - sources: .tex, .bib, .sty, *.cls
 # - useful results: .dvi, .pdf, .ps, .texi, .info
 clean:	l2hclean
 	rm -f @* *~ *.aux *.idx *.ilg *.ind *.log *.toc *.blg *.bbl *.py[co]
diff --git a/Doc/api.tex b/Doc/api.tex
index 1a9eba4..fdc19b0 100644
--- a/Doc/api.tex
+++ b/Doc/api.tex
@@ -1,5 +1,4 @@
-\documentclass[twoside,openright]{report}
-\usepackage{myformat}
+\documentclass{manual}
 
 \title{Python/C API Reference Manual}
 
diff --git a/Doc/api/api.tex b/Doc/api/api.tex
index 1a9eba4..fdc19b0 100644
--- a/Doc/api/api.tex
+++ b/Doc/api/api.tex
@@ -1,5 +1,4 @@
-\documentclass[twoside,openright]{report}
-\usepackage{myformat}
+\documentclass{manual}
 
 \title{Python/C API Reference Manual}
 
diff --git a/Doc/ext.tex b/Doc/ext.tex
index 729f5d1..a4a7490 100644
--- a/Doc/ext.tex
+++ b/Doc/ext.tex
@@ -1,5 +1,4 @@
-\documentclass[twoside,openright]{report}
-\usepackage{myformat}
+\documentclass{manual}
 
 % XXX PM Modulator
 
diff --git a/Doc/ext/ext.tex b/Doc/ext/ext.tex
index 729f5d1..a4a7490 100644
--- a/Doc/ext/ext.tex
+++ b/Doc/ext/ext.tex
@@ -1,5 +1,4 @@
-\documentclass[twoside,openright]{report}
-\usepackage{myformat}
+\documentclass{manual}
 
 % XXX PM Modulator
 
diff --git a/Doc/lib.tex b/Doc/lib.tex
index 5e129fb..76fddca 100644
--- a/Doc/lib.tex
+++ b/Doc/lib.tex
@@ -1,5 +1,4 @@
-\documentclass[twoside,openright]{report}
-\usepackage{myformat}
+\documentclass{manual}
 
 % NOTE: this file controls which chapters/sections of the library
 % manual are actually printed.  It is easy to customize your manual
diff --git a/Doc/lib/lib.tex b/Doc/lib/lib.tex
index 5e129fb..76fddca 100644
--- a/Doc/lib/lib.tex
+++ b/Doc/lib/lib.tex
@@ -1,5 +1,4 @@
-\documentclass[twoside,openright]{report}
-\usepackage{myformat}
+\documentclass{manual}
 
 % NOTE: this file controls which chapters/sections of the library
 % manual are actually printed.  It is easy to customize your manual
diff --git a/Doc/manual.cls b/Doc/manual.cls
new file mode 100644
index 0000000..bb7ba9a
--- /dev/null
+++ b/Doc/manual.cls
@@ -0,0 +1,39 @@
+%
+% manual.cls for the Python documentation
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{manual}
+             [1998/03/03 Python manual]
+
+% Change the options here to get a different set of basic options,  This
+% is where to add things like "a4paper" or "10pt".
+%
+\LoadClass[twoside,openright]{report}
+
+
+% Optional packages:
+%
+% If processing of these documents fails at your TeX installation,
+% these may be commented out (independently) to make things work.
+% These are both supplied with the current version of the teTeX
+% distribution.
+%
+% The "fancyhdr" package makes nicer page footers reasonable to
+% implement, and is used to put the chapter and section information in 
+% the footers.
+%
+% The "times" package makes the default font the PostScript Times
+% font, which makes for smaller PostScript and a font that more people 
+% like.
+%
+\RequirePackage{fancyhdr}\typeout{Using fancier footers than usual.}
+\RequirePackage{times}\typeout{Using times fonts instead of Computer Modern.}
+
+
+% Required package:
+%
+% This gives us all the Python-specific markup that we really want.
+% This should come last.  Do not change this.
+%
+\RequirePackage{python}
diff --git a/Doc/manual.perl b/Doc/manual.perl
new file mode 100644
index 0000000..edccba1
--- /dev/null
+++ b/Doc/manual.perl
@@ -0,0 +1,13 @@
+# -*- perl -*-
+#
+# This implements the Python manual class.  All it really needs to do it
+# load the "python" style.  The style code is not moved into the class code
+# at this time, since we expect additional document class to be developed
+# for the Python documentation in the future.  Appropriate relocations will
+# be made at that time.
+
+package main;
+
+require "python.perl";
+
+1;				# sheesh....
diff --git a/Doc/perl/manual.perl b/Doc/perl/manual.perl
new file mode 100644
index 0000000..edccba1
--- /dev/null
+++ b/Doc/perl/manual.perl
@@ -0,0 +1,13 @@
+# -*- perl -*-
+#
+# This implements the Python manual class.  All it really needs to do it
+# load the "python" style.  The style code is not moved into the class code
+# at this time, since we expect additional document class to be developed
+# for the Python documentation in the future.  Appropriate relocations will
+# be made at that time.
+
+package main;
+
+require "python.perl";
+
+1;				# sheesh....
diff --git a/Doc/perl/python.perl b/Doc/perl/python.perl
new file mode 100644
index 0000000..73c917e
--- /dev/null
+++ b/Doc/perl/python.perl
@@ -0,0 +1,710 @@
+# python.perl by Fred L. Drake, Jr. <fdrake@acm.org>		-*- perl -*-
+#
+# Heavily based on Guido van Rossum's myformat.perl (now obsolete).
+#
+# Extension to LaTeX2HTML for documents using myformat.sty.
+# Subroutines of the form do_cmd_<name> here define translations
+# for LaTeX commands \<name> defined in the corresponding .sty file.
+
+package main;
+
+
+# words typeset in a special way (not in HTML though)
+
+sub do_cmd_ABC{ 'ABC' . @_[0]; }
+sub do_cmd_UNIX{ 'Unix'. @_[0]; }
+sub do_cmd_ASCII{ 'ASCII' . @_[0]; }
+sub do_cmd_POSIX{ 'POSIX' . @_[0]; }
+sub do_cmd_C{ 'C' . @_[0]; }
+sub do_cmd_Cpp{ 'C++' . @_[0]; }
+sub do_cmd_EOF{ 'EOF' . @_[0]; }
+sub do_cmd_NULL{ '<tt>NULL</tt>' . @_[0]; }
+
+sub do_cmd_e{ '&#92;' . @_[0]; }
+
+$AUTHOR_ADDRESS = '';
+$PYTHON_VERSION = '';
+
+sub do_cmd_version{ $PYTHON_VERSION . @_[0]; }
+sub do_cmd_release{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx//;
+    $PYTHON_VERSION = "$2";
+    $_;
+}
+
+sub do_cmd_authoraddress{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx//;
+    $AUTHOR_ADDRESS = "$2";
+    $_;
+}
+
+sub do_cmd_hackscore{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/_/;
+    $_;
+}
+
+sub do_cmd_optional{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<\/var><big>\[<\/big><var>\2<\/var><big>\]<\/big><var>/;
+    $_;
+}
+
+sub do_cmd_varvars{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<var>\2<\/var>/;
+    $_;
+}
+
+# texinfo-like formatting commands: \code{...} etc.
+
+sub do_cmd_code{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<tt>\2<\/tt>/;
+    $_;
+}
+
+sub do_cmd_sectcode{ &do_cmd_code(@_); }
+sub do_cmd_module{ &do_cmd_code(@_); }
+sub do_cmd_keyword{ &do_cmd_code(@_); }
+sub do_cmd_exception{ &do_cmd_code(@_); }
+sub do_cmd_class{ &do_cmd_code(@_); }
+sub do_cmd_function{ &do_cmd_code(@_); }
+sub do_cmd_constant{ &do_cmd_code(@_); }
+sub do_cmd_member{ &do_cmd_code(@_); }
+sub do_cmd_method{ &do_cmd_code(@_); }
+sub do_cmd_email{ &do_cmd_code(@_); }
+sub do_cmd_program{ &do_cmd_code(@_); }
+sub do_cmd_cfunction{ &do_cmd_code(@_); }
+sub do_cmd_cdata{ &do_cmd_code(@_); }
+sub do_cmd_ctype{ &do_cmd_code(@_); }
+
+sub do_cmd_email{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<tt><font face=sans-serif>\2<\/font><\/tt>/;
+    $_;
+}
+
+sub do_cmd_url{
+    # use the URL as both text and hyperlink
+    local($_) = @_;
+    s/$any_next_pair_pr_rx//;
+    local($url) = $2;
+    $url =~ s/~/&#126;/g;
+    "<tt><font face=sans-serif><a href=\"$url\">$url</a></font></tt>" . $_;
+}
+
+sub do_cmd_manpage{
+    # two parameters:  \manpage{name}{section}
+    local($_) = @_;
+    local($any_next_pair_pr_rx3) = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+    s/$next_pair_pr_rx$any_next_pair_pr_rx3/<i>\2<\/i>(\4)/;
+    $_;
+}
+
+sub do_cmd_rfc{
+    local($_) = @_;
+    s/$next_pair_pr_rx//;
+    local($br_id,$rfcnumber) = ($1, $2);
+
+    # Save the reference
+    local($nstr) = &gen_index_id("RFC!RFC $rfcnumber", '');
+    $index{$nstr} .= &make_half_href("$CURRENT_FILE#$br_id");
+    "<a name=\"$br_id\">RFC $rfcnumber<\/a>" .$_;
+}
+
+sub do_cmd_kbd{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<kbd>\2<\/kbd>/;
+    $_;
+}
+
+sub do_cmd_key{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<tt>\2<\/tt>/;
+    $_;
+}
+
+sub do_cmd_var{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<i>\2<\/i>/;
+    $_;
+}
+
+sub do_cmd_dfn{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<i>\2<\/i>/;
+    $_;
+}
+
+sub do_cmd_emph{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<i>\2<\/i>/;
+    $_;
+}
+
+sub do_cmd_strong{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<b>\2<\/b>/;
+    $_;
+}
+
+sub do_cmd_deprecated{
+    # two parameters:  \deprecated{version}{whattodo}
+    local($_) = @_;
+    local($any_next_pair_pr_rx3) = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+    local($release,$action) = ($2, $4);
+    s/$next_pair_pr_rx$any_next_pair_pr_rx3//;
+    "<b>Deprecated since release $release.</b>"
+      . "\n$action<p>"
+      . $_;
+}
+
+# file and samp are at the end of this file since they screw up fontlock.
+
+# index commands
+
+$INDEX_SUBITEM = "";
+
+sub get_indexsubitem{
+  $INDEX_SUBITEM ? " $INDEX_SUBITEM" : '';
+}
+
+sub do_cmd_setindexsubitem{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx//;
+    $INDEX_SUBITEM = $2;
+    $_;
+}
+
+sub do_cmd_indexii{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id1, $str1) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id2, $str2) = ($1, $2);
+    join('', &make_index_entry($br_id1, "$str1 $str2"),
+	 &make_index_entry($br_id2, "$str2, $str1"), $_);
+}
+
+sub do_cmd_indexiii{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id1, $str1) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id2, $str2) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id3, $str3) = ($1, $2);
+    join('', &make_index_entry($br_id1, "$str1 $str2 $str3"),
+	 &make_index_entry($br_id2, "$str2 $str3, $str1"),
+	 &make_index_entry($br_id3, "$str3, $str1 $str2"),
+	 $_);
+}
+
+sub do_cmd_indexiv{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id1, $str1) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id2, $str2) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id3, $str3) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id4, $str4) = ($1, $2);
+    join('', &make_index_entry($br_id1, "$str1 $str2 $str3 $str4"),
+	 &make_index_entry($br_id2, "$str2 $str3 $str4, $str1"),
+	 &make_index_entry($br_id3, "$str3 $str4, $str1 $str2"),
+	 &make_index_entry($br_id4, "$str4, $str1 $str2 $str3"),
+	 $_);
+}
+
+sub do_cmd_ttindex{ &do_cmd_index(@_); }
+
+sub my_typed_index_helper{
+    local($word, $_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id, $str) = ($1, $2);
+    join('', &make_index_entry($br_id, "$str $word"),
+	 &make_index_entry($br_id, "$word, $str"), $_);
+}
+
+sub do_cmd_stindex{ &my_typed_index_helper('statement', @_); }
+sub do_cmd_opindex{ &my_typed_index_helper('operator', @_); }
+sub do_cmd_exindex{ &my_typed_index_helper('exception', @_); }
+sub do_cmd_obindex{ &my_typed_index_helper('object', @_); }
+
+sub my_parword_index_helper{
+    local($word, $_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id, $str) = ($1, $2);
+    &make_index_entry($br_id, "$str ($word)") . $_;
+}
+
+
+# Set this to true to strip out the <tt>...</tt> from index entries;
+# this is analogous to using the second definition of \idxcode{} from
+# myformat.sty.
+#
+# It is used from &make_mod_index_entry() and &make_str_index_entry().
+#
+$STRIP_INDEX_TT = 0;
+
+sub make_mod_index_entry{
+    local($br_id,$str,$define) = @_;
+    local($halfref) = &make_half_href("$CURRENT_FILE#$br_id");
+    # If TITLE is not yet available (i.e the \index command is in the title
+    # of the current section), use $ref_before.
+    $TITLE = $ref_before unless $TITLE;
+    # Save the reference
+    if ($define eq "DEF") {
+	local($nstr,$garbage) = split / /, $str, 2;
+	$Modules{$nstr} .= $halfref;
+    }
+    $str = &gen_index_id($str, $define);
+    if ($STRIP_INDEX_TT) {
+        $str =~ s/<tt>(.*)<\/tt>/\1/;
+    }
+    $index{$str} .= $halfref;
+    "<a name=\"$br_id\">$anchor_invisible_mark<\/a>";
+}
+
+sub my_module_index_helper{
+    local($word, $_) = @_;
+    s/$next_pair_pr_rx[\n]*//o;
+    local($br_id, $str) = ($1, $2);
+    local($section_tag) = join('', @curr_sec_id);
+    $word = "$word " if $word;
+    &make_mod_index_entry("SECTION$section_tag",
+			  "<tt>$str</tt> (${word}module)", 'DEF');
+    $_;
+}
+
+sub ref_module_index_helper{
+    local($word, $_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id, $str) = ($1, $2);
+    $word = "$word " if $word;
+    &make_mod_index_entry($br_id, "<tt>$str</tt> (${word}module)", 'REF') . $_;
+}
+
+sub do_cmd_bifuncindex{ &my_parword_index_helper('built-in function', @_); }
+sub do_cmd_modindex{ &my_module_index_helper('', @_); }
+sub do_cmd_bimodindex{ &my_module_index_helper('built-in', @_); }
+sub do_cmd_exmodindex{ &my_module_index_helper('extension', @_); }
+sub do_cmd_stmodindex{ &my_module_index_helper('standard', @_); }
+
+# these should be adjusted a bit....
+sub do_cmd_refmodindex{ &ref_module_index_helper('', @_); }
+sub do_cmd_refbimodindex{ &ref_module_index_helper('built-in', @_); }
+sub do_cmd_refexmodindex{ &ref_module_index_helper('extension', @_); }
+sub do_cmd_refstmodindex{ &ref_module_index_helper('standard', @_); }
+
+sub do_cmd_nodename{ &do_cmd_label(@_); }
+
+sub init_myformat{
+    # XXX need some way for this to be called after &initialise; ???
+    $anchor_mark = '';
+    $icons{'anchor_mark'} = '';
+    # <<2>>...<<2>>
+    $any_next_pair_rx3 = "$O(\\d+)$C([\\s\\S]*)$O\\3$C";
+    $any_next_pair_rx5 = "$O(\\d+)$C([\\s\\S]*)$O\\5$C";
+    $any_next_pair_rx7 = "$O(\\d+)$C([\\s\\S]*)$O\\7$C";
+    $any_next_pair_rx9 = "$O(\\d+)$C([\\s\\S]*)$O\\9$C";
+    # <#2#>...<#2#>
+    $any_next_pair_pr_rx_3 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+    $any_next_pair_pr_rx_5 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\5$CP";
+    $any_next_pair_pr_rx_7 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\7$CP";
+    $any_next_pair_pr_rx_9 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\9$CP";
+    if (defined &process_commands_wrap_deferred) {
+	&process_commands_wrap_deferred(<<THESE_COMMANDS);
+indexii # {} # {}
+indexiii # {} # {} # {}
+indexiv # {} # {} # {} # {}
+exindex # {}
+obindex # {}
+opindex # {}
+stindex # {}
+ttindex # {}
+bifuncindex # {}
+modindex # {}
+bimodindex # {}
+exmodindex # {}
+stmodindex # {}
+refmodindex # {}
+refbimodindex # {}
+refexmodindex # {}
+refstmodindex # {}
+rfc # {}
+THESE_COMMANDS
+    }
+}
+
+&init_myformat;
+
+# similar to make_index_entry(), but includes the string in the result
+# instead of the dummy filler.
+#
+sub make_str_index_entry{
+    local($br_id,$str) = @_;
+    # If TITLE is not yet available (i.e the \index command is in the title
+    # of the current section), use $ref_before.
+    $TITLE = $ref_before unless $TITLE;
+    # Save the reference
+    local($nstr) = &gen_index_id($str, '');
+    if ($STRIP_INDEX_TT) {
+        $nstr =~ s/<tt>(.*)<\/tt>/\1/;
+    }
+    $index{$nstr} .= &make_half_href("$CURRENT_FILE#$br_id");
+    "<a name=\"$br_id\">$str<\/a>";
+}
+
+# Changed from the stock version to indent {verbatim} sections,
+# and make them smaller, to better match the LaTeX version:
+
+# (Used with LaTeX2HTML 96.1*)
+sub replace_verbatim {
+    # Modifies $_
+    local($prefix,$suffix) = ("\n<p><dl><dd><pre><font size=-1>\n",
+			      "</font></pre></dl>");
+    s/$verbatim_mark(verbatim)(\d+)/$prefix$verbatim{$2}$suffix/go;
+    s/$verbatim_mark(rawhtml)(\d+)/$verbatim{$2}/ego;	# Raw HTML
+}
+
+# (Used with LaTeX2HTML 98.1)
+sub replace_verbatim_hook{
+    # Modifies $_
+    local($prefix,$suffix) = ("\n<p><dl><dd><font size=-1>",
+			      "</font></dl>");
+    s/$math_verbatim_rx/&put_comment("MATH: ".$verbatim{$1})/eg;
+    s/$verbatim_mark(\w*[vV]erbatim\*?)(\d+)\#/$prefix$verbatim{$2}$suffix/go;
+    # Raw HTML, but replacements may have protected characters
+    s/$verbatim_mark(rawhtml)(\d+)#/&unprotect_raw_html($verbatim{$2})/eg;
+    s/$verbatim_mark$keepcomments(\d+)#/$verbatim{$2}/ego; # Raw TeX
+    s/$unfinished_mark$keepcomments(\d+)#/$verbatim{$2}/ego; # Raw TeX
+}
+
+sub do_env_cfuncdesc{
+    local($_) = @_;
+    local($return_type,$function_name,$arg_list,$idx) = ('', '', '', '');
+    local($cfuncdesc_rx) =
+      "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5";
+    if (/$cfuncdesc_rx/o) {
+	$return_type = "$2";
+	$function_name = "$4";
+	$arg_list = "$6";
+	$idx = &make_str_index_entry($3,
+			"<tt>$function_name</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt>$return_type <b>$idx</b>"
+      . "(<var>$arg_list</var>)\n<dd>$'\n</dl>"
+}
+
+sub do_env_ctypedesc{
+    local($_) = @_;
+    local($type_name) = ('');
+    local($cfuncdesc_rx) = "$next_pair_rx";
+    if (/$cfuncdesc_rx/o) {
+	$type_name = "$2";
+	$idx = &make_str_index_entry($1,
+			"<tt>$type_name</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt><b>$idx</b>\n<dd>$'\n</dl>"
+}
+
+sub do_env_cvardesc{
+    local($_) = @_;
+    local($var_type,$var_name,$idx) = ('', '', '');
+    local($cfuncdesc_rx) = "$next_pair_rx$any_next_pair_rx3";
+    if (/$cfuncdesc_rx/o) {
+	$var_type = "$2";
+	$var_name = "$4";
+	$idx = &make_str_index_entry($3,
+			"<tt>$var_name</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt>$var_type <b>$idx</b>\n"
+      . "<dd>$'\n</dl>";
+}
+
+sub do_env_funcdesc{
+    local($_) = @_;
+    local($function_name,$arg_list,$idx) = ('', '', '');
+    local($funcdesc_rx) = "$next_pair_rx$any_next_pair_rx3";
+    if (/$funcdesc_rx/o) {
+	$function_name = "$2";
+	$arg_list = "$4";
+	$idx = &make_str_index_entry($3,
+			"<tt>$function_name</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>$'\n</dl>";
+}
+
+sub do_env_funcdescni{
+    local($_) = @_;
+    local($function_name,$arg_list,$idx) = ('', '', '');
+    local($funcdesc_rx) = "$next_pair_rx$any_next_pair_rx3";
+    if (/$funcdesc_rx/o) {
+	$function_name = "$2";
+	$arg_list = "$4";
+	if ($STRIP_INDEX_TT) {
+	    $idx = $function_name; }
+	else {
+	    $idx = "<tt>$function_name</tt>"; }
+    }
+    "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>$'\n</dl>";
+}
+
+sub do_cmd_funcline{
+    local($_) = @_;
+    local($funcdesc_rx) = "$next_pair_pr_rx$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+
+    s/$funcdesc_rx//o;
+    local($br_id, $function_name, $arg_list) = ($3, $2, $4);
+    local($idx) = &make_str_index_entry($br_id, "<tt>$function_name</tt>");
+
+    "<dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>" . $_;
+}
+
+# Change this flag to index the opcode entries.  I don't think it's very
+# useful to index them, since they're only presented to describe the dis
+# module.
+#
+$INDEX_OPCODES = 0;
+
+sub do_env_opcodedesc{
+    local($_) = @_;
+    local($opcode_name,$arg_list,$stuff,$idx) = ('', '', '', '');
+    local($opcodedesc_rx) = "$next_pair_rx$any_next_pair_rx3";
+    if (/$opcodedesc_rx/o) {
+	$opcode_name = "$2";
+	$arg_list = "$4";
+	if ($INDEX_OPCODES) {
+	    $idx = &make_str_index_entry($3,
+			"<tt>$opcode_name</tt> (byte code instruction)");
+	    $idx =~ s/ \(byte code instruction\)//;
+	}
+	else {
+	    $idx = "<tt>$opcode_name</tt>";
+	}
+      }
+    $stuff = "<dl><dt><b>$idx</b>";
+    if ($arg_list) {
+	$stuff .= "&nbsp;&nbsp;&nbsp;&nbsp;<var>$arg_list</var>";
+    }
+    $stuff . "\n<dd>$'\n</dl>";
+}
+
+sub do_env_datadesc{
+    local($_) = @_;
+    local($idx) = '';
+    if (/$next_pair_rx/o) {
+	$idx = &make_str_index_entry($1, "<tt>$2</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt><b>$idx</b>\n<dd>$'\n</dl>"
+}
+
+sub do_env_datadescni{
+    local($_) = @_;
+    local($idx) = '';
+    if (/$next_pair_rx/o) {
+	if ($STRING_INDEX_TT) {
+	    $idx = "$2"; }
+	else {
+	    $idx = "<tt>$2</tt>"; }
+    }
+    "<dl><dt><b>$idx</b>\n<dd>$'\n</dl>"
+}
+
+sub do_cmd_dataline{
+    local($_) = @_;
+
+    s/$next_pair_pr_rx//o;
+    local($br_id, $data_name) = ($1, $2);
+    local($idx) = &make_str_index_entry($br_id, "<tt>$data_name</tt>"
+				       . &get_indexsubitem);
+    $idx =~ s/ \(.*\)//;
+
+    "<dt><b>$idx</b>\n<dd>" . $_;
+}
+
+sub do_env_excdesc{ &do_env_datadesc(@_); }
+sub do_env_classdesc{ &do_env_funcdesc(@_); }
+sub do_env_fulllineitems{ &do_env_itemize(@_); }
+
+
+@col_aligns = ("<td>", "<td>", "<td>");
+
+sub setup_column_alignments{
+    local($_) = @_;
+    local($j1,$a1,$a2,$a3,$j4) = split(/[|]/,$_);
+    local($th1,$th2,$th3) = ('<th>', '<th>', '<th>');
+    $col_aligns[0] = (($a1 eq "c") ? "<td align=center>" : "<td>");
+    $col_aligns[1] = (($a2 eq "c") ? "<td align=center>" : "<td>");
+    $col_aligns[2] = (($a3 eq "c") ? "<td align=center>" : "<td>");
+    # return the aligned header start tags; only used for \begin{tableiii?}
+    $th1 = (($a1 eq "l") ? "<th align=left>"
+	    : ($a1 eq "r" ? "<th align=right>" : "<th>"));
+    $th2 = (($a2 eq "l") ? "<th align=left>"
+	    : ($a2 eq "r" ? "<th align=right>" : "<th>"));
+    $th3 = (($a3 eq "l") ? "<th align=left>"
+	    : ($a3 eq "r" ? "<th align=right>" : "<th>"));
+    ($th1, $th2, $th3);
+}
+
+sub do_env_tableii{
+    local($_) = @_;
+    local($font,$h1,$h2) = ('', '', '');
+    local($tableiii_rx) =
+      "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5$any_next_pair_rx7";
+    if (/$tableiii_rx/o) {
+	$font = $4;
+	$h1 = $6;
+	$h2 = $8;
+    }
+    local($th1,$th2,$th3) = &setup_column_alignments($2);
+    $globals{"lineifont"} = $font;
+    "<table border align=center>"
+      . "\n  <tr>$th1<b>$h1</b></th>"
+      . "\n      $th2<b>$h2</b></th>$'"
+      . "\n</table>";
+}
+
+sub do_cmd_lineii{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($c1) = $2;
+    s/$next_pair_pr_rx//o;
+    local($c2) = $2;
+    local($font) = $globals{"lineifont"};
+    local($c1align, $c2align) = @col_aligns[0,1];
+    "<tr>$c1align<$font>$c1</$font></td>\n"
+      . "      $c2align$c2</td>$'";
+}
+
+sub do_env_tableiii{
+    local($_) = @_;
+    local($font,$h1,$h2,$h3) = ('', '', '', '');
+  
+    local($tableiii_rx) =
+      "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5$any_next_pair_rx7"
+	. "$any_next_pair_rx9";
+    if (/$tableiii_rx/o) {
+	$font = $4;
+	$h1 = $6;
+	$h2 = $8;
+	$h3 = $10;
+    }
+    local($th1,$th2,$th3) = &setup_column_alignments($2);
+    $globals{"lineifont"} = $font;
+    "<table border align=center>"
+      . "\n  <tr>$th1<b>$h1</b></th>"
+      . "\n      $th2<b>$h2</b></th>"
+      . "\n      $th3<b>$h3</b></th>$'"
+      . "\n</table>";
+}
+
+sub do_cmd_lineiii{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($c1) = $2;
+    s/$next_pair_pr_rx//o;
+    local($c2) = $2;
+    s/$next_pair_pr_rx//o;
+    local($c3) = $2;
+    local($font) = $globals{"lineifont"};
+    local($c1align, $c2align, $c3align) = @col_aligns;
+    "<tr>$c1align<$font>$c1</$font></td>\n"
+      . "      $c2align$c2</td>\n"
+      . "      $c3align$c3</td>$'";
+}
+
+sub do_env_seealso{
+    "<p><b>See Also:</b></p>\n" . @_[0];
+}
+
+sub do_cmd_seemodule{
+    # Insert the right magic to jump to the module definition.  This should
+    # work most of the time, at least for repeat builds....
+    local($_) = @_;
+    local($any_next_pair_pr_rx3) = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+    s/$next_pair_pr_rx$any_next_pair_pr_rx3//;
+    local($module,$text,$node,$key) = ($2, $4, '', "module$2");
+    $key =~ s/_//g;
+    # XXX somewhat bogus computation of $node
+#    $node = $external_labels{$key} unless
+#      ($node = $ref_files{$key});
+    $node = $key;
+    "<p>Module <tt><b><a href=\"$node#$key\">$module</a></b></tt>"
+      . "&nbsp;&nbsp;&nbsp;($text)</p>"
+      . $_;
+}
+
+sub do_cmd_seetext{
+    "<p>" . @_[0];
+}
+
+
+sub do_cmd_maketitle {
+    local($_) = @_;
+    local($the_title) = '';
+    if ($t_title) {
+	$the_title .= "<h1 align=\"center\">$t_title</h1>";
+    } else { &write_warnings("\nThis document has no title."); }
+    if ($t_author) {
+	if ($t_authorURL) {
+	    local($href) = &translate_commands($t_authorURL);
+	    $href = &make_named_href('author', $href, "<strong>${t_author}</strong>");
+	    $the_title .= "\n<p align=\"center\">$href</p>";
+	} else {
+	    $the_title .= "\n<p align=\"center\"><strong>$t_author</strong></p>";
+	}
+    } else { &write_warnings("\nThere is no author for this document."); }
+    if ($t_institute) {
+        $the_title .= "\n<p align=\"center\"><small>$t_institute</small></p>";}
+    if ($AUTHOR_ADDRESS) {
+        $the_title .= "\n<p align=\"center\"><small>$AUTHOR_ADDRESS";
+	$the_title .= "</small></p>";}
+    if ($t_affil) {
+	$the_title .= "\n<p align=\"center\"><i>$t_affil</i></p>";}
+    if ($t_date) {
+	$the_title .= "\n<p align=\"center\"><strong>$t_date</strong>";
+	if ($PYTHON_VERSION) {
+	    $the_title .= "<br><strong>Release $PYTHON_VERSION</strong>";}
+	$the_title .= "</p>"
+    }
+    if ($t_address) {
+	$the_title .= "<br>\n<p align=\"left\"><small>$t_address</small></p>";
+    } else { $the_title .= "\n<p align=\"left\">"}
+    if ($t_email) {
+	$the_title .= "\n<p align=\"left\"><small>$t_email</small></p>";
+    } else { $the_title .= "</p>" }
+    $the_title . "<p><hr>\n" . $_ ;
+}
+
+
+# These are located down here since they screw up fontlock.
+
+sub do_cmd_file{
+    # This uses a weird HTML construct to adjust the font to be
+    # reasonable match that used in the printed form as much as
+    # possible.  The expected behavior is that a browser that doesn't
+    # understand "<font face=...>" markup will use courier (or whatever
+    # the font is for <tt>).
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/`<tt><font face=sans-serif>\2<\/font><\/tt>'/;
+    $_;
+}
+
+sub do_cmd_samp{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/`<tt>\2<\/tt>'/;
+    $_;
+}
+
+1;				# This must be the last line
diff --git a/Doc/python.perl b/Doc/python.perl
new file mode 100644
index 0000000..73c917e
--- /dev/null
+++ b/Doc/python.perl
@@ -0,0 +1,710 @@
+# python.perl by Fred L. Drake, Jr. <fdrake@acm.org>		-*- perl -*-
+#
+# Heavily based on Guido van Rossum's myformat.perl (now obsolete).
+#
+# Extension to LaTeX2HTML for documents using myformat.sty.
+# Subroutines of the form do_cmd_<name> here define translations
+# for LaTeX commands \<name> defined in the corresponding .sty file.
+
+package main;
+
+
+# words typeset in a special way (not in HTML though)
+
+sub do_cmd_ABC{ 'ABC' . @_[0]; }
+sub do_cmd_UNIX{ 'Unix'. @_[0]; }
+sub do_cmd_ASCII{ 'ASCII' . @_[0]; }
+sub do_cmd_POSIX{ 'POSIX' . @_[0]; }
+sub do_cmd_C{ 'C' . @_[0]; }
+sub do_cmd_Cpp{ 'C++' . @_[0]; }
+sub do_cmd_EOF{ 'EOF' . @_[0]; }
+sub do_cmd_NULL{ '<tt>NULL</tt>' . @_[0]; }
+
+sub do_cmd_e{ '&#92;' . @_[0]; }
+
+$AUTHOR_ADDRESS = '';
+$PYTHON_VERSION = '';
+
+sub do_cmd_version{ $PYTHON_VERSION . @_[0]; }
+sub do_cmd_release{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx//;
+    $PYTHON_VERSION = "$2";
+    $_;
+}
+
+sub do_cmd_authoraddress{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx//;
+    $AUTHOR_ADDRESS = "$2";
+    $_;
+}
+
+sub do_cmd_hackscore{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/_/;
+    $_;
+}
+
+sub do_cmd_optional{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<\/var><big>\[<\/big><var>\2<\/var><big>\]<\/big><var>/;
+    $_;
+}
+
+sub do_cmd_varvars{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<var>\2<\/var>/;
+    $_;
+}
+
+# texinfo-like formatting commands: \code{...} etc.
+
+sub do_cmd_code{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<tt>\2<\/tt>/;
+    $_;
+}
+
+sub do_cmd_sectcode{ &do_cmd_code(@_); }
+sub do_cmd_module{ &do_cmd_code(@_); }
+sub do_cmd_keyword{ &do_cmd_code(@_); }
+sub do_cmd_exception{ &do_cmd_code(@_); }
+sub do_cmd_class{ &do_cmd_code(@_); }
+sub do_cmd_function{ &do_cmd_code(@_); }
+sub do_cmd_constant{ &do_cmd_code(@_); }
+sub do_cmd_member{ &do_cmd_code(@_); }
+sub do_cmd_method{ &do_cmd_code(@_); }
+sub do_cmd_email{ &do_cmd_code(@_); }
+sub do_cmd_program{ &do_cmd_code(@_); }
+sub do_cmd_cfunction{ &do_cmd_code(@_); }
+sub do_cmd_cdata{ &do_cmd_code(@_); }
+sub do_cmd_ctype{ &do_cmd_code(@_); }
+
+sub do_cmd_email{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<tt><font face=sans-serif>\2<\/font><\/tt>/;
+    $_;
+}
+
+sub do_cmd_url{
+    # use the URL as both text and hyperlink
+    local($_) = @_;
+    s/$any_next_pair_pr_rx//;
+    local($url) = $2;
+    $url =~ s/~/&#126;/g;
+    "<tt><font face=sans-serif><a href=\"$url\">$url</a></font></tt>" . $_;
+}
+
+sub do_cmd_manpage{
+    # two parameters:  \manpage{name}{section}
+    local($_) = @_;
+    local($any_next_pair_pr_rx3) = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+    s/$next_pair_pr_rx$any_next_pair_pr_rx3/<i>\2<\/i>(\4)/;
+    $_;
+}
+
+sub do_cmd_rfc{
+    local($_) = @_;
+    s/$next_pair_pr_rx//;
+    local($br_id,$rfcnumber) = ($1, $2);
+
+    # Save the reference
+    local($nstr) = &gen_index_id("RFC!RFC $rfcnumber", '');
+    $index{$nstr} .= &make_half_href("$CURRENT_FILE#$br_id");
+    "<a name=\"$br_id\">RFC $rfcnumber<\/a>" .$_;
+}
+
+sub do_cmd_kbd{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<kbd>\2<\/kbd>/;
+    $_;
+}
+
+sub do_cmd_key{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<tt>\2<\/tt>/;
+    $_;
+}
+
+sub do_cmd_var{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<i>\2<\/i>/;
+    $_;
+}
+
+sub do_cmd_dfn{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<i>\2<\/i>/;
+    $_;
+}
+
+sub do_cmd_emph{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<i>\2<\/i>/;
+    $_;
+}
+
+sub do_cmd_strong{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/<b>\2<\/b>/;
+    $_;
+}
+
+sub do_cmd_deprecated{
+    # two parameters:  \deprecated{version}{whattodo}
+    local($_) = @_;
+    local($any_next_pair_pr_rx3) = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+    local($release,$action) = ($2, $4);
+    s/$next_pair_pr_rx$any_next_pair_pr_rx3//;
+    "<b>Deprecated since release $release.</b>"
+      . "\n$action<p>"
+      . $_;
+}
+
+# file and samp are at the end of this file since they screw up fontlock.
+
+# index commands
+
+$INDEX_SUBITEM = "";
+
+sub get_indexsubitem{
+  $INDEX_SUBITEM ? " $INDEX_SUBITEM" : '';
+}
+
+sub do_cmd_setindexsubitem{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx//;
+    $INDEX_SUBITEM = $2;
+    $_;
+}
+
+sub do_cmd_indexii{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id1, $str1) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id2, $str2) = ($1, $2);
+    join('', &make_index_entry($br_id1, "$str1 $str2"),
+	 &make_index_entry($br_id2, "$str2, $str1"), $_);
+}
+
+sub do_cmd_indexiii{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id1, $str1) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id2, $str2) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id3, $str3) = ($1, $2);
+    join('', &make_index_entry($br_id1, "$str1 $str2 $str3"),
+	 &make_index_entry($br_id2, "$str2 $str3, $str1"),
+	 &make_index_entry($br_id3, "$str3, $str1 $str2"),
+	 $_);
+}
+
+sub do_cmd_indexiv{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id1, $str1) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id2, $str2) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id3, $str3) = ($1, $2);
+    s/$next_pair_pr_rx//o;
+    local($br_id4, $str4) = ($1, $2);
+    join('', &make_index_entry($br_id1, "$str1 $str2 $str3 $str4"),
+	 &make_index_entry($br_id2, "$str2 $str3 $str4, $str1"),
+	 &make_index_entry($br_id3, "$str3 $str4, $str1 $str2"),
+	 &make_index_entry($br_id4, "$str4, $str1 $str2 $str3"),
+	 $_);
+}
+
+sub do_cmd_ttindex{ &do_cmd_index(@_); }
+
+sub my_typed_index_helper{
+    local($word, $_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id, $str) = ($1, $2);
+    join('', &make_index_entry($br_id, "$str $word"),
+	 &make_index_entry($br_id, "$word, $str"), $_);
+}
+
+sub do_cmd_stindex{ &my_typed_index_helper('statement', @_); }
+sub do_cmd_opindex{ &my_typed_index_helper('operator', @_); }
+sub do_cmd_exindex{ &my_typed_index_helper('exception', @_); }
+sub do_cmd_obindex{ &my_typed_index_helper('object', @_); }
+
+sub my_parword_index_helper{
+    local($word, $_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id, $str) = ($1, $2);
+    &make_index_entry($br_id, "$str ($word)") . $_;
+}
+
+
+# Set this to true to strip out the <tt>...</tt> from index entries;
+# this is analogous to using the second definition of \idxcode{} from
+# myformat.sty.
+#
+# It is used from &make_mod_index_entry() and &make_str_index_entry().
+#
+$STRIP_INDEX_TT = 0;
+
+sub make_mod_index_entry{
+    local($br_id,$str,$define) = @_;
+    local($halfref) = &make_half_href("$CURRENT_FILE#$br_id");
+    # If TITLE is not yet available (i.e the \index command is in the title
+    # of the current section), use $ref_before.
+    $TITLE = $ref_before unless $TITLE;
+    # Save the reference
+    if ($define eq "DEF") {
+	local($nstr,$garbage) = split / /, $str, 2;
+	$Modules{$nstr} .= $halfref;
+    }
+    $str = &gen_index_id($str, $define);
+    if ($STRIP_INDEX_TT) {
+        $str =~ s/<tt>(.*)<\/tt>/\1/;
+    }
+    $index{$str} .= $halfref;
+    "<a name=\"$br_id\">$anchor_invisible_mark<\/a>";
+}
+
+sub my_module_index_helper{
+    local($word, $_) = @_;
+    s/$next_pair_pr_rx[\n]*//o;
+    local($br_id, $str) = ($1, $2);
+    local($section_tag) = join('', @curr_sec_id);
+    $word = "$word " if $word;
+    &make_mod_index_entry("SECTION$section_tag",
+			  "<tt>$str</tt> (${word}module)", 'DEF');
+    $_;
+}
+
+sub ref_module_index_helper{
+    local($word, $_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($br_id, $str) = ($1, $2);
+    $word = "$word " if $word;
+    &make_mod_index_entry($br_id, "<tt>$str</tt> (${word}module)", 'REF') . $_;
+}
+
+sub do_cmd_bifuncindex{ &my_parword_index_helper('built-in function', @_); }
+sub do_cmd_modindex{ &my_module_index_helper('', @_); }
+sub do_cmd_bimodindex{ &my_module_index_helper('built-in', @_); }
+sub do_cmd_exmodindex{ &my_module_index_helper('extension', @_); }
+sub do_cmd_stmodindex{ &my_module_index_helper('standard', @_); }
+
+# these should be adjusted a bit....
+sub do_cmd_refmodindex{ &ref_module_index_helper('', @_); }
+sub do_cmd_refbimodindex{ &ref_module_index_helper('built-in', @_); }
+sub do_cmd_refexmodindex{ &ref_module_index_helper('extension', @_); }
+sub do_cmd_refstmodindex{ &ref_module_index_helper('standard', @_); }
+
+sub do_cmd_nodename{ &do_cmd_label(@_); }
+
+sub init_myformat{
+    # XXX need some way for this to be called after &initialise; ???
+    $anchor_mark = '';
+    $icons{'anchor_mark'} = '';
+    # <<2>>...<<2>>
+    $any_next_pair_rx3 = "$O(\\d+)$C([\\s\\S]*)$O\\3$C";
+    $any_next_pair_rx5 = "$O(\\d+)$C([\\s\\S]*)$O\\5$C";
+    $any_next_pair_rx7 = "$O(\\d+)$C([\\s\\S]*)$O\\7$C";
+    $any_next_pair_rx9 = "$O(\\d+)$C([\\s\\S]*)$O\\9$C";
+    # <#2#>...<#2#>
+    $any_next_pair_pr_rx_3 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+    $any_next_pair_pr_rx_5 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\5$CP";
+    $any_next_pair_pr_rx_7 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\7$CP";
+    $any_next_pair_pr_rx_9 = "$OP(\\d+)$CP([\\s\\S]*)$OP\\9$CP";
+    if (defined &process_commands_wrap_deferred) {
+	&process_commands_wrap_deferred(<<THESE_COMMANDS);
+indexii # {} # {}
+indexiii # {} # {} # {}
+indexiv # {} # {} # {} # {}
+exindex # {}
+obindex # {}
+opindex # {}
+stindex # {}
+ttindex # {}
+bifuncindex # {}
+modindex # {}
+bimodindex # {}
+exmodindex # {}
+stmodindex # {}
+refmodindex # {}
+refbimodindex # {}
+refexmodindex # {}
+refstmodindex # {}
+rfc # {}
+THESE_COMMANDS
+    }
+}
+
+&init_myformat;
+
+# similar to make_index_entry(), but includes the string in the result
+# instead of the dummy filler.
+#
+sub make_str_index_entry{
+    local($br_id,$str) = @_;
+    # If TITLE is not yet available (i.e the \index command is in the title
+    # of the current section), use $ref_before.
+    $TITLE = $ref_before unless $TITLE;
+    # Save the reference
+    local($nstr) = &gen_index_id($str, '');
+    if ($STRIP_INDEX_TT) {
+        $nstr =~ s/<tt>(.*)<\/tt>/\1/;
+    }
+    $index{$nstr} .= &make_half_href("$CURRENT_FILE#$br_id");
+    "<a name=\"$br_id\">$str<\/a>";
+}
+
+# Changed from the stock version to indent {verbatim} sections,
+# and make them smaller, to better match the LaTeX version:
+
+# (Used with LaTeX2HTML 96.1*)
+sub replace_verbatim {
+    # Modifies $_
+    local($prefix,$suffix) = ("\n<p><dl><dd><pre><font size=-1>\n",
+			      "</font></pre></dl>");
+    s/$verbatim_mark(verbatim)(\d+)/$prefix$verbatim{$2}$suffix/go;
+    s/$verbatim_mark(rawhtml)(\d+)/$verbatim{$2}/ego;	# Raw HTML
+}
+
+# (Used with LaTeX2HTML 98.1)
+sub replace_verbatim_hook{
+    # Modifies $_
+    local($prefix,$suffix) = ("\n<p><dl><dd><font size=-1>",
+			      "</font></dl>");
+    s/$math_verbatim_rx/&put_comment("MATH: ".$verbatim{$1})/eg;
+    s/$verbatim_mark(\w*[vV]erbatim\*?)(\d+)\#/$prefix$verbatim{$2}$suffix/go;
+    # Raw HTML, but replacements may have protected characters
+    s/$verbatim_mark(rawhtml)(\d+)#/&unprotect_raw_html($verbatim{$2})/eg;
+    s/$verbatim_mark$keepcomments(\d+)#/$verbatim{$2}/ego; # Raw TeX
+    s/$unfinished_mark$keepcomments(\d+)#/$verbatim{$2}/ego; # Raw TeX
+}
+
+sub do_env_cfuncdesc{
+    local($_) = @_;
+    local($return_type,$function_name,$arg_list,$idx) = ('', '', '', '');
+    local($cfuncdesc_rx) =
+      "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5";
+    if (/$cfuncdesc_rx/o) {
+	$return_type = "$2";
+	$function_name = "$4";
+	$arg_list = "$6";
+	$idx = &make_str_index_entry($3,
+			"<tt>$function_name</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt>$return_type <b>$idx</b>"
+      . "(<var>$arg_list</var>)\n<dd>$'\n</dl>"
+}
+
+sub do_env_ctypedesc{
+    local($_) = @_;
+    local($type_name) = ('');
+    local($cfuncdesc_rx) = "$next_pair_rx";
+    if (/$cfuncdesc_rx/o) {
+	$type_name = "$2";
+	$idx = &make_str_index_entry($1,
+			"<tt>$type_name</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt><b>$idx</b>\n<dd>$'\n</dl>"
+}
+
+sub do_env_cvardesc{
+    local($_) = @_;
+    local($var_type,$var_name,$idx) = ('', '', '');
+    local($cfuncdesc_rx) = "$next_pair_rx$any_next_pair_rx3";
+    if (/$cfuncdesc_rx/o) {
+	$var_type = "$2";
+	$var_name = "$4";
+	$idx = &make_str_index_entry($3,
+			"<tt>$var_name</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt>$var_type <b>$idx</b>\n"
+      . "<dd>$'\n</dl>";
+}
+
+sub do_env_funcdesc{
+    local($_) = @_;
+    local($function_name,$arg_list,$idx) = ('', '', '');
+    local($funcdesc_rx) = "$next_pair_rx$any_next_pair_rx3";
+    if (/$funcdesc_rx/o) {
+	$function_name = "$2";
+	$arg_list = "$4";
+	$idx = &make_str_index_entry($3,
+			"<tt>$function_name</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>$'\n</dl>";
+}
+
+sub do_env_funcdescni{
+    local($_) = @_;
+    local($function_name,$arg_list,$idx) = ('', '', '');
+    local($funcdesc_rx) = "$next_pair_rx$any_next_pair_rx3";
+    if (/$funcdesc_rx/o) {
+	$function_name = "$2";
+	$arg_list = "$4";
+	if ($STRIP_INDEX_TT) {
+	    $idx = $function_name; }
+	else {
+	    $idx = "<tt>$function_name</tt>"; }
+    }
+    "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>$'\n</dl>";
+}
+
+sub do_cmd_funcline{
+    local($_) = @_;
+    local($funcdesc_rx) = "$next_pair_pr_rx$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+
+    s/$funcdesc_rx//o;
+    local($br_id, $function_name, $arg_list) = ($3, $2, $4);
+    local($idx) = &make_str_index_entry($br_id, "<tt>$function_name</tt>");
+
+    "<dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>" . $_;
+}
+
+# Change this flag to index the opcode entries.  I don't think it's very
+# useful to index them, since they're only presented to describe the dis
+# module.
+#
+$INDEX_OPCODES = 0;
+
+sub do_env_opcodedesc{
+    local($_) = @_;
+    local($opcode_name,$arg_list,$stuff,$idx) = ('', '', '', '');
+    local($opcodedesc_rx) = "$next_pair_rx$any_next_pair_rx3";
+    if (/$opcodedesc_rx/o) {
+	$opcode_name = "$2";
+	$arg_list = "$4";
+	if ($INDEX_OPCODES) {
+	    $idx = &make_str_index_entry($3,
+			"<tt>$opcode_name</tt> (byte code instruction)");
+	    $idx =~ s/ \(byte code instruction\)//;
+	}
+	else {
+	    $idx = "<tt>$opcode_name</tt>";
+	}
+      }
+    $stuff = "<dl><dt><b>$idx</b>";
+    if ($arg_list) {
+	$stuff .= "&nbsp;&nbsp;&nbsp;&nbsp;<var>$arg_list</var>";
+    }
+    $stuff . "\n<dd>$'\n</dl>";
+}
+
+sub do_env_datadesc{
+    local($_) = @_;
+    local($idx) = '';
+    if (/$next_pair_rx/o) {
+	$idx = &make_str_index_entry($1, "<tt>$2</tt>" . &get_indexsubitem);
+	$idx =~ s/ \(.*\)//;
+    }
+    "<dl><dt><b>$idx</b>\n<dd>$'\n</dl>"
+}
+
+sub do_env_datadescni{
+    local($_) = @_;
+    local($idx) = '';
+    if (/$next_pair_rx/o) {
+	if ($STRING_INDEX_TT) {
+	    $idx = "$2"; }
+	else {
+	    $idx = "<tt>$2</tt>"; }
+    }
+    "<dl><dt><b>$idx</b>\n<dd>$'\n</dl>"
+}
+
+sub do_cmd_dataline{
+    local($_) = @_;
+
+    s/$next_pair_pr_rx//o;
+    local($br_id, $data_name) = ($1, $2);
+    local($idx) = &make_str_index_entry($br_id, "<tt>$data_name</tt>"
+				       . &get_indexsubitem);
+    $idx =~ s/ \(.*\)//;
+
+    "<dt><b>$idx</b>\n<dd>" . $_;
+}
+
+sub do_env_excdesc{ &do_env_datadesc(@_); }
+sub do_env_classdesc{ &do_env_funcdesc(@_); }
+sub do_env_fulllineitems{ &do_env_itemize(@_); }
+
+
+@col_aligns = ("<td>", "<td>", "<td>");
+
+sub setup_column_alignments{
+    local($_) = @_;
+    local($j1,$a1,$a2,$a3,$j4) = split(/[|]/,$_);
+    local($th1,$th2,$th3) = ('<th>', '<th>', '<th>');
+    $col_aligns[0] = (($a1 eq "c") ? "<td align=center>" : "<td>");
+    $col_aligns[1] = (($a2 eq "c") ? "<td align=center>" : "<td>");
+    $col_aligns[2] = (($a3 eq "c") ? "<td align=center>" : "<td>");
+    # return the aligned header start tags; only used for \begin{tableiii?}
+    $th1 = (($a1 eq "l") ? "<th align=left>"
+	    : ($a1 eq "r" ? "<th align=right>" : "<th>"));
+    $th2 = (($a2 eq "l") ? "<th align=left>"
+	    : ($a2 eq "r" ? "<th align=right>" : "<th>"));
+    $th3 = (($a3 eq "l") ? "<th align=left>"
+	    : ($a3 eq "r" ? "<th align=right>" : "<th>"));
+    ($th1, $th2, $th3);
+}
+
+sub do_env_tableii{
+    local($_) = @_;
+    local($font,$h1,$h2) = ('', '', '');
+    local($tableiii_rx) =
+      "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5$any_next_pair_rx7";
+    if (/$tableiii_rx/o) {
+	$font = $4;
+	$h1 = $6;
+	$h2 = $8;
+    }
+    local($th1,$th2,$th3) = &setup_column_alignments($2);
+    $globals{"lineifont"} = $font;
+    "<table border align=center>"
+      . "\n  <tr>$th1<b>$h1</b></th>"
+      . "\n      $th2<b>$h2</b></th>$'"
+      . "\n</table>";
+}
+
+sub do_cmd_lineii{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($c1) = $2;
+    s/$next_pair_pr_rx//o;
+    local($c2) = $2;
+    local($font) = $globals{"lineifont"};
+    local($c1align, $c2align) = @col_aligns[0,1];
+    "<tr>$c1align<$font>$c1</$font></td>\n"
+      . "      $c2align$c2</td>$'";
+}
+
+sub do_env_tableiii{
+    local($_) = @_;
+    local($font,$h1,$h2,$h3) = ('', '', '', '');
+  
+    local($tableiii_rx) =
+      "$next_pair_rx$any_next_pair_rx3$any_next_pair_rx5$any_next_pair_rx7"
+	. "$any_next_pair_rx9";
+    if (/$tableiii_rx/o) {
+	$font = $4;
+	$h1 = $6;
+	$h2 = $8;
+	$h3 = $10;
+    }
+    local($th1,$th2,$th3) = &setup_column_alignments($2);
+    $globals{"lineifont"} = $font;
+    "<table border align=center>"
+      . "\n  <tr>$th1<b>$h1</b></th>"
+      . "\n      $th2<b>$h2</b></th>"
+      . "\n      $th3<b>$h3</b></th>$'"
+      . "\n</table>";
+}
+
+sub do_cmd_lineiii{
+    local($_) = @_;
+    s/$next_pair_pr_rx//o;
+    local($c1) = $2;
+    s/$next_pair_pr_rx//o;
+    local($c2) = $2;
+    s/$next_pair_pr_rx//o;
+    local($c3) = $2;
+    local($font) = $globals{"lineifont"};
+    local($c1align, $c2align, $c3align) = @col_aligns;
+    "<tr>$c1align<$font>$c1</$font></td>\n"
+      . "      $c2align$c2</td>\n"
+      . "      $c3align$c3</td>$'";
+}
+
+sub do_env_seealso{
+    "<p><b>See Also:</b></p>\n" . @_[0];
+}
+
+sub do_cmd_seemodule{
+    # Insert the right magic to jump to the module definition.  This should
+    # work most of the time, at least for repeat builds....
+    local($_) = @_;
+    local($any_next_pair_pr_rx3) = "$OP(\\d+)$CP([\\s\\S]*)$OP\\3$CP";
+    s/$next_pair_pr_rx$any_next_pair_pr_rx3//;
+    local($module,$text,$node,$key) = ($2, $4, '', "module$2");
+    $key =~ s/_//g;
+    # XXX somewhat bogus computation of $node
+#    $node = $external_labels{$key} unless
+#      ($node = $ref_files{$key});
+    $node = $key;
+    "<p>Module <tt><b><a href=\"$node#$key\">$module</a></b></tt>"
+      . "&nbsp;&nbsp;&nbsp;($text)</p>"
+      . $_;
+}
+
+sub do_cmd_seetext{
+    "<p>" . @_[0];
+}
+
+
+sub do_cmd_maketitle {
+    local($_) = @_;
+    local($the_title) = '';
+    if ($t_title) {
+	$the_title .= "<h1 align=\"center\">$t_title</h1>";
+    } else { &write_warnings("\nThis document has no title."); }
+    if ($t_author) {
+	if ($t_authorURL) {
+	    local($href) = &translate_commands($t_authorURL);
+	    $href = &make_named_href('author', $href, "<strong>${t_author}</strong>");
+	    $the_title .= "\n<p align=\"center\">$href</p>";
+	} else {
+	    $the_title .= "\n<p align=\"center\"><strong>$t_author</strong></p>";
+	}
+    } else { &write_warnings("\nThere is no author for this document."); }
+    if ($t_institute) {
+        $the_title .= "\n<p align=\"center\"><small>$t_institute</small></p>";}
+    if ($AUTHOR_ADDRESS) {
+        $the_title .= "\n<p align=\"center\"><small>$AUTHOR_ADDRESS";
+	$the_title .= "</small></p>";}
+    if ($t_affil) {
+	$the_title .= "\n<p align=\"center\"><i>$t_affil</i></p>";}
+    if ($t_date) {
+	$the_title .= "\n<p align=\"center\"><strong>$t_date</strong>";
+	if ($PYTHON_VERSION) {
+	    $the_title .= "<br><strong>Release $PYTHON_VERSION</strong>";}
+	$the_title .= "</p>"
+    }
+    if ($t_address) {
+	$the_title .= "<br>\n<p align=\"left\"><small>$t_address</small></p>";
+    } else { $the_title .= "\n<p align=\"left\">"}
+    if ($t_email) {
+	$the_title .= "\n<p align=\"left\"><small>$t_email</small></p>";
+    } else { $the_title .= "</p>" }
+    $the_title . "<p><hr>\n" . $_ ;
+}
+
+
+# These are located down here since they screw up fontlock.
+
+sub do_cmd_file{
+    # This uses a weird HTML construct to adjust the font to be
+    # reasonable match that used in the printed form as much as
+    # possible.  The expected behavior is that a browser that doesn't
+    # understand "<font face=...>" markup will use courier (or whatever
+    # the font is for <tt>).
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/`<tt><font face=sans-serif>\2<\/font><\/tt>'/;
+    $_;
+}
+
+sub do_cmd_samp{
+    local($_) = @_;
+    s/$any_next_pair_pr_rx/`<tt>\2<\/tt>'/;
+    $_;
+}
+
+1;				# This must be the last line
diff --git a/Doc/python.sty b/Doc/python.sty
new file mode 100644
index 0000000..73c14b0
--- /dev/null
+++ b/Doc/python.sty
@@ -0,0 +1,623 @@
+%
+% myformat.sty for the Python docummentation  [works only with with Latex2e]
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{python}
+             [1998/01/11 LaTeX package (Python manual markup)]
+
+% The "fncychap" package is used to get the nice chapter headers.  The
+% .sty file is distributed with Python, so you should not need to disable
+% it.  You'd also end up with a mixed page style; uglier than stock LaTeX!
+%
+\RequirePackage[Bjarne]{fncychap}\typeout{Using nice chapter headings.}
+
+
+% for PDF output, use maximal compression
+\@ifundefined{pdfannotlink}{
+  \let\LinkColor=\relax
+  \let\NormalColor=\relax
+}{%
+  \input{pdfcolor}
+  \let\LinkColor=\NavyBlue
+  \let\NormalColor=\Black
+  \pdfcompresslevel=9
+  \let\OldContentsline=\contentsline
+  \renewcommand{\contentsline}[3]{%
+    \OldContentsline{#1}{%
+      \pdfannotlink attr{/Border [0 0 0]} goto name{page.#3}%
+        \LinkColor#2\NormalColor%
+      \pdfendlink%
+    }{#3}%
+  }
+  \let\OldLabel=\label
+  \renewcommand{\label}[1]{%
+    \OldLabel{#1}%
+    {\pdfdest name{label.#1} fit}%
+  }
+  % This stuff adds a page.# destination to every PDF page, where # has
+  % the same formatting as the displayed page number.  This doesn't really
+  % help with the frontmatter, but does fine with the body.
+  %
+  % This is *heavily* based on the hyperref package.
+  %
+  \def\@begindvi{%
+    \unvbox \@begindvibox
+    \@hyperfixhead
+    \global\let \@begindvi \@hyperfixhead
+  }
+  \def\hyperpageanchor{%
+       \hyper@anchorstart{page.\thepage}\hyper@anchorend
+   }
+  \let\HYPERPAGEANCHOR\hyperpageanchor
+  \def\@hyperfixhead{%
+   \let\H@old@thehead\@thehead
+       \gdef\@foo{\pdfdest name{page.\thepage} fit}%
+     \expandafter\ifx\expandafter\@empty\H@old@thehead
+       \def\H@old@thehead{\hfil}\fi
+    \def\@thehead{\@foo\relax\H@old@thehead}%
+  }
+}
+
+% Increase printable page size (copied from fullpage.sty)
+\topmargin 0pt
+\advance \topmargin by -\headheight
+\advance \topmargin by -\headsep
+
+% attempt to work a little better for A4 users
+\@ifundefined{paperheight}{
+  \textheight 9in
+}{
+  \textheight \paperheight
+  \advance\textheight by -2in
+}
+
+\oddsidemargin 0pt
+\evensidemargin \oddsidemargin
+\marginparwidth 0.5in
+
+\@ifundefined{paperwidth}{
+  \textwidth 6.5in
+}{
+  \textwidth \paperwidth
+  \advance\textwidth by -2in
+}
+
+
+% Style parameters and macros used by most documents here
+\raggedbottom
+\sloppy
+\parindent = 0mm
+\parskip =   2mm
+\hbadness = 5000		% don't print trivial gripes
+
+\pagestyle{empty}		% start this way; change for
+\pagenumbering{roman}		% ToC & chapters
+\setcounter{secnumdepth}{1}
+
+% Use this to set the font family for headers and other decor:
+\newcommand{\HeaderFamily}{\sffamily}
+
+% Redefine the 'normal' header/footer style when using "fancyhdr" package:
+\@ifundefined{fancyhf}{}{
+  % Use \pagestyle{normal} as the primary pagestyle for text.
+  \fancypagestyle{normal}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\HeaderFamily\thepage}}
+    \fancyfoot[LO]{{\HeaderFamily\nouppercase{\rightmark}}}
+    \fancyfoot[RE]{{\HeaderFamily\nouppercase{\leftmark}}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+  % Update the plain style so we get the page number & footer line,
+  % but not a chapter or section title.  This is to keep the first
+  % page of a chapter and the blank page between chapters `clean.'
+  \fancypagestyle{plain}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\HeaderFamily\thepage}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+  % Redefine \cleardoublepage so that the blank page between chapters
+  % gets the plain style and not the fancy style.  This is described
+  % in the documentation for the fancyhdr package by Piet von Oostrum.
+  \renewcommand{\cleardoublepage}{
+    \clearpage\if@openright \ifodd\c@page\else
+    \hbox{}
+    \thispagestyle{plain}
+    \newpage
+    \if@twocolumn\hbox{}\newpage\fi\fi\fi}
+}
+
+% old code font selections:
+\let\codefont=\tt
+\let\sectcodefont=\tt
+
+% (Haven't found a new one that gets <, >, and _ right without being
+% monospaced.)
+
+
+% This sets up the {verbatim} environment to be indented and a minipage,
+% and to have all the other mostly nice properties that we want for
+% code samples.
+
+% Variable used by begin code command
+\newlength{\codewidth}
+
+\newcommand{\examplevspace}{2mm}
+\newcommand{\exampleindent}{1cm}
+
+\let\OldVerbatim=\verbatim
+\let\OldEndVerbatim=\endverbatim
+\renewcommand{\verbatim}{%
+  \begingroup%
+  \setlength{\parindent}\exampleindent%
+  % Calculate the text width for the minipage:
+  \setlength{\codewidth}{\linewidth}%
+  \addtolength{\codewidth}{-\parindent}%
+  %
+  \par%
+  \vspace\examplevspace%
+  \indent%
+  \begin{minipage}[t]{\codewidth}%
+    \small%
+    \OldVerbatim%
+}
+\renewcommand{\endverbatim}{%
+    \OldEndVerbatim%
+  \end{minipage}%
+  \endgroup%
+}
+
+% Augment the sectioning commands used to get our own font family in place:
+\renewcommand{\section}{\@startsection {section}{1}{\z@}%
+                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
+                                   {2.3ex \@plus.2ex}%
+                                   {\reset@font\Large\HeaderFamily}}
+\renewcommand{\subsection}{\@startsection{subsection}{2}{\z@}%
+                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
+                                     {1.5ex \@plus .2ex}%
+                                     {\reset@font\large\HeaderFamily}}
+\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}%
+                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
+                                     {1.5ex \@plus .2ex}%
+                                     {\reset@font\normalsize\HeaderFamily}}
+\renewcommand{\paragraph}{\@startsection{paragraph}{4}{\z@}%
+                                    {3.25ex \@plus1ex \@minus.2ex}%
+                                    {-1em}%
+                                    {\reset@font\normalsize\HeaderFamily}}
+\renewcommand{\subparagraph}{\@startsection{subparagraph}{5}{\parindent}%
+                                       {3.25ex \@plus1ex \@minus .2ex}%
+                                       {-1em}%
+                                      {\reset@font\normalsize\HeaderFamily}}
+
+
+% Underscore hack (only act like subscript operator if in math mode)
+%
+% The following is due to Mark Wooding (the old version didn't work with
+% Latex 2e.
+
+\DeclareRobustCommand\hackscore{%
+  \ifmmode_\else\textunderscore\fi%
+}
+\begingroup
+\catcode`\_\active
+\def\next{%
+  \AtBeginDocument{\catcode`\_\active\def_{\hackscore{}}}%
+}
+\expandafter\endgroup\next
+
+%
+% This is the old hack, which didn't work with 2e.
+% You should not need this since the rest of the documentation is now
+% LaTeX2e-only.
+%
+%\def\_{\ifnum\fam=\ttfamily \char'137\else{\tt\char'137}\fi}
+%\catcode`\_=12
+%\catcode`\_=\active\def_{\ifnum\fam=\ttfamily \char'137 \else{\tt\char'137}\fi}
+
+
+
+%%  Lots of index-entry generation support.
+
+% Command to wrap around stuff that refers to function / module /
+% attribute names  in the index.  Default behavior: like \code{}.  To
+% just keep the index entries in the roman font, uncomment the second
+% definition to use instead; it matches O'Reilly style more.
+%
+\newcommand{\idxcode}[1]{\codefont{#1}}
+%\renewcommand{\idxcode}[1]{#1}
+
+% Command to generate two index entries (using subentries)
+\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}}
+
+% And three entries (using only one level of subentries)
+\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}}
+
+% And four (again, using only one level of subentries)
+\newcommand{\indexiv}[4]{
+\index{#1!#2 #3 #4}
+\index{#2!#3 #4, #1}
+\index{#3!#4, #1 #2}
+\index{#4!#1 #2 #3}
+}
+
+% Command to generate a reference to a function, statement, keyword,
+% operator.
+\newcommand{\stindex}[1]{\indexii{statement}{#1@{\idxcode{#1}}}}
+\newcommand{\opindex}[1]{\indexii{operator}{#1@{\idxcode{#1}}}}
+\newcommand{\exindex}[1]{\indexii{exception}{#1@{\idxcode{#1}}}}
+\newcommand{\obindex}[1]{\indexii{object}{#1}}
+\newcommand{\bifuncindex}[1]{\index{#1@{\idxcode{#1()}} (built-in function)}}
+
+% Add an index entry for a module
+\newcommand{\refmodule}[2]{\index{#1@{\idxcode{#1}} (#2module)}}
+\newcommand{\refmodindex}[1]{\refmodule{#1}{}}
+\newcommand{\refbimodindex}[1]{\refmodule{#1}{built-in }}
+\newcommand{\refexmodindex}[1]{\refmodule{#1}{extension }}
+\newcommand{\refstmodindex}[1]{\refmodule{#1}{standard }}
+
+% support for the module index
+\newwrite\modindexfile
+\openout\modindexfile=mod\jobname.idx
+
+% Add the defining entry for a module
+\newcommand{\defmodindex}[2]{%
+  \index{#1@{\idxcode{#1}} (#2module)|textbf}%
+  \setindexsubitem{(in module #1)}%
+  \write\modindexfile{#1 \thepage}}
+
+% built-in & Python modules in the main distribution
+\newcommand{\bimodindex}[1]{\defmodindex{#1}{built-in }}
+\newcommand{\stmodindex}[1]{\defmodindex{#1}{standard }}
+
+% Python & extension modules outside the main distribution
+\newcommand{\modindex}[1]{\defmodindex{#1}{}}
+\newcommand{\exmodindex}[1]{\defmodindex{#1}{extension }}
+
+% Additional string for an index entry
+\newcommand{\index@subitem}{}
+\newcommand{\setindexsubitem}[1]{\renewcommand{\index@subitem}{#1}}
+\newcommand{\ttindex}[1]{\index{#1@{\idxcode{#1}} \index@subitem}}
+
+
+% {fulllineitems} is used in one place in libregex.tex, but is really for
+% internal use in this file.
+%
+\newenvironment{fulllineitems}{
+  \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt
+                 \rightmargin 0pt \topsep -\parskip \partopsep \parskip
+                 \itemsep -\parsep
+                 \let\makelabel=\itemnewline}
+}{\end{list}}
+
+
+% cfuncdesc should be called as
+% \begin{cfuncdesc}{type}{name}{arglist}
+% ... description ...
+% \end{cfuncdesc}
+\newenvironment{cfuncdesc}[3]{%
+  \begin{fulllineitems}%
+    \item[\code{#1 \bfcode{#2}(\varvars{#3})}]%
+    \index{#2@{\idxcode{#2()}}}%
+}{\end{fulllineitems}}
+
+\newenvironment{cvardesc}[2]{%
+  \begin{fulllineitems}%
+    \item[\code{#1 \bfcode{#2}}]%
+    \index{#2@{\idxcode{#2}}}%
+}{\end{fulllineitems}}
+
+\newenvironment{ctypedesc}[1]{%
+  \begin{fulllineitems}%
+    \item[\bfcode{#1}]\ttindex{#1}
+}{\end{fulllineitems}}
+
+\newcommand{\funcline}[2]{\funclineni{#1}{#2}\ttindex{#1()}}
+\newenvironment{funcdesc}[2]{%
+  \begin{fulllineitems}%
+    \funcline{#1}{#2}%
+}{\end{fulllineitems}}
+
+\newcommand{\optional}[1]{%
+  {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
+
+% similar to {funcdesc}, but doesn't add to the index
+\newcommand{\funclineni}[2]{\item[\code{\bfcode{#1}(\varvars{#2})}]}
+\newenvironment{funcdescni}[2]{%
+  \begin{fulllineitems}%
+    \funclineni{#1}{#2}%
+}{\end{fulllineitems}}
+
+\newenvironment{classdesc}[2]{%
+  \begin{fulllineitems}%
+    \item[\code{\bfcode{#1}(\varvars{#2})}]%
+    \ttindex{#1}%
+    \def\baseclasses##1{}%
+}{\end{fulllineitems}}
+
+\newenvironment{excdesc}[1]{%
+  \begin{fulllineitems}%
+    \item[\bfcode{#1}]\ttindex{#1}%
+}{\end{fulllineitems}}
+
+\newcommand{\dataline}[1]{\datalineni{#1}\ttindex{#1}}
+\newenvironment{datadesc}[1]{%
+  \begin{fulllineitems}%
+    \dataline{#1}%
+}{\end{fulllineitems}}
+
+% similar to {datadesc}, but doesn't add to the index
+\newcommand{\datalineni}[1]{\item[\bfcode{#1}]}
+\newenvironment{datadescni}[1]{%
+  \begin{fulllineitems}%
+    \datalineni{#1}%
+}{\end{fulllineitems}}
+
+\newenvironment{opcodedesc}[2]{%
+  \begin{fulllineitems}%
+    \item[\bfcode{#1}\quad\var{#2}]%
+}{\end{fulllineitems}}
+
+
+\let\nodename=\label
+
+% For these commands, use \command{} to get the typography right, not 
+% {\command}.  This works better with the texinfo translation.
+\newcommand{\ABC}{{\sc abc}}
+\newcommand{\UNIX}{{\sc Unix}}
+\newcommand{\POSIX}{POSIX}
+\newcommand{\ASCII}{{\sc ascii}}
+\newcommand{\Cpp}{C\protect\raisebox{.18ex}{++}}
+\newcommand{\C}{C}
+\newcommand{\EOF}{{\sc eof}}
+\newcommand{\NULL}{\code{NULL}}
+
+% code is the most difficult one...
+\newcommand{\code}[1]{{\@vobeyspaces\@noligs\def\{{\char`\{}\def\}{\char`\}}\def\~{\char`\~}\def\^{\char`\^}\def\e{\char`\\}\def\${\char`\$}\def\#{\char`\#}\def\&{\char`\&}\def\%{\char`\%}%
+\mbox{\codefont{#1}}}}
+
+\newcommand{\bfcode}[1]{\code{\bfseries#1}} % bold-faced code font
+\newcommand{\kbd}[1]{\mbox{\tt #1}}
+\newcommand{\key}[1]{\mbox{\tt #1}}
+\newcommand{\samp}[1]{\mbox{`\code{#1}'}}
+% This weird definition of \var{} allows it to always appear in roman
+% italics, and won't get funky in code fragments when we play around
+% with fonts.
+\newcommand{\var}[1]{\mbox{\normalsize\textrm{\textit{#1\/}}}}
+\renewcommand{\emph}[1]{{\em #1\/}}
+\newcommand{\dfn}[1]{\emph{#1}}
+\newcommand{\strong}[1]{{\bf #1}}
+% let's experiment with a new font:
+\newcommand{\file}[1]{\mbox{`\small\textsf{#1}'}}
+
+% Use this def/redef approach for \url{} since hyperref defined this already,
+% but only if we actually used hyperref:
+\@ifundefined{pdfannotlink}{%
+  \newcommand{\pythonurl}[1]{\mbox{\small\textsf{#1}}}%
+}{
+  \newcommand{\pythonurl}[1]{{%
+    \pdfannotlink attr{/Border [0 0 0]} user{/S /URI /URI (#1)}%
+    \LinkColor%				color of the link text
+    \mbox{\small\textsf{#1}}%
+    \NormalColor%			Turn it back off; these are declarative
+    \pdfendlink}%			and don't appear bound to the current
+  }%					formatting "box".
+}
+\let\url=\pythonurl
+\newcommand{\email}[1]{\mbox{\small\textsf{#1}}}
+
+\newcommand{\varvars}[1]{{\def\,{\/{\char`\,}}\var{#1}}}
+
+\newif\iftexi\texifalse
+\newif\iflatex\latextrue
+
+% These should be used for all references to identifiers which are
+% used to refer to instances of specific language constructs.  See the
+% names for specific semantic assignments.
+%
+% For now, don't do anything really fancy with them; just use them as
+% logical markup.  This might change in the future.
+%
+\let\module=\code
+\let\keyword=\code
+\let\exception=\code
+\let\class=\code
+\let\function=\code
+\let\member=\code
+\let\method=\code
+
+\let\cfunction=\code
+\let\ctype=\code
+\let\cdata=\code
+
+% constants defined in Python modules or C headers, not language constants:
+\let\constant=\code
+
+\newcommand{\manpage}[2]{{\emph{#1}(#2)}}
+\newcommand{\rfc}[1]{RFC #1\index{RFC!RFC #1}}
+\newcommand{\program}[1]{\strong{#1}}
+
+
+% Deprecation stuff.
+% Should be extended to allow an index / list of deprecated stuff.  But
+% there's a lot of stuff that needs to be done to make that automatable.
+%
+% First parameter is the release number that deprecates the feature, the
+% second is the action the should be taken by users of the feature.
+%
+% Example:
+%
+%  \deprecated {1.5.1}
+%    {Use \method{frobnicate()} instead.}
+%
+\newcommand{\deprecated}[2]{%
+  \strong{Deprecated since release #1.}  #2\par}
+
+
+\newenvironment{tableii}[4]{%
+  \begin{center}%
+    \def\lineii##1##2{\csname#2\endcsname{##1}&##2\\}%
+    \begin{tabular}{#1}\hline \strong{#3}&\strong{#4} \\ \hline%
+}{%
+      \hline%
+    \end{tabular}%
+  \end{center}%
+}
+
+\newenvironment{tableiii}[5]{%
+  \begin{center}%
+    \def\lineiii##1##2##3{\csname#2\endcsname{##1}&##2&##3\\}%
+    \begin{tabular}{#1}\hline \strong{#3}&\strong{#4}&\strong{#5} \\ \hline%
+}{%
+      \hline%
+    \end{tabular}%
+  \end{center}%
+}
+
+\newcommand{\itemnewline}[1]{%
+  \@tempdima\linewidth%
+  \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}%
+}
+
+\newcommand{\sectcode}[1]{{\sectcodefont{#1}}}
+
+% Cross-referencing (AMK)
+% Sample usage:
+%  \begin{seealso}
+%    \seemodule{rand}{Uniform random number generator}; % Module xref
+%    \seetext{\emph{Encyclopedia Britannica}}.          % Ref to a book
+%  \end{seealso}
+
+\newenvironment{seealso}[0]{
+  \strong{See Also:}\par
+  % These should only be defined within the {seealso} environment:
+  \def\seemodule##1##2{\ref{module-##1}:\quad Module \module{##1}\quad (##2)}
+  \def\seetext##1{\par{##1}}
+}{\par}
+
+
+% Fix the theindex environment to add an entry to the Table of
+% Contents; this is much nicer than just having to jump to the end of
+% the book and flip around, especially with multiple indexes.
+%
+\let\OldTheindex=\theindex
+\renewcommand{\theindex}{
+  \cleardoublepage
+  \OldTheindex
+  \addcontentsline{toc}{chapter}{\indexname}
+}
+
+%  Use a similar trick to catch the end of the {abstract} environment,
+%  but here make sure the abstract is followed by a blank page if the
+% 'openright' option is used.
+%
+\let\OldEndAbstract=\endabstract
+\renewcommand{\endabstract}{
+  \if@openright
+    \ifodd\value{page}
+      \typeout{Adding blank page after the abstract.}
+      \vfil\pagebreak
+    \fi
+  \fi
+  \OldEndAbstract
+}
+
+% This wraps the \tableofcontents macro with all the magic to get the
+% spacing right and have the right number of pages if the 'openright'
+% option has been used.  This eliminates a fair amount of crud in the
+% individual document files.
+%
+\let\OldTableofcontents=\tableofcontents
+\renewcommand{\tableofcontents}[0]{%
+  \setcounter{page}{1}%
+  \pagebreak%
+  \pagestyle{plain}%
+  {%
+  \parskip = 0mm%
+  \OldTableofcontents%
+  \if@openright%
+    \ifodd\value{page}%
+      \typeout{Adding blank page after the table of contents.}%
+      \pagebreak\hspace{0pt}%
+    \fi%
+  \fi%
+  }%
+  \cleardoublepage%
+  \pagenumbering{arabic}%
+  \@ifundefined{fancyhf}{}{\pagestyle{normal}}%
+}
+
+% Allow the release number to be specified independently of the
+% \date{}.  This allows the date to reflect the document's date and
+% release to specify the Python release that is documented.
+%
+\newcommand{\@release}{}
+\newcommand{\version}{}
+\newcommand{\releasename}{Release}
+\newcommand{\release}[1]{%
+  \renewcommand{\@release}{\releasename\space\version}%
+  \renewcommand{\version}{#1}}
+
+% Allow specification of the author's address separately from the
+% author's name.  This can be used to format them differently, which
+% is a good thing.
+%
+\newcommand{\@authoraddress}{}
+\newcommand{\authoraddress}[1]{\renewcommand{\@authoraddress}{#1}}
+
+% Change the title page to look a bit better, and fit in with the
+% fncychap ``Bjarne'' style a bit better.
+%
+\renewcommand{\maketitle}{%
+  \begin{titlepage}%
+    \let\footnotesize\small
+    \let\footnoterule\relax
+    \@ifundefined{ChTitleVar}{}{%
+      \mghrulefill{\RW}}%
+    \@ifundefined{pdfinfo}{}{
+      \pdfinfo
+        author {\@author}
+        title {\@title}
+    }
+    \begin{flushright}%
+      {\rm\Huge\HeaderFamily \@title \par}%
+      {\em\LARGE\HeaderFamily \@release \par}
+      \vfill
+      {\LARGE\HeaderFamily \@author \par}
+      \vfill\vfill
+      {\large
+       \@date \par
+       \vskip 3em
+       \@authoraddress \par
+      }%
+    \end{flushright}%\par
+    \@thanks
+  \end{titlepage}%
+  \setcounter{footnote}{0}%
+  \let\thanks\relax\let\maketitle\relax
+  \gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+% This sets up the fancy chapter headings that make the documents look
+% at least a little better than the usual LaTeX output.
+%
+\@ifundefined{ChTitleVar}{}{
+  \ChNameVar{\raggedleft\normalsize\HeaderFamily}
+  \ChNumVar{\raggedleft \bfseries\Large\HeaderFamily}
+  \ChTitleVar{\raggedleft \rm\Huge\HeaderFamily}
+  % This creates chapter heads without the leading \vspace*{}:
+  \def\@makechapterhead#1{%
+    {\parindent \z@ \raggedright \normalfont
+      \ifnum \c@secnumdepth >\m@ne
+        \DOCH
+      \fi
+      \interlinepenalty\@M
+      \DOTI{#1}
+    }
+  }
+  \typeout{Using fancy chapter headings.}
+}
+
+% Tell TeX about pathological hyphenation cases:
+\hyphenation{Base-HTTP-Re-quest-Hand-ler}
diff --git a/Doc/texinputs/manual.cls b/Doc/texinputs/manual.cls
new file mode 100644
index 0000000..bb7ba9a
--- /dev/null
+++ b/Doc/texinputs/manual.cls
@@ -0,0 +1,39 @@
+%
+% manual.cls for the Python documentation
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{manual}
+             [1998/03/03 Python manual]
+
+% Change the options here to get a different set of basic options,  This
+% is where to add things like "a4paper" or "10pt".
+%
+\LoadClass[twoside,openright]{report}
+
+
+% Optional packages:
+%
+% If processing of these documents fails at your TeX installation,
+% these may be commented out (independently) to make things work.
+% These are both supplied with the current version of the teTeX
+% distribution.
+%
+% The "fancyhdr" package makes nicer page footers reasonable to
+% implement, and is used to put the chapter and section information in 
+% the footers.
+%
+% The "times" package makes the default font the PostScript Times
+% font, which makes for smaller PostScript and a font that more people 
+% like.
+%
+\RequirePackage{fancyhdr}\typeout{Using fancier footers than usual.}
+\RequirePackage{times}\typeout{Using times fonts instead of Computer Modern.}
+
+
+% Required package:
+%
+% This gives us all the Python-specific markup that we really want.
+% This should come last.  Do not change this.
+%
+\RequirePackage{python}
diff --git a/Doc/texinputs/python.sty b/Doc/texinputs/python.sty
new file mode 100644
index 0000000..73c14b0
--- /dev/null
+++ b/Doc/texinputs/python.sty
@@ -0,0 +1,623 @@
+%
+% myformat.sty for the Python docummentation  [works only with with Latex2e]
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{python}
+             [1998/01/11 LaTeX package (Python manual markup)]
+
+% The "fncychap" package is used to get the nice chapter headers.  The
+% .sty file is distributed with Python, so you should not need to disable
+% it.  You'd also end up with a mixed page style; uglier than stock LaTeX!
+%
+\RequirePackage[Bjarne]{fncychap}\typeout{Using nice chapter headings.}
+
+
+% for PDF output, use maximal compression
+\@ifundefined{pdfannotlink}{
+  \let\LinkColor=\relax
+  \let\NormalColor=\relax
+}{%
+  \input{pdfcolor}
+  \let\LinkColor=\NavyBlue
+  \let\NormalColor=\Black
+  \pdfcompresslevel=9
+  \let\OldContentsline=\contentsline
+  \renewcommand{\contentsline}[3]{%
+    \OldContentsline{#1}{%
+      \pdfannotlink attr{/Border [0 0 0]} goto name{page.#3}%
+        \LinkColor#2\NormalColor%
+      \pdfendlink%
+    }{#3}%
+  }
+  \let\OldLabel=\label
+  \renewcommand{\label}[1]{%
+    \OldLabel{#1}%
+    {\pdfdest name{label.#1} fit}%
+  }
+  % This stuff adds a page.# destination to every PDF page, where # has
+  % the same formatting as the displayed page number.  This doesn't really
+  % help with the frontmatter, but does fine with the body.
+  %
+  % This is *heavily* based on the hyperref package.
+  %
+  \def\@begindvi{%
+    \unvbox \@begindvibox
+    \@hyperfixhead
+    \global\let \@begindvi \@hyperfixhead
+  }
+  \def\hyperpageanchor{%
+       \hyper@anchorstart{page.\thepage}\hyper@anchorend
+   }
+  \let\HYPERPAGEANCHOR\hyperpageanchor
+  \def\@hyperfixhead{%
+   \let\H@old@thehead\@thehead
+       \gdef\@foo{\pdfdest name{page.\thepage} fit}%
+     \expandafter\ifx\expandafter\@empty\H@old@thehead
+       \def\H@old@thehead{\hfil}\fi
+    \def\@thehead{\@foo\relax\H@old@thehead}%
+  }
+}
+
+% Increase printable page size (copied from fullpage.sty)
+\topmargin 0pt
+\advance \topmargin by -\headheight
+\advance \topmargin by -\headsep
+
+% attempt to work a little better for A4 users
+\@ifundefined{paperheight}{
+  \textheight 9in
+}{
+  \textheight \paperheight
+  \advance\textheight by -2in
+}
+
+\oddsidemargin 0pt
+\evensidemargin \oddsidemargin
+\marginparwidth 0.5in
+
+\@ifundefined{paperwidth}{
+  \textwidth 6.5in
+}{
+  \textwidth \paperwidth
+  \advance\textwidth by -2in
+}
+
+
+% Style parameters and macros used by most documents here
+\raggedbottom
+\sloppy
+\parindent = 0mm
+\parskip =   2mm
+\hbadness = 5000		% don't print trivial gripes
+
+\pagestyle{empty}		% start this way; change for
+\pagenumbering{roman}		% ToC & chapters
+\setcounter{secnumdepth}{1}
+
+% Use this to set the font family for headers and other decor:
+\newcommand{\HeaderFamily}{\sffamily}
+
+% Redefine the 'normal' header/footer style when using "fancyhdr" package:
+\@ifundefined{fancyhf}{}{
+  % Use \pagestyle{normal} as the primary pagestyle for text.
+  \fancypagestyle{normal}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\HeaderFamily\thepage}}
+    \fancyfoot[LO]{{\HeaderFamily\nouppercase{\rightmark}}}
+    \fancyfoot[RE]{{\HeaderFamily\nouppercase{\leftmark}}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+  % Update the plain style so we get the page number & footer line,
+  % but not a chapter or section title.  This is to keep the first
+  % page of a chapter and the blank page between chapters `clean.'
+  \fancypagestyle{plain}{
+    \fancyhf{}
+    \fancyfoot[LE,RO]{{\HeaderFamily\thepage}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+  }
+  % Redefine \cleardoublepage so that the blank page between chapters
+  % gets the plain style and not the fancy style.  This is described
+  % in the documentation for the fancyhdr package by Piet von Oostrum.
+  \renewcommand{\cleardoublepage}{
+    \clearpage\if@openright \ifodd\c@page\else
+    \hbox{}
+    \thispagestyle{plain}
+    \newpage
+    \if@twocolumn\hbox{}\newpage\fi\fi\fi}
+}
+
+% old code font selections:
+\let\codefont=\tt
+\let\sectcodefont=\tt
+
+% (Haven't found a new one that gets <, >, and _ right without being
+% monospaced.)
+
+
+% This sets up the {verbatim} environment to be indented and a minipage,
+% and to have all the other mostly nice properties that we want for
+% code samples.
+
+% Variable used by begin code command
+\newlength{\codewidth}
+
+\newcommand{\examplevspace}{2mm}
+\newcommand{\exampleindent}{1cm}
+
+\let\OldVerbatim=\verbatim
+\let\OldEndVerbatim=\endverbatim
+\renewcommand{\verbatim}{%
+  \begingroup%
+  \setlength{\parindent}\exampleindent%
+  % Calculate the text width for the minipage:
+  \setlength{\codewidth}{\linewidth}%
+  \addtolength{\codewidth}{-\parindent}%
+  %
+  \par%
+  \vspace\examplevspace%
+  \indent%
+  \begin{minipage}[t]{\codewidth}%
+    \small%
+    \OldVerbatim%
+}
+\renewcommand{\endverbatim}{%
+    \OldEndVerbatim%
+  \end{minipage}%
+  \endgroup%
+}
+
+% Augment the sectioning commands used to get our own font family in place:
+\renewcommand{\section}{\@startsection {section}{1}{\z@}%
+                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
+                                   {2.3ex \@plus.2ex}%
+                                   {\reset@font\Large\HeaderFamily}}
+\renewcommand{\subsection}{\@startsection{subsection}{2}{\z@}%
+                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
+                                     {1.5ex \@plus .2ex}%
+                                     {\reset@font\large\HeaderFamily}}
+\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}%
+                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
+                                     {1.5ex \@plus .2ex}%
+                                     {\reset@font\normalsize\HeaderFamily}}
+\renewcommand{\paragraph}{\@startsection{paragraph}{4}{\z@}%
+                                    {3.25ex \@plus1ex \@minus.2ex}%
+                                    {-1em}%
+                                    {\reset@font\normalsize\HeaderFamily}}
+\renewcommand{\subparagraph}{\@startsection{subparagraph}{5}{\parindent}%
+                                       {3.25ex \@plus1ex \@minus .2ex}%
+                                       {-1em}%
+                                      {\reset@font\normalsize\HeaderFamily}}
+
+
+% Underscore hack (only act like subscript operator if in math mode)
+%
+% The following is due to Mark Wooding (the old version didn't work with
+% Latex 2e.
+
+\DeclareRobustCommand\hackscore{%
+  \ifmmode_\else\textunderscore\fi%
+}
+\begingroup
+\catcode`\_\active
+\def\next{%
+  \AtBeginDocument{\catcode`\_\active\def_{\hackscore{}}}%
+}
+\expandafter\endgroup\next
+
+%
+% This is the old hack, which didn't work with 2e.
+% You should not need this since the rest of the documentation is now
+% LaTeX2e-only.
+%
+%\def\_{\ifnum\fam=\ttfamily \char'137\else{\tt\char'137}\fi}
+%\catcode`\_=12
+%\catcode`\_=\active\def_{\ifnum\fam=\ttfamily \char'137 \else{\tt\char'137}\fi}
+
+
+
+%%  Lots of index-entry generation support.
+
+% Command to wrap around stuff that refers to function / module /
+% attribute names  in the index.  Default behavior: like \code{}.  To
+% just keep the index entries in the roman font, uncomment the second
+% definition to use instead; it matches O'Reilly style more.
+%
+\newcommand{\idxcode}[1]{\codefont{#1}}
+%\renewcommand{\idxcode}[1]{#1}
+
+% Command to generate two index entries (using subentries)
+\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}}
+
+% And three entries (using only one level of subentries)
+\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}}
+
+% And four (again, using only one level of subentries)
+\newcommand{\indexiv}[4]{
+\index{#1!#2 #3 #4}
+\index{#2!#3 #4, #1}
+\index{#3!#4, #1 #2}
+\index{#4!#1 #2 #3}
+}
+
+% Command to generate a reference to a function, statement, keyword,
+% operator.
+\newcommand{\stindex}[1]{\indexii{statement}{#1@{\idxcode{#1}}}}
+\newcommand{\opindex}[1]{\indexii{operator}{#1@{\idxcode{#1}}}}
+\newcommand{\exindex}[1]{\indexii{exception}{#1@{\idxcode{#1}}}}
+\newcommand{\obindex}[1]{\indexii{object}{#1}}
+\newcommand{\bifuncindex}[1]{\index{#1@{\idxcode{#1()}} (built-in function)}}
+
+% Add an index entry for a module
+\newcommand{\refmodule}[2]{\index{#1@{\idxcode{#1}} (#2module)}}
+\newcommand{\refmodindex}[1]{\refmodule{#1}{}}
+\newcommand{\refbimodindex}[1]{\refmodule{#1}{built-in }}
+\newcommand{\refexmodindex}[1]{\refmodule{#1}{extension }}
+\newcommand{\refstmodindex}[1]{\refmodule{#1}{standard }}
+
+% support for the module index
+\newwrite\modindexfile
+\openout\modindexfile=mod\jobname.idx
+
+% Add the defining entry for a module
+\newcommand{\defmodindex}[2]{%
+  \index{#1@{\idxcode{#1}} (#2module)|textbf}%
+  \setindexsubitem{(in module #1)}%
+  \write\modindexfile{#1 \thepage}}
+
+% built-in & Python modules in the main distribution
+\newcommand{\bimodindex}[1]{\defmodindex{#1}{built-in }}
+\newcommand{\stmodindex}[1]{\defmodindex{#1}{standard }}
+
+% Python & extension modules outside the main distribution
+\newcommand{\modindex}[1]{\defmodindex{#1}{}}
+\newcommand{\exmodindex}[1]{\defmodindex{#1}{extension }}
+
+% Additional string for an index entry
+\newcommand{\index@subitem}{}
+\newcommand{\setindexsubitem}[1]{\renewcommand{\index@subitem}{#1}}
+\newcommand{\ttindex}[1]{\index{#1@{\idxcode{#1}} \index@subitem}}
+
+
+% {fulllineitems} is used in one place in libregex.tex, but is really for
+% internal use in this file.
+%
+\newenvironment{fulllineitems}{
+  \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt
+                 \rightmargin 0pt \topsep -\parskip \partopsep \parskip
+                 \itemsep -\parsep
+                 \let\makelabel=\itemnewline}
+}{\end{list}}
+
+
+% cfuncdesc should be called as
+% \begin{cfuncdesc}{type}{name}{arglist}
+% ... description ...
+% \end{cfuncdesc}
+\newenvironment{cfuncdesc}[3]{%
+  \begin{fulllineitems}%
+    \item[\code{#1 \bfcode{#2}(\varvars{#3})}]%
+    \index{#2@{\idxcode{#2()}}}%
+}{\end{fulllineitems}}
+
+\newenvironment{cvardesc}[2]{%
+  \begin{fulllineitems}%
+    \item[\code{#1 \bfcode{#2}}]%
+    \index{#2@{\idxcode{#2}}}%
+}{\end{fulllineitems}}
+
+\newenvironment{ctypedesc}[1]{%
+  \begin{fulllineitems}%
+    \item[\bfcode{#1}]\ttindex{#1}
+}{\end{fulllineitems}}
+
+\newcommand{\funcline}[2]{\funclineni{#1}{#2}\ttindex{#1()}}
+\newenvironment{funcdesc}[2]{%
+  \begin{fulllineitems}%
+    \funcline{#1}{#2}%
+}{\end{fulllineitems}}
+
+\newcommand{\optional}[1]{%
+  {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
+
+% similar to {funcdesc}, but doesn't add to the index
+\newcommand{\funclineni}[2]{\item[\code{\bfcode{#1}(\varvars{#2})}]}
+\newenvironment{funcdescni}[2]{%
+  \begin{fulllineitems}%
+    \funclineni{#1}{#2}%
+}{\end{fulllineitems}}
+
+\newenvironment{classdesc}[2]{%
+  \begin{fulllineitems}%
+    \item[\code{\bfcode{#1}(\varvars{#2})}]%
+    \ttindex{#1}%
+    \def\baseclasses##1{}%
+}{\end{fulllineitems}}
+
+\newenvironment{excdesc}[1]{%
+  \begin{fulllineitems}%
+    \item[\bfcode{#1}]\ttindex{#1}%
+}{\end{fulllineitems}}
+
+\newcommand{\dataline}[1]{\datalineni{#1}\ttindex{#1}}
+\newenvironment{datadesc}[1]{%
+  \begin{fulllineitems}%
+    \dataline{#1}%
+}{\end{fulllineitems}}
+
+% similar to {datadesc}, but doesn't add to the index
+\newcommand{\datalineni}[1]{\item[\bfcode{#1}]}
+\newenvironment{datadescni}[1]{%
+  \begin{fulllineitems}%
+    \datalineni{#1}%
+}{\end{fulllineitems}}
+
+\newenvironment{opcodedesc}[2]{%
+  \begin{fulllineitems}%
+    \item[\bfcode{#1}\quad\var{#2}]%
+}{\end{fulllineitems}}
+
+
+\let\nodename=\label
+
+% For these commands, use \command{} to get the typography right, not 
+% {\command}.  This works better with the texinfo translation.
+\newcommand{\ABC}{{\sc abc}}
+\newcommand{\UNIX}{{\sc Unix}}
+\newcommand{\POSIX}{POSIX}
+\newcommand{\ASCII}{{\sc ascii}}
+\newcommand{\Cpp}{C\protect\raisebox{.18ex}{++}}
+\newcommand{\C}{C}
+\newcommand{\EOF}{{\sc eof}}
+\newcommand{\NULL}{\code{NULL}}
+
+% code is the most difficult one...
+\newcommand{\code}[1]{{\@vobeyspaces\@noligs\def\{{\char`\{}\def\}{\char`\}}\def\~{\char`\~}\def\^{\char`\^}\def\e{\char`\\}\def\${\char`\$}\def\#{\char`\#}\def\&{\char`\&}\def\%{\char`\%}%
+\mbox{\codefont{#1}}}}
+
+\newcommand{\bfcode}[1]{\code{\bfseries#1}} % bold-faced code font
+\newcommand{\kbd}[1]{\mbox{\tt #1}}
+\newcommand{\key}[1]{\mbox{\tt #1}}
+\newcommand{\samp}[1]{\mbox{`\code{#1}'}}
+% This weird definition of \var{} allows it to always appear in roman
+% italics, and won't get funky in code fragments when we play around
+% with fonts.
+\newcommand{\var}[1]{\mbox{\normalsize\textrm{\textit{#1\/}}}}
+\renewcommand{\emph}[1]{{\em #1\/}}
+\newcommand{\dfn}[1]{\emph{#1}}
+\newcommand{\strong}[1]{{\bf #1}}
+% let's experiment with a new font:
+\newcommand{\file}[1]{\mbox{`\small\textsf{#1}'}}
+
+% Use this def/redef approach for \url{} since hyperref defined this already,
+% but only if we actually used hyperref:
+\@ifundefined{pdfannotlink}{%
+  \newcommand{\pythonurl}[1]{\mbox{\small\textsf{#1}}}%
+}{
+  \newcommand{\pythonurl}[1]{{%
+    \pdfannotlink attr{/Border [0 0 0]} user{/S /URI /URI (#1)}%
+    \LinkColor%				color of the link text
+    \mbox{\small\textsf{#1}}%
+    \NormalColor%			Turn it back off; these are declarative
+    \pdfendlink}%			and don't appear bound to the current
+  }%					formatting "box".
+}
+\let\url=\pythonurl
+\newcommand{\email}[1]{\mbox{\small\textsf{#1}}}
+
+\newcommand{\varvars}[1]{{\def\,{\/{\char`\,}}\var{#1}}}
+
+\newif\iftexi\texifalse
+\newif\iflatex\latextrue
+
+% These should be used for all references to identifiers which are
+% used to refer to instances of specific language constructs.  See the
+% names for specific semantic assignments.
+%
+% For now, don't do anything really fancy with them; just use them as
+% logical markup.  This might change in the future.
+%
+\let\module=\code
+\let\keyword=\code
+\let\exception=\code
+\let\class=\code
+\let\function=\code
+\let\member=\code
+\let\method=\code
+
+\let\cfunction=\code
+\let\ctype=\code
+\let\cdata=\code
+
+% constants defined in Python modules or C headers, not language constants:
+\let\constant=\code
+
+\newcommand{\manpage}[2]{{\emph{#1}(#2)}}
+\newcommand{\rfc}[1]{RFC #1\index{RFC!RFC #1}}
+\newcommand{\program}[1]{\strong{#1}}
+
+
+% Deprecation stuff.
+% Should be extended to allow an index / list of deprecated stuff.  But
+% there's a lot of stuff that needs to be done to make that automatable.
+%
+% First parameter is the release number that deprecates the feature, the
+% second is the action the should be taken by users of the feature.
+%
+% Example:
+%
+%  \deprecated {1.5.1}
+%    {Use \method{frobnicate()} instead.}
+%
+\newcommand{\deprecated}[2]{%
+  \strong{Deprecated since release #1.}  #2\par}
+
+
+\newenvironment{tableii}[4]{%
+  \begin{center}%
+    \def\lineii##1##2{\csname#2\endcsname{##1}&##2\\}%
+    \begin{tabular}{#1}\hline \strong{#3}&\strong{#4} \\ \hline%
+}{%
+      \hline%
+    \end{tabular}%
+  \end{center}%
+}
+
+\newenvironment{tableiii}[5]{%
+  \begin{center}%
+    \def\lineiii##1##2##3{\csname#2\endcsname{##1}&##2&##3\\}%
+    \begin{tabular}{#1}\hline \strong{#3}&\strong{#4}&\strong{#5} \\ \hline%
+}{%
+      \hline%
+    \end{tabular}%
+  \end{center}%
+}
+
+\newcommand{\itemnewline}[1]{%
+  \@tempdima\linewidth%
+  \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}%
+}
+
+\newcommand{\sectcode}[1]{{\sectcodefont{#1}}}
+
+% Cross-referencing (AMK)
+% Sample usage:
+%  \begin{seealso}
+%    \seemodule{rand}{Uniform random number generator}; % Module xref
+%    \seetext{\emph{Encyclopedia Britannica}}.          % Ref to a book
+%  \end{seealso}
+
+\newenvironment{seealso}[0]{
+  \strong{See Also:}\par
+  % These should only be defined within the {seealso} environment:
+  \def\seemodule##1##2{\ref{module-##1}:\quad Module \module{##1}\quad (##2)}
+  \def\seetext##1{\par{##1}}
+}{\par}
+
+
+% Fix the theindex environment to add an entry to the Table of
+% Contents; this is much nicer than just having to jump to the end of
+% the book and flip around, especially with multiple indexes.
+%
+\let\OldTheindex=\theindex
+\renewcommand{\theindex}{
+  \cleardoublepage
+  \OldTheindex
+  \addcontentsline{toc}{chapter}{\indexname}
+}
+
+%  Use a similar trick to catch the end of the {abstract} environment,
+%  but here make sure the abstract is followed by a blank page if the
+% 'openright' option is used.
+%
+\let\OldEndAbstract=\endabstract
+\renewcommand{\endabstract}{
+  \if@openright
+    \ifodd\value{page}
+      \typeout{Adding blank page after the abstract.}
+      \vfil\pagebreak
+    \fi
+  \fi
+  \OldEndAbstract
+}
+
+% This wraps the \tableofcontents macro with all the magic to get the
+% spacing right and have the right number of pages if the 'openright'
+% option has been used.  This eliminates a fair amount of crud in the
+% individual document files.
+%
+\let\OldTableofcontents=\tableofcontents
+\renewcommand{\tableofcontents}[0]{%
+  \setcounter{page}{1}%
+  \pagebreak%
+  \pagestyle{plain}%
+  {%
+  \parskip = 0mm%
+  \OldTableofcontents%
+  \if@openright%
+    \ifodd\value{page}%
+      \typeout{Adding blank page after the table of contents.}%
+      \pagebreak\hspace{0pt}%
+    \fi%
+  \fi%
+  }%
+  \cleardoublepage%
+  \pagenumbering{arabic}%
+  \@ifundefined{fancyhf}{}{\pagestyle{normal}}%
+}
+
+% Allow the release number to be specified independently of the
+% \date{}.  This allows the date to reflect the document's date and
+% release to specify the Python release that is documented.
+%
+\newcommand{\@release}{}
+\newcommand{\version}{}
+\newcommand{\releasename}{Release}
+\newcommand{\release}[1]{%
+  \renewcommand{\@release}{\releasename\space\version}%
+  \renewcommand{\version}{#1}}
+
+% Allow specification of the author's address separately from the
+% author's name.  This can be used to format them differently, which
+% is a good thing.
+%
+\newcommand{\@authoraddress}{}
+\newcommand{\authoraddress}[1]{\renewcommand{\@authoraddress}{#1}}
+
+% Change the title page to look a bit better, and fit in with the
+% fncychap ``Bjarne'' style a bit better.
+%
+\renewcommand{\maketitle}{%
+  \begin{titlepage}%
+    \let\footnotesize\small
+    \let\footnoterule\relax
+    \@ifundefined{ChTitleVar}{}{%
+      \mghrulefill{\RW}}%
+    \@ifundefined{pdfinfo}{}{
+      \pdfinfo
+        author {\@author}
+        title {\@title}
+    }
+    \begin{flushright}%
+      {\rm\Huge\HeaderFamily \@title \par}%
+      {\em\LARGE\HeaderFamily \@release \par}
+      \vfill
+      {\LARGE\HeaderFamily \@author \par}
+      \vfill\vfill
+      {\large
+       \@date \par
+       \vskip 3em
+       \@authoraddress \par
+      }%
+    \end{flushright}%\par
+    \@thanks
+  \end{titlepage}%
+  \setcounter{footnote}{0}%
+  \let\thanks\relax\let\maketitle\relax
+  \gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+% This sets up the fancy chapter headings that make the documents look
+% at least a little better than the usual LaTeX output.
+%
+\@ifundefined{ChTitleVar}{}{
+  \ChNameVar{\raggedleft\normalsize\HeaderFamily}
+  \ChNumVar{\raggedleft \bfseries\Large\HeaderFamily}
+  \ChTitleVar{\raggedleft \rm\Huge\HeaderFamily}
+  % This creates chapter heads without the leading \vspace*{}:
+  \def\@makechapterhead#1{%
+    {\parindent \z@ \raggedright \normalfont
+      \ifnum \c@secnumdepth >\m@ne
+        \DOCH
+      \fi
+      \interlinepenalty\@M
+      \DOTI{#1}
+    }
+  }
+  \typeout{Using fancy chapter headings.}
+}
+
+% Tell TeX about pathological hyphenation cases:
+\hyphenation{Base-HTTP-Re-quest-Hand-ler}
diff --git a/Doc/tut.tex b/Doc/tut.tex
index 0d1ccef..62c405e 100644
--- a/Doc/tut.tex
+++ b/Doc/tut.tex
@@ -1,5 +1,4 @@
-\documentclass[twoside,openright]{report}
-\usepackage{myformat}
+\documentclass{manual}
 
 % Things to do:
 % Add a section on file I/O
diff --git a/Doc/tut/tut.tex b/Doc/tut/tut.tex
index 0d1ccef..62c405e 100644
--- a/Doc/tut/tut.tex
+++ b/Doc/tut/tut.tex
@@ -1,5 +1,4 @@
-\documentclass[twoside,openright]{report}
-\usepackage{myformat}
+\documentclass{manual}
 
 % Things to do:
 % Add a section on file I/O
