> < ^ Date: Thu, 18 Aug 1994 10:13:00 -0400
> < ^ From: Steve Fisk <fisk@polar.bowdoin.edu >
> ^ Subject: info files for gap

Dear Gap Forum,
The documentation is getting so large that it it is hard to
comprehend. The online help is useful, but does not enable browsing.
I therefore wrote a conversion program from the tex files to EMACS
info format. It's the biggest info file I've ever seen (57 files)!

Directions:

0) Create a directory to hold the info files.
1) Save the shar portion of this message in a file INFO-GAP
in this directory
2) Type "unshar INFO-GAP" (or if you do not have unshar,
change INFO-GAP to executable, and type "INFO-GAP".
3) Read the file README, and make a few changes in "info.pl".
4) Type "info.pl", and wait 30 minutes (or so).
5) Fix up the index, and you're done!

I hope that you find this useful. It is easy to change this to
include new documentation. It's almost, but not quite, automatic.

--
Steve Fisk                              Department of Mathematics
207-725-3574                            Bowdoin College
fisk@bowdoin.edu                        Brunswick, Me. 04011 USA


#!/bin/sh
# This is a shell archive (produced by shar 3.52.3)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 08/18/1994 13:25 UTC by fisk@bruin.bowdoin.edu
# Source directory /people/faculty/math/fisk/tmp/GAP-texi
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#   2093 -rw------- README
#     75 -rw-r--r-- GAP-INDEX.texi
#    104 -rw-r--r-- GAP-emacs.el
#   4366 -rw-r--r-- GAP.texi-orig
#   5885 -rwxr--r-- info.pl
#
touch -am 1231235999 $$.touch >/dev/null 2>&1
if test ! -f 1231235999 && test -f $$.touch; then
  shar_touch=touch
else
  shar_touch=:
  echo 'WARNING: not restoring timestamps'
fi
rm -f 1231235999 $$.touch
#
# ============= README ==============
if test -f 'README' && test X"$1" != X"-c"; then
  echo 'x - skipping README (File already exists)'
else
  echo 'x - extracting README (Text)'
  sed 's/^X//' << 'SHAR_EOF' > 'README' &&
Preliminary changes:
X
X       I was amazed how well the documentation followed its rules.  Creating
X       the info file was not hard (although I had to learn perl to do it).
X       I only found one syntactic mistake in the info files that needed
X       changing:  in install.tex, there are many references to |c:\|; these
X       should be changed to |c:|.  I think that there might also be one
X       occurrence of |grp\| there (change it to |grp|, but my notes are
X       not clear about that.
X
X
How to create the info files.
X
X       1) make a new directory to hold the info files
X
X       2) copy info.pl, GAP-emacs.el, and GAP-texi.orig to this directory.
X
X       3) edit info.pl - there are two directories that must be specified.
X               Also, check if the pathname to perl (first line) is correct.
X
X       4) run info.pl - this takes a while (10 minutes to 30 minutes for me)
X               it produces lots of messages!
X
X       5) If all goes well, at the very end you should get the message
X
X
Removing temp files and emacs backups
Making info file `GAP.info' from `GAP.texi'.
/people/faculty/math/fisk/tmp/GAP-texi/algebra.texi:1982:
X       This `example' doesn't have a matching `@end example'.
X
X
X               (I don't understand this error.)
X
X       6) The result of the computation is:
X
X               GAP.info
X               GAP.info-1 ... GAP.info-57
X               algebra.texi algebra-menu.texi ... (two for each chapter)
X
X               All the files except the files GAP.info* can be removed
X               if you are satisfied with the outcome.
X
X       6) For some reason, the index file is not correct.  For me,
X          the index is located in GAP.info-57.  Find the two lines
X
X
Command Index
*************
X
X          All the menu items have several leading spaces.  So, instead of
X
X     * Menu:
X
X     * AbelianGroup:                    The Basic Groups Library.
X     * AbelianInvariantsNormalClosureFpGroup: Group Functions for Finitely Presented Groups.
X  (etc)
X
X       you should remove the leading spaces to create
X
X
* Menu:
X
* AbelianGroup:                    The Basic Groups Library.
* AbelianInvariantsNormalClosureFpGroup: Group Functions for Finitely Presented Groups.
X  (etc)
X
X
X       7) With these changes, you should have an info file for GAP!
X
SHAR_EOF
  $shar_touch -am 0818092294 'README' &&
  chmod 0600 'README' ||
  echo 'restore of README failed'
  shar_count="`wc -c < 'README'`"
  test 2093 -eq "$shar_count" ||
    echo "README: original size 2093, current size $shar_count"
fi
# ============= GAP-INDEX.texi ==============
if test -f 'GAP-INDEX.texi' && test X"$1" != X"-c"; then
  echo 'x - skipping GAP-INDEX.texi (File already exists)'
else
  echo 'x - extracting GAP-INDEX.texi (Text)'
  sed 's/^X//' << 'SHAR_EOF' > 'GAP-INDEX.texi' &&
@node   Command Index, , weyl, Top
@chapter Command Index
X
@printindex cm
X
SHAR_EOF
  $shar_touch -am 0818090894 'GAP-INDEX.texi' &&
  chmod 0644 'GAP-INDEX.texi' ||
  echo 'restore of GAP-INDEX.texi failed'
  shar_count="`wc -c < 'GAP-INDEX.texi'`"
  test 75 -eq "$shar_count" ||
    echo "GAP-INDEX.texi: original size 75, current size $shar_count"
fi
# ============= GAP-emacs.el ==============
if test -f 'GAP-emacs.el' && test X"$1" != X"-c"; then
  echo 'x - skipping GAP-emacs.el (File already exists)'
else
  echo 'x - extracting GAP-emacs.el (Text)'
  sed 's/^X//' << 'SHAR_EOF' > 'GAP-emacs.el' &&
(load-library "texnfo-upd")
(texinfo-multiple-files-update "GAP.texi" t t)
(save-buffers-kill-emacs t)
SHAR_EOF
  $shar_touch -am 0729104094 'GAP-emacs.el' &&
  chmod 0644 'GAP-emacs.el' ||
  echo 'restore of GAP-emacs.el failed'
  shar_count="`wc -c < 'GAP-emacs.el'`"
  test 104 -eq "$shar_count" ||
    echo "GAP-emacs.el: original size 104, current size $shar_count"
fi
# ============= GAP.texi-orig ==============
if test -f 'GAP.texi-orig' && test X"$1" != X"-c"; then
  echo 'x - skipping GAP.texi-orig (File already exists)'
else
  echo 'x - extracting GAP.texi-orig (Text)'
  sed 's/^X//' << 'SHAR_EOF' > 'GAP.texi-orig' &&
\input texinfo    @c -*- texinfo -*-
@c %**start of header
@setfilename GAP.info
@settitle GAP @value{version}
@c make a command index:
@defcodeindex cm
@c %**end of header
X
@set version 1.5
@set update-date 2 Feb 1994
@set update-month Feb 1994
X
@clear smallbook
X
@c Play with some whitespace settings:
@tex
\global\chapheadingskip = 15pt plus 4pt minus 2pt
\global\secheadingskip = 12pt plus 3pt minus 2pt
\global\subsecheadingskip = 9pt plus 2pt minus 2pt
@end tex
X
@c Use smaller whitespace between paragraphs in the 8.5x11 format:
@ifclear smallbook
@tex
\global\parskip 6pt plus 1pt
@end tex
@end ifclear
X
@finalout
X
@ifinfo
X
@end ifinfo
X
@setchapternewpage odd
@titlepage
@title GAP
X
X
@c The following two commands start the copyright page.
@c Put it inside the titlepage to turn off headings:
@page
@vskip 0pt plus 1filll
X
@end titlepage
X
@node   Top, aboutgap, (dir), (dir)
@top GAP
X
@menu
* aboutgap::About GAP
* language::The Programming Language
* environm::Environment
* domain::Domains
* ring::Rings
* field::Fields
* group::Groups
* operatio::Operations of Groups
* vecspace::Vector Spaces
* integer::Integers
* numtheor::Number Theory
* rational::Rationals
* cyclotom::Cyclotomics
* gaussian::Gaussians
* numfield::Subfields of Cyclotomic Fields
* unknown::Unknowns
* finfield::Finite Fields
* polynom::Polynomials
* permutat::Permutations
* permgrp::Permutation Groups
* word::Words in Abstract Generators
* fpgrp::Finitely Presented Groups
* agwords::Words in Finite Polycyclic Groups
* aggroup::Finite Polycyclic Groups
* saggroup::Special Ag Groups
* list::Lists
* set::Sets
* blister::Boolean Lists
* string::Strings and Characters
* range::Ranges
* vector::Vectors
* rowspace::Row Spaces
* matrix::Matrices
* matring::Matrix Rings
* matgrp::Matrix Groups
* grplib::Group Libraries
* algebra::Algebras
* algfp::Finitely Presented Algebras
* algmat::Matrix Algebras
* module::Modules
* mapping::Mappings
* homomorp::Homomorphisms
* boolean::Booleans
* record::Records
* combinat::Combinatorics
* tom::Tables of Marks
* chartabl::Character Tables
* gentable::Generic Character Tables
* characte::Characters
* paramaps::Maps and Parametrized Maps
* gettable::Character Table Libraries
* classfun::Class Functions
* monomial::Monomiality Questions
* install::Getting and Installing GAP
* share::Share Libraries
* anupq::ANU Pq
* grape::Grape
* mtx::The MeatAxe
* sisyphos::Sisyphos
* smash::Smash, Matrix Groups and $G$-Modules
* ve::Vector Enumeration
* weyl::Weyl Groups and Hecke Algebras
* aboutgap::About GAP
* language::The Programming Language
* environm::Environment
* domain::Domains
* ring::Rings
* field::Fields
* group::Groups
* operatio::Operations of Groups
* vecspace::Vector Spaces
* integer::Integers
* numtheor::Number Theory
* rational::Rationals
* cyclotom::Cyclotomics
* gaussian::Gaussians
* numfield::Subfields of Cyclotomic Fields
* unknown::Unknowns
* finfield::Finite Fields
* polynom::Polynomials
* permutat::Permutations
* permgrp::Permutation Groups
* word::Words in Abstract Generators
* fpgrp::Finitely Presented Groups
* agwords::Words in Finite Polycyclic Groups
* aggroup::Finite Polycyclic Groups
* saggroup::Special Ag Groups
* list::Lists
* set::Sets
* blister::Boolean Lists
* string::Strings and Characters
* range::Ranges
* vector::Vectors
* rowspace::Row Spaces
* matrix::Matrices
* matring::Matrix Rings
* matgrp::Matrix Groups
* grplib::Group Libraries
* algebra::Algebras
* algfp::Finitely Presented Algebras
* algmat::Matrix Algebras
* module::Modules
* mapping::Mappings
* homomorp::Homomorphisms
* boolean::Booleans
* record::Records
* combinat::Combinatorics
* tom::Tables of Marks
* chartabl::Character Tables
* gentable::Generic Character Tables
* characte::Characters
* paramaps::Maps and Parametrized Maps
* gettable::Character Table Libraries
* classfun::Class Functions
* monomial::Monomiality Questions
* install::Getting and Installing GAP
* share::Share Libraries
* anupq::ANU Pq
* grape::Grape
* mtx::The MeatAxe
* sisyphos::Sisyphos
* smash::Smash, Matrix Groups and $G$-Modules
* ve::Vector Enumeration
* weyl::Weyl Groups and Hecke Algebras
* Comamnd Index::Index of Commands
@end menu
X
XXXXXXinclude-hereXXXXX
X
@page
X
@include GAP-INDEX.texi
X
@contents
@bye
X
X
X
SHAR_EOF
  $shar_touch -am 0817154294 'GAP.texi-orig' &&
  chmod 0644 'GAP.texi-orig' ||
  echo 'restore of GAP.texi-orig failed'
  shar_count="`wc -c < 'GAP.texi-orig'`"
  test 4366 -eq "$shar_count" ||
    echo "GAP.texi-orig: original size 4366, current size $shar_count"
fi
# ============= info.pl ==============
if test -f 'info.pl' && test X"$1" != X"-c"; then
  echo 'x - skipping info.pl (File already exists)'
else
  echo 'x - extracting info.pl (Text)'
  sed 's/^X//' << 'SHAR_EOF' > 'info.pl' &&
#!/usr/local/bin/perl
X
#             An overview of the files
X
# Original Files
X
#     GAP-emacs.el          Used to update all the nodes in the texinfo file
#     GAP.texi-orig         Skeleton used to create main texinfo file
#     GAP-INDEX.texi        Read in to input the index
X
# Created Files
X
#     GAPinclude.texi       List of texinfo files to be included; it is
#                           inserted into GAP.texi-orig to make GAP.texi
#     GAP.texi              main texinfo file
#     ?.texi                one file for each chapter
#     GAPmainmenu.texi      If you want, you could replace (by hand!) the
#                           menu in GAP.texi by this one -
#                           it has the section names
X
#
# Set the following to the GAP home directory
#
X
$GAPdir = "/people/faculty/math/fisk/usr/local/src/gap3r4p0";
X
#
# Where the info files should be (and the file GAP.info is)
#
X
$GAPinfodir = "/people/faculty/math/fisk/tmp/GAP-texi";
X
###############################################################
#
#                 Nothing more to change
#
###############################################################
X
#
# test to see that the files and directories are there
#
X
chdir($GAPinfodir) || die("please make the info directory\n");
$tmpfile = $GAPinfodir . "/TEMP";
X
if (!(-e "GAP.texi-orig"))       {die("file GAP.texi-orig not found")};
if (!(-e "GAP-emacs.el"))        {die("file GAP-emacs.el not found")};
if (!(-w $GAPdir))               {die("directory for GAP  not writable")};
X
X
#
# files included in top info file
#
X
open(GAPinclude,       ">GAPinclude.texi");
open(GAPmainmenu,      ">GAPmainmenu.texi");
open(GAPtexinfo,       ">GAP.texi");
open(GAPtexinfoXX,     "GAP.texi-orig");
X
#
# the list of all chapters, in order from manual.tex
#
X
@GAPlist = ("aboutgap","language","environm", "domain", "ring", "field",
"group","operatio","vecspace","integer","numtheor","rational","cyclotom",
"gaussian","numfield","unknown","finfield","polynom","permutat","permgrp",
"word","fpgrp","agwords","aggroup","saggroup","list","set","blister","string",
"range","vector","rowspace","matrix","matring","matgrp","grplib","algebra",
"algfp","algmat","module","mapping","homomorp","boolean","record","combinat",
"tom","chartabl","gentable","characte","paramaps","gettable","classfun",
"monomial","install","share","anupq","grape","mtx","sisyphos","smash","ve",
"weyl");
X
#@GAPlist = ("aboutgap","language");
#@GAPlist = ("install");
X
#
# convert each chapter
#
X
foreach $GAPchapter (@GAPlist) {
X
X
X    $current = $GAPdir     . "/doc/" . $GAPchapter . ".tex";
X    $texinfo = $GAPinfodir . "/"     . $GAPchapter . ".texi";
X    $texmenu = $GAPinfodir . "/"     . $GAPchapter . "-menu.texi";
X
X    $parity_of_bar = 0;                # reset at beginning of each chapter
X
X    print "Processing $current\n";
X    print GAPinclude "@include $texinfo\n";
X
X    open(GAPfile,$current)             || die "can't open $current";
X    open(GAPtexi, ">" . $texinfo)      || die("can't open $texinfo\n");
X    open(GAPmenu, ">" . $texmenu)      || die("can't open $texmenu\n");
X
X
X
X  Main:
X    while(<GAPfile>) {
X       chop($_);
X       $name = $_;
#
#  skip comments
#
X       if(substr($_,0,1) eq "%") {
X           next Main;
X       }
X
X       s/@/@@/g;                              # fix @'s
X       s/\\\\{}/@*/g;                         # break lines
X       s/\\\\/@*/g;
X       s/\\vspace{[\d\w]*}//g;                # no vspace
X       s/\\index{(\w*)}/\n@cmindex \1 \n/g;   # fix index
X       s/\\index{(\w*!\w*)}/\n@cmindex \1 \n/g;
X       s/{/ @{/g;                             # protect { and }
X        s/}/ @}/g;
X
#
# worry about literals
#
X       s/\|\\\|/BARSLASHBAR/g;
X       s/\\\|/BBAARR/g;                # temporarily change literal bars
X       $number_of_bars=0;              # count bars (page 155, perl book)
X       $pos = 0;
X       while (( $pos = index($_,"|",$pos)) >= 0) {
X           $pos++;
X           $number_of_bars++;
X       }
#
# skip if an even number of bars
#
X       if( ($number_of_bars % 2) == 1) {
X           $parity_of_bar = 1 - $parity_of_bar;
X           if($parity_of_bar == 1)
X               {s/\|/\n@example\n/;}
X           else
X              {s/\|/\n@end example\n/;}
X       };
X       s/BBAARR/\\\|/g;                # restore literal bars
X       s/BARSLASHBAR/\|\\\|/g;
#
#   Write
#
X     $writeout = 1;
X     if(/\\Chapter|\\Section/) {
X        $writeout = 0;
X        $name =~ s/\\Chapter{//g;
X        $name =~ s/\\Section{//g;
X        $name =~ s/}//g;
X        $name =~ s/}//g;
X         $name =~ s/%//g;
X         $name =~ s/\\index.*//g;
X     };
X       if(/\\Chapter/) {
X           print GAPmenu "@node $GAPchapter,Top,Top,Top\n";
X           print GAPmenu "@chapter $name\n";
X           print GAPmenu "@menu \n";
X           print GAPmainmenu "* $GAPchapter::$name \n";
X       };
X       if(/\\Section/){
X           print GAPtexi "@node $name\n";
X           print GAPtexi "@section $name\n";
X           print GAPmenu "*  $name:: \n";
X       };
X     if($writeout == 1) {      # write out
X        print GAPtexi "$_\n";
X       };
X    }
X
#
#  Close files
#
X    print GAPmenu "@end menu \n";
X    close(GAPfile);
X    close(GAPtexi);
X    close(GAPmenu);
X
#
#  copy the menu to the beginning of the file, and then remove it
#
X    system("mv $texinfo $tmpfile");
X    system("cat $texmenu $tmpfile > $texinfo");
#    unlink($texmenu);
}
X
X
X
X
X
#
# copy the include files to the main texinfo file
#
X
close(GAPinclude);
open(GAPinclude,       "GAPinclude.texi");
X
while(<GAPtexinfoXX>) {
X    if(index($_,"XXXXXinclude-hereXXXXX") == -1){
X       print GAPtexinfo;
} else {
X    while(<GAPinclude>) {
X       print GAPtexinfo;
X   }
}}
X
close(GAPtexinfo);
X
X
#
#  update the new texinfo file
#
X
X       print "   updating nodes - this takes a long time \n";
X       system("emacs -batch -q   -l GAP-emacs.el ");
X
X
#
# all done - remove temp file and backups created by emacs
#
X
print "\nRemoving temp files and emacs backups\n";
close(GAPmainmenu);
unlink($tmpfile);
X
foreach $GAPchapter (@GAPlist) {
X    $texinfo_back = $GAPinfodir . "/" . $GAPchapter . ".texi~";
X    unlink($texinfo_back);
}
X
X
#
# run makeinfo and create the info files
#
X
X
system("makeinfo GAP.texi");
X
X
X
X
SHAR_EOF
  $shar_touch -am 0817145794 'info.pl' &&
  chmod 0744 'info.pl' ||
  echo 'restore of info.pl failed'
  shar_count="`wc -c < 'info.pl'`"
  test 5885 -eq "$shar_count" ||
    echo "info.pl: original size 5885, current size $shar_count"
fi
exit 0

> < [top]