| Ilya Zakharevich on Sat, 3 Mar 2001 01:32:40 -0500 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: [PATCH] Better PODs |
On Wed, Feb 28, 2001 at 08:50:26PM -0500, Ilya Zakharevich wrote:
> 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.]
Yet more of this... More cleanup, and now produces manpages automatically.
Enjoy,
Ilya
--- ./doc/gphelp.in-as-sent Sun Feb 11 03:37:38 2001
+++ ./doc/gphelp.in Fri Mar 2 22:59:08 2001
@@ -35,7 +35,7 @@
#
# -to_pod file convert file to POD (should be the only args)
#
-# -to_dumbpod file same, but without nested formating
+# -to_dumb_pod file same, but without nested formating
#
# Granted environment variables (override):
# GPTMPDIR: where temporary files will go (/tmp by default).
@@ -86,7 +86,7 @@ sub cleanexit {
}
sub help {
- print "Usage: $0 [-k] [-detex] [-ch c1] [-cb c2] [-cu c3] keyword\n";
+ print "Usage: $0 [-k] [-detex] [-ch c1] [-cb c2] [-cu c3] [-to_[dumb_]pod] keyword\n";
print "where c1,c2,c3 denote background, bold and underline color\n";
exit(1);
}
@@ -484,7 +484,7 @@ sub format_text
@_ = split(/ /, $_);
for (@_)
{
- s/\Q$tr{nbrk}/ /g; push(@w, $_);
+ s/\Q$tr{nbrk}/ /go; push(@w, $_);
s/\@\[\w+\]//g; push(@l, length($_));
}
}
@@ -561,7 +561,7 @@ sub detex
sub inittr {
@ou = qw( dollar nbrk startbold endbold startcode endcode
obr cbr uuml ouml agrave eacute
- startpodcode endpodcode startlink endlink
+ startpodcode endpodcode startlink endlink startindex endindex
startbcode endbcode startbi endbi startit endit
startword endword startlword endlword pm empty gt lt podleader );
@@ -577,6 +577,8 @@ sub inittr {
startlink => 'L<',
endlink => '>',
endcode => '>',
+ startindex => 'X<',
+ endindex => '>',
obr => '{',
cbr => '}',
startpodcode => 'C<',
@@ -606,6 +608,43 @@ sub inittr {
empty => 'Z<>',
podleader => '=',
);
+ # How to emit in verbatim sessions:
+ %vr = ( dollar => '',
+ ldollar => '$', # literal dollar
+ nbrk => ' ',
+ startbold => '',
+ endbold => '',
+ startcode => '',
+ startlink => '',
+ endlink => '',
+ endcode => '',
+ startindex => '',
+ endindex => '', # XXX Need to remove the contents too...
+ obr => '{',
+ cbr => '}',
+ startpodcode => '',
+ endpodcode => '',
+ startbcode => '',
+ endbcode => '',
+ startbi => '',
+ endbi => '',
+ startit => '',
+ endit => '',
+ startword => '',
+ endword => '',
+ startlword => '',
+ endlword => '',
+ pm => '+-',
+ "gt" => '>',
+ "lt" => '<',
+ # This should better be put in Latin1... Or Win1251? ;-)
+ ouml => '"o',
+ uuml => '"u',
+ eacute => '\'e',
+ agrave => '`a',
+ empty => '',
+ podleader => '=',
+ );
}
sub indent_equally { my $in = shift; $in =~ s/^[ \t]*/ /mg; $in}
@@ -649,14 +688,14 @@ 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/\\`a/$tr{agrave}/g;
+ s/\\`{a}/$tr{agrave}/g;
+ s/\\"o/$tr{ouml}/g;
+ s/\\"{o}/$tr{ouml}/g;
+ s/\\"u/$tr{uuml}/g;
+ s/\\"{u}/$tr{uuml}/g;
+ s/\\'e/$tr{eacute}/g;
+ s/\\'{e}/$tr{eacute}/g;
s/(^|[^\\])%.*/$1/g; # comments
s/\\vadjust\s*\{\s*\\penalty\s*\d+\s*\}//g;
@@ -664,6 +703,7 @@ sub basic_subst
# We do not strip %\n, thus:
s/\\kbd{\n\s*/\\kbd{/g;
s/\$\\bf(\b|(?=[\d_]))\s*([^\$]+)\$/\$$tr{startbcode}$1$tr{endbcode}\$/g;
+ s/\$\s*\\,\s*\$//g; # Do not make into $$
s/\$/$tr{dollar}/g; # math mode
s/\t/ /g; s/\\,//g; s/\\[ ;]/ /g; # various spaces
s/\\\///g; # italic correction
@@ -690,7 +730,8 @@ sub basic_subst
s/(\\string)?\\_/_/g;
s/\\([#\$&%|])/$1/g;
s/\\(hat(?![a-zA-Z])|\^)({\\?\s*})?/^/g;
- s/ *\\pow(?![a-zA-z]) */^/g;
+ # Don't eat spaces after =head:
+ s/((^\Q$tr{podleader}\Ehead\d\s*)?) *\\pow(?![a-zA-z]) */$1^/gmo;
s/\\neq?(?![a-zA-Z])/ != /g;
s/\\enspace(?![a-zA-Z])/ /g;
@@ -784,7 +825,8 @@ 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*\{(\s*)\\it\b\s*(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$1$tr{startit}$2$tr{endit}/g;
+ s/\\(?:text|hbox)\s*\{(\s*)(?:\\rm\b\s*)?(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$1$2/g;
s/\\(text|hbox)//g;
s/^([ \t]+)\{ *\\(it|sl|bf|tt)\b/S<$1>{\\$2/gm;
s/\{ *\\(it|sl) *(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$tr{startit}$2$tr{endit}/g;
@@ -831,6 +873,12 @@ sub presubst {
push(@text, $_);
}
+sub clean_basic { # Remove all the (simple) meta-info
+ my $in = shift;
+ $in =~ s/\@\[(\w+)\]/$vr{$1}/g;
+ $in;
+}
+
sub code_subst {
my $in = shift;
$in =~ s/\@dots\b/.../g;
@@ -838,7 +886,7 @@ sub code_subst {
if ($in =~ /\@com(.*)/)
{
if ($to_pod) {
- $in = $` . &basic_subst($1) . code_subst($');
+ $in = $` . clean_basic(basic_subst($1)) . code_subst($');
} else {
$in = $` . $tr{endcode} . &basic_subst($1) . $tr{startcode} . code_subst($');
}
@@ -846,7 +894,7 @@ sub code_subst {
if ($in =~ /\@Ccom(.*)\*\//)
{
if ($to_pod) {
- $in = $` . &basic_subst($1) . "*/" . &code_subst($');
+ $in = $` . clean_basic(basic_subst($1)) . "*/" . &code_subst($');
} else {
$in = $` . $tr{endcode} . &basic_subst($1) . $tr{startcode}
. "*/" . &code_subst($');
@@ -900,7 +948,7 @@ sub TeXprint_topod {
# Try to guard \label/\sidx (removing possible '.')
# This somehow breaks index...
# s/(\\(?:section|subsec(?:ref|idx|op)?(unix)?)\s*{(?:(?:[^{}]+(?=[{}])|{[^{}]+})+)})\.?\s*\\(label|sidx)/$1\n\\$2/;
- s/(\\(?:section|subsec(?:ref|idx|op)?)\s*{(?:(?:[^{}]+(?=[{}])|{[^{}]+})+)})\.?\s*\\(label|sidx)/$1\n\\$2/;
+ s/(\\(?:section|subsec(?:ref|idx|op)?)\s*{(?:(?:[^{}]+(?=[{}])|{[^{}]+})+)})\.?\s*\\(label|(kbd)?sidx)/$1\n\\$2/;
# last if /\\subsec[\\{}ref]*[\\\${]$help[}\\\$]/o;
s/\\chapter\s*{((?:[^{}]|\{[^{}]*\})*)}\s*/\n\n$tr{podleader}head1 NAME\n\nlibPARI - $1\n\n$tr{podleader}head1 DESCRIPTION\n\n/;
@@ -943,7 +991,8 @@ sub TeXprint_topod {
s/'(\W)'/{\\tt '$1'}/g;
s/(\\\w+)(\\hbox)/$1 $2/g;
- s/\\hbox\s*\{(?:\\it\b\s*)?((?:\\[\{\}]|[^{}]|\{[^{}]*\})*)\}/$1/g;
+ s/\\hbox\s*\{(\s*)\\it\b\s*((?:\\[\{\}]|[^{}]|\{[^{}]*\})*)\}/$1$tr{startit}$2$tr{endit}/g;
+ s/\\hbox\s*\{(\s*)(?:\\rm\b\s*)?((?:\\[\{\}]|[^{}]|\{[^{}]*\})*)\}/$1$2/g;
# substitute non-verbatim code
$acc = '';
@@ -972,14 +1021,14 @@ sub TeXprint_topod {
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;
+ s/\\s(?:ref|idx){\s*([^{}]*)}/$tr{startindex} . for_index($1) . $tr{endindex}/ge;
+ s/\\(?:ref|idx){\s*([^{}]*)}/$tr{startindex} . for_index($1) . "$tr{endindex}$1"/ge;
# Conflict between different versions of PARI and 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;
- s/\\var\s*{X<(\w+)>(\w+)}/X<$1>$tr{startcode}$2$tr{endcode}/mg;
+ s/\\var\s*{\Q$tr{startindex}\E(\w+)\Q$tr{endindex}\E(\w+)}/$tr{startindex}$1$tr{endindex}$tr{startcode}$2$tr{endcode}/mgo;
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;
@@ -987,9 +1036,9 @@ sub TeXprint_topod {
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/\\(unix|emacs)\b\s*(\{?)(\s*\\(no)?indent)?\s*/$tr{startindex}\U$1\E$tr{endindex}$2/g;
+ s/\A\\label\s*\{([\w:.-]*)\}([ \t]*\n\s*(?=[^\s=]))?/$tr{startindex}Label $1$tr{endindex}/g;
+ s/\\label\s*\{([\w:.-]*)\}/$tr{startindex}Label $1$tr{endindex}/g;
s/\\secref\s*\{([\w:.-]*)\}/L<Label $1>/g;
s/\\begin(double)?indentedkeys\s*/\n\n=over\n\n/g;
s/\\end(double)?indentedkeys\s*/\n\n=back\n\n/g;
@@ -1001,12 +1050,14 @@ sub TeXprint_topod {
s/{\\rm(?![a-zA-Z])\s*([^{}]*)}/$1/g;
s/\\Z<>/\\/g; # Optimize for readability
+ s/^((\Q$tr{startindex}\E[\w\s]+\Q$tr{endindex}\E)+)[ \t]+/$1/mgo;
+
# Now replace the POD stuff
- # Start with cosmetic stuff:
+ # Start with cosmetic stuff: C<> inside C<>
$in_code = 0;
s/(\@\[((start)|end)code\])/ ($3 ? $in_code++ : --$in_code) ? "" : $1 /ge;
- if ($dumb_pod) {
+ if ($dumb_pod) { # Many traslators do not grok embedded markup
my @stack;
s /(\@\[((start)|end)(\w+)\])/
if ($3) { # Start
@@ -1016,7 +1067,7 @@ sub TeXprint_topod {
pop @stack;
$1 . (@stack ? "\@[start$stack[-1]]" : '')
}
- /ge
+ /ge;
}
1 while s/\@\[start(\w+)\](\s*)\@\[end\1\]/$2/g;
@@ -1028,6 +1079,12 @@ sub TeXprint_topod {
# Normalize the spacing
s/\n{3,}/\n\n/;
s/\A([ \t]*\n)+//;
+ if ($dumb_pod) {
+ # pod2man has problems with \n inside X<>; be careful to not create
+ # new paragraph breaks. Assume that $tr{endindex} is one-char-long
+ s/(\nX<[^>]*)\n/$1 /g;
+ s/(X<[^>]*)\n/\n$1 /g;
+ }
# 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/;
@@ -1048,21 +1105,13 @@ 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;
- s/\@\[(dollar|empty|endl?word|endpodcode|startl?word|startpodcode)\]//g;
s/\@\[pm\]/±/g;
s/\\([\{\}])/$1/g;
- s/\@\[nbrk\]/ /g; print "$_\n";
+ s/\@\[(\w+)\]/$vr{$1}/g;
+ print "$_\n";
}
sub to_pod {
--- ./config/DOC_Make.SH-pre Wed Feb 28 20:27:10 2001
+++ ./config/DOC_Make.SH Fri Mar 2 23:14:54 2001
@@ -3,15 +3,20 @@
#
SHELL = $make_sh
-doc all: manual refcard tutorial
+doc all: manual refcard tutorial manpages
docps: refcard.ps tutorial.ps users.ps ../INSTALL.ps
docpdf: users.pdf tutorial.pdf refcard.pdf ../INSTALL.pdf
manual: users.dvi
tutorial: tutorial.dvi
refcard: refcard.ps
+manpages: gp-refcard.1 gp-tutorial.1 gp-overview.1 gp-usage.1 \
+ pari-functions.3 pari-lowlevel.3 pari-lowlevel.3
+
.SUFFIXES: .tex .ipf .pod .inf .dumbpod
+POD2MAN = pod2man --lax
+
paricfg.tex: paricfg.tex.in
sed -e 's/@version@/2.2.0/'\
-e 's!@includedir@!/usr/local/include/pari!'\
@@ -99,11 +104,13 @@ veryclean: clean
.ipf.inf:
ipfc /INF $*.ipf
-# This is for testing:
+# This one is for testing:
.pod.ipf:
pod2ipf $*.pod > tmp_ipf && mv tmp_ipf $*.ipf
+# This one is for real:
+
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="Usser 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
@@ -114,4 +121,24 @@ pari.ipf: refcard.pod tutorial.pod user
.dumbpod.html:
pod2html --title="PARI/GP Manual $* Getting started" --file=$*.dumbpod > tmp_html && mv tmp_html $*.html
+gp-refcard.1: refcard.dumbpod
+ $(POD2MAN) refcard.dumbpod > tmp_man && mv tmp_man $@
+
+gp-tutorial.1: tutorial.dumbpod
+ $(POD2MAN) tutorial.dumbpod > tmp_man && mv tmp_man $@
+
+gp-overview.1: usersch1.dumbpod
+ $(POD2MAN) usersch1.dumbpod > tmp_man && mv tmp_man $@
+
+gp-usage.1: usersch1.dumbpod
+ $(POD2MAN) usersch2.dumbpod > tmp_man && mv tmp_man $@
+
+pari-functions.3: usersch1.dumbpod
+ $(POD2MAN) usersch3.dumbpod > tmp_man && mv tmp_man $@
+
+pari-programming.3: usersch1.dumbpod
+ $(POD2MAN) usersch4.dumbpod > tmp_man && mv tmp_man $@
+
+pari-lowlevel.3: usersch1.dumbpod
+ $(POD2MAN) usersch5.dumbpod > tmp_man && mv tmp_man $@