aboutsummaryrefslogtreecommitdiff
path: root/src/scripts
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/scripts
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/scripts')
-rw-r--r--src/scripts/ChangeLog109
-rw-r--r--src/scripts/axiom.in215
-rwxr-xr-xsrc/scripts/document.in336
-rwxr-xr-xsrc/scripts/showdvi1
-rwxr-xr-xsrc/scripts/tex/axiom.sty946
5 files changed, 1607 insertions, 0 deletions
diff --git a/src/scripts/ChangeLog b/src/scripts/ChangeLog
new file mode 100644
index 00000000..b6f55ee2
--- /dev/null
+++ b/src/scripts/ChangeLog
@@ -0,0 +1,109 @@
+2007-06-25 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in (check_mode_value): Remove save-image support.
+ (compile_lisp_file): Add support for ECL.
+ (load_lisp_and_save_image): Remove.
+ (make_program): Tidy. Add support for ECL.
+ (translate_boot_file): Likewise.
+
+2007-05-12 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Throughout, capitalize boottran.
+ Use new interface functions compfile-lisp-file,
+ translate-boot-to-lisp.
+
+2007-05-08 Gabriel Dos Reis <gdr@cs.tamu,edu>
+
+ * axiom.in: New. Supercede src/etc/axiom.
+
+2007-04-12 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in (load_lisp_and_save_image): Push into BOOTTRAN after
+ the load.
+
+2007-04-10 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Don't use full internal name of symbols in package
+ boottran. Push into that package first, and use short name.
+
+2007-04-07 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in (load_lisp_and_save_image): Proclaim safety if
+ runtime checking is requested.
+
+2007-03-31 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in (make_program): Don't use quiet.
+
+2007-03-26 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in (load_lisp_and_save_image): Don't use quiet mode.
+
+2007-03-24 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in (lisp_flavor): Don't print debug information.
+
+2007-03-13 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Support for --mode=save-image, and --use=.
+ (quiet): New.
+ (eval_flags): Likewise.
+ (lisp_flavor): Likewise.
+ (compile_lisp_file): New
+ (load_lisp_and_save_image): Likewise.
+ (make_program): Likewise.
+
+2007-03-04 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Don't set TEXINPUTS and BIBINPUTS here. Too brittle
+ to get right.
+
+2006-12-26 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Tidy.
+
+2006-11-22 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in (--tangle): Remove yucky hack.
+
+2006-11-22 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in (--tangle): Go through contorsions to support
+ chunk names with embedded blank.
+
+o2006-11-20 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Extend to handle --mode, and --tag for translation
+ and compilation of Boot and Lisp codes.
+
+2006-09-04 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Fix thinko.
+
+2006-09-04 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Support --tangle= and --output=
+
+2006-09-04 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Support --tangle. Fix thinko. Summarize usage.
+
+2006-09-03 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Add support for --weave and --latex.
+
+2006-08-28 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * Makefile.pmaphelt: Delete.
+
+2006-08-09 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * document.in: Rename from document.
+ * boxup.in: Remove.
+
+2006-08-08 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * Makefile.pamphlet (${OUT}/Makefile.pamphlet): Copy only showdvi.
+
+ * boxup.in: Rename from boxup. Fix bogus hardcoded file names.
+
diff --git a/src/scripts/axiom.in b/src/scripts/axiom.in
new file mode 100644
index 00000000..3b1b7c3c
--- /dev/null
+++ b/src/scripts/axiom.in
@@ -0,0 +1,215 @@
+#!/bin/sh
+
+# Start everything for Axiom.
+#
+# axiom
+# [-ht |-noht] whether to use HyperDoc
+# [-gr |-nogr] whether to use Graphics
+# [-clef |-noclef] whether to use Clef
+# [-nag |-nonag] whether to use NAG
+# [-iw |-noiw] start in interpreter window
+# [-ihere|-noihere] start an interpreter buffer in the original window
+# [-nox] don't use X Windows
+# [-go |-nogo] whether to start system
+# [-ws wsname] use named workspace
+# [-list] list workspaces only
+# [-grprog fname] use named program for Graphics
+# [-nagprog fname] use named program for Nag
+# [-htprog fname] use named program for HyperDoc
+# [-clefprog fname] use named program for Clef
+# [-sessionprog fname] use named program for session
+# [-clientprog fname] use named program for spadclient
+# [-h] show usage
+#
+#
+
+## Where The Axiom system resides
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+AXIOM=@libdir@/axiom/target/@target@
+export AXIOM
+
+## We adjust the value of PATH here because, currently, some Axiom
+## programs are called from the executing shell, and relying on the
+## fact that the executables are reachable from the PATH.
+PATH=$AXIOM/bin:$PATH
+
+## If the system is built without Superman support, there is
+## no point in trying to forcefully use Superman
+use_sman=@axiom_use_sman@
+
+
+MALLOCTYPE=3.1
+export MALLOCTYPE
+
+# NAGMAN needs to know the hostname
+HOST=`hostname`
+export HOST
+
+# 0. Basic utilities
+
+ciao() {
+ echo "Goodbye."
+ exit 1
+}
+
+needsubopt () {
+ echo "The $1 option requires an argument."
+ ciao
+}
+
+
+showuse() {
+echo "axiom"
+echo " [-ht |-noht] whether to use HyperDoc"
+echo " [-gr |-nogr] whether to use Graphics"
+echo " [-clef |-noclef] whether to use Clef"
+echo " [-nag |-nonag] whether to use NAG"
+echo " [-iw |-noiw] start in interpreter window"
+echo " [-ihere|-noihere] start an interpreter buffer in the original window."
+echo " [-nox] don't use X Windows"
+echo " [-go |-nogo] whether to start system"
+echo " [-ws wsname] use named workspace"
+echo " [-list] list workspaces only"
+#echo " [-grprog fname] use named program for Graphics"
+#echo " [-nagprog fname] use named program for Nag"
+#echo " [-htprog fname] use named program for HyperDoc"
+#echo " [-clefprog fname] use named program for Clef"
+#echo " [-sessionprog fname] use named program for session"
+#echo " [-clientprog fname] use named program for spadclient"
+echo " [-h] show usage"
+}
+
+# 1. Ensure the environment is set.
+
+# Just process '-h'
+
+if [ "$*" = "-h" ] ; then
+ showuse
+fi
+
+if [ "$SPAD" = "" ] ; then
+ if [ "$AXIOM" = "" ] ; then
+ echo "AXIOM variable is not set"
+ exit 1
+ else
+ SPAD=$AXIOM
+ fi
+ export SPAD
+else
+ if [ "$AXIOM" = "" ] ; then
+ echo "AXIOM variable is not set"
+ echo "but SPAD = $SPAD"
+ echo "Using AXIOM = $SPAD"
+ AXIOM=$SPAD
+ export AXIOM
+ else
+ if [ ! "$SPAD" = "$AXIOM" ] ; then
+ echo "ignoring SPAD variable"
+ SPAD=$AXIOM
+ fi
+ fi
+fi
+
+if [ "$AXIOMXLROOT" = "" ] ; then
+AXIOMXLROOT=${AXIOM}/compiler
+fi
+export AXIOMXLROOT
+PATH=$AXIOMXLROOT/bin:${PATH}
+export PATH
+
+
+
+if [ ! -d "$SPAD" ] ; then
+ echo "The directory for Axiom, $SPAD, does not exist."
+ ciao
+fi
+
+# Name the workspace directories.
+rootwsdir=$SPAD/bin
+
+# 2. Process command line arguments.
+
+# Defaults for command-line arguments.
+list=no
+go=yes
+wsname=AXIOMsys
+
+otheropts=""
+
+while [ "$*" != "" ] ; do
+
+ case $1 in
+ -list) list=yes
+ go=no;;
+ -go) go=yes ;;
+ -nogo) go=no ;;
+
+ -ws)
+ if [ "$2" = "" ] ; then needsubopt "$1" ; fi
+ shift
+ wsname="$1"
+ ;;
+
+ -nagprog|-grprog|-htprog|-clefprog|-sessionprog|-clientprog|-paste|-rm|-rv)
+ if [ "$2" = "" ] ; then needsubopt "$1" ; fi
+ otheropts="$otheropts $1 $2"
+ shift
+ ;;
+ -clef|-noclef|-gr|-nogr|-ht|-noht|-iw|-noiw|-ihere|-noihere|-nox|-nag|-nonag)
+ otheropts="$otheropts $1"
+ ;;
+
+ -h)
+ go=no
+ ;;
+
+
+ *) echo "Unknown option: $1"
+ echo "To use a specific workspace use, e.g.: spad -ws $1"
+ ciao
+ ;;
+ esac
+
+ shift
+done
+
+# 3. List the available workspaces, if asked
+
+listwspaces()
+{
+ echo "$1"
+ ls -l $2 | grep "sys$"
+ echo ""
+}
+
+if [ $list = yes ] ; then
+ listwspaces "AXIOM workspaces in \$AXIOM/bin = $rootwsdir: " $rootwsdir
+fi
+
+# 5. Try to ensure a suitable workspace on this host.
+
+if [ `expr $wsname : '.*/.*'` = 0 ] ; then
+ serverws=$rootwsdir/$wsname
+else
+ serverws=$wsname
+fi
+
+if [ ! -f $serverws ] ; then
+ showuse
+ ciao
+fi
+
+# 6. Start processes
+
+if [ $go = no ] ; then
+ echo "Would now start the processes."
+ echo exec $SPAD/bin/sman $otheropts -ws $serverws
+ exit 0
+fi
+
+if [ $use_sman = "yes" ]; then
+ exec $SPAD/bin/sman $otheropts -ws $serverws
+else
+ exec $serverws
+fi
diff --git a/src/scripts/document.in b/src/scripts/document.in
new file mode 100755
index 00000000..93425720
--- /dev/null
+++ b/src/scripts/document.in
@@ -0,0 +1,336 @@
+#!/bin/sh
+
+# usage:
+# document [options] file
+# [ plus any legacy usage ]
+#
+# options:
+# --index
+# Run makeindex on the input file
+#
+# --latex
+# Typeset input file assuming it a LaTeX file
+#
+# --mode=what
+# In conjunction with --tag=lang, indicates what to do
+# with input files assumed to contain program source code.
+# Valid values are: compile, translate, link.
+#
+# --output=outfile
+# Set the output filename.
+#
+# --tag=lang
+# Process input files as programs written in language
+# indicated by lang. Valid values are: boot, lisp.
+#
+# --tangle
+# --tangle=chunk
+# Run notangle on the input file assumed to be a pamphlet.
+#
+# --use=cmd
+# Use cmd for translation or compilation.
+#
+# --weave
+# Run noweave on the input file assumed to be a pamphlet
+# When combined with --output, also run latex.
+# --
+# Anything that comes after is treated as an argument, even
+# if it looks like an option
+
+## 2007-04-10:
+## After moving to a recent version of MSYS, and GCL-2.6.8pre, I
+## noticed that double-colon ('::' in boottran::boottocl) will be
+## translated to semi-colon (';') as if interpreted for path
+## separator. I don't who is doing that, and I have no time to
+## investigate it, and even if I do, it would not help much.
+## Therefore, I've changed the script not to use double-colon.
+## -- Gaby
+
+
+# set -x
+
+# Flags used to invoke the Lisp compiler in batch mode
+quiet="@axiom_quiet_flags@"
+eval_flags="@axiom_eval_flags@"
+
+# The flavor of Lisp implementation we're using
+lisp_flavor=@axiom_lisp_flavor@
+
+# safety option -- used only when saving image.
+enable_checking=@axiom_enable_checking@
+
+# Issue a diagnostic message and exit with non-zero status.
+error() {
+ echo "error: $1"
+ exit 1
+}
+
+# Issue a diagnostic if an option ($1) requires a argument
+# and its value ($2) is empty.
+maybe_missing_value_for() {
+ if test -z $2; then
+ error "missing value for $1"
+ fi
+}
+
+# Check validity of --tag. At the moment
+# we support only "boot" and "lisp"
+check_tag_value() {
+ case $1 in
+ boot|lisp)
+ tag=$1
+ ;;
+ *)
+ error "invalid tag $1"
+ ;;
+ esac
+}
+
+# Validate argument for --mode. We support only
+# - "compile", for Lisp source file
+# - "translate", for Boot source file
+check_mode_value() {
+ case $1 in
+ compile|translate|link)
+ mode=$1
+ ;;
+ *)
+ error "invalid mode $1"
+ ;;
+ esac
+}
+
+# Compile a program written in Lisp to FASL code.
+# $1 is the input file name
+# $2 is the output file name
+compile_lisp_file() {
+ case $lisp_flavor in
+ gcl|sbcl|clisp|ecl)
+ $command -- --compile $1
+ ;;
+ *)
+ error "don't know how to compile with '$lisp_flavor' Lisp"
+ ;;
+ esac
+ return $?
+}
+
+# Build an executable out of (compiled) Lisp files.
+make_program() {
+ case $lisp_flavor in
+ gcl|sbcl|clisp|ecl)
+ $command -- --make --output=$output $@
+ ;;
+ *)
+ error "don't know how to build program with '$lisp_flavor' Lisp"
+ ;;
+ esac
+}
+
+# Translate a program written in Boot to Lisp
+# $1 designates the translator
+# $2 is the input file
+# $3 is a temporary file where we dump compiler diagnostics
+translate_boot_file() {
+ case $lisp_flavor in
+ gcl|sbcl|clisp|ecl)
+ $command -- --translate $1 | tee $2
+ ;;
+ *)
+ error "don't know how to translate with '$lisp_flavor' Lisp"
+ ;;
+ esac
+ return $?
+}
+
+do_index=
+do_latex=
+do_tangle=
+do_weave=
+chunk=
+file=
+output=
+tag=
+mode=
+command=
+
+while test $# -gt 0 ; do
+ optval=$1
+
+ case $optval in
+ --)
+ break
+ ;;
+ --*=*)
+ arg=`echo $optval | sed -e 's/^[-a-zA-Z]*=//'`
+ opt=`echo $optval | sed -e 's/=.*$//'`
+ shift;
+ ;;
+ --*)
+ opt=$optval
+ arg=
+ shift
+ ;;
+ *)
+ break
+ ;;
+ esac
+
+ case $opt in
+ --weave)
+ do_weave=yes
+ ;;
+
+ --latex)
+ do_latex=yes
+ ;;
+
+ --index)
+ do_index=yes
+ # FIXME: --index may be used only with --latex. Check.
+ ;;
+
+ --tangle)
+ do_tangle=yes
+ if test -n "$arg"; then
+ chunk=$arg
+ fi
+ # --tangle may not be combined with any other
+ # options. FIXME: Check that.
+ ;;
+
+ --output)
+ maybe_missing_value_for $opt $arg
+ output=$arg
+ ;;
+
+ --tag)
+ maybe_missing_value_for $opt $arg
+ check_tag_value $arg
+ ;;
+
+ --mode)
+ maybe_missing_value_for $opt $arg
+ check_mode_value $arg
+ ;;
+ --use)
+ command=$arg
+ ;;
+
+ --*)
+ echo unrecognized option $opt
+ exit 1
+ ;;
+ esac
+done
+
+if test x$do_tangle = xyes; then
+ # FIXME: Check that the input file name does indeed have
+ # a pamphlet extension.
+ file=$1
+ if [ -z $output ]; then
+ output=`basename $file .pamphlet`;
+ fi
+
+ # FIXME: Ideally, we should just prepend -R to $chunk
+ # if it is non-null, and say $tangle $chunk $file > $output
+ # Alternatively, we could initialize chunk to '*' and
+ # unconditionally use -R"$chunk".
+ if [ -z "$chunk" ]; then
+ notangle $file > $output
+ else
+ notangle -R"$chunk" $file > $output
+ fi
+ # FIXME: Handle errors.
+ exit $?;
+fi
+
+
+if test x$do_weave = xyes; then
+ file=`basename $1 .pamphlet`
+ noweave -delay $1 > $file.tex
+ if test x$do_latex != xyes; then
+ exit 0;
+ fi
+fi
+
+if test x$do_latex = xyes; then
+ if [ -z $file ]; then
+ file=`basename $1 .tex`
+ fi
+ latex --interaction nonstopmode $file;
+ if [ x$do_index = xyes ]; then
+ makeindex $file.idx
+ fi
+ latex --interaction nonstopmode $file;
+ exit $?
+fi
+
+# We only support translation of Boot source files, and
+# compilation of Lisp source files
+case $mode,$tag in
+ translate,boot)
+ # The bootsys image is currently unable to pass up an
+ # exit status that we can hand to the shell. When an error
+ # occurs, bootsys just prints a message and exits as if
+ # everything went well. To work around that, we have to
+ # capture its output, look for specific patterns, and then
+ # return an appropriate exit status.
+ # mktemp is used to create a temporary file; for systems that
+ # lack support for mktemp, e.g. MinGW/MSYS, we use the common
+ # trick of forging a filename based on the pid.
+ if test -z "@MKTEMP@"; then
+ tmpfile=document.$$
+ else
+ tmpfile=`mktemp document.XXXXXX` || exit 1
+ fi
+ trap "rm -f $tmpfile" 1 2 15
+ translate_boot_file $1 $tmpfile
+ grep 'ERROR IN' $tmpfile >/dev/null && { rm $tmpfile; exit 1; }
+ rm $tmpfile && exit 0
+ ;;
+
+ compile,lisp)
+ compile_lisp_file $1 $output
+ exit $?
+ ;;
+ link,lisp)
+ make_program $@
+ exit $?
+ ;;
+esac
+
+
+if [ "$#" = "3" ]; then
+ REDIRECT=$2
+ FILE=`basename $3 .pamphlet`
+ notangle -t8 $FILE.pamphlet >$FILE
+ noweave -delay $FILE.pamphlet >$FILE.tex
+ latex --interaction nonstopmode $FILE.tex >$REDIRECT
+ latex --interaction nonstopmode $FILE.tex >$REDIRECT
+ rm -f $FILE~
+ rm -f $FILE.pamphlet~
+ rm -f $FILE.log
+ rm -f $FILE.tex
+ rm -f $FILE.toc
+ rm -f $FILE.aux
+ exit 0
+fi
+if [ "$#" = "1" ]; then
+ FILE=`basename $1 .pamphlet`
+ notangle -t8 $FILE.pamphlet >$FILE
+ noweave -delay $FILE.pamphlet >$FILE.tex
+ latex $FILE.tex
+ latex $FILE.tex
+ rm -f $FILE~
+ rm -f $FILE.pamphlet~
+ rm -f $FILE.log
+ rm -f $FILE.tex
+ rm -f $FILE.toc
+ rm -f $FILE.aux
+ exit 0
+fi
+echo "document [ -o redirect ] pamphlet"
+
+# set +x
+
diff --git a/src/scripts/showdvi b/src/scripts/showdvi
new file mode 100755
index 00000000..49516253
--- /dev/null
+++ b/src/scripts/showdvi
@@ -0,0 +1 @@
+xdvi -expert -s 3 $1.dvi
diff --git a/src/scripts/tex/axiom.sty b/src/scripts/tex/axiom.sty
new file mode 100755
index 00000000..cc1b0bfb
--- /dev/null
+++ b/src/scripts/tex/axiom.sty
@@ -0,0 +1,946 @@
+% axiom.sty -- LaTeX support for noweb
+% DON'T edit this file! Use src/doc/axiom.sty.pamphlet instead.
+{\obeyspaces\AtBeginDocument{\global\let =\ }} % from texbook, p 381
+\def\nwopt@nomargintag{\let\nwmargintag=\@gobble}
+\def\nwopt@margintag{%
+ \def\nwmargintag##1{\leavevmode\llap{##1\kern\nwmarginglue\kern\codemargin}}}
+\def\nwopt@margintag{%
+ \def\nwmargintag##1{\leavevmode\kern-\codemargin\nwthemargintag{##1}\kern\codemargin}}
+\def\nwthemargintag#1{\llap{#1\kern\nwmarginglue}}
+\nwopt@margintag
+\newdimen\nwmarginglue
+\nwmarginglue=0.3in
+\def\nwtagstyle{\footnotesize\Rm}
+% make \hsize in code sufficient for 88 columns
+\setbox0=\hbox{\tt m}
+\newdimen\codehsize
+\codehsize=91\wd0 % 88 columns wasn't enough; I don't know why
+\newdimen\codemargin
+\codemargin=0pt
+\newdimen\nwdefspace
+\nwdefspace=\codehsize
+% need to use \textwidth in {\LaTeX} to handle styles with
+% non-standard margins (David Bruce). Don't know why we sometimes
+% wanted \hsize. 27 August 1997.
+%% \advance\nwdefspace by -\hsize\relax
+\ifx\textwidth\undefined
+ \advance\nwdefspace by -\hsize\relax
+\else
+ \advance\nwdefspace by -\textwidth\relax
+\fi
+\chardef\other=12
+\def\setupcode{%
+ \chardef\\=`\\
+ \chardef\{=`\{
+ \chardef\}=`\}
+ \catcode`\$=\other
+ \catcode`\&=\other
+ \catcode`\#=\other
+ \catcode`\%=\other
+ \catcode`\~=\other
+ \catcode`\_=\other
+ \catcode`\^=\other
+ \catcode`\"=\other % fixes problem with german.sty
+ \obeyspaces\Tt
+}
+\let\nwlbrace=\{
+\let\nwrbrace=\}
+\def\nwendquote{\relax\ifhmode\spacefactor=1000 \fi}
+{\catcode`\^^M=\active % make CR an active character
+ \gdef\newlines{\catcode`\^^M=\active % make CR an active character
+ \def^^M{\par\startline}}%
+ \gdef\eatline#1^^M{\relax}%
+}
+%%% DON'T \gdef^^M{\par\startline}}% in case ^^M appears in a \write
+\def\startline{\noindent\hskip\parindent\ignorespaces}
+\def\nwnewline{\ifvmode\else\hfil\break\leavevmode\hbox{}\fi}
+\def\setupmodname{%
+ \catcode`\$=3
+ \catcode`\&=4
+ \catcode`\#=6
+ \catcode`\%=14
+ \catcode`\~=13
+ \catcode`\_=8
+ \catcode`\^=7
+ \catcode`\ =10
+ \catcode`\^^M=5
+ \let\{\nwlbrace
+ \let\}\nwrbrace
+ % bad news --- don't know what catcode to give "
+ \Rm}
+\def\LA{\begingroup\maybehbox\bgroup\setupmodname\It$\langle$}
+\def\RA{\/$\rangle$\egroup\endgroup}
+\def\code{\leavevmode\begingroup\setupcode\newlines}
+\def\edoc{\endgroup}
+\let\maybehbox\relax
+\newbox\equivbox
+\setbox\equivbox=\hbox{$\equiv$}
+\newbox\plusequivbox
+\setbox\plusequivbox=\hbox{$\mathord{+}\mathord{\equiv}$}
+% \moddef can't have an argument because there might be \code...\edoc
+\def\moddef{\leavevmode\kern-\codemargin\LA}
+\def\endmoddef{\RA\ifmmode\equiv\else\unhcopy\equivbox\fi
+ \nobreak\hfill\nobreak}
+\def\plusendmoddef{\RA\ifmmode\mathord{+}\mathord{\equiv}\else\unhcopy\plusequivbox\fi
+ \nobreak\hfill\nobreak}
+\def\chunklist{%
+\errhelp{I changed \chunklist to \nowebchunks.
+I'll try to avoid such incompatible changes in the future.}%
+\errmessage{Use \string\nowebchunks\space instead of \string\chunklist}}
+\def\nowebchunks{\message{<Warning: You need noweave -x to use \string\nowebchunks>}}
+\def\nowebindex{\message{<Warning: You need noweave -index to use \string\nowebindex>}}
+% here is support for the new-style (capitalized) font-changing commands
+% thanks to Dave Love
+\ifx\documentstyle\undefined
+ \let\Rm=\rm \let\It=\it \let\Tt=\tt % plain
+\else\ifx\selectfont\undefined
+ \let\Rm=\rm \let\It=\it \let\Tt=\tt % LaTeX OFSS
+\else % LaTeX NFSS
+ \def\Rm{\reset@font\rm}
+ \def\It{\reset@font\it}
+ \def\Tt{\reset@font\tt}
+ \def\Bf{\reset@font\bf}
+\fi\fi
+\ifx\reset@font\undefined \let\reset@font=\relax \fi
+\def\noweboptions#1{%
+ \def\@nwoptionlist{#1}%
+ \@for\@nwoption:=\@nwoptionlist\do{%
+ \@ifundefined{nwopt@\@nwoption}{%
+ \@latexerr{There is no such noweb option as '\@nwoption'}\@eha}{%
+ \csname nwopt@\@nwoption\endcsname}}}
+\codemargin=10pt
+\advance\codehsize by \codemargin % make room for indentation of code
+\advance\nwdefspace by \codemargin % and fix adjustment for def/use
+\def\setcodemargin#1{%
+ \advance\codehsize by -\codemargin % make room for indentation of code
+ \advance\nwdefspace by -\codemargin % and fix adjustment for def/use
+ \codemargin=#1
+ \advance\codehsize by \codemargin % make room for indentation of code
+ \advance\nwdefspace by \codemargin % and fix adjustment for
+ % def/use
+}
+\def\nwopt@shift{%
+ \dimen@=-0.8in
+ \if@twoside % Values for two-sided printing:
+ \advance\evensidemargin by \dimen@
+ \else % Values for one-sided printing:
+ \advance\evensidemargin by \dimen@
+ \advance\oddsidemargin by \dimen@
+ \fi
+% \advance \marginparwidth -\dimen@
+}
+\let\nwopt@noshift\@empty
+\def\nwbegincode#1{%
+ \begingroup
+ \topsep \nwcodetopsep
+ \@beginparpenalty \@highpenalty
+ \@endparpenalty -\@highpenalty
+ \@begincode }
+\def\nwendcode{\endtrivlist \endgroup \filbreak} % keeps code on 1 page
+
+\newenvironment{webcode}{%
+ \@begincode
+}{%
+ \endtrivlist}
+\def\@begincode{%
+ \trivlist \item[]%
+ \leftskip\@totalleftmargin \advance\leftskip\codemargin
+ \rightskip\hsize \advance\rightskip -\codehsize
+ \parskip\z@ \parindent\z@ \parfillskip\@flushglue
+ \linewidth\codehsize
+ \@@par
+ \def\par{\leavevmode\null \@@par \penalty\nwcodepenalty}%
+ \obeylines
+ \@noligs \ifx\verbatim@nolig@list\undefined\else
+ \let\do=\nw@makeother \verbatim@nolig@list \do@noligs\`
+ \fi
+ \setupcode \frenchspacing \@vobeyspaces
+ \nowebsize \setupcode
+ \let\maybehbox\mbox }
+ \newskip\nwcodetopsep \nwcodetopsep = 3pt plus 1.2pt minus 1pt
+ \let\nowebsize=\normalsize
+ \def\nwopt@tinycode{\let\nowebsize=\tiny}
+ \def\nwopt@footnotesizecode{\let\nowebsize=\footnotesize}
+ \def\nwopt@scriptsizecode{\let\nowebsize=\scriptsize}
+ \def\nwopt@smallcode{\let\nowebsize=\small}
+ \def\nwopt@normalsizecode{\let\nowebsize=\normalsize}
+ \def\nwopt@largecode{\let\nowebsize=\large}
+ \def\nwopt@Largecode{\let\nowebsize=\Large}
+ \def\nwopt@LARGEcode{\let\nowebsize=\LARGE}
+ \def\nwopt@hugecode{\let\nowebsize=\huge}
+ \def\nwopt@Hugecode{\let\nowebsize=\Huge}
+\newcount\nwcodepenalty \nwcodepenalty=\@highpenalty
+\def\nw@makeother#1{\catcode`#1=12 }
+\def\nwbegindocs#1{\ifvmode\noindent\fi}
+\let\nwenddocs=\relax
+\let\nwdocspar=\filbreak
+\raggedbottom
+\def\code{\leavevmode\begingroup\setupcode\@vobeyspaces\obeylines}
+\let\edoc=\endgroup
+\newdimen\@original@textwidth
+\def\ps@noweb{%
+ \@original@textwidth=\textwidth
+ \let\@mkboth\@gobbletwo
+ \def\@oddfoot{}\def\@evenfoot{}% No feet.
+ \if@twoside % If two-sided printing.
+ \def\@evenhead{\hbox to \@original@textwidth{%
+ \Rm \thepage\qquad{\Tt\leftmark}\hfil\today}}% Left heading.
+ \def\@oddhead{\hbox to \@original@textwidth{%
+ \Rm \today\hfil{\Tt\leftmark}\qquad\thepage}}% Right heading.
+ \else % If one-sided printing.
+ \def\@oddhead{\hbox to \@original@textwidth{%
+ \Rm \today\hfil{\Tt\leftmark}\qquad\thepage}}% Right heading.
+ \let\@evenhead\@oddhead
+ \fi
+ \let\chaptermark\@gobble
+ \let\sectionmark\@gobble
+ \let\subsectionmark\@gobble
+ \let\subsubsectionmark\@gobble
+ \let\paragraphmark\@gobble
+ \let\subparagraphmark\@gobble
+ \def\nwfilename{\begingroup\let\do\@makeother\dospecials
+ \catcode`\{=1 \catcode`\}=2 \nw@filename}
+ \def\nw@filename##1{\endgroup\markboth{##1}{##1}\let\nw@filename=\nw@laterfilename}%
+}
+\def\nw@laterfilename#1{\endgroup\clearpage \markboth{#1}{#1}}
+\let\nwfilename=\@gobble
+\def\nwcodecomment#1{\@@par\penalty\nwcodepenalty
+ \if@firstnwcodecomment
+ \vskip\nwcodecommentsep\penalty\nwcodepenalty\@firstnwcodecommentfalse
+ \fi%
+ \hspace{-\codemargin}{%
+ \rightskip=0pt plus1in
+ \interlinepenalty\nwcodepenalty
+ \let\\\relax\footnotesize\Rm #1\@@par\penalty\nwcodepenalty}}
+\def\@nwalsodefined#1{\nwcodecomment{\@nwlangdepdef\ \nwpageprep\ \@pagesl{#1}.}}
+\def\@nwused#1{\nwcodecomment{\@nwlangdepcud\ \nwpageprep\ \@pagesl{#1}.}}
+\def\@nwnotused#1{\nwcodecomment{\@nwlangdeprtc.}}
+\def\nwoutput#1{\nwcodecomment{\@nwlangdepcwf\ {\Tt \@stripstar#1*\stripped}.}}
+\def\@stripstar#1*#2\stripped{#1}
+\newcommand{\nwprevdefptr}[1]{%
+ \mbox{$\mathord{\triangleleft}\,\mathord{\mbox{\subpageref{#1}}}$}}
+\newcommand{\nwnextdefptr}[1]{%
+ \mbox{$\mathord{\mbox{\subpageref{#1}}}\,\mathord{\triangleright}$}}
+
+\newcommand{\@nwprevnextdefs}[2]{%
+ {\nwtagstyle
+ \ifx\relax#1\else ~~\nwprevdefptr{#1}\fi
+ \ifx\relax#2\else ~~\nwnextdefptr{#2}\fi}}
+\newcommand{\@nwusesondefline}[1]{{\nwtagstyle~~(\@pagenumsl{#1})}}
+\newcommand{\@nwstartdeflinemarkup}{\nobreak\hskip 1.5em plus 1fill\nobreak}
+\newcommand{\@nwenddeflinemarkup}{\nobreak\hskip \nwdefspace minus\nwdefspace\nobreak}
+\def\nwopt@longxref{%
+ \let\nwalsodefined\@nwalsodefined
+ \let\nwused\@nwused
+ \let\nwnotused\@nwnotused
+ \let\nwprevnextdefs\@gobbletwo
+ \let\nwusesondefline\@gobble
+ \let\nwstartdeflinemarkup\relax
+ \let\nwenddeflinemarkup\relax
+}
+\def\nwopt@shortxref{%
+ \let\nwalsodefined\@gobble
+ \let\nwused\@gobble
+ \let\nwnotused\@gobble
+ \let\nwprevnextdefs\@nwprevnextdefs
+ \let\nwusesondefline\@nwusesondefline
+ \let\nwstartdeflinemarkup\@nwstartdeflinemarkup
+ \let\nwenddeflinemarkup\@nwenddeflinemarkup
+}
+\def\nwopt@noxref{%
+ \let\nwalsodefined\@gobble
+ \let\nwused\@gobble
+ \let\nwnotused\@gobble
+ \let\nwprevnextdefs\@gobbletwo
+ \let\nwusesondefline\@gobble
+ \let\nwstartdeflinemarkup\relax
+ \let\nwenddeflinemarkup\relax
+}
+\nwopt@shortxref % to hell with backward compatibility!
+\newskip\nwcodecommentsep \nwcodecommentsep=3pt plus 1pt minus 1pt
+\newif\if@firstnwcodecomment\@firstnwcodecommenttrue
+\newcount\@nwlopage\newcount\@nwhipage % range lo..hi-1
+\newcount\@nwlosub % subpage of lo
+\newcount\@nwhisub % subpage of hi
+\def\@nwfirstpage#1#2#3{% subpage page xref-tag
+ \@nwlopage=#2 \@nwlosub=#1
+ \def\@nwloxreftag{#3}%
+ \advance\@nwpagecount by \@ne
+ \@nwhipage=\@nwlopage\advance\@nwhipage by \@ne }
+\def\@nwnextpage#1#2#3{% subpage page xref-tag
+ \ifnum\@nwhipage=#2
+ \advance\@nwhipage by \@ne
+ \advance\@nwpagecount by \@ne
+ \@nwhisub=#1
+ \def\@nwhixreftag{#3}\else
+ \ifnum#2<\@nwlopage \advance\@nwhipage by \m@ne
+ \ifnum\@nwhipage=\@nwlopage
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}}%
+ \else
+ \count@=\@nwhipage \advance\count@ by \m@ne
+ \ifnum\count@=\@nwlopage % consecutive pages
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}%
+ \noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+ {\@nwhixreftag}}}%
+ \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+ \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100
+ \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+ \ifnum\count@=\@nwpagetemp % lo--least 2 digits of hi
+ \multiply\@nwpagetemp by 100
+ \advance \@nwhipage by -\@nwpagetemp
+ \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \fi
+ \fi
+ \fi%
+ \fi
+ \fi%
+ \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa\@nwfirstpage{#1}{#2}{#3}\else
+ \ifnum#2>\@nwhipage \advance\@nwhipage by \m@ne
+ \ifnum\@nwhipage=\@nwlopage
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}}%
+ \else
+ \count@=\@nwhipage \advance\count@ by \m@ne
+ \ifnum\count@=\@nwlopage % consecutive pages
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}%
+ \noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+ {\@nwhixreftag}}}%
+ \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+ \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100
+ \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+ \ifnum\count@=\@nwpagetemp % lo--least 2 digits of hi
+ \multiply\@nwpagetemp by 100
+ \advance \@nwhipage by -\@nwpagetemp
+ \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \fi
+ \fi
+ \fi%
+ \fi
+ \fi%
+ \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa\@nwfirstpage{#1}{#2}{#3}\else
+ \@nwlosub=0 \@nwhisub=0
+ \fi\fi\fi
+ }
+\newcount\@nwpagetemp
+\newcount\@nwpagecount
+\def\@nwfirstpagel#1{% label
+ \@ifundefined{r@#1}{\@warning{Reference `#1' on page \thepage \space undefined}%
+ \nwix@cons\nw@pages{\\{\bf ??}}}{%
+ \edef\@tempa{\noexpand\@nwfirstpage\subpagepair{#1}{#1}}\@tempa}}
+\def\@nwnextpagel#1{% label
+ \@ifundefined{r@#1}{\@warning{Reference `#1' on page \thepage \space undefined}%
+ \nwix@cons\nw@pages{\\{\bf ??}}}{%
+ \edef\@tempa{\noexpand\@nwnextpage\subpagepair{#1}{#1}}\@tempa}}
+\def\@pagesl#1{% list of labels
+ \gdef\nw@pages{}\@nwpagecount=0
+ \def\\##1{\@nwfirstpagel{##1}\let\\=\@nwnextpagel}#1%
+ \advance\@nwhipage by \m@ne
+ \ifnum\@nwhipage=\@nwlopage
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}}%
+ \else
+ \count@=\@nwhipage \advance\count@ by \m@ne
+ \ifnum\count@=\@nwlopage % consecutive pages
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}%
+ \noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+ {\@nwhixreftag}}}%
+ \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+ \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100
+ \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+ \ifnum\count@=\@nwpagetemp % lo--least 2 digits of hi
+ \multiply\@nwpagetemp by 100
+ \advance \@nwhipage by -\@nwpagetemp
+ \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \fi
+ \fi
+ \fi%
+ \fi
+ \fi%
+ \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa\def\\##1{\@nwhyperpagenum##1}%
+ \ifnum\@nwpagecount=1 \nwpageword \else \nwpagesword\fi~\commafy{\nw@pages}}
+\def\@nwhyperpagenum#1#2{\nwhyperreference{#2}{#1}}
+
+\def\@pagenumsl#1{% list of labels -- doesn't include word `pages', commas, or `and'
+ \gdef\nw@pages{}\@nwpagecount=0
+ \def\\##1{\@nwfirstpagel{##1}\let\\=\@nwnextpagel}#1%
+ \advance\@nwhipage by \m@ne
+ \ifnum\@nwhipage=\@nwlopage
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}}%
+ \else
+ \count@=\@nwhipage \advance\count@ by \m@ne
+ \ifnum\count@=\@nwlopage % consecutive pages
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}%
+ \noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+ {\@nwhixreftag}}}%
+ \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+ \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100
+ \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+ \ifnum\count@=\@nwpagetemp % lo--least 2 digits of hi
+ \multiply\@nwpagetemp by 100
+ \advance \@nwhipage by -\@nwpagetemp
+ \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \fi
+ \fi
+ \fi%
+ \fi
+ \fi%
+ \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa%
+ \def\\##1{\@nwhyperpagenum##1\let\\=\@nwpagenumslrest}\nw@pages}
+\def\@nwpagenumslrest#1{~\@nwhyperpagenum#1}
+\def\subpages#1{% list of {{subpage}{page}}
+ \gdef\nw@pages{}\@nwpagecount=0
+ \def\\##1{\edef\@tempa{\noexpand\@nwfirstpage##1{}}\@tempa
+ \def\\####1{\edef\@tempa{\noexpand\@nwnextpage####1}\@tempa}}#1%
+ \advance\@nwhipage by \m@ne
+ \ifnum\@nwhipage=\@nwlopage
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}}%
+ \else
+ \count@=\@nwhipage \advance\count@ by \m@ne
+ \ifnum\count@=\@nwlopage % consecutive pages
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}%
+ \noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+ {\@nwhixreftag}}}%
+ \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+ \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100
+ \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+ \ifnum\count@=\@nwpagetemp % lo--least 2 digits of hi
+ \multiply\@nwpagetemp by 100
+ \advance \@nwhipage by -\@nwpagetemp
+ \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \fi
+ \fi
+ \fi%
+ \fi
+ \fi%
+ \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa\def\\##1{\@firstoftwo##1}%
+ \ifnum\@nwpagecount=1 \nwpageword \else \nwpagesword\fi~\commafy{\nw@pages}}
+\def\@nwaddrange{\advance\@nwhipage by \m@ne
+ \ifnum\@nwhipage=\@nwlopage
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}}%
+ \else
+ \count@=\@nwhipage \advance\count@ by \m@ne
+ \ifnum\count@=\@nwlopage % consecutive pages
+ \edef\@tempa{\noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+ {\@nwloxreftag}}%
+ \noexpand\noexpand\noexpand\\%
+ {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+ {\@nwhixreftag}}}%
+ \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+ \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+ \count@=\@nwlopage \divide\count@ by 100
+ \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+ \ifnum\count@=\@nwpagetemp % lo--least 2 digits of hi
+ \multiply\@nwpagetemp by 100
+ \advance \@nwhipage by -\@nwpagetemp
+ \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+ \fi
+ \fi
+ \fi%
+ \fi
+ \fi%
+ \edef\@tempa{\noexpand\nwix@cons\noexpand\nw@pages{\@tempa}}\@tempa}
+\def\nwpageword{\@nwlangdepchk} % chunk, was page
+\def\nwpagesword{\@nwlangdepchks} % chunk, was page
+\def\nwpageprep{\@nwlangdepin} % in, was on
+\newcommand\nw@genericref[2]{% what to do, name of ref
+ \expandafter\nw@g@nericref\csname r@#2\endcsname#1{#2}}
+\newcommand\nw@g@nericref[3]{% control sequence, what to do, name
+ \ifx#1\relax
+ \ref{#3}% trigger the standard `undefined ref' mechanisms
+ \else
+ \expandafter#2#1.\\%
+ \fi}
+\def\nw@selectone#1#2#3\\{#1}
+\def\nw@selecttwo#1#2#3\\{#2}
+\def\nw@selectonetwo#1#2#3\\{{#1}{#2}}
+\newcommand{\subpageref}[1]{%
+ \nwhyperreference{#1}{\nw@genericref\@subpageref{#1}}}
+\def\@subpageref#1#2#3\\{%
+ \@ifundefined{2on#2}{#2}{\nwthepagenum{#1}{#2}}}
+\newcommand{\subpagepair}[1]{% % produces {subpage}{page}
+ \@ifundefined{r@#1}%
+ {{0}{0}}%
+ {\nw@genericref\@subpagepair{#1}}}
+\def\@subpagepair#1#2#3\\{%
+ \@ifundefined{2on#2}{{0}{#2}}{{#1}{#2}}}
+\newcommand{\sublabel}[1]{%
+ \@bsphack
+ \nwblindhyperanchor{#1}%
+ \if@filesw {\let\thepage\relax
+ \def\protect{\noexpand\noexpand\noexpand}%
+ \edef\@tempa{\write\@auxout{\string
+ \newsublabel{#1}{{}{\thepage}}}}%
+ \expandafter}\@tempa
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\newcommand{\nosublabel}[1]{%
+ \@bsphack\if@filesw {\let\thepage\relax
+ \def\protect{\noexpand\noexpand\noexpand}%
+ \edef\@tempa{\write\@auxout{\string
+ \newlabel{#1}{{0}{\thepage}}}}%
+ \expandafter}\@tempa
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\newcommand\newsublabel{%
+ \nw@settrailers
+ \global\let\newsublabel\@newsublabel
+ \@newsublabel}
+\newcommand{\@newsublabel}[2]{%
+ \edef\this@page{\@cdr#2\@nil}%
+ \ifx\this@page\last@page\else
+ \sub@page=\z@
+ \fi
+ \edef\last@page{\this@page}
+ \advance\sub@page by \@ne
+ \ifnum\sub@page=\tw@
+ \global\@namedef{2on\this@page}{}%
+ \fi
+ \pendingsublabel{#1}%
+ \edef\@tempa##1{\noexpand\newlabel{##1}%
+ {{\number\sub@page}{\this@page}\nw@labeltrailers}}%
+ \pending@sublabels
+ \def\pending@sublabels{}}
+\newcommand\nw@settrailers{% -- won't work on first run
+ \@ifpackageloaded{nameref}%
+ {\gdef\nw@labeltrailers{{}{}{}}}%
+ {\gdef\nw@labeltrailers{}}}
+\renewcommand\nw@settrailers{%
+ \@ifundefined{@secondoffive}%
+ {\gdef\nw@labeltrailers{}}%
+ {\gdef\nw@labeltrailers{{}{}{}}}}
+\newcommand{\nextchunklabel}[1]{%
+ \nwblindhyperanchor{#1}% % looks slightly bogus --- nr
+ \@bsphack\if@filesw {\let\thepage\relax
+ \edef\@tempa{\write\@auxout{\string\pendingsublabel{#1}}}%
+ \expandafter}\@tempa
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\newcommand\pendingsublabel[1]{%
+ \def\@tempa{\noexpand\@tempa}%
+ \edef\pending@sublabels{\noexpand\@tempa{#1}\pending@sublabels}}
+\def\pending@sublabels{}
+\def\last@page{\relax}
+\newcount\sub@page
+\def\@alphasubpagenum#1#2{#2\ifnum#1=0 \else\@alph{#1}\fi}
+\def\@nosubpagenum#1#2{#2}
+\def\@numsubpagenum#1#2{#2\ifnum#1=0 \else.\@arabic{#1}\fi}
+\def\nwopt@nosubpage{\let\nwthepagenum=\@nosubpagenum\nwopt@nomargintag}
+\def\nwopt@numsubpage{\let\nwthepagenum=\@numsubpagenum}
+\def\nwopt@alphasubpage{\let\nwthepagenum=\@alphasubpagenum}
+\nwopt@alphasubpage
+\newcount\@nwalph@n
+\let\@nwalph@d\@tempcnta
+\let\@nwalph@bound\@tempcntb
+\def\@nwlongalph#1{{%
+ \@nwalph@n=#1\advance\@nwalph@n by-1
+ \@nwalph@bound=26
+ \loop\ifnum\@nwalph@n<\@nwalph@bound\else
+ \advance\@nwalph@n by -\@nwalph@bound
+ \multiply\@nwalph@bound by 26
+ \repeat
+ \loop\ifnum\@nwalph@bound>1
+ \divide\@nwalph@bound by 26
+ \@nwalph@d=\@nwalph@n\divide\@nwalph@d by \@nwalph@bound
+ % d := d * bound ; n -:= d; d := d / bound --- saves a temporary
+ \multiply\@nwalph@d by \@nwalph@bound
+ \advance\@nwalph@n by -\@nwalph@d
+ \divide\@nwalph@d by \@nwalph@bound
+ \advance\@nwalph@d by 1 \@alph{\@nwalph@d}%
+ \repeat
+}}
+\newcount\nw@chunkcount
+\nw@chunkcount=\@ne
+\newcommand{\weblabel}[1]{%
+ \@bsphack
+ \nwblindhyperanchor{#1}%
+ \if@filesw {\let\thepage\relax
+ \def\protect{\noexpand\noexpand\noexpand}%
+ \edef\@tempa{\write\@auxout{\string
+ \newsublabel{#1}{{}{\number\nw@chunkcount}}}}%
+ \expandafter}\@tempa
+ \global\advance\nw@chunkcount by \@ne
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\def\nwopt@webnumbering{%
+ \let\sublabel=\weblabel
+ \def\nwpageword{chunk}\def\nwpagesword{chunks}%
+ \def\nwpageprep{in}}
+% \nwindexdefn{printable name}{identifying label}{label of chunk}
+% \nwindexuse{printable name}{identifying label}{label of chunk}
+
+\def\nwindexdefn#1#2#3{\@auxix{\protect\nwixd}{#2}{#3}}
+\def\nwindexuse#1#2#3{\@auxix{\protect\nwixu}{#2}{#3}}
+
+\def\@auxix#1#2#3{% {marker}{id label}{subpage label}
+ \@bsphack\if@filesw {\let\nwixd\relax\let\nwixu\relax
+ \def\protect{\noexpand\noexpand\noexpand}%
+ \edef\@tempa{\write\@auxout{\string\nwixadd{#1}{#2}{#3}}}%
+ \expandafter}\@tempa
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+% \nwixadd{marker}{idlabel}{subpage label}
+\def\nwixadd#1#2#3{%
+ \@ifundefined{nwixl@#2}%
+ {\global\@namedef{nwixl@#2}{#1{#3}}}%
+ {\expandafter\nwix@cons\csname nwixl@#2\endcsname{#1{#3}}}}
+\def\@nwsubscriptident#1#2{\mbox{$\mbox{#1}_{\mathrm{\subpageref{#2}}}$}}
+\def\@nwnosubscriptident#1#2{#1}
+\def\@nwhyperident#1#2{\leavevmode\nwhyperreference{#2}{#1}}
+\def\nwopt@subscriptidents{%
+ \let\nwlinkedidentq\@nwsubscriptident
+ \let\nwlinkedidentc\@nwsubscriptident
+}
+\def\nwopt@nosubscriptidents{%
+ \let\nwlinkedidentq\@nwnosubscriptident
+ \let\nwlinkedidentc\@nwnosubscriptident
+}
+\def\nwopt@hyperidents{%
+ \let\nwlinkedidentq\@nwhyperident
+ \let\nwlinkedidentc\@nwhyperident
+}
+\def\nwopt@nohyperidents{%
+ \let\nwlinkedidentq\@nwnosubscriptident
+ \let\nwlinkedidentc\@nwnosubscriptident
+}
+\def\nwopt@subscriptquotedidents{%
+ \let\nwlinkedidentq\@nwsubscriptident
+}
+\def\nwopt@nosubscriptquotedidents{%
+ \let\nwlinkedidentq\@nwnosubscriptident
+}
+\def\nwopt@hyperquotedidents{%
+ \let\nwlinkedidentq\@nwhyperident
+}
+\def\nwopt@nohyperquotedidents{%
+ \let\nwlinkedidentq\@nwnosubscriptident
+}
+\nwopt@hyperidents
+\newcount\@commacount
+\def\commafy#1{%
+ {\nwix@listcount{#1}\@commacount=\nwix@counter
+ \let\@comma@each=\\%
+ \ifcase\@commacount\let\\=\@comma@each\or\let\\=\@comma@each\or
+ \def\\{\def\\{ \@nwlangdepand\ \@comma@each}\@comma@each}\else
+ \def\\{\def\\{, %
+ \advance\@commacount by \m@ne
+ \ifnum\@commacount=1 \@nwlangdepand~\fi\@comma@each}\@comma@each}\fi
+ #1}}
+\def\nwix@cons#1#2{% {list}{\marker{element}}
+ {\toks0=\expandafter{#1}\def\@tempa{#2}\toks2=\expandafter{\@tempa}%
+ \xdef#1{\the\toks0 \the\toks2 }}}
+\def\nwix@uses#1{% {label}
+ \def\nwixu{\\}\let\nwixd\@gobble\@nameuse{nwixl@#1}}
+\def\nwix@defs#1{% {label}
+ \def\nwixd{\\}\let\nwixu\@gobble\@nameuse{nwixl@#1}}
+\newcount\nwix@counter
+\def\nwix@listcount#1{% {list with \\}
+ {\count@=0
+ \def\\##1{\advance\count@ by \@ne }%
+ #1\global\nwix@counter=\count@ }}
+\def\nwix@usecount#1{\nwix@listcount{\nwix@uses{#1}}}
+\def\nwix@defcount#1{\nwix@listcount{\nwix@defs{#1}}}
+\def\nwix@id@defs#1{% index pair
+ {{\Tt \@car#1\@nil}%
+ \def\\##1{~\subpageref{##1}}\nwix@defs{\@cdr#1\@nil}}}
+\def\nwidentuses#1{% list of index pairs
+ \nwcodecomment{\@nwlangdepuss\ \let\\=\nwix@id@defs\commafy{#1}.}}
+\def\nwix@totaluses#1{% list of index pairs
+ {\count@=0
+ \def\\##1{\nwix@usecount{\@cdr##1\@nil}\advance\count@ by\nwix@counter}%
+ #1\global\nwix@counter\count@ }}
+\def\nwix@id@uses#1#2{% {ident}{label}
+ \nwix@usecount{#2}\ifnum\nwix@counter>0
+ {\advance\leftskip by \codemargin
+ \nwcodecomment{{\Tt #1}, \@nwlangdepusd\ \nwpageprep\ \@pagesl{\nwix@uses{#2}}.}}%
+ \else
+ \ifnw@hideunuseddefs\else
+ {\advance\leftskip by \codemargin \nwcodecomment{{\Tt #1}, \@nwlangdepnvu.}}%
+ \fi
+ \fi}
+\def\nwidentdefs#1{% list of index pairs
+ \ifnw@hideunuseddefs\nwix@totaluses{#1}\else\nwix@listcount{#1}\fi
+ \ifnum\nwix@counter>0
+ \nwcodecomment{\@nwlangdepdfs:}%
+ {\def\\##1{\nwix@id@uses ##1}#1}%
+ \fi}
+\newif\ifnw@hideunuseddefs\nw@hideunuseddefsfalse
+\def\nwopt@hideunuseddefs{\nw@hideunuseddefstrue}
+\def\nwopt@noidentxref{%
+ \let\nwidentdefs\@gobble
+ \let\nwidentuses\@gobble}
+\def\nw@underlinedefs{% {list with \nwixd, \nwixu}
+ \let\\=\relax\def\nw@comma{, }
+ \def\nwixd##1{\\\underline{\subpageref{##1}}\let\\\nw@comma}%
+ \def\nwixu##1{\\\subpageref{##1}\let\\\nw@comma}}
+
+\def\nw@indexline#1#2{%
+ {\indent {\Tt #1}: \nw@underlinedefs\@nameuse{nwixl@#2}\par}}
+
+\newenvironment{thenowebindex}{\parindent=-10pt \parskip=\z@
+ \advance\leftskip by 10pt
+ \advance\rightskip by 0pt plus1in\par\@afterindenttrue
+ \def\\##1{\nw@indexline##1}}{}
+\def\nowebindex{%
+ \@ifundefined{nwixs@i}%
+ {\@warning{The \string\nowebindex\space is empty}}%
+ {\begin{thenowebindex}\@nameuse{nwixs@i}\end{thenowebindex}}}
+\def\nowebindex@external{%
+ {\let\nwixadds@c=\@gobble
+ \def\nwixadds@i##1{\nw@indexline##1}%
+ \def\nwixaddsx##1##2{\@nameuse{nwixadds@##1}{##2}}%
+ \begin{thenowebindex}\@input{\jobname.nwi}\end{thenowebindex}}}
+\def\nwixlogsorted#1#2{% list data
+ \@bsphack\if@filesw
+ \toks0={#2}\immediate\write\@auxout{\string\nwixadds{#1}{\the\toks0}}
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\def\nwixadds#1#2{%
+ \@ifundefined{nwixs@#1}%
+ {\global\@namedef{nwixs@#1}{\\{#2}}}%
+ {\expandafter\nwix@cons\csname nwixs@#1\endcsname{\\{#2}}}}
+\let\nwixaddsx=\@gobbletwo
+\def\nwopt@externalindex{%
+ \ifx\nwixadds\@gobbletwo % already called
+ \else
+ \let\nwixaddsx=\nwixadds \let\nwixadds=\@gobbletwo
+ \let\nowebindex=\nowebindex@external
+ \let\nowebchunks=\nowebchunks@external
+ \fi}
+\def\nowebchunks{%
+ \@ifundefined{nwixs@c}%
+ {\@warning{The are no \string\nowebchunks}}%
+ {\begin{thenowebchunks}\@nameuse{nwixs@c}\end{thenowebchunks}}}
+\def\nowebchunks@external{%
+ {\let\nwixadds@i=\@gobble
+ \def\nwixadds@c##1{\nw@onechunk##1}%
+ \def\nwixaddsx##1##2{\@nameuse{nwixadds@##1}{##2}}%
+ \begin{thenowebchunks}\@input{\jobname.nwi}\end{thenowebchunks}}}
+ \@namedef{r@nw@notdef}{{0}{(\@nwlangdepnvd)}}
+\def\nw@chunkunderlinedefs{% {list of labels with \nwixd, \nwixu}
+ \let\\=\relax\def\nw@comma{, }
+ \def\nwixd##1{\\\underline{\subpageref{##1}}\let\\\nw@comma}%
+ \def\nwixu##1{\\\subpageref{##1}\let\\\nw@comma}}
+\def\nw@onechunk#1#2#3{% {name}{label of first definition}{list with \nwixd, \nwixu}
+ \@ifundefined{r@#2}{}{%
+ \indent\LA #1~{\nwtagstyle\subpageref{#2}}\RA
+ \if@nwlongchunks{~\nw@chunkunderlinedefs#3}\fi\par}}
+\newenvironment{thenowebchunks}{\vskip3pt
+ \parskip=\z@\parindent=-10pt \advance\leftskip by 10pt
+ \advance\rightskip by 0pt plus10pt \@afterindenttrue
+ \def\\##1{\nw@onechunk##1}}{}
+\newif\if@nwlongchunks
+\@nwlongchunksfalse
+\let\nwopt@longchunks\@nwlongchunkstrue
+\newcommand\@nw@hyper@ref{\hyperreference} % naras
+\newcommand\@nw@hyper@anc{\blindhyperanchor} % naras
+\newcommand\@nw@hyperref@ref[2]{\hyperlink{noweb.#1}{#2}} % nr
+\newcommand\@nw@hyperref@anc[1]{\hypertarget{noweb.#1}{\relax}} % nr
+%%\renewcommand\@nw@hyperref@ref[2]{{#2}} % nr
+%%\renewcommand\@nw@hyperref@anc[1]{} % nr
+\newcommand\nwhyperreference{%
+ \@ifundefined{hyperlink}
+ {\@ifundefined{hyperreference}
+ {\global\let\nwhyperreference\@gobble}
+ {\global\let\nwhyperreference\@nw@hyper@ref}}
+ {\global\let\nwhyperreference\@nw@hyperref@ref}%
+ \nwhyperreference
+}
+
+\newcommand\nwblindhyperanchor{%
+ \@ifundefined{hyperlink}
+ {\@ifundefined{hyperreference}
+ {\global\let\nwblindhyperanchor\@gobble}
+ {\global\let\nwblindhyperanchor\@nw@hyper@anc}}
+ {\global\let\nwblindhyperanchor\@nw@hyperref@anc}%
+ \nwblindhyperanchor
+}
+\newcommand\nwanchorto{%
+ \begingroup\let\do\@makeother\dospecials
+ \catcode`\{=1 \catcode`\}=2 \nw@anchorto}
+\newcommand\nw@anchorto[1]{\endgroup\def\nw@next{#1}\nw@anchortofin}
+\newcommand\nw@anchortofin[1]{#1\footnote{See URL \texttt{\nw@next}.}}
+\let\nwanchorname\@gobble
+\newif\ifhtml
+\htmlfalse
+\let\nwixident=\relax
+\def\nwbackslash{\char92}
+\def\nwlbrace{\char123}
+\def\nwrbrace{\char125}
+\def\nwopt@english{%
+ \def\@nwlangdepdef{This definition is continued}%
+ \def\@nwlangdepcud{This code is used}%
+ \def\@nwlangdeprtc{Root chunk (not used in this document)}%
+ \def\@nwlangdepcwf{This code is written to file}%
+ \def\@nwlangdepchk{chunk}%
+ \def\@nwlangdepchks{chunks}%
+ \def\@nwlangdepin{in}%
+ \def\@nwlangdepand{and}%
+ \def\@nwlangdepuss{Uses}%
+ \def\@nwlangdepusd{used}%
+ \def\@nwlangdepnvu{never used}%
+ \def\@nwlangdepdfs{Defines}%
+ \def\@nwlangdepnvd{never defined}%
+}
+\let\nwopt@american\nwopt@english
+\def\nwopt@portuges{%
+ \def\@nwlangdepdef{Defini\c{c}\~ao continuada em}%
+ % This definition is continued
+ \def\@nwlangdepcud{C\'odigo usado em}%
+ % This code is used
+ \def\@nwlangdeprtc{Fragmento de topo (sem uso no documento)}%
+ % Root chunk (not used in this document)
+ \def\@nwlangdepcwf{Este c\'odigo foi escrito no ficheiro}%
+ % This code is written to file
+ \def\@nwlangdepchk{fragmento}%
+ % chunk
+ \def\@nwlangdepchks{fragmentos}%
+ % chunks
+ \def\@nwlangdepin{no(s)}%
+ % in
+ \def\@nwlangdepand{e}%
+ % and
+ \def\@nwlangdepuss{Usa}%
+ % Uses
+ \def\@nwlangdepusd{usado}%
+ % used
+ \def\@nwlangdepnvu{nunca usado}%
+ % never used
+ \def\@nwlangdepdfs{Define}%
+ % Defines
+ \def\@nwlangdepnvd{nunca definido}%
+ % never defined
+}
+\def\nwopt@frenchb{%
+ \def\@nwlangdepdef{Cette d\'efinition suit}%
+ % This definition is continued
+ \def\@nwlangdepcud{Ce code est employ\'e}%
+ % This code is used
+ \def\@nwlangdeprtc{Morceau racine (pas employ\'e dans ce document)}%
+ % Root chunk (not used in this document)
+ \def\@nwlangdepcwf{Ce code est \'ecrit aux fichier}%
+ % This code is written to file
+ \def\@nwlangdepchk{le morceau}%
+ % chunk
+ \def\@nwlangdepchks{les morceaux}%
+ % chunks
+ \def\@nwlangdepin{dans}%
+ % in
+ \def\@nwlangdepand{et}%
+ % and
+ \def\@nwlangdepuss{Il emploie}%
+ % Uses
+ \def\@nwlangdepusd{employ\'{e}}%
+ % used
+ \def\@nwlangdepnvu{jamais employ\'{e}}%
+ % never used
+ \def\@nwlangdepdfs{Il d\'{e}fine}%
+ % Defines
+ % Cannot use the accent here: \def\@nwlangdepnvd{jamais d\'{e}fini}%
+ \def\@nwlangdepnvd{jamais defini}%
+ % never defined
+}
+\let\nwopt@french\nwopt@frenchb
+\def\nwopt@german{%
+ \def\@nwlangdepdef{Diese Definition wird fortgesetzt}%
+ % This definition is continued
+ \def\@nwlangdepcud{Dieser Code wird benutzt}%
+ % This code is used
+ \def\@nwlangdeprtc{Hauptteil (nicht in diesem Dokument benutzt)}%
+ % Root chunk (not used in this document)
+ \def\@nwlangdepcwf{Dieser Code schreibt man zum File}%
+ % This code is written to file
+ \def\@nwlangdepchk{Teil}%
+ % chunk
+ \def\@nwlangdepchks{Teils}%
+ % chunks
+ \def\@nwlangdepin{im}%
+ % in
+ \def\@nwlangdepand{und}%
+ % and
+ \def\@nwlangdepuss{Benutztt}%
+ % Uses
+ \def\@nwlangdepusd{benutzt}%
+ % used
+ \def\@nwlangdepnvu{nicht benutzt}%
+ % never used
+ \def\@nwlangdepdfs{Definiert}%
+ % Defines
+ \def\@nwlangdepnvd{nicht definiert}%
+ % never defined
+}
+\let\nwopt@ngerman\nwopt@german
+\ifx\languagename\undefined % default is English
+ \noweboptions{english}
+\else
+ \@ifundefined{nwopt@\languagename}
+ {\noweboptions{english}}
+ {\expandafter\noweboptions\expandafter{\languagename}}
+\fi
+% spadcommands are the actual text that you type at the axiom prompt
+\newcommand{\spadcommand}[1]%
+{\begin{flushleft}{\tt #1}\end{flushleft}\vskip .1cm }
+
+% spadgraph are the actual text that you type at the axiom prompt for draw
+\newcommand{\spadgraph}[1]%
+{\begin{flushleft}{\tt #1}\end{flushleft}\vskip .1cm }
+
+% returnType is the type signature returned by the axiom interpreter
+\newcommand{\returnType}[1]%
+{\begin{flushright}{\tt #1}\end{flushright}\vskip .1cm}
+
+% The book begins with some introductory material that is not really
+% listed as a chapter. This creates a header similar to \chapter.
+\newcommand{\pseudoChapter}[1]%
+{\vskip .5in \noindent {\Huge{\bf #1}}\vskip .5in}
+
+% The book begins with some introductory material that is not really
+% listed as a section. This creates a header similar to \section.
+\newcommand{\pseudoSection}[1]%
+{\vskip .25in \noindent {\large{\bf #1}}\vskip .25in}
+
+% spadofFrom records the operation in the index and the domain in the index
+\newcommand{\spadopFrom}[2]{\index{library!operations!#1 @\begingroup \string\tt{} #1 \endgroup}\index{#2}``{\tt #1}''}
+
+% spadfunFrom records the function name and domain in the index
+\newcommand{\spadfunFrom}[2]{{\bf #1}\index{#1 @\begingroup \string\bf{} #1 \endgroup}\index{#2}}
+
+\newcommand\AXIOM{\vskip\parindent\indent{\bf AXIOM}\vskip\parindent\noindent\ignorespaces}
+\newcommand\maxima{\vskip\parindent\noindent{\bf MAXIMA}\vskip\parindent\noindent\ignorespaces}
+\newcommand\yacas{\vskip\parindent\noindent{\bf YACAS}\vskip\parindent\noindent\ignorespaces}