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
