Many changes to work with newer versions of LaTeX2HTML.  This has been
tested with version 99.2beta8.
diff --git a/Doc/perl/l2hinit.perl b/Doc/perl/l2hinit.perl
index 407f396..2327921 100644
--- a/Doc/perl/l2hinit.perl
+++ b/Doc/perl/l2hinit.perl
@@ -1,22 +1,12 @@
-#LaTeX2HTML Version 96.1 : dot.latex2html-init		-*- perl -*-
-#
-#  Significantly revised by Fred L. Drake, Jr. <fdrake@acm.org> for use
-#  with the Python documentation.
-#
-#  New name to avoid distributing "dot" files with the Python documentation.
-#
-
-package Override;
-
-use Cwd qw(getcwd);
-
+# LaTeX2HTML support base for use with Python documentation.
 
 package main;
 
+use L2hos;
+
 $HTML_VERSION = 4.0;
 
 $MAX_LINK_DEPTH = 2;
-$MAX_SPLIT_DEPTH = 5;      # split at subsections but not sub-subsections
 $ADDRESS = '';
 
 $NO_FOOTNODE = 1;
@@ -34,9 +24,6 @@
 $BOTTOM_NAVIGATION = 1;
 $AUTO_NAVIGATION = 0;
 
-$SUPPRESS_CONTENTS = 0;
-$SUPPRESS_INDEXES = 0;
-
 # these exactly match the python.org colors
 $BODYTEXT = ('bgcolor="#ffffff" text="#000000"'
 	     . ' link="#0000bb"  vlink="#551a8b" alink="#ff0000"');
@@ -49,14 +36,20 @@
 
 
 # A little painful, but lets us clean up the top level directory a little,
-# and not be tied to the current directory (as far as I can tell).
+# and not be tied to the current directory (as far as I can tell).  Testing
+# an existing definition of $mydir is needed since it cannot be computed when
+# run under mkhowto with recent versions of LaTeX2HTML, since this file is
+# not read directly by LaTeX2HTML any more.  mkhowto is required to prepend
+# the required definition at the top of the actual input file.
 #
-use Cwd;
-use File::Basename;
-($myname, $mydir, $myext) = fileparse(__FILE__, '\..*');
-chop $mydir;			# remove trailing '/'
-$mydir = getcwd() . "$dd$mydir"
-  unless $mydir =~ s|^/|/|;
+if (!defined $mydir) {
+    use Cwd;
+    use File::Basename;
+    ($myname, $mydir, $myext) = fileparse(__FILE__, '\..*');
+    chop $mydir;			# remove trailing '/'
+    $mydir = getcwd() . "$dd$mydir"
+        unless $mydir =~ s|^/|/|;
+}
 $LATEX2HTMLSTYLES = "$mydir$envkey$LATEX2HTMLSTYLES";
 push (@INC, $mydir);
 
@@ -84,71 +77,25 @@
 $ABOUT_FILE = "$myrootdir${dd}html${dd}stdabout.dat";
 
 
-sub custom_driver_hook{
+sub custom_driver_hook {
     #
     # This adds the directory of the main input file to $TEXINPUTS; it
     # seems to be sufficiently general that it should be fine for HOWTO
     # processing.
     #
     my $file = @_[0];
-    my($jobname,$dir,$ext) = fileparse($file, '\..*');
-    $dir = make_directory_absolute($dir);
+    my($jobname, $dir, $ext) = fileparse($file, '\..*');
+    $dir = L2hos->Make_directory_absolute($dir);
     $dir =~ s/$dd$//;
     $TEXINPUTS = "$dir$envkey$mytexinputs";
-    print "\nadding $dir to \$TEXINPUTS\n";
-}
-
-# Defining this allows us to remove all table of contents and index
-# processing using an init file; this is required to get rid of the
-# Table of Contents or we'd get a blank page.  Based on a suggestion
-# from Ross Moore <ross@ics.mq.edu.au>.
-#
-# Seems to require a more recent version of LaTeX2HTML than I've
-# been using, though.
-#
-sub preprocess{
-    if ($SUPPRESS_CONTENTS) {
-	s/\\(tableofcontents|listof(figures|tables))/\2/g;
-    }
-    if ($SUPPRESS_INDEXES) {
-	s/\\(print|make)index//g;
-    }
+    print "\nAdding $dir to \$TEXINPUTS\n";
 }
 
 
-sub set_icon_size{
-    my($name, $w, $h) = @_;
-    $iconsizes{$name} = "width=$w height=$h";
-}
+$CUSTOM_BUTTONS = '';
+$NAV_BGCOLOR = " bgcolor=\"#99CCFF\"";
 
-foreach $name (split(/ /, 'up next previous contents index modules blank')) {
-    set_icon_size($name, 32, 32);
-}
-sub adjust_icon_information{
-    # The '_motif' is really annoying, and makes the HTML larger with no value
-    # added, so strip it off:
-    foreach $name (keys %icons) {
-        my $icon = $icons{$name};
-        # Strip off the wasteful '_motif':
-        $icon =~ s/_motif//;
-        # Change the greyed-out icons to be blank:
-        $icon =~ s/[a-z]*_gr[.]/blank./;
-        # make sure we're using the latest $IMAGE_TYPE
-        $icon =~ s/[.](gif|png)$/.$IMAGE_TYPE/;
-        $icons{$name} = $icon;
-    }
-    $icons{'blank'} = 'blank.' . $IMAGE_TYPE;
-    
-    $CUSTOM_BUTTONS = '';
-    $BLANK_ICON = "\n<td>" . img_tag('blank.' . $IMAGE_TYPE) . "</td>";
-    $BLANK_ICON =~ s/alt="blank"/alt=""/;
-    $NAV_BGCOLOR = " bgcolor=\"#99CCFF\"";
-}
-
-adjust_icon_information();
-
-
-sub make_nav_sectref{
+sub make_nav_sectref {
     my($label,$title) = @_;
     if ($title) {
 	return ("<b class='navlabel'>$label:</b> "
@@ -157,43 +104,79 @@
     return '';
 }
 
-sub make_nav_panel{
-    my $s;
-    $s = "<table align='center' width='100%' cellpadding='0' cellspacing='2'>"
-         . "\n<tr>"
-	 . "\n<td>$NEXT</td>"
-	 . "\n<td>$UP</td>"
-	 . "\n<td>$PREVIOUS</td>";
-    if ($SUPPRESS_CONTENTS && $SUPPRESS_INDEXES) {
-	$s .= ("\n<td align=right$NAV_BGCOLOR width=\"100%\">"
-	       . "\n <b class=title>$t_title\&nbsp;\&nbsp;\&nbsp;</b></td>");
-    }
-    else {
-	$s .= ("\n<td align=center$NAV_BGCOLOR width=\"100%\">"
-	       . "\n <b class=title>$t_title</b></td>"
-	       . ($CONTENTS ? "\n<td>$CONTENTS</td>" : $BLANK_ICON)
-	       . "\n<td>$CUSTOM_BUTTONS</td>" # module index
-	       . ($INDEX ? "\n<td>$INDEX</td>" : $BLANK_ICON));
-    }
-    $s .= ("\n</tr></table>"
-	   . make_nav_sectref("Next", $NEXT_TITLE)
-	   . make_nav_sectref("Up", $UP_TITLE)
-	   . make_nav_sectref("Previous", $PREVIOUS_TITLE));
-    # remove these; they are unnecessary and cause error from validation
-    $s =~ s/ NAME="tex2html\d+"\n//g;
+sub make_my_icon {
+    my($name, $text) = @_;
+    my $iconserver = ($ICONSERVER eq '.') ? '' : "$ICONSERVER/";
+    return "<img src=\"$iconserver$name.$IMAGE_TYPE\" border=\"0\""
+           . " height=\"32\"\n  alt=\"$text\" width=\"32\">";
+}
+
+$BLANK_ICON = make_my_icon("blank", "");
+
+@my_icons = ();
+$my_icons{'next_page_inactive'} = $BLANK_ICON;
+$my_icons{'previous_page_inactive'} = $BLANK_ICON;
+$my_icons{'up_page_inactive'} = $BLANK_ICON;
+$x = make_my_icon("next", "Next Page");
+$my_icons{'next_page'} = $x;
+$my_icons{'next'} = $x;
+$x = make_my_icon("previous", "Previous Page");
+$my_icons{'previous_page'} = $x;
+$my_icons{'previous'} = $x;
+$my_icons{'up'} = make_my_icon("up", "Up One Level");
+$my_icons{'contents'} = make_my_icon("contents", "Contents");
+$my_icons{'index'} = make_my_icon("index", "Index");
+$my_icons{'modules'} = make_my_icon("modules", "Module Index");
+
+
+sub use_my_icon {
+    my $s = @_[0];
+    $s =~ s/\<tex2html_([a-z_]+)_visible_mark\>/$my_icons{$1}/;
     return $s;
 }
 
+sub make_nav_panel {
+    my $s;
+    $NEXT = use_my_icon("$NEXT");
+    $UP = use_my_icon("$UP");
+    $PREVIOUS = use_my_icon("$PREVIOUS");
+    $CONTENTS = use_my_icon("$CONTENTS");
+    $INDEX = $INDEX ? use_my_icon("$INDEX") : $BLANK_ICON;
+    if (!$CUSTOM_BUTTONS) {
+        $CUSTOM_BUTTONS = $BLANK_ICON;
+    }
+    $s = ('<table align="center" width="100%" cellpadding="0" cellspacing="2">'
+          . "\n<tr>"
+          # left-hand side
+          . "\n<td>$NEXT</td>"
+          . "\n<td>$UP</td>"
+          . "\n<td>$PREVIOUS</td>"
+          # title box
+          . "\n<td align=\"center\"$NAV_BGCOLOR width=\"100%\">"
+          . "\n <b class=\"title\">$t_title</b></td>"
+          # right-hand side
+          . "\n<td>$CONTENTS</td>"
+          . "\n<td>$CUSTOM_BUTTONS</td>" # module index
+          . "\n<td>$INDEX</td>"
+          . "\n</tr></table>\n"
+          # textual navigation
+          . make_nav_sectref("Next", $NEXT_TITLE)
+          . make_nav_sectref("Up", $UP_TITLE)
+          . make_nav_sectref("Previous", $PREVIOUS_TITLE));
+    # remove these; they are unnecessary and cause errors from validation
+    $s =~ s/ NAME="tex2html\d+"\n */ /g;
+    return $s;
+}
+
+
 sub top_navigation_panel {
-    "<div class='navigation'>\n"
-      . make_nav_panel()
-      . '<br><hr></div>';
+    return make_nav_panel()
+           . '<br><hr>';
 }
 
 sub bot_navigation_panel {
-    "<p>\n<div class='navigation'><hr>"
-      . make_nav_panel()
-      . '</div>';
+    return "<p><hr>"
+           . make_nav_panel();
 }
 
 sub add_link {
@@ -201,81 +184,49 @@
     my($icon, $current_file, @link) = @_;
     my($dummy, $file, $title) = split($delim,
 				      $section_info{join(' ',@link)});
+    $icon =~ s/\<tex2html_([_a-z]+)_visible_mark\>/$my_icons{$1}/;
     if ($title && ($file ne $current_file)) {
         $title = purify($title);
 	$title = get_first_words($title, $WORDS_IN_NAVIGATION_PANEL_TITLES);
 	return (make_href($file, $icon), make_href($file, "$title"))
 	}
-    elsif ($icon eq $up_visible_mark && $EXTERNAL_UP_LINK) {
+    elsif ($icon eq $my_icons{"up"} && $EXTERNAL_UP_LINK) {
  	return (make_href($EXTERNAL_UP_LINK, $icon),
 		make_href($EXTERNAL_UP_LINK, "$EXTERNAL_UP_TITLE"))
 	}
-    elsif (($icon eq $previous_visible_mark
-	    || $icon eq $previous_page_visible_mark)
+    elsif ($icon eq $my_icons{"previous"}
 	   && $EXTERNAL_PREV_LINK && $EXTERNAL_PREV_TITLE) {
 	return (make_href($EXTERNAL_PREV_LINK, $icon),
 		make_href($EXTERNAL_PREV_LINK, "$EXTERNAL_PREV_TITLE"))
 	}
-    elsif (($icon eq $next_visible_mark
-	    ||  $icon eq $next_page_visible_mark)
+    elsif ($icon eq $my_icons{"next"}
 	   && $EXTERNAL_DOWN_LINK && $EXTERNAL_DOWN_TITLE) {
 	return (make_href($EXTERNAL_DOWN_LINK, $icon),
 		make_href($EXTERNAL_DOWN_LINK, "$EXTERNAL_DOWN_TITLE"))
 	}
-    (&inactive_img($icon), "");
+    return (&inactive_img($icon), "");
 }
 
 sub add_special_link {
     my($icon, $file, $current_file) = @_;
-    (($file && ($file ne $current_file)) ? make_href($file, $icon) : undef)
+    $icon =~ s/\<tex2html_([_a-z]+)_visible_mark\>/$my_icons{$1}/;
+    return (($file && ($file ne $current_file))
+            ? make_href($file, $icon)
+            : undef)
 }
 
-sub img_tag {
-    local($icon) = @_;
-    my $alt;
-    my $align = " align=bottom ";
-
-    # having this list hardcoded here is really bogus....
-    $alt = join('|', 'up', 'next_group', 'previous_group'
-		, 'next', 'previous', 'change_begin_right', 'change_begin'
-		, 'change_end_right', 'change_end', 'change_delete_right'
-		, 'change_delete', 'contents', 'index', 'modules', 'blank');
-
-    if ($icon =~ /(gif|png)$/) {
-	$used_icons{$icon} = 1;
-	if ($icon =~ /change_(begin|end|delete)_right/) { $align = ' ' };
-	my $nav_border = "$NAV_BORDER";
-	if ($icon =~ /($alt)/) {
-	    $alt = $1;
-	    $alt = ""
-	      if ($alt eq "blank");
-	}
-	else {
-	    $nav_border = '1';
-	    $alt = '[*]';
-	};
-	if ($LOCAL_ICONS) {
-	    return join('', '<img ', $iconsizes{$1}, $align
-			,'border=', $nav_border, ' alt="', $alt
-			,'" src="', $icon, '">' );
-	}
-	my $s = join('', '<img ', $iconsizes{$1}, $align,
-                     'border=', $nav_border, ' alt="', $alt, "\"\n",
-                     ' src="', $ICONSERVER, "/$icon", '">' );
-        # if $ICONSERVER starts with "./", remove "./":
-        $s =~ s|src="(.\/)+|src="|;
-        return $s;
-    }
-    else {
-	return $icon;
-    }
-}
-
+# The img_tag() function seems only to be called with the parameter
+# 'anchor_invisible_mark', which we want to turn into ''.  Since
+# replace_icon_marks() is the only interesting caller, and all it really
+# does is call img_tag(), we can just define the hook alternative to be
+# a no-op instead.
+#
+sub replace_icons_hook {}
 
 sub do_cmd_arabic {
     # get rid of that nasty <SPAN CLASS="arabic">...</SPAN>
-    local($ctr, $val, $id, $_) = &read_counter_value(@_[0]);
-    return ($val ? &farabic($val) : "0") . $_;
+    my($ctr, $val, $id, $text) = &read_counter_value(@_[0]);
+    return ($val ? farabic($val) : "0") . $text;
 }
 
 
@@ -285,7 +236,7 @@
     sprintf('%s###%s%010d', $str, $extra, ++$global{'max_id'});
 }
 
-sub insert_index{
+sub insert_index {
     my($mark,$datafile,$columns,$letters,$prefix) = @_;
     my $prog = "$myrootdir/tools/buildindex.py";
     my $index;
@@ -298,7 +249,7 @@
     s/$mark/$prefix$index/;
 }
 
-sub add_idx{
+sub add_idx {
     print "\nBuilding HTML for the index ...";
     close(IDXFILE);
     insert_index($idx_mark, 'index.dat', $INDEX_COLUMNS, 1, '');
@@ -308,7 +259,7 @@
 $idx_module_mark = '<tex2html_idx_module_mark>';
 $idx_module_title = 'Module Index';
 
-sub add_module_idx{
+sub add_module_idx {
     print "\nBuilding HTML for the module index ...";
     my $key;
     my $first = 1;
@@ -356,7 +307,7 @@
 }
 
 # replace both indexes as needed:
-sub add_idx_hook{
+sub add_idx_hook {
     add_idx() if (/$idx_mark/);
     add_module_idx() if (/$idx_module_mark/);
     process_python_state();
@@ -367,9 +318,6 @@
 # support suppression of the page complete (for HTML Help use).
 sub do_cmd_tableofcontents {
     local($_) = @_;
-#     if ($SUPPRESS_CONTENTS) {
-# 	return $_;
-#     }
     $TITLE = $toc_title;
     $tocfile = $CURRENT_FILE;
     my($closures,$reopens) = preserve_open_tags();
@@ -465,31 +413,23 @@
 
     s/([\\]begin\s*$O\d+$C\s*thebibliography)/$bbl_cnt++; $1/eg;
     s/([\\]begin\s*$O\d+$C\s*thebibliography)/$id++; "\\bibliography$O$id$C$O$id$C $1"/geo;
-    #----------------------------------------------------------------------
-    # (FLD) This was added
-    if ($SUPPRESS_INDEXES) {
-	$CUSTOM_BUTTONS .= img_tag('blank.' . $IMAGE_TYPE);
+    my(@parts) = split(/\\begin\s*$O\d+$C\s*theindex/);
+    if (scalar(@parts) == 3) {
+        # Be careful to re-write the string in place, since $_ is *not*
+        # returned explicity;  *** nasty side-effect dependency! ***
+        print "\nadd_bbl_and_idx_dummy_commands ==> adding module index";
+        my $rx = "([\\\\]begin\\s*$O\\d+$C\\s*theindex[\\s\\S]*)"
+          . "([\\\\]begin\\s*$O\\d+$C\\s*theindex)";
+        s/$rx/\\textohtmlmoduleindex \1 \\textohtmlindex \2/o;
+        # Add a button to the navigation areas:
+        $CUSTOM_BUTTONS .= $my_icons{'modules'};
     }
     else {
-	my(@parts) = split(/\\begin\s*$O\d+$C\s*theindex/);
-	if (scalar(@parts) == 3) {
-	    # Be careful to re-write the string in place, since $_ is *not*
-	    # returned explicity;  *** nasty side-effect dependency! ***
-	    print "\nadd_bbl_and_idx_dummy_commands ==> adding module index";
-	    my $rx = "([\\\\]begin\\s*$O\\d+$C\\s*theindex[\\s\\S]*)"
-	      . "([\\\\]begin\\s*$O\\d+$C\\s*theindex)";
-	    s/$rx/\\textohtmlmoduleindex \1 \\textohtmlindex \2/o;
-	    # Add a button to the navigation areas:
-	    $CUSTOM_BUTTONS .= ("<a\n href=\"modindex.html\">"
-				. img_tag('modules.'.$IMAGE_TYPE) . "</a>");
-	}
-	else {
-	    $CUSTOM_BUTTONS .= img_tag('blank.' . $IMAGE_TYPE);
-	    $global{'max_id'} = $id; # not sure why....
-	    s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlindex $1/o;
+        $CUSTOM_BUTTONS .= $BLANK_ICON;
+        $global{'max_id'} = $id; # not sure why....
+        s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlindex $1/o;
 	    s/[\\]printindex/\\textohtmlindex /o;
 	}
-    }
     #----------------------------------------------------------------------
     lib_add_bbl_and_idx_dummy_commands()
         if defined(&lib_add_bbl_and_idx_dummy_commands);
@@ -531,24 +471,6 @@
 }
 
 
-# Fix from Ross Moore for ']' in \item[...]; this can be removed once the next
-# patch to LaTeX2HTML is released and tested ... if the patch gets included.
-# Be very careful to keep this around, just in case things break again!
-#
-sub protect_useritems {
-    local(*_) = @_;
-    local($preitems,$thisitem);
-    while (/\\item\s*\[/) {
-        $preitems .= $`;
-	$_ = $';
-        $thisitem = $&.'<<'.++$global{'max_id'}.'>>';
-        s/^(((($O|$OP)\d+($C|$CP)).*\3|<[^<>]*>|[^\]<]+)*)\]/$thisitem.=$1;''/e;
-        $preitems .= $thisitem . '<<' . $global{'max_id'} . '>>]';
-	s/^]//;
-    }
-    $_ = $preitems . $_;
-}
-
 # This changes the markup used for {verbatim} environments, and is the
 # best way I've found that ensures the <dl> goes on the outside of the
 # <pre>...</pre>.
@@ -566,14 +488,13 @@
 # declaration; MSIE5 on NT4 SP4 barfs on it and drops the content of the
 # page.
 sub make_head_and_body {
-    local($title,$body) = @_;
-    local($DTDcomment) = '';
-    local($version,$isolanguage) = ($HTML_VERSION, 'EN');
-    local(%isolanguages) = (  'english',  'EN'   , 'USenglish', 'EN.US'
-			    , 'original', 'EN'   , 'german'   , 'DE'
-			    , 'austrian', 'DE.AT', 'french'   , 'FR'
-			    , 'spanish',  'ES'
-			    , %isolanguages );
+    my($title, $body) = @_;
+    my $DTDcomment = '';
+    my($version, $isolanguage) = ($HTML_VERSION, 'EN');
+    my %isolanguages = (  'english',  'EN'   , 'USenglish', 'EN.US'
+                        , 'original', 'EN'   , 'german'   , 'DE'
+                        , 'austrian', 'DE.AT', 'french'   , 'FR'
+                        , 'spanish',  'ES');
     $isolanguage = $isolanguages{$default_language};
     $isolanguage = 'EN' unless $isolanguage;
     $title = &purify($title,1);