| Ilya Zakharevich on Sun, 19 Apr 1998 01:10:33 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Portable documentation for PARI |
The following patch implements (lousy) conversion of PARI
documentation to POD format. Starting from POD, you may go to almost
whatever exists (from MAN to PDF to Emacs INFO).
Since I know well only one pod2* converter, I added only one target to
the Makefile, one to generate online books in OS/2 format.
Note that the converter to POD is tuned up for ideosyncrasies of
2.0.5, if some new obfuscation appeared from this time, one should
update the converter accordingly. Note also that I did care about
refcard and chapter3 only, thus translation of other chapters may be
very lousy.
Enjoy,
Ilya
P.S. Due to the build of 2.0.* changing each day, I cannot convert my
Math::Pari Perl extension to use 2.0.*. Since I use the same script
for Math::Pari, I would appreciate it if the possibility to handle
1.37.* documentation is not removed from the script - at least for
some time.
--- ../doc/paridoc_to_pod~ Sat Apr 18 18:51:10 1998
+++ ../doc/paridoc_to_pod Sat Apr 18 18:22:52 1998
@@ -0,0 +1,283 @@
+#!/usr/bin/perl -w
+#
+# Please correct the above line to the actual location of perl on your
+# system, and the line below to the location of PARI manual, ch. 3.
+#
+# The manual file can compressed. Sometimes you need to change the
+# name of the compression program in the %compress = ... statement below.
+#
+
+# How to show a chunk of docs:
+# pod2man --lax a.pod | nroff -man |
+# perl -p00e "s/\s*$/\n/;if (/^\S/) {$_=''} else {print qq'\n' if $next++}"|
+# less -s -+C
+
+$version = $1, shift @ARGV if @ARGV and $ARGV[0] =~ /^-v=(.*)$/;
+
+$parifile = shift || "f:/pari/doc/usersch3.tex.gz";
+# $parifile="/opt/src/pari-1.39/doc/usersch3.tex.gz";
+
+die "Usage: $0 [-v=version-of-pari] pari-chapter-filename\n"
+ unless -f $parifile;
+
+#%transl=(
+# '\\', '\backslash',
+# '^', '\hat{}',
+# '!', 'fact',
+# '~', 'trans',
+# '_', 'conj',
+# '-', '\+',
+# '%', '\%',
+# 'min', 'max',
+# 'log', 'ln',
+#);
+%compress = ('.gz', 'gzip -cd',
+ '.z', 'gzip -cd',
+ '.Z', 'zcat',
+ );
+
+#print $help;
+foreach $suffix (keys %compress) {
+ ($patt = $suffix) =~ s/(\W)/\\$1/;
+ if ($parifile =~ /$patt$/) {
+ $pipe = $compress{$suffix};
+ last;
+ }
+}
+if ($pipe) {
+ open(DOC,"$pipe $parifile |") ||
+ die "Cannot open pipe $pipe from $parifile: $!, stopped";
+} else {
+ open(DOC,$parifile) || die "Cannot find file $parifile: $!, stopped";
+}
+$/=''; # Paragraph mode
+# %table = qw(`a ? "a ? "u ? "o ? 'e ?);
+
+sub indexify ($) {
+ my $in = shift;
+ $in =~ s/(^|and\s+)(\w+)(\$?\()/$1\\ref{$2}$3/g;
+ $in;
+}
+
+while (<DOC>) {
+ s/\A\s+//;
+ # last if /\\subsec[\\{}ref]*[\\\${]$help[}\\\$]/o;
+ s/\\chapter\s*{(.*)}/\n\n=head1 NAME\n\nlibPARI - $1\n\n=head1 DESCRIPTION\n\n/;
+ s/\\section\s*{(.*)}/"\n\n=head1 " . indexify($1) . "\n\n"/e;
+ # Try to delimit by :
+ s/\\subsec(?:ref|idx|op)?\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}([^\n:]*):\s*/"\n\n=head2 " . indexify("$1$3") . "\n\n"/e;
+ s/\\subsubsec(?:ref|idx|op)?(?:unix)?\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}([^\n:]*):\s*/"\n\n=item " . indexify("$1$3") . "\n\n"/e;
+ # Try to delimit by ' '
+ s/\\subsec(?:ref|idx|op)?\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}(\S*)\s+/"\n\n=head2 " . indexify("$1$3") . "\n\n"/e;
+ s/\\subsec(?:ref|title|idx|op)?\s*{(([^{}]+(?=[{}])|{[^{}]*})+)}:?\s*/"\n\n=head2 " . indexify("$1") . "\n\n"/e;
+ &TeXprint;
+}
+if ($pipe) {
+ if ($^O eq 'os2') {
+ # Would get 'illegal seek' otherwise?
+ 1 while <DOC>;
+ }
+ close(DOC) || die "Cannot close pipe `$pipe $parifile': $!, stopped";
+} else {
+ close(DOC) || die "Cannot close file $parifile: $!, stopped";
+}
+
+sub wrap_code {
+ my $in = shift;
+ $in =~ s/^(.)/ $1/mg;
+ $in
+}
+
+# sref is invisible reference
+# tec(a,b) is ref(a)tt(b)
+sub TeXprint_old {
+ # d?frac{}{} ??? bullet ???
+ s/\\\///g;
+ s/\\([% &|\#])/$1/g;
+ s/\\c?dots\b/.../g;
+ s/\\cdot\b/ . /g;
+ s/\\mid\b/ | /g;
+ s/(\\string)?\\_/_/g;
+ s/\\(hat\b|\^)({\\?\s*})?/^/g;
+ s/(^|[^\\])~/$1 /g;
+ s/\\,/ /g;
+ s/\\enspace(\b|(?=[\d_]))/ /g;
+ s/\\~(\{(\\\s*)?\})?/~/g;
+ s/\\tilde(\{\\\s+\})?/~/g;
+ s/\\hbox{}/ /g;
+ s/\\parskip.*/\n/g; # Up to end of the line
+ s/\\(equiv|approx|simeq)(\b|(?=[\d_]))/ ~ /g;
+ s/\\neq(\b|(?=[\d_]))/!=/g;
+ s/([A-Z])\</$1 < /g;
+ s/\>/E<gt>/g;
+ s/\\leq?(\b|(?=[\d_]))/E<lt>=/g;
+ s/\\geq?(\b|(?=[\d_]))/E<gt>=/g;
+ s/\\\$/F<dollar>/g;
+ s/\$\\bf\b\s*([^\$]+)\$/C<B<$1>>/g;
+ s/\$+([^\$]+)\$+/C<$1>/g;
+ s/\\sref{\s*([^{}]*)}/X<$1>/g;
+ s/\\ref{\s*([^{}]*)}/X<$1>$1/g;
+ s/\\tec{\s*([^{}]*)}{\s*([^{}]*)}/X<$1>$1C<$2>/g;
+ s/\\text{\s*([^{}]*)}/$1/g;
+ s/\{\\text\s*([^{}])}/$1/g;
+ s/^{\\tt\s*\\obeylines\s*(([^{}]+(?=[{}])|{[^{}]*})+)}/wrap_code($1)/e;
+ s/{\\tt\b\s*([^{}]*)}/C<$1>/g;
+ s/{\\bf\b\s*(([^{}]+(?=[{}])|{[^{}]+})+)}/B<$1>/g;
+ s/\\Bbb\b\s*(\w)/B<I<$1>>/g;
+ s/\\Z(\b|(?=[\d_]))/B<I<Z>>/g;
+ s/\\teb{\s*([^{}]*)}/$1/g;
+ s/{\\(sl|it)\b\s*([^{}]*)}/I<$2>/g;
+ #s/\\(subsec(ref)?|smallskip|sl|sref[ a-z]*|bf|ref|Bbb|text|tt|\|)[ \t]*//g;
+ s/\\(backslash|bs)\s*(\b|(?=[\d_]))/\\/g;
+ s/\\(log|sin|cos|lim|tan|mod|sqrt|exp|ln|det)(\b|(?=[\d_]))/ F<$1> /g;
+ s/\\bmod\b/ mod /g;
+ s/\\TeX\{\}/TeX/g;
+ s/\\(small|big)skip(\b|(?=[\d_]))/\n\n/g;
+ s/\\pm(\b|(?=[\d_]))/F<+->/g;
+ s/\\(left|right)(\b|(?=[\d_]))//g;
+ s/\\(q?quad|vfill|eject|centerline)(\b|(?=[\d_]))/ /g;
+ s/\\obr(\b|(?=[\d_]))/\{/g;
+ s/\\cbr(\b|(?=[\d_]))/\}/g;
+ s/\\quo(\b|(?=[\d_]))/\"/g;
+ s/(^|\s)\{(\w+)\}/$1$2/g;
+ s/\\([{}])/$1/g;
+ s/'(\W)'/'C<$1>'/g;
+ s/\\(Alpha | Beta | Chi | Delta | Epsilon | Phi | Gamma
+ | Eta | Iota | vartheta | Kappa | Lambda | Mu | Nu | Omicron
+ | Pi | Theta | Rho | Sigma | Tau | Ypsilon | varsigma | Omega
+ | Xi | Psi | Zeta | alpha | beta | chi | delta | varepsilon | phi | gamma
+ | eta | iota | varphi | kappa | lambda | mu | nu | omicron
+ | pi | theta | rho | sigma | tau | ypsilon | varpi | omega
+ | xi | psi | zeta) (\b|(?=[\d_]|[A-Z]<))/F<$1>/xg;
+ s/\\vers(\{\}|\b|(?=[\d_]))/$version/ if defined $version;
+ print;
+}
+
+sub TeXprint {
+ # d?frac{}{} ??? bullet ???
+
+ # This is to skip preface in refcard:
+ /=head1|\\title\b\s*\{/ and $seen_start = 1
+ or $seen_start or return; # Skip now!
+
+ s/\\def\\subsecop\b.*//;
+ s/\\title\s*\{([^{}\s]*)(\s+([^{}]*))?\}(\s*\\centerline\s*\{([^{}]*)\})?/=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/([^\\]|^)%.*$/$1/gm;
+ s/\\kbd\{/\{\\tt /g;
+ s/\\typ\{/\{\\tt t_/g;
+ s/\\\///g;
+ s/\\\\(?=[a-zA-Z])/\\bs /g;
+ s/\\\\/\\bs/g;
+ s/\\([% &|\#\\])/$1/g;
+ s/\\[lc]?dots\b/.../g;
+ s/\\cdot\b/ . /g;
+ s/\\mid\b/ | /g;
+ s/(\\string)?\\_/_/g;
+ s/\\(hat\b|\^)({\\?\s*})?/^/g;
+ s/\\pow(?![a-zA-z])/^/g;
+ s/(^|[^\\])~/$1 /g;
+ s/\\[,;]/ /g;
+ s/\\ne(?![a-zA-Z])/ != /g;
+ s/\\enspace(\b|(?=[\d_]))/ /g;
+ s/\\~(\{(\\\s*)?\})?/~/g;
+ s/\\tilde(\{\\\s+\})?/~/g;
+ s/\\til(?![a-zA-Z])/~/g;
+ s/\\hbox{}/ /g;
+ s/\\parskip.*/\n/g; # Up to end of the line
+ s/\\(equiv|approx|simeq)(\b|(?=[\d_]))/ ~ /g;
+ s/\\neq(\b|(?=[\d_]))/!=/g;
+ s/([A-Z])\</$1 < /g;
+ s/\>/E<gt>/g;
+ s/\\leq?(\b|(?=[\d_]))/E<lt>=/g;
+ s/\\geq?(\b|(?=[\d_]))/E<gt>=/g;
+ s/\\\$/F<dollar>/g;
+ s/\$\s*\\([RQZCF])\s*\$/B<I<$1>>/g;
+ s/\\([RQZCF])(\b|(?=[\d_]))/B<I<$1>>/g;
+ s/\\p(\b|(?=[\d_]))/B<p>/g;
+ s/\$\\bf\b\s*([^\$]+)\$/C<B<$1>>/g;
+ s/\$+([^\$]+)\$+/C<$1>/g;
+ s/\\dfrac{\s*((?:[^{}]|\{[^{}]*\})*)}{\s*((?:[^{}]|\{[^{}]*\})*)}/($1)\/($2)/g;
+ # \def\synt#1#2{\syn{#1}{\tt #2}}
+ # \def\syn#1#2{\synx{#1}{#2}{#1}}
+ s/\\synt?{\s*((?:[^{}]|\{[^{}]*\})*)}{\s*((?:[^{}]|\{[^{}]*\})*)}/\\synx{$1}{$2}{$1}/g;
+ # \def\synx#1#2#3{\sidx{#3}The library syntax is $\key{#1}({#2})$}
+ # Often used with embedded {}.
+ s/\\synx{\s*((?:[^{}]|\{[^{}]*\})*)}{\s*((?:[^{}]|\{[^{}]*\})*)}{\s*((?:[^{}]|\{[^{}]*\})*)}/\\sidx{$3}The library syntax is C<$1>C<($2)>/g;
+ s/\\s(?:ref|idx){\s*([^{}]*)}/X<$1>/g;
+ s/\\(?:ref|idx){\s*([^{}]*)}/X<$1>$1/g;
+ s/\\teb{\s*([^{}]*)}/X<$1>I<$1>/g;
+ s/\\tet{\s*([^{}]*)}/X<$1>C<$1>/g;
+ s/\\tec{\s*([^{}]*)}{\s*([^{}]*)}/X<$1>$1C<$2>/g;
+ s/\\text{\s*([^{}]*)}/$1/g;
+ s/\\b{\s*([^{}]*)}/C<\\$1>/g;
+ s/\{\\text\s*([^{}])}/$1/g;
+ s/^{\\tt\s*\\obeylines\s*(([^{}]+(?=[{}])|{[^{}]*})+)}/wrap_code($1)/e;
+ s/{\\tt\b\s*((\\.|(?:[^{}]|\{[^{}]*\}))*)}/C<$1>/g;
+ s/{\\bf\b\s*(([^{}]+(?=[{}])|{[^{}]+})+)}/B<$1>/g;
+ s/\\Bbb\b\s*(\w)/B<I<$1>>/g;
+ s/\\([NZQRC])\1(?![a-zA-Z])/B<I<$1>>/g;
+ s/\\Z(\b|(?=[\d_]))/B<I<Z>>/g;
+ #s/\\teb{\s*([^{}]*)}/$1/g;
+ s/{\\(sl|it)\b\s*([^{}]*)}/I<$2>/g;
+ #s/\\(subsec(ref)?|smallskip|sl|sref[ a-z]*|bf|ref|Bbb|text|tt|\|)[ \t]*//g;
+ s/\\(backslash|bs)\s*(\b|(?=[\d_]|C\<))/\\Z<>/g;
+ s/\\(log|sin|cos|lim|tan|mod|sqrt|exp|ln|det)(\b|(?=[\d_]))/ F<$1> /g;
+ s/\\bmod\b/ mod /g;
+ s/\\TeX\{\}/TeX/g;
+ s/\\TeX(\W)/TeX$1/g;
+ s/\\((small|big)skip|newcolumn|(short)?copyrightnotice|hfill|break|par|leavevmode|strut|endgroup|bye)(\b|(?=[\d_]))[ \t]*/\n\n/g;
+ s/^[ \t]*\\hskip\s*\w+//gm;
+ s/\\pm(\b|(?=[\d_]))/F<+->/g;
+ s/\\(left|right)(\b|(?=[\d_]))//g;
+ s/\\(q?quad|vfill|eject|centerline|q)(\b|(?=[\d_]))/ /g;
+ s/\\noindent(\b|(?=[\d_]))/ /g;
+ s/\\obr(\b|(?=[\d_]))/\{/g;
+ s/\\cbr(\b|(?=[\d_]))/\}/g;
+ s/\\quo(\b|(?=[\d_]))/\"/g;
+ s/(^|\s)\{(\w+)\}/$1$2/g;
+ s/\\([{}])/$1/g;
+ s/'(\W)'/'C<$1>'/g;
+ s/\\(Alpha | Beta | Chi | Delta | Epsilon | Phi | Gamma
+ | Eta | Iota | vartheta | Kappa | Lambda | Mu | Nu | Omicron
+ | Pi | Theta | Rho | Sigma | Tau | Ypsilon | varsigma | Omega
+ | Xi | Psi | Zeta | alpha | beta | chi | delta | varepsilon | phi | gamma
+ | eta | iota | varphi | kappa | lambda | mu | nu | omicron
+ | pi | theta | rho | sigma | tau | ypsilon | varpi | omega
+ | xi | psi | zeta | int
+ | expr | seq | args | gcd | sum | prod | Re | infty )
+ (\b|(?=[\d_]|[A-Z]<))/F<$1>/xg;
+ s/\\(?:vers|PARIversion)(\{\}|\b|(?=[\d_]))/$version/ if defined $version;
+
+ # Conflict between different versions of PARI and refcard:
+ s/\\(?:key|li)\b\s*{(.*)}\s*{(.+)}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/mg;
+ s/\\(?:key|li)\b\s*{(.*)}\s*{}[ \t]*\n/\n\n=back\n\n$1\n\n=over\n\n/mg;
+ s/\\(key|var)\b\s*{(\w+)}/C<$2>/mg;
+ s/\\var\b\s*{X<(\w+)>(\w+)}/X<$1>C<$2>/mg;
+ s/\\var\b\s*{f{}lag}/C<flag>/mg;
+
+ s/\\metax\b\s*{(.*)}\s*{\s*(\w+)(?=C\<)(.*)}[ \t]*\n/\n\n=item C<L<$2>$3>\n\n$1\n\n/mg;
+ s/\\metax\b\s*{(.*)}\s*{(.*)}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/mg;
+ s/\\hbox(\b|(?=[A-Z]\<))//g;
+ # s/\\kbd\{([^{}]*)\}/\\$1/g;
+ s/C\<\{\}=/C\<=/g;
+ s/\\fl\b/I<flag>/g;
+ s/\\file\b/F<file>/g;
+ s/\\bullet\b/---/g; # XXXX ?
+ s/\\label\s*\{([\w:-]*)\}/X<Label $1>/g;
+ s/\\secref\s*\{([\w:-]*)\}/L<Label $1>/g;
+ s/\\rightarrow(?![a-zA-Z])/C<--E<gt>>/g;
+ s/\\longleftrightarrow(?![a-zA-Z])/C<E<lt>-----E<gt>>/g;
+ s/\\begin(double)?indentedkeys/\n\n=over\n\n/g;
+ s/\\end(double)?indentedkeys/\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
+ # for refcard:
+ s/{\\rm\b\s*([^{}]*)}/$1/g;
+ s/\\Z<>/\\/g;
+ print;
+}
+
--- ../config/doc_Makefile.SH~ Mon Dec 15 16:23:24 1997
+++ ../config/doc_Makefile.SH Sat Apr 18 18:50:32 1998
@@ -6,6 +6,13 @@
all: doc refcard tutorial
+.SUFFIXES: .tex .pod
+
+PARIVERSION = $version
+
+.tex.pod :
+ perl paridoc_to_pod -v=\$(PARIVERSION) \$*.tex > \$*.pod
+
doc manual: users.dvi
tutorial: tutorial.dvi
@@ -38,4 +45,18 @@
veryclean: clean
rm -f macros.tex
+
+PARI.ipf: refcard.pod usersch1.pod usersch2.pod usersch3.pod usersch4.pod usersch5.pod
+ perl -S pod2ipf --by-files "--title=GP/PARI manual" \\
+ "--section=Reference card" --file=refcard.pod \\
+ "--section=Overview of the PARI System" --file=usersch1.pod \\
+ "--section=Specific use of the GP calculator" --file=usersch2.pod \\
+ "--section=Functions and Operations available in PARI and GP" --file=usersch3.pod \\
+ "--section=Programming PARI in Library Mode" --file=usersch4.pod \\
+ "--section=Technical reference guide for low-level functions" --file=usersch5.pod \\
+ --head-off=1 > \$@
+
+PARI.inf: PARI.ipf
+ ipfc /inf PARI.ipf
+
EOT