Ilya Zakharevich on Wed, 28 Feb 2001 20:50:26 -0500


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

[PATCH] Better PODs


I think this patch fixes 95% of remaining problems with quasi-parsing
of TeX in PARI docs.  It also supports a new kind of output: "dumb
POD".  [It looks like the "standard" pod2whatever converters are too
dumb to support feature-rich POD.] 

I also added new make targets, .html files.  I tried `make
tutorial.html', and it is almost usable - though I used pretty old pod2html.

Enjoy,
Ilya

P.S.  I found two errors in TeX: Docs for subst include \smallskip in
      a verbatim section, and "Integration the hard way" includes \cbr
      in what I think is not an appropriate place.

--- ./doc/gphelp.in	Fri Feb  2 14:45:58 2001
+++ ./doc/gphelp.in-new	Sun Feb 11 03:37:38 2001
@@ -35,6 +35,8 @@
 #
 #  -to_pod file		convert file to POD (should be the only args)
 #
+#  -to_dumbpod file	same, but without nested formating
+#
 # Granted environment variables (override):
 #  GPTMPDIR: where temporary files will go (/tmp by default).
 #  GPDOCDIR: where is manual (by default, where make install will put it).
@@ -56,7 +58,9 @@ $gzip = "gzip";
 $zcat = "$gzip -dc";
 
 $refcard = (@ARGV and $ARGV[-1] =~ /refcard/i);
-&to_pod() if @ARGV == 2 && $ARGV[0] eq '-to_pod'; 
+
+$dumb_pod=1, $ARGV[0] = '-to_pod' if @ARGV && $ARGV[0] eq '-to_dumb_pod';
+&to_pod() if @ARGV == 2 && $ARGV[0] eq '-to_pod';
 
 &options(); &init();
 if ($#ARGV < 0) { &treat($_); cleanexit(); }
@@ -77,7 +81,7 @@ cleanexit();
 # Procedures
 #
 sub cleanexit {
-  print "\e[0m";
+  print "\e[0m" unless $to_pod;
   exit 0;
 }
 
@@ -555,28 +559,37 @@ sub detex
 
 # We use the special char @ to transmit special sequences
 sub inittr {
-  @ou = qw( dollar nbrk startbold endbold startcode endcode 
+  @ou = qw( dollar nbrk startbold endbold startcode endcode
+	    obr cbr uuml ouml agrave eacute
 	    startpodcode endpodcode startlink endlink
 	    startbcode endbcode startbi endbi startit endit
 	    startword endword startlword endlword pm empty gt lt podleader );
 
   @tr{@ou} = map "\@[$_]", @ou;
   $tr{dollar} = '$' if $to_pod;
-  
+
   %pr = ( dollar => '',
-	  nbrk => 'S< >', 
+	  ldollar => '$',	# literal dollar
+	  nbrk => 'S< >',
 	  startbold => 'B<',
 	  endbold => '>',
 	  startcode => 'C<',
 	  startlink => 'L<',
 	  endlink => '>',
 	  endcode => '>',
+	  obr => '{',
+	  cbr => '}',
 	  startpodcode => 'C<',
 	  endpodcode => '>',
-	  startbcode => 'B<C<',
-	  endbcode => '>>',
-	  startbi => 'B<I<',
-	  endbi => '>>',
+	  ( $dumb_pod
+	    ? (startbcode => 'B<',
+	       endbcode => '>',
+	       startbi => 'B<',
+	       endbi => '>',)
+	    : (startbcode => 'B<C<',
+	       endbcode => '>>',
+	       startbi => 'B<I<',
+	       endbi => '>>')),
 	  startit => 'I<',
 	  endit => '>',
 	  startword => 'F<',
@@ -586,23 +599,42 @@ sub inittr {
 	  pm => 'F<+->',
 	  "gt" => 'E<gt>',
 	  "lt" => 'E<lt>',
+	  ouml => 'E<ouml>',
+	  uuml => 'E<uuml>',
+	  eacute => 'E<eacute>',
+	  agrave => 'E<agrave>',
 	  empty => 'Z<>',
 	  podleader => '=',
 	);
 }
 
+sub indent_equally { my $in = shift; $in =~ s/^[ \t]*/    /mg; $in}
+
 sub basic_subst
 {
   local($_) = shift;
 
-  s/([^\\])\\\{/$1`lBrAcE'/g;
-  s/([^\\])\\\}/$1`rBrAcE'/g;
-  s/\A\\q?quad\s+/$tr{nbrk}$tr{nbrk}/;
+  s/(\S)[ \t]*\n[ \t]+/$1\n/gm;
+  s/([^\\])\\\{/$1$tr{obr}/g;
+  s/([^\\])\\\}/$1$tr{cbr}/g;
+  s/([^\\])\\-/$1/g;
+  s/\A\\q?quad(?![a-zA-Z])\s*/$tr{nbrk}$tr{nbrk}/;
   s|\\wwwsite|$wwwsite|g;
   s|\\miscdir|$miscdir|g;
   s/^\\def\\.*\{\n.*\n\}//gm;
   s/\\def\\.*//g;
+  s(\\footnote\s*\{?\*+\}?\s*\{\s*((?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*)\})
+    {$tr{startbold}FOOTNOTE$tr{endbold}$tr{lt}$tr{lt}$tr{lt} $1 $tr{gt}$tr{gt}$tr{gt}}g;
   s/(\{[\w\s]+)\{\}([\s\w]+\})/$1$2/g;	# {nf{}init}
+  s(\\op(?![a-zA-Z])\s*)({\\it op\\/})g;	# {nf{}init}
+  s/\\(leavevmode|strut)(?![a-zA-Z])\s*//g;
+  s/ \\funno \s*
+     { \s* ((?:[^{}]|\{[^{}]*\})*) } \s*
+     { \s* ((?:[^{}]|\{[^{}]*\})*) } \s*
+     { \s* ((?:[^{}]|\{[^{}]*\})*) }
+   /\\noindent{\\tt $1 \$\\key{$2}\$($3)}/gx;
+  s/\\funs\s*\{((?:[^{}]|\{[^{}]*\})*)\}\s*\{((?:[^{}]|\{[^{}]*\})*)\}/\\fun{}{$1}{$2}/g;
+  s/\\fun\s*\{([^{}]*)\}\s*\{((?:[^{}]|\{[^{}]*\})*)\}\s*\{((?:[^{}]|\{[^{}]*\})*)\}/\\kbd{$1 \\key{$2}($3)}\\sidx{$2}/g;
 
   s/\\\\(?=[a-zA-Z])/\\bs /g;
   s/\\b{}\\b{}/\\bs\\bs /g;
@@ -617,8 +649,18 @@ sub basic_subst
   s/\\(~|tilde)/~/g;
 
   s/\\(equiv)(?![a-zA-Z])/ = /g;
+  s/\\`a/$tr{agrave}/;
+  s/\\`{a}/$tr{agrave}/;
+  s/\\"o/$tr{ouml}/;
+  s/\\"{o}/$tr{ouml}/;
+  s/\\"u/$tr{uuml}/;
+  s/\\"{u}/$tr{uuml}/;
+  s/\\'e/$tr{eacute}/;
+  s/\\'{e}/$tr{eacute}/;
 
   s/(^|[^\\])%.*/$1/g;		        # comments
+  s/\\vadjust\s*\{\s*\\penalty\s*\d+\s*\}//g;
+
   # We do not strip %\n, thus:
   s/\\kbd{\n\s*/\\kbd{/g;
   s/\$\\bf(\b|(?=[\d_]))\s*([^\$]+)\$/\$$tr{startbcode}$1$tr{endbcode}\$/g;
@@ -631,6 +673,9 @@ sub basic_subst
   s/\\TeX(\W)/TeX$1/g;
   s/ *\\circ\b */ o /g;
   s/\\d?frac{\s*((?:[^{}]|\{[^{}]*\})*)}{\s*((?:[^{}]|\{[^{}]*\})*)}/($1)\/($2)/g;
+  s(\\d?frac\s*(\d)\s*(\d))(($1/$2))g;
+  s[{\s*(\w)\s*\\over(?![a-zA-Z])\s*(\w)\s*}]{($1/$2)}g;
+  s[{\s*((?:[^{}]|\{[^{}]*\})*)\\over(?![a-zA-Z])\s*((?:[^{}]|\{[^{}]*\})*)}][($1)/($2)]g;
 
   # \def\synt#1#2{\syn{#1}{\tt #2}}
   # \def\syn#1#2{\synx{#1}{#2}{#1}}
@@ -642,7 +687,6 @@ sub basic_subst
   # May be used with an empty arg
   s/\\typ\{([^\}]*)\}/$tr{startcode}t_$1$tr{endcode}/g;
 
-  s/\{ *\}//g;			# empty args
   s/(\\string)?\\_/_/g;
   s/\\([#\$&%|])/$1/g;
   s/\\(hat(?![a-zA-Z])|\^)({\\?\s*})?/^/g;
@@ -651,12 +695,12 @@ sub basic_subst
   s/\\neq?(?![a-zA-Z])/ != /g;
   s/\\enspace(?![a-zA-Z])/ /g;
   s/\\times(?![a-zA-Z]) */ x /g;
-  s/\\infty(?![a-zA-Z]) */oo /g;
+  s/\\infty(?![a-zA-Z]) */ oo /g;
   s/ *\\(bmod|mod) */ mod /g;
   s/ *\\pmod(?![a-zA-Z]) *\{\s*((?:[^{}]|\{[^{}]*\})*)\}/ (mod $1)/g;
   s/ *\\cdot(?![a-zA-Z]) */./g;		# Maybe " . "?
   s/ *(\\|\@)[lc]?dots(?![a-zA-Z]) */.../g;
-  s/\\(log|sin|cos|lim|tan|mod|sqrt|exp|ln|det|Re|Im|deg|wp)(?![a-zA-Z])/$tr{startlword}$1$tr{endlword}/g;
+  s/\\(log|sin|cos|lim(proj)?|tan|mod|sqrt|exp|ln|det|Re|Im|deg|wp|cap|oplus)(?![a-zA-Z])/$tr{startlword}$1$tr{endlword}/g;
   s/\\pi(?![a-zA-Z])/$tr{startword}Pi$tr{endword}/g;
   s/\\(Alpha | Beta | Chi | Delta | Epsilon | Phi | Gamma
        | Eta | Iota | vartheta | Kappa | Lambda | Mu | Nu | Omicron
@@ -675,39 +719,42 @@ sub basic_subst
   s/\\ref\{[^\}]*\}/$tr{startbold}??$tr{endbold}/g unless $to_pod;
   s/\\secref\{[^\}]*\}/Section ($tr{startbold}??$tr{endbold})/g unless $to_pod;
   s/\\label\{[^\}]*\}//g unless $to_pod;
-  s/\\rightarrow(?![a-zA-Z])/C<--E<gt>>/g;
-  s/\\longleftrightarrow(?![a-zA-Z])/C<E<lt>-----E<gt>>/g;
 
   s/\\(noindent|medskip|bigskip|smallskip|left|right)(?![a-zA-Z])[ \t]*//g;
-  s/\\vfill *\\eject//g;
-  s/\\(q|quad)(?![a-zA-Z])/  /g; 
-  s/\\qquad(?![a-zA-Z])/    /g; 
-  s/\\centerline\s*\{\s*(?:\\tt\b\s*)?(.*(\n[ \t].*)*)\}(?=\s*$)/    $1/g;
-  s/\\centerline\s*\{\s*(?:\\tt\b\s*)?((?:[^{}]|\{[^{}]*\})*)\}/    $1/g;
+  s/\\vfill *(\\eject)?//g;
+  s/\\(q|quad)(?![a-zA-Z])\s*/  /g;
+  s/\\qquad(?![a-zA-Z])\s*/    /g;
+
+  s/\\centerline\s*\{\s*(?:\\tt\b\s*)?(.*(\n[ \t].*)*)\}(?=\s*$)/indent_equally($1)/ge;
+  s/\\centerline\s*\{\s*(?:\\tt\b\s*)?((?:[^{}]|\{[^{}]*\})*)\}/ indent_equally($1)/ge;
+
   s/\\big\b//g;
 
-  s/\\settabs.*//; 
+  s/\\settabs.*//;
   s/^\\\+/$tr{nbrk}/gm;
   s/\\\+//g;
   s/\\cr(?![a-zA-Z])//g;
   s/\\B(?![a-zA-Z])/\\kbd{BIL}/g;
-  s/\\funs\s*\{((?:[^{}]|\{[^{}]*\})*)\}\s*\{((?:[^{}]|\{[^{}]*\})*)\}/\\fun{}{$1}{$2}\\sidx{$2}/g;
-  s/\\fun\s*\{([^{}]*)\}\s*\{((?:[^{}]|\{[^{}]*\})*)\}\s*\{((?:[^{}]|\{[^{}]*\})*)\}/\\kbd{$1 \\key{$2}($3)}\\sidx{$2}/g;
 
-  s/ *\\leq?(?![a-zA-Z]) *([^ ])/<=$1/g;
-  s/ *\\geq?(?![a-zA-Z]) *([^ ])/>=$1/g;
   s/ *([=><]) */ $1 /g;
   s/ *<  *([=<]) */ <$1 /g;
   s/ *>  *([=>]) */ >$1 /g;
   s/ *([*+-\/^&=|:]) += */ $1= /g;
-  s/ *\\Rightarrow */ ==> /g;
+  s/ *\\Rightarrow */ ==$tr{gt} /g;
+  s/\\rangle(?![a-zA-Z])\s*/$tr{startcode}$tr{gt}$tr{endcode}/g;
+  s/\\langle(?![a-zA-Z])\s*/$tr{startcode}$tr{lt}$tr{endcode}/g;
+  s/\\rightarrow(?![a-zA-Z])\s*/$tr{startcode}--$tr{gt}$tr{endcode}/g;
+  s/\\longleftrightarrow(?![a-zA-Z])\s*/$tr{startcode}$tr{lt}-----$tr{gt}$tr{endcode}/g;
+  s/\\mapsto(?![a-zA-Z])\s*/$tr{startcode}|---$tr{gt}$tr{endcode}/g;
+  s/ *\\geq?(?![a-zA-Z]) *([^ ])/ $tr{startcode}$tr{gt}=$tr{endcode} $1/g;
+  s/ *\\leq?(?![a-zA-Z]) *([^ ])/ $tr{startcode}$tr{lt}=$tr{endcode} $1/g;
 
   s/\\(vers|PARIversion)(?![a-zA-Z])/$tr{startbold}$version$tr{endbold}/;
   s/\\([QRCFZNapdf])(?![a-zA-Z])/$tr{startbi}$1$tr{endbi}$2/g;
   s/\\([QRCFZN])\1(?![a-zA-Z])/$tr{startbi}$1$tr{endbi}$2/g;
   s/\\Bbb\b\s*(\w)/$tr{startbi}$1$tr{endbi}/g;
 
-  s/\\obr/{/g; s/\\cbr/}/g;
+  s/\\([oc]br)/$tr{$1}/g;
   s/\\quo(?![a-zA-Z])/\"/g;
   s/(^|\s)\{(\w+)\}/$1$2/g;
 
@@ -719,16 +766,16 @@ sub basic_subst
   s/\\teb\{([^\}]*)\}/\\sidx{$1}$tr{startbold}$1$tr{endbold}/g;
   s/\\tet\{([^\}]*)\}/\\sidx{$1}$tr{startcode}$1$tr{endcode}/g;
   s/\\tev\{([^\}]*)\}/\\sidx{$1}$tr{startit}$1$tr{endit}/g;
-  s/\\kbd\{((?:[^{}]|\{[^{}]*\})*)\}/$tr{startcode}$1$tr{endcode}/g;
+  s/\\\$/$tr{ldollar}/g;
+  s/\\kbd\s*\{\s*</\\kbd{$tr{lt}/g if $to_pod;
+  s/\\kbd\s*\{\s*>/\\kbd{$tr{gt}/g if $to_pod;
+  s/\\kbd\s*\{((?:[^{}]|\{[^{}]*\})*)\}/$tr{startcode}$1$tr{endcode}/g;
 
-  s/\\key\{([^\}]*)\}/$tr{startbold}$1$tr{endbold}/g unless $refcard;
+  s/\\key\{((?:[^{}]|\{[^{}]*\})*)\}/$tr{startbold}$1$tr{endbold}/g unless $refcard;
 
-#  s/\\(?:key|li)\s*{(.*)}\s*{(.+)}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/msg;
-#  s/\\(?:key|li)\s*{(.*)}\s*{}[ \t]*\n/\n\n=back\n\n$1\n\n=over\n\n/mgs;
-#  s/\\(key|var)(?![a-zA-Z])\s*{(\w+)}/C<$2>/mg;
   if ($refcard) {
-    s/\\(?:key|li)\{((?:[^{}]+(?=[{}])|\{[^{}]+\})*)\}\s*\{\}[ \t]*\n/\n\n=back\n\n$1\n\n=over\n\n/g if $refcard;
-    s/\\(?:key|li)\{((?:[^{}]+(?=[{}])|\{[^{}]+\})*)\}\s*\{(([^{}]+(?=[{}])|\{[^{}]+\})*)\}/\n=item C<$2>\n\n$1\n/g if $refcard;
+    s/\\(?:key|li)\{((?:[^{}]+(?=[{}])|\{[^{}]*\})*)\}\s*\{\}[ \t]*\n/\n\n=back\n\n$1\n\n=over\n\n/g;
+    s/\\(?:key|li)\{((?:[^{}]+(?=[{}])|\{[^{}]*\})*)\}\s*\{(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/\n=item $tr{startcode}$2$tr{endcode}\n\n$1\n/g;
   }
 
   s/\\var\{([^\}]*)\}/$tr{startit}$1$tr{endit}/g;
@@ -737,11 +784,12 @@ sub basic_subst
   s/\\kbdsidx/\\sidx/g;
   s/\\sidx\{[^\}]*\}//g unless $to_pod;
   s/\\[a-zA-Z]*idx\{([^\}]*)\}/$1/g unless $to_pod;
-  s/\\(?:text|hbox)\s*\{ *(?:\\it\b\s*)?(([^{}]+(?=[{}])|\{[^{}]+\})*)\}/$1/g;
+  s/\\(?:text|hbox)\s*\{ *(?:\\it\b\s*)?(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$1/g;
   s/\\(text|hbox)//g;
-  s/\{ *\\(it|sl) *(([^{}]+(?=[{}])|\{[^{}]+\})*)\}/$tr{startit}$2$tr{endit}/g;
-  s/\{ *\\bf *(([^{}]+(?=[{}])|\{[^{}]+\})*)\}/$tr{startbold}$1$tr{endbold}/g;
-  s/\{ *\\tt *(([^{}]+(?=[{}])|\{[^{}]+\})*)\}/$tr{startpodcode}$1$tr{endpodcode}/g;
+  s/^([ \t]+)\{ *\\(it|sl|bf|tt)\b/S<$1>{\\$2/gm;
+  s/\{ *\\(it|sl) *(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$tr{startit}$2$tr{endit}/g;
+  s/\{ *\\bf *(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$tr{startbold}$1$tr{endbold}/g;
+  s/\{ *\\tt *(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$tr{startpodcode}$1$tr{endpodcode}/g;
   $seek=1 if (s/\{ *\\it */$tr{startit}/g);
   if ($seek) { $seek=0 if (s/\}/$tr{endit}/) }
   s/\\(backslash|bs)\{(\w)\}/\\$2/g;
@@ -750,16 +798,15 @@ sub basic_subst
   s/\@com(.*)$/$tr{startcode}$1$tr{endcode}/g;
 
   # Last resort:
-  s/\\kbd\{(.*?)\}/$tr{startcode}$1$tr{endcode}/g;
+  s/\\kbd\s*\{(.*?)\}/$tr{startcode}$1$tr{endcode}/g;
   s/^([ \t]{3,})\Q$tr{startcode}\E(.*)\Q$tr{endcode}\E/$1$2/gmo if $to_pod;
   # Last resort:
   s/^([ \t]{3,})\Q$tr{startcode}\E(.*?)\Q$tr{endcode}\E/$1$2/gmso if $to_pod;
   # Remove leading spaces unless have embedded wrapped code:
   s/^[ \t]+//gm if $to_pod and /^\S/ and not /^[ \t]*\n[ \t]/m;
-  s/`lBrAcE'/\\{/g;
-  s/`rBrAcE'/\\}/g;
+  s/\{ *\}//g;			# empty args
 
-  s{\Q$tr{startcode}\E(?=(ftp|http)://)}{$tr{startlink}}go if $to_pod;
+  s{\Q$tr{startcode}\E((ftp|http)://.*?)\Q$tr{endcode}\E}{$tr{startlink}$1$tr{endlink}}go if $to_pod;
   $_;
 }
 
@@ -788,14 +835,22 @@ sub code_subst {
   my $in = shift;
   $in =~ s/\@dots\b/.../g;
   $in =~ s/\@miscdir\b/$miscdir/g;
-  if ($in =~ /\@com/)
+  if ($in =~ /\@com(.*)/)
   {
-    $in = $` . $tr{endcode} . &basic_subst($') . $tr{startcode};
+    if ($to_pod) {
+      $in = $` . &basic_subst($1) . code_subst($');
+    } else {
+      $in = $` . $tr{endcode} . &basic_subst($1) . $tr{startcode} . code_subst($');
+    }
   }
   if ($in =~ /\@Ccom(.*)\*\//)
   {
-    $in = $` . $tr{endcode} . &basic_subst($1) . $tr{startcode}
-                                               . "*/" . &code_subst($');
+    if ($to_pod) {
+      $in = $` .		&basic_subst($1) . "*/" . &code_subst($');
+    } else {
+      $in = $` . $tr{endcode} . &basic_subst($1) . $tr{startcode}
+                                                 . "*/" . &code_subst($');
+    }
   }
   $in;
 }
@@ -803,14 +858,10 @@ sub code_subst {
 sub wrap_code {
   my $in = shift;
   $in =~ s/^[ \t]+$//mg;
-#  if ($in =~ /[A-Z]</ && 0) {			# No such things so early
-#    $in =~ s/^(.)/\nS<  >$1/mg;
-#  } else {
-    $in = &code_subst($in);
-    $in =~ s/^(.)/  $1/mg;
-#  }
+  $in = &code_subst($in);
+  $in =~ s/^(.)/  $1/mg;
   $in =~ s/\s*\Z//;
-  $in =~ s/\\kbd\{((?:[^{}]|\{[^{}]*\})*)\}/$1/g if $to_pod;
+#  $in =~ s/\\kbd\{((?:[^{}]|\{[^{}]*\})*)\}/$1/g if $to_pod;
   $in =~ s/\$([^\$\n]*)\$/$1/g if $to_pod;
   "\n\n$in\n\n";
 }
@@ -828,15 +879,17 @@ sub for_index {
   $in;
 }
 
+sub strip_trail { my $in = shift; $in =~ s/\s+\Z//; $in }
+
+# This subroutine works in paragraph mode
 sub TeXprint_topod {
   s/\A\s+//;
   s/^\\def\\.*\{\n.*\n\}//gm;
   s/\\def\\.*//g;		# Repeated in basic_subst, as the next one
   s/(\{[\w\s]+)\{\}([\s\w]+\})/$1$2/g;	# {rnf{}llgram}
 
-  # \def\sectype#1#2{\subsec{Type \typ{#1} (#2s):}\sidx{#2}}
-  # \def\sectypeindex#1#2#3{\subsec{Type \typ{#1} (#2):}\sidx{#3}}
-  # \def\sectypes#1#2#3{\subsec{Types \typ{#1} and \typ{#2} (#3s):}\sidx{#3}}
+  s/\\vbox\s*\{\s*\\bprog/\\bprog/g;
+  s/([\\\@])eprog\s*\}/$1eprog/g;
 
   #  \n is below to prevent splitting on ' '
   #  We also remove ':'
@@ -850,9 +903,9 @@ sub TeXprint_topod {
   s/(\\(?:section|subsec(?:ref|idx|op)?)\s*{(?:(?:[^{}]+(?=[{}])|{[^{}]+})+)})\.?\s*\\(label|sidx)/$1\n\\$2/;
 
   # last if /\\subsec[\\{}ref]*[\\\${]$help[}\\\$]/o;
-  s/\\chapter\s*{((?:[^{}]|\{[^{}]*\})*)}/\n\n$tr{podleader}head1 NAME\n\nlibPARI - $1\n\n$tr{podleader}head1 DESCRIPTION\n\n/;
-  s/\\appendix\s*{((?:[^{}]|\{[^{}]*\})*)}/\n\n$tr{podleader}head1 NAME\n\nAppendix - $1\n\n$tr{podleader}head1 DESCRIPTION\n\n/;
-  s/\\section\s*{((?:[^{}]|\{[^{}]*\})*)}/"\n\n$tr{podleader}head1 " . indexify($1) . "\n\n"/e;
+  s/\\chapter\s*{((?:[^{}]|\{[^{}]*\})*)}\s*/\n\n$tr{podleader}head1 NAME\n\nlibPARI - $1\n\n$tr{podleader}head1 DESCRIPTION\n\n/;
+  s/\\appendix\s*{((?:[^{}]|\{[^{}]*\})*)}\s*/\n\n$tr{podleader}head1 NAME\n\nAppendix - $1\n\n$tr{podleader}head1 DESCRIPTION\n\n/;
+  s/\\section\s*{((?:[^{}]|\{[^{}]*\})*)}\s*/"\n\n$tr{podleader}head1 " . indexify($1) . "\n\n"/e;
 
   # Try to delimit by :
   s/\\subsec(?:ref|idx|op)?(?:unix)?\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}((\W*default:)?[^\n:]*):\s*/"\n\n$tr{podleader}head2 " . indexify("$1$3") . "\n\n"/e;
@@ -870,24 +923,37 @@ sub TeXprint_topod {
   /\Q$tr{podleader}\Ehead1|\\title(?![a-zA-Z])\s*\{/o and $seen_start = 1
     or $seen_start or return;	# Skip now!
 
-  s/\\title\s*\{([^{}\s]*)(\s+([^{}]*))?\}(\s*\\centerline\s*\{([^{}]*)\})?/$tr{podleader}head1 NAME\n\n$1 - $3.  $5\n\n/ and $seen_title++ 
+  s/\\title\s*\{([^{}\s]*)(\s+([^{}]*))?\}(\s*\\centerline\s*\{([^{}]*)\})?\s*/$tr{podleader}head1 NAME\n\n$1 - $3.  $5\n\n/ and $seen_title++ 
     unless $seen_title;
-  s/\\title\s*\{([^{}\s]*)(\s+([^{}]*))?\}(\s*\\centerline\s*\{([^{}]*)\})?/\n\n/;
+  s/\\title\s*\{([^{}\s]*)(\s+([^{}]*))?\}(\s*\\centerline\s*\{([^{}]*)\})?\s*/\n\n/;
   s/\\parskip.*/\n/g;		# Up to end of the line
   #s/([A-Z])\</$1 < /g;		# Disambiguate with POD...
-  s/\\((small|big)skip|newcolumn|noindent|(short)?copyrightnotice|hfill|break|par|leavevmode|strut|endgroup|bye)(?![a-zA-Z])[ \t]*/\n\n/g;
-  s/^[ \t]*\\hskip\s*\w+//gm;
+
+  # Duplicate removal of settabs, since they may contain \hskip
+  s/\\settabs.*//;
+  s/^[ \t]*\\hskip\s*\w+/$tr{nbrk}/g;
+  s/[ \t]*\\hskip\s*\w+/\n$tr{nbrk}/g;
+  1 while s/ \\
+	     ( (small|big)skip | newcolumn | noindent
+	     | (short)?copyrightnotice | hfill | break | par
+	     | leavevmode | strut | endgroup | bye
+             )
+	     (?![a-zA-Z])[ \t]*(\n\s*)
+	     /\n\n/gx;
 
   s/'(\W)'/{\\tt '$1'}/g;
   s/(\\\w+)(\\hbox)/$1 $2/g;
   s/\\hbox\s*\{(?:\\it\b\s*)?((?:\\[\{\}]|[^{}]|\{[^{}]*\})*)\}/$1/g;
 
   # substitute non-verbatim code
-  if (/\\bprog/)
-  {
-    s/\s*\\bprog(?:tabs[^\n]*)?(?![a-zA-Z])\s*(.*?)(\\|@)eprog\s*/wrap_code($1)/ges;
+  $acc = '';
+  pos = 0;
+  while ( s/\A(.*?)\\bprog//s ) {
+    $acc .= basic_subst(strip_trail($1));
+    $_ .= <DOC> until /(\\|@)eprog\b/ or eof(DOC);
+    $acc .= wrap_code($1) if s/\A(?:tabs[^\n]*)?(?![a-zA-Z])[ \t]*\n?(.*?)(\\|@)eprog\s*//s;
   }
-  else { $_ = &basic_subst($_); }
+  $_ = $acc . basic_subst($_);
 
 #  s/\\kbd\{/\{\\tt /g;		# startcode
 #  s/\\typ\{/\{\\tt t_/g;	# startcode
@@ -898,13 +964,13 @@ sub TeXprint_topod {
 
   @lines = split /^$/m, $_;
   for (@lines) {
-    s/>/\@[gt]/g unless /^\s/;
-    s/</\@[lt]/g unless /^\s/;
+    s/>/\@[gt]/g unless /^\n*[ \t]/;
+    s/</\@[lt]/g unless /^\n*[ \t]/;
   }
   $_ = join '', @lines;
 
-  s/\$\$(.*?)\$\$[ \t]*/\n\nS<  >C<$1>\n\n/gs;
-  s/\$([^\$]+)\$/C<$1>/g;
+  s/\$\$(.*?)\$\$\s*/\n\nS<  >$tr{startcode}$1$tr{endcode}\n\n/gs;
+  s/\$([^\$]+)\$/$tr{startcode}$1$tr{endcode}/g;
 
   s/\\s(?:ref|idx){\s*([^{}]*)}/"X<" . for_index($1) . ">"/ge; # 
   s/\\(?:ref|idx){\s*([^{}]*)}/"X<" . for_index($1) . ">$1"/ge;
@@ -913,30 +979,59 @@ sub TeXprint_topod {
 # s/\\(?:key|li)\s*{(.*)}\s*{(.+)}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/msg;
 # s/\\(?:key|li)\s*{(.*)}\s*{}[ \t]*\n/\n\n=back\n\n$1\n\n=over\n\n/mgs;
 # s/\\(key|var)(?![a-zA-Z])\s*{(\w+)}/C<$2>/mg;
-  s/\\var\s*{X<(\w+)>(\w+)}/X<$1>C<$2>/mg;
-  s/\\var\s*{f{}lag}/C<flag>/mg;
+  s/\\var\s*{X<(\w+)>(\w+)}/X<$1>$tr{startcode}$2$tr{endcode}/mg;
+  s/\\var\s*{f{}lag}/$tr{startcode}flag$tr{endcode}/mg;
 
   s/\\metax(?![a-zA-Z])\s*{(.*)}\s*{\s*(\w+)(?=C\<)(.*)}[ \t]*\n/\n\n=item C<L<$2>$3>\n\n$1\n\n/mg;
   s/\\metax(?![a-zA-Z])\s*{(.*)}\s*{(.*)}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/mg;
   s/C\<\{\}=/C\<=/g;
   s/\\fl(?![a-zA-Z])/I<flag>/g;
   s/\\file(?![a-zA-Z])/F<file>/g;
+  s/\\(unix|emacs)\b\s*(\{?)(\s*\\(no)?indent)?\s*/X<\U$1>$2/g;
+  s/\A\\label\s*\{([\w:.-]*)\}([ \t]*\n\s*(?=[^\s=]))?/X<Label $1>/g;
   s/\\label\s*\{([\w:.-]*)\}/X<Label $1>/g;
   s/\\secref\s*\{([\w:.-]*)\}/L<Label $1>/g;
-  s/\\begin(double)?indentedkeys/\n\n=over\n\n/g;
-  s/\\end(double)?indentedkeys/\n\n=back\n\n/g;
+  s/\\begin(double)?indentedkeys\s*/\n\n=over\n\n/g;
+  s/\\end(double)?indentedkeys\s*/\n\n=back\n\n/g;
   # begin/end group appear in very special context only
   s/\\begingroup\W.*//s;		# Eat to the end
   s/\n{3,}/\n\n/g;
-  s/\\subsec\{((?:[^{}]|\{[^{}]*\})+)\}/\n\n=back\n\nB<$1>\n\n=over\n\n/g; # In refcard
+  s/\\subsec\{((?:[^{}]|\{[^{}]*\})+)\}\s*/\n\n=back\n\nB<$1>\n\n=over\n\n/g; # In refcard
   # for refcard:
   s/{\\rm(?![a-zA-Z])\s*([^{}]*)}/$1/g;
   s/\\Z<>/\\/g;			# Optimize for readability
+
+  # Now replace the POD stuff
+  # Start with cosmetic stuff:
+  $in_code = 0;
+  s/(\@\[((start)|end)code\])/ ($3 ? $in_code++ : --$in_code) ? "" : $1 /ge;
+
+  if ($dumb_pod) {
+    my @stack;
+    s /(\@\[((start)|end)(\w+)\])/
+      if ($3) {			# Start
+	push @stack, $4;
+	(@stack > 1 ? "\@[end$stack[-2]]" : '') . $1
+      } else {			# end
+	pop @stack;
+	$1 . (@stack ? "\@[start$stack[-1]]" : '')
+      }
+      /ge
+  }
+  1 while s/\@\[start(\w+)\](\s*)\@\[end\1\]/$2/g;
+
   s/\@\[(\w+)\]/\@!$pr{$1}/g;
   s/(\\\w+)\@!(\w)/$1 $2/g;
   s/\@!//g;
   s/\\([\{\}])/$1/g;
 
+  # Normalize the spacing
+  s/\n{3,}/\n\n/;
+  s/\A([ \t]*\n)+//;
+  # Single label is not healthy...
+  print "\n" if $last_glued and /\A=/; # POD markup needs a new paragraph
+  $last_glued = s/((\A|\n\n)(X<[^<>]+>)+)[ \t]*\n\n/$1\n/;
+
   print;
 }
 
@@ -953,6 +1048,14 @@ sub color
 sub TeXprint
 {
   local($_) = $_[0];
+  s/\@\[obr\]/{/g;
+  s/\@\[cbr\]/}/g;
+  # This should better be put in Latin1...  Or Win1251?  ;-)
+  s/\@\[ouml\]/"o/g;
+  s/\@\[uuml\]/"u/g;
+  s/\@\[agrave\]/`a/g;
+  s/\@\[eacute\]/'e/g;
+  s/\@\[ldollar\]/\$/g;
   s/\@\[end(bold|code|bcode|bi|it)\]/\e[m$ch/g;
   s/\@\[start(bold|code|bcode|bi)\]/$cb\e[1m/g;
   s/\@\[startit\]/$cu\e[4m/g;
--- ./config/DOC_Make.SH-pre	Fri Feb  9 19:38:36 2001
+++ ./config/DOC_Make.SH	Wed Feb 28 20:27:10 2001
@@ -10,7 +10,7 @@ manual: users.dvi
 tutorial: tutorial.dvi
 refcard: refcard.ps
 
-.SUFFIXES: .tex .ipf .pod .inf
+.SUFFIXES: .tex .ipf .pod .inf .dumbpod
 
 paricfg.tex: paricfg.tex.in
 	sed -e 's/@version@/2.2.0/'\
@@ -93,6 +93,9 @@ veryclean: clean
 .tex.pod:
 	perl gphelp -to_pod $*.tex > tmp_pod && mv tmp_pod $*.pod
 
+.tex.dumbpod:
+	perl gphelp -to_dumb_pod $*.tex > tmp_pod && mv tmp_pod $*.dumbpod
+
 .ipf.inf:
 	ipfc /INF $*.ipf
 
@@ -103,3 +106,12 @@ veryclean: clean
 
 pari.ipf:  refcard.pod tutorial.pod usersch1.pod usersch1.pod usersch2.pod usersch3.pod usersch4.pod usersch5.pod appa.pod appb.pod appc.pod
 	pod2ipf --title="PARI/GP Manual" --by-files --section-name="Getting started" --file=refcard.pod --file=tutorial.pod --section-name="User guide" --file=usersch1.pod --file=usersch1.pod --file=usersch2.pod --file=usersch3.pod --file=usersch4.pod --file=usersch5.pod --section-name=Appendices --file=appa.pod --file=appb.pod --file=appc.pod > tmp_ipf && mv tmp_ipf pari.ipf
+
+# Wrong syntax...  How to convert a group of files?
+#pari.html:  refcard.dumbpod tutorial.dumbpod usersch1.dumbpod usersch1.dumbpod usersch2.dumbpod usersch3.dumbpod usersch4.dumbpod usersch5.dumbpod appa.dumbpod appb.dumbpod appc.dumbpod
+#	pod2html --title="PARI/GP Manual" --by-files --section-name="Getting started" --file=refcard.dumbpod --file=tutorial.dumbpod --section-name="User guide" --file=usersch1.dumbpod --file=usersch1.dumbpod --file=usersch2.dumbpod --file=usersch3.dumbpod --file=usersch4.dumbpod --file=usersch5.dumbpod --section-name=Appendices --file=appa.dumbpod --file=appb.dumbpod --file=appc.dumbpod > tmp_ipf && mv tmp_ipf pari.html
+
+.dumbpod.html:
+	pod2html --title="PARI/GP Manual $* Getting started" --file=$*.dumbpod > tmp_html && mv tmp_html $*.html
+
+