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
