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