Merged changes from the 1.5.2p2 release.
diff --git a/Doc/perl/python.perl b/Doc/perl/python.perl
index 57a19ed..6b67df5 100644
--- a/Doc/perl/python.perl
+++ b/Doc/perl/python.perl
@@ -61,7 +61,7 @@
 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_NULL{ '<tt class="constant">NULL</tt>' . @_[0]; }
 
 sub do_cmd_e{ '&#92;' . @_[0]; }
 
@@ -119,53 +119,55 @@
 sub do_cmd_pytype{ return @_[0]; }
 sub do_cmd_makevar{ return @_[0]; }
 sub do_cmd_code{
-    return use_wrappers(@_[0], '<tt>', '</tt>'); }
+    return use_wrappers(@_[0], '<code>', '</code>'); }
 sub do_cmd_module{
-    return use_wrappers(@_[0], '<tt class=module>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="module">', '</tt>'); }
 sub do_cmd_keyword{
-    return use_wrappers(@_[0], '<tt class=keyword>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="keyword">', '</tt>'); }
 sub do_cmd_exception{
-    return use_wrappers(@_[0], '<tt class=exception>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="exception">', '</tt>'); }
 sub do_cmd_class{
-    return use_wrappers(@_[0], '<tt class=class>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="class">', '</tt>'); }
 sub do_cmd_function{
-    return use_wrappers(@_[0], '<tt class=function>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="function">', '</tt>'); }
 sub do_cmd_constant{
-    return use_wrappers(@_[0], '<tt class=constant>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="constant">', '</tt>'); }
 sub do_cmd_member{
-    return use_wrappers(@_[0], '<tt class=member>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="member">', '</tt>'); }
 sub do_cmd_method{
-    return use_wrappers(@_[0], '<tt class=method>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="method">', '</tt>'); }
 sub do_cmd_cfunction{
-    return use_wrappers(@_[0], '<tt class=cfunction>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="cfunction">', '</tt>'); }
 sub do_cmd_cdata{
-    return use_wrappers(@_[0], '<tt class=cdata>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="cdata">', '</tt>'); }
 sub do_cmd_ctype{
-    return use_wrappers(@_[0], '<tt class=ctype>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="ctype">', '</tt>'); }
 sub do_cmd_regexp{
-    return use_wrappers(@_[0], '<tt class=regexp>', '</tt>'); }
+    return use_wrappers(@_[0], '<tt class="regexp">', '</tt>'); }
 sub do_cmd_character{
-    return use_wrappers(@_[0], '"<tt class=character>', '</tt>"'); }
+    return use_wrappers(@_[0], '"<tt class="character">', '</tt>"'); }
 sub do_cmd_program{
-    return use_wrappers(@_[0], '<b class=program>', '</b>'); }
+    return use_wrappers(@_[0], '<b class="program">', '</b>'); }
 sub do_cmd_programopt{
     return use_wrappers(@_[0], '<b class="programopt">', '</b>'); }
 sub do_cmd_email{
-    return use_wrappers(@_[0], '<span class=email>', '</span>'); }
+    return use_wrappers(@_[0], '<span class="email">', '</span>'); }
 sub do_cmd_mimetype{
-    return use_wrappers(@_[0], '<span class=mimetype>', '</span>'); }
+    return use_wrappers(@_[0], '<span class="mimetype">', '</span>'); }
 sub do_cmd_var{
     return use_wrappers(@_[0], "<var>", "</var>"); }
 sub do_cmd_dfn{
-    return use_wrappers(@_[0], '<i class=dfn>', '</i>'); }
+    return use_wrappers(@_[0], '<i class="dfn">', '</i>'); }
 sub do_cmd_emph{
     return use_italics(@_); }
 sub do_cmd_file{
-    return use_wrappers(@_[0], '<tt class=file>', '</tt>'); }
+    return use_wrappers(@_[0],
+                        '<font class="file" face="sans-serif">',
+                        '</font>'); }
 sub do_cmd_filenq{
-    return use_wrappers(@_[0], '<tt class=file>', '</tt>'); }
+    return do_cmd_file(@_[0]); }
 sub do_cmd_samp{
-    return use_wrappers(@_[0], '"<tt class=samp>', '</tt>"'); }
+    return use_wrappers(@_[0], '"<tt class="samp">', '</tt>"'); }
 sub do_cmd_kbd{
     return use_wrappers(@_[0], '<kbd>', '</kbd>'); }
 sub do_cmd_strong{
@@ -183,13 +185,15 @@
     my $module = next_argument();
     $key = $module
         unless $key;
-    return "<tt class=module><a href=\"module-$key.html\">$module</a></tt>" . $_;
+    return "<tt class='module'><a href='module-$key.html'>$module</a></tt>"
+      . $_;
 }
 
 sub do_cmd_newsgroup{
     local($_) = @_;
     my $newsgroup = next_argument();
-    my $stuff = "<a class=newsgroup href=\"news:$newsgroup\">$newsgroup</a>";
+    my $stuff = "<span class='newsgroup'><a href='news:$newsgroup'>"
+      . "$newsgroup</a></span>";
     return $stuff . $_;
 }
 
@@ -202,7 +206,7 @@
     add_index_entry("environment variables!$envvar@<tt>\$$envvar</tt>",
 		    $ahref);
     add_index_entry("$envvar@\$$envvar", $ahref);
-    $aname =~ s/<a/<a class=envvar/;
+    $aname =~ s/<a/<a class="envvar"/;
     return "$aname\$$envvar</a>" . $_;
 }
 
@@ -211,7 +215,7 @@
     local($_) = @_;
     my $url = next_argument();
     $url =~ s/~/&#126;/g;
-    return "<a class=url href=\"$url\">$url</a>" . $_;
+    return "<a class=\"url\" href=\"$url\">$url</a>" . $_;
 }
 
 sub do_cmd_manpage{
@@ -219,7 +223,7 @@
     local($_) = @_;
     my $page = next_argument();
     my $section = next_argument();
-    return "<span class=manpage><i>$page</i>($section)</span>" . $_;
+    return "<span class='manpage'><i>$page</i>($section)</span>" . $_;
 }
 
 sub do_cmd_rfc{
@@ -231,7 +235,7 @@
     # Save the reference
     my $nstr = gen_index_id("RFC!RFC $rfcnumber", '');
     $index{$nstr} .= make_half_href("$CURRENT_FILE#$id");
-    return ("<a class=rfc name=\"$id\"\nhref=\"$href\">RFC $rfcnumber</a>"
+    return ("<a class=\"rfc\" name=\"$id\"\nhref=\"$href\">RFC $rfcnumber</a>"
             . $_);
 }
 
@@ -280,11 +284,11 @@
 sub do_cmd_platform{
     local($_) = @_;
     my $platform = next_argument();
-    $ModulePlatforms{$THIS_MODULE} = $platform;
+    $ModulePlatforms{"<tt class='module'>$THIS_MODULE</tt>"} = $platform;
     $platform = "Macintosh"
       if $platform eq 'Mac';
-    return "\n<p class=availability>Availability: <span"
-      . "\n class=platform>$platform</span>.</p>\n" . $_;
+    return "\n<p class='availability'>Availability: <span"
+      . "\n class='platform'>$platform</span>.</p>\n" . $_;
 }
 
 $IGNORE_PLATFORM_ANNOTATION = '';
@@ -353,7 +357,7 @@
 sub gen_link{
     my($node,$target) = @_;
     print INTLABELS "\$internal_labels{\"$target\"} = \"$URL/$node\";\n";
-    return "<a href=\"$node#$target\">";
+    return "<a href='$node#$target'>";
 }
 
 sub add_index_entry{
@@ -366,7 +370,7 @@
 
 sub new_link_info{
     my $name = "l2h-" . ++$globals{'max_id'};
-    my $aname = '<a name="' . $name . '">';
+    my $aname = "<a name='$name'>";
     my $ahref = gen_link($CURRENT_FILE, $name);
     return ($name, $aname, $ahref);
 }
@@ -483,7 +487,8 @@
 define_indexing_macro('bifuncindex');
 sub idx_cmd_bifuncindex{
     my $str = next_argument();
-    add_index_entry("<tt>$str()</tt> (built-in function)", @_[0]);
+    add_index_entry("<tt class='function'>$str()</tt> (built-in function)",
+                    @_[0]);
 }
 
 
@@ -499,7 +504,8 @@
 
     if ($define eq 'DEF') {
 	# add to the module index
-	my($nstr,$garbage) = split / /, $str, 2;
+        $str =~ /(<tt.*<\/tt>)/;
+        my $nstr = $1;
 	$Modules{$nstr} .= $ahref;
     }
     return "$aname$anchor_invisible_mark</a>";
@@ -522,7 +528,8 @@
     $THIS_MODULE = "$name";
     $INDEX_SUBITEM = "(in $name)";
     print "[$name]";
-    return make_mod_index_entry("<tt>$name</tt> (${word}module)", 'DEF');
+    return make_mod_index_entry(
+        "<tt class='module'>$name</tt> (${word}module)", 'DEF');
 }
 
 sub my_module_index_helper{
@@ -540,7 +547,7 @@
     local($word, $ahref) = @_;
     my $str = next_argument();
     $word = "$word " if $word;
-    $str = "<tt>$str</tt> (${word}module)";
+    $str = "<tt class='module'>$str</tt> (${word}module)";
     # can't use add_index_entry() since the 2nd arg to gen_index_id() is used;
     # just inline it all here
     $str = gen_index_id($str, 'REF');
@@ -575,27 +582,85 @@
     return "$aname$str</a>";
 }
 
+$REFCOUNTS_LOADED = 0;
+
+sub load_refcounts{
+    $REFCOUNTS_LOADED = 1;
+
+    use File::Basename;
+    my $myname, $mydir, $myext;
+    ($myname, $mydir, $myext) = fileparse(__FILE__, '\..*');
+    chop $mydir;			# remove trailing '/'
+    ($myname, $mydir, $myext) = fileparse($mydir, '\..*');
+    chop $mydir;			# remove trailing '/'
+    $mydir = getcwd() . "$dd$mydir"
+      unless $mydir =~ s|^/|/|;
+    local $_;
+    my $filename = "$mydir${dd}api${dd}refcounts.dat";
+    open(REFCOUNT_FILE, "<$filename") || die "\n$!\n";
+    print "[loading API refcount data]";
+    while (<REFCOUNT_FILE>) {
+        if (/([a-zA-Z0-9_]+):PyObject\*:([a-zA-Z0-9_]*):(0|[-+]1):(.*)$/) {
+            my($func, $param, $count, $comment) = ($1, $2, $3, $4);
+            #print "\n$func($param) --> $count";
+            $REFCOUNTS{"$func:$param"} = $count;
+        }
+    }
+}
+
+sub get_refcount{
+    my ($func, $param) = @_;
+    load_refcounts()
+        unless $REFCOUNTS_LOADED;
+    return $REFCOUNTS{"$func:$param"};
+}
+
 sub do_env_cfuncdesc{
     local($_) = @_;
     my $return_type = next_argument();
     my $function_name = next_argument();
     my $arg_list = next_argument();
-    my $idx = make_str_index_entry("<tt class=cfunction>$function_name()</tt>"
-				   . get_indexsubitem());
+    my $idx = make_str_index_entry(
+        "<tt class='cfunction'>$function_name()</tt>" . get_indexsubitem());
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;		# ????
+    my $result_rc = get_refcount($function_name, '');
+    my $rcinfo = '';
+    if ($result_rc eq '+1') {
+        $rcinfo = '<span class="label">Return value:</span>'
+                  . "\n  <span class=\"value\">New reference.</span>";
+    }
+    elsif ($result_rc eq '0') {
+        $rcinfo = '<span class="label">Return value:</span>'
+                  . "\n  <span class=\"value\">Borrowed reference.</span>";
+    }
+    if ($rcinfo ne '') {
+        $rcinfo = "\n<div class=\"refcount-info\">\n  $rcinfo\n</div>";
+    }
     return "<dl><dt>$return_type <b>$idx</b> (<var>$arg_list</var>)\n<dd>"
+           . $rcinfo
            . $_
            . '</dl>';
 }
 
+sub do_env_csimplemacrodesc{
+    local($_) = @_;
+    my $name = next_argument();
+    my $idx = make_str_index_entry("<tt class='macro'>$name</tt>");
+    return "<dl><dt><b>$idx</b>\n<dd>"
+           . $_
+           . '</dl>'
+}
+
 sub do_env_ctypedesc{
     local($_) = @_;
+    my $index_name = next_optional_argument();
     my $type_name = next_argument();
-    my $idx = make_str_index_entry("<tt class=ctype>$type_name</tt>"
-				   . get_indexsubitem());
-    $idx =~ s/ \(.*\)//;
-    return "<dl><dt><b>$idx</b>\n<dd>"
+    $index_name = $type_name
+      unless $index_name;
+    my($name,$aname,$ahref) = new_link_info();
+    add_index_entry("<tt class='ctype'>$index_name</tt> (C type)", $ahref);
+    return "<dl><dt><b><tt class='ctype'>$aname$type_name</a></tt></b>\n<dd>"
            . $_
            . '</dl>'
 }
@@ -604,7 +669,7 @@
     local($_) = @_;
     my $var_type = next_argument();
     my $var_name = next_argument();
-    my $idx = make_str_index_entry("<tt class=cdata>$var_name</tt>"
+    my $idx = make_str_index_entry("<tt class='cdata'>$var_name</tt>"
 				   . get_indexsubitem());
     $idx =~ s/ \(.*\)//;
     return "<dl><dt>$var_type <b>$idx</b>\n"
@@ -617,7 +682,7 @@
     local($_) = @_;
     my $function_name = next_argument();
     my $arg_list = next_argument();
-    my $idx = make_str_index_entry("<tt class=function>$function_name()</tt>"
+    my $idx = make_str_index_entry("<tt class='function'>$function_name()</tt>"
 				   . get_indexsubitem());
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)<\/tt>/<\/tt>/;
@@ -628,7 +693,7 @@
     local($_) = @_;
     my $function_name = next_argument();
     my $arg_list = next_argument();
-    return "<dl><dt><b><tt class=function>$function_name</tt></b>"
+    return "<dl><dt><b><tt class='function'>$function_name</tt></b>"
       . " (<var>$arg_list</var>)\n"
       . '<dd>'
       . $_
@@ -639,7 +704,7 @@
     local($_) = @_;
     my $function_name = next_argument();
     my $arg_list = next_argument();
-    my $prefix = "<tt class=function>$function_name()</tt>";
+    my $prefix = "<tt class='function'>$function_name()</tt>";
     my $idx = make_str_index_entry($prefix . get_indexsubitem());
     $prefix =~ s/\(\)//;
 
@@ -650,7 +715,7 @@
     local($_) = @_;
     my $function_name = next_argument();
     my $arg_list = next_argument();
-    my $prefix = "<tt class=function>$function_name</tt>";
+    my $prefix = "<tt class='function'>$function_name</tt>";
 
     return "<dt><b>$prefix</b> (<var>$arg_list</var>)\n<dd>" . $_;
 }
@@ -667,12 +732,12 @@
     my $arg_list = next_argument();
     my $idx;
     if ($INDEX_OPCODES) {
-	$idx = make_str_index_entry(
-		"<tt class=opcode>$opcode_name</tt> (byte code instruction)");
+	$idx = make_str_index_entry("<tt class='opcode'>$opcode_name</tt>"
+                                    . " (byte code instruction)");
 	$idx =~ s/ \(byte code instruction\)//;
     }
     else {
-	$idx = "<tt class=opcode>$opcode_name</tt>";
+	$idx = "<tt class='opcode'>$opcode_name</tt>";
     }
     my $stuff = "<dl><dt><b>$idx</b>";
     if ($arg_list) {
@@ -711,7 +776,7 @@
 sub do_env_excdesc{
     local($_) = @_;
     my $excname = next_argument();
-    my $idx = make_str_index_entry("<tt class=exception>$excname</tt>");
+    my $idx = make_str_index_entry("<tt class='exception'>$excname</tt>");
     return "<dl><dt><b>$idx</b>\n<dd>" . $_ . '</dl>'
 }
 
@@ -723,7 +788,7 @@
     $THIS_CLASS = next_argument();
     my $arg_list = next_argument();
     $idx = make_str_index_entry(
-		"<tt class=class>$THIS_CLASS</tt> (class in $THIS_MODULE)" );
+		"<tt class='class'>$THIS_CLASS</tt> (class in $THIS_MODULE)" );
     $idx =~ s/ \(.*\)//;
     return "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>" . $_ . '</dl>';
 }
@@ -740,7 +805,7 @@
     if ($class_name) {
 	$extra = " ($class_name method)";
     }
-    my $idx = make_str_index_entry("<tt class=method>$method()</tt>$extra");
+    my $idx = make_str_index_entry("<tt class='method'>$method()</tt>$extra");
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;
     return "<dl><dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>" . $_ . '</dl>';
@@ -758,7 +823,7 @@
     if ($class_name) {
 	$extra = " ($class_name method)";
     }
-    my $idx = make_str_index_entry("<tt class=method>$method()</tt>$extra");
+    my $idx = make_str_index_entry("<tt class='method'>$method()</tt>$extra");
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;
     return "<dt><b>$idx</b> (<var>$arg_list</var>)\n<dd>"
@@ -795,7 +860,7 @@
     my $extra = '';
     $extra = " ($class attribute)"
         if ($class ne '');
-    my $idx = make_str_index_entry("<tt class=member>$member</tt>$extra");
+    my $idx = make_str_index_entry("<tt class='member'>$member</tt>$extra");
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;
     return "<dl><dt><b>$idx</b>\n<dd>" . $_ . '</dl>';
@@ -811,7 +876,7 @@
     my $extra = '';
     $extra = " ($class attribute)"
         if ($class ne '');
-    my $idx = make_str_index_entry("<tt class=member>$member</tt>$extra");
+    my $idx = make_str_index_entry("<tt class='member'>$member</tt>$extra");
     $idx =~ s/ \(.*\)//;
     $idx =~ s/\(\)//;
     return "<dt><b>$idx</b><dd>" . $_;
@@ -821,7 +886,9 @@
     local($_) = @_;
     next_optional_argument();
     my $member = next_argument();
-    return "<dl><dt><b><tt class=member>$member</tt></b>\n<dd>" . $_ . '</dl>';
+    return "<dl><dt><b><tt class='member'>$member</tt></b>\n<dd>"
+           . $_
+           . '</dl>';
 }
 
 
@@ -829,25 +896,13 @@
     local($_) = @_;
     next_optional_argument();
     my $member = next_argument();
-    return "<dt><b><tt class=member>$member</tt></b><dd>" . $_;
+    return "<dt><b><tt class='member'>$member</tt></b><dd>" . $_;
 }
 
-@col_aligns = ("<td>", "<td>", "<td>", "<td>");
+@col_aligns = ('<td>', '<td>', '<td>', '<td>');
 
 $TABLE_HEADER_BGCOLOR = $NAV_BGCOLOR;
 
-sub get_th{
-    my $a = @_[0];
-    my $r = '<th>';
-    if ($a eq 'l')
-      { $r = '<th align=left>'; }
-    elsif (substr($a, 0, 1) eq 'p')
-      { $r = '<th align=left>'; }
-    elsif ($a eq 'r')
-      { $r = '<th align=right>'; }
-    return $r;
-}
-
 sub fix_font{
     # do a little magic on a font name to get the right behavior in the first
     # column of the output table
@@ -856,22 +911,53 @@
 	$font = '';
     }
     elsif ($font eq 'file' || $font eq 'filenq') {
-	$font = 'tt class=file';
+	$font = 'tt class="file"';
+    }
+    elsif ($font eq 'member') {
+        $font = 'tt class="member"';
     }
     return $font;
 }
 
+sub figure_column_alignment{
+    my $a = @_[0];
+    my $mark = substr($a, 0, 1);
+    my $r = '';
+    if ($mark eq 'c')
+      { $r = ' align="center"'; }
+    elsif ($mark eq 'r')
+      { $r = ' align="right"'; }
+    elsif ($mark eq 'l')
+      { $r = ' align="left"'; }
+    elsif ($mark eq 'p')
+      { $r = ' align="left"'; }
+    return $r;
+}
+
 sub setup_column_alignments{
     local($_) = @_;
-    my($a1,$a2,$a3,$a4) = split(/[|]/,$_);
-    my($th1,$th2,$th3,$th4) = ('<th>', '<th>', '<th>', '<th>');
-    $col_aligns[0] = (($a1 eq 'c') ? '<td align=center valign=baseline>'
-		                   : '<td valign=baseline>');
-    $col_aligns[1] = (($a2 eq 'c') ? '<td align=center>' : '<td>');
-    $col_aligns[2] = (($a3 eq 'c') ? '<td align=center>' : '<td>');
-    $col_aligns[3] = (($a4 eq 'c') ? '<td align=center>' : '<td>');
+    my($s1,$s2,$s3,$s4) = split(/[|]/,$_);
+    my $a1 = figure_column_alignment($s1);
+    my $a2 = figure_column_alignment($s2);
+    my $a3 = figure_column_alignment($s3);
+    my $a4 = figure_column_alignment($s4);
+    $col_aligns[0] = "<td$a1 valign=\"baseline\">";
+    $col_aligns[1] = "<td$a2>";
+    $col_aligns[2] = "<td$a3>";
+    $col_aligns[3] = "<td$a4>";
     # return the aligned header start tags
-    return (get_th($a1), get_th($a2), get_th($a3), get_th($a4));
+    return ("<th$a1>", "<th$a2>", "<th$a3>", "<th$a4>");
+}
+
+sub get_table_col1_fonts{
+    my $font = $globals{'lineifont'};
+    my ($sfont,$efont) = ('', '');
+    if ($font) {
+        $sfont = "<$font>";
+        $efont = "</$font>";
+        $efont =~ s/ .*>/>/;
+    }
+    return ($font, $sfont, $efont);
 }
 
 sub do_env_tableii{
@@ -882,32 +968,36 @@
     my $h2 = next_argument();
     s/[\s\n]+//;
     $globals{'lineifont'} = $font;
-    return '<table border align=center style="border-collapse: collapse">'
+    my $a1 = $col_aligns[0];
+    my $a2 = $col_aligns[1];
+    s/\\lineii</\\lineii[$a1|$a2]</g;
+    return '<table border align="center" style="border-collapse: collapse">'
            . "\n  <thead>"
            . "\n    <tr$TABLE_HEADER_BGCOLOR>"
-	   . "\n      $th1<b>$h1</b>\&nbsp;\&nbsp;</th>"
-	   . "\n      $th2<b>$h2</b>\&nbsp;\&nbsp;</th>"
+	   . "\n      $th1<b>$h1</b>\&nbsp;</th>"
+	   . "\n      $th2<b>$h2</b>\&nbsp;</th>"
 	   . "\n    </thead>"
-	   . "\n  <tbody valign=baseline>"
-	   . $_
+	   . "\n  <tbody valign='baseline'>"
+           . $_
 	   . "\n    </tbody>"
 	   . "\n</table>";
 }
 
 sub do_cmd_lineii{
     local($_) = @_;
+    my $aligns = next_optional_argument();
     my $c1 = next_argument();
     my $c2 = next_argument();
     s/[\s\n]+//;
-    my($font,$sfont,$efont) = ($globals{'lineifont'}, '', '');
-    if ($font) {
-	$sfont = "<$font>";
-	$efont = "</$font>";
-	$efont =~ s/ .*>/>/;
+    my($font,$sfont,$efont) = get_table_col1_fonts();
+    $c2 = '&nbsp;' if ($c2 eq '');
+    my($c1align,$c2align) = split('\|', $aligns);
+    my $padding = '';
+    if ($c1align =~ /align="right"/) {
+        $padding = '&nbsp;';
     }
-    my($c1align,$c2align) = @col_aligns[0,1];
-    return "\n    <tr>$c1align$sfont$c1$efont</td>\n"
-           . "        $c2align$c2\&nbsp;</td>"
+    return "\n    <tr>$c1align$sfont$c1$efont$padding</td>\n"
+           . "        $c2align$c2</td>"
 	   . $_;
 }
 
@@ -920,14 +1010,18 @@
     my $h3 = next_argument();
     s/[\s\n]+//;
     $globals{'lineifont'} = $font;
-    return '<table border align=center style="border-collapse: collapse">'
+    my $a1 = $col_aligns[0];
+    my $a2 = $col_aligns[1];
+    my $a3 = $col_aligns[2];
+    s/\\lineiii</\\lineiii[$a1|$a2|$a3]</g;
+    return '<table border align="center" style="border-collapse: collapse">'
            . "\n  <thead>"
            . "\n    <tr$TABLE_HEADER_BGCOLOR>"
-	   . "\n      $th1<b>$h1</b>\&nbsp;\&nbsp;</th>"
-	   . "\n      $th2<b>$h2</b>\&nbsp;\&nbsp;</th>"
-	   . "\n      $th3<b>$h3</b>\&nbsp;\&nbsp;</th>"
+	   . "\n      $th1<b>$h1</b>\&nbsp;</th>"
+	   . "\n      $th2<b>$h2</b>\&nbsp;</th>"
+	   . "\n      $th3<b>$h3</b>\&nbsp;</th>"
 	   . "\n    </thead>"
-	   . "\n  <tbody valign=baseline>"
+	   . "\n  <tbody valign='baseline'>"
 	   . $_
 	   . "\n    </tbody>"
 	   . "\n</table>";
@@ -935,20 +1029,21 @@
 
 sub do_cmd_lineiii{
     local($_) = @_;
+    my $aligns = next_optional_argument();
     my $c1 = next_argument();
     my $c2 = next_argument(); 
     my $c3 = next_argument();
     s/[\s\n]+//;
-    my($font,$sfont,$efont) = ($globals{'lineifont'}, '', '');
-    if ($font) {
-	$sfont = "<$font>";
-	$efont = "</$font>";
-	$efont =~ s/ .*>/>/;
+    my($font,$sfont,$efont) = get_table_col1_fonts();
+    $c3 = '&nbsp;' if ($c3 eq '');
+    my($c1align,$c2align,$c3align) = split('\|', $aligns);
+    my $padding = '';
+    if ($c1align =~ /align="right"/) {
+        $padding = '&nbsp;';
     }
-    my($c1align,$c2align,$c3align) = @col_aligns[0,1,2];
-    return "\n    <tr>$c1align$sfont$c1$efont</td>\n"
+    return "\n    <tr>$c1align$sfont$c1$efont$padding</td>\n"
            . "        $c2align$c2</td>\n"
-	   . "        $c3align$c3\&nbsp;</td>"
+	   . "        $c3align$c3</td>"
 	   . $_;
 }
 
@@ -962,15 +1057,20 @@
     my $h4 = next_argument();
     s/[\s\n]+//;
     $globals{'lineifont'} = $font;
-    return '<table border align=center style="border-collapse: collapse">'
+    my $a1 = $col_aligns[0];
+    my $a2 = $col_aligns[1];
+    my $a3 = $col_aligns[2];
+    my $a4 = $col_aligns[3];
+    s/\\lineiv</\\lineiv[$a1|$a2|$a3|$a4]</g;
+    return '<table border align="center" style="border-collapse: collapse">'
            . "\n  <thead>"
            . "\n    <tr$TABLE_HEADER_BGCOLOR>"
-	   . "\n      $th1<b>$h1</b>\&nbsp;\&nbsp;</th>"
-	   . "\n      $th2<b>$h2</b>\&nbsp;\&nbsp;</th>"
-	   . "\n      $th3<b>$h3</b>\&nbsp;\&nbsp;</th>"
-	   . "\n      $th4<b>$h4</b>\&nbsp;\&nbsp;</th>"
+	   . "\n      $th1<b>$h1</b>\&nbsp;</th>"
+	   . "\n      $th2<b>$h2</b>\&nbsp;</th>"
+	   . "\n      $th3<b>$h3</b>\&nbsp;</th>"
+	   . "\n      $th4<b>$h4</b>\&nbsp;</th>"
 	   . "\n    </thead>"
-	   . "\n  <tbody valign=baseline>"
+	   . "\n  <tbody valign='baseline'>"
 	   . $_
 	   . "\n    </tbody>"
 	   . "\n</table>";
@@ -978,28 +1078,29 @@
 
 sub do_cmd_lineiv{
     local($_) = @_;
+    my $aligns = next_optional_argument();
     my $c1 = next_argument();
     my $c2 = next_argument(); 
     my $c3 = next_argument();
     my $c4 = next_argument();
     s/[\s\n]+//;
-    my($font,$sfont,$efont) = ($globals{'lineifont'}, '', '');
-    if ($font) {
-	$sfont = "<$font>";
-	$efont = "</$font>";
-	$efont =~ s/ .*>/>/;
+    my($font,$sfont,$efont) = get_table_col1_fonts();
+    $c4 = '&nbsp;' if ($c4 eq '');
+    my($c1align,$c2align,$c3align,$c4align) = split('\|', $aligns);
+    my $padding = '';
+    if ($c1align =~ /align="right"/) {
+        $padding = '&nbsp;';
     }
-    my($c1align,$c2align,$c3align,$c4align) = @col_aligns;
-    return "\n    <tr>$c1align$sfont$c1$efont</td>\n"
+    return "\n    <tr>$c1align$sfont$c1$efont$padding</td>\n"
            . "        $c2align$c2</td>\n"
 	   . "        $c3align$c3</td>\n"
-	   . "        $c4align$c4\&nbsp;</td>"
+	   . "        $c4align$c4</td>"
 	   . $_;
 }
 
 sub do_cmd_maketitle {
     local($_) = @_;
-    my $the_title = "\n<div class=titlepage><center>";
+    my $the_title = "\n<div class='titlepage'><center>";
     if ($t_title) {
 	$the_title .= "\n<h1>$t_title</h1>";
     } else { write_warnings("\nThis document has no title."); }
@@ -1125,8 +1226,8 @@
 #
 
 sub do_env_seealso{
-    return "<div class=seealso>\n  "
-      . "<p class=heading><b>See Also:</b></p>\n"
+    return "<div class='seealso'>\n  "
+      . "<p class='heading'><b>See Also:</b></p>\n"
       . @_[0]
       . '</div>';
 }
@@ -1144,8 +1245,8 @@
     if ($text =~ /\.$/) {
 	$period = '';
     }
-    return '<dl compact class=seemodule>'
-      . "\n    <dt>Module <b><tt class=module><a href=\"module-$key.html\">"
+    return '<dl compact class="seemodule">'
+      . "\n    <dt>Module <b><tt class='module'><a href='module-$key.html'>"
       . "$module</a></tt>:</b>"
       . "\n    <dd>$text$period\n  </dl>"
       . $_;
@@ -1154,7 +1255,7 @@
 sub do_cmd_seetext{
     local($_) = @_;
     my $content = next_argument();
-    return '<div class=seetext><p>' . $content . '</div>' . $_;
+    return '<div class="seetext"><p>' . $content . '</div>' . $_;
 }
 
 
@@ -1164,7 +1265,7 @@
 
 sub do_env_definitions{
     local($_) = @_;
-    return "<dl class=definitions>$_</dl>\n";
+    return "<dl class='definitions'>$_</dl>\n";
 }
 
 sub do_cmd_term{