diff --git a/books/bookvol7.1.pamphlet b/books/bookvol7.1.pamphlet
new file mode 100644
index 0000000..b8e4cf8
--- /dev/null
+++ b/books/bookvol7.1.pamphlet
@@ -0,0 +1,125229 @@
+\documentclass[dvipdfm]{book}
+\usepackage{hyperref}
+\usepackage{axiom}
+\usepackage{makeidx}
+\makeindex
+\usepackage{graphicx}
+\begin{document}
+\begin{titlepage}
+\center{\includegraphics{ps/axiomfront.ps}}
+\vskip 0.1in
+\includegraphics{ps/bluebayou.ps}\\
+\vskip 0.1in
+{\Huge{The 30 Year Horizon}}
+\vskip 0.1in
+$$
+\begin{array}{lll}
+Manuel\ Bronstein      & William\ Burge   & Timothy\ Daly \\
+James\ Davenport       & Michael\ Dewar   & Martin\ Dunstan \\
+Albrecht\ Fortenbacher & Patrizia\ Gianni & Johannes\ Grabmeier \\
+Jocelyn\ Guidry        & Richard\ Jenks   & Larry\ Lambe \\
+Michael\ Monagan       & Scott\ Morrison  & William\ Sit \\
+Jonathan\ Steinbach    & Robert\ Sutor    & Barry\ Trager \\
+Stephen\ Watt          & Jim\ Wen         & Clifton\ Williamson
+\end{array}
+$$
+\center{\large{Volume 7.1: Axiom Hyperdoc Pages}}
+\end{titlepage}
+\pagenumbering{roman}
+\begin{verbatim}
+Portions Copyright (c) 2005 Timothy Daly
+
+The Blue Bayou image Copyright (c) 2004 Jocelyn Guidry
+
+Portions Copyright (c) 2004 Martin Dunstan
+
+Portions Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+All rights reserved.
+
+This book and the Axiom software is licensed as follows:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    - Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    - Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+
+    - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+\end{verbatim}
+
+Inclusion of names in the list of credits is based on historical
+information and is as accurate as possible. Inclusion of names
+does not in any way imply an endorsement but represents historical
+influence on Axiom development.
+\vfill
+\eject
+\begin{tabular}{lll}
+Cyril Alberga         & Roy Adler             & Richard Anderson\\
+George Andrews        & Henry Baker           & Stephen Balzac\\
+Yurij Baransky        & David R. Barton       & Gerald Baumgartner\\
+Gilbert Baumslag      & Fred Blair            & Vladimir Bondarenko\\
+Mark Botch            & Alexandre Bouyer      & Peter A. Broadbery\\
+Martin Brock          & Manuel Bronstein      & Florian Bundschuh\\
+William Burge         & Quentin Carpent       & Bob Caviness\\
+Bruce Char            & Cheekai Chin          & David V. Chudnovsky\\
+Gregory V. Chudnovsky & Josh Cohen            & Christophe Conil\\
+Don Coppersmith       & George Corliss        & Robert Corless\\
+Gary Cornell          & Meino Cramer          & Claire Di Crescenzo\\
+Timothy Daly Sr.      & Timothy Daly Jr.      & James H. Davenport\\
+Jean Della Dora       & Gabriel Dos Reis      & Michael Dewar\\
+Claire DiCrescendo    & Sam Dooley            & Lionel Ducos\\
+Martin Dunstan        & Brian Dupee           & Dominique Duval\\
+Robert Edwards        & Heow Eide-Goodman     & Lars Erickson\\
+Richard Fateman       & Bertfried Fauser      & Stuart Feldman\\
+Brian Ford            & Albrecht Fortenbacher & George Frances\\
+Constantine Frangos   & Timothy Freeman       & Korrinn Fu\\
+Marc Gaetano          & Rudiger Gebauer       & Kathy Gerber\\
+Patricia Gianni       & Holger Gollan         & Teresa Gomez-Diaz\\
+Laureano Gonzalez-Vega& Stephen Gortler       & Johannes Grabmeier\\
+Matt Grayson          & James Griesmer        & Vladimir Grinberg\\
+Oswald Gschnitzer     & Jocelyn Guidry        & Steve Hague\\
+Vilya Harvey          & Satoshi Hamaguchi     & Martin Hassner\\
+Ralf Hemmecke         & Henderson             & Antoine Hersen\\
+Pietro Iglio          & Richard Jenks         & Kai Kaminski\\
+Grant Keady           & Tony Kennedy          & Paul Kosinski\\
+Klaus Kusche          & Bernhard Kutzler      & Larry Lambe\\
+Frederic Lehobey      & Michel Levaud         & Howard Levy\\
+Rudiger Loos          & Michael Lucks         & Richard Luczak\\
+Camm Maguire          & Bob McElrath          & Michael McGettrick\\
+Ian Meikle            & David Mentre          & Victor S. Miller\\
+Gerard Milmeister     & Mohammed Mobarak      & H. Michael Moeller\\
+Michael Monagan       & Marc Moreno-Maza      & Scott Morrison\\
+Mark Murray           & William Naylor        & C. Andrew Neff\\
+John Nelder           & Godfrey Nolan         & Arthur Norman\\
+Jinzhong Niu          & Michael O'Connor      & Kostas Oikonomou\\
+Julian A. Padget      & Bill Page             & Jaap Weel\\
+Susan Pelzel          & Michel Petitot        & Didier Pinchon\\
+Claude Quitte         & Norman Ramsey         & Michael Richardson\\
+Renaud Rioboo         & Jean Rivlin           & Nicolas Robidoux\\
+Simon Robinson        & Michael Rothstein     & Martin Rubey\\
+Philip Santas         & Alfred Scheerhorn     & William Schelter\\
+Gerhard Schneider     & Martin Schoenert      & Marshall Schor\\
+Fritz Schwarz         & Nick Simicich         & William Sit\\
+Elena Smirnova        & Jonathan Steinbach    & Christine Sundaresan\\
+Robert Sutor          & Moss E. Sweedler      & Eugene Surowitz\\
+James Thatcher        & Baldir Thomas         & Mike Thomas\\
+Dylan Thurston        & Barry Trager          & Themos T. Tsikas\\
+Gregory Vanuxem       & Bernhard Wall         & Stephen Watt\\
+Juergen Weiss         & M. Weller             & Mark Wegman\\
+James Wen             & Thorsten Werther      & Michael Wester\\
+John M. Wiley         & Berhard Will          & Clifton J. Williamson\\
+Stephen Wilson        & Shmuel Winograd       & Robert Wisbauer\\
+Sandra Wityak         & Waldemar Wiwianka     & Knut Wolf\\
+Clifford Yapp         & David Yun             & Richard Zippel\\
+Evelyn Zoernack       & Bruno Zuercher        & Dan Zwillinger 
+\end{tabular}
+\eject
+\tableofcontents
+\vfill
+\eject
+\setlength{\parindent}{0em}
+\setlength{\parskip}{1ex}
+{\Large{\bf New Foreword}}
+\vskip .25in
+
+On October 1, 2001 Axiom was withdrawn from the market and ended
+life as a commercial product.
+On September 3, 2002 Axiom was released under the Modified BSD
+license, including this document.
+On August 27, 2003 Axiom was released as free and open source
+software available for download from the Free Software Foundation's
+website, Savannah.
+
+Work on Axiom has had the generous support of the Center for 
+Algorithms and Interactive Scientific Computation (CAISS) at
+City College of New York. Special thanks go to Dr. Gilbert 
+Baumslag for his support of the long term goal.
+
+The online version of this documentation is roughly 1000 pages.
+In order to make printed versions we've broken it up into three
+volumes. The first volume is tutorial in nature. The second volume
+is for programmers. The third volume is reference material. We've
+also added a fourth volume for developers. All of these changes
+represent an experiment in print-on-demand delivery of documentation.
+Time will tell whether the experiment succeeded.
+
+Axiom has been in existence for over thirty years. It is estimated to
+contain about three hundred man-years of research and has, as of
+September 3, 2003, 143 people listed in the credits. All of these
+people have contributed directly or indirectly to making Axiom
+available.  Axiom is being passed to the next generation. I'm looking
+forward to future milestones.
+
+With that in mind I've introduced the theme of the ``30 year horizon''.
+We must invent the tools that support the Computational Mathematician
+working 30 years from now. How will research be done when every bit of
+mathematical knowledge is online and instantly available? What happens
+when we scale Axiom by a factor of 100, giving us 1.1 million domains?
+How can we integrate theory with code? How will we integrate theorems
+and proofs of the mathematics with space-time complexity proofs and
+running code? What visualization tools are needed? How do we support
+the conceptual structures and semantics of mathematics in effective
+ways? How do we support results from the sciences? How do we teach
+the next generation to be effective Computational Mathematicians?
+
+The ``30 year horizon'' is much nearer than it appears.
+
+\vskip .25in
+%\noindent
+Tim Daly\\
+CAISS, City College of New York\\
+November 10, 2003 ((iHy))
+\vfill
+\eject
+\pagenumbering{arabic}
+\setcounter{chapter}{0} % Chapter 1
+\chapter{Release Notes}
+\section{releasenotes.ht}
+\subsection{What's New in Axiom}
+\label{releaseNotes}
+\index{pages!releaseNotes!releasenotes.ht}
+\index{releasenotes.ht!pages!releaseNotes}
+\index{releaseNotes!releasenotes.ht!pages}
+<<releasenotes.ht>>=
+\begin{page}{releaseNotes}{0. What's New in Axiom}
+\beginscroll
+\beginmenu
+    \menudownlink{Online information}{onlineInformation}
+    \menudownlink{February 2005}{feb2005}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\subsection{Online Information}
+\label{onlineInformation}
+\index{pages!onlineInformation!releasenotes.ht}
+\index{releasenotes.ht!pages!onlineInformation}
+\index{onlineInformation!releasenotes.ht!pages}
+<<releasenotes.ht>>=
+\begin{page}{onlineInformation}{Online information}
+\beginscroll
+Axiom information can be found online at
+{http://axiom.axiom-developer.org}
+{http://savannah.nongnu.org/projects/axiom}
+{http://sourceforge.net/projects/axiom}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\subsection{Feature Complete Release Feb 2005}
+\label{feb2005}
+\index{pages!feb2005!releasenotes.ht}
+\index{releasenotes.ht!pages!feb2005}
+\index{feb2005!releasenotes.ht!pages}
+<<releasenotes.ht>>=
+\begin{page}{feb2005}{Feature Complete Release Feb 2005}
+\beginscroll
+The February 2005 release is the first complete release of the 
+Axiom system since it was first made available as open source.
+
+This release includes the full complement of algebra, the graphics
+subsystem, and the hyperdoc system. 
+
+This full release runs on Linux and Solaris 9. 
+The algebra runs on Windows.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\chapter{Special hyperdoc pages}
+\section{util.ht}
+This file contains macros for the Axiom HyperDoc hypertext facility.
+Most of the macros for the system are here though there may be some in
+individual .ht files that are of a local nature.
+\index{files!util.ht}
+\index{util.ht files}
+\subsection{Names of software and facilities}
+<<util.ht>>=
+\newcommand{\Browse}{Browse}
+\newcommand{\Language}{Axiom}
+\newcommand{\SpadName}{\Language}
+\newcommand{\LangName}{\Language}
+\newcommand{\HyperName}{HyperDoc}
+\newcommand{\axiomxl}{Aldor}
+\newcommand{\anatural}{Aldor}
+\newcommand{\Clef}{Clef}
+\newcommand{\Lisp}{Common LISP}
+\newcommand{\naglib}{NAG Foundation Library}
+\newcommand{\GoBackToWork}
+{\vspace{2}\newline
+{Click on \  \UpButton{} \  to go back to what you were doing.}}
+
+@
+\subsection{Special hooks to Unix}
+All unix commands should be done as macros defined here so we don't
+have to go hunting when moving between Unix versions.
+<<util.ht>>=
+\newcommand{\newspadclient}[1]{xterm -n "#1" -e \$SPAD/bin/clef \$SPAD/bin/server/spadclient}
+\newcommand{\searchwindow}[2]{\unixwindow{#1}{\$SPAD/lib/htsearch "#2"}}
+\newcommand{\unixwindow}[2]{\unixlink{#1}{#2}}
+\newcommand{\menuunixlink}[2]{\item\unixlink{\menuitemstyle{#1}}{#2}}
+\newcommand{\menuunixcommand}[2]{\item\unixcommand{\menuitemstyle{#1}}{#2}}
+\newcommand{\menuunixwindow}[2]{\item\unixwindow{\menuitemstyle{#1}}{#2}}
+
+@
+\subsection{HyperDoc menu macros}
+<<util.ht>>=
+% Example:
+%
+% \beginmenu
+% \menulink{Thing One}{PageOne} la da di da da ...
+% \menulink{Thin Two}{PageTwo}  do da day ...
+% \item \ACmdMacro{\menuitemstyle{Thing Three}} la di da ...
+% \endmenu
+
+% The menu environment
+
+\newcommand{\beginmenu}          {\beginitems[\MenuDotBitmap]}
+\newcommand{\endmenu}            {\enditems}
+
+% This is the usual format for a menu item.
+
+\newcommand{\menuitemstyle}[1]   {{\MenuDotBitmap}#1}
+
+% Often-used menu item forms
+
+%   These two simply do links
+\newcommand{\menudownlink}[2]    {\item\downlink{\menuitemstyle{#1}}{#2}}
+\newcommand{\menulink}[2]        {\menudownlink{#1}{#2}}
+
+%   This will cause lower level links to have a HOME button
+\newcommand{\menumemolink}[2]    {\item\memolink{\menuitemstyle{#1}}{#2}}
+
+%   This opens a new window for the linked page.
+\newcommand{\menuwindowlink}[2]    {\item\windowlink{\menuitemstyle{#1}}{#2}}
+
+%   These execute lisp commands in various flavors
+\newcommand{\menulispcommand}[2] {\item\lispcommand{\menuitemstyle{#1}}{#2}}
+\newcommand{\menulispdownlink}[2]{\item\lispdownlink{\menuitemstyle{#1}}{#2}}
+\newcommand{\menulispmemolink}[2]{\item\lispmemolink{\menuitemstyle{#1}}{#2}}
+\newcommand{\menulispwindowlink}[2]{\item\lispwindowlink{\menuitemstyle{#1}}{#2}}
+
+%   This executes a unix command
+\newcommand{\menuunixcmd}[2]     {\item\unixcommand{\menuitemstyle{#1}}{#2}}
+\newcommand{\searchresultentry}[3]{\tab{3}\item#3\tab{8}\downlink{\menuitemstyle{#1}}{#2}\newline}
+\newcommand{\newsearchresultentry}[3]{\tab{3}\item#1\tab{8}\downlink{\menuitemstyle{#2}}{#3}\newline}
+
+@
+\subsection{Bitmaps and bitmap manipulation macros}
+<<util.ht>>=
+\newcommand{\htbmdir}{\env{AXIOM}/doc/hypertex/bitmaps}
+\newcommand{\htbmfile}[1]{\htbmdir /#1.bitmap}
+\newcommand{\htbitmap}[1]{\inputbitmap{\htbmfile{#1}}}
+\newcommand{\ControlBitmap}[1]{\controlbitmap{\htbmfile{#1}}}
+
+% next group of bitmaps frequently appear in the titlebar
+\newcommand{\ContinueBitmap} {\ControlBitmap{continue}}
+\newcommand{\DoItBitmap}     {\ControlBitmap{doit}}
+\newcommand{\ExitBitmap}     {\ControlBitmap{exit3d}}
+\newcommand{\HelpBitmap}     {\ControlBitmap{help3d}}
+\newcommand{\ReturnBitmap}   {\ControlBitmap{home3d}}
+\newcommand{\NoopBitmap}       {\ControlBitmap{noop3d}}
+\newcommand{\UpBitmap}       {\ControlBitmap{up3d}}
+
+\newcommand{\MenuDotBitmap}{\htbitmap{menudot}}
+
+% Including control panel pixmaps for help pages:
+
+\newcommand{\helpbit}[1]{\centerline{\inputpixmap{\env{AXIOM}/doc/hypertex/pixmaps/{#1}}}}
+
+@
+\subsection{HyperDoc button objects}
+<<util.ht>>=
+\newcommand{\ContinueButton}[1]{\downlink{Click here}{#1} to continue.}
+\newcommand{\ExitButton}[1]{\memolink{\ExitBitmap}{#1}}
+\newcommand{\HelpButton}[1]{\memolink{\HelpBitmap}{#1}}
+\newcommand{\StdHelpButton}{\HelpButton{ugHyperPage}}
+\newcommand{\StdExitButton}{\ExitButton{ProtectedQuitPage}}
+\newcommand{\UpButton}{\upbutton{\UpBitmap}{UpPage}}
+\newcommand{\ReturnButton}{\returnbutton{\ReturnBitmap}{ReturnPage}}
+\newcommand{\on}[1]{{\inputbox[1]{#1}{\htbmfile{pick}}
+             {\htbmfile{unpick}}}}
+\newcommand{\off}[1]{{\inputbox[0]{#1}{\htbmfile{pick}}
+             {\htbmfile{unpick}}}}
+
+@
+\subsection{Standard HyperDoc button configurations}
+<<util.ht>>=
+\newcommand{\autobutt}[1]{\helppage{#1}}
+\newcommand{\autobuttons}{}
+\newcommand{\exitbuttons}{}
+
+\newcommand{\autobuttLayout}[1]{\centerline{#1}}}
+\newcommand{\autobuttMaker}[1]{\autobuttLayout{\HelpButton{#1}}}
+\newcommand{\riddlebuttons}[1]{\autobuttLayout{\link{\HelpBitmap}{#1}}}
+
+% Macro for downward compatibility (?).
+
+\newcommand{\simplebox}[2]{\inputbox[#1]{#2}{\htbitmap{xbox}}{\htbitmap{xopenbox}}}
+
+@
+\subsection{HyperDoc graphics macros}
+<<util.ht>>=
+% Including viewport bitmaps within \HyperName pages:
+
+\newcommand{\viewport}[1]{\inputimage{{#1}.view/image}}
+\newcommand{\axiomViewport}[1]{\inputimage{\env{AXIOM}/doc/viewports/{#1}.view/image}}
+\newcommand{\spadviewport}[1]{\axiomViewport{#1}}
+
+% Creating a real live viewport:
+
+\newcommand{\viewportbutton}[2]{\unixcommand{#1}{viewalone #2}}
+\newcommand{\axiomViewportbutton}[2]{\unixcommand{#1}{viewalone \$AXIOM/doc/viewports/{#2}}}
+\newcommand{\spadviewportbutton}[2]{\axiomViewportbutton{#1}{#2}}
+
+% Making active viewport buttons:
+
+\newcommand{\viewportasbutton}[1]{\unixcommand{\inputimage{{#1}.view/image}}{viewalone {#1}}}
+\newcommand{\axiomViewportasbutton}[1]{\unixcommand{\inputimage{\env{AXIOM}/doc/viewports/{#1}.view/image}}{viewalone \$AXIOM/doc/viewports/{#1}}}
+\newcommand{\spadviewportasbutton}[1]{\axiomViewportasbutton{#1}}
+
+@
+\subsection{TeX and LaTeX compatibility macros}
+<<util.ht>>=
+%% Begin macros that are needed because HD uses the wrong names
+
+\newcommand{\center}[1]{\centerline{#1}}
+\newcommand{\box}[1]{\fbox{#1}}
+
+%% End   macros that are needed because HD uses the wrong names
+
+\newcommand{\LARGE}{}
+\newcommand{\LaTeX}{LaTeX}
+\newcommand{\Large}{}
+\newcommand{\TeX}{TeX}
+\newcommand{\allowbreak}{}
+\newcommand{\aleph}{\inputbitmap{\htbmdir{}/aleph.bitmap}}
+\newcommand{\alpha}{\inputbitmap{\htbmdir{}/alpha.bitmap}}
+\newcommand{\angle}{\inputbitmap{\htbmdir{}/angle.bitmap}}
+\newcommand{\backslash}{\inputbitmap{\htbmdir{}/backslash.bitmap}}
+\newcommand{\beta}{\inputbitmap{\htbmdir{}/beta.bitmap}}
+\newcommand{\bigbreak}{\newline\newline}
+\newcommand{\bot}{\inputbitmap{\htbmdir{}/bot.bitmap}}
+\newcommand{\bullet}{\inputbitmap{\htbmdir{}/bullet.bitmap}}
+\newcommand{\caption}[1]{\newline\centerline{#1}\newline}
+\newcommand{\chi}{\inputbitmap{\htbmdir{}/chi.bitmap}}
+\newcommand{\cite}[1]{bibliography entry for {\it #1}}
+\newcommand{\cleardoublepage}{}
+\newcommand{\coprod}{\inputbitmap{\htbmdir{}/coprod.bitmap}}
+\newcommand{\del}{\inputbitmap{\htbmdir{}/del.bitmap}}
+\newcommand{\delta}{\inputbitmap{\htbmdir{}/delta.bitmap}}
+\newcommand{\Delta}{\inputbitmap{\htbmdir{}/delta-cap.bitmap}}
+\newcommand{\div}{\inputbitmap{\htbmdir{}/div.bitmap}}
+\newcommand{\dot}{\inputbitmap{\htbmdir{}/dot.bitmap}}
+\newcommand{\ell}{\inputbitmap{\htbmdir{}/ell.bitmap}}
+\newcommand{\emptyset}{\inputbitmap{\htbmdir{}/emptyset.bitmap}}
+\newcommand{\epsilon}{\inputbitmap{\htbmdir{}/epsilon.bitmap}}
+\newcommand{\epsffile}{}
+\newcommand{\eta}{\inputbitmap{\htbmdir{}/eta.bitmap}}
+\newcommand{\exists}{\inputbitmap{\htbmdir{}/exists.bitmap}}
+\newcommand{\forall}{\inputbitmap{\htbmdir{}/forall.bitmap}}
+\newcommand{\footnote}[1]{ {(#1)}}
+\newcommand{\frenchspacing}{}
+\newcommand{\gamma}{\inputbitmap{\htbmdir{}/gamma.bitmap}}
+\newcommand{\Gamma}{\inputbitmap{\htbmdir{}/gamma-cap.bitmap}}
+\newcommand{\hbar}{\inputbitmap{\htbmdir{}/hbar.bitmap}}
+\newcommand{\hbox}[1]{{#1}}
+\newcommand{\hfill}{}
+\newcommand{\hfil}{}
+\newcommand{\huge}{}
+\newcommand{\Im}{\inputbitmap{\htbmdir{}/im-cap.bitmap}}
+\newcommand{\imath}{\inputbitmap{\htbmdir{}/imath.bitmap}}
+\newcommand{\infty}{\inputbitmap{\htbmdir{}/infty.bitmap}}
+\newcommand{\int}{\inputbitmap{\htbmdir{}/int.bitmap}}
+\newcommand{\iota}{\inputbitmap{\htbmdir{}/iota.bitmap}}
+\newcommand{\index}[1]{}
+\newcommand{\jmath}{\inputbitmap{\htbmdir{}/jmath.bitmap}}
+\newcommand{\kappa}{\inputbitmap{\htbmdir{}/kappa.bitmap}}
+\newcommand{\label}[1]{}
+\newcommand{\lambda}{\inputbitmap{\htbmdir{}/lambda.bitmap}}
+\newcommand{\Lambda}{\inputbitmap{\htbmdir{}/lambda-cap.bitmap}}
+\newcommand{\large}{}
+\newcommand{\ldots}{...}
+\newcommand{\le}{<=}
+\newcommand{\marginpar}[1]{}
+\newcommand{\mu}{\inputbitmap{\htbmdir{}/mu.bitmap}}
+\newcommand{\neg}{\inputbitmap{\htbmdir{}/neg.bitmap}}
+\newcommand{\newpage}{}
+\newcommand{\noindent}{\indent{0}}
+\newcommand{\nonfrenchspacing}{}
+\newcommand{\nabla}{\inputbitmap{\htbmdir{}/nabla.bitmap}}
+\newcommand{\nu}{\inputbitmap{\htbmdir{}/nu.bitmap}}
+\newcommand{\omega}{\inputbitmap{\htbmdir{}/omega.bitmap}}
+\newcommand{\Omega}{\inputbitmap{\htbmdir{}/omega-cap.bitmap}}
+\newcommand{\pageref}[1]{???}
+\newcommand{\parallel}{\inputbitmap{\htbmdir{}/parallel.bitmap}}
+\newcommand{\partial}{\inputbitmap{\htbmdir{}/partial.bitmap}}
+\newcommand{\phi}{\inputbitmap{\htbmdir{}/phi.bitmap}}
+\newcommand{\Phi}{\inputbitmap{\htbmdir{}/phi-cap.bitmap}}
+\newcommand{\pi}{\inputbitmap{\htbmdir{}/pi.bitmap}}
+\newcommand{\Pi}{\inputbitmap{\htbmdir{}/pi-cap.bitmap}}
+\newcommand{\prime}{\inputbitmap{\htbmdir{}/prime.bitmap}}
+\newcommand{\prod}{\inputbitmap{\htbmdir{}/prod.bitmap}}
+\newcommand{\protect}{}
+\newcommand{\psi}{\inputbitmap{\htbmdir{}/psi.bitmap}}
+\newcommand{\Psi}{\inputbitmap{\htbmdir{}/psi-cap.bitmap}}
+\newcommand{\quad}{\inputbitmap{\htbmdir{}/quad.bitmap}}
+\newcommand{\Re}{\inputbitmap{\htbmdir{}/re-cap.bitmap}}
+\newcommand{\rho}{\inputbitmap{\htbmdir{}/rho.bitmap}}
+\newcommand{\sc}{\rm}
+\newcommand{\sf}{\bf}
+\newcommand{\sigma}{\inputbitmap{\htbmdir{}/sigma.bitmap}}
+\newcommand{\Sigma}{\inputbitmap{\htbmdir{}/sigma-cap.bitmap}}
+\newcommand{\small}{}
+\newcommand{\sum}{\inputbitmap{\htbmdir{}/sum.bitmap}}
+\newcommand{\surd}{\inputbitmap{\htbmdir{}/surd.bitmap}}
+\newcommand{\tau}{\inputbitmap{\htbmdir{}/tau.bitmap}}
+\newcommand{\theta}{\inputbitmap{\htbmdir{}/theta.bitmap}}
+\newcommand{\Theta}{\inputbitmap{\htbmdir{}/theta-cap.bitmap}}
+\newcommand{\times}{\inputbitmap{\htbmdir{}/times.bitmap}}
+\newcommand{\top}{\inputbitmap{\htbmdir{}/top.bitmap}}
+\newcommand{\triangle}{\inputbitmap{\htbmdir{}/triangle.bitmap}}
+\newcommand{\upsilon}{\inputbitmap{\htbmdir{}/upsilon.bitmap}}
+\newcommand{\Upsilon}{\inputbitmap{\htbmdir{}/upsilon-cap.bitmap}}
+\newcommand{\vbox}[1]{{#1}}
+\newcommand{\wp}{\inputbitmap{\htbmdir{}/wp.bitmap}}
+\newcommand{\xi}{\inputbitmap{\htbmdir{}/xi.bitmap}}
+\newcommand{\Xi}{\inputbitmap{\htbmdir{}/xi-cap.bitmap}}
+\newcommand{\zeta}{\inputbitmap{\htbmdir{}/zeta.bitmap}}
+\newcommand{\bs}{\\}
+
+@
+\subsection{Book and .ht page macros}
+<<util.ht>>=
+\newcommand{\beginImportant}{\horizontalline}
+\newcommand{\endImportant}{\horizontalline}
+%
+% following handles things like "i-th" but uses "-th"
+\newcommand{\eth}[1]{{#1}-th}}
+%
+\newcommand{\texnewline}{}
+\newcommand{\texbreak}{}
+\newcommand{\Gallery}{{AXIOM Images}}
+\newcommand{\exptypeindex}[1]{}
+\newcommand{\gotoevenpage}{}
+\newcommand{\ignore}[1]{}
+\newcommand{\ind}{\newline\tab{3}}
+\newcommand{\labelSpace}[1]{}
+\newcommand{\mathOrSpad}[1]{{\spad{#1}}}
+\newcommand{\menuspadref}[2]{\menudownlink{#1}{#2Page}}
+\newcommand{\menuxmpref}[1]{\menudownlink{`#1'}{#1XmpPage}}
+\newcommand{\noOutputXtc}[2]{\xtc{#1}{#2}}  % comment and then \spadcommand or spadsrc
+\newcommand{\not=}{\inputbitmap{\htbmdir{}/not=.bitmap}}
+\newcommand{\notequal}{\inputbitmap{\htbmdir{}/notequal.bitmap}}
+\newcommand{\nullXtc}[2]{\xtc{#1}{#2}}      % comment and then \spadcommand or spadsrc
+\newcommand{\nullspadcommand}[1]{\spadcommand}
+\newcommand{\pp}{\newline}              % Use this instead of \par for now.
+\newcommand{\psXtc}[3]{\xtc{#1}{#2}}        % comment and then \spadcommand or spadsrc
+\newcommand{\ref}[1]{(see the graph)}
+\newcommand{\showBlurb}[1]{Issue the system command \spadcmd{)show #1} to display the full list of operations defined by \spadtype{#1}.}
+\newcommand{\smath}[1]{\mathOrSpad{#1}}
+\newcommand{\spadFileExt}{.spad}
+\newcommand{\spadkey}[1]{}
+\newcommand{\spadref} [1]{{\it #1}}
+\newcommand{\spadsig}[2]{\spadtype{#1} {\tt ->} \spadtype{#2}}
+\newcommand{\axiomSig}[2]{\axiomType{#1} {\tt ->} \axiomType{#2}}
+\newcommand{\subscriptIt}[2]{{\it {#1}\_{#2}}}
+\newcommand{\subscriptText}[2]{{\it {#1}\_{\it #2}}}
+\newcommand{\subsubsection}[1]{\newline\indent{0}{\bf #1}\newline\newline}
+\newcommand{\syscmdindex}[1]{}              % system command index macro
+\newcommand{\threedim}{three-dimensional}
+\newcommand{\twodim}{two-dimensional}
+\newcommand{\unind}{\newline}
+\newcommand{\void}{the unique value of \spadtype{Void}}
+\newcommand{\xdefault}[1]{The default value is {\tt "#1"}.}
+\newcommand{\xmpLine}[2]{{\tt #1}\newline}   % have to improve someday
+\newcommand{\xmpref}[1]{\downlink{`#1'}{#1XmpPage}}
+\newcommand{\xtc}[2]{#1 #2}                 % comment and then \spadcommand or spadsrc
+
+% glossary terms
+\newcommand{\axiomGloss}[1]{\lispdownlink{#1}{(|htGloss| '|#1|)}}
+\newcommand{\axiomGlossSee}[2]{\lispdownlink{#1}{(|htGloss| '|#2|)}}
+\newcommand{\spadgloss}[1]{\axiomGloss{#1}}
+\newcommand{\spadglossSee}[2]{\axiomGlossSee{#1}{#2}}
+
+% use this for syntax punctuation: \axiomSyntax{::}
+\newcommand{\axiomSyntax}[1]{``{\tt #1}''}
+\newcommand{\spadSyntax}[1]{\axiomSyntax{#1}}
+
+% constructors
+\newcommand{\axiomType}[1]{\lispdownlink{#1}{(|spadType| '|#1|)}}
+\newcommand{\spadtype}[1]{\axiomType{#1}}
+\newcommand{\nonLibAxiomType}[1]{{\it #1}}       % things that browse can't handle
+\newcommand{\pspadtype}[1]{\nonLibAxiomType{#1}}
+
+\newcommand{\axiom}   [1]{{\tt #1}}              % note font
+\newcommand{\spad}    [1]{\axiom{#1}}
+\newcommand{\spadvar} [1]{\axiom{#1}}            % exists in ++ comments; to be removed
+\newcommand{\s}       [1]{\axiom{#1}}
+
+\newcommand{\httex}[2]{#1}
+\newcommand{\texht}[2]{#2}
+
+% Function names:
+%
+% The X versions below are used because AXIOM function names that end
+% in ``!'' cause problems for makeindex for had-copy.
+%
+% Example: \spadfunFromX{reverse}{List} prints as   reverse!
+%
+% In the "From" versions, the first arg is function name, second is constructor
+% where exported.
+%
+% Use the "op" flavors of "-", "+", "*" etc, otherwise the "fun" flavors
+
+\newcommand{\userfun} [1]{{\bf #1}}              % example, non-library function names
+
+\newcommand{\fakeAxiomFun}[1]{{\bf #1}}          % not really a library function
+\newcommand{\pspadfun} [1]{\fakeAxiomFun{#1}}
+
+\newcommand{\axiomFun} [1]{\lispdownlink{#1}{(|oPage| '|#1|)}}
+\newcommand{\spadfun} [1]{\axiomFun{#1}}
+\newcommand{\axiomFunX}[1]{\axiomFun{#1!}}
+\newcommand{\spadfunX}[1]{\axiomFun{#1!}}
+
+\newcommand{\axiomFunFrom}[2]{\lispdownlink{#1}{(|oPageFrom| '|#1| '|#2|)}}
+\newcommand{\spadfunFrom}[2]{\axiomFunFrom{#1}{#2}}
+\newcommand{\axiomFunFromX}[2]{\axiomFunFrom{#1!}{#2}}
+\newcommand{\spadfunFromX}[2]{\axiomFunFrom{#1!}{#2}}
+
+\newcommand{\axiomOp} [1]{\lispdownlink{#1}{(|oPage| '|#1|)}}
+\newcommand{\spadop}  [1]{\axiomOp{#1}}
+\newcommand{\axiomOpX}[1]{\axiomOp{#1!}}
+
+\newcommand{\axiomOpFrom}[2]{\lispdownlink{#1}{(|oPageFrom| '|#1| '|#2|)}}
+\newcommand{\spadopFrom} [2]{\axiomOpFrom{#1}{#2}}
+\newcommand{\axiomOpFromX}[2] {\axiomOpFrom{#1!}{#2}}
+\newcommand{\spadopFromX}[2] {\axiomOpFrom{#1!}{#2}}
+
+% redundant defns for system commands
+\newcommand{\syscom}[1]{\lispdownlink{)#1}{(|syscomPage| '|#1|)}}
+%
+\newcommand{\spadsyscom}[1]{{\tt #1}}
+\newcommand{\spadcmd}[1]{\spadsyscom{#1}}
+\newcommand{\spadsys}[1]{\spadsyscom{#1}}
+
+
+% Following macros should be phased out in favor of ones above:
+
+\newcommand{\gloss}[1]{\axiomGloss{#1}}
+\newcommand{\spadglos}[1]{\axiomGloss{#1}}
+\newcommand{\glossSee}[2]{\axiomGlossSee{#1}{#2}}
+
+@
+\subsection{Browse macros}
+<<util.ht>>=
+\newcommand{\undocumented}[0]{is not documented yet}
+\newcommand{\aliascon}[2]{\lispdownlink{#1}{(|conPage| '|#2|)}}
+\newcommand{\aliasdom}[2]{\lispdownlink{#1}{(|conPage| '|#2|)}}
+\newcommand{\andexample}[1]{\indent{5}\spadcommand{#1}\indent{0}\newline}
+\newcommand{\blankline}{\vspace{1}\newline }
+\newcommand{\con}[1]{\lispdownlink{#1}{(|conPage| '|#1|)}}
+
+\newcommand{\conf}[2]{\lispdownlink{#1}{(|conPage| '{#2})}}
+% generalizes "con" to allow arbitrary title and form
+
+\newcommand{\ops}[3]{\lisplink{#1}{(|conOpPage| #2 '{#3})}}
+% does lisplink to operation page of a constructor or form
+% #1 is constructor name or form, without fences, e.g. "Matrix(Integer)"
+% #2 is page number, extracted from $curPage (see fromHeading/dbOpsForm)
+% #3 is constructor name or form, with fences, e.g. "(|Matrix| (|Integer|))"
+
+\newcommand{\dlink}[2]{\downlink{#2}{#1}}
+\newcommand{\dom}[1]{\lispdownlink{#1}{(|conPage| '|#1|)}}
+\newcommand{\example}[1]{\newline\indent{5}\spadcommand{#1}\indent{0}\newline}
+\newcommand{\lisp}[2]{\lispdownlink{#2}{#1}}
+\newcommand{\spadatt} [1]{{\it #1}}
+\newcommand{\indented}[2]{\indentrel{#1}\newline #2\indentrel{-#1}\newline}
+\newcommand{\keyword}[1]{\lispdownlink{#1}{(|htsn| '|#1|)}}
+\newcommand{\op}[1]{\lispdownlink{#1}{(|htsn| '|#1|)}}
+\newcommand{\spadignore}[1]{#1}
+
+@
+\subsection{Support for output and graph paste-ins}
+<<util.ht>>=
+\newcommand{\axiomcommand}[1]{\spadcommand{#1}}
+\newcommand{\axiomgraph}[1]{\spadgraph{#1}}
+
+\newcommand{\pastecommand}[1]{\spadpaste{#1}}
+\newcommand{\pastegraph}[1]{\graphpaste{#1}}
+
+\newcommand{\showpaste}{\htbitmap{sdown3d}}
+\newcommand{\hidepaste}{\htbitmap{sup3d}}
+\newcommand{\spadpaste}[1]{
+  \newline
+  \begin{paste}{\pagename Empty \examplenumber}{\pagename Patch \examplenumber}
+  \pastebutton{\pagename Empty \examplenumber}{\showpaste}
+  \tab{5}\spadcommand{#1}
+  \end{paste}
+}
+
+\newcommand{\graphpaste}[1]{
+  \newline
+  \begin{paste}{\pagename Empty \examplenumber}{\pagename Patch \examplenumber}
+  \pastebutton{\pagename Empty \examplenumber}{\showpaste}
+  \tab{5}\spadgraph{#1}
+  \end{paste}
+}
+
+@
+\subsection{Hook for including a local menu item on the rootpage}
+<<util.ht>>=
+\newcommand{\localinfo}{}
+
+@
+\section{Special Hyperdoc pages}
+\subsection{Not Connected to Axiom}
+\index{pages!SpadNotConnectedPage!util.ht}
+\index{util.ht!pages!SpadNotConnectedPage}
+\index{SpadNotConnectedPage!util.ht!pages}
+<<util.ht>>=
+\begin{page}{SpadNotConnectedPage}{Not Connected to Axiom}
+\beginscroll
+\HyperName{} isn't connected to Axiom, therefore cannot execute
+the button you pressed.
+%
+\GoBackToWork{}
+\endscroll
+\end{page}
+
+@
+\subsection{Do You Really Want to Exit?}
+\index{pages!ProtectedQuitPage!util.ht}
+\index{util.ht!pages!ProtectedQuitPage}
+\index{ProtectedQuitPage!util.ht!pages}
+<<util.ht>>=
+\begin{page}{ProtectedQuitPage}{Do You Really Want to Exit?}
+\beginscroll
+{Click again on \  \ExitButton{QuitPage} \  to terminate \HyperName{}.}
+\vspace{1}\newline
+\centerline{OR}
+\GoBackToWork{}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\subsection{Missing Page}
+\index{pages!UnknownPage!util.ht}
+\index{util.ht!pages!UnknownPage}
+\index{UnknownPage!util.ht!pages}
+<<util.ht>>=
+\begin{page}{UnknownPage}{Missing Page}
+\beginscroll
+\pp
+The page you requested was not found in the \HyperName{} database.
+\GoBackToWork{}
+\endscroll
+\end{page}
+
+@
+\subsection{Something is Wrong}
+\index{pages!ErrorPage!util.ht}
+\index{util.ht!pages!ErrorPage}
+\index{ErrorPage!util.ht!pages}
+<<util.ht>>=
+\begin{page}{ErrorPage}{Something is Wrong}
+\beginscroll
+{For some reason the page you tried to link to cannot be formatted.}
+\GoBackToWork{}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\subsection{Sorry!}
+\index{pages!Unlinked!util.ht}
+\index{util.ht!pages!Unlinked}
+\index{Unlinked!util.ht!pages}
+<<util.ht>>=
+\begin{page}{Unlinked}{Sorry!}
+\beginscroll
+{This link is not implemented yet.}
+\GoBackToWork{}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\chapter{Hyperdoc pages}
+The hyperdoc pages can be viewed as a forest of rooted pages.
+The main routine in hypertex will look for a page called ``RootPage''.
+See RootPage \ref{RootPage} on page~\pageref{RootPage}
+\section{algebra.ht}
+@
+\subsection{Abstract Algebra}
+\label{AlgebraPage}
+\begin{itemize}
+\item NumberTheoryPage \ref{NumberTheoryPage} on
+page~pageref{NumberTheoryPage}
+\item GroupTheoryPage \ref{GroupTheoryPage} on
+page~pageref{GroupTheoryPage}
+\end{itemize}
+\index{pages!AlgebraPage!algebra.ht}
+\index{algebra.ht!pages!AlgebraPage}
+\index{AlgebraPage!algebra.ht!pages}
+<<algebra.ht>>=
+\begin{page}{AlgebraPage}{Abstract Algebra}
+\beginscroll
+Axiom provides various facilities for treating topics in abstract
+algebra.
+\beginmenu
+\menulink{Number Theory}{NumberTheoryPage} \newline
+Topics in algebraic number theory.
+%\menulink{Algebraic Geometry}{AlgebraicGeometryPage} \newline
+%Computational algebraic geometry: Groebner bases, integral bases,
+%divisors on curves.
+\menulink{Group Theory}{GroupTheoryPage} \newline
+Permutation groups; representation theory.
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\subsection{Number Theory}
+\label{NumberTheoryPage}
+\begin{itemize}
+\item ugProblemGaloisPage \ref{ugProblemGaloisPage} on
+page~pageref{ugProblemGaloisPage}
+\item IntegerNumberTheoryFunctionsXmpPage 
+\ref{IntegerNumberTheoryFunctionsXmpPage} on
+page~pageref{IntegerNumberTheoryFunctionsXmpPage}
+\end{itemize}
+\index{pages!NumberTheoryPage!algebra.ht}
+\index{algebra.ht!pages!NumberTheoryPage}
+\index{NumberTheoryPage!algebra.ht!pages}
+<<algebra.ht>>=
+\begin{page}{NumberTheoryPage}{Number Theory}
+\beginscroll
+Here are some sample computations using Axiom's algebraic number
+facilities.
+\beginmenu
+\menulink{Galois Groups}{ugProblemGaloisPage} \newline
+Computation of Galois groups using factorizations over number fields.
+\menulink{Number Theory Functions}{IntegerNumberTheoryFunctionsXmpPage}\newline
+Some functions of interest to number theorists.
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{alist.ht}
+<<alist.ht>>=
+\newcommand{\AssociationListXmpTitle}{AssociationList}
+\newcommand{\AssociationListXmpNumber}{9.1}
+
+@
+\subsection{AssociationList}
+\label{AssociationListXmpPage}
+\begin{itemize}
+\item TableXmpPage \ref{TableXmpPage} on page~\pageref{TableXmpPage}
+\item ListXmpPage \ref{ListXmpPage} on page~\pageref{ListXmpPage}
+\end{itemize}
+\index{pages!AssociationListXmpPage!alist.ht}
+\index{alist.ht!pages!AssociationListXmpPage}
+\index{AssociationListXmpPage!alist.ht!pages}
+<<alist.ht>>=
+\begin{page}{AssociationListXmpPage}{AssociationList}
+\beginscroll
+
+The \spadtype{AssociationList} constructor provides a general structure for
+associative storage.
+This type provides association lists in which data objects can be saved
+according to keys of any type.
+For a given association list, specific types must be chosen for the keys and
+entries.
+You can think of the representation of an association list as a list
+of records with key and entry fields.
+
+Association lists are a form of table and so most of the operations available
+for \spadtype{Table} are also available for \spadtype{AssociationList}.
+They can also be viewed as lists and can be manipulated accordingly.
+
+\xtc{
+This is a \pspadtype{Record} type with age and gender fields.
+}{
+\spadpaste{Data := Record(monthsOld : Integer, gender : String) \bound{Data}}
+}
+\xtc{
+In this expression, \spad{al} is declared to be an association
+list whose keys are strings and whose entries are the above records.
+}{
+\spadpaste{al : AssociationList(String,Data) \free{Data}\bound{al}}
+}
+\xtc{
+The \spadfunFrom{table}{AssociationList} operation is used to create
+an empty association list.
+}{
+\spadpaste{al := table() \free{al}\bound{al1}}
+}
+\xtc{
+You can use assignment syntax to add things to the association list.
+}{
+\spadpaste{al."bob" := [407,"male"]\$Data \free{al1}\bound{al2}}
+}
+\xtc{
+}{
+\spadpaste{al."judith" := [366,"female"]\$Data \free{al2}\bound{al3}}
+}
+\xtc{
+}{
+\spadpaste{al."katie" := [24,"female"]\$Data \free{al3}\bound{al4}}
+}
+\xtc{
+Perhaps we should have included a species field.
+}{
+\spadpaste{al."smokie" := [200,"female"]\$Data \free{al4}\bound{al5}}
+}
+\xtc{
+Now look at what is in the association list.
+Note that the last-added (key, entry) pair is at the beginning of the list.
+}{
+\spadpaste{al \free{al5}}
+}
+\xtc{
+You can reset the entry for an existing key.
+}{
+\spadpaste{al."katie" := [23,"female"]\$Data \free{al5}\bound{al6}}
+}
+\xtc{
+Use \spadfunFromX{delete}{AssociationList} to destructively remove
+an element of the association list.
+Use \spadfunFrom{delete}{AssociationList} to return a copy of the
+association list with the element deleted.
+The second argument is the index of the element to delete.
+}{
+\spadpaste{delete!(al,1) \free{al6}\bound{al7}}
+}
+
+For more information about tables, see \downlink{`Table'}{TableXmpPage}\ignore{Table}.
+For more information about lists, see \downlink{`List'}{ListXmpPage}\ignore{List}.
+\showBlurb{AssociationList}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{annaex.ht}
+\subsection{AXIOM/NAG Expert System}
+\label{UXANNA}
+\index{pages!UXANNA!annaex.ht}
+\index{annaex.ht!pages!UXANNA}
+\index{UXANNA!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNA}{AXIOM/NAG Expert System}
+\centerline{\tt{\inputbitmap{\htbmdir{}/anna_logo.xbm}}\rm}
+\newline
+\centerline{This expert system chooses, and uses, NAG numerical routines.}
+\begin{scroll}
+\blankline
+\indent{2}
+\beginmenu
+\menumemolink{Integration}{UXANNAInt}
+\blankline
+\menumemolink{Ordinary Differential Equations}{UXANNAOde}
+\blankline
+\menumemolink{Partial Differential Equations}{UXANNAPde}
+\blankline
+\menumemolink{Optimization}{UXANNAOpt}
+\vspace{10}
+\menumemolink{About the AXIOM/NAG Expert System}{UXANNATxt}
+%\unixcommand{(Postscript)}{ghostview \ \htbmdir{}/anna.ps}
+%\blankline
+%\menumemolink{How to use the NAGLINK}{nagLinkIntroPage}
+%\blankline
+%\menumemolink{Tutorial}{tutorialIntroPage}
+%\blankline
+%\item \menulispdownlink{Interpolation}{(|interp1|}
+\endmenu
+\indent{0}
+\end{scroll}
+%\unixcommand{Netscape}{netscape \ http:\/\/www.bath.ac.uk\/\~masbjd\/anna.html}
+\autobutt{HelpContents}
+\end{page}
+
+@
+\subsection{Integration}
+\label{UXANNAInt}
+\index{pages!UXANNAInt!annaex.ht}
+\index{annaex.ht!pages!UXANNAInt}
+\index{UXANNAInt!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAInt}{Integration}
+Welcome to the Integration section of {\tt
+\inputbitmap{\htbmdir{}/anna.xbm.tiny}}, the {\em AXIOM/NAG Expert
+System}.  This system chooses, and uses, NAG numerical routines.
+\begin{scroll}
+\blankline
+\indent{2}
+\beginmenu
+\item \menulispdownlink{Integration}{(|annaInt|)}\space{}\newline
+\indent{5} Integrating a function over a finite or infinite range.
+\blankline
+\item \menulispdownlink{Multiple Integration}{(|annaMInt|)}\space{}\newline
+\indent{5} Integrating a multivariate function over a finite space.  
+The dimensions of the space need to be 2 <= n <= 15.
+\blankline
+\menudownlink{Examples}{UXANNAIntEx}\space{}\newline
+\indent{5} Examples of integration.  These examples cover all of the major 
+methods.  Parameters can be changed to investigate the effect 
+on the choice of method.
+\endmenu
+\indent{0}
+\end{scroll}
+\autobutt{MainHelp}
+\end{page}
+
+@
+\subsection{Ordinary Differential Equations}
+\label{UXANNAOde}
+\index{pages!UXANNAOde!annaex.ht}
+\index{annaex.ht!pages!UXANNAOde}
+\index{UXANNAOde!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAOde}{Ordinary Differential Equations}
+Welcome to the Ordinary Differential Equations section of {\tt
+\inputbitmap{\htbmdir{}/anna.xbm.tiny}}, the 
+{\em AXIOM/NAG Expert System}.  
+This system chooses, and uses, NAG numerical routines.
+\begin{scroll}
+\blankline
+\blankline
+\indent{2}
+\beginmenu
+\item \menulispdownlink{Ordinary Differential Equations}{(|annaOde|)}\space{}\newline
+\indent{5} Finding a solution to an Initial Value Problem of a set of Ordinary Differential Equations.
+\blankline
+\menudownlink{Examples}{UXANNAOdeEx}\newline
+\indent{5} Examples of ODE problems with various features using both stiff
+and non-stiff methods.  Parameters can be changed to investigate the effect 
+on the choice of method.
+\autobutt{MainHelp}
+\endmenu
+\indent{0}
+\end{scroll}
+\end{page}
+
+@
+\subsection{Optimization}
+\label{UXANNAOpt}
+\index{pages!UXANNAOpt!annaex.ht}
+\index{annaex.ht!pages!UXANNAOpt}
+\index{UXANNAOpt!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAOpt}{Optimization}
+Welcome to the Optimization section of {\tt
+\inputbitmap{\htbmdir{}/anna.xbm.tiny}}, the {\em AXIOM/NAG Expert System}.  
+This system chooses, and uses, NAG numerical routines.
+\begin{scroll}
+\blankline
+\indent{2}
+\beginmenu
+\item \menulispdownlink{Optimization of a Single Multivariate Function}
+{(|annaOpt|)}\space{}\newline
+\indent{6} Finding the minimum of a function in n variables. 
+\newline
+\indent{6} Linear Programming and Quadratic Programming problems.
+\blankline
+\indent{4} 
+\beginmenu
+\menudownlink{Examples}{UXANNAOptEx}\newline
+\indent{8} Examples of optimization problems with various constraint features.
+\endmenu
+\blankline
+\item \menulispdownlink{Optimization of a set of observations of a data set}
+{(|annaOpt2|)}\space{}\newline
+\indent{6} Least-squares problems.
+\newline
+\indent{6} Checking the goodness of fit of a least-squares model.
+\blankline
+\indent{4} 
+\beginmenu
+\menudownlink{Examples}{UXANNAOpt2Ex}\newline
+\indent{8} Examples of least squares problems.
+\endmenu
+\endmenu
+\indent{0}
+\end{scroll}
+\autobutt{MainHelp}
+\end{page}
+
+@
+\subsection{Partial Differential Equations}
+\label{UXANNAPde}
+\index{pages!UXANNAPde!annaex.ht}
+\index{annaex.ht!pages!UXANNAPde}
+\index{UXANNAPde!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAPde}{Partial Differential Equations}
+Welcome to the Partial Differential Equations section of {\tt
+\inputbitmap{\htbmdir{}/anna.xbm.tiny}}, the
+{\em AXIOM/NAG Expert System}.  
+\begin{scroll}
+\indent{2}
+\beginmenu
+\menulispdownlink{Second Order Elliptic Partial Differential Equation}{(|annaPDESolve|)}
+\newline
+\indent{4} Discretizing the PDE:
+\newline
+\centerline{\inputbitmap{\htbmdir{}/d03eef.xbm}}
+defined on a rectangular region with boundary conditions of the form 
+\centerline{\inputbitmap{\htbmdir{}/d03eef1.bitmap}} 
+and solving the resulting
+seven-diagonal finite difference equations using a multigrid technique.
+\blankline
+%\menulispdownlink{Helmholtz Equation in 3-D, Cartesian Coordinates}{(|d03fafVars|)}
+%\newline
+%\indent{4} Descretizing the PDE:
+%\newline
+%\centerline{\inputbitmap{\htbmdir{}/d03faf.xbm}}
+%and solving the resulting
+%seven-diagonal finite difference equations using a method based on the Fast
+%Fourier Transform.
+\endmenu
+\end{scroll}
+\autobutt{MainHelp}
+\end{page}
+
+@
+\subsection{Examples Using the AXIOM/NAG Expert System}
+\label{UXANNAOptEx}
+\index{pages!UXANNAOptEx!annaex.ht}
+\index{annaex.ht!pages!UXANNAOptEx}
+\index{UXANNAOptEx!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAOptEx}{Examples Using the AXIOM/NAG Expert System}
+\begin{scroll}
+Select any of these examples and you will be presented with a page which
+contains active areas for the function and its parameters.
+\blankline
+These parameters can be altered by selecting the area and replacing the
+default parameters by the new values. 
+\blankline
+\beginmenu
+\item \menulispdownlink{Example 1: \newline 
+\indent{2} Minimize the function: 
+\centerline{\inputbitmap{\htbmdir{}/opt1.xbm}}}{(|annaOptDefaultSolve1|)}\space{}
+\blankline
+\item \menulispdownlink{Example 2: \newline 
+\indent{2} Minimize the function: 
+\centerline{\inputbitmap{\htbmdir{}/opt2.xbm}}}{(|annaOptDefaultSolve2|)}\space{}
+\newline \indent{3} With conditions: 
+\centerline{\inputbitmap{\htbmdir{}/opt2c.xbm}}
+\blankline
+\item \menulispdownlink{Example 3: \newline 
+\indent{2} Minimize the function: 
+\centerline{\inputbitmap{\htbmdir{}/opt3.xbm}}}{(|annaOptDefaultSolve3|)}\space{}
+\newline \indent{3} With conditions: 
+\centerline{\inputbitmap{\htbmdir{}/opt3c1.xbm}}
+\centerline{\inputbitmap{\htbmdir{}/opt3c2.xbm}}
+\blankline
+\item \menulispdownlink{Example 4: \newline 
+\indent{2} Minimize the function: 
+\centerline{\inputbitmap{\htbmdir{}/opt4.xbm}}
+}{(|annaOptDefaultSolve4|)}\space{}
+\newline \indent{3} With conditions: 
+\centerline{\inputbitmap{\htbmdir{}/opt4c1.xbm}}
+\centerline{\inputbitmap{\htbmdir{}/opt4c2.xbm}}
+\centerline{\inputbitmap{\htbmdir{}/opt4c3.xbm}}
+\blankline
+\item \menulispdownlink{Example 5: \newline 
+\indent{2} Minimize the function: 
+\centerline{\inputbitmap{\htbmdir{}/opt5.xbm}}
+}{(|annaOptDefaultSolve5|)}\space{}
+\newline \indent{3} With conditions: 
+\centerline{\inputbitmap{\htbmdir{}/opt4c1.xbm}}
+\centerline{\inputbitmap{\htbmdir{}/opt4c2.xbm}}
+\centerline{\inputbitmap{\htbmdir{}/opt4c3.xbm}}
+\blankline
+\endmenu
+\end{scroll}
+\autobutt{Mainhelp}
+\end{page}
+
+@
+\subsection{Examples Using the AXIOM/NAG Expert System}
+\label{UXANNAOpt2Ex}
+\index{pages!UXANNAOpt2Ex!annaex.ht}
+\index{annaex.ht!pages!UXANNAOpt2Ex}
+\index{UXANNAOpt2Ex!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAOpt2Ex}{Examples Using the AXIOM/NAG Expert System}
+\begin{scroll}
+Select this example and you will be presented with a page which
+contains active areas for the function and its parameters.
+\blankline
+These parameters can be altered by selecting the area and replacing the
+default parameters by the new values. 
+\blankline
+\beginmenu
+\blankline
+\item \menulispdownlink{Example 1: \newline 
+\indent{2} Calculate a least-squares minimization of the following functions: 
+\centerline{\inputbitmap{\htbmdir{}/opt61.xbm}}
+\centerline{\inputbitmap{\htbmdir{}/opt62.xbm}}
+\centerline{\inputbitmap{\htbmdir{}/opt63.xbm}}}
+{(|annaOpt2DefaultSolve|)}\space{}
+\endmenu
+\end{scroll}
+\autobutt{MainHelp}
+\end{page}
+
+
+@
+\subsection{Examples Using the AXIOM/NAG Expert System}
+\label{UXANNAIntEx}
+\index{pages!UXANNAIntEx!annaex.ht}
+\index{annaex.ht!pages!UXANNAIntEx}
+\index{UXANNAIntEx!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAIntEx}{Examples Using the AXIOM/NAG Expert System}
+\begin{scroll}
+Select any of these examples and you will be presented with a page which
+contains active areas for the function and its parameters.
+\blankline
+These parameters can be altered by selecting the area and replacing the
+default parameters by the new values.  In this way you can investigate the
+effect of the new parameters on the choice of method.
+\blankline
+\beginmenu
+\item \menulispdownlink{Example 1: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int1.xbm}}}{(|annaFoo|)}\space{}
+\blankline
+\item \menulispdownlink{Example 2: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int2.xbm}}}{(|annaBar|)}\space{}
+\blankline
+\item \menulispdownlink{Example 3: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int3.xbm}}}{(|annaJoe|)}\space{}
+\blankline
+\item \menulispdownlink{Example 4: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int4.xbm}}}{(|annaSue|)}\space{}
+\blankline
+\item \menulispdownlink{Example 5: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int5.xbm}}}{(|annaAnn|)}\space{}
+\blankline
+\item \menulispdownlink{Example 6: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int6.xbm}}}{(|annaBab|)}\space{}
+\blankline
+\item \menulispdownlink{Example 7: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int7.xbm}}}{(|annaFnar|)}\space{}
+\blankline
+\item \menulispdownlink{Example 8: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int8.xbm}}}{(|annaDan|)}\space{}
+\blankline
+\item \menulispdownlink{Example 9: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int9.xbm}}}{(|annaBlah|)}\space{}
+\blankline
+\item \menulispdownlink{Example 10: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int10.xbm}}}{(|annaTub|)}\space{}
+\blankline
+\item \menulispdownlink{Example 11: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int13.xbm}}}{(|annaRats|)}\space{}
+\blankline
+\item \menulispdownlink{Example 12: \newline 
+\centerline{\inputbitmap{\htbmdir{}/int11.xbm}}}{(|annaMInt|)}\space{}
+\endmenu
+\end{scroll}
+\autobutt{MainHelp}
+\end{page}
+
+@
+\subsection{Examples Using the AXIOM/NAG Expert System}
+\label{UXANNAOdeEx}
+\index{pages!UXANNAOdeEx!annaex.ht}
+\index{annaex.ht!pages!UXANNAOdeEx}
+\index{UXANNAOdeEx!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAOdeEx}{Examples Using the AXIOM/NAG Expert System}
+\begin{scroll}
+Analyses the function for various attributes, chooses and 
+then uses a suitable ODE solver to provide a 
+solution to the system of n ODEs \center{\htbitmap{d02gaf},}
+for i = 1,2,...,n.
+\blankline
+Select either of these examples and you will be presented with a page which
+contains active areas for the function and its parameters.
+\blankline
+These parameters can be altered by selecting the area and replacing the
+default parameters by the new values.  In this way you can investigate the
+effect of the new parameters on the choice of method.
+\blankline
+\beginmenu
+\item \menulispdownlink{Example 1: \tab{12}
+\inputbitmap{\htbmdir{}/ode1.xbm}}{(|annaOdeDefaultSolve1|)}
+\blankline with initial conditions: \newline
+\tab{12}\inputbitmap{\htbmdir{}/y1.xbm} \space{1} and \space{1}
+\inputbitmap{\htbmdir{}/x1.xbm}
+\blankline
+\blankline
+\blankline
+\item \menulispdownlink{Example 2: \tab{12}
+\inputbitmap{\htbmdir{}/ode2.xbm}}{(|annaOdeDefaultSolve2|)}
+\blankline with initial conditions: \newline
+\tab{12}\inputbitmap{\htbmdir{}/y2.xbm} \space{1} and \space{1}
+\inputbitmap{\htbmdir{}/x1.xbm}
+\blankline
+\blankline
+\blankline
+\endmenu
+\end{scroll}
+\autobutt{MainHelp}
+\end{page}
+
+@
+\subsection{About the AXIOM/NAG Expert System}
+\label{UXANNATxt}
+\begin{itemize}
+\item UXANNAEx \ref{UXANNAEx} on page~\pageref{UXANNAEx}
+\item UXANNAIntro \ref{UXANNAIntro} on page~\pageref{UXANNAIntro}
+\item UXANNADec \ref{UXANNADec} on page~\pageref{UXANNADec}
+\item UXANNAInfer \ref{UXANNAInfer} on page~\pageref{UXANNAInfer}
+\item UXANNAMeas \ref{UXANNAMeas} on page~\pageref{UXANNAMeas}
+\end{itemize}
+\index{pages!UXANNATxt!annaex.ht}
+\index{annaex.ht!pages!UXANNATxt}
+\index{UXANNATxt!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNATxt}{About the AXIOM/NAG Expert System}
+\begin{scroll}
+\centerline{\tt\inputbitmap{\htbmdir{}/anna_logo.xbm}\rm} 
+\vspace{-30}\horizontalline
+In applied mathematics, electronic and chemical engineering, the modelling
+process can produce a number of mathematical problems which require numerical
+solutions for which symbolic methods are either not possible or not obvious. 
+With the plethora of numerical library routines for the solution of these
+problems often the numerical analyst has to answer the question {\em Which
+routine to choose?} 
+\blankline
+Some analysis needs to be carried out before the
+appropriate routine can be identified i.e. {\em How stiff is this ODE?} and
+{\em Is this function continuous?}  It may well be the case that more than
+one routine is applicable to the problem.  So the question may become {\em
+Which is likely to be the best?}  Such a choice may be critical for both
+accuracy and efficiency.
+\blankline
+An expert system is thus required to make this choice based on the result of
+its own analysis of the problem, call the routine and act on the outcome. 
+This may be to put the answer in a relevant form or react to an apparent
+failure of the chosen routine and thus choose and call an alternative.  
+It should also have sufficient explanation mechanisms to inform on the choice
+of routine and the reasons for that choice.
+\blankline
+\end{scroll}
+\downlink{ Examples }{UXANNAEx}
+\downlink{ Introduction }{UXANNAIntro}
+\downlink{ Decision Agents }{UXANNADec}
+\downlink{ Inference Mechanisms }{UXANNAInfer}
+\downlink{ Measure Functions }{UXANNAMeas}
+\end{page}
+
+@
+\subsection{Introduction to the AXIOM/NAG Expert System}
+\label{UXANNAIntro}
+\begin{itemize}
+\item UXANNADec \ref{UXANNADec} on page~\pageref{UXANNADec}
+\item UXANNAInfer \ref{UXANNAInfer} on page~\pageref{UXANNAInfer}
+\item UXANNAMeth \ref{UXANNAMeth} on page~\pageref{UXANNAMeth}
+\item UXANNAMeas \ref{UXANNAMeas} on page~\pageref{UXANNAMeas}
+\end{itemize}
+\index{pages!UXANNAIntro!annaex.ht}
+\index{annaex.ht!pages!UXANNAIntro}
+\index{UXANNAIntro!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAIntro}{Introduction to the AXIOM/NAG Expert System}
+\begin{scroll}
+\centerline{\tt\inputbitmap{\htbmdir{}/anna_logo.xbm}\rm}
+\vspace{-30}\horizontalline
+Deciding amongst, and then implementing, several possible approaches to
+solving a numerical problem can be daunting for a novice user, or tedious for
+an expert.  Different attributes of the problem need to be
+identified and their possible interactions weighed up before a final decision
+about which method to use can be made. 
+\blankline
+The implementation is then largely an
+automatic, if laborious, process of writing, compiling and linking usually
+Fortran code.  The aim is to build an expert system which will use computer
+algebra to analyse such features of a problem, inference mechanisms and a
+knowledge base to choose a numerical method appropriate to the solution of a
+given problem.  
+\blankline
+Any interactive system is constrained by the need to provide a reasonable
+response time for the user.  Given the complexity of some of the analysis our
+system will need to do, it is clear that we should only aim to select a good
+method, rather than try to identify the best one available.  The overall goal
+is to provide a ``black-box'' interface to numerical software which allows
+non-experts access to its full potential.  It will also provide explanation
+mechanisms commensurate with its role as a teaching aid.
+\blankline
+Given, say, an integration to perform (which may or may not be able to be
+handled symbolically), the system should choose and apply an appropriate
+method, thus mirroring as closely as possible the way that an experienced
+numerical analyst would think so, for example, given an integration to
+perform:\newline
+{\it \centerline{\inputbitmap{\htbmdir{}/int1.xbm}}}
+\newline
+the experienced analyst would see that the integral is semi-infinite and
+transform it by splitting the range and transforming the integral over {\it
+[1,\inputbitmap{\htbmdir{}/infty.xbm}]} into an integral over 
+{\it [0,1] } using the transformation {\it x -> 1/t}.  
+A different numerical routine might be used over each
+sub-region and the results added to give the final answer. 
+\blankline
+It then requires
+the translation of the problem into Fortran code which may be extensive.
+Even with this simple example, the process is quite involved.
+\blankline
+\end{scroll}
+\autobuttons
+\downlink{ Decision Agents }{UXANNADec}
+\downlink{ Inference Mechanisms }{UXANNAInfer}
+\downlink{ Method Domains }{UXANNAMeth}
+\downlink{ Measure Functions }{UXANNAMeas}
+\end{page}
+
+@
+\subsection{Example using the AXIOM/NAG Expert System}
+\label{UXANNAEx}
+See UXANNAEx2 \ref{UXANNAEx2} on page~\pageref{UXANNAEx2}
+\index{pages!UXANNAEx!annaex.ht}
+\index{annaex.ht!pages!UXANNAEx}
+\index{UXANNAEx!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAEx}{Example using the AXIOM/NAG Expert System}
+\begin{scroll}
+\xtc{
+{\bf Example 1}: The integral
+{\centerline{\inputbitmap{\htbmdir{}/int1.xbm}}}
+\newline
+is performed as follows:
+\blankline
+}{}
+\xtc{
+}{
+\spadpaste{ans := integrate((exp(-X^3)+exp(-3*X^2))/sqrt(X),0.0..\%plusInfinity)\bound{ans} }
+}
+\blankline
+\xtc{
+It creates a composite structure for which the field containing the result can be 
+expanded as required.\blankline
+}{
+\spadpaste{ans . 'result\free{ans}}
+}
+\blankline
+\xtc{
+}{
+\spadpaste{ans . 'abserr\free{ans}}
+}
+\blankline
+This system has performed the analysis described above, done the necessary
+problem transformation, written any necessary Fortran, called two different
+numerical routines, and amalgamated their
+results.  This whole process was transparent to the user.
+\end{scroll}
+\autobuttons
+\downlink{Example 2}{UXANNAEx2}
+%\downlink{Decision Agents}{UXANNADec}
+\end{page}
+
+@
+\subsection{Example using the AXIOM/NAG Expert System}
+\label{UXANNAEx2}
+See UXANNAEx3 \ref{UXANNAEx3} on page~\pageref{UXANNAEx3}
+\index{pages!UXANNAEx2!annaex.ht}
+\index{annaex.ht!pages!UXANNAEx2}
+\index{UXANNAEx2!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAEx2}{Example using the AXIOM/NAG Expert System}
+\begin{scroll}
+\xtc{
+{\bf Example 2}: The ODE
+{\centerline{\inputbitmap{\htbmdir{}/ode3.xbm}\space{1}with
+\space{1}
+{\inputbitmap{\htbmdir{}/y3.xbm}}}}
+\newline
+could be solved as follows:
+\blankline
+}{}
+\xtc{
+}{
+\spadpaste{ans2 := solve([Y[2],-1001*Y[2]-1000*Y[1]], 0.0, 10.0,
+[1.0,-1.0], [2,4,6,8], 1.0e-4)\bound{ans2} }
+}
+\blankline
+\xtc{
+It creates a composite structure for which the field containing the result can be 
+expanded as required.\blankline
+}{
+\spadpaste{ans2 . 'result\free{ans2}}
+}
+\blankline
+\xtc{
+}{
+\spadpaste{ans2 . 'y\free{ans2}}
+}
+\blankline
+\end{scroll}
+\autobuttons
+\downlink{Example 3}{UXANNAEx3}
+%\downlink{Decision Agents}{UXANNADec}
+\end{page}
+
+@
+\subsection{Example using the AXIOM/NAG Expert System}
+\label{UXANNAEx3}
+See UXANNADec \ref{UXANNADec} on page~\pageref{UXANNADec}
+\index{pages!UXANNAEx3!annaex.ht}
+\index{annaex.ht!pages!UXANNAEx3}
+\index{UXANNAEx3!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAEx3}{Example using the AXIOM/NAG Expert System}
+\begin{scroll}
+\xtc{
+{\bf Example 3}: The function
+{\centerline{\inputbitmap{\htbmdir{}/opt2.xbm}}}
+with simple bounds
+{\centerline{\inputbitmap{\htbmdir{}/opt2c.xbm}}}
+\newline
+could be minimized as follows:
+\blankline
+}{}
+\xtc{
+}{
+\spadpaste{ans3 := optimize((X[1]+10*X[2])**2 + 5*(X[3]-X[4])**2 + 
+(X[2]-2*X[3])**4 + 10*(X[1]-X[4])**4, [3,-1,0,1], [1,-2,\%minusInfinity,1], 
+[3,0,\%plusInfinity,3])\bound{ans3} }
+}
+\blankline
+\xtc{
+It creates a composite structure for which the field containing the minimum can be 
+expanded as required.\blankline
+}{
+\spadpaste{ans3 . objf\free{ans3}}
+}
+\blankline
+\xtc{
+}{
+\spadpaste{ans3 . x\free{ans3}}
+}
+\blankline
+\xtc{
+}{
+\spadpaste{ans3 . attributes\free{ans3}}
+}
+\blankline
+\end{scroll}
+\autobuttons
+\downlink{Decision Agents}{UXANNADec}
+\end{page}
+
+@
+\subsection{Decision Agents}
+\label{UXANNADec}
+\begin{itemize}
+\item UXANNAInfer \ref{UXANNAInfer} on page~\pageref{UXANNAInfer}
+\item UXANNAMeth \ref{UXANNAMeth} on page~\pageref{UXANNAMeth}
+\item UXANNAMeas \ref{UXANNAMeas} on page~\pageref{UXANNAMeas}
+\item UXANNAAgent \ref{UXANNAAgent} on page~\pageref{UXANNAAgent}
+\end{itemize}
+\index{pages!UXANNADec!annaex.ht}
+\index{annaex.ht!pages!UXANNADec}
+\index{UXANNADec!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNADec}{Decision Agents}
+\begin{scroll}
+\blankline
+Some features are either present or absent in a problem.  Examples of such
+binary decisions include {\em is a matrix symmetric?} and {\em is a
+function continuous?}  However in practice many questions are about the {\em
+degree} to which a problem exhibits a property: {\em how much does a
+function oscillate?}, or {\em how stiff are these differential equations?}
+\blankline
+We have therefore created decision agents of two types, reflecting their
+property --- {\em Binary Agents} are Boolean functions returning either true
+or false and {\em Intensity Functions} are quantitative and return a range of
+different values, either numerical or structured types. The framework we are
+developing is able to deal with both these forms of information.  
+\blankline
+
+In any given problem area (for example solving ordinary differential
+equations, optimization etc.) we have a selection of {\em methods}.  These
+might be to use a particular NAG routine, or they might involve employing a
+higher-level strategy such as transforming the problem into an equivalent,
+but easier to solve, form.  
+\blankline
+Associated with every method we define a {\em
+measure function} which assesses the suitability of that method to a
+particular problem.  Each measure function has access to a range of symbolic
+{\em agents} which can answer questions about the various properties of the
+problem in hand.
+\blankline
+\end{scroll}
+\downlink{ Inference Mechanisms }{UXANNAInfer}
+\downlink{ Method Domains }{UXANNAMeth}
+\downlink{ Measure Functions }{UXANNAMeas}
+\downlink{ Computational Agents }{UXANNAAgent}
+
+\end{page}
+
+@
+\subsection{Inference Mechanisms}
+\label{UXANNAInfer}
+\begin{itemize}
+\item UXANNAMeth \ref{UXANNAMeth} on page~\pageref{UXANNAMeth}
+\item UXANNAMeas \ref{UXANNAMeas} on page~\pageref{UXANNAMeas}
+\item UXANNAAgent \ref{UXANNAAgent} on page~\pageref{UXANNAAgent}
+\item UXANNAEx \ref{UXANNAEx} on page~\pageref{UXANNAEx}
+\end{itemize}
+\index{pages!UXANNAInfer!annaex.ht}
+\index{annaex.ht!pages!UXANNAInfer}
+\index{UXANNAInfer!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAInfer}{Inference Mechanisms}
+\begin{scroll}
+\blankline
+The inference machine will take the problem description as provided by the
+user and perform an initial analysis to verify its validity.  It will
+consider, in turn, all of the available methods within its knowledge base
+which might solve that problem.  In doing so it analyses the input problem to
+find out about any attributes that could affect the ability of the methods
+under consideration to perform effectively.  
+\blankline
+Some of these
+measures may use lazy evaluation in the sense that, if a method already
+assessed is believed to be a good candidate, and if evaluating the current
+measure will be relatively expensive, then that measure will not be evaluated
+unless later evidence shows that the selected method is not, in fact, a
+successful strategy, for example if it has failed.
+\end{scroll}
+\downlink{ Method Domains }{UXANNAMeth}
+\downlink{ Measure Functions }{UXANNAMeas}
+\downlink{ Computational Agents }{UXANNAAgent}
+\downlink{ Examples }{UXANNAEx}
+\end{page}
+
+@
+\subsection{Method Domains}
+\label{UXANNAMeth}
+\begin{itemize}
+\item UXANNAMeas \ref{UXANNAMeas} on page~\pageref{UXANNAMeas}
+\item UXANNAAgent \ref{UXANNAAgent} on page~\pageref{UXANNAAgent}
+\item UXANNAEx \ref{UXANNAEx} on page~\pageref{UXANNAEx}
+\end{itemize}
+\index{pages!UXANNAMeth!annaex.ht}
+\index{annaex.ht!pages!UXANNAMeth}
+\index{UXANNAMeth!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAMeth}{Method Domains}
+\begin{scroll}
+\blankline
+An AXIOM {\em domain} has been created for each method or strategy for
+solving the problem.  These method domains each implement two functions with
+a uniform (method independant) interface.
+\blankline {\bf measure:} A function which calculates an estimate of suitability of
+this particular method to the problem if there is a possibility that the
+method under consideration is more appropriate than one already investigated.
+\blankline
+If it may be possible to improve on the current favourite method, the function
+will call computational agents to analyse the problem for specific features
+and calculate the measure from the results these agents return, 
+using a variation on the Lucks/Gladwell intensity and compatibility
+model if conflict between attributes, as investigated by these computational
+agents, may be present.
+\blankline
+{\bf implementation:} A function which may be one of two distinct kinds. 
+The first kind uses the interface to the NAG Library to call a particular 
+routine with the required parameters.  Some of the parameters may need to be
+calculated from the data provided before the external function call.  
+\blankline
+The other kind will apply a ``high level'' strategy to try to solve the
+problem e.g.~a transformation of an expression from one that is difficult to
+solve to one which is easier, or a splitting of the problem into several more
+easily solvable parts.  For example, for a solution of the equation above,
+since the integral is semi-infinite we might wish to transform the range by,
+say, using the mapping {\it y -> 1/x} on the section {\it 1
+< x < \inputbitmap{\htbmdir{}/infty.xbm}}) and
+adding the result to the unmapped section {\it 0 < x < 1}.
+\blankline
+\end{scroll}
+\downlink{ Measure Functions }{UXANNAMeas}
+\downlink{ Computational Agents }{UXANNAAgent}
+\downlink{ Examples }{UXANNAEx}
+\end{page}
+
+@
+\subsection{Measure Functions}
+\label{UXANNAMeas}
+\begin{itemize}
+\item UXANNAAgent \ref{UXANNAAgent} on page~\pageref{UXANNAAgent}
+\item UXANNAEx \ref{UXANNAEx} on page~\pageref{UXANNAEx}
+\end{itemize}
+\index{pages!UXANNAMeas!annaex.ht}
+\index{annaex.ht!pages!UXANNAMeas}
+\index{UXANNAMeas!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAMeas}{Measure Functions}
+\begin{scroll}
+\blankline
+Each measure function will estimate the ability of a particular method to
+solve a problem.  It will consult whichever agents are needed to perform
+analysis on the problem in order to calculate the measure.  There is a
+parameter which would contain the best compatibility
+value found so far.  
+\blankline
+However, the interpretation we give to the results of some tests is not
+always clear-cut.  If a set of tests give
+conflicting advice as to the appropriateness of a particular method, it
+becomes important to decide not only {\it whether} certain properties are
+present but also their {\it degree}.  This gives us a basis for estimating the
+compatibility of each property.  
+\blankline
+We have taken for our model the system recommended by Lucks and Gladwell
+which uses a system of measurement of compatibility allowing for interaction
+and conflict between a number of attributes.  All of these processes may not
+be required if the choice is clear-cut e.g. we have an integral to calculate
+which has a particular singularity structure for which one particular method
+has been specifically constructed.  However, for more difficult cases a
+composite picture should be built up to calculate a true measurement. 
+\blankline
+How the compatibility functions interpret the measurements of various
+attributes is up to them and may vary between differing methods.  It is this
+area that takes as its basis the {\it judgement} of Numerical Analysis
+`experts' whether that be from the documentation (which may be deficient in
+certain respects) or from alternative sources.  However, its assessment of
+the suitability or otherwise of a particular method is reflected in a single
+normalised value facilitating the direct comparison of the suitability of a
+number of possible methods.
+\blankline
+\end{scroll}
+\downlink{ Computational Agents }{UXANNAAgent}
+\downlink{ Examples }{UXANNAEx}
+\end{page}
+
+@
+\subsection{Computational Agents}
+\label{UXANNAAgent}
+See UXANNAEx \ref{UXANNAEx} on page~\pageref{UXANNAEx}
+\index{pages!UXANNAAgent!annaex.ht}
+\index{annaex.ht!pages!UXANNAAgent}
+\index{UXANNAAgent!annaex.ht!pages}
+<<annaex.ht>>=
+\begin{page}{UXANNAAgent}{Computational Agents}
+\begin{scroll}
+\blankline
+Computational Agents are those program segments which investigate the
+attributes of the input function or functions, such as 
+{\bf stiffnessAndStabilityOfODEIF}
+(the {\em IF} indicates that it is an {\em Intensity Function} i.e. one that
+returns a normalised real number or a set of normalised real numbers).  They
+are usually functions or programs written completely in the Axiom
+language and implemented using computer algebra.
+\blankline
+Some agents will be common to more than one problem domain whereas others
+will be specific to a single domain.  They also vary greatly in their
+complexity.  It is a fairly simple task to return details about the range of
+a function since this information will have been included in the problem
+specification.  It is a different order of complexity to return details of
+its singularity structure.
+\blankline
+\xtc{
+As an example, here is a call to the computational agent {\bf
+singularitiesOf} to obtain the list of singularities of the function 
+{\it tan x} which are in the range 
+{\it 0..12\inputbitmap{\htbmdir{}/pi.xbm}}:
+\blankline
+}{
+}
+\xtc{
+}{
+\spadpaste{s := singularitiesOf(tan x,[x],0..12*\%pi)$ESCONT \free{lib3} }
+}
+\blankline
+Each of these computational agents which may be called by a number of method
+domains retain their output in a dynamic hash-table, so speeding the process
+and retaining efficiency.
+\end{scroll}
+\downlink{ Examples }{UXANNAEx}
+\end{page}
+
+@
+\section{array1.ht}
+<<array1.ht>>=
+\newcommand{\OneDimensionalArrayXmpTitle}{OneDimensionalArray}
+\newcommand{\OneDimensionalArrayXmpNumber}{9.57}
+
+@
+\subsection{OneDimensionalArray}
+\label{OneDimensionalArrayXmpPage}
+\begin{itemize}
+\item VectorXmpPage \ref{VectorXmpPage} on
+page~pageref{VectorXmpPage}
+\item FlexibleArrayXmpPage \ref{FlexibleArrayXmpPage} on
+page~pageref{FlexibleArrayXmpPage}
+\end{itemize}
+\index{pages!OneDimensionalArrayXmpPage!array1.ht}
+\index{array1.ht!pages!OneDimensionalArrayXmpPage}
+\index{OneDimensionalArrayXmpPage!array1.ht!pages}
+<<array1.ht>>=
+\begin{page}{OneDimensionalArrayXmpPage}{OneDimensionalArray}
+\beginscroll
+The \spadtype{OneDimensionalArray} domain is used for storing data in a
+one-dimensional indexed data structure.
+Such an array is a homogeneous data structure in that all the entries of
+the array must belong to the same Axiom domain.
+Each array has a fixed length specified by the user and arrays are not
+extensible.
+The indexing of one-dimensional arrays is one-based.
+This means that the ``first'' element of an array is given the index
+\spad{1}.
+See also \downlink{`Vector'}{VectorXmpPage}\ignore{Vector} and 
+\downlink{`FlexibleArray'}{FlexibleArrayXmpPage}\ignore{FlexibleArray}.
+\xtc{
+To create a one-dimensional array, apply the
+operation \spadfun{oneDimensionalArray} to a list.
+}{
+\spadpaste{oneDimensionalArray [i**2 for i in 1..10]}
+}
+\xtc{
+Another approach is to first create \spad{a}, a one-dimensional 
+array of 10 \spad{0}'s.
+\spadtype{OneDimensionalArray} has the convenient abbreviation \spadtype{ARRAY1}.
+}{
+\spadpaste{a : ARRAY1 INT := new(10,0)\bound{a}}
+}
+\xtc{
+Set each \spad{i}th element to i, then display the result.
+}{
+\spadpaste{for i in 1..10 repeat a.i := i; a\bound{a1}\free{a}}
+}
+\xtc{
+Square each element by mapping the function
+\texht{$i \mapsto i^2$}{i +-> i**2} onto each element.
+}{
+\spadpaste{map!(i +-> i ** 2,a); a\bound{a3}\free{a2}}
+}
+\xtc{
+Reverse the elements in place.
+}{
+\spadpaste{reverse! a\bound{a4}\free{a3}}
+}
+\xtc{
+Swap the \spad{4}th and \spad{5}th element.
+}{
+\spadpaste{swap!(a,4,5); a\bound{a5}\free{a4}}
+}
+\xtc{
+Sort the elements in place.
+}{
+\spadpaste{sort! a \bound{a6}\free{a5}}
+}
+\xtc{
+Create a new one-dimensional array \spad{b} containing the last 5 elements of \spad{a}.
+}{
+\spadpaste{b := a(6..10)\bound{b}\free{a6}}
+}
+\xtc{
+Replace the first 5 elements of \spad{a} with those of \spad{b}.
+}{
+\spadpaste{copyInto!(a,b,1)\free{b}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{array2.ht}
+<<array2.ht>>=
+\newcommand{\TwoDimensionalArrayXmpTitle}{TwoDimensionalArray}
+\newcommand{\TwoDimensionalArrayXmpNumber}{9.82}
+
+@
+\subsection{TwoDimensionalArray}
+\label{TwoDimensionalArrayXmpPage}
+\begin{itemize}
+\item ugTypesAnyNonePage \ref{ugTypesAnyNonePage} on
+page~pageref{ugTypesAnyNonePage}
+\item MatrixXmpPage \ref{MatrixXmpPage} on
+page~pageref{MatrixXmpPage}
+\item OneDimensionalArrayXmpPage \ref{OneDimensionalArrayXmpPage} on
+page~pageref{OneDimensionalArrayXmpPage}
+\end{itemize}
+\index{pages!TwoDimensionalArrayXmpPage!array2.ht}
+\index{array2.ht!pages!TwoDimensionalArrayXmpPage}
+\index{TwoDimensionalArrayXmpPage!array2.ht!pages}
+<<array2.ht>>=
+\begin{page}{TwoDimensionalArrayXmpPage}{TwoDimensionalArray}
+\beginscroll
+
+The \spadtype{TwoDimensionalArray} domain is used for storing data in a
+\twodim{} data structure indexed by row and by column.
+Such an array is a homogeneous data structure in that all the entries of
+the array must belong to the same Axiom domain (although see
+\downlink{``\ugTypesAnyNoneTitle''}{ugTypesAnyNonePage} in 
+Section \ugTypesAnyNoneNumber\ignore{ugTypesAnyNone}).
+Each array has a fixed number of rows and columns specified by the user
+and arrays are not extensible.
+In Axiom, the indexing of two-dimensional arrays is one-based.
+This means that both the ``first'' row of an array and the ``first''
+column of an array are given the index \spad{1}.
+Thus, the entry in the upper left corner of an array is in position
+\spad{(1,1)}.
+
+
+The operation \spadfunFrom{new}{TwoDimensionalArray} creates
+an array with a specified number of rows and columns and fills the components
+of that array with a specified entry.
+The arguments of this operation specify the number of rows, the number
+of columns, and the entry.
+\xtc{
+This creates a five-by-four array of integers, all of whose entries are
+zero.
+}{
+\spadpaste{arr : ARRAY2 INT := new(5,4,0) \bound{arr}}
+}
+The entries of this array can be set to other integers using
+the operation \spadfunFrom{setelt}{TwoDimensionalArray}.
+
+\xtc{
+Issue this to set the element in the upper left corner of this array to
+\spad{17}.
+}{
+\spadpaste{setelt(arr,1,1,17) \free{arr}\bound{arr1}}
+}
+\xtc{
+Now the first element of the array is \spad{17.}
+}{
+\spadpaste{arr \free{arr1}}
+}
+\xtc{
+Likewise, elements of an array are extracted using the operation
+\spadfunFrom{elt}{TwoDimensionalArray}.
+}{
+\spadpaste{elt(arr,1,1) \free{arr1}}
+}
+\xtc{
+Another way to use these two operations is as follows.
+This sets the element in position \spad{(3,2)} of the array to \spad{15}.
+}{
+\spadpaste{arr(3,2) := 15 \free{arr1}\bound{arr2}}
+}
+\xtc{
+This extracts the element in position \spad{(3,2)} of the array.
+}{
+\spadpaste{arr(3,2) \free{arr2}}
+}
+The operations \spadfunFrom{elt}{TwoDimensionalArray} and
+\spadfunFrom{setelt}{TwoDimensionalArray} come equipped with an error
+check which verifies that the indices are in the proper ranges.
+For example, the above array has five rows and four columns, so if you ask
+for the entry in position \spad{(6,2)} with \spad{arr(6,2)} Axiom
+displays an error message.
+If there is no need for an error check, you can call the operations
+\spadfunFrom{qelt}{TwoDimensionalArray} and
+\spadfunFromX{qsetelt}{TwoDimensionalArray} which provide the same
+functionality but without the error check.
+Typically, these operations are called in well-tested programs.
+
+\xtc{
+The operations \spadfunFrom{row}{TwoDimensionalArray} and
+\spadfunFrom{column}{TwoDimensionalArray} extract rows and columns,
+respectively, and return objects of \spadtype{OneDimensionalArray} with
+the same underlying element type.
+}{
+\spadpaste{row(arr,1) \free{arr2}}
+}
+\xtc{
+}{
+\spadpaste{column(arr,1) \free{arr2}}
+}
+
+\xtc{
+You can determine the dimensions of an array by calling the
+operations \spadfunFrom{nrows}{TwoDimensionalArray} and
+\spadfunFrom{ncols}{TwoDimensionalArray},
+which return the number of rows and columns, respectively.
+}{
+\spadpaste{nrows(arr) \free{arr2}}
+}
+\xtc{
+}{
+\spadpaste{ncols(arr) \free{arr2}}
+}
+\xtc{
+To apply an operation to every element of an array, use
+\spadfunFrom{map}{TwoDimensionalArray}.
+This creates a new array.
+This expression negates every element.
+}{
+\spadpaste{map(-,arr) \free{arr2}}
+}
+\xtc{
+This creates an array where all the elements are doubled.
+}{
+\spadpaste{map((x +-> x + x),arr) \free{arr2}}
+}
+\xtc{
+To change the array destructively, use
+\spadfunFromX{map}{TwoDimensionalArray} instead of
+\spadfunFrom{map}{TwoDimensionalArray}.
+If you need to make a copy of any array, use
+\spadfunFrom{copy}{TwoDimensionalArray}.
+}{
+\spadpaste{arrc := copy(arr) \bound{arrc}\free{arr2}}
+}
+\xtc{
+}{
+\spadpaste{map!(-,arrc) \free{arrc}}
+}
+\xtc{
+}{
+\spadpaste{arrc \free{arrc}}
+}
+\xtc{
+}{
+\spadpaste{arr  \free{arr2}}
+}
+
+\xtc{
+Use \spadfunFrom{member?}{TwoDimensionalArray} to see if a given element
+is in an array.
+}{
+\spadpaste{member?(17,arr) \free{arr2}}
+}
+\xtc{
+}{
+\spadpaste{member?(10317,arr) \free{arr2}}
+}
+\xtc{
+To see how many times an element appears in an array, use
+\spadfunFrom{count}{TwoDimensionalArray}.
+}{
+\spadpaste{count(17,arr) \free{arr2}}
+}
+\xtc{
+}{
+\spadpaste{count(0,arr) \free{arr2}}
+}
+
+For more information about the operations available for
+\spadtype{TwoDimensionalArray}, issue \spadcmd{)show
+TwoDimensionalArray}.
+For information on related topics, see 
+\downlink{`Matrix'}{MatrixXmpPage}\ignore{Matrix} and
+\downlink{`OneDimensionalArray'}{OneDimensionalArrayXmpPage}
+\ignore{OneDimensionalArray}.
+\endscroll
+\autobuttons
+\end{page}
+%
+
+@
+\section{aspex.ht}
+\subsection{Asp1 Example Code}
+\label{Asp1ExampleCode}
+\index{pages!Asp1ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp1ExampleCode}
+\index{Asp1ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp1ExampleCode}{Asp1 Example Code}
+\begin{verbatim}
+      DOUBLE PRECISION FUNCTION F(X)
+      DOUBLE PRECISION X
+      F=DSIN(X)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp10 Example Code}
+\label{Asp10ExampleCode}
+\index{pages!Asp10ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp10ExampleCode}
+\index{Asp10ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp10ExampleCode}{Asp10 Example Code}
+\begin{verbatim}
+      SUBROUTINE COEFFN(P,Q,DQDL,X,ELAM,JINT)
+      DOUBLE PRECISION ELAM,P,Q,X,DQDL
+      INTEGER JINT
+      P=1.0D0
+      Q=((-1.0D0*X**3)+ELAM*X*X-2.0D0)/(X*X)
+      DQDL=1.0D0
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+
+@
+\subsection{Asp12 Example Code}
+\label{Asp12ExampleCode}
+\index{pages!Asp12ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp12ExampleCode}
+\index{Asp12ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp12ExampleCode}{Asp12 Example Code}
+\begin{verbatim}
+      SUBROUTINE MONIT (MAXIT,IFLAG,ELAM,FINFO)
+      DOUBLE PRECISION ELAM,FINFO(15)
+      INTEGER MAXIT,IFLAG
+      IF(MAXIT.EQ.-1)THEN
+        PRINT*,"Output from Monit"
+      ENDIF
+      PRINT*,MAXIT,IFLAG,ELAM,(FINFO(I),I=1,4)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp19 Example Code}
+\label{Asp19ExampleCode}
+\index{pages!Asp19ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp19ExampleCode}
+\index{Asp19ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp19ExampleCode}{Asp19 Example Code}
+\begin{verbatim}
+      SUBROUTINE LSFUN2(M,N,XC,FVECC,FJACC,LJC)
+      DOUBLE PRECISION FVECC(M),FJACC(LJC,N),XC(N)
+      INTEGER M,N,LJC
+      INTEGER I,J
+      DO 25003 I=1,LJC
+        DO 25004 J=1,N
+          FJACC(I,J)=0.0D0
+25004   CONTINUE
+25003 CONTINUE
+      FVECC(1)=((XC(1)-0.14D0)*XC(3)+(15.0D0*XC(1)-2.1D0)*XC(2)+1.0D0)/(
+     &XC(3)+15.0D0*XC(2))
+      FVECC(2)=((XC(1)-0.18D0)*XC(3)+(7.0D0*XC(1)-1.26D0)*XC(2)+1.0D0)/(
+     &XC(3)+7.0D0*XC(2))
+      FVECC(3)=((XC(1)-0.22D0)*XC(3)+(4.333333333333333D0*XC(1)-0.953333
+     &3333333333D0)*XC(2)+1.0D0)/(XC(3)+4.333333333333333D0*XC(2))
+      FVECC(4)=((XC(1)-0.25D0)*XC(3)+(3.0D0*XC(1)-0.75D0)*XC(2)+1.0D0)/(
+     &XC(3)+3.0D0*XC(2))
+      FVECC(5)=((XC(1)-0.29D0)*XC(3)+(2.2D0*XC(1)-0.6379999999999999D0)*
+     &XC(2)+1.0D0)/(XC(3)+2.2D0*XC(2))
+      FVECC(6)=((XC(1)-0.32D0)*XC(3)+(1.666666666666667D0*XC(1)-0.533333
+     &3333333333D0)*XC(2)+1.0D0)/(XC(3)+1.666666666666667D0*XC(2))
+      FVECC(7)=((XC(1)-0.35D0)*XC(3)+(1.285714285714286D0*XC(1)-0.45D0)*
+     &XC(2)+1.0D0)/(XC(3)+1.285714285714286D0*XC(2))
+      FVECC(8)=((XC(1)-0.39D0)*XC(3)+(XC(1)-0.39D0)*XC(2)+1.0D0)/(XC(3)+
+     &XC(2))
+      FVECC(9)=((XC(1)-0.37D0)*XC(3)+(XC(1)-0.37D0)*XC(2)+1.285714285714
+     &286D0)/(XC(3)+XC(2))
+      FVECC(10)=((XC(1)-0.58D0)*XC(3)+(XC(1)-0.58D0)*XC(2)+1.66666666666
+     &6667D0)/(XC(3)+XC(2))
+      FVECC(11)=((XC(1)-0.73D0)*XC(3)+(XC(1)-0.73D0)*XC(2)+2.2D0)/(XC(3)
+     &+XC(2))
+      FVECC(12)=((XC(1)-0.96D0)*XC(3)+(XC(1)-0.96D0)*XC(2)+3.0D0)/(XC(3)
+     &+XC(2))
+      FVECC(13)=((XC(1)-1.34D0)*XC(3)+(XC(1)-1.34D0)*XC(2)+4.33333333333
+     &3333D0)/(XC(3)+XC(2))
+      FVECC(14)=((XC(1)-2.1D0)*XC(3)+(XC(1)-2.1D0)*XC(2)+7.0D0)/(XC(3)+X
+     &C(2))
+      FVECC(15)=((XC(1)-4.39D0)*XC(3)+(XC(1)-4.39D0)*XC(2)+15.0D0)/(XC(3
+     &)+XC(2))
+      FJACC(1,1)=1.0D0
+      FJACC(1,2)=-15.0D0/(XC(3)**2+30.0D0*XC(2)*XC(3)+225.0D0*XC(2)**2)
+      FJACC(1,3)=-1.0D0/(XC(3)**2+30.0D0*XC(2)*XC(3)+225.0D0*XC(2)**2)
+      FJACC(2,1)=1.0D0
+      FJACC(2,2)=-7.0D0/(XC(3)**2+14.0D0*XC(2)*XC(3)+49.0D0*XC(2)**2)
+      FJACC(2,3)=-1.0D0/(XC(3)**2+14.0D0*XC(2)*XC(3)+49.0D0*XC(2)**2)
+      FJACC(3,1)=1.0D0
+      FJACC(3,2)=((-0.1110223024625157D-15*XC(3))-4.333333333333333D0)/(
+     &XC(3)**2+8.666666666666666D0*XC(2)*XC(3)+18.77777777777778D0*XC(2)
+     &**2)
+      FJACC(3,3)=(0.1110223024625157D-15*XC(2)-1.0D0)/(XC(3)**2+8.666666
+     &666666666D0*XC(2)*XC(3)+18.77777777777778D0*XC(2)**2)
+      FJACC(4,1)=1.0D0
+      FJACC(4,2)=-3.0D0/(XC(3)**2+6.0D0*XC(2)*XC(3)+9.0D0*XC(2)**2)
+      FJACC(4,3)=-1.0D0/(XC(3)**2+6.0D0*XC(2)*XC(3)+9.0D0*XC(2)**2)
+      FJACC(5,1)=1.0D0
+      FJACC(5,2)=((-0.1110223024625157D-15*XC(3))-2.2D0)/(XC(3)**2+4.399
+     &999999999999D0*XC(2)*XC(3)+4.839999999999998D0*XC(2)**2)
+      FJACC(5,3)=(0.1110223024625157D-15*XC(2)-1.0D0)/(XC(3)**2+4.399999
+     &999999999D0*XC(2)*XC(3)+4.839999999999998D0*XC(2)**2)
+      FJACC(6,1)=1.0D0
+      FJACC(6,2)=((-0.2220446049250313D-15*XC(3))-1.666666666666667D0)/(
+     &XC(3)**2+3.333333333333333D0*XC(2)*XC(3)+2.777777777777777D0*XC(2)
+     &**2)
+      FJACC(6,3)=(0.2220446049250313D-15*XC(2)-1.0D0)/(XC(3)**2+3.333333
+     &333333333D0*XC(2)*XC(3)+2.777777777777777D0*XC(2)**2)
+      FJACC(7,1)=1.0D0
+      FJACC(7,2)=((-0.5551115123125783D-16*XC(3))-1.285714285714286D0)/(
+     &XC(3)**2+2.571428571428571D0*XC(2)*XC(3)+1.653061224489796D0*XC(2)
+     &**2)
+      FJACC(7,3)=(0.5551115123125783D-16*XC(2)-1.0D0)/(XC(3)**2+2.571428
+     &571428571D0*XC(2)*XC(3)+1.653061224489796D0*XC(2)**2)
+      FJACC(8,1)=1.0D0
+      FJACC(8,2)=-1.0D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(8,3)=-1.0D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(9,1)=1.0D0
+      FJACC(9,2)=-1.285714285714286D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)*
+     &*2)
+      FJACC(9,3)=-1.285714285714286D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)*
+     &*2)
+      FJACC(10,1)=1.0D0
+      FJACC(10,2)=-1.666666666666667D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)
+     &**2)
+      FJACC(10,3)=-1.666666666666667D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)
+     &**2)
+      FJACC(11,1)=1.0D0
+      FJACC(11,2)=-2.2D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(11,3)=-2.2D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(12,1)=1.0D0
+      FJACC(12,2)=-3.0D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(12,3)=-3.0D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(13,1)=1.0D0
+      FJACC(13,2)=-4.333333333333333D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)
+     &**2)
+      FJACC(13,3)=-4.333333333333333D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)
+     &**2)
+      FJACC(14,1)=1.0D0
+      FJACC(14,2)=-7.0D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(14,3)=-7.0D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(15,1)=1.0D0
+      FJACC(15,2)=-15.0D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      FJACC(15,3)=-15.0D0/(XC(3)**2+2.0D0*XC(2)*XC(3)+XC(2)**2)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp20 Example Code}
+\label{Asp20ExampleCode}
+\index{pages!Asp20ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp20ExampleCode}
+\index{Asp20ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp20ExampleCode}{Asp20 Example Code}
+\begin{verbatim}
+      SUBROUTINE QPHESS(N,NROWH,NCOLH,JTHCOL,HESS,X,HX)
+      DOUBLE PRECISION HX(N),X(N),HESS(NROWH,NCOLH)
+      INTEGER JTHCOL,N,NROWH,NCOLH
+      HX(1)=2.0D0*X(1)
+      HX(2)=2.0D0*X(2)
+      HX(3)=2.0D0*X(4)+2.0D0*X(3)
+      HX(4)=2.0D0*X(4)+2.0D0*X(3)
+      HX(5)=2.0D0*X(5)
+      HX(6)=(-2.0D0*X(7))+(-2.0D0*X(6))
+      HX(7)=(-2.0D0*X(7))+(-2.0D0*X(6))
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp24 Example Code}
+\label{Asp24ExampleCode}
+\index{pages!Asp24ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp24ExampleCode}
+\index{Asp24ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp24ExampleCode}{Asp24 Example Code}
+\begin{verbatim}
+      SUBROUTINE FUNCT1(N,XC,FC)
+      DOUBLE PRECISION FC,XC(N)
+      INTEGER N
+      FC=10.0D0*XC(4)**4+(-40.0D0*XC(1)*XC(4)**3)+(60.0D0*XC(1)**2+5
+     &.0D0)*XC(4)**2+((-10.0D0*XC(3))+(-40.0D0*XC(1)**3))*XC(4)+16.0D0*X
+     &C(3)**4+(-32.0D0*XC(2)*XC(3)**3)+(24.0D0*XC(2)**2+5.0D0)*XC(3)**2+
+     &(-8.0D0*XC(2)**3*XC(3))+XC(2)**4+100.0D0*XC(2)**2+20.0D0*XC(1)*XC(
+     &2)+10.0D0*XC(1)**4+XC(1)**2
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp27 Example Code}
+\label{Asp27ExampleCode}
+\index{pages!Asp27ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp27ExampleCode}
+\index{Asp27ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp27ExampleCode}{Asp27 Example Code}
+\begin{verbatim}
+      FUNCTION DOT(IFLAG,N,Z,W,RWORK,LRWORK,IWORK,LIWORK)
+      DOUBLE PRECISION W(N),Z(N),RWORK(LRWORK)
+      INTEGER N,LIWORK,IFLAG,LRWORK,IWORK(LIWORK)
+      DOT=(W(16)+(-0.5D0*W(15)))*Z(16)+((-0.5D0*W(16))+W(15)+(-0.5D0*W(1
+     &4)))*Z(15)+((-0.5D0*W(15))+W(14)+(-0.5D0*W(13)))*Z(14)+((-0.5D0*W(
+     &14))+W(13)+(-0.5D0*W(12)))*Z(13)+((-0.5D0*W(13))+W(12)+(-0.5D0*W(1
+     &1)))*Z(12)+((-0.5D0*W(12))+W(11)+(-0.5D0*W(10)))*Z(11)+((-0.5D0*W(
+     &11))+W(10)+(-0.5D0*W(9)))*Z(10)+((-0.5D0*W(10))+W(9)+(-0.5D0*W(8))
+     &)*Z(9)+((-0.5D0*W(9))+W(8)+(-0.5D0*W(7)))*Z(8)+((-0.5D0*W(8))+W(7)
+     &+(-0.5D0*W(6)))*Z(7)+((-0.5D0*W(7))+W(6)+(-0.5D0*W(5)))*Z(6)+((-0.
+     &5D0*W(6))+W(5)+(-0.5D0*W(4)))*Z(5)+((-0.5D0*W(5))+W(4)+(-0.5D0*W(3
+     &)))*Z(4)+((-0.5D0*W(4))+W(3)+(-0.5D0*W(2)))*Z(3)+((-0.5D0*W(3))+W(
+     &2)+(-0.5D0*W(1)))*Z(2)+((-0.5D0*W(2))+W(1))*Z(1)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp28 Example Code}
+\label{Asp28ExampleCode}
+\index{pages!Asp28ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp28ExampleCode}
+\index{Asp28ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp28ExampleCode}{Asp28 Example Code}
+\begin{verbatim}
+      SUBROUTINE IMAGE(IFLAG,N,Z,W,RWORK,LRWORK,IWORK,LIWORK)
+      DOUBLE PRECISION Z(N),W(N),IWORK(LRWORK),RWORK(LRWORK)
+      INTEGER N,LIWORK,IFLAG,LRWORK
+      W(1)=0.01707454969713436D0*Z(16)+0.001747395874954051D0*Z(15)+0.00
+     &2106973900813502D0*Z(14)+0.002957434991769087D0*Z(13)+(-0.00700554
+     &0882865317D0*Z(12))+(-0.01219194009813166D0*Z(11))+0.0037230647365
+     &3087D0*Z(10)+0.04932374658377151D0*Z(9)+(-0.03586220812223305D0*Z(
+     &8))+(-0.04723268012114625D0*Z(7))+(-0.02434652144032987D0*Z(6))+0.
+     &2264766947290192D0*Z(5)+(-0.1385343580686922D0*Z(4))+(-0.116530050
+     &8238904D0*Z(3))+(-0.2803531651057233D0*Z(2))+1.019463911841327D0*Z
+     &(1)
+      W(2)=0.0227345011107737D0*Z(16)+0.008812321197398072D0*Z(15)+0.010
+     &94012210519586D0*Z(14)+(-0.01764072463999744D0*Z(13))+(-0.01357136
+     &72105995D0*Z(12))+0.00157466157362272D0*Z(11)+0.05258889186338282D
+     &0*Z(10)+(-0.01981532388243379D0*Z(9))+(-0.06095390688679697D0*Z(8)
+     &)+(-0.04153119955569051D0*Z(7))+0.2176561076571465D0*Z(6)+(-0.0532
+     &5555586632358D0*Z(5))+(-0.1688977368984641D0*Z(4))+(-0.32440166056
+     &67343D0*Z(3))+0.9128222941872173D0*Z(2)+(-0.2419652703415429D0*Z(1
+     &))
+      W(3)=0.03371198197190302D0*Z(16)+0.02021603150122265D0*Z(15)+(-0.0
+     &06607305534689702D0*Z(14))+(-0.03032392238968179D0*Z(13))+0.002033
+     &305231024948D0*Z(12)+0.05375944956767728D0*Z(11)+(-0.0163213312502
+     &9967D0*Z(10))+(-0.05483186562035512D0*Z(9))+(-0.04901428822579872D
+     &0*Z(8))+0.2091097927887612D0*Z(7)+(-0.05760560341383113D0*Z(6))+(-
+     &0.1236679206156403D0*Z(5))+(-0.3523683853026259D0*Z(4))+0.88929961
+     &32269974D0*Z(3)+(-0.2995429545781457D0*Z(2))+(-0.02986582812574917
+     &D0*Z(1))
+      W(4)=0.05141563713660119D0*Z(16)+0.005239165960779299D0*Z(15)+(-0.
+     &01623427735779699D0*Z(14))+(-0.01965809746040371D0*Z(13))+0.054688
+     &97337339577D0*Z(12)+(-0.014224695935687D0*Z(11))+(-0.0505181779315
+     &6355D0*Z(10))+(-0.04353074206076491D0*Z(9))+0.2012230497530726D0*Z
+     &(8)+(-0.06630874514535952D0*Z(7))+(-0.1280829963720053D0*Z(6))+(-0
+     &.305169742604165D0*Z(5))+0.8600427128450191D0*Z(4)+(-0.32415033802
+     &68184D0*Z(3))+(-0.09033531980693314D0*Z(2))+0.09089205517109111D0*
+     &Z(1)
+      W(5)=0.04556369767776375D0*Z(16)+(-0.001822737697581869D0*Z(15))+(
+     &-0.002512226501941856D0*Z(14))+0.02947046460707379D0*Z(13)+(-0.014
+     &45079632086177D0*Z(12))+(-0.05034242196614937D0*Z(11))+(-0.0376966
+     &3291725935D0*Z(10))+0.2171103102175198D0*Z(9)+(-0.0824949256021352
+     &4D0*Z(8))+(-0.1473995209288945D0*Z(7))+(-0.315042193418466D0*Z(6))
+     &+0.9591623347824002D0*Z(5)+(-0.3852396953763045D0*Z(4))+(-0.141718
+     &5427288274D0*Z(3))+(-0.03423495461011043D0*Z(2))+0.319820917706851
+     &6D0*Z(1)
+      W(6)=0.04015147277405744D0*Z(16)+0.01328585741341559D0*Z(15)+0.048
+     &26082005465965D0*Z(14)+(-0.04319641116207706D0*Z(13))+(-0.04931323
+     &319055762D0*Z(12))+(-0.03526886317505474D0*Z(11))+0.22295383396730
+     &01D0*Z(10)+(-0.07375317649315155D0*Z(9))+(-0.1589391311991561D0*Z(
+     &8))+(-0.328001910890377D0*Z(7))+0.952576555482747D0*Z(6)+(-0.31583
+     &09975786731D0*Z(5))+(-0.1846882042225383D0*Z(4))+(-0.0703762046700
+     &4427D0*Z(3))+0.2311852964327382D0*Z(2)+0.04254083491825025D0*Z(1)
+      W(7)=0.06069778964023718D0*Z(16)+0.06681263884671322D0*Z(15)+(-0.0
+     &2113506688615768D0*Z(14))+(-0.083996867458326D0*Z(13))+(-0.0329843
+     &8523869648D0*Z(12))+0.2276878326327734D0*Z(11)+(-0.067356038933017
+     &95D0*Z(10))+(-0.1559813965382218D0*Z(9))+(-0.3363262957694705D0*Z(
+     &8))+0.9442791158560948D0*Z(7)+(-0.3199955249404657D0*Z(6))+(-0.136
+     &2463839920727D0*Z(5))+(-0.1006185171570586D0*Z(4))+0.2057504515015
+     &423D0*Z(3)+(-0.02065879269286707D0*Z(2))+0.03160990266745513D0*Z(1
+     &)
+      W(8)=0.126386868896738D0*Z(16)+0.002563370039476418D0*Z(15)+(-0.05
+     &581757739455641D0*Z(14))+(-0.07777893205900685D0*Z(13))+0.23117338
+     &45834199D0*Z(12)+(-0.06031581134427592D0*Z(11))+(-0.14805474755869
+     &52D0*Z(10))+(-0.3364014128402243D0*Z(9))+0.9364014128402244D0*Z(8)
+     &+(-0.3269452524413048D0*Z(7))+(-0.1396841886557241D0*Z(6))+(-0.056
+     &1733845834199D0*Z(5))+0.1777789320590069D0*Z(4)+(-0.04418242260544
+     &359D0*Z(3))+(-0.02756337003947642D0*Z(2))+0.07361313110326199D0*Z(
+     &1)
+      W(9)=0.07361313110326199D0*Z(16)+(-0.02756337003947642D0*Z(15))+(-
+     &0.04418242260544359D0*Z(14))+0.1777789320590069D0*Z(13)+(-0.056173
+     &3845834199D0*Z(12))+(-0.1396841886557241D0*Z(11))+(-0.326945252441
+     &3048D0*Z(10))+0.9364014128402244D0*Z(9)+(-0.3364014128402243D0*Z(8
+     &))+(-0.1480547475586952D0*Z(7))+(-0.06031581134427592D0*Z(6))+0.23
+     &11733845834199D0*Z(5)+(-0.07777893205900685D0*Z(4))+(-0.0558175773
+     &9455641D0*Z(3))+0.002563370039476418D0*Z(2)+0.126386868896738D0*Z(
+     &1)
+      W(10)=0.03160990266745513D0*Z(16)+(-0.02065879269286707D0*Z(15))+0
+     &.2057504515015423D0*Z(14)+(-0.1006185171570586D0*Z(13))+(-0.136246
+     &3839920727D0*Z(12))+(-0.3199955249404657D0*Z(11))+0.94427911585609
+     &48D0*Z(10)+(-0.3363262957694705D0*Z(9))+(-0.1559813965382218D0*Z(8
+     &))+(-0.06735603893301795D0*Z(7))+0.2276878326327734D0*Z(6)+(-0.032
+     &98438523869648D0*Z(5))+(-0.083996867458326D0*Z(4))+(-0.02113506688
+     &615768D0*Z(3))+0.06681263884671322D0*Z(2)+0.06069778964023718D0*Z(
+     &1)
+      W(11)=0.04254083491825025D0*Z(16)+0.2311852964327382D0*Z(15)+(-0.0
+     &7037620467004427D0*Z(14))+(-0.1846882042225383D0*Z(13))+(-0.315830
+     &9975786731D0*Z(12))+0.952576555482747D0*Z(11)+(-0.328001910890377D
+     &0*Z(10))+(-0.1589391311991561D0*Z(9))+(-0.07375317649315155D0*Z(8)
+     &)+0.2229538339673001D0*Z(7)+(-0.03526886317505474D0*Z(6))+(-0.0493
+     &1323319055762D0*Z(5))+(-0.04319641116207706D0*Z(4))+0.048260820054
+     &65965D0*Z(3)+0.01328585741341559D0*Z(2)+0.04015147277405744D0*Z(1)
+      W(12)=0.3198209177068516D0*Z(16)+(-0.03423495461011043D0*Z(15))+(-
+     &0.1417185427288274D0*Z(14))+(-0.3852396953763045D0*Z(13))+0.959162
+     &3347824002D0*Z(12)+(-0.315042193418466D0*Z(11))+(-0.14739952092889
+     &45D0*Z(10))+(-0.08249492560213524D0*Z(9))+0.2171103102175198D0*Z(8
+     &)+(-0.03769663291725935D0*Z(7))+(-0.05034242196614937D0*Z(6))+(-0.
+     &01445079632086177D0*Z(5))+0.02947046460707379D0*Z(4)+(-0.002512226
+     &501941856D0*Z(3))+(-0.001822737697581869D0*Z(2))+0.045563697677763
+     &75D0*Z(1)
+      W(13)=0.09089205517109111D0*Z(16)+(-0.09033531980693314D0*Z(15))+(
+     &-0.3241503380268184D0*Z(14))+0.8600427128450191D0*Z(13)+(-0.305169
+     &742604165D0*Z(12))+(-0.1280829963720053D0*Z(11))+(-0.0663087451453
+     &5952D0*Z(10))+0.2012230497530726D0*Z(9)+(-0.04353074206076491D0*Z(
+     &8))+(-0.05051817793156355D0*Z(7))+(-0.014224695935687D0*Z(6))+0.05
+     &468897337339577D0*Z(5)+(-0.01965809746040371D0*Z(4))+(-0.016234277
+     &35779699D0*Z(3))+0.005239165960779299D0*Z(2)+0.05141563713660119D0
+     &*Z(1)
+      W(14)=(-0.02986582812574917D0*Z(16))+(-0.2995429545781457D0*Z(15))
+     &+0.8892996132269974D0*Z(14)+(-0.3523683853026259D0*Z(13))+(-0.1236
+     &679206156403D0*Z(12))+(-0.05760560341383113D0*Z(11))+0.20910979278
+     &87612D0*Z(10)+(-0.04901428822579872D0*Z(9))+(-0.05483186562035512D
+     &0*Z(8))+(-0.01632133125029967D0*Z(7))+0.05375944956767728D0*Z(6)+0
+     &.002033305231024948D0*Z(5)+(-0.03032392238968179D0*Z(4))+(-0.00660
+     &7305534689702D0*Z(3))+0.02021603150122265D0*Z(2)+0.033711981971903
+     &02D0*Z(1)
+      W(15)=(-0.2419652703415429D0*Z(16))+0.9128222941872173D0*Z(15)+(-0
+     &.3244016605667343D0*Z(14))+(-0.1688977368984641D0*Z(13))+(-0.05325
+     &555586632358D0*Z(12))+0.2176561076571465D0*Z(11)+(-0.0415311995556
+     &9051D0*Z(10))+(-0.06095390688679697D0*Z(9))+(-0.01981532388243379D
+     &0*Z(8))+0.05258889186338282D0*Z(7)+0.00157466157362272D0*Z(6)+(-0.
+     &0135713672105995D0*Z(5))+(-0.01764072463999744D0*Z(4))+0.010940122
+     &10519586D0*Z(3)+0.008812321197398072D0*Z(2)+0.0227345011107737D0*Z
+     &(1)
+      W(16)=1.019463911841327D0*Z(16)+(-0.2803531651057233D0*Z(15))+(-0.
+     &1165300508238904D0*Z(14))+(-0.1385343580686922D0*Z(13))+0.22647669
+     &47290192D0*Z(12)+(-0.02434652144032987D0*Z(11))+(-0.04723268012114
+     &625D0*Z(10))+(-0.03586220812223305D0*Z(9))+0.04932374658377151D0*Z
+     &(8)+0.00372306473653087D0*Z(7)+(-0.01219194009813166D0*Z(6))+(-0.0
+     &07005540882865317D0*Z(5))+0.002957434991769087D0*Z(4)+0.0021069739
+     &00813502D0*Z(3)+0.001747395874954051D0*Z(2)+0.01707454969713436D0*
+     &Z(1)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp29 Example Code}
+\label{Asp29ExampleCode}
+\index{pages!Asp29ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp29ExampleCode}
+\index{Asp29ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp29ExampleCode}{Asp29 Example Code}
+\begin{verbatim}
+      SUBROUTINE MONIT(ISTATE,NEXTIT,NEVALS,NEVECS,K,F,D)
+      DOUBLE PRECISION D(K),F(K)
+      INTEGER K,NEXTIT,NEVALS,NVECS,ISTATE
+      CALL F02FJZ(ISTATE,NEXTIT,NEVALS,NEVECS,K,F,D)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp30 Example Code}
+\label{Asp30ExampleCode}
+\index{pages!Asp30ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp30ExampleCode}
+\index{Asp30ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp30ExampleCode}{Asp30 Example Code}
+\begin{verbatim}
+      SUBROUTINE APROD(MODE,M,N,X,Y,RWORK,LRWORK,IWORK,LIWORK)
+      DOUBLE PRECISION X(N),Y(M),RWORK(LRWORK)
+      INTEGER M,N,LIWORK,IFAIL,LRWORK,IWORK(LIWORK),MODE
+      DOUBLE PRECISION A(5,5)
+      EXTERNAL F06PAF
+      A(1,1)=1.0D0
+      A(1,2)=0.0D0
+      A(1,3)=0.0D0
+      A(1,4)=-1.0D0
+      A(1,5)=0.0D0
+      A(2,1)=0.0D0
+      A(2,2)=1.0D0
+      A(2,3)=0.0D0
+      A(2,4)=0.0D0
+      A(2,5)=-1.0D0
+      A(3,1)=0.0D0
+      A(3,2)=0.0D0
+      A(3,3)=1.0D0
+      A(3,4)=-1.0D0
+      A(3,5)=0.0D0
+      A(4,1)=-1.0D0
+      A(4,2)=0.0D0
+      A(4,3)=-1.0D0
+      A(4,4)=4.0D0
+      A(4,5)=-1.0D0
+      A(5,1)=0.0D0
+      A(5,2)=-1.0D0
+      A(5,3)=0.0D0
+      A(5,4)=-1.0D0
+      A(5,5)=4.0D0
+      IF(MODE.EQ.1)THEN
+        CALL F06PAF('N',M,N,1.0D0,A,M,X,1,1.0D0,Y,1)
+      ELSEIF(MODE.EQ.2)THEN
+        CALL F06PAF('T',M,N,1.0D0,A,M,Y,1,1.0D0,X,1)
+      ENDIF
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp31 Example Code}
+\label{Asp31ExampleCode}
+\index{pages!Asp31ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp31ExampleCode}
+\index{Asp31ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp31ExampleCode}{Asp31 Example Code}
+\begin{verbatim}
+      SUBROUTINE PEDERV(X,Y,PW)
+      DOUBLE PRECISION X,Y(*)
+      DOUBLE PRECISION PW(3,3)
+      PW(1,1)=-0.03999999999999999D0
+      PW(1,2)=10000.0D0*Y(3)
+      PW(1,3)=10000.0D0*Y(2)
+      PW(2,1)=0.03999999999999999D0
+      PW(2,2)=(-10000.0D0*Y(3))+(-60000000.0D0*Y(2))
+      PW(2,3)=-10000.0D0*Y(2)
+      PW(3,1)=0.0D0
+      PW(3,2)=60000000.0D0*Y(2)
+      PW(3,3)=0.0D0
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp33 Example Code}
+\label{Asp33ExampleCode}
+\index{pages!Asp33ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp33ExampleCode}
+\index{Asp33ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp33ExampleCode}{Asp33 Example Code}
+\begin{verbatim}
+      SUBROUTINE REPORT(X,V,JINT)
+      DOUBLE PRECISION V(3),X
+      INTEGER JINT
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp34 Example Code}
+\label{Asp34ExampleCode}
+\index{pages!Asp34ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp34ExampleCode}
+\index{Asp34ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp34ExampleCode}{Asp34 Example Code}
+\begin{verbatim}
+      SUBROUTINE MSOLVE(IFLAG,N,X,Y,RWORK,LRWORK,IWORK,LIWORK)
+      DOUBLE PRECISION RWORK(LRWORK),X(N),Y(N)
+      INTEGER I,J,N,LIWORK,IFLAG,LRWORK,IWORK(LIWORK)
+      DOUBLE PRECISION W1(3),W2(3),MS(3,3)
+      IFLAG=-1
+      MS(1,1)=2.0D0
+      MS(1,2)=1.0D0
+      MS(1,3)=0.0D0
+      MS(2,1)=1.0D0
+      MS(2,2)=2.0D0
+      MS(2,3)=1.0D0
+      MS(3,1)=0.0D0
+      MS(3,2)=1.0D0
+      MS(3,3)=2.0D0
+      CALL F04ASF(MS,N,X,N,Y,W1,W2,IFLAG)
+      IFLAG=-IFLAG
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp35 Example Code}
+\label{Asp35ExampleCode}
+\index{pages!Asp35ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp35ExampleCode}
+\index{Asp35ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp35ExampleCode}{Asp35 Example Code}
+\begin{verbatim}
+      SUBROUTINE FCN(N,X,FVEC,FJAC,LDFJAC,IFLAG)
+      DOUBLE PRECISION X(N),FVEC(N),FJAC(LDFJAC,N)
+      INTEGER LDFJAC,N,IFLAG
+      IF(IFLAG.EQ.1)THEN
+        FVEC(1)=(-1.0D0*X(2))+X(1)
+        FVEC(2)=(-1.0D0*X(3))+2.0D0*X(2)
+        FVEC(3)=3.0D0*X(3)
+      ELSEIF(IFLAG.EQ.2)THEN
+        FJAC(1,1)=1.0D0
+        FJAC(1,2)=-1.0D0
+        FJAC(1,3)=0.0D0
+        FJAC(2,1)=0.0D0
+        FJAC(2,2)=2.0D0
+        FJAC(2,3)=-1.0D0
+        FJAC(3,1)=0.0D0
+        FJAC(3,2)=0.0D0
+        FJAC(3,3)=3.0D0
+      ENDIF
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp4 Example Code}
+\label{Asp4ExampleCode}
+\index{pages!Asp4ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp4ExampleCode}
+\index{Asp4ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp4ExampleCode}{Asp4 Example Code}
+\begin{verbatim}
+      DOUBLE PRECISION FUNCTION FUNCTN(NDIM,X)
+      DOUBLE PRECISION X(NDIM)
+      INTEGER NDIM
+      FUNCTN=(4.0D0*X(1)*X(3)**2*DEXP(2.0D0*X(1)*X(3)))/(X(4)**2+(2.0D0*
+     &X(2)+2.0D0)*X(4)+X(2)**2+2.0D0*X(2)+1.0D0)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp41 Example Code}
+\label{Asp41ExampleCode}
+\index{pages!Asp41ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp41ExampleCode}
+\index{Asp41ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp41ExampleCode}{Asp41 Example Code}
+\begin{verbatim}
+      SUBROUTINE FCN(X,EPS,Y,F,N)
+      DOUBLE PRECISION EPS,F(N),X,Y(N)
+      INTEGER N
+      F(1)=Y(2)
+      F(2)=Y(3)
+      F(3)=(-1.0D0*Y(1)*Y(3))+2.0D0*EPS*Y(2)**2+(-2.0D0*EPS)
+      RETURN
+      END
+      SUBROUTINE JACOBF(X,EPS,Y,F,N)
+      DOUBLE PRECISION EPS,F(N,N),X,Y(N)
+      INTEGER N
+      F(1,1)=0.0D0
+      F(1,2)=1.0D0
+      F(1,3)=0.0D0
+      F(2,1)=0.0D0
+      F(2,2)=0.0D0
+      F(2,3)=1.0D0
+      F(3,1)=-1.0D0*Y(3)
+      F(3,2)=4.0D0*EPS*Y(2)
+      F(3,3)=-1.0D0*Y(1)
+      RETURN
+      END
+      SUBROUTINE JACEPS(X,EPS,Y,F,N)
+      DOUBLE PRECISION EPS,F(N),X,Y(N)
+      INTEGER N
+      F(1)=0.0D0
+      F(2)=0.0D0
+      F(3)=2.0D0*Y(2)**2-2.0D0
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp42 Example Code}
+\label{Asp42ExampleCode}
+\index{pages!Asp42ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp42ExampleCode}
+\index{Asp42ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp42ExampleCode}{Asp42 Example Code}
+\begin{verbatim}
+      SUBROUTINE G(EPS,YA,YB,BC,N)
+      DOUBLE PRECISION EPS,YA(N),YB(N),BC(N)
+      INTEGER N
+      BC(1)=YA(1)
+      BC(2)=YA(2)
+      BC(3)=YB(2)-1.0D0
+      RETURN
+      END
+      SUBROUTINE JACOBG(EPS,YA,YB,AJ,BJ,N)
+      DOUBLE PRECISION EPS,YA(N),AJ(N,N),BJ(N,N),YB(N)
+      INTEGER N
+      AJ(1,1)=1.0D0
+      AJ(1,2)=0.0D0
+      AJ(1,3)=0.0D0
+      AJ(2,1)=0.0D0
+      AJ(2,2)=1.0D0
+      AJ(2,3)=0.0D0
+      AJ(3,1)=0.0D0
+      AJ(3,2)=0.0D0
+      AJ(3,3)=0.0D0
+      BJ(1,1)=0.0D0
+      BJ(1,2)=0.0D0
+      BJ(1,3)=0.0D0
+      BJ(2,1)=0.0D0
+      BJ(2,2)=0.0D0
+      BJ(2,3)=0.0D0
+      BJ(3,1)=0.0D0
+      BJ(3,2)=1.0D0
+      BJ(3,3)=0.0D0
+      RETURN
+      END
+      SUBROUTINE JACGEP(EPS,YA,YB,BCEP,N)
+      DOUBLE PRECISION EPS,YA(N),YB(N),BCEP(N)
+      INTEGER N
+      BCEP(1)=0.0D0
+      BCEP(2)=0.0D0
+      BCEP(3)=0.0D0
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp49 Example Code}
+\label{Asp49ExampleCode}
+\index{pages!Asp49ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp49ExampleCode}
+\index{Asp49ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp49ExampleCode}{Asp49 Example Code}
+\begin{verbatim}
+      SUBROUTINE OBJFUN(MODE,N,X,OBJF,OBJGRD,NSTATE,IUSER,USER)
+      DOUBLE PRECISION X(N),OBJF,OBJGRD(N),USER(*)
+      INTEGER N,IUSER(*),MODE,NSTATE
+      OBJF=X(4)*X(9)+((-1.0D0*X(5))+X(3))*X(8)+((-1.0D0*X(3))+X(1))*X(7)
+     &+(-1.0D0*X(2)*X(6))
+      OBJGRD(1)=X(7)
+      OBJGRD(2)=-1.0D0*X(6)
+      OBJGRD(3)=X(8)+(-1.0D0*X(7))
+      OBJGRD(4)=X(9)
+      OBJGRD(5)=-1.0D0*X(8)
+      OBJGRD(6)=-1.0D0*X(2)
+      OBJGRD(7)=(-1.0D0*X(3))+X(1)
+      OBJGRD(8)=(-1.0D0*X(5))+X(3)
+      OBJGRD(9)=X(4)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp50 Example Code}
+\label{Asp50ExampleCode}
+\index{pages!Asp50ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp50ExampleCode}
+\index{Asp50ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp50ExampleCode}{Asp50 Example Code}
+\begin{verbatim}
+      SUBROUTINE LSFUN1(M,N,XC,FVECC)
+      DOUBLE PRECISION FVECC(M),XC(N)
+      INTEGER I,M,N
+      FVECC(1)=((XC(1)-2.4D0)*XC(3)+(15.0D0*XC(1)-36.0D0)*XC(2)+1.0D0)/(
+     &XC(3)+15.0D0*XC(2))
+      FVECC(2)=((XC(1)-2.8D0)*XC(3)+(7.0D0*XC(1)-19.6D0)*XC(2)+1.0D0)/(X
+     &C(3)+7.0D0*XC(2))
+      FVECC(3)=((XC(1)-3.2D0)*XC(3)+(4.333333333333333D0*XC(1)-13.866666
+     &66666667D0)*XC(2)+1.0D0)/(XC(3)+4.333333333333333D0*XC(2))
+      FVECC(4)=((XC(1)-3.5D0)*XC(3)+(3.0D0*XC(1)-10.5D0)*XC(2)+1.0D0)/(X
+     &C(3)+3.0D0*XC(2))
+      FVECC(5)=((XC(1)-3.9D0)*XC(3)+(2.2D0*XC(1)-8.579999999999998D0)*XC
+     &(2)+1.0D0)/(XC(3)+2.2D0*XC(2))
+      FVECC(6)=((XC(1)-4.199999999999999D0)*XC(3)+(1.666666666666667D0*X
+     &C(1)-7.0D0)*XC(2)+1.0D0)/(XC(3)+1.666666666666667D0*XC(2))
+      FVECC(7)=((XC(1)-4.5D0)*XC(3)+(1.285714285714286D0*XC(1)-5.7857142
+     &85714286D0)*XC(2)+1.0D0)/(XC(3)+1.285714285714286D0*XC(2))
+      FVECC(8)=((XC(1)-4.899999999999999D0)*XC(3)+(XC(1)-4.8999999999999
+     &99D0)*XC(2)+1.0D0)/(XC(3)+XC(2))
+      FVECC(9)=((XC(1)-4.699999999999999D0)*XC(3)+(XC(1)-4.6999999999999
+     &99D0)*XC(2)+1.285714285714286D0)/(XC(3)+XC(2))
+      FVECC(10)=((XC(1)-6.8D0)*XC(3)+(XC(1)-6.8D0)*XC(2)+1.6666666666666
+     &67D0)/(XC(3)+XC(2))
+      FVECC(11)=((XC(1)-8.299999999999999D0)*XC(3)+(XC(1)-8.299999999999
+     &999D0)*XC(2)+2.2D0)/(XC(3)+XC(2))
+      FVECC(12)=((XC(1)-10.6D0)*XC(3)+(XC(1)-10.6D0)*XC(2)+3.0D0)/(XC(3)
+     &+XC(2))
+      FVECC(13)=((XC(1)-1.34D0)*XC(3)+(XC(1)-1.34D0)*XC(2)+4.33333333333
+     &3333D0)/(XC(3)+XC(2))
+      FVECC(14)=((XC(1)-2.1D0)*XC(3)+(XC(1)-2.1D0)*XC(2)+7.0D0)/(XC(3)+X
+     &C(2))
+      FVECC(15)=((XC(1)-4.39D0)*XC(3)+(XC(1)-4.39D0)*XC(2)+15.0D0)/(XC(3
+     &)+XC(2))
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp55 Example Code}
+\label{Asp55ExampleCode}
+\index{pages!Asp55ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp55ExampleCode}
+\index{Asp55ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp55ExampleCode}{Asp55 Example Code}
+\begin{verbatim}
+      SUBROUTINE CONFUN(MODE,NCNLN,N,NROWJ,NEEDC,X,C,CJAC,NSTATE,IUSER
+     &,USER)
+      DOUBLE PRECISION C(NCNLN),X(N),CJAC(NROWJ,N),USER(*)
+      INTEGER N,IUSER(*),NEEDC(NCNLN),NROWJ,MODE,NCNLN,NSTATE
+      IF(NEEDC(1).GT.0)THEN
+        C(1)=X(6)**2+X(1)**2
+        CJAC(1,1)=2.0D0*X(1)
+        CJAC(1,2)=0.0D0
+        CJAC(1,3)=0.0D0
+        CJAC(1,4)=0.0D0
+        CJAC(1,5)=0.0D0
+        CJAC(1,6)=2.0D0*X(6)
+      ENDIF
+      IF(NEEDC(2).GT.0)THEN
+        C(2)=X(2)**2+(-2.0D0*X(1)*X(2))+X(1)**2
+        CJAC(2,1)=(-2.0D0*X(2))+2.0D0*X(1)
+        CJAC(2,2)=2.0D0*X(2)+(-2.0D0*X(1))
+        CJAC(2,3)=0.0D0
+        CJAC(2,4)=0.0D0
+        CJAC(2,5)=0.0D0
+        CJAC(2,6)=0.0D0
+      ENDIF
+      IF(NEEDC(3).GT.0)THEN
+        C(3)=X(3)**2+(-2.0D0*X(1)*X(3))+X(2)**2+X(1)**2
+        CJAC(3,1)=(-2.0D0*X(3))+2.0D0*X(1)
+        CJAC(3,2)=2.0D0*X(2)
+        CJAC(3,3)=2.0D0*X(3)+(-2.0D0*X(1))
+        CJAC(3,4)=0.0D0
+        CJAC(3,5)=0.0D0
+        CJAC(3,6)=0.0D0
+      ENDIF
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp6 Example Code}
+\label{Asp6ExampleCode}
+\index{pages!Asp6ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp6ExampleCode}
+\index{Asp6ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp6ExampleCode}{Asp6 Example Code}
+\begin{verbatim}
+      SUBROUTINE FCN(N,X,FVEC,IFLAG)
+      DOUBLE PRECISION X(N),FVEC(N)
+      INTEGER N,IFLAG
+      FVEC(1)=(-2.0D0*X(2))+(-2.0D0*X(1)**2)+3.0D0*X(1)+1.0D0
+      FVEC(2)=(-2.0D0*X(3))+(-2.0D0*X(2)**2)+3.0D0*X(2)+(-1.0D0*X(1))+1.
+     &0D0
+      FVEC(3)=(-2.0D0*X(4))+(-2.0D0*X(3)**2)+3.0D0*X(3)+(-1.0D0*X(2))+1.
+     &0D0
+      FVEC(4)=(-2.0D0*X(5))+(-2.0D0*X(4)**2)+3.0D0*X(4)+(-1.0D0*X(3))+1.
+     &0D0
+      FVEC(5)=(-2.0D0*X(6))+(-2.0D0*X(5)**2)+3.0D0*X(5)+(-1.0D0*X(4))+1.
+     &0D0
+      FVEC(6)=(-2.0D0*X(7))+(-2.0D0*X(6)**2)+3.0D0*X(6)+(-1.0D0*X(5))+1.
+     &0D0
+      FVEC(7)=(-2.0D0*X(8))+(-2.0D0*X(7)**2)+3.0D0*X(7)+(-1.0D0*X(6))+1.
+     &0D0
+      FVEC(8)=(-2.0D0*X(9))+(-2.0D0*X(8)**2)+3.0D0*X(8)+(-1.0D0*X(7))+1.
+     &0D0
+      FVEC(9)=(-2.0D0*X(9)**2)+3.0D0*X(9)+(-1.0D0*X(8))+1.0D0
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp7 Example Code}
+\label{Asp7ExampleCode}
+\index{pages!Asp7ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp7ExampleCode}
+\index{Asp7ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp7ExampleCode}{Asp7 Example Code}
+\begin{verbatim}
+      SUBROUTINE FCN(X,Z,F)
+      DOUBLE PRECISION F(*),X,Z(*)
+      F(1)=DTAN(Z(3))
+      F(2)=((-0.03199999999999999D0*DCOS(Z(3))*DTAN(Z(3)))+(-0.02D0*Z(2)
+     &**2))/(Z(2)*DCOS(Z(3)))
+      F(3)=-0.03199999999999999D0/(X*Z(2)**2)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp73 Example Code}
+\label{Asp73ExampleCode}
+\index{pages!Asp73ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp73ExampleCode}
+\index{Asp73ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp73ExampleCode}{Asp73 Example Code}
+\begin{verbatim}
+      SUBROUTINE PDEF(X,Y,ALPHA,BETA,GAMMA,DELTA,EPSOLN,PHI,PSI)
+      DOUBLE PRECISION ALPHA,EPSOLN,PHI,X,Y,BETA,DELTA,GAMMA,PSI
+      ALPHA=DSIN(X)
+      BETA=Y
+      GAMMA=X*Y
+      DELTA=DCOS(X)*DSIN(Y)
+      EPSOLN=Y+X
+      PHI=X
+      PSI=Y
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp74 Example Code}
+\label{Asp74ExampleCode}
+\index{pages!Asp74ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp74ExampleCode}
+\index{Asp74ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp74ExampleCode}{Asp74 Example Code}
+\begin{verbatim}
+      SUBROUTINE BNDY(X,Y,A,B,C,IBND)
+      DOUBLE PRECISION A,B,C,X,Y
+      INTEGER IBND
+      IF(IBND.EQ.0)THEN
+        A=0.0D0
+        B=1.0D0
+        C=-1.0D0*DSIN(X)
+      ELSEIF(IBND.EQ.1)THEN
+        A=1.0D0
+        B=0.0D0
+        C=DSIN(X)*DSIN(Y)
+      ELSEIF(IBND.EQ.2)THEN
+        A=1.0D0
+        B=0.0D0
+        C=DSIN(X)*DSIN(Y)
+      ELSEIF(IBND.EQ.3)THEN
+        A=0.0D0
+        B=1.0D0
+        C=-1.0D0*DSIN(Y)
+      ENDIF
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp77 Example Code}
+\label{Asp77ExampleCode}
+\index{pages!Asp77ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp77ExampleCode}
+\index{Asp77ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp77ExampleCode}{Asp77 Example Code}
+\begin{verbatim}
+      SUBROUTINE FCNF(X,F)
+      DOUBLE PRECISION X
+      DOUBLE PRECISION F(2,2)
+      F(1,1)=0.0D0
+      F(1,2)=1.0D0
+      F(2,1)=0.0D0
+      F(2,2)=-10.0D0
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp78 Example Code}
+\label{Asp78ExampleCode}
+\index{pages!Asp78ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp78ExampleCode}
+\index{Asp78ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp78ExampleCode}{Asp78 Example Code}
+\begin{verbatim}
+      SUBROUTINE FCNG(X,G)
+      DOUBLE PRECISION G(*),X
+      G(1)=0.0D0
+      G(2)=0.0D0
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp8 Example Code}
+\label{Asp8ExampleCode}
+\index{pages!Asp8ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp8ExampleCode}
+\index{Asp8ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp8ExampleCode}{Asp8 Example Code}
+\begin{verbatim}
+      SUBROUTINE OUTPUT(XSOL,Y,COUNT,M,N,RESULT,FORWRD)
+      DOUBLE PRECISION Y(N),RESULT(M,N),XSOL
+      INTEGER M,N,COUNT
+      LOGICAL FORWRD
+      DOUBLE PRECISION X02ALF,POINTS(8)
+      EXTERNAL X02ALF
+      INTEGER I
+      POINTS(1)=1.0D0
+      POINTS(2)=2.0D0
+      POINTS(3)=3.0D0
+      POINTS(4)=4.0D0
+      POINTS(5)=5.0D0
+      POINTS(6)=6.0D0
+      POINTS(7)=7.0D0
+      POINTS(8)=8.0D0
+      COUNT=COUNT+1
+      DO 25001 I=1,N
+        RESULT(COUNT,I)=Y(I)
+25001 CONTINUE
+      IF(COUNT.EQ.M)THEN
+        IF(FORWRD)THEN
+          XSOL=X02ALF()
+        ELSE
+          XSOL=-X02ALF()
+        ENDIF
+      ELSE
+        XSOL=POINTS(COUNT)
+      ENDIF
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp80 Example Code}
+\label{Asp80ExampleCode}
+\index{pages!Asp80ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp80ExampleCode}
+\index{Asp80ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp80ExampleCode}{Asp80 Example Code}
+\begin{verbatim}
+      SUBROUTINE BDYVAL(XL,XR,ELAM,YL,YR)
+      DOUBLE PRECISION ELAM,XL,YL(3),XR,YR(3)
+      YL(1)=XL
+      YL(2)=2.0D0
+      YR(1)=1.0D0
+      YR(2)=-1.0D0*DSQRT(XR+(-1.0D0*ELAM))
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\subsection{Asp9 Example Code}
+\label{Asp9ExampleCode}
+\index{pages!Asp9ExampleCode!aspex.ht}
+\index{aspex.ht!pages!Asp9ExampleCode}
+\index{Asp9ExampleCode!aspex.ht!pages}
+<<aspex.ht>>=
+\begin{page}{Asp9ExampleCode}{Asp9 Example Code}
+\begin{verbatim}
+      DOUBLE PRECISION FUNCTION G(X,Y)
+      DOUBLE PRECISION X,Y(*)
+      G=X+Y(1)
+      RETURN
+      END
+\end{verbatim}
+\end{page}
+
+@
+\section{basic.ht}
+\subsection{Basic Commands}
+\label{BasicCommand}
+See Calculus \ref{Calculus} on page~\pageref{Calculus}
+\index{pages!BasicCommand!basic.ht}
+\index{basic.ht!pages!BasicCommand}
+\index{BasicCommand!basic.ht!pages}
+\index{Function!bcMatrix}
+\index{bcMatrix Function}
+\index{Function!bcExpand}
+\index{bcExpand Function}
+\index{Function!bcDraw}
+\index{bcDraw Function}
+\index{Function!bcSeries}
+\index{bcSeries Function}
+\index{Function!bcSolve}
+\index{bcSolve Function}
+<<basic.ht>>=
+\begin{page}{BasicCommand}{Basic Commands}
+\beginscroll
+\beginmenu
+\menumemolink{Calculus}{Calculus}\tab{10}
+  Compute integrals, derivatives, or limits
+\menulispmemolink{Matrix}{(|bcMatrix|)}\tab{10}
+  Create a matrix
+%\menulispmemolink{Operations}{(|bcExpand|)}
+%  Expand, factor, simplify, substitute, etc.
+\menulispmemolink{Draw}{(|bcDraw|)}\tab{10}
+  Create 2D or 3D plots.
+\menulispmemolink{Series}{(|bcSeries|)}\tab{10}
+  Create a power series
+\menulispmemolink{Solve}{(|bcSolve|)}\tab{10}
+  Solve an equation or system of equations.
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+ 
+@
+\subsection{Calculus}
+\label{Calculus}
+\index{pages!Calculus!basic.ht}
+\index{basic.ht!pages!Calculus}
+\index{Calculus!basic.ht!pages}
+\index{Function!bcDifferentiate}
+\index{bcDifferentiate Function}
+\index{Function!bcIndefiniteIntegral}
+\index{bcIndefiniteIntegral Function}
+\index{Function!bcDefiniteIntegral}
+\index{bcDefiniteIntegral Function}
+\index{Function!bcLimit}
+\index{bcLimit Function}
+\index{Function!bcSum}
+\index{bcSum Function}
+\index{Function!bcProduct}
+\index{bcProduct Function}
+<<basic.ht>>=
+\begin{page}{Calculus}{Calculus}
+\beginscroll
+What would you like to do?
+\beginmenu
+\menulispdownlink{Differentiate}{(|bcDifferentiate|)}\space{}
+\menulispdownlink{Do an Indefinite Integral}{(|bcIndefiniteIntegrate|)}\space{}
+\menulispdownlink{Do a Definite Integral}{(|bcDefiniteIntegrate|)}\space{}
+\menulispdownlink{Find a limit}{(|bcLimit|)}\space{}
+\menulispdownlink{Do a summation}{(|bcSum|)}\space{}
+%\menulispdownlink{Compute a product}{(|bcProduct|)}\space{}
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+ 
+@
+\section{bbtree.ht}
+<<bbtree.ht>>=
+\newcommand{\BalancedBinaryTreeXmpTitle}{BalancedBinaryTree}
+\newcommand{\BalancedBinaryTreeXmpNumber}{9.2}
+
+@
+\subsection{BalancedBinaryTree}
+\label{BalancedBinaryTreeXmpPage}
+\index{pages!BalancedBinaryTreeXmpPage!bbtree.ht}
+\index{bbtree.ht!pages!BalancedBinaryTreeXmpPage}
+\index{BalancedBinaryTreeXmpPage!bbtree.ht!pages}
+<<bbtree.ht>>=
+\begin{page}{BalancedBinaryTreeXmpPage}{BalancedBinaryTree}
+\beginscroll
+\spadtype{BalancedBinaryTrees(S)} is the domain
+of balanced binary trees with elements of type \spad{S} at the nodes.
+A binary tree is either \spadfun{empty} or else
+consists of a \spadfun{node} having a \spadfun{value}
+and two branches, each branch a binary tree.
+A balanced binary tree is one that is balanced with respect its leaves.
+One with \texht{$2^k$}{2**k} leaves is
+perfectly ``balanced'': the tree has minimum depth, and
+the \spadfun{left} and \spadfun{right}
+branch of every interior node is identical in shape.
+
+Balanced binary trees are useful in algebraic computation for
+so-called ``divide-and-conquer'' algorithms.
+Conceptually, the data for a problem is initially placed at the
+root of the tree.
+The original data is then split into two subproblems, one for each
+subtree.
+And so on.
+Eventually, the problem is solved at the leaves of the tree.
+A solution to the original problem is obtained by some mechanism
+that can reassemble the pieces.
+In fact, an implementation of the Chinese Remainder Algorithm
+using balanced binary trees was first proposed by David Y. Y.
+Yun at the IBM T. J.
+Watson Research Center in Yorktown Heights, New York, in 1978.
+It served as the prototype for polymorphic algorithms in
+Axiom.
+
+In what follows, rather than perform a series of computations with
+a single expression, the expression is reduced modulo a number of
+integer primes, a computation is done with modular arithmetic for
+each prime, and the Chinese Remainder Algorithm is used to obtain
+the answer to the original problem.
+We illustrate this principle with the computation of \texht{$12^2
+= 144$}{12 ** 2 = 144}.
+
+\xtc{
+A list of moduli.
+}{
+\spadpaste{lm := [3,5,7,11]\bound{lm}}
+}
+\xtc{
+The expression \spad{modTree(n, lm)}
+creates a balanced binary tree with leaf values
+\spad{n mod m} for each modulus \spad{m} in \spad{lm}.
+}{
+\spadpaste{modTree(12,lm)\free{lm}}
+}
+\xtc{
+Operation \spad{modTree} does this using
+operations on balanced binary trees.
+We trace its steps.
+Create a balanced binary tree \spad{t} of zeros with four leaves.
+}{
+\spadpaste{t := balancedBinaryTree(\#lm, 0)\bound{t}\free{lm}}
+}
+\xtc{
+The leaves of the tree are set to the individual moduli.
+}{
+\spadpaste{setleaves!(t,lm)\bound{t1}\free{t}}
+}
+\xtc{
+Use \spadfunX{mapUp} to do
+a bottom-up traversal of \spad{t}, setting each interior node
+to the product of the values at the nodes of its children.
+}{
+\spadpaste{mapUp!(t,_*)\bound{t2}\free{t1}}
+}
+\xtc{
+The value at the node of every subtree is the product of the moduli
+of the leaves of the subtree.
+}{
+\spadpaste{t \bound{t3}\free{t2}}
+}
+\xtc{
+Operation \spadfunX{mapDown}\spad{(t,a,fn)} replaces the value
+\spad{v} at each node of \spad{t} by \spad{fn(a,v)}.
+}{
+\spadpaste{mapDown!(t,12,_rem)\bound{t4}\free{t3}}
+}
+\xtc{
+The operation \spadfun{leaves} returns the leaves of the resulting
+tree.
+In this case, it returns the list of \spad{12 mod m} for each
+modulus \spad{m}.
+}{
+\spadpaste{leaves \%\bound{t5}\free{t4}}
+}
+\xtc{
+Compute the square of the images of \spad{12} modulo each \spad{m}.
+}{
+\spadpaste{squares := [x**2 rem m for x in \% for m in lm]\bound{t6}\free{t5}}
+}
+\xtc{
+Call the Chinese Remainder Algorithm to get the
+answer for \texht{$12^2$}{12**2}.
+}{
+\spadpaste{chineseRemainder(\%,lm)\free{t6}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{binary.ht}
+% !! DO NOT MODIFY THIS FILE BY HAND !! Created by ht.awk.
+<<binary.ht>>=
+\newcommand{\BinaryExpansionXmpTitle}{BinaryExpansion}
+\newcommand{\BinaryExpansionXmpNumber}{9.4}
+
+@
+\subsection{BinaryExpansion}
+\label{BinaryExpansionXmpPage}
+\begin{itemize}
+\item DecimalExpansionXmpPage \ref{DecimalExpansionXmpPage} on
+page~pageref{DecimalExpansionXmpPage}
+\item RadixExpansionXmpPage \ref{RadixExpansionXmpPage} on
+page~pageref{RadixExpansionXmpPage}
+\end{itemize}
+\index{pages!BinaryExpansionXmpPage!binary.ht}
+\index{binary.ht!pages!BinaryExpansionXmpPage}
+\index{BinaryExpansionXmpPage!binary.ht!pages}
+<<binary.ht>>=
+\begin{page}{BinaryExpansionXmpPage}{BinaryExpansion}
+\beginscroll
+ 
+All rational numbers have repeating binary expansions.
+Operations to access the individual bits of a binary expansion can
+be obtained by converting the value to \spadtype{RadixExpansion(2)}.
+More examples of expansions are available in
+\downlink{`DecimalExpansion'}{DecimalExpansionXmpPage}\ignore{DecimalExpansion},
+\downlink{`HexadecimalExpansion'}{HexadecimalExpansionXmpPage}\ignore{HexadecimalExpansion}, and
+\downlink{`RadixExpansion'}{RadixExpansionXmpPage}\ignore{RadixExpansion}.
+ 
+\xtc{
+The expansion (of type \spadtype{BinaryExpansion}) of a rational number
+is returned by the \spadfunFrom{binary}{BinaryExpansion} operation.
+}{
+\spadpaste{r := binary(22/7) \bound{r}}
+}
+\xtc{
+Arithmetic is exact.
+}{
+\spadpaste{r + binary(6/7) \free{r}}
+}
+\xtc{
+The period of the expansion can be short or long \ldots
+}{
+\spadpaste{[binary(1/i) for i in 102..106] }
+}
+\xtc{
+or very long.
+}{
+\spadpaste{binary(1/1007) }
+}
+\xtc{
+These numbers are bona fide algebraic objects.
+}{
+\spadpaste{p := binary(1/4)*x**2 + binary(2/3)*x + binary(4/9)  \bound{p}}
+}
+\xtc{
+}{
+\spadpaste{q := D(p, x) \free{p}\bound{q}}
+}
+\xtc{
+}{
+\spadpaste{g := gcd(p, q)            \free{p q}\bound{g}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{bmcat.ht}
+\subsection{Bit Map Catalog}
+\label{BitMaps}
+\index{pages!BitMaps!bmcat.ht}
+\index{bmcat.ht!pages!BitMaps}
+\index{BitMaps!bmcat.ht!pages}
+<<bmcat.ht>>=
+\begin{page}{BitMaps}{Bit Map Catalog}
+\beginscroll
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/1x1}}   1x1
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/2x2}}   2x2
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/black}}   black
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/boxes}}   boxes
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/cntr_ptr}}   cntr_ptr
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/cntr_ptrmsk}}   cntr_ptrmsk
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/cross_weave}}   cross_weave
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/dimple1}}   dimple1
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/dimple3}}   dimple3
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/dot}}   dot
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/flipped_gray}}   flipped_gray
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/gray}}   gray
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/gray1}}   gray1
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/gray3}}   gray3
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/icon}}   icon
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/left_ptr}}   left_ptr
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/left_ptrmsk}}   left_ptrmsk
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/light_gray}}   light_gray
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/opendot}}   opendot
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/opendotMask}}   opendotMask
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/right_ptr}}   right_ptr
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/right_ptrmsk}}   right_ptrmsk
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/root_weave}}   root_weave
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/scales}}   scales
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/sipb}}   sipb
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/star}}   star
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/starMask}}   starMask
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/stipple}}   stipple
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/target}}   target
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/tie_fighter}}   tie_fighter
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/wide_weave}}   wide_weave
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/wierd_size}}   wierd_size
+%\space{} {\inputbitmap{/usr/include/X11/bitmaps/wingdogs}}   wingdogs
+%\horizontalline
+\space{} {\inputbitmap{\htbmdir{}/xfbox.bitmap}}      xfbox    \space{4}
+\space{} {\inputbitmap{\htbmdir{}/xfcirc.bitmap}}     xfcirc   \space{4}
+\space{} {\inputbitmap{\htbmdir{}/xnobox.bitmap}}     Xnobox   \space{2}
+\space{} {\inputbitmap{\htbmdir{}/xnocirc.bitmap}}    xnocirc  \space{2}
+\newline
+\space{} {\inputbitmap{\htbmdir{}/xfullfbox.bitmap}}  xfullfbox 
+\space{} {\inputbitmap{\htbmdir{}/xfullfcirc.bitmap}} xfullfcirc
+\space{} {\inputbitmap{\htbmdir{}/xfullbox.bitmap}}   xfullbox  
+\space{} {\inputbitmap{\htbmdir{}/xfullcirc.bitmap}}  xfullcirc
+\newline
+\space{} {\inputbitmap{\htbmdir{}/xgreyfbox.bitmap}}  xgreyfbox 
+\space{} {\inputbitmap{\htbmdir{}/xgreyfcirc.bitmap}} xgreyfcirc
+\space{} {\inputbitmap{\htbmdir{}/xgreybox.bitmap}}   xgreybox  
+\space{} {\inputbitmap{\htbmdir{}/xgreycirc.bitmap}}  xgreycirc
+\newline
+\space{} {\inputbitmap{\htbmdir{}/xopenfbox.bitmap}}  xopenfbox
+\space{} {\inputbitmap{\htbmdir{}/xopenfcirc.bitmap}} xopenfcirc
+\space{} {\inputbitmap{\htbmdir{}/xopenbox.bitmap}}   xopenbox  
+\space{} {\inputbitmap{\htbmdir{}/xopencirc.bitmap}}  xopencirc
+\newline
+\space{} {\inputbitmap{\htbmdir{}/xtickfbox.bitmap}}  xtickfbox 
+\space{} {\inputbitmap{\htbmdir{}/xtickfcirc.bitmap}} xtickfcirc
+\space{} {\inputbitmap{\htbmdir{}/xtickbox.bitmap}}   xtickbox  
+\space{} {\inputbitmap{\htbmdir{}/xtickcirc.bitmap}}  xtickcirc
+\newline
+\space{} {\inputbitmap{\htbmdir{}/xxfbox.bitmap}}     xxfbox    \space{3}
+\space{} {\inputbitmap{\htbmdir{}/xxfcirc.bitmap}}    xxfcirc   \space{3}
+\space{} {\inputbitmap{\htbmdir{}/xxbox.bitmap}}      xxbox     \space{3}
+\space{} {\inputbitmap{\htbmdir{}/xxcirc.bitmap}}     xxcirc    \space{3}
+\horizontalline
+\space{} {\inputbitmap{\htbmdir{}/xnoface.bitmap}}    xnoface
+\space{} {\inputbitmap{\htbmdir{}/xhappy.bitmap}}     xhappy
+\space{} {\inputbitmap{\htbmdir{}/xsad.bitmap}}       xsad
+\space{} {\inputbitmap{\htbmdir{}/xdesp.bitmap}}      xdesp
+\space{} {\inputbitmap{\htbmdir{}/xperv.bitmap}}      xperv
+\horizontalline
+\space{} {\inputbitmap{\htbmdir{}/exit.bitmap}} exit
+\space{} {\inputbitmap{\htbmdir{}/help3.bitmap}} help3
+\newline
+\space{} {\inputbitmap{\htbmdir{}/down3.bitmap}} down3
+\space{} {\inputbitmap{\htbmdir{}/up3.bitmap}} up3
+\space{} {\inputbitmap{\htbmdir{}/return3.bitmap}} return3
+\newline
+\space{} {\inputbitmap{\htbmdir{}/tear.bitmap}} tear
+\space{} {\inputbitmap{\htbmdir{}/eqpage.bitmap}} eqpage
+\horizontalline
+\space{} {\inputbitmap{\htbmdir{}/sup.bm}} sup.bm
+\space{} {\inputbitmap{\htbmdir{}/sup.bitmap}} sup
+\space{} {\inputbitmap{\htbmdir{}/sdown.bm}} sdown.bm
+\newline
+\space{} {\inputbitmap{\htbmdir{}/ht_icon}} ht_icon
+\space{} {\inputbitmap{\htbmdir{}/smile.bitmap}} smile
+\newline
+\space{} {\inputbitmap{\htbmdir{}/drown.bm}} drown.bm
+\space{} {\inputbitmap{\htbmdir{}/help2.bitmap}} help2
+\space{} {\inputbitmap{\htbmdir{}/return.bitmap}} return
+\space{} {\inputbitmap{\htbmdir{}/back.bitmap}} back
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{bop.ht}
+<<bop.ht>>=
+\newcommand{\BasicOperatorXmpTitle}{BasicOperator}
+\newcommand{\BasicOperatorXmpNumber}{9.3}
+
+@
+\subsection{BasicOperator}
+\label{BasicOperatorXmpPage}
+\index{pages!BasicOperatorXmpPage!bop.ht}
+\index{bop.ht!pages!BasicOperatorXmpPage}
+\index{BasicOperatorXmpPage!bop.ht!pages}
+<<bop.ht>>=
+\begin{page}{BasicOperatorXmpPage}{BasicOperator}
+\beginscroll
+
+A basic operator is an object that can be symbolically
+applied to a list of arguments from a set, the result being
+a kernel over that set or an expression.
+In addition to this section, please see \downlink{`Expression'}{ExpressionXmpPage}\ignore{Expression}
+and \downlink{`Kernel'}{KernelXmpPage}\ignore{Kernel} for additional information and examples.
+
+You create an object of type \axiomType{BasicOperator} by using the
+\axiomFunFrom{operator}{BasicOperator} operation.
+This first form of this operation has one argument and it
+must be a symbol.
+The symbol should be quoted in case the
+name has been used as an identifier to which a value
+has been assigned.
+
+A frequent application of \axiomType{BasicOperator} is the
+creation of an operator to represent the unknown function when
+solving a differential equation.
+\xtc{
+Let \axiom{y} be the unknown function in terms of \axiom{x}.
+}{
+\spadpaste{y := operator 'y \bound{y}}
+}
+%
+\xtc{
+This is how you enter
+the equation \axiom{y'' + y' + y = 0}.
+}{
+\spadpaste{deq := D(y x, x, 2) + D(y x, x) + y x = 0\bound{e1}\free{y}}
+}
+%
+\xtc{
+To solve the above equation, enter this.
+}{
+\spadpaste{solve(deq, y, x) \free{e1}\free{y}}
+}
+See \downlink{``\ugProblemDEQTitle''}{ugProblemDEQPage} in Section \ugProblemDEQNumber\ignore{ugProblemDEQ}
+for this kind of use of \axiomType{BasicOperator}.
+
+Use the single argument form of
+\axiomFunFrom{operator}{BasicOperator} (as above) when you intend
+to use the operator to create functional expressions with an
+arbitrary number of arguments
+\xtc{
+{\it Nary} means an arbitrary number of arguments can be used
+in the functional expressions.
+}{
+\spadpaste{nary? y \free{y}}
+}
+\xtc{
+}{
+\spadpaste{unary? y \free{y}}
+}
+Use the two-argument form when you want to restrict the number of
+arguments in the functional expressions created with the operator.
+\xtc{
+This operator can only be used to create functional expressions
+with one argument.
+}{
+\spadpaste{opOne := operator('opOne, 1) \bound{opOne}}
+}
+\xtc{
+}{
+\spadpaste{nary? opOne \free{opOne}}
+}
+\xtc{
+}{
+\spadpaste{unary? opOne \free{opOne}}
+}
+\xtc{
+Use \axiomFunFrom{arity}{BasicOperator} to learn the number of
+arguments that can be used.
+It returns {\tt "false"} if the operator is nary.
+}{
+\spadpaste{arity opOne \free{opOne}}
+}
+\xtc{
+Use \axiomFunFrom{name}{BasicOperator} to learn the name of an
+operator.
+}{
+\spadpaste{name opOne \free{opOne}}
+}
+\xtc{
+Use \axiomFunFrom{is?}{BasicOperator} to learn if an operator has a
+particular name.
+}{
+\spadpaste{is?(opOne, 'z2) \free{opOne}}
+}
+\xtc{
+You can also use a string as the name to be tested against.
+}{
+\spadpaste{is?(opOne, "opOne") \free{opOne}}
+}
+
+You can attached named properties to an operator.
+These are rarely used at the top-level of the Axiom
+interactive environment but are used with Axiom
+library source code.
+\xtc{
+By default, an operator has no properties.
+}{
+\spadpaste{properties y \free{y}}
+}
+The interface for setting and getting properties is somewhat awkward
+because the property values are stored as values of type
+\axiomType{None}.
+\xtc{
+Attach a property by using \axiomFunFrom{setProperty}{BasicOperator}.
+}{
+\spadpaste{setProperty(y, "use", "unknown function" :: None ) \free{y}\bound{spy}}
+}
+\xtc{
+}{
+\spadpaste{properties y \free{y spy}}
+}
+\xtc{
+We {\it know} the property value has type \axiomType{String}.
+}{
+\spadpaste{property(y, "use") :: None pretend String \free{y spy}}
+}
+\xtc{
+Use \axiomFunFrom{deleteProperty!}{BasicOperator} to destructively
+remove a property.
+}{
+\spadpaste{deleteProperty!(y, "use") \free{y spy}\bound{dpy}}
+}
+\xtc{
+}{
+\spadpaste{properties y \free{dpy}}
+}
+\endscroll
+\autobuttons
+\end{page}
+%
+@
+\section{bstree.ht}
+<<bstree.ht>>=
+\newcommand{\BinarySearchTreeXmpTitle}{BinarySearchTree}
+\newcommand{\BinarySearchTreeXmpNumber}{9.5}
+
+@
+\subsection{BinarySearchTree}
+\label{BinarySearchTreeXmpPage}
+\index{pages!BinarySearchTreeXmpPage!bstree.ht}
+\index{bstree.ht!pages!BinarySearchTreeXmpPage}
+\index{BinarySearchTreeXmpPage!bstree.ht!pages}
+<<bstree.ht>>=
+\begin{page}{BinarySearchTreeXmpPage}{BinarySearchTree}
+\beginscroll
+\spadtype{BinarySearchTree(R)} is the domain of binary trees with
+elements of type \spad{R}, ordered across the nodes of the tree.
+A non-empty binary search tree has a value
+of type \spad{R}, and \spadfun{right} and \spadfun{left}
+binary search subtrees.
+If a subtree is empty, it is displayed as a period (``.'').
+
+\xtc{
+Define a list of values to be placed across the tree.
+The resulting tree has \spad{8} at the root;
+all other elements are in the left subtree.
+}{
+\spadpaste{lv := [8,3,5,4,6,2,1,5,7]\bound{lv}}
+}
+\xtc{
+A convenient way to create a binary search tree is to
+apply the operation \spadfun{binarySearchTree} to a list of elements.
+}{
+\spadpaste{t := binarySearchTree lv\free{lv}\bound{t}}
+}
+\xtc{
+Another approach is to first create an empty binary search tree of integers.
+}{
+\spadpaste{emptybst := empty()\$BSTREE(INT)\bound{e}}
+}
+\xtc{
+Insert the value \spad{8}.
+This establishes \spad{8} as the root of the binary search tree.
+Values inserted later that are less than \spad{8} get stored in
+the \spadfun{left} subtree, others in the \spadfun{right} subtree.
+}{
+\spadpaste{t1 := insert!(8,emptybst)\free{e}\bound{t1}}
+}
+\xtc{
+Insert the value \spad{3}. This number becomes the root of the
+\spadfun{left} subtree of \spad{t1}.
+For optimal retrieval, it is thus important to insert the
+middle elements first.
+}{
+\spadpaste{insert!(3,t1)\free{t1}}
+}
+\xtc{
+We go back to the original tree \spad{t}.
+The leaves of the binary search tree are those which have empty
+\spadfun{left} and \spadfun{right} subtrees.
+}{
+\spadpaste{leaves t\free{t}}
+}
+\xtc{
+The operation
+\spadfun{split}\spad{(k,t)} returns a \spadgloss{record} containing
+the two subtrees: one with all elements ``less'' than \spad{k},
+another with elements ``greater'' than \spad{k}.
+}{
+\spadpaste{split(3,t)\free{t}}
+}
+\xtc{
+Define \userfun{insertRoot} to insert new elements by
+creating a new node.
+}{
+\spadpaste{insertRoot: (INT,BSTREE INT) -> BSTREE INT\bound{x}}
+}
+\xtc{
+The new node puts the inserted value between its
+``less'' tree and ``greater'' tree.
+}{
+\begin{spadsrc}[\bound{x1}\free{x}]
+insertRoot(x, t) ==
+    a := split(x, t)
+    node(a.less, x, a.greater)
+\end{spadsrc}
+}
+\xtc{
+Function \userfun{buildFromRoot} builds
+a binary search tree from a list of elements \spad{ls}
+and the empty tree \spad{emptybst}.
+}{
+\spadpaste{buildFromRoot ls == reduce(insertRoot,ls,emptybst)\bound{x2}\free{x1 e}}
+}
+\xtc{
+Apply this to the reverse of the list \spad{lv}.
+}{
+\spadpaste{rt := buildFromRoot reverse lv\bound{rt}\free{lv x2}}
+}
+\xtc{
+Have Axiom check that these are equal.
+}{
+\spadpaste{(t = rt)@Boolean\free{rt t}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{card.ht}
+<<card.ht>>=
+\newcommand{\CardinalNumberXmpTitle}{CardinalNumber}
+\newcommand{\CardinalNumberXmpNumber}{9.6}
+
+@
+\subsection{CardinalNumber}
+\label{CardinalNumberXmpPage}
+\index{pages!CardinalNumberXmpPage!card.ht}
+\index{card.ht!pages!CardinalNumberXmpPage}
+\index{CardinalNumberXmpPage!card.ht!pages}
+<<card.ht>>=
+\begin{page}{CardinalNumberXmpPage}{CardinalNumber}
+\beginscroll
+
+The \spadtype{CardinalNumber} domain can be used for values indicating
+the cardinality of sets, both finite and infinite.
+For example, the \spadfunFrom{dimension}{VectorSpace} operation in the
+category \spadtype{VectorSpace} returns a cardinal number.
+
+The non-negative integers have a natural construction as cardinals
+\begin{verbatim}
+0 = #{ }, 1 = {0}, 2 = {0, 1}, ..., n = {i | 0 <= i < n}.
+\end{verbatim}
+The fact that \spad{0} acts as a zero for the multiplication of cardinals is
+equivalent to the axiom of choice.
+
+\xtc{
+Cardinal numbers can be created by conversion from non-negative integers.
+}{
+\spadpaste{c0 := 0 :: CardinalNumber \bound{c0}}
+}
+\xtc{
+}{
+\spadpaste{c1 := 1 :: CardinalNumber \bound{c1}}
+}
+\xtc{
+}{
+\spadpaste{c2 := 2 :: CardinalNumber \bound{c2}}
+}
+\xtc{
+}{
+\spadpaste{c3 := 3 :: CardinalNumber \bound{c3}}
+}
+\xtc{
+They can also be obtained as the named cardinal \spad{Aleph(n)}.
+}{
+\spadpaste{A0 := Aleph 0 \bound{A0}}
+}
+\xtc{
+}{
+\spadpaste{A1 := Aleph 1 \bound{A1}}
+}
+\xtc{
+The \spadfunFrom{finite?}{CardinalNumber} operation tests whether a value is a
+finite cardinal, that is, a non-negative integer.
+}{
+\spadpaste{finite? c2 \free{c2}}
+}
+\xtc{
+}{
+\spadpaste{finite? A0 \free{A0}}
+}
+\xtc{
+Similarly, the \spadfunFrom{countable?}{CardinalNumber}
+operation determines whether a value is
+a countable cardinal, that is, finite or \spad{Aleph(0)}.
+}{
+\spadpaste{countable? c2 \free{c2}}
+}
+\xtc{
+}{
+\spadpaste{countable? A0 \free{A0}}
+}
+\xtc{
+}{
+\spadpaste{countable? A1 \free{A1}}
+}
+Arithmetic operations are defined on cardinal numbers as follows:
+If \spad{x = \#X}  and  \spad{y = \#Y} then
+
+\indent{0}
+\spad{x+y  = \#(X+Y)} \tab{20} cardinality of the disjoint union \newline
+\spad{x-y  = \#(X-Y)} \tab{20} cardinality of the relative complement \newline
+\spad{x*y  = \#(X*Y)} \tab{20} cardinality of the Cartesian product \newline
+\spad{x**y = \#(X**Y)}\tab{20} cardinality of the set of maps from \spad{Y} to \spad{X} \newline
+
+\xtc{
+Here are some arithmetic examples.
+}{
+\spadpaste{[c2 + c2, c2 + A1] \free{c2 A1}}
+}
+\xtc{
+}{
+\spadpaste{[c0*c2, c1*c2, c2*c2, c0*A1, c1*A1, c2*A1, A0*A1] \free{c0,c1,c2,A0,A1}}
+}
+\xtc{
+}{
+\spadpaste{[c2**c0, c2**c1, c2**c2, A1**c0, A1**c1, A1**c2] \free{c0,c1,c2,A1}}
+}
+\xtc{
+Subtraction is a partial operation: it is not defined
+when subtracting a larger cardinal from a smaller one, nor
+when subtracting two equal infinite cardinals.
+}{
+\spadpaste{[c2-c1, c2-c2, c2-c3, A1-c2, A1-A0, A1-A1] \free{c1,c2,c3,A0,A1}}
+}
+The generalized continuum hypothesis asserts that
+\begin{verbatim}
+2**Aleph i = Aleph(i+1)
+\end{verbatim}
+and is independent of the axioms of set theory.\footnote{Goedel,
+{\it The consistency of the continuum hypothesis,}
+Ann. Math. Studies, Princeton Univ. Press, 1940.}
+\xtc{
+The \spadtype{CardinalNumber} domain provides an operation to assert
+whether the hypothesis is to be assumed.
+}{
+\spadpaste{generalizedContinuumHypothesisAssumed true \bound{GCH}}
+}
+\xtc{
+When the generalized continuum hypothesis
+is assumed, exponentiation to a transfinite power is allowed.
+}{
+\spadpaste{[c0**A0, c1**A0, c2**A0, A0**A0, A0**A1, A1**A0, A1**A1] \free{c0,c1,c2,A0,A1,GCH}}
+}
+
+Three commonly encountered cardinal numbers are
+
+\indent{0}
+\spad{a = \#}{\bf Z} \tab{20}       countable infinity \newline
+\spad{c = \#}{\bf R} \tab{20}      the continuum       \newline
+\spad{f = \#\{g| g: [0,1] -> {\bf R}\}}                \newline
+
+\xtc{
+In this domain, these values are obtained under the
+generalized continuum hypothesis in this way.
+}{
+\spadpaste{a := Aleph 0 \free{GCH}\bound{a}}
+}
+\xtc{
+}{
+\spadpaste{c := 2**a    \free{a}  \bound{c}}
+}
+\xtc{
+}{
+\spadpaste{f := 2**c    \free{c}  \bound{f}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{carten.ht}
+<<carten.ht>>=
+\newcommand{\CartesianTensorXmpTitle}{CartesianTensor}
+\newcommand{\CartesianTensorXmpNumber}{9.7}
+
+@
+\subsection{CartesianTensor}
+\label{CartesianTensorXmpPage}
+\index{pages!CartesianTensorXmpPage!carten.ht}
+\index{carten.ht!pages!CartesianTensorXmpPage}
+\index{CartesianTensorXmpPage!carten.ht!pages}
+<<carten.ht>>=
+\begin{page}{CartesianTensorXmpPage}{CartesianTensor}
+\beginscroll
+
+\spadtype{CartesianTensor(i0,dim,R)}
+provides Cartesian tensors with
+components belonging to a commutative ring \spad{R}.
+Tensors can be described as a generalization of vectors and matrices.
+This gives a concise {\it tensor algebra} for multilinear objects
+supported by the \spadtype{CartesianTensor} domain.
+You can form the inner or outer product of any two tensors and you can add
+or subtract tensors with the same number of components.
+Additionally, various forms of traces and transpositions are useful.
+
+The \spadtype{CartesianTensor} constructor allows you to specify the
+minimum index for subscripting.
+In what follows we discuss in detail how to manipulate tensors.
+
+\xtc{
+Here we construct the domain of Cartesian tensors of dimension 2 over the
+integers, with indices starting at 1.
+}{
+\spadpaste{CT := CARTEN(i0 := 1, 2, Integer) \bound{CT i0}}
+}
+
+\subsubsection{Forming tensors}
+
+\labelSpace{2pc}
+\xtc{
+Scalars can be converted to tensors of rank zero.
+}{
+\spadpaste{t0: CT := 8 \free{CT}\bound{t0}}
+}
+\xtc{
+}{
+\spadpaste{rank t0 \free{t0}}
+}
+\xtc{
+Vectors (mathematical direct products, rather than one dimensional array
+structures) can be converted to tensors of rank one.
+}{
+\spadpaste{v: DirectProduct(2, Integer) := directProduct [3,4] \bound{v}}
+}
+\xtc{
+}{
+\spadpaste{Tv: CT := v \free{v CT}\bound{Tv}}
+}
+\xtc{
+Matrices can be converted to tensors of rank two.
+}{
+\spadpaste{m: SquareMatrix(2, Integer) := matrix [[1,2],[4,5]] \bound{m}}
+}
+\xtc{
+}{
+\spadpaste{Tm: CT := m \bound{Tm}\free{CT m}}
+}
+\xtc{
+}{
+\spadpaste{n: SquareMatrix(2, Integer) := matrix [[2,3],[0,1]] \bound{n}}
+}
+\xtc{
+}{
+\spadpaste{Tn: CT := n \bound{Tn}\free{CT n}}
+}
+\xtc{
+In general, a tensor of rank \spad{k} can be formed by making a
+list of rank \spad{k-1} tensors or, alternatively, a \spad{k}-deep nested
+list of lists.
+}{
+\spadpaste{t1: CT := [2, 3] \free{CT}\bound{t1}}
+}
+\xtc{
+}{
+\spadpaste{rank t1 \free{t1}}
+}
+\xtc{
+}{
+\spadpaste{t2: CT := [t1, t1] \free{CT t1}\bound{t2}}
+}
+\xtc{
+}{
+\spadpaste{t3: CT := [t2, t2] \free{CT t2}\bound{t3}}
+}
+\xtc{
+}{
+\spadpaste{tt: CT := [t3, t3]; tt := [tt, tt] \free{CT t3}\bound{tt}}
+}
+\xtc{
+}{
+\spadpaste{rank tt \free{tt}}
+}
+
+\subsubsection{Multiplication}
+%\head{subsection}{Multiplication}{ugxCartenMult}
+
+Given two tensors of rank \spad{k1} and \spad{k2}, the outer
+{CartesianTensor}
+\spadfunFrom{product}{CartesianTensor} forms a new tensor of rank
+\spad{k1+k2}.
+\xtc{
+Here
+\texht{$T_{mn}(i,j,k,l) = T_m(i,j) \  T_n(k,l).$}{%
+\spad{Tmn(i,j,k,l) = Tm(i,j)*Tn(k,l).}}
+}{
+\spadpaste{Tmn := product(Tm, Tn)\free{Tm Tn}\bound{Tmn}}
+}
+
+The inner product (\spadfunFrom{contract}{CartesianTensor}) forms a tensor
+{CartesianTensor}
+of rank \spad{k1+k2-2}.
+This product generalizes the vector dot product and matrix-vector product
+by summing component products along two indices.
+\xtc{
+Here we sum along the second index of \texht{$T_m$}{\spad{Tm}} and the
+first index of \texht{$T_v$}{\spad{Tv}}.
+Here
+\texht{$T_{mv} = \sum_{j=1}^{\hbox{\tiny\rm dim}} T_m(i,j) \  T_v(j)$}{%
+\spad{Tmv(i) = sum Tm(i,j) * Tv(j) for j in 1..dim.}}
+}{
+\spadpaste{Tmv := contract(Tm,2,Tv,1)\free{Tm Tv}\bound{Tmv}}
+}
+
+The multiplication operator \spadopFrom{*}{CartesianTensor} is scalar
+multiplication or an inner product depending on the ranks of the
+arguments.
+\xtc{
+If either argument is rank zero it is treated as scalar multiplication.
+Otherwise, \spad{a*b} is the inner product summing the last index of
+\spad{a} with the first index of \spad{b}.
+}{
+\spadpaste{Tm*Tv \free{Tm Tv}}
+}
+\xtc{
+This definition is consistent with the inner product on matrices
+and vectors.
+}{
+\spadpaste{Tmv = m * v \free{Tmv m v}}
+}
+
+\subsubsection{Selecting Components}
+%\head{subsection}{Selecting Components}{ugxCartenSelect}
+
+\labelSpace{2pc}
+\xtc{
+For tensors of low rank (that is, four or less), components can be selected
+by applying the tensor to its indices.
+}{
+\spadpaste{t0()      \free{t0}}
+}
+\xtc{
+}{
+\spadpaste{t1(1+1)   \free{t1}}
+}
+\xtc{
+}{
+\spadpaste{t2(2,1)   \free{t2}}
+}
+\xtc{
+}{
+\spadpaste{t3(2,1,2) \free{t3}}
+}
+\xtc{
+}{
+\spadpaste{Tmn(2,1,2,1) \free{Tmn}}
+}
+\xtc{
+A general indexing mechanism is provided for a list of indices.
+}{
+\spadpaste{t0[]        \free{t0}}
+}
+\xtc{
+}{
+\spadpaste{t1[2]        \free{t1}}
+}
+\xtc{
+}{
+\spadpaste{t2[2,1]      \free{t2}}
+}
+\xtc{
+The general mechanism works for tensors of arbitrary rank, but is
+somewhat less efficient since the intermediate index list must be created.
+}{
+\spadpaste{t3[2,1,2]    \free{t3}}
+}
+\xtc{
+}{
+\spadpaste{Tmn[2,1,2,1] \free{Tmn}}
+}
+
+\subsubsection{Contraction}
+%\head{subsection}{Contraction}{ugxCartenContract}
+
+A ``contraction'' between two tensors is an inner product, as we have
+seen above.
+You can also contract a pair of indices of a single tensor.
+This corresponds to a ``trace'' in linear algebra.
+The expression \spad{contract(t,k1,k2)} forms a new tensor by summing the
+diagonal given by indices in position \spad{k1} and \spad{k2}.
+\xtc{
+This is the tensor given by
+\texht{$xT_{mn} = \sum_{k=1}^{\hbox{\tiny\rm dim}} T_{mn}(k,k,i,j).$}{%
+\spad{cTmn(i,j) = sum Tmn(k,k,i,j) for k in 1..dim.}}
+}{
+\spadpaste{cTmn := contract(Tmn,1,2) \free{Tmn}\bound{cTmn}}
+}
+\xtc{
+Since \spad{Tmn} is the outer product of matrix \spad{m} and matrix \spad{n},
+the above is equivalent to this.
+}{
+\spadpaste{trace(m) * n \free{m n}}
+}
+\xtc{
+In this and the next few examples,
+we show all possible contractions of \spad{Tmn} and their matrix
+algebra equivalents.
+}{
+\spadpaste{contract(Tmn,1,2) = trace(m) * n      \free{Tmn m n}}
+}
+\xtc{
+}{
+\spadpaste{contract(Tmn,1,3) = transpose(m) * n  \free{Tmn m n}}
+}
+\xtc{
+}{
+\spadpaste{contract(Tmn,1,4) = transpose(m) * transpose(n) \free{Tmn m n}}
+}
+\xtc{
+}{
+\spadpaste{contract(Tmn,2,3) = m * n             \free{Tmn m n}}
+}
+\xtc{
+}{
+\spadpaste{contract(Tmn,2,4) = m * transpose(n)  \free{Tmn m n}}
+}
+\xtc{
+}{
+\spadpaste{contract(Tmn,3,4) = trace(n) * m      \free{Tmn m n}}
+}
+
+\subsubsection{Transpositions}
+%\head{subsection}{Transpositions}{ugxCartenTranspos}
+
+You can exchange any desired pair of indices using the
+\spadfunFrom{transpose}{CartesianTensor} operation.
+
+\labelSpace{1pc}
+\xtc{
+Here the indices in positions one and three are exchanged, that is,
+\texht{$tT_{mn}(i,j,k,l) = T_{mn}(k,j,i,l).$}{%
+\spad{tTmn(i,j,k,l) = Tmn(k,j,i,l).}}
+}{
+\spadpaste{tTmn := transpose(Tmn,1,3) \free{tTmn}}
+}
+\xtc{
+If no indices are specified, the first and last index are exchanged.
+}{
+\spadpaste{transpose Tmn \free{Tmn}}
+}
+\xtc{
+This is consistent with the matrix transpose.
+}{
+\spadpaste{transpose Tm = transpose m \free{Tm m}}
+}
+
+If a more complicated reordering of the indices is required, then the
+\spadfunFrom{reindex}{CartesianTensor} operation can be used.
+This operation allows the indices to be arbitrarily permuted.
+\xtc{
+This defines
+\texht{$rT_{mn}(i,j,k,l) = \allowbreak T_{mn}(i,l,j,k).$}{%
+\spad{rTmn(i,j,k,l) = Tmn(i,l,j,k).}}
+}{
+\spadpaste{rTmn := reindex(Tmn, [1,4,2,3]) \free{Tmn}\bound{rTmn}}
+}
+
+\subsubsection{Arithmetic}
+%\head{subsection}{Arithmetic}{ugxCartenArith}
+
+\labelSpace{2pc}
+\xtc{
+Tensors of equal rank can be added or subtracted so arithmetic
+expressions can be used to produce new tensors.
+}{
+\spadpaste{tt := transpose(Tm)*Tn - Tn*transpose(Tm) \free{Tm Tn}\bound{tt2}}
+}
+\xtc{
+}{
+\spadpaste{Tv*(tt+Tn) \free{tt2 Tv Tn}}
+}
+\xtc{
+}{
+\spadpaste{reindex(product(Tn,Tn),[4,3,2,1])+3*Tn*product(Tm,Tm) \free{Tm Tn}}
+}
+
+\subsubsection{Specific Tensors}
+%\head{subsection}{Specific Tensors}{ugxCartenSpecific}
+
+Two specific tensors have properties which depend only on the
+dimension.
+
+\labelSpace{1pc}
+\xtc{
+The Kronecker delta satisfies
+\texht{}{%
+\begin{verbatim}
+             +-
+             |   1  if i  = j
+delta(i,j) = |
+             |   0  if i ^= j
+             +-
+\end{verbatim}
+}%
+}{
+\spadpaste{delta:  CT := kroneckerDelta()   \free{CT}\bound{delta}}
+}
+\xtc{
+This can be used to reindex via contraction.
+}{
+\spadpaste{contract(Tmn, 2, delta, 1) = reindex(Tmn, [1,3,4,2]) \free{Tmn delta}}
+}
+
+\xtc{
+The Levi Civita symbol determines the sign of a permutation of indices.
+}{
+\spadpaste{epsilon:CT := leviCivitaSymbol() \free{CT}\bound{epsilon}}
+}
+Here we have:
+\texht{}{%
+\begin{verbatim}
+epsilon(i1,...,idim)
+     = +1  if i1,...,idim is an even permutation of i0,...,i0+dim-1
+     = -1  if i1,...,idim is an  odd permutation of i0,...,i0+dim-1
+     =  0  if i1,...,idim is not   a permutation of i0,...,i0+dim-1
+\end{verbatim}
+}
+\xtc{
+This property can be used to form determinants.
+}{
+\spadpaste{contract(epsilon*Tm*epsilon, 1,2) = 2 * determinant m \free{epsilon Tm m}}
+}
+
+\subsubsection{Properties of the CartesianTensor domain}
+%\head{subsection}{Properties of the CartesianTensor domain}{ugxCartenProp}
+
+\spadtype{GradedModule(R,E)} denotes ``\spad{E}-graded \spad{R}-module'',
+that is, a collection of \spad{R}-modules indexed by an abelian monoid
+\spad{E.}
+An element \spad{g} of \spad{G[s]} for some specific \spad{s}
+in \spad{E} is said to be an element of \spad{G} with
+\spadfunFrom{degree}{GradedModule} \spad{s}.
+Sums are defined in each module \spad{G[s]} so two elements of
+\spad{G} can be added if they have the same degree.
+Morphisms can be defined and composed by degree to give the
+mathematical category of graded modules.
+
+\spadtype{GradedAlgebra(R,E)} denotes ``\spad{E}-graded \spad{R}-algebra.''
+{CartesianTensor}
+A graded algebra is a graded module together with a degree preserving
+\spad{R}-bilinear map, called the \spadfunFrom{product}{GradedAlgebra}.
+
+\begin{verbatim}
+degree(product(a,b))= degree(a) + degree(b)
+
+product(r*a,b) = product(a,r*b) = r*product(a,b)
+product(a1+a2,b) = product(a1,b) + product(a2,b)
+product(a,b1+b2) = product(a,b1) + product(a,b2)
+product(a,product(b,c)) = product(product(a,b),c)
+\end{verbatim}
+
+The domain \spadtype{CartesianTensor(i0, dim, R)} belongs
+to the category \spadtype{GradedAlgebra(R, NonNegativeInteger)}.
+The non-negative integer \spadfunFrom{degree}{GradedAlgebra}
+is the tensor rank
+and the graded algebra \spadfunFrom{product}{GradedAlgebra}
+is the tensor outer product.
+The graded module addition captures the notion that
+only tensors of equal rank can be added.
+
+If \spad{V} is a vector space of dimension \spad{dim} over \spad{R},
+then the tensor module \spad{T[k](V)} is defined as
+\begin{verbatim}
+T[0](V) = R
+T[k](V) = T[k-1](V) * V
+\end{verbatim}
+where \spadop{*} denotes the \spad{R}-module tensor
+\spadfunFrom{product}{GradedAlgebra}.
+\spadtype{CartesianTensor(i0,dim,R)} is the graded algebra in which
+the degree \spad{k} module is \spad{T[k](V)}.
+
+\subsubsection{Tensor Calculus}
+%\head{subsection}{Tensor Calculus}{ugxCartenCalculus}
+
+It should be noted here that often tensors are used in the context of
+tensor-valued manifold maps.
+This leads to the notion of covariant and contravariant bases with tensor
+component functions transforming in specific ways under a change of
+coordinates on the manifold.
+This is no more directly supported by the \spadtype{CartesianTensor}
+domain than it is by the \spadtype{Vector} domain.
+However, it is possible to have the components implicitly represent
+component maps by choosing a polynomial or expression type for the
+components.
+In this case, it is up to the user to satisfy any constraints which arise
+on the basis of this interpretation.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{cclass.ht}
+<<cclass.ht>>=
+\newcommand{\CharacterClassXmpTitle}{CharacterClass}
+\newcommand{\CharacterClassXmpNumber}{9.9}
+
+@
+\subsection{CharacterClass}
+\label{CharacterClassXmpPage}
+\index{pages!CharacterClassXmpPage!cclass.ht}
+\index{cclass.ht!pages!CharacterClassXmpPage}
+\index{CharacterClassXmpPage!cclass.ht!pages}
+<<cclass.ht>>=
+\begin{page}{CharacterClassXmpPage}{CharacterClass}
+\beginscroll
+ 
+The \spadtype{CharacterClass} domain allows classes of characters to be
+defined and manipulated efficiently.
+ 
+\xtc{
+Character classes can be created by giving either a string or a list
+of characters.
+}{
+\spadpaste{cl1 := charClass [char "a", char "e", char "i", char "o", char "u", char "y"] \bound{cl1}}
+}
+\xtc{
+}{
+\spadpaste{cl2 := charClass "bcdfghjklmnpqrstvwxyz" \bound{cl2}}
+}
+\xtc{
+A number of character classes are predefined for convenience.
+}{
+\spadpaste{digit()}
+}
+\xtc{
+}{
+\spadpaste{hexDigit()}
+}
+\xtc{
+}{
+\spadpaste{upperCase()}
+}
+\xtc{
+}{
+\spadpaste{lowerCase()}
+}
+\xtc{
+}{
+\spadpaste{alphabetic()}
+}
+\xtc{
+}{
+\spadpaste{alphanumeric()}
+}
+\xtc{
+You can quickly test whether a character belongs to a class.
+}{
+\spadpaste{member?(char "a", cl1) \free{cl1}}
+}
+\xtc{
+}{
+\spadpaste{member?(char "a", cl2) \free{cl2}}
+}
+\xtc{
+Classes have the usual set operations because
+the \spadtype{CharacterClass} domain belongs to the category
+\spadtype{FiniteSetAggregate(Character)}.
+}{
+\spadpaste{intersect(cl1, cl2)  \free{cl1 cl2}}
+}
+\xtc{
+}{
+\spadpaste{union(cl1,cl2)       \free{cl1 cl2}}
+}
+\xtc{
+}{
+\spadpaste{difference(cl1,cl2)  \free{cl1 cl2}}
+}
+\xtc{
+}{
+\spadpaste{intersect(complement(cl1),cl2)  \free{cl1 cl2}}
+}
+\xtc{
+You can modify character classes by adding or removing characters.
+}{
+\spadpaste{insert!(char "a", cl2) \free{cl2}\bound{cl22}}
+}
+\xtc{
+}{
+\spadpaste{remove!(char "b", cl2) \free{cl22}\bound{cl23}}
+}
+ 
+For more information on related topics, see
+\downlink{`Character'}{CharacterXmpPage}\ignore{Character} and
+\downlink{`String'}{StringXmpPage}\ignore{String}.
+%
+\showBlurb{CharacterClass}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{char.ht}
+<<char.ht>>=
+\newcommand{\CharacterXmpTitle}{Character}
+\newcommand{\CharacterXmpNumber}{9.8}
+
+@
+\subsection{Character}
+\label{CharacterXmpPage}
+\begin{itemize}
+\item CharacterClassXmpPage \ref{CharacterClassXmpPage} on
+page~\pageref{CharacterClassXmpPage}
+\item StringXmpPage \ref{StringXmpPage} on
+page~\pageref{StringXmpPage}
+\end{itemize}
+\index{pages!CharacterXmpPage!char.ht}
+\index{char.ht!pages!CharacterXmpPage}
+\index{CharacterXmpPage!char.ht!pages}
+<<char.ht>>=
+\begin{page}{CharacterXmpPage}{Character}
+\beginscroll
+ 
+The members of the domain \spadtype{Character} are values
+representing letters, numerals and other text elements.
+For more information on related topics, see
+\downlink{`CharacterClass'}{CharacterClassXmpPage}\ignore{CharacterClass} 
+and \downlink{`String'}{StringXmpPage}\ignore{String}.
+ 
+\xtc{
+Characters can be obtained using \spadtype{String} notation.
+}{
+\spadpaste{chars := [char "a", char "A", char "X", char "8", char "+"] \bound{chars}}
+}
+\xtc{
+Certain characters are available by name.
+This is the blank character.
+}{
+\spadpaste{space()}
+}
+\xtc{
+This is the quote that is used in strings.
+}{
+\spadpaste{quote()}
+}
+\xtc{
+This is the escape character that allows quotes and other characters
+within strings.
+}{
+\spadpaste{escape()}
+}
+\xtc{
+Characters are represented as integers in a machine-dependent way.
+The integer value can be obtained using the \spadfunFrom{ord}{Character}
+operation.
+It is always true that \spad{char(ord c) = c} and \spad{ord(char i) = i},
+provided that \spad{i} is in the range \spad{0..size()\$Character-1}.
+}{
+\spadpaste{[ord c for c in chars] \free{chars}}
+}
+ 
+\xtc{
+The \spadfunFrom{lowerCase}{Character} operation converts an upper case
+letter to the corresponding lower case letter.
+If the argument is not an upper case letter, then it is returned
+unchanged.
+}{
+\spadpaste{[upperCase c for c in chars] \free{chars}}
+}
+\xtc{
+Likewise, the \spadfunFrom{upperCase}{Character} operation converts lower
+case letters to upper case.
+}{
+\spadpaste{[lowerCase c for c in chars] \free{chars}}
+}
+ 
+\xtc{
+A number of tests are available to determine whether characters
+belong to certain families.
+}{
+\spadpaste{[alphabetic? c for c in chars] \free{chars}}
+}
+\xtc{
+}{
+\spadpaste{[upperCase? c for c in chars] \free{chars}}
+}
+\xtc{
+}{
+\spadpaste{[lowerCase? c for c in chars] \free{chars}}
+}
+\xtc{
+}{
+\spadpaste{[digit? c for c in chars] \free{chars}}
+}
+\xtc{
+}{
+\spadpaste{[hexDigit? c for c in chars] \free{chars}}
+}
+\xtc{
+}{
+\spadpaste{[alphanumeric? c for c in chars] \free{chars}}
+}
+\endscroll
+\autobuttons
+\end{page}
+%
+
+@
+\section{clif.ht}
+\newcommand{\CliffordAlgebraXmpTitle}{CliffordAlgebra}
+\newcommand{\CliffordAlgebraXmpNumber}{9.10}
+
+@
+\subsection{CliffordAlgebra}
+\label{CliffordAlgebraXmpPage}
+\begin{itemize}
+\item ugxCliffordComplexPage \ref{ugxCliffordComplexPage} on
+page~pageref{ugxCliffordComplexPage}
+\item ugxCliffordQuaternPage \ref{ugxCliffordQuaternPage} on
+page~pageref{ugxCliffordQuaternPage}
+\item ugxCliffordExteriorPage \ref{ugxCliffordExteriorPage} on
+page~pageref{ugxCliffordExteriorPage}
+\item ugxCliffordDiracPage \ref{ugxCliffordDiracPage} on
+page~pageref{ugxCliffordDiracPage}
+\end{itemize}
+\index{pages!CliffordAlgebraXmpPage!clif.ht}
+\index{clif.ht!pages!CliffordAlgebraXmpPage}
+\index{CliffordAlgebraXmpPage!clif.ht!pages}
+<<clif.ht>>=
+\begin{page}{CliffordAlgebraXmpPage}{CliffordAlgebra}
+\beginscroll
+
+\noindent
+\spadtype{CliffordAlgebra(n,K,Q)} defines a vector space of dimension
+\texht{$2^n$}{\spad{2**n}} over the field \texht{$K$}{\spad{K}} with a
+given quadratic form \spad{Q}.
+If \texht{$\{e_1, \ldots, e_n\}$}{\spad{\{e(i), 1<=i<=n\}}}
+is a basis for  \texht{$K^n$}{\spad{K**n}} then
+\begin{verbatim}
+{ 1,
+  e(i) 1 <= i <= n,
+  e(i1)*e(i2) 1 <= i1 < i2 <=n,
+  ...,
+  e(1)*e(2)*...*e(n) }
+\end{verbatim}
+is a basis for the Clifford algebra.
+The algebra is defined by the relations
+\begin{verbatim}
+e(i)*e(i) = Q(e(i))
+e(i)*e(j) = -e(j)*e(i),  i ^= j
+\end{verbatim}
+Examples of Clifford Algebras are
+gaussians (complex numbers), quaternions,
+exterior algebras and spin algebras.
+%
+
+\beginmenu
+    \menudownlink{{9.10.1. The Complex Numbers as a Clifford Algebra}}
+{ugxCliffordComplexPage}
+    \menudownlink{{9.10.2. The Quaternion Numbers as a Clifford Algebra}}
+{ugxCliffordQuaternPage}
+    \menudownlink{{9.10.3. The Exterior Algebra on a Three Space}}
+{ugxCliffordExteriorPage}
+    \menudownlink{{9.10.4. The Dirac Spin Algebra}}
+{ugxCliffordDiracPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<clif.ht>>=
+\newcommand{\ugxCliffordComplexTitle}
+{The Complex Numbers as a Clifford Algebra}
+\newcommand{\ugxCliffordComplexNumber}{9.10.1.}
+
+@
+\subsection{The Complex Numbers as a Clifford Algebra}
+\label{ugxCliffordComplexPage}
+See ComplexXmpPage \ref{ComplexXmpPage} on page~\pageref{ComplexXmpPage}
+\index{pages!ugxCliffordComplexPage!clif.ht}
+\index{clif.ht!pages!ugxCliffordComplexPage}
+\index{ugxCliffordComplexPage!clif.ht!pages}
+<<clif.ht>>=
+\begin{page}{ugxCliffordComplexPage}{The Complex Numbers as a Clifford Algebra}
+\beginscroll
+
+\labelSpace{5pc}
+\xtc{
+This is the field over which we will work, rational functions with
+integer coefficients.
+}{
+\spadpaste{K := Fraction Polynomial Integer \bound{K}}
+}
+\xtc{
+We use this matrix for the quadratic form.
+}{
+\spadpaste{m := matrix [[-1]] \bound{m}}
+}
+\xtc{
+We get complex arithmetic by using this domain.
+}{
+\spadpaste{C := CliffordAlgebra(1, K, quadraticForm m) \free{K m}\bound{C}}
+}
+\xtc{
+Here is \spad{i}, the usual square root of \spad{-1.}
+}{
+\spadpaste{i: C := e(1)   \bound{i}\free{C}}
+}
+\xtc{
+Here are some examples of the arithmetic.
+}{
+\spadpaste{x := a + b * i \bound{x}\free{i}}
+}
+\xtc{
+}{
+\spadpaste{y := c + d * i \bound{y}\free{i}}
+}
+\xtc{
+See \downlink{`Complex'}{ComplexXmpPage}\ignore{Complex} 
+for examples of Axiom's constructor
+implementing complex numbers.
+}{
+\spadpaste{x * y \free{x y}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<clif.ht>>=
+\newcommand{\ugxCliffordQuaternTitle}
+{The Quaternion Numbers as a Clifford Algebra}
+\newcommand{\ugxCliffordQuaternNumber}{9.10.2.}
+
+@
+\subsection{The Quaternion Numbers as a Clifford Algebra}
+\label{ugxCliffordQuaternPage}
+See QuaternionXmpPage \ref{QuaternionXmpPage} on 
+page~\pageref{QuaternionXmpPage}
+\index{pages!ugxCliffordQuaternPage!clif.ht}
+\index{clif.ht!pages!ugxCliffordQuaternPage}
+\index{ugxCliffordQuaternPage!clif.ht!pages}
+<<clif.ht>>=
+\begin{page}{ugxCliffordQuaternPage}
+{The Quaternion Numbers as a Clifford Algebra}
+\beginscroll
+
+\labelSpace{3pc}
+\xtc{
+This is the field over which we will work, rational functions with
+integer coefficients.
+}{
+\spadpaste{K := Fraction Polynomial Integer \bound{K}}
+}
+\xtc{
+We use this matrix for the quadratic form.
+}{
+\spadpaste{m := matrix [[-1,0],[0,-1]] \bound{m}}
+}
+\xtc{
+The resulting domain is the quaternions.
+}{
+\spadpaste{H  := CliffordAlgebra(2, K, quadraticForm m) \free{K m}\bound{H}}
+}
+\xtc{
+We use Hamilton's notation for \spad{i},\spad{j},\spad{k}.
+}{
+\spadpaste{i: H  := e(1) \free{H}\bound{i}}
+}
+\xtc{
+}{
+\spadpaste{j: H  := e(2) \free{H}\bound{j}}
+}
+\xtc{
+}{
+\spadpaste{k: H  := i * j \free{H,i,j}\bound{k}}
+}
+\xtc{
+}{
+\spadpaste{x := a + b * i + c * j + d * k \free{i j k}\bound{x}}
+}
+\xtc{
+}{
+\spadpaste{y := e + f * i + g * j + h * k \free{i j k}\bound{y}}
+}
+\xtc{
+}{
+\spadpaste{x + y \free{x y}}
+}
+\xtc{
+}{
+\spadpaste{x * y \free{x y}}
+}
+\xtc{
+See \downlink{`Quaternion'}{QuaternionXmpPage}\ignore{Quaternion} for examples of Axiom's constructor
+implementing quaternions.
+}{
+\spadpaste{y * x \free{x y}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<clif.ht>>=
+\newcommand{\ugxCliffordExteriorTitle}{The Exterior Algebra on a Three Space}
+\newcommand{\ugxCliffordExteriorNumber}{9.10.3.}
+
+@
+\subsection{The Exterior Algebra on a Three Space}
+\label{ugxCliffordExteriorPage}
+\index{pages!ugxCliffordExteriorPage!clif.ht}
+\index{clif.ht!pages!ugxCliffordExteriorPage}
+\index{ugxCliffordExteriorPage!clif.ht!pages}
+<<clif.ht>>=
+\begin{page}{ugxCliffordExteriorPage}{The Exterior Algebra on a Three Space}
+\beginscroll
+
+\labelSpace{4pc}
+\xtc{
+This is the field over which we will work, rational functions with
+integer coefficients.
+}{
+\spadpaste{K := Fraction Polynomial Integer \bound{K}}
+}
+\xtc{
+If we chose the three by three zero quadratic form, we obtain
+the exterior algebra on \spad{e(1),e(2),e(3)}.
+}{
+\spadpaste{Ext := CliffordAlgebra(3, K, quadraticForm 0) \bound{Ext}\free{K}}
+}
+\xtc{
+This is a three dimensional vector algebra.
+We define \spad{i}, \spad{j}, \spad{k} as the unit vectors.
+}{
+\spadpaste{i: Ext := e(1) \free{Ext}\bound{i}}
+}
+\xtc{
+}{
+\spadpaste{j: Ext := e(2) \free{Ext}\bound{j}}
+}
+\xtc{
+}{
+\spadpaste{k: Ext := e(3) \free{Ext}\bound{k}}
+}
+\xtc{
+Now it is possible to do arithmetic.
+}{
+\spadpaste{x := x1*i + x2*j + x3*k \free{i j k}\bound{x}}
+}
+\xtc{
+}{
+\spadpaste{y := y1*i + y2*j + y3*k \free{i j k}\bound{y}}
+}
+\xtc{
+}{
+\spadpaste{x + y         \free{x y}}
+}
+\xtc{
+}{
+\spadpaste{x * y + y * x \free{x y}}
+}
+\xtc{
+On an \spad{n} space, a grade \spad{p} form has a dual \spad{n-p} form.
+In particular, in three space the dual of a grade two element identifies
+\spad{e1*e2->e3, e2*e3->e1, e3*e1->e2}.
+}{
+\spadpaste{dual2 a == coefficient(a,[2,3]) * i + coefficient(a,[3,1]) * j + coefficient(a,[1,2]) * k \free{i j k}\bound{dual2}}
+}
+\xtc{
+The vector cross product is then given by this.
+}{
+\spadpaste{dual2(x*y) \free{x y dual2}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<clif.ht>>=
+\newcommand{\ugxCliffordDiracTitle}{The Dirac Spin Algebra}
+\newcommand{\ugxCliffordDiracNumber}{9.10.4.}
+
+@
+\subsection{The Dirac Spin Algebra}
+\label{ugxCliffordDiracPage}
+\index{pages!ugxCliffordDiracPage!clif.ht}
+\index{clif.ht!pages!ugxCliffordDiracPage}
+\index{ugxCliffordDiracPage!clif.ht!pages}
+<<clif.ht>>=
+\begin{page}{ugxCliffordDiracPage}{The Dirac Spin Algebra}
+\beginscroll
+
+\labelSpace{4pc}
+{The Dirac Spin Algebra}
+%
+\xtc{
+In this section we will work over the field of rational numbers.
+}{
+\spadpaste{K := Fraction Integer \bound{K}}
+}
+\xtc{
+We define the quadratic form to be the Minkowski space-time metric.
+}{
+\spadpaste{g := matrix [[1,0,0,0], [0,-1,0,0], [0,0,-1,0], [0,0,0,-1]] \bound{g}}
+}
+\xtc{
+We obtain the Dirac spin algebra
+used in Relativistic Quantum Field Theory.
+{9.10.4.}{The Dirac Spin Algebra}
+}{
+\spadpaste{D := CliffordAlgebra(4,K, quadraticForm g) \free{K g}\bound{D}}
+}
+\xtc{
+The usual notation for the basis is \texht{$\gamma$}{\spad{gamma}}
+with a superscript.
+For Axiom input we will use \spad{gam(i)}:
+}{
+\spadpaste{gam := [e(i)\$D for i in 1..4] \free{D}\bound{gam}}
+}
+\noindent
+There are various contraction identities of the form
+\begin{verbatim}
+g(l,t)*gam(l)*gam(m)*gam(n)*gam(r)*gam(s)*gam(t) =
+      2*(gam(s)gam(m)gam(n)gam(r) + gam(r)*gam(n)*gam(m)*gam(s))
+\end{verbatim}
+where a sum over \spad{l} and \spad{t} is implied.
+\xtc{
+Verify this identity for particular values of \spad{m,n,r,s}.
+}{
+\spadpaste{m := 1; n:= 2; r := 3; s := 4; \bound{m,n,r,s}}
+}
+\xtc{
+}{
+\spadpaste{lhs := reduce(+, [reduce(+, [ g(l,t)*gam(l)*gam(m)*gam(n)*gam(r)*gam(s)*gam(t) for l in 1..4]) for t in 1..4]) \bound{lhs}\free{g gam m n r s}}
+}
+\xtc{
+}{
+\spadpaste{rhs := 2*(gam s * gam m*gam n*gam r + gam r*gam n*gam m*gam s) \bound{rhs}\free{lhs g gam m n r s}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{complex.ht}
+<<complex.ht>>=
+\newcommand{\ComplexXmpTitle}{Complex}
+\newcommand{\ComplexXmpNumber}{9.11}
+
+@
+\subsection{Complex}
+\label{ComplexXmpPage}
+\begin{itemize}
+\item ugProblemNumericPage \ref{ugProblemNumericPage} on
+page~pageref{ugProblemNumericPage}
+\item ugTypesConvertPage \ref{ugTypesConvertPage} on
+page~pageref{ugTypesConvertPage}
+\end{itemize}
+\index{pages!ComplexXmpPage!complex.ht}
+\index{complex.ht!pages!ComplexXmpPage}
+\index{ComplexXmpPage!complex.ht!pages}
+<<complex.ht>>=
+\begin{page}{ComplexXmpPage}{Complex}
+\beginscroll
+
+The \spadtype{Complex} constructor implements complex objects over a
+commutative ring \spad{R}.
+Typically, the ring \spad{R} is \spadtype{Integer}, \spadtype{Fraction
+Integer}, \spadtype{Float} or \spadtype{DoubleFloat}.
+\spad{R} can also be a symbolic type, like \spadtype{Polynomial Integer}.
+For more information about the numerical and graphical aspects of complex
+numbers, 
+see \downlink{``\ugProblemNumericTitle''}{ugProblemNumericPage} in Section 
+\ugProblemNumericNumber\ignore{ugProblemNumeric}.
+
+\xtc{
+Complex objects are created by the \spadfunFrom{complex}{Complex} operation.
+}{
+\spadpaste{a := complex(4/3,5/2) \bound{a}}
+}
+\xtc{
+}{
+\spadpaste{b := complex(4/3,-5/2) \bound{b}}
+}
+\xtc{
+The standard arithmetic operations are available.
+}{
+\spadpaste{a + b \free{a b}}
+}
+\xtc{
+}{
+\spadpaste{a - b \free{a b}}
+}
+\xtc{
+}{
+\spadpaste{a * b \free{a b}}
+}
+\xtc{
+If \spad{R} is a field, you can also divide the complex objects.
+}{
+\spadpaste{a / b \free{a b}\bound{adb}}
+}
+\xtc{
+Use a conversion (\downlink{``\ugTypesConvertTitle''}{ugTypesConvertPage} in Section \ugTypesConvertNumber\ignore{ugTypesConvert}) to view the last
+object as a fraction of complex integers.
+}{
+\spadpaste{\% :: Fraction Complex Integer \free{adb}}
+}
+\xtc{
+The predefined macro \spad{\%i} is defined to be \spad{complex(0,1)}.
+}{
+\spadpaste{3.4 + 6.7 * \%i}
+}
+\xtc{
+You can also compute the \spadfunFrom{conjugate}{Complex} and
+\spadfunFrom{norm}{Complex} of a complex number.
+}{
+\spadpaste{conjugate a \free{a}}
+}
+\xtc{
+}{
+\spadpaste{norm a \free{a}}
+}
+\xtc{
+The \spadfunFrom{real}{Complex} and \spadfunFrom{imag}{Complex} operations
+are provided to extract the real and imaginary parts, respectively.
+}{
+\spadpaste{real a \free{a}}
+}
+\xtc{
+}{
+\spadpaste{imag a \free{a}}
+}
+
+\xtc{
+The domain \spadtype{Complex Integer} is also called the Gaussian
+integers.
+If \spad{R} is the integers (or, more generally,
+a \spadtype{EuclideanDomain}), you can compute greatest common divisors.
+}{
+\spadpaste{gcd(13 - 13*\%i,31 + 27*\%i)}
+}
+\xtc{
+You can also compute least common multiples.
+}{
+\spadpaste{lcm(13 - 13*\%i,31 + 27*\%i)}
+}
+\xtc{
+You can \spadfunFrom{factor}{Complex} Gaussian integers.
+}{
+\spadpaste{factor(13 - 13*\%i)}
+}
+\xtc{
+}{
+\spadpaste{factor complex(2,0)}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{contfrac.ht}
+<<contfrac.ht>>=
+\newcommand{\ContinuedFractionXmpTitle}{ContinuedFraction}
+\newcommand{\ContinuedFractionXmpNumber}{9.12}
+
+@
+\subsection{ContinuedFraction}
+\label{ContinuedFractionXmpPage}
+See StreamXmpPage \ref{StreamXmpPage} on page~\pageref{StreamXmpPage}
+\index{pages!ContinuedFractionXmpPage!contfrac.ht}
+\index{contfrac.ht!pages!ContinuedFractionXmpPage}
+\index{ContinuedFractionXmpPage!contfrac.ht!pages}
+<<contfrac.ht>>=
+\begin{page}{ContinuedFractionXmpPage}{ContinuedFraction}
+\beginscroll
+
+Continued fractions have been a fascinating and useful tool in mathematics
+for well over three hundred years.
+Axiom implements continued fractions for fractions of any Euclidean
+domain.
+In practice, this usually means rational numbers.
+In this section we demonstrate some of the operations available for
+manipulating both finite and infinite continued fractions.
+It may be helpful if you review 
+\downlink{`Stream'}{StreamXmpPage}\ignore{Stream} to remind yourself of some
+of the operations with streams.
+
+The \spadtype{ContinuedFraction} domain is a field and therefore you can
+add, subtract, multiply and divide the fractions.
+\xtc{
+The \spadfunFrom{continuedFraction}{ContinuedFraction} operation
+converts its fractional argument to a continued fraction.
+}{
+\spadpaste{c := continuedFraction(314159/100000) \bound{c}}
+}
+%
+This display is a compact form of the bulkier
+\texht{\narrowDisplay{%
+3 + {\displaystyle 1 \over {\displaystyle
+7 + {1 \over {\displaystyle
+15 + {1 \over {\displaystyle
+1 + {1 \over {\displaystyle
+25 + {1 \over {\displaystyle
+1 + {1 \over {\displaystyle
+7 + {1 \over 4}}}}}}}}}}}}}}%
+}{
+\begin{verbatim}
+        3 +                 1
+            -------------------------------
+            7 +               1
+                ---------------------------
+                15 +            1
+                     ----------------------
+                     1 +          1
+                         ------------------
+                         25 +       1
+                              -------------
+                              1 +     1
+                                  ---------
+                                  7 +   1
+                                      -----
+                                        4
+\end{verbatim}
+}
+You can write any rational number in a similar form.
+The fraction will be finite and you can always take the ``numerators'' to
+be \spad{1}.
+That is, any rational number can be written as a simple, finite continued
+fraction of the form
+\texht{\narrowDisplay{%
+a_1 + {\displaystyle 1 \over {\displaystyle
+a_2 + {1 \over {\displaystyle
+a_3 + {1 \over {\displaystyle \ddots
+a_{n-1} + {1 \over a_n}}}}}}}}%
+}{
+\begin{verbatim}
+        a(1) +           1
+               -------------------------
+               a(2) +          1
+                      --------------------
+                      a(3) +
+                             .
+                              .
+                               .
+                                     1
+                               -------------
+                               a(n-1) +  1
+                                        ----
+                                        a(n)
+\end{verbatim}
+}
+\xtc{
+The \texht{$a_i$}{\spad{a(i)}} are called partial quotients and the operation
+\spadfunFrom{partialQuotients}{ContinuedFraction} creates a stream of them.
+}{
+\spadpaste{partialQuotients c \free{c}}
+}
+\xtc{
+By considering more and more of the fraction, you get the
+\spadfunFrom{convergents}{ContinuedFraction}.
+For example, the first convergent is \texht{$a_1$}{\spad{a(1)}},
+the second is
+\texht{$a_1 + 1/a_2$}{\spad{a(1) + 1/a(2)}} and so on.
+}{
+\spadpaste{convergents c \free{c}}
+}
+%
+\xtc{
+Since this is a finite continued fraction, the last convergent is
+the original rational number, in reduced form.
+The result of \spadfunFrom{approximants}{ContinuedFraction}
+is always an infinite stream, though it may just repeat the ``last''
+value.
+}{
+\spadpaste{approximants c \free{c}}
+}
+\xtc{
+Inverting \spad{c} only changes the partial quotients of its fraction
+by inserting a \spad{0} at the beginning of the list.
+}{
+\spadpaste{pq := partialQuotients(1/c) \free{c}\bound{pq}}
+}
+\xtc{
+Do this to recover the original continued fraction from this list of
+partial quotients.
+The three-argument form of the
+\spadfunFrom{continuedFraction}{ContinuedFraction} operation takes an
+element which is the whole part of the fraction, a stream of elements
+which are the numerators of the fraction, and a stream of elements which
+are the denominators of the fraction.
+}{
+\spadpaste{continuedFraction(first pq,repeating [1],rest pq) \free{pq}}
+}
+\xtc{
+The streams need not be finite for
+\spadfunFrom{continuedFraction}{ContinuedFraction}.
+Can you guess which irrational number has the following continued
+fraction?
+See the end of this section for the answer.
+}{
+\spadpaste{z:=continuedFraction(3,repeating [1],repeating [3,6]) \bound{z}}
+}
+%
+
+In 1737 Euler discovered the infinite continued fraction expansion
+\texht{\narrowDisplay{%
+{{e - 1} \over 2} =
+{1 \over {\displaystyle
+1 + {1 \over {\displaystyle
+6 + {1 \over {\displaystyle
+10 + {1 \over {\displaystyle
+14 + \cdots}}}}}}}}}%
+}{
+\begin{verbatim}
+        e - 1             1
+        ----- = ---------------------
+          2     1 +         1
+                    -----------------
+                    6 +       1
+                        -------------
+                        10 +    1
+                             --------
+                             14 + ...
+\end{verbatim}
+}
+We use this expansion to compute rational and floating point
+approximations of \spad{e}.\footnote{For this and other interesting
+expansions, see C. D. Olds, {\it Continued Fractions,}
+New Mathematical Library, (New York: Random House, 1963), pp.
+134--139.}
+
+\xtc{
+By looking at the above expansion, we see that the whole part is \spad{0}
+and the numerators are all equal to \spad{1}.
+This constructs the stream of denominators.
+}{
+\spadpaste{dens:Stream Integer := cons(1,generate((x+->x+4),6)) \bound{dens}}
+}
+\xtc{
+Therefore this is the continued fraction expansion for
+\texht{$(e - 1) / 2$}{\spad{(e-1)/2}}.
+}{
+\spadpaste{cf := continuedFraction(0,repeating [1],dens) \free{dens}\bound{cf}}
+}
+\xtc{
+These are the rational number convergents.
+}{
+\spadpaste{ccf := convergents cf \free{cf}\bound{ccf}}
+}
+\xtc{
+You can get rational convergents for \spad{e} by multiplying by \spad{2} and
+adding \spad{1}.
+}{
+\spadpaste{eConvergents := [2*e + 1 for e in ccf] \bound{ec}\free{ccf}}
+}
+%
+\xtc{
+You can also compute the floating point approximations to these convergents.
+}{
+\spadpaste{eConvergents :: Stream Float \free{ec}}
+}
+\xtc{
+Compare this to the value of \spad{e} computed by the
+\spadfunFrom{exp}{Float} operation in \spadtype{Float}.
+}{
+\spadpaste{exp 1.0}
+}
+
+In about 1658, Lord Brouncker established the following expansion
+for \texht{$4 / \pi$}{\spad{4/pi}}.
+\texht{\narrowDisplay{%
+1 + {\displaystyle
+1 \over {\displaystyle
+2 + {9 \over {\displaystyle
+2 + {25 \over {\displaystyle
+2 + {49 \over {\displaystyle
+2 + {81 \over {\displaystyle
+2 + \cdots}}}}}}}}}}}%
+}{
+\begin{verbatim}
+        1 +            1
+            -----------------------
+            2 +          9
+                -------------------
+                2 +        25
+                    ---------------
+                    2 +      49
+                        -----------
+                        2 +    81
+                            -------
+                            2 + ...
+\end{verbatim}
+}
+\xtc{
+Let's use this expansion to compute rational and floating point
+approximations for \texht{$\pi$}{\spad{pi}}.
+}{
+\spadpaste{
+cf := continuedFraction(1,[(2*i+1)**2 for i in 0..],repeating [2])\bound{cf1}}
+}
+\xtc{
+}{
+\spadpaste{ccf := convergents cf \free{cf1}\bound{ccf1}}
+}
+\xtc{
+}{
+\spadpaste{
+piConvergents := [4/p for p in ccf] \bound{piConvergents}\free{ccf1}}
+}
+\xtc{
+As you can see, the values are converging to
+\texht{$\pi$}{\spad{pi}} = 3.14159265358979323846...,
+but not very quickly.
+}{
+\spadpaste{piConvergents :: Stream Float \free{piConvergents}}
+}
+
+\xtc{
+You need not restrict yourself to continued fractions of integers.
+Here is an expansion for a quotient of Gaussian integers.
+}{
+\spadpaste{continuedFraction((- 122 + 597*\%i)/(4 - 4*\%i))}
+}
+\xtc{
+This is an expansion for a quotient of polynomials in one variable
+with rational number coefficients.
+}{
+\spadpaste{r : Fraction UnivariatePolynomial(x,Fraction Integer) \bound{rdec}}
+}
+\xtc{
+}{
+\spadpaste{r := ((x - 1) * (x - 2)) / ((x-3) * (x-4)) \free{rdec}\bound{r}}
+}
+\xtc{
+}{
+\spadpaste{continuedFraction r \free{r}}
+}
+
+To conclude this section, we give you evidence that
+\texht{\narrowDisplay{%
+z =
+{3+\zag{1}{3}+\zag{1}{6}+\zag{1}{3}+\zag{1}{6}+\zag{1}{3}+\zag{1}{6}+
+\zag{1}{3}+\zag{1}{6}+\zag{1}{3}+\zag{1}{6}+...}}%
+}{
+\begin{verbatim}
+    z = 3 +            1
+            -----------------------
+            3 +          1
+                -------------------
+                6 +        1
+                    ---------------
+                    3 +      1
+                        -----------
+                        6 +    1
+                            -------
+                            3 + ...
+\end{verbatim}
+}
+is the expansion of \texht{$\sqrt{11}$}{the square root of \spad{11}}.
+%
+\xtc{
+}{
+\spadpaste{[i*i for i in convergents(z) :: Stream Float] \free{z}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{cphelp.ht}
+\subsection{Control Panel Bits}
+\label{CPHelp}
+\index{pages!CPHelp!cphelp.ht}
+\index{cphelp.ht!pages!CPHelp}
+\index{CPHelp!cphelp.ht!pages}
+<<cphelp.ht>>=
+\begin{page}{CPHelp}{Control Panel Bits}
+\beginscroll
+
+Here are some stuff from a Three Dimensional Viewport's Control Panel \newline
+
+Main Control Panel: \newline \newline
+
+%%
+%% These things were generated from the file helpCP3D.dat
+%%
+%% The help comments are hokey and are not the intended 
+%% format.
+%%
+
+Rotate: \helpbit{rotate3D}
+Zoom: \helpbit{zoom3D}
+Translate up/down left/right in the window: \helpbit{translate3D}
+Changing the color of the rendered surface: \helpbit{color3D}
+Turn the axes on and off: \helpbit{axes3D}
+Display surface as a transparent wire mesh: \helpbit{transparent3D}
+Display surface with hidden surface removed and the core dumped: \helpbit{opaque3D}
+Display rendered surface: \helpbit{render3D}
+Show region within which the function is defined: \helpbit{region3D}
+Change position of light source: \helpbit{lighting3D}
+Change Perspective/Clipping of surface: \helpbit{volume3D}
+Reset to original viewpoint: \helpbit{reset3D}
+Show grid lines on the rendered surface: \helpbit{outline3D}
+Hide the menu: \helpbit{hide3D}
+Close the viewport: \helpbit{close3D}
+
+\newline
+\newline
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{cycles.ht}
+<<cycles.ht>>=
+\newcommand{\CycleIndicatorsXmpTitle}{CycleIndicators}
+\newcommand{\CycleIndicatorsXmpNumber}{9.13}
+
+@
+\subsection{CycleIndicators}
+\label{CycleIndicatorsXmpPage}
+\index{pages!CycleIndicatorsXmpPage!cycles.ht}
+\index{cycles.ht!pages!CycleIndicatorsXmpPage}
+\index{CycleIndicatorsXmpPage!cycles.ht!pages}
+<<cycles.ht>>=
+\begin{page}{CycleIndicatorsXmpPage}{CycleIndicators}
+\beginscroll
+This section is based upon the paper
+J. H. Redfield, ``The Theory of Group-Reduced Distributions'',
+and is an application of group theory to enumeration problems.
+It is a development of the work by P. A. MacMahon on the
+
+The theory is based upon the power sum symmetric functions
+\subscriptIt{s}{i}
+which are the sum of the \eth{\it i} powers of the variables.
+The cycle index of a permutation is an expression that specifies
+the sizes of the cycles of a permutation, and
+may be represented as a partition.
+A partition of a non-negative integer \spad{n} is a collection
+of positive integers called its parts whose sum is \spad{n}.
+For example, the partition
+\texht{$(3^2 \  2 \ 1^2)$}{\spad{3**2 2 1**2)}}
+will be used to represent
+\texht{$s^2_3 s_2 s^2_1$}{\spad{(s_3)**2 s_2 (s_1)**2}}
+and will indicate that the permutation has two cycles of length 3,
+one of length 2 and two of length 1.
+The cycle index of a permutation group is the sum of the cycle indices
+of its permutations divided by the number of permutations.
+The cycle indices of certain groups are provided.
+\xtc{
+We first expose something from the library.
+}{
+\spadpaste{)expose EVALCYC}
+}
+\xtc{
+The operation \spadfun{complete} returns the cycle index of the
+symmetric group of order \spad{n} for argument \spad{n}.
+Alternatively, it is the \eth{\spad{n}} complete homogeneous symmetric
+function expressed in terms of power sum symmetric functions.
+}{
+\spadpaste{complete 1}
+}
+\xtc{
+}{
+\spadpaste{complete 2}
+}
+\xtc{
+}{
+\spadpaste{complete 3}
+}
+\xtc{
+}{
+\spadpaste{complete 7}
+}
+\xtc{
+The operation \spadfun{elementary} computes the \eth{\spad{n}}
+elementary symmetric function for argument \spad{n.}
+}{
+\spadpaste{elementary 7}
+}
+\xtc{
+The operation \spadfun{alternating} returns
+the cycle index of the alternating group
+having an even number of even parts in each cycle partition.
+}{
+\spadpaste{alternating 7}
+}
+\xtc{
+The operation \spadfun{cyclic} returns the cycle index of the cyclic group.
+}{
+\spadpaste{cyclic 7}
+}
+\xtc{
+The operation \spadfun{dihedral} is the cycle index of the
+dihedral group.
+}{
+\spadpaste{dihedral 7}
+}
+\xtc{
+The operation \spadfun{graphs} for argument \spad{n} returns
+the cycle index of the group of permutations on
+the edges of the complete graph with \spad{n} nodes induced by
+applying the symmetric group to the nodes.
+}{
+\spadpaste{graphs 5}
+}
+
+The cycle index of a direct product of two groups is the product
+of the cycle indices of the groups.
+Redfield provided two operations on two cycle indices which will
+be called ``cup'' and ``cap'' here.
+The \spadfun{cup} of two cycle indices is a kind of scalar product
+that combines monomials for permutations with the same cycles.
+The \spadfun{cap} operation provides the sum of the coefficients
+of the result of the \spadfun{cup} operation which will be an
+integer that enumerates what Redfield called
+group-reduced distributions.
+
+We can, for example, represent  \spad{complete 2 * complete 2}
+as the set of objects \spad{a a b b} and
+\spad{complete 2 * complete 1 * complete 1} as \spad{c c d e.}
+
+\xtc{
+This integer
+is the number of different sets of four pairs.
+}{
+\spadpaste{cap(complete 2**2, complete 2*complete 1**2)}
+}
+For example,
+\begin{verbatim}
+a a b b     a a b b    a a b b   a a b b
+c c d e     c d c e    c e c d   d e c c
+\end{verbatim}
+
+\xtc{
+This integer
+is the number of different sets of four pairs no two pairs being equal.
+}{
+\spadpaste{cap(elementary 2**2, complete 2*complete 1**2)}
+}
+For example,
+\begin{verbatim}
+a a b b    a a b b
+c d c e    c e c d
+\end{verbatim}
+In this case the configurations enumerated are easily constructed,
+however the theory merely enumerates them providing little help in
+actually constructing them.
+\xtc{
+Here are the
+number of 6-pairs, first from \spad{a a a b b c,} second from
+\spad{d d e e f g.}
+}{
+\spadpaste{cap(complete 3*complete 2*complete 1,complete 2**2*complete 1**2)}
+}
+\xtc{
+Here it is again, but with no equal pairs.
+}{
+\spadpaste{cap(elementary 3*elementary 2*elementary 1,complete 2**2*complete 1**2)}
+}
+\xtc{
+}{
+\spadpaste{cap(complete 3*complete 2*complete 1,elementary 2**2*elementary 1**2)}
+}
+\xtc{
+The number of 6-triples, first from \spad{a a a b b c,} second from
+\spad{d d e e f g,} third from \spad{h h i i j j.}
+}{
+\spadpaste{eval(cup(complete 3*complete 2*complete 1, cup(complete 2**2*complete 1**2,complete 2**3)))}
+}
+\xtc{
+The cycle index of vertices of a square is dihedral 4.
+}{
+\spadpaste{square:=dihedral 4}
+}
+\xtc{
+The number of different squares with 2 red vertices and 2 blue vertices.
+}{
+\spadpaste{cap(complete 2**2,square)}
+}
+\xtc{
+The number of necklaces with 3 red beads, 2 blue beads and 2 green beads.
+}{
+\spadpaste{cap(complete 3*complete 2**2,dihedral 7)}
+}
+\xtc{
+The number of graphs with 5 nodes and 7 edges.
+}{
+\spadpaste{cap(graphs 5,complete 7*complete 3)}
+}
+\xtc{
+The cycle index of rotations of vertices of a cube.
+}{
+\spadpaste{s(x) == powerSum(x)}
+}
+\xtc{
+}{
+\spadpaste{cube:=(1/24)*(s 1**8+9*s 2**4 + 8*s 3**2*s 1**2+6*s 4**2)}
+}
+\xtc{
+The number of cubes with 4 red vertices and 4 blue vertices.
+}{
+\spadpaste{cap(complete 4**2,cube)}
+}
+\xtc{
+The number of labeled graphs with degree sequence \spad{2 2 2 1 1}
+with no loops or multiple edges.
+}{
+\spadpaste{cap(complete 2**3*complete 1**2,wreath(elementary 4,elementary 2))}
+}
+\xtc{
+Again, but
+with loops allowed but not multiple edges.
+}{
+\spadpaste{cap(complete 2**3*complete 1**2,wreath(elementary 4,complete 2))}
+}
+\xtc{
+Again, but
+with multiple edges allowed, but not loops
+}{
+\spadpaste{cap(complete 2**3*complete 1**2,wreath(complete 4,elementary 2))}
+}
+\xtc{
+Again, but
+with both multiple edges and loops allowed
+}{
+\spadpaste{cap(complete 2**3*complete 1**2,wreath(complete 4,complete 2))}
+}
+
+Having constructed a cycle index for a configuration
+we are at liberty to evaluate the
+\subscriptIt{s}{i}
+components any way we please.
+For example we can produce enumerating generating functions.
+{CycleIndicators}
+This is done by providing a function \spad{f} on an integer \spad{i} to the
+value required of \subscriptIt{s}{i},
+and then evaluating \spad{eval(f, cycleindex)}.
+\xtc{
+}{
+\spadpaste{x: ULS(FRAC INT,'x,0) := 'x \bound{x}}
+}
+\xtc{
+}{
+\spadpaste{ZeroOrOne: INT -> ULS(FRAC INT, 'x, 0) \bound{zodec}}
+}
+\xtc{
+}{
+\spadpaste{Integers: INT -> ULS(FRAC INT, 'x, 0) \bound{idec}}
+}
+\xtc{
+For the integers 0 and 1, or two colors.
+}{
+\spadpaste{ZeroOrOne n == 1+x**n \free{x zodec}\bound{zo}}
+}
+\xtc{
+}{
+\spadpaste{ZeroOrOne 5 \free{zo}}
+}
+\xtc{
+For the integers \spad{0, 1, 2, ...} we have this.
+}{
+\spadpaste{Integers n == 1/(1-x**n) \free{x idec}\bound{i}}
+}
+\xtc{
+}{
+\spadpaste{Integers 5 \free{i}}
+}
+
+\xtc{
+The coefficient of \texht{$x^n$}{\spad{x**n}}
+is the number of graphs with 5 nodes
+and \spad{n} edges.
+}{
+\spadpaste{eval(ZeroOrOne, graphs 5) \free{zo}}
+}
+\xtc{
+The coefficient of \texht{$x^n$}{\spad{x**n}}  is the number of necklaces with
+\spad{n} red beads and \spad{n-8} green beads.
+}{
+\spadpaste{eval(ZeroOrOne,dihedral 8) \free{zo}}
+}
+\xtc{
+The coefficient of \texht{$x^n$}{\spad{x**n}} is the number of partitions of
+\spad{n} into 4 or fewer parts.
+}{
+\spadpaste{eval(Integers,complete 4) \free{i}}
+}
+\xtc{
+The coefficient of \texht{$x^n$}{\spad{x**n}} is the number of
+partitions of \spad{n} into 4
+boxes containing ordered distinct parts.
+}{
+\spadpaste{eval(Integers,elementary 4) \free{i}}
+}
+\xtc{
+The coefficient of \texht{$x^n$}{\spad{x**n}} is the number of
+different cubes with \spad{n} red vertices and \spad{8-n} green ones.
+}{
+\spadpaste{eval(ZeroOrOne,cube) \free{zo}}
+}
+\xtc{
+The coefficient of \texht{$x^n$}{\spad{x**n}} 
+is the number of different cubes with integers
+on the vertices whose sum is \spad{n.}
+}{
+\spadpaste{eval(Integers,cube) \free{i}}
+}
+\xtc{
+The coefficient of \texht{$x^n$}{\spad{x**n}} is the number of
+graphs with 5 nodes and with integers on the edges whose sum is
+\spad{n.}
+In other words, the enumeration is of multigraphs with 5 nodes and
+\spad{n} edges.
+}{
+\spadpaste{eval(Integers,graphs 5) \free{i}}
+}
+\xtc{
+Graphs with 15 nodes enumerated with respect to number of edges.
+}{
+\spadpaste{eval(ZeroOrOne ,graphs 15) \free{zo}}
+}
+\xtc{
+Necklaces with 7 green beads, 8 white beads, 5 yellow beads and 10
+red beads.
+}{
+\spadpaste{cap(dihedral 30,complete 7*complete 8*complete 5*complete 10)}
+}
+The operation \spadfun{SFunction} is the S-function or Schur function
+of a partition written
+as a descending list of integers expressed in terms of power sum
+symmetric functions.
+\xtc{
+In this case the argument partition represents a tableau shape.
+For example \spad{3,2,2,1} represents a tableau with three boxes in the
+first row, two boxes in the second and third rows, and one box in the
+fourth row.
+\spad{SFunction [3,2,2,1]}
+counts the number of different tableaux of shape \spad{3, 2, 2, 1} filled
+with objects with an ascending order in the columns and a
+non-descending order in the rows.
+}{
+\spadpaste{sf3221:= SFunction [3,2,2,1] \bound{sf3221}}
+}
+\xtc{
+This is the number filled with \spad{a a b b c c d d.}
+}{
+\spadpaste{cap(sf3221,complete 2**4) \free{sf3221}}
+}
+The configurations enumerated above are:
+\begin{verbatim}
+a a b    a a c    a a d
+b c      b b      b b
+c d      c d      c c
+d        d        d
+\end{verbatim}
+\xtc{
+This is the number of tableaux filled with \spad{1..8.}
+}{
+\spadpaste{cap(sf3221, powerSum 1**8)\free{sf3221}}
+}
+\xtc{
+The coefficient of \texht{$x^n$}{\spad{x**n}} is the number
+of column strict reverse plane partitions of \spad{n} of shape
+\spad{3 2 2 1.}
+}{
+\spadpaste{eval(Integers, sf3221)\free{i sf3221}}
+}
+The smallest is
+\begin{verbatim}
+0 0 0
+1 1
+2 2
+3
+\end{verbatim}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{coverex.ht}
+\subsection{Examples Of Axiom Commands}
+DO NOT EDIT! Created by ex2ht.
+\begin{itemize}
+\item Menuexdiff \ref{Menuexdiff} on page~\pageref{Menuexdiff}
+\item menuexint \ref{menuexint} on page~\pageref{menuexint}
+\item Menuexlap \ref{Menuexlap} on page~\pageref{Menuexlap}
+\item Menuexlimit \ref{Menuexlimit} on page~\pageref{Menuexlimit}
+\item Menuexmatrix \ref{Menuexmatrix} on page~\pageref{Menuexmatrix}
+\item Menuexplot2d \ref{Menuexplot2d} on page~\pageref{Menuexplot2d}
+\item Menuexplot3d \ref{Menuexplot3d} on page~\pageref{Menuexplot3d}
+\item Menuexseries \ref{Menuexseries} on page~\pageref{Menuexseries}
+\item Menuexsum \ref{Menuexsum} on page~\pageref{Menuexsum}
+\end{itemize}
+\label{ExampleCoverPage}
+\index{pages!ExampleCoverPage!coverex.ht}
+\index{coverex.ht!pages!ExampleCoverPage}
+\index{ExampleCoverPage!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{ExampleCoverPage}{Examples Of Axiom Commands}
+\beginscroll\table{
+{\downlink{Differentiation}{Menuexdiff}}
+{\downlink{Integration}{Menuexint}}
+{\downlink{Laplace Transforms}{Menuexlap}}
+{\downlink{Limits}{Menuexlimit}}
+{\downlink{Matrices}{Menuexmatrix}}
+{\downlink{2-D Graphics}{Menuexplot2d}}
+{\downlink{3-D Graphics}{Menuexplot3d}}
+{\downlink{Series}{Menuexseries}}
+{\downlink{Summations}{Menuexsum}}
+}\endscroll\end{page}
+
+@
+\subsection{Differentiation}
+\label{Menuexdiff}
+\begin{itemize}
+\item ExDiffBasic \ref{ExDiffBasic} on page~\pageref{ExDiffBasic}
+\item ExDiffSeveralVariables \ref{ExDiffSeveralVariables} on 
+page~\pageref{ExDiffSeveralVariables}
+\item ExDiffHigherOrder \ref{ExDiffHigherOrder} on 
+page~\pageref{ExDiffHigherOrder}
+\item ExDiffMultipleI \ref{ExDiffMultipleI} on page~\pageref{ExDiffMultipleI}
+\item ExDiffMultipleII \ref{ExDiffMultipleII} on 
+page~\pageref{ExDiffMultipleII}
+\item ExDiffFormalIntegral \ref{ExDiffFormalIntegral} on 
+page~\pageref{ExDiffFormalIntegral}
+\end{itemize}
+\index{pages!Menuexdiff!coverex.ht}
+\index{coverex.ht!pages!Menuexdiff}
+\index{Menuexdiff!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexdiff}{Differentiation}
+\beginscroll\beginmenu
+\menudownlink{Computing Derivatives}{ExDiffBasic}
+\spadpaste{differentiate(sin(x) * exp(x**2),x)}
+\menudownlink{Derivatives of Functions of Several Variables}{ExDiffSeveralVariables}
+\spadpaste{differentiate(sin(x) * tan(y)/(x**2 + y**2),x)}
+\spadpaste{differentiate(sin(x) * tan(y)/(x**2 + y**2),y)}
+\menudownlink{Derivatives of Higher Order}{ExDiffHigherOrder}
+\spadpaste{differentiate(exp(x**2),x,4)}
+\menudownlink{Multiple Derivatives I}{ExDiffMultipleI}
+\spadpaste{differentiate(sin(x)/(x**2 + y**2),[x,y])}
+\spadpaste{differentiate(sin(x)/(x**2 + y**2),[x,y,y])}
+\menudownlink{Multiple Derivatives II}{ExDiffMultipleII}
+\spadpaste{differentiate(cos(z)/(x**2 + y**3),[x,y,z],[1,2,3])}
+\menudownlink{Derivatives of Functions Involving Formal Integrals}{ExDiffFormalIntegral}
+\spadpaste{f := integrate(sqrt(1 + t**3),t) \bound{f}}
+\spadpaste{differentiate(f,t) \free{f}}
+\spadpaste{differentiate(f * t**2,t) \free{f}}
+\endmenu\endscroll\end{page}
+
+@
+\subsection{Integration}
+\label{Menuexint}
+\begin{itemize}
+\item ExIntRationalFunction \ref{ExIntRationalFunction} on 
+page~\pageref{ExIntRationalFunction}
+\item ExIntRationalWithRealParameter \ref{ExIntRationalWithRealParameter} on 
+page~\pageref{ExIntRationalWithRealParameter}
+\item ExIntRationalWithComplexParameter 
+\ref{ExIntRationalWithComplexParameter} on 
+page~\pageref{ExIntRationalWithComplexParameter}
+\item ExIntTwoSimilarIntegrands \ref{ExIntTwoSimilarIntegrands} on 
+page~\pageref{ExIntTwoSimilarIntegrands}
+\item ExIntNoSolution \ref{ExIntNoSolution} on page~\pageref{ExIntNoSolution}
+\item ExIntTrig \ref{ExIntTrig} on page~\pageref{ExIntTrig}
+\item ExIntAlgebraicRelation \ref{ExIntAlgebraicRelation} on 
+page~\pageref{ExIntAlgebraicRelation}
+\item ExIntRadicalOfTranscendental \ref{ExIntRadicalOfTranscendental} on 
+page~\pageref{ExIntRadicalOfTranscendental}
+\item ExIntNonElementary \ref{ExIntNonElementary} on 
+page~\pageref{ExIntNonElementary}
+\end{itemize}
+\index{pages!Menuexint!coverex.ht}
+\index{coverex.ht!pages!Menuexint}
+\index{Menuexint!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexint}{Integration}
+\beginscroll\beginmenu
+\menudownlink{Integral of a Rational Function}{ExIntRationalFunction}
+\spadpaste{integrate((x**2+2*x+1)/((x+1)**6+1),x)}
+\spadpaste{integrate(1/(x**3+x+1),x) \bound{i}}
+\spadpaste{definingPolynomial(tower(\%).2::EXPR INT) \free{i}}
+\menudownlink{Integral of a Rational Function with a Real Parameter}{ExIntRationalWithRealParameter}
+\spadpaste{integrate(1/(x**2 + a),x)}
+\menudownlink{Integral of a Rational Function with a Complex Parameter}{ExIntRationalWithComplexParameter}
+\spadpaste{complexIntegrate(1/(x**2 + a),x)}
+\menudownlink{Two Similar Integrands Producing Very Different Results}{ExIntTwoSimilarIntegrands}
+\spadpaste{integrate(x**3 / (a+b*x)**(1/3),x)}
+\spadpaste{integrate(1 / (x**3 * (a+b*x)**(1/3)),x)}
+\menudownlink{An Integral Which Does Not Exist}{ExIntNoSolution}
+\spadpaste{integrate(log(1 + sqrt(a*x + b)) / x,x)}
+\menudownlink{A Trigonometric Function of a Quadratic}{ExIntTrig}
+\spadpaste{integrate((sinh(1+sqrt(x+b))+2*sqrt(x+b))/(sqrt(x+b)*(x+cosh(1+sqrt(x+b)))),x)}
+\menudownlink{Integrating a Function with a Hidden Algebraic Relation}{ExIntAlgebraicRelation}
+\spadpaste{integrate(tan(atan(x)/3),x)}
+\menudownlink{Details for integrating a function wiht a Hidden Algebraic Relation}{ExIntAlgebraicRelationExplain}
+\menudownlink{An Integral Involving a Root of a Transcendental Function}{ExIntRadicalOfTranscendental}
+\spadpaste{integrate((x + 1) / (x * (x + log x)**(3/2)),x)}
+\menudownlink{An Integral of a Non-elementary Function}{ExIntNonElementary}
+\spadpaste{integrate(exp(-x**2) * erf(x) / (erf(x)**3 - erf(x)**2 - erf(x) + 1),x)}
+\endmenu\endscroll\end{page}
+
+@
+\subsection{Laplace Transforms}
+\label{Menuexlap}
+\begin{itemize}
+\item ExLapSimplePole \ref{ExLapSimplePole} on page~\pageref{ExLapSimplePole}
+\item ExLapTrigTrigh \ref{ExLapTrigTrigh} on page~\pageref{ExLapTrigTrigh}
+\item ExLapDefInt \ref{ExLapDefInt} on page~\pageref{ExLapDefInt}
+\item ExLapExpExp \ref{ExLapExpExp} on page~\pageref{ExLapExpExp}
+\item ExLapSpecial1 \ref{ExLapSpecial1} on page~\pageref{ExLapSpecial1}
+\item ExLapSpecial2 \ref{ExLapSpecial2} on page~\pageref{ExLapSpecial2}
+\end{itemize}
+\index{pages!Menuexlap!coverex.ht}
+\index{coverex.ht!pages!Menuexlap}
+\index{Menuexlap!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexlap}{Laplace Transforms}
+\beginscroll\beginmenu
+\menudownlink{Laplace transform with a single pole}{ExLapSimplePole}
+\spadpaste{laplace(t**4 * exp(-a*t) / factorial(4), t, s)}
+\menudownlink{Laplace transform of a trigonometric function}{ExLapTrigTrigh}
+\spadpaste{laplace(sin(a*t) * cosh(a*t) - cos(a*t) * sinh(a*t), t, s)}
+\menudownlink{Laplace transform requiring a definite integration}{ExLapDefInt}
+\spadpaste{laplace(2/t * (1 - cos(a*t)), t, s)}
+\menudownlink{Laplace transform of exponentials}{ExLapExpExp}
+\spadpaste{laplace((exp(a*t) - exp(b*t))/t, t, s)}
+\menudownlink{Laplace transform of an exponential integral}{ExLapSpecial1}
+\spadpaste{laplace(exp(a*t+b)*Ei(c*t), t, s)}
+\menudownlink{Laplace transform of special functions}{ExLapSpecial2}
+\spadpaste{laplace(a*Ci(b*t) + c*Si(d*t), t, s)}
+\endmenu\endscroll\end{page}
+
+@
+\subsection{Limits}
+\label{Menuexlimit}
+\begin{itemize}
+\item ExLimitBasic \ref{ExLimitBasic} on page~\pageref{ExLimitBasic}
+\item ExLimitParameter \ref{ExLimitParameter} on 
+page~\pageref{ExLimitParameter}
+\item ExLimitOneSided \ref{ExLimitOneSided} on page~\pageref{ExLimitOneSided}
+\item ExLimitTwoSided \ref{ExLimitTwoSided} on page~\pageref{ExLimitTwoSided}
+\item ExLimitInfinite \ref{ExLimitInfinite} on page~\pageref{ExLimitInfinite}
+\item ExLimitRealComplex \ref{ExLimitRealComplex} on 
+page~\pageref{ExLimitRealComplex}
+\item ExLimitComplexInfinite \ref{ExLimitComplexInfinite} on 
+page~\pageref{ExLimitComplexInfinite}
+\end{itemize}
+\index{pages!Menuexlimit!coverex.ht}
+\index{coverex.ht!pages!Menuexlimit}
+\index{Menuexlimit!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexlimit}{Limits}
+\beginscroll\beginmenu
+\menudownlink{Computing Limits}{ExLimitBasic}
+\spadpaste{limit((x**2 - 3*x + 2)/(x**2 - 1),x = 1)}
+\menudownlink{Limits of Functions with Parameters}{ExLimitParameter}
+\spadpaste{limit(sinh(a*x)/tan(b*x),x = 0)}
+\menudownlink{One-sided Limits}{ExLimitOneSided}
+\spadpaste{limit(x * log(x),x = 0,"right")}
+\spadpaste{limit(x * log(x),x = 0)}
+\menudownlink{Two-sided Limits}{ExLimitTwoSided}
+\spadpaste{limit(sqrt(y**2)/y,y = 0)}
+\spadpaste{limit(sqrt(1 - cos(t))/t,t = 0)}
+\menudownlink{Limits at Infinity}{ExLimitInfinite}
+\spadpaste{limit(sqrt(3*x**2 + 1)/(5*x),x = \%plusInfinity)}
+\spadpaste{limit(sqrt(3*x**2 + 1)/(5*x),x = \%minusInfinity)}
+\menudownlink{Real Limits vs. Complex Limits}{ExLimitRealComplex}
+\spadpaste{limit(z * sin(1/z),z = 0)}
+\spadpaste{complexLimit(z * sin(1/z),z = 0)}
+\menudownlink{Complex Limits at Infinity}{ExLimitComplexInfinite}
+\spadpaste{complexLimit((2 + z)/(1 - z),z = \%infinity)}
+\spadpaste{limit(sin(x)/x,x = \%plusInfinity)}
+\spadpaste{complexLimit(sin(x)/x,x = \%infinity)}
+\endmenu\endscroll\end{page}
+
+@
+\subsection{Matrices}
+\label{Menuexmatrix}
+\begin{itemize}
+\item ExMatrixBasicFunction \ref{ExMatrixBasicFunction} on 
+page~\pageref{ExMatrixBasicFunction}
+\item ExConstructMatrix \ref{ExConstructMatrix} on 
+page~\pageref{ExConstructMatrix}
+\item ExTraceMatrix \ref{ExTraceMatrix} on page~\pageref{ExTraceMatrix}
+\item ExDeterminantMatrix \ref{ExDeterminantMatrix} on 
+page~\pageref{ExDeterminantMatrix}
+\item ExInverseMatrix \ref{ExInverseMatrix} on page~\pageref{ExInverseMatrix}
+\item ExRankMatrix \ref{ExRankMatrix} on page~\pageref{ExRankMatrix}
+\end{itemize}
+\index{pages!Menuexmatrix!coverex.ht}
+\index{coverex.ht!pages!Menuexmatrix}
+\index{Menuexmatrix!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexmatrix}{Matrices}
+\beginscroll\beginmenu
+\menudownlink{Basic Arithmetic Operations on Matrices}{ExMatrixBasicFunction}
+\spadpaste{m1 := matrix([[1,-2,1],[4,2,-4]]) \bound{m1}}
+\spadpaste{m2 := matrix([[1,0,2],[20,30,10],[0,200,100]]) \bound{m2}}
+\spadpaste{m3 := matrix([[1,2,3],[2,4,6]]) \bound{m3}}
+\spadpaste{m1 + m3 \free{m1} \free{m3}}
+\spadpaste{100 * m1 \free{m1}}
+\spadpaste{m1 * m2 \free{m1} \free{m2}}
+\spadpaste{-m1 + m3 * m2 \free{m1} \free{m2} \free{m3}}
+\spadpaste{m3 *vector([1,0,1]) \free{m3}}
+\menudownlink{Constructing new Matrices}{ExConstructMatrix}
+\spadpaste{diagonalMatrix([1,2,3,2,1])}
+\spadpaste{subMatrix(matrix([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]]), 1,3,2,4)}
+\spadpaste{horizConcat(matrix([[1,2,3],[6,7,8]]),matrix([[11,12,13],[55,77,88]])) }
+\spadpaste{vertConcat(matrix([[1,2,3],[6,7,8]]),matrix([[11,12,13],[55,77,88]])) }
+\spadpaste{b:=matrix([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]]) \bound{b}}
+\spadpaste{setsubMatrix!(b,1,1,transpose(subMatrix(b,1,3,1,3)))\free{b}}
+\menudownlink{Trace of a Matrix}{ExTraceMatrix}
+\spadpaste{trace( matrix([[1,x,x**2,x**3],[1,y,y**2,y**3],[1,z,z**2,z**3],[1,u,u**2,u**3]]) )}
+\menudownlink{Determinant of a Matrix}{ExDeterminantMatrix}
+\spadpaste{determinant(matrix([[1,2,3,4],[2,3,2,5],[3,4,5,6],[4,1,6,7]]))}
+\menudownlink{Inverse of a Matrix}{ExInverseMatrix}
+\spadpaste{inverse(matrix([[1,2,1],[-2,3,4],[-1,5,6]])) }
+\menudownlink{Rank of a Matrix}{ExRankMatrix}
+\spadpaste{rank(matrix([[0,4,1],[5,3,-7],[-5,5,9]]))}
+\endmenu\endscroll\end{page}
+
+@
+\subsection{2-D Graphics}
+\label{Menuexplot2d}
+\begin{itemize}
+\item ExPlot2DFunctions \ref{ExPlot2DFunctions} on 
+page~\pageref{ExPlot2DFunctions}
+\item ExPlot2DParametric \ref{ExPlot2DParametric} on 
+page~\pageref{ExPlot2DParametric}
+\item ExPlot2DPolar \ref{ExPlot2DPolar} on page~\pageref{ExPlot2DPolar}
+\item ExPlot2DAlgebraic \ref{ExPlot2DAlgebraic} on 
+page~\pageref{ExPlot2DAlgebraic}
+\end{itemize}
+\index{pages!Menuexplot2d!coverex.ht}
+\index{coverex.ht!pages!Menuexplot2d}
+\index{Menuexplot2d!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexplot2d}{2-D Graphics}
+\beginscroll\beginmenu
+\menudownlink{Plotting Functions of One Variable}{ExPlot2DFunctions}
+\graphpaste{draw(sin(tan(x)) - tan(sin(x)),x = 0..6)}
+\menudownlink{Plotting Parametric Curves}{ExPlot2DParametric}
+\graphpaste{draw(curve(9 * sin(3*t/4),8 * sin(t)),t = -4*\%pi..4*\%pi)}
+\menudownlink{Plotting Using Polar Coordinates}{ExPlot2DPolar}
+\graphpaste{draw(sin(4*t/7),t = 0..14*\%pi,coordinates == polar)}
+\menudownlink{Plotting Plane Algebraic Curves}{ExPlot2DAlgebraic}
+\graphpaste{draw(y**2 + y - (x**3 - x) = 0, x, y, range == [-2..2,-2..1])}
+\endmenu\endscroll\end{page}
+
+@
+\subsection{3-D Graphics}
+\label{Menuexplot3d}
+\begin{itemize}
+\item ExPlot3DFunctions \ref{ExPlot3DFunctions} on 
+page~\pageref{ExPlot3DFunctions}
+\item ExPlot3DParametricSurface \ref{ExPlot3DParametricSurface} on 
+page~\pageref{ExPlot3DParametricSurface}
+\item ExPlot3DParametricCurve \ref{ExPlot3DParametricCurve} on 
+page~\pageref{ExPlot3DParametricCurve}
+\end{itemize}
+\index{pages!Menuexplot3d!coverex.ht}
+\index{coverex.ht!pages!Menuexplot3d}
+\index{Menuexplot3d!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexplot3d}{3-D Graphics}
+\beginscroll\beginmenu
+\menudownlink{Plotting Functions of Two Variables}{ExPlot3DFunctions}
+\graphpaste{draw(cos(x*y),x = -3..3,y = -3..3)}
+\menudownlink{Plotting Parametric Surfaces}{ExPlot3DParametricSurface}
+\graphpaste{draw(surface(5*sin(u)*cos(v),4*sin(u)*sin(v),3*cos(u)),u=0..\%pi,v=0..2*\%pi)}
+\graphpaste{draw(surface(u*cos(v),u*sin(v),u),u=0..4,v=0..2*\%pi)}
+\menudownlink{Plotting Parametric Curves}{ExPlot3DParametricCurve}
+\graphpaste{draw(curve(cos(t),sin(t),t),t=0..6)}
+\graphpaste{draw(curve(t,t**2,t**3),t=-3..3)}
+\endmenu\endscroll\end{page}
+
+@
+\subsection{Series}
+\label{Menuexseries}
+\begin{itemize}
+\item ExSeriesConvert \ref{ExSeriesConvert} on page~\pageref{ExSeriesConvert}
+\item ExSeriesManipulate \ref{ExSeriesManipulate} on 
+page~\pageref{ExSeriesManipulate}
+\item ExSeriesFunctions \ref{ExSeriesFunctions} on 
+page~\pageref{ExSeriesFunctions}
+\item ExSeriesSubstitution \ref{ExSeriesSubstitution} on 
+page~\pageref{ExSeriesSubstitution}
+\end{itemize}
+\index{pages!Menuexseries!coverex.ht}
+\index{coverex.ht!pages!Menuexseries}
+\index{Menuexseries!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexseries}{Series}
+\beginscroll\beginmenu
+\menudownlink{Converting Expressions to Series}{ExSeriesConvert}
+\spadpaste{series(sin(a*x),x = 0)}
+\spadpaste{series(sin(a*x),a = \%pi/4)}
+\menudownlink{Manipulating Power Series}{ExSeriesManipulate}
+\spadpaste{f := series(1/(1-x),x = 0) \bound{f}}
+\spadpaste{f ** 2 \free{f}}
+\menudownlink{Functions on Power Series}{ExSeriesFunctions}
+\spadpaste{f := series(1/(1-x),x = 0) \bound{f1}}
+\spadpaste{g := log(f) \free{f1} \bound{g}}
+\spadpaste{exp(g) \free{g}}
+\menudownlink{Substituting Numerical Values in Power Series}{ExSeriesSubstitution}
+\spadpaste{f := taylor(exp(x)) \bound{f2}}
+\spadpaste{eval(f,1.0) \free{f2}}
+\endmenu\endscroll\end{page}
+
+@
+\subsection{Summations}
+\label{Menuexsum}
+\begin{itemize}
+\item ExSumListEntriesI \ref{ExSumListEntriesI} on 
+page~\pageref{ExSumListEntriesI}
+\item ExSumListEntriesII \ref{ExSumListEntriesII} on 
+page~\pageref{ExSumListEntriesII}
+\item ExSumApproximateE \ref{ExSumApproximateE} on 
+page~\pageref{ExSumApproximateE}
+\item ExSumClosedForm \ref{ExSumClosedForm} on page~\pageref{ExSumClosedForm}
+\item ExSumCubes \ref{ExSumCubes} on page~\pageref{ExSumCubes}
+\item ExSumPolynomial \ref{ExSumPolynomial} on page~\pageref{ExSumPolynomial}
+\item ExSumGeneralFunction \ref{ExSumGeneralFunction} on 
+page~\pageref{ExSumGeneralFunction}
+\item ExSumInfinite \ref{ExSumInfinite} on page~\pageref{ExSumInfinite}
+\end{itemize}
+\index{pages!Menuexsum!coverex.ht}
+\index{coverex.ht!pages!Menuexsum}
+\index{Menuexsum!coverex.ht!pages}
+<<coverex.ht>>=
+\begin{page}{Menuexsum}{Summations}
+\beginscroll\beginmenu
+\menudownlink{Summing the Entries of a List I}{ExSumListEntriesI}
+\spadpaste{[i for i in 1..15]}
+\spadpaste{reduce(+,[i for i in 1..15])}
+\menudownlink{Summing the Entries of a List II}{ExSumListEntriesII}
+\spadpaste{[n**2 for n in 5..20]}
+\spadpaste{reduce(+,[n**2 for n in 5..20])}
+\menudownlink{Approximating e}{ExSumApproximateE}
+\spadpaste{reduce(+,[1.0/factorial(n) for n in 0..20])}
+\menudownlink{Closed Form Summations}{ExSumClosedForm}
+\spadpaste{s := sum(k**2,k = a..b) \bound{s}}
+\spadpaste{eval(s,[a,b],[1,25]) \free{s}}
+\spadpaste{reduce(+,[i**2 for i in 1..25])}
+\menudownlink{Sums of Cubes}{ExSumCubes}
+\spadpaste{sum(k**3,k = 1..n)}
+\spadpaste{sum(k,k = 1..n) ** 2}
+\menudownlink{Sums of Polynomials}{ExSumPolynomial}
+\spadpaste{sum(3*k**2/(c**2 + 1) + 12*k/d,k = (3*a)..(4*b))}
+\menudownlink{Sums of General Functions}{ExSumGeneralFunction}
+\spadpaste{sum(k * x**k,k = 1..n)}
+\menudownlink{Infinite Sums}{ExSumInfinite}
+\spadpaste{limit( sum(1/(k * (k + 2)),k = 1..n) ,n = \%plusInfinity)}
+\endmenu\endscroll\end{page}
+
+@
+\section{decimal.ht}
+<<decimal.ht>>=
+\newcommand{\DecimalExpansionXmpTitle}{DecimalExpansion}
+\newcommand{\DecimalExpansionXmpNumber}{9.15}
+
+@
+\subsection{Decimal Expansion}
+\label{DecimalExpansionXmpPage}
+\begin{itemize}
+\item BinaryExpansionXmpPage \ref{BinaryExpansionXmpPage} on
+page~pageref{BinaryExpansionXmpPage}
+\item HexadecimalExpansionXmpPage \ref{HexadecimalExpansionXmpPage} on
+page~pageref{HexadecimalExpansionXmpPage}
+\item RadicExpansionPage \ref{RadicExpansionPage} on
+page~pageref{RadicExpansionPage}
+\end{itemize}
+\index{pages!DecimalExpansionXmpPage!decimal.ht}
+\index{decimal.ht!pages!DecimalExpansionXmpPage}
+\index{DecimalExpansionXmpPage!decimal.ht!pages}
+<<decimal.ht>>=
+\begin{page}{DecimalExpansionXmpPage}{Decimal Expansion}
+\beginscroll
+
+
+All rationals have repeating decimal expansions.
+Operations to access the individual digits of a decimal expansion can
+be obtained by converting the value to \spadtype{RadixExpansion(10)}.
+More examples of expansions are available in
+\downlink{`BinaryExpansion'}{BinaryExpansionXmpPage}\ignore{BinaryExpansion},
+\downlink{`HexadecimalExpansion'}{HexadecimalExpansionXmpPage}\ignore{HexadecimalExpansion}, and
+\downlink{`RadixExpansion'}{RadixExpansionXmpPage}\ignore{RadixExpansion}.
+\showBlurb{DecimalExpansion}
+
+\xtc{
+The operation \spadfunFrom{decimal}{DecimalExpansion} is used to create
+this expansion of type \spadtype{DecimalExpansion}.
+}{
+\spadpaste{r := decimal(22/7) \bound{r}}
+}
+\xtc{
+Arithmetic is exact.
+}{
+\spadpaste{r + decimal(6/7) \free{r}}
+}
+\xtc{
+The period of the expansion can be short or long \ldots
+}{
+\spadpaste{[decimal(1/i) for i in 350..354] }
+}
+\xtc{
+or very long.
+}{
+\spadpaste{decimal(1/2049) }
+}
+\xtc{
+These numbers are bona fide algebraic objects.
+}{
+\spadpaste{p := decimal(1/4)*x**2 + decimal(2/3)*x + decimal(4/9)  \bound{p}}
+}
+\xtc{
+}{
+\spadpaste{q := differentiate(p, x) \free{p}\bound{q}}
+}
+\xtc{
+}{
+\spadpaste{g := gcd(p, q)            \free{p q} \bound{g}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{derham.ht}
+<<derham.ht>>=
+\newcommand{\DeRhamComplexXmpTitle}{DeRhamComplex}
+\newcommand{\DeRhamComplexXmpNumber}{9.14}
+@
+\subsection{DeRhamComplex}
+\label{DeRhamComplexXmpPage}
+\index{pages!DeRhamComplexXmpPage!derham.ht}
+\index{derham.ht!pages!DeRhamComplexXmpPage}
+\index{DeRhamComplexXmpPage!derham.ht!pages}
+<<derham.ht>>=
+\begin{page}{DeRhamComplexXmpPage}{DeRhamComplex}
+\beginscroll
+ 
+The domain constructor \spadtype{DeRhamComplex} creates the
+class of differential forms of arbitrary degree over a coefficient ring.
+The De Rham complex constructor takes two arguments: a ring, \spad{coefRing,}
+and a list of coordinate variables.
+ 
+\xtc{
+This is the ring of coefficients.
+}{
+\spadpaste{coefRing := Integer \bound{coefRing}}
+}
+\xtc{
+These are the coordinate variables.
+}{
+\spadpaste{lv : List Symbol := [x,y,z] \bound{lv}}
+}
+\xtc{
+This is the De Rham complex of Euclidean three-space using
+coordinates \spad{x, y} and \spad{z.}
+}{
+\spadpaste{der := DERHAM(coefRing,lv) \free{coefRing}\free{lv}\bound{der}}
+}
+ 
+This complex allows us to describe differential forms having
+expressions of integers as coefficients.
+These coefficients can involve any number of variables, for example,
+\spad{f(x,t,r,y,u,z).}
+As we've chosen to work with ordinary
+Euclidean three-space, expressions involving these forms
+are treated as functions of
+\spad{x, y} and \spad{z} with the additional arguments
+\spad{t, r} and \spad{u} regarded as symbolic constants.
+\xtc{
+Here are some examples of coefficients.
+}{
+\spadpaste{R := Expression coefRing \free{coefRing}\bound{R}}
+}
+\xtc{
+}{
+\spadpaste{f : R := x**2*y*z-5*x**3*y**2*z**5 \free{R}\bound{f}}
+}
+\xtc{
+}{
+\spadpaste{g : R := z**2*y*cos(z)-7*sin(x**3*y**2)*z**2 \free{R}\bound{g}}
+}
+\xtc{
+}{
+\spadpaste{h : R :=x*y*z-2*x**3*y*z**2 \free{R}\bound{h}}
+}
+\xtc{
+We now define
+the multiplicative basis elements for the exterior algebra over \spad{R}.
+}{
+\spadpaste{dx : der := generator(1) \free{der}\bound{dx}}
+}
+\xtc{
+}{
+\spadpaste{dy : der := generator(2)\free{der}\bound{dy}}
+}
+\xtc{
+}{
+\spadpaste{dz : der := generator(3)\free{der}\bound{dz}}
+}
+\xtc{
+This is an alternative way to give the above assignments.
+}{
+\spadpaste{[dx,dy,dz] := [generator(i)\$der for i in 1..3] \free{der}\bound{dxyz}}
+}
+\xtc{
+Now we define some one-forms.
+}{
+\spadpaste{alpha : der := f*dx + g*dy + h*dz \bound{alpha}\free{der f g h dxyz}}
+}
+\xtc{
+}{
+\spadpaste{beta  : der := cos(tan(x*y*z)+x*y*z)*dx + x*dy \bound{beta}\free{der f g h dxyz}}
+}
+\xtc{
+A well-known theorem states that the composition of
+\spadfunFrom{exteriorDifferential}{DeRhamComplex}
+with itself is the zero map for continuous forms.
+Let's verify this theorem for \spad{alpha}.
+}{
+\spadpaste{exteriorDifferential alpha; \free{alpha}\bound{ed}}
+}
+\xtc{
+We suppressed the lengthy output of the last expression, but nevertheless, the
+composition is zero.
+}{
+\spadpaste{exteriorDifferential \% \free{ed}}
+}
+ 
+\xtc{
+Now we check that \spadfunFrom{exteriorDifferential}{DeRhamComplex}
+is a ``graded derivation'' \spad{D,} that is, \spad{D} satisfies:
+\begin{verbatim}
+D(a*b) = D(a)*b + (-1)**degree(a)*a*D(b)
+\end{verbatim}
+}{
+\spadpaste{gamma := alpha * beta \bound{gamma}\free{alpha}\free{beta}}
+}
+\xtc{
+We try this for the one-forms \spad{alpha} and \spad{beta}.
+}{
+\spadpaste{exteriorDifferential(gamma) - (exteriorDifferential(alpha)*beta - alpha * exteriorDifferential(beta)) \free{alpha beta gamma}}
+}
+\xtc{
+Now we define some ``basic operators'' (see \downlink{`Operator'}{OperatorXmpPage}\ignore{Operator}).
+}{
+\spadpaste{a : BOP := operator('a) \bound{ao}}
+}
+\xtc{
+}{
+\spadpaste{b : BOP := operator('b) \bound{bo}}
+}
+\xtc{
+}{
+\spadpaste{c : BOP := operator('c) \bound{co}}
+}
+\xtc{
+We also define
+some indeterminate one- and two-forms using these operators.
+}{
+\spadpaste{sigma := a(x,y,z) * dx + b(x,y,z) * dy + c(x,y,z) * dz \bound{sigma}\free{ao bo co dxyz}}
+}
+\xtc{
+}{
+\spadpaste{theta  := a(x,y,z) * dx * dy + b(x,y,z) * dx * dz + c(x,y,z) * dy * dz \bound{theta}\free{ao bo co dxyz}}
+}
+ 
+\xtc{
+This allows us to get formal definitions for the ``gradient'' \ldots
+}{
+\spadpaste{totalDifferential(a(x,y,z))\$der \free{ao der}}
+}
+\xtc{
+the ``curl'' \ldots
+}{
+\spadpaste{exteriorDifferential sigma \free{sigma}}
+}
+\xtc{
+and the ``divergence.''
+}{
+\spadpaste{exteriorDifferential theta \free{theta}}
+}
+ 
+\xtc{
+Note that the De Rham complex is an algebra with unity.
+This element \spad{1} is the basis for elements for zero-forms, that is,
+functions in our space.
+}{
+\spadpaste{one : der := 1 \bound{one}\free{der}}
+}
+ 
+\xtc{
+To convert a function to a function lying in the De Rham complex,
+multiply the function by ``one.''
+}{
+\spadpaste{g1 : der := a([x,t,y,u,v,z,e]) * one \free{der one ao}\bound{g1}}
+}
+\xtc{
+A current limitation of Axiom forces you to write
+functions with more than four arguments using square brackets in this way.
+}{
+\spadpaste{h1 : der := a([x,y,x,t,x,z,y,r,u,x]) * one \free{der one ao}\bound{h1}}
+}
+ 
+\xtc{
+Now note how the system keeps track of where your coordinate functions
+are located in expressions.
+}{
+\spadpaste{exteriorDifferential g1 \free{g1}}
+}
+\xtc{
+}{
+\spadpaste{exteriorDifferential h1 \free{h1}}
+}
+ 
+\xtc{
+In this example of Euclidean three-space, the basis for the De Rham complex
+consists of the eight forms: \spad{1}, \spad{dx}, \spad{dy}, \spad{dz},
+\spad{dx*dy}, \spad{dx*dz}, \spad{dy*dz}, and \spad{dx*dy*dz}.
+}{
+\spadpaste{coefficient(gamma, dx*dy) \free{gamma dxyz}}
+}
+\xtc{
+}{
+\spadpaste{coefficient(gamma, one) \free{gamma one}}
+}
+\xtc{
+}{
+\spadpaste{coefficient(g1,one) \free{g1 one}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{dfloat.ht}
+<<dfloat.ht>>=
+\newcommand{\DoubleFloatXmpTitle}{DoubleFloat}
+\newcommand{\DoubleFloatXmpNumber}{9.17}
+
+@
+\subsection{DoubleFloat}
+\label{DoubleFloatXmpPage}
+\begin{itemize}
+\item ugGraphPage \ref{ugGraphPage} on
+page~pageref{ugGraphPage}
+\item ugProblemNumericPage \ref{ugProblemNumericPage} on
+page~pageref{ugProblemNumericPage}
+\item FloatXmpPage \ref{FloatXmpPage} on
+page~pageref{FloatXmpPage}
+\end{itemize}
+\index{pages!DoubleFloatXmpPage!dfloat.ht}
+\index{dfloat.ht!pages!DoubleFloatXmpPage}
+\index{DoubleFloatXmpPage!dfloat.ht!pages}
+<<dfloat.ht>>=
+\begin{page}{DoubleFloatXmpPage}{DoubleFloat}
+\beginscroll
+
+Axiom provides two kinds of floating point numbers.
+The domain \spadtype{Float} (abbreviation \spadtype{FLOAT})
+implements a model of arbitrary
+precision floating point numbers.
+The domain \spadtype{DoubleFloat} (abbreviation \spadtype{DFLOAT})
+is intended to make available
+hardware floating point arithmetic in Axiom.
+The actual model of floating point \spadtype{DoubleFloat} that provides is
+system-dependent.
+For example, on the IBM system 370 Axiom uses IBM double
+precision which has fourteen hexadecimal digits of precision or roughly
+sixteen decimal digits.
+Arbitrary precision floats allow the user to specify the
+precision at which arithmetic operations are computed.
+Although this is an attractive facility, it comes at a cost.
+Arbitrary-precision floating-point arithmetic typically takes
+twenty to two hundred times more time than hardware floating point.
+
+The usual arithmetic and elementary functions are available for
+\spadtype{DoubleFloat}.
+Use \spadsys{)show DoubleFloat} to get a list of operations or
+the \HyperName{} \Browse{} facility to get more extensive
+documentation about \spadtype{DoubleFloat}.
+
+\xtc{
+By default, floating point numbers that you enter into Axiom
+are of type \spadtype{Float}.
+}{
+\spadpaste{2.71828}
+}
+You must therefore tell Axiom that you want to use
+\spadtype{DoubleFloat} values and operations.
+The following are some conservative guidelines for getting
+Axiom to use \spadtype{DoubleFloat}.
+
+\xtc{
+To get a value of type \spadtype{DoubleFloat}, use a target with
+\spadSyntax{@}, \ldots
+}{
+\spadpaste{2.71828@DoubleFloat}
+}
+\xtc{
+a conversion, \ldots
+}{
+\spadpaste{2.71828 :: DoubleFloat}
+}
+\xtc{
+or an assignment to a declared variable.
+It is more efficient if you use a target rather than an explicit or
+implicit conversion.
+}{
+\spadpaste{eApprox : DoubleFloat := 2.71828 \bound{eApprox}}
+}
+
+\xtc{
+You also need to declare functions that work with
+\spadtype{DoubleFloat}.
+}{
+\spadpaste{avg : List DoubleFloat -> DoubleFloat \bound{avgDec}}
+}
+\xtc{
+}{
+\begin{spadsrc}[\bound{avg}\free{avgDec}]
+avg l ==
+  empty? l => 0 :: DoubleFloat
+  reduce(_+,l) / #l
+\end{spadsrc}
+}
+\xtc{
+}{
+\spadpaste{avg [] \free{avg}}
+}
+\xtc{
+}{
+\spadpaste{avg [3.4,9.7,-6.8] \free{avg}}
+}
+\xtc{
+Use package-calling for operations from \spadtype{DoubleFloat} unless
+the arguments themselves are already of type \spadtype{DoubleFloat}.
+}{
+\spadpaste{cos(3.1415926)\$DoubleFloat}
+}
+\xtc{
+}{
+\spadpaste{cos(3.1415926 :: DoubleFloat)}
+}
+
+By far, the most common usage of \spadtype{DoubleFloat} is for functions
+to be graphed.
+For more information about Axiom's numerical and graphical
+facilities, see
+\downlink{``\ugGraphTitle''}{ugGraphPage} in Section \ugGraphNumber\ignore{ugGraph},
+\downlink{``\ugProblemNumericTitle''}{ugProblemNumericPage} in Section \ugProblemNumericNumber\ignore{ugProblemNumeric}, and
+\downlink{`Float'}{FloatXmpPage}\ignore{Float}.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{dmp.ht}
+<<dmp.ht>>=
+\newcommand{\DistributedMultivariatePolynomialXmpTitle}
+{DistributedMultivariatePolynomial}
+\newcommand{\DistributedMultivariatePolynomialXmpNumber}{9.16}
+@
+\subsection{DistributedMultivariatePolynomial}
+\label{DistributedMultivariatePolynomialXmpPage}
+\begin{itemize}
+\item ugIntroVariablesPage \ref{ugIntroVariablesPage} on
+page~pageref{ugIntroVariablesPage}
+\item utTypesConvertPage \ref{utTypesConvertPage} on
+page~pageref{utTypesConvertPage}
+\item PolynomialXmpPage \ref{PolynomialXmpPage} on
+page~pageref{PolynomialXmpPage}
+\item UnivariatePolynomialXmpPage \ref{UnivariatePolynomialXmpPage} on
+page~pageref{UnivariatePolynomialXmpPage}
+\item MultivariatePolynomialXmpPage \ref{MultivariatePolynomialXmpPage} on
+page~pageref{MultivariatePolynomialXmpPage}
+\end{itemize}
+\index{pages!DistributedMultivariatePolynomialXmpPage!dmp.ht}
+\index{dmp.ht!pages!DistributedMultivariatePolynomialXmpPage}
+\index{DistributedMultivariatePolynomialXmpPage!dmp.ht!pages}
+<<dmp.ht>>=
+\begin{page}{DistributedMultivariatePolynomialXmpPage}
+{DistributedMultivariatePolynomial}
+\beginscroll
+
+\texht{\hyphenation{
+Homo-gen-eous-Dis-tributed-Multi-var-i-ate-Pol-y-nomial
+}}{}
+
+\spadtype{DistributedMultivariatePolynomial} and
+\spadtype{HomogeneousDistributedMultivariatePolynomial}, abbreviated
+\spadtype{DMP} and \spadtype{HDMP}, respectively, are very similar to
+\spadtype{MultivariatePolynomial} except that they are represented and
+displayed in a non-recursive manner.
+\xtc{
+}{
+\spadpaste{(d1,d2,d3) : DMP([z,y,x],FRAC INT) \bound{d1dec d2dec d3dec}}
+}
+\xtc{
+The constructor
+\spadtype{DMP} orders its monomials lexicographically while
+\spadtype{HDMP} orders them by total order refined by reverse
+lexicographic order.
+}{
+\spadpaste{d1 := -4*z + 4*y**2*x + 16*x**2 + 1 \bound{d1}\free{d1dec}}
+}
+\xtc{
+}{
+\spadpaste{d2 := 2*z*y**2 + 4*x + 1 \bound{d2}\free{d2dec}}
+}
+\xtc{
+}{
+\spadpaste{d3 := 2*z*x**2 - 2*y**2 - x \bound{d3}\free{d3dec}}
+}
+\xtc{
+These constructors are mostly used in \texht{Gr\"{o}bner}{Groebner}
+basis calculations.
+}{
+\spadpaste{groebner [d1,d2,d3] \free{d1 d2 d3}}
+}
+\xtc{
+}{
+\spadpaste{(n1,n2,n3) : HDMP([z,y,x],FRAC INT) \bound{ndec}}
+}
+\xtc{
+}{
+\spadpaste{(n1,n2,n3) := (d1,d2,d3) \free{ndec}\bound{n}\free{d1 d2 d3}}
+}
+\xtc{
+Note that we get a different
+\texht{Gr\"{o}bner}{Groebner} basis
+when we use the \spadtype{HDMP} polynomials, as expected.
+}{
+\spadpaste{groebner [n1,n2,n3] \free{n}}
+}
+
+\spadtype{GeneralDistributedMultivariatePolynomial} is somewhat
+more flexible in the sense that as well as accepting a list of
+variables to specify the variable ordering, it also takes a
+predicate on exponent vectors to specify the term ordering.
+With this polynomial type the user can experiment with the effect
+of using completely arbitrary term orderings.
+This flexibility is mostly important for algorithms such as
+\texht{Gr\"{o}bner}{Groebner} basis calculations which can be very
+sensitive to term ordering.
+
+For more information on related topics, see
+\downlink{``\ugIntroVariablesTitle''}{ugIntroVariablesPage} 
+in Section \ugIntroVariablesNumber\ignore{ugIntroVariables},
+\downlink{``\ugTypesConvertTitle''}{ugTypesConvertPage} 
+in Section \ugTypesConvertNumber\ignore{ugTypesConvert},
+\downlink{`Polynomial'}{PolynomialXmpPage}\ignore{Polynomial},
+\downlink{`UnivariatePolynomial'}{UnivariatePolynomialXmpPage}
+\ignore{UnivariatePolynomial}, and
+\downlink{`MultivariatePolynomial'}{MultivariatePolynomialXmpPage}
+\ignore{MultivariatePolynomial}.
+%
+\showBlurb{DistributedMultivariatePolynomial}
+\endscroll
+\autobuttons
+\end{page}
+%
+
+@
+\section{eq.ht}
+<<eq.ht>>=
+\newcommand{\EquationXmpTitle}{Equation}
+\newcommand{\EquationXmpNumber}{9.19}
+
+@
+\subsection{Equation}
+\label{EquationXmpPage}
+\index{pages!EquationXmpPage!eq.ht}
+\index{eq.ht!pages!EquationXmpPage}
+\index{EquationXmpPage!eq.ht!pages}
+<<eq.ht>>=
+\begin{page}{EquationXmpPage}{Equation}
+\beginscroll
+
+The \spadtype{Equation} domain provides equations as mathematical objects.
+These are used, for example, as the input to various
+\spadfunFrom{solve}{TransSolvePackage} operations.
+
+\xtc{
+Equations are created using the equals symbol, \spadopFrom{=}{Equation}.
+}{
+\spadpaste{eq1 := 3*x + 4*y = 5 \bound{eq1}}
+}
+\xtc{
+}{
+\spadpaste{eq2 := 2*x + 2*y = 3 \bound{eq2}}
+}
+\xtc{
+The left- and right-hand sides of an equation are accessible using
+the operations \spadfunFrom{lhs}{Equation} and \spadfunFrom{rhs}{Equation}.
+}{
+\spadpaste{lhs eq1 \free{eq1}}
+}
+\xtc{
+}{
+\spadpaste{rhs eq1 \free{eq1}}
+}
+
+\xtc{
+Arithmetic operations are supported
+and operate on both sides of the equation.
+}{
+\spadpaste{eq1 + eq2   \free{eq1 eq2}}
+}
+\xtc{
+}{
+\spadpaste{eq1 * eq2   \free{eq1 eq2}}
+}
+\xtc{
+}{
+\spadpaste{2*eq2 - eq1 \free{eq1 eq2}}
+}
+\xtc{
+Equations may be created for any type so the arithmetic operations
+will be defined only when they make sense.  For example,
+exponentiation is not defined for equations involving non-square matrices.
+}{
+\spadpaste{eq1**2 \free{eq1}}
+}
+
+\xtc{
+Note that an equals symbol is also used to {\it test}
+for equality of values in certain contexts.
+For example, \spad{x+1} and \spad{y} are unequal as polynomials.
+}{
+\spadpaste{if x+1 = y then "equal" else "unequal"}
+}
+\xtc{
+}{
+\spadpaste{eqpol := x+1 = y \bound{eqpol}}
+}
+\xtc{
+If an equation is used where a \spadtype{Boolean} value
+is required, then it is evaluated using the equality
+test from the operand type.
+}{
+\spadpaste{if eqpol then "equal" else "unequal" \free{eqpol}}
+}
+\xtc{
+If one wants a \spadtype{Boolean} value rather than an equation,
+all one has to do is ask!
+}{
+\spadpaste{eqpol::Boolean \free{eqpol}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{eqtbl.ht}
+<<eqtbl.ht>>=
+\newcommand{\EqTableXmpTitle}{EqTable}
+\newcommand{\EqTableXmpNumber}{9.18}
+@
+\subsection{EqTable}
+\label{EqTableXmpPage}
+See TableXmpPage \ref{TableXmpPage} on page~\pageref{TableXmpPage}
+\index{pages!EqTableXmpPage!eqtbl.ht}
+\index{eqtbl.ht!pages!EqTableXmpPage}
+\index{EqTableXmpPage!eqtbl.ht!pages}
+<<eqtbl.ht>>=
+\begin{page}{EqTableXmpPage}{EqTable}
+\beginscroll
+
+The \spadtype{EqTable} domain provides tables where the keys are compared
+using \spadfunFrom{eq?}{EqTable}.
+Keys are considered equal only if they are the same instance of a
+structure.
+This is useful if the keys are themselves updatable structures.
+Otherwise, all operations are the same as for type \spadtype{Table}.
+See \downlink{`Table'}{TableXmpPage}\ignore{Table} 
+for general information about tables.
+\showBlurb{EqTable}
+
+\xtc{
+The operation \spadfunFrom{table}{EqTable} is here used to create a table
+where the keys are lists of integers.
+}{
+\spadpaste{e: EqTable(List Integer, Integer) := table() \bound{e}}
+}
+\xtc{
+These two lists are equal according to \spadopFrom{=}{List},
+but not according to \spadfunFrom{eq?}{List}.
+}{
+\spadpaste{l1 := [1,2,3] \bound{l1}}
+}
+\xtc{
+}{
+\spadpaste{l2 := [1,2,3] \bound{l2}}
+}
+\xtc{
+Because the two lists are not \spadfunFrom{eq?}{List}, separate values
+can be stored under each.
+}{
+\spadpaste{e.l1 := 111   \free{e l1} \bound{e1}}
+}
+\xtc{
+}{
+\spadpaste{e.l2 := 222   \free{e1 l2} \bound{e2}}
+}
+\xtc{
+}{
+\spadpaste{e.l1          \free{e2 l1}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{evalex.ht}
+\subsection{Example of Standard Evaluation}
+\label{PrefixEval}
+\index{pages!PrefixEval!evalex.ht}
+\index{evalex.ht!pages!PrefixEval}
+\index{PrefixEval!evalex.ht!pages}
+<<evalex.ht>>=
+\begin{page}{PrefixEval}{Example of Standard Evaluation}
+\beginscroll
+We illustrate the general evaluation of {\em op a} for some
+prefix operator {\em op} and operand {\em a}
+by the example: {\em cos(2)}.
+The evaluation steps are as follows:
+\vspace{1}\newline
+1.\tab{3}{\em a} evaluates to a value of some type.
+\newline\tab{3}{\em Example:} {\em 2} evaluates to {\em 2} of type 
+\spadtype{Integer}
+\newline
+2.\tab{3}Axiom then chooses a function {\em op} based on the 
+type of {\em a}.
+\newline\tab{3}{\em Example:} The function {\em cos:} \spadtype{Float} {\em ->}
+\spadtype{Float} is chosen.
+\newline
+3.\tab{3}If the argument type of the function is different from that 
+of {\em a},
+then the system coerces
+%\downlink{coerces}{Coercion}
+the value of {\em a} to the
+argument type.
+\newline\tab{3}{\em Example:} The integer {\em 2} is coerced to the 
+float {\em 2.0}.
+\newline
+4.\tab{3}The function is then applied to the value of {\em a} to 
+produce the value
+for {\em op a}.
+\newline\tab{3}{\em Example:} The function {\em cos} is applied to {\em 2.0}.
+\vspace{1}\newline
+Try it:
+\example{cos(2)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Example of Standard Evaluation}
+\label{InfixEval}
+\index{pages!InfixEval!evalex.ht}
+\index{evalex.ht!pages!InfixEval}
+\index{InfixEval!evalex.ht!pages}
+<<evalex.ht>>=
+\begin{page}{InfixEval}{Example of Standard Evaluation}
+\beginscroll
+We illustrate the general evaluation of {\em a op b} for some
+infix operator {\em op} with operands {\em a} and {\em b}
+by the example: {\em 2 + 3.4}.
+The evaluation steps are as follows:
+\vspace{1}\newline
+1.\tab{3}{\em a} and {\em b} are evaluated, each producing a value and a type.
+\newline\tab{3}{\em Example:} {\em 2} evaluates to {\em 2} of type 
+\spadtype{Integer};
+{\em 3.4} evaluates to {\em 3.4} of type \spadtype{Float}.
+\vspace{1}\newline
+2.\tab{3}Axiom then chooses a function {\em op} based on the 
+types of {\em a} and {\em b}.
+\newline\tab{3}{\em Example:} The function {\em +: (D,D) -> D}
+is chosen requiring a common type {\em D} for both arguments to {\em +}.
+An operation called {\em resolve} determines the `smallest common 
+type' \spadtype{Float}.
+\vspace{1}\newline
+3.\tab{3}If the argument types for the function are different from
+those of {\em a} and {\em b},
+then the system coerces
+%\downlink{coerces}{Coercion}
+the values to the argument types.
+\newline\tab{3}{\em Example:} The integer {\em 2} is coerced to the 
+float {\em 2.0}.
+\vspace{1}\newline
+4.\tab{3}The function is then applied to the values of {\em a} and {\em b}
+to produce the value for {\em a op b}.
+\newline\tab{3}{\em Example:} The function {\em +: (D,D) -> D}, where
+{\em D} = \spadtype{Float} is applied to {\em 2.0} and {\em 3.4} to 
+produce {\em 5.4}.
+\vspace{1}\newline
+Try it:
+\example{2 + 3.4}
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{exdiff.ht}
+\subsection{Computing Derivatives}
+\label{ExDiffBasic}
+\index{pages!ExDiffBasic!exdiff.ht}
+\index{exdiff.ht!pages!ExDiffBasic}
+\index{ExDiffBasic!exdiff.ht!pages}
+<<exdiff.ht>>=
+\begin{page}{ExDiffBasic}{Computing Derivatives}
+\beginscroll
+To compute a derivative, you must specify an expression and a variable
+of differentiation.
+For example, to compute the derivative of {\em sin(x) * exp(x**2)} with respect to the
+variable {\em x}, issue the following command:
+\spadpaste{differentiate(sin(x) * exp(x**2),x)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Derivatives of Functions of Several Variables}
+\label{ExDiffSeveralVariables}
+\index{pages!ExDiffSeveralVariables!exdiff.ht}
+\index{exdiff.ht!pages!ExDiffSeveralVariables}
+\index{ExDiffSeveralVariables!exdiff.ht!pages}
+<<exdiff.ht>>=
+\begin{page}{ExDiffSeveralVariables}
+{Derivatives of Functions of Several Variables}
+\beginscroll
+Partial derivatives are computed in the same way as derivatives of functions
+of one variable: you specify the function and a variable of differentiation.
+For example:
+\spadpaste{differentiate(sin(x) * tan(y)/(x**2 + y**2),x)}
+\spadpaste{differentiate(sin(x) * tan(y)/(x**2 + y**2),y)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Derivatives of Higher Order}
+\label{ExDiffHigherOrder}
+\index{pages!ExDiffHigherOrder!exdiff.ht}
+\index{exdiff.ht!pages!ExDiffHigherOrder}
+\index{ExDiffHigherOrder!exdiff.ht!pages}
+<<exdiff.ht>>=
+\begin{page}{ExDiffHigherOrder}{Derivatives of Higher Order}
+\beginscroll
+To compute a derivative of higher order (e.g. a second or third derivative),
+pass the order as the third argument of the function 'differentiate'.
+For example, to compute the fourth derivative of {\em exp(x**2)}, issue the
+following command:
+\spadpaste{differentiate(exp(x**2),x,4)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Multiple Derivatives I}
+\label{ExDiffMultipleI}
+\index{pages!ExDiffMultipleI!exdiff.ht}
+\index{exdiff.ht!pages!ExDiffMultipleI}
+\index{ExDiffMultipleI!exdiff.ht!pages}
+<<exdiff.ht>>=
+\begin{page}{ExDiffMultipleI}{Multiple Derivatives I}
+\beginscroll
+When given a function of several variables, you may take derivatives repeatedly
+and with respect to different variables.
+The following command differentiates the function {\em sin(x)/(x**2 + y**2)}
+first with respect to {\em x} and then with respect to {\em y}:
+\spadpaste{differentiate(sin(x)/(x**2 + y**2),[x,y])}
+As you can see, we first specify the function and then a list of the variables
+of differentiation.
+Variables may appear on the list more than once.
+For example, the following command differentiates the same function with
+respect to {\em x} and then twice with respect to {\em y}.
+\spadpaste{differentiate(sin(x)/(x**2 + y**2),[x,y,y])}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Multiple Derivatives II}
+\label{ExDiffMultipleII}
+\index{pages!ExDiffMultipleII!exdiff.ht}
+\index{exdiff.ht!pages!ExDiffMultipleII}
+\index{ExDiffMultipleII!exdiff.ht!pages}
+<<exdiff.ht>>=
+\begin{page}{ExDiffMultipleII}{Multiple Derivatives II}
+\beginscroll
+You may also compute multiple derivatives by specifying a list of variables
+together with a list of multiplicities.
+For example, to differentiate {\em cos(z)/(x**2 + y**3)}
+first with respect to {\em x},
+then twice with respect to {\em y}, then three times with respect to {\em z},
+issue the following command:
+\spadpaste{differentiate(cos(z)/(x**2 + y**3),[x,y,z],[1,2,3])}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Derivatives of Functions Involving Formal Integrals}
+\label{ExDiffFormalIntegral}
+\index{pages!ExDiffFormalIntegral!exdiff.ht}
+\index{exdiff.ht!pages!ExDiffFormalIntegral}
+\index{ExDiffFormalIntegral!exdiff.ht!pages}
+<<exdiff.ht>>=
+\begin{page}{ExDiffFormalIntegral}
+{Derivatives of Functions Involving Formal Integrals}
+\beginscroll
+When a function does not have a closed-form antiderivative, Axiom
+returns a formal integral.
+A typical example is
+\spadpaste{f := integrate(sqrt(1 + t**3),t) \bound{f}}
+This formal integral may be differentiated, either by itself or in any
+combination with other functions:
+\spadpaste{differentiate(f,t) \free{f}}
+\spadpaste{differentiate(f * t**2,t) \free{f}}
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{exit.ht}
+\newcommand{\ExitXmpTitle}{Exit}
+\newcommand{\ExitXmpNumber}{9.20}
+
+@
+\subsection{Exit}
+\label{ExitXmpPage}
+\index{pages!ExitXmpPage!exit.ht}
+\index{exit.ht!pages!ExitXmpPage}
+\index{ExitXmpPage!exit.ht!pages}
+<<exit.ht>>=
+\begin{page}{ExitXmpPage}{Exit}
+% =====================================================================
+\beginscroll
+
+A function that does not return directly to its caller has
+\spadtype{Exit} as its return type.
+The operation \spadfun{error} is an example of one which does not return
+to its caller.
+Instead, it causes a return to top-level.
+\xtc{
+}{
+\spadpaste{n := 0 \bound{n}}
+}
+\xtc{
+The function \userfun{gasp} is given return type \spadtype{Exit} since it is
+guaranteed never to return a value to its caller.
+}{
+\begin{spadsrc}[\bound{gasp}\free{n}]
+gasp(): Exit ==
+    free n
+    n := n + 1
+    error "Oh no!"
+\end{spadsrc}
+}
+\xtc{
+The return type of \userfun{half} is determined by resolving the types of
+the two branches of the \spad{if}.
+}{
+\begin{spadsrc}[\bound{half}\free{gasp}]
+half(k) ==
+  if odd? k then gasp()
+  else k quo 2
+\end{spadsrc}
+}
+\xtc{
+Because
+\userfun{gasp} has the return type \spadtype{Exit},
+the type of \spad{if} in \userfun{half} is resolved to be \spadtype{Integer}.
+}{
+\spadpaste{half 4 \free{half}\bound{app1}}
+}
+\xtc{
+}{
+\spadpaste{half 3 \free{half app1}\bound{app2}}
+}
+\xtc{
+}{
+\spadpaste{n \free{app2}}
+}
+
+For functions which return no value at all, use \spadtype{Void}.
+See \downlink{``\ugUserTitle''}{ugUserPage} in Section \ugUserNumber\ignore{ugUser} and \downlink{`Void'}{VoidXmpPage}\ignore{Void} for more information.
+%
+\showBlurb{Exit}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{exlap.ht}
+\subsection{Laplace transform with a single pole}
+\label{ExLapSimplePole}
+\index{pages!ExLapSimplePole!exlap.ht}
+\index{exlap.ht!pages!ExLapSimplePole}
+\index{ExLapSimplePole!exlap.ht!pages}
+<<exlap.ht>>=
+\begin{page}{ExLapSimplePole}{Laplace transform with a single pole}
+\beginscroll
+The Laplace transform of t^n e^(a t) has a pole of order n+1 at x = a
+and no other pole. We divide by n! to get a monic denominator in the
+answer.
+\spadpaste{laplace(t**4 * exp(-a*t) / factorial(4), t, s)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Laplace transform of a trigonometric function}
+\label{ExLapTrigTrigh}
+\index{pages!ExLapTrigTrigh!exlap.ht}
+\index{exlap.ht!pages!ExLapTrigTrigh}
+\index{ExLapTrigTrigh!exlap.ht!pages}
+<<exlap.ht>>=
+\begin{page}{ExLapTrigTrigh}{Laplace transform of a trigonometric function}
+\beginscroll
+Rather than looking up into a table, we use the normalizer to rewrite
+the trigs and hyperbolic trigs to complex exponentials and
+logarithms.
+\spadpaste{laplace(sin(a*t) * cosh(a*t) - cos(a*t) * sinh(a*t), t, s)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Laplace transform requiring a definite integration}
+\label{ExLapDefInt}
+\index{pages!ExLapDefInt!exlap.ht}
+\index{exlap.ht!pages!ExLapDefInt}
+\index{ExLapDefInt!exlap.ht!pages}
+<<exlap.ht>>=
+\begin{page}{ExLapDefInt}{Laplace transform requiring a definite integration}
+\beginscroll
+When powers of t appear in the denominator, computing the laplace transform
+requires integrating the result of another laplace transform between a
+symbol and infinity. We use the full power of Axiom's integrator
+in such cases.
+\spadpaste{laplace(2/t * (1 - cos(a*t)), t, s)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Laplace transform of exponentials}
+\label{ExLapExpExp}
+\index{pages!ExLapExpExp!exlap.ht}
+\index{exlap.ht!pages!ExLapExpExp}
+\index{ExLapExpExp!exlap.ht!pages}
+<<exlap.ht>>=
+\begin{page}{ExLapExpExp}{Laplace transform of exponentials}
+\beginscroll
+This is another example where it is necessary to
+integrate the result of another laplace transform.
+\spadpaste{laplace((exp(a*t) - exp(b*t))/t, t, s)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Laplace transform of an exponential integral}
+\label{ExLapSpecial1}
+\index{pages!ExLapSpecial1!exlap.ht}
+\index{exlap.ht!pages!ExLapSpecial1}
+\index{ExLapSpecial1!exlap.ht!pages}
+<<exlap.ht>>=
+\begin{page}{ExLapSpecial1}{Laplace transform of an exponential integral}
+We can handle some restricted cases of special functions, linear exponential
+integrals among them.
+\beginscroll
+\spadpaste{laplace(exp(a*t+b)*Ei(c*t), t, s)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Laplace transform of special functions}
+\label{ExLapSpecial2}
+\index{pages!ExLapSpecial2!exlap.ht}
+\index{exlap.ht!pages!ExLapSpecial2}
+\index{ExLapSpecial2!exlap.ht!pages}
+<<exlap.ht>>=
+\begin{page}{ExLapSpecial2}{Laplace transform of special functions}
+\beginscroll
+An example with some interesting special functions.
+\spadpaste{laplace(a*Ci(b*t) + c*Si(d*t), t, s)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{exint.ht}
+\subsection{Integral of a Rational Function}
+\label{ExIntRationalFunction}
+\index{pages!ExIntRationalFunction!exint.ht}
+\index{exint.ht!pages!ExIntRationalFunction}
+\index{ExIntRationalFunction!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntRationalFunction}{Integral of a Rational Function}
+\beginscroll
+The following fraction has a denominator which factors into
+a quadratic and a quartic irreducible polynomial. The usual
+partial fraction approach used by most other computer algebra
+systems either fails or introduces expensive unneeded algebraic
+numbers.
+We use a factorization-free algorithm.
+\spadpaste{integrate((x**2+2*x+1)/((x+1)**6+1),x)}
+There are cases where algebraic numbers are absolutely necessary.
+In that case the answer to the \spadfun{integrate} command will contain
+symbols like \spad{\%\%F0} denoting the algebraic numbers used.
+To find out what the definitions for these numbers is use the
+\spadfun{definingPolynomial} operation on these numbers.
+\spadpaste{integrate(1/(x**3+x+1),x) \bound{i}}
+For example, if a symbol like \spad{\%\%F0} appears in the result of this last
+integration, then \spad{definingPolynomial \%\%F0} will return the
+polynomial that \spad{\%\%F0} is a root of. The next command isolates the
+algebraic number from the expression and displays its defining polynomial.
+\spadpaste{definingPolynomial(tower(\%).2::EXPR INT) \free{i}}
+
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Integral of a Rational Function with a Real Parameter}
+\label{ExIntRationalWithRealParameter}
+\index{pages!ExIntRationalWithRealParameter!exint.ht}
+\index{exint.ht!pages!ExIntRationalWithRealParameter}
+\index{ExIntRationalWithRealParameter!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntRationalWithRealParameter}
+{Integral of a Rational Function with a Real Parameter}
+\beginscroll
+When real parameters are present, the form of the integral can depend on
+the signs of some expressions. Rather than query the user or make
+sign assumptions, Axiom returns all possible answers.
+\spadpaste{integrate(1/(x**2 + a),x)}
+The integrate command generally assumes that all parameters are real.
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Integral of a Rational Function with a Complex Parameter}
+\label{ExIntRationalWithComplexParameter}
+\index{pages!ExIntRationalWithComplexParameter!exint.ht}
+\index{exint.ht!pages!ExIntRationalWithComplexParameter}
+\index{ExIntRationalWithComplexParameter!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntRationalWithComplexParameter}
+{Integral of a Rational Function with a Complex Parameter}
+\beginscroll
+If the parameter is complex instead of real, then the notion of
+sign is undefined and there is a unique answer.
+You can request
+this answer by prepending the word `complex' to the command name:
+\spadpaste{complexIntegrate(1/(x**2 + a),x)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Two Similar Integrands Producing Very Different Results}
+\label{ExIntTwoSimilarIntegrands}
+\index{pages!ExIntTwoSimilarIntegrands!exint.ht}
+\index{exint.ht!pages!ExIntTwoSimilarIntegrands}
+\index{ExIntTwoSimilarIntegrands!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntTwoSimilarIntegrands}
+{Two Similar Integrands Producing Very Different Results}
+\beginscroll
+The following two examples illustrate the limitations of table based
+approaches. The two integrands are very similar, but the answer to one
+of them requires the addition of two new algebraic numbers.
+This one is the easy one:
+\spadpaste{integrate(x**3 / (a+b*x)**(1/3),x)}
+The next one looks very similar
+but the answer is much more complicated. Only an algorithmic approach
+is guaranteed to find what new constants must be added in order to
+find a solution:
+\spadpaste{integrate(1 / (x**3 * (a+b*x)**(1/3)),x)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{An Integral Which Does Not Exist}
+\label{ExIntNoSolution}
+\index{pages!ExIntNoSolution!exint.ht}
+\index{exint.ht!pages!ExIntNoSolution}
+\index{ExIntNoSolution!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntNoSolution}{An Integral Which Does Not Exist}
+\beginscroll
+Most computer algebra systems use heuristics or table-driven
+approaches to integration. When these systems cannot determine
+the answer to an integration problem, they reply "I don't know".
+Axiom uses a complete algorithm for integration.
+It will conclusively prove that an integral
+cannot be expressed in terms of elementary functions.
+When Axiom returns an integral sign, it has proved
+that no answer exists as an elementary function.
+\spadpaste{integrate(log(1 + sqrt(a*x + b)) / x,x)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\begin{verbatim}
+%% This example is broken
+%\begin{page}{ExIntChangeOfVariables}{No Change of Variables is Required}
+%\beginscroll
+%Unlike computer algebra systems which rely on heuristics and
+%table-lookup, the algorithmic integration facility
+%of Axiom never requires you to make a change of variables
+%in order to integrate a function.
+%\spadpaste{integrate(sec(x)**(4/5)*csc(x)**(6/5),x)}
+%\endscroll
+%\autobuttons\end{page}
+\end{verbatim}
+
+@
+\subsection{A Trigonometric Function of a Quadratic}
+\label{ExIntTrig}
+\index{pages!ExIntTrig!exint.ht}
+\index{exint.ht!pages!ExIntTrig}
+\index{ExIntTrig!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntTrig}{A Trigonometric Function of a Quadratic}
+\beginscroll
+Axiom can handle complicated mixed functions way beyond what you can
+find in tables:
+\spadpaste{integrate((sinh(1+sqrt(x+b))+2*sqrt(x+b))/(sqrt(x+b)*(x+cosh(1+sqrt(x+b)))),x)}
+Whenever possible, Axiom tries to express the answer using the functions
+present in the integrand.
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Integrating a Function with a Hidden Algebraic Relation}
+\label{ExIntAlgebraicRelation}
+See  ExIntAlgebraicRelationExplain \ref{ExIntAlgebraicRelationExplain} 
+on page~\pageref{ExIntAlgebraicRelationExplain}
+\index{pages!ExIntAlgebraicRelation!exint.ht}
+\index{exint.ht!pages!ExIntAlgebraicRelation}
+\index{ExIntAlgebraicRelation!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntAlgebraicRelation}
+{Integrating a Function with a Hidden Algebraic Relation}
+\beginscroll
+A strong structure checking algorithm in Axiom finds hidden algebraic
+relationships between functions.
+\spadpaste{integrate(tan(atan(x)/3),x)}
+The discovery of this algebraic relationship is necessary
+for correctly integrating this function.
+\downlink{Details.}{ExIntAlgebraicRelationExplain} \space{1}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Details for integrating a function with a Hidden Algebraic Relation}
+\label{ExIntAlgebraicRelationExplain}
+\index{pages!ExIntAlgebraicRelationExplain!exint.ht}
+\index{exint.ht!pages!ExIntAlgebraicRelationExplain}
+\index{ExIntAlgebraicRelationExplain!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntAlgebraicRelationExplain}
+{Details for integrating a function with a Hidden Algebraic Relation}
+\beginscroll
+Steps taken for integration of:
+\centerline{{\em f := tan(atan(x)/3)}}
+\beginitems
+\item
+1. Replace {\em f} by an equivalent algebraic function {\em g}
+satisfying the algebraic relation:
+\centerline{{\em g**3 - 3*x*g - 3*g + x = 0}}
+\item
+2. Integrate {\em g} using using this algebraic relation; this produces:
+\centerline{{\em (24g**2 - 8)log(3g**2 - 1) + (81x**2 + 24)g**2 + 72xg - 27x**2 - 16}}
+\centerline{{\em /   (54g**2 - 18)}}
+\item
+3. Rationalize the denominator, producing:
+\centerline{{\em (8log(3g**2-1) - 3g**2 + 18xg + 15)/18}}
+\item
+4. Replace {\em g} by the initial {\em f} to produce the final result:
+\centerline{{\em (8log(3tan(atan(x/3))**2-1) - 3tan(atan(x/3))**2 - 18xtan(atan(x/3) + 16)/18)}}
+\enditems
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{An Integral Involving a Root of a Transcendental Function}
+\label{ExIntRadicalOfTranscendental}
+\index{pages!ExIntRadicalOfTranscendental!exint.ht}
+\index{exint.ht!pages!ExIntRadicalOfTranscendental}
+\index{ExIntRadicalOfTranscendental!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntRadicalOfTranscendental}{An Integral Involving a Root of a Transcendental Function}
+\beginscroll
+This is an example of a mixed function where
+the algebraic layer is over the transcendental one.
+\spadpaste{integrate((x + 1) / (x * (x + log x)**(3/2)),x)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{An Integral of a Non-elementary Function}
+\label{ExIntNonElementary}
+\index{pages!ExIntNonElementary!exint.ht}
+\index{exint.ht!pages!ExIntNonElementary}
+\index{ExIntNonElementary!exint.ht!pages}
+<<exint.ht>>=
+\begin{page}{ExIntNonElementary}{An Integral of a Non-elementary Function}
+\beginscroll
+While incomplete for non-elementary functions, Axiom can
+handle some of them:
+\spadpaste{integrate(exp(-x**2) * erf(x) / (erf(x)**3 - erf(x)**2 - erf(x) + 1),x)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{exlimit.ht}
+\subsection{Computing Limits}
+\label{ExLimitBasic}
+\begin{itemize}
+\item ExLimitTwoSided \ref{ExLimitTwoSided} on page~\pageref{ExLimitTwoSided}
+\item ExLimitOneSided \ref{ExLimitOneSided} on page~\pageref{ExLimitOneSided}
+\end{itemize}
+\index{pages!ExLimitBasic!exlimit.ht}
+\index{exlimit.ht!pages!ExLimitBasic}
+\index{ExLimitBasic!exlimit.ht!pages}
+<<exlimit.ht>>=
+\begin{page}{ExLimitBasic}{Computing Limits}
+\beginscroll
+To compute a limit, you must specify a functional expression,
+a variable, and a limiting value for that variable.
+For example, to compute the limit of (x**2 - 3*x + 2)/(x**2 - 1)
+as x approaches 1, issue the following command:
+\spadpaste{limit((x**2 - 3*x + 2)/(x**2 - 1),x = 1)}
+% answer := -1/2
+Since you have not specified a direction, Axiom will attempt
+to compute a two-sided limit. Sometimes the limit when approached from
+the left is different from the limit from the right.
+\downlink{Example}{ExLimitTwoSided}. In this case, you may
+wish to ask for a one-sided limit.
+\downlink{How.  }{ExLimitOneSided}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Limits of Functions with Parameters}
+\label{ExLimitParameter}
+\index{pages!ExLimitParameter!exlimit.ht}
+\index{exlimit.ht!pages!ExLimitParameter}
+\index{ExLimitParameter!exlimit.ht!pages}
+<<exlimit.ht>>=
+\begin{page}{ExLimitParameter}{Limits of Functions with Parameters}
+\beginscroll
+You may also take limits of functions with parameters. The limit
+will be expressed in terms of those parameters.
+Here's an example:
+\spadpaste{limit(sinh(a*x)/tan(b*x),x = 0)}
+% answer := a/b
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{One-sided Limits}
+\label{ExLimitOneSided}
+\index{pages!ExLimitOneSided!exlimit.ht}
+\index{exlimit.ht!pages!ExLimitOneSided}
+\index{ExLimitOneSided!exlimit.ht!pages}
+<<exlimit.ht>>=
+\begin{page}{ExLimitOneSided}{One-sided Limits}
+\beginscroll
+If you have a function which is only defined on one side of a particular value,
+you may wish to compute a one-sided limit.
+For instance, the function \spad{log(x)} is only defined to the right of zero,
+i.e. for \spad{x > 0}.
+Thus, when computing limits of functions involving \spad{log(x)}, you probably
+will want a 'right-hand' limit.
+Here's an example:
+\spadpaste{limit(x * log(x),x = 0,"right")}
+% answer := 0
+When you do not specify \spad{right} or \spad{left} as an optional fourth
+argument, the function \spadfun{limit} will try to compute a two-sided limit.
+In the above case, the limit from the left does not exist, as Axiom
+will indicate when you try to take a two-sided limit:
+\spadpaste{limit(x * log(x),x = 0)}
+% answer := [left = "failed",right = 0]
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Two-sided Limits}
+\label{ExLimitTwoSided}
+\index{pages!ExLimitTwoSided!exlimit.ht}
+\index{exlimit.ht!pages!ExLimitTwoSided}
+\index{ExLimitTwoSided!exlimit.ht!pages}
+<<exlimit.ht>>=
+\begin{page}{ExLimitTwoSided}{Two-sided Limits}
+\beginscroll
+A function may be defined on both sides of a particular value, but will
+tend to different limits as its variable tends to that value from the
+left and from the right.
+We can construct an example of this as follows:
+Since { \em sqrt(y**2)} is simply the absolute value of \spad{y},
+the function \spad{sqrt(y**2)/y}
+is simply the sign (+1 or -1) of the real number \spad{y}.
+Therefore, \spad{sqrt(y**2)/y = -1} for \spad{y < 0} and
+\spad{sqrt(y**2)/y = +1} for \spad{y > 0}.
+Watch what happens when we take the limit at \spad{y = 0}.
+\spadpaste{limit(sqrt(y**2)/y,y = 0)}
+% answer := [left = -1,right = 1]
+The answer returned by Axiom gives both a 'left-hand' and a 'right-hand'
+limit.
+Here's another example, this time using a more complicated function:
+\spadpaste{limit(sqrt(1 - cos(t))/t,t = 0)}
+% answer := [left = -sqrt(1/2),right = sqrt(1/2)]
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Limits at Infinity}
+\label{ExLimitInfinite}
+\index{pages!ExLimitInfinite!exlimit.ht}
+\index{exlimit.ht!pages!ExLimitInfinite}
+\index{ExLimitInfinite!exlimit.ht!pages}
+<<exlimit.ht>>=
+\begin{page}{ExLimitInfinite}{Limits at Infinity}
+\beginscroll
+You can compute limits at infinity by passing either 'plus infinity'
+or 'minus infinity' as the third argument of the function \spadfun{limit}.
+To do this, use the constants \spad{\%plusInfinity} and \spad{\%minusInfinity}.
+Here are two examples:
+\spadpaste{limit(sqrt(3*x**2 + 1)/(5*x),x = \%plusInfinity)}
+\spadpaste{limit(sqrt(3*x**2 + 1)/(5*x),x = \%minusInfinity)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Real Limits vs. Complex Limits}
+\label{ExLimitRealComplex}
+\index{pages!ExLimitRealComplex!exlimit.ht}
+\index{exlimit.ht!pages!ExLimitRealComplex}
+\index{ExLimitRealComplex!exlimit.ht!pages}
+<<exlimit.ht>>=
+\begin{page}{ExLimitRealComplex}{Real Limits vs. Complex Limits}
+\beginscroll
+When you use the function \spadfun{limit}, you will be taking the limit of a real
+function of a real variable.
+For example, you can compute
+\spadpaste{limit(z * sin(1/z),z = 0)}
+Axiom returns \spad{0} because as a function of a real variable
+\spad{sin(1/z)} is always between \spad{-1} and \spad{1}, so \spad{z * sin(1/z)}
+tends to \spad{0} as \spad{z} tends to \spad{0}.
+However, as a function of a complex variable, \spad{sin(1/z)} is badly
+behaved around \spad{0}
+(one says that \spad{sin(1/z)} has an 'essential singularity' at \spad{z = 0}).
+When viewed as a function of a complex variable, \spad{z * sin(1/z)}
+does not approach any limit as \spad{z} tends to \spad{0} in the complex plane.
+Axiom indicates this when we call the function \spadfun{complexLimit}:
+\spadpaste{complexLimit(z * sin(1/z),z = 0)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Complex Limits at Infinity}
+\label{ExLimitComplexInfinite}
+\index{pages!ExLimitComplexInfinite!exlimit.ht}
+\index{exlimit.ht!pages!ExLimitComplexInfinite}
+\index{ExLimitComplexInfinite!exlimit.ht!pages}
+<<exlimit.ht>>=
+\begin{page}{ExLimitComplexInfinite}{Complex Limits at Infinity}
+\beginscroll
+You may also take complex limits at infinity, i.e. limits of a function of
+\spad{z} as \spad{z} approaches infinity on the Riemann sphere.
+Use the symbol \spad{\%infinity} to denote `complex infinity'.
+Also, to compute complex limits rather than real limits, use the
+function \spadfun{complexLimit}.
+Here is an example:
+\spadpaste{complexLimit((2 + z)/(1 - z),z = \%infinity)}
+In many cases, a limit of a real function of a real variable will exist
+when the corresponding complex limit does not.
+For example:
+\spadpaste{limit(sin(x)/x,x = \%plusInfinity)}
+\spadpaste{complexLimit(sin(x)/x,x = \%infinity)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{exmatrix.ht}
+\subsection{Basic Arithmetic Operations on Matrices}
+\label{ExMatrixBasicFunction}
+\index{pages!ExMatrixBasicFunction!exmatrix.ht}
+\index{exmatrix.ht!pages!ExMatrixBasicFunction}
+\index{ExMatrixBasicFunction!exmatrix.ht!pages}
+<<exmatrix.ht>>=
+\begin{page}{ExMatrixBasicFunction}{Basic Arithmetic Operations on Matrices}
+\beginscroll
+You can create a matrix using the function \spadfun{matrix}.
+The function takes a list of lists of elements of the ring and produces a
+matrix whose \spad{i}th row contains the elements of the \spad{i}th list.
+For example:
+\spadpaste{m1 := matrix([[1,-2,1],[4,2,-4]]) \bound{m1}}
+\spadpaste{m2 := matrix([[1,0,2],[20,30,10],[0,200,100]]) \bound{m2}}
+\spadpaste{m3 := matrix([[1,2,3],[2,4,6]]) \bound{m3}}
+Some of the basic arithmetic operations on matrices are:
+\spadpaste{m1 + m3 \free{m1} \free{m3}}
+\spadpaste{100 * m1 \free{m1}}
+\spadpaste{m1 * m2 \free{m1} \free{m2}}
+\spadpaste{-m1 + m3 * m2 \free{m1} \free{m2} \free{m3}}
+You can also multiply a matrix and a vector provided
+that the matrix and vector have compatible dimensions.
+\spadpaste{m3 *vector([1,0,1]) \free{m3}}
+However, the dimensions of the matrices must be compatible in order for
+Axiom to perform an operation - otherwise an error message will occur.
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Constructing new Matrices}
+\label{ExConstructMatrix}
+\index{pages!ExConstructMatrix!exmatrix.ht}
+\index{exmatrix.ht!pages!ExConstructMatrix}
+\index{ExConstructMatrix!exmatrix.ht!pages}
+<<exmatrix.ht>>=
+\begin{page}{ExConstructMatrix}{Constructing new Matrices}
+\beginscroll
+A number of functions exist for constructing new matrices from existing ones.
+
+If you want to create a matrix whose entries are 0 except on the main
+diagonal you can use \spadfun{diagonalMatrix}.
+This function takes a list of ring elements as an argument and returns a
+square matrix which has these elements on the main diagonal.
+Consider the following example:
+\spadpaste{diagonalMatrix([1,2,3,2,1])}
+
+The function \spadfun{subMatrix}(\spad{a},\spad{i},\spad{j},\spad{k},\spad{l}) 
+constructs a new matrix
+consisting of rows \spad{i} through \spad{j} and columns \spad{k} through 
+\spad{l} of \spad{a} , inclusive.
+\spadpaste{subMatrix(matrix([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]]), 1,3,2,4)}
+
+
+The functions \spadfun{horizConcat} and \spadfun{vertConcat} 
+concatenate matrices
+horizontally and vertically, respectively.
+\spadpaste{horizConcat(matrix([[1,2,3],[6,7,8]]),matrix([[11,12,13],[55,77,88]])) }
+\spadpaste{vertConcat(matrix([[1,2,3],[6,7,8]]),matrix([[11,12,13],[55,77,88]])) }
+
+
+The function \spadfunX{setsubMatrix}(\spad{a},\spad{i},\spad{k},\spad{b}) 
+replaces the submatrix of \spad{a}
+starting at row \spad{i} and column \spad{k} with the elements of the matrix i\spad{b}.
+\spadpaste{b:=matrix([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]]) \bound{b}}
+\spadpaste{setsubMatrix!(b,1,1,transpose(subMatrix(b,1,3,1,3)))\free{b}}
+changes the submatrix of \spad{b} consisting of the first 3 rows and columns
+to its transpose.
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Trace of a Matrix}
+\label{ExTraceMatrix}
+\index{pages!ExTraceMatrix!exmatrix.ht}
+\index{exmatrix.ht!pages!ExTraceMatrix}
+\index{ExTraceMatrix!exmatrix.ht!pages}
+<<exmatrix.ht>>=
+\begin{page}{ExTraceMatrix}{Trace of a Matrix}
+\beginscroll
+If you have a square matrix, then you can compute its `trace'.
+The function \spadfun{trace} computes the sum of all elements on the diagonal
+of a matrix.
+For example `trace' for a four by four Vandermonde matrix.
+\spadpaste{trace( matrix([[1,x,x**2,x**3],[1,y,y**2,y**3],[1,z,z**2,z**3],[1,u,u**2,u**3]]) )}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Determinant of a Matrix}
+\label{ExDeterminantMatrix}
+\index{pages!ExDeterminantMatrix!exmatrix.ht}
+\index{exmatrix.ht!pages!ExDeterminantMatrix}
+\index{ExDeterminantMatrix!exmatrix.ht!pages}
+<<exmatrix.ht>>=
+\begin{page}{ExDeterminantMatrix}{Determinant of a Matrix}
+\beginscroll
+The function \spadfun{determinant} computes the determinant of a matrix over a
+commutative ring, that is a ring whose multiplication is commutative.
+\spadpaste{determinant(matrix([[1,2,3,4],[2,3,2,5],[3,4,5,6],[4,1,6,7]]))}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Inverse of a Matrix}
+\label{ExInverseMatrix}
+\index{pages!ExInverseMatrix!exmatrix.ht}
+\index{exmatrix.ht!pages!ExInverseMatrix}
+\index{ExInverseMatrix!exmatrix.ht!pages}
+<<exmatrix.ht>>=
+\begin{page}{ExInverseMatrix}{Inverse of a Matrix}
+\beginscroll
+The function \spadfun{inverse} computes the inverse of a square matrix.
+\spadpaste{inverse(matrix([[1,2,1],[-2,3,4],[-1,5,6]])) }
+(If the inverse doesn't exist, then Axiom returns `failed'.)
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Rank of a Matrix}
+\label{ExRankMatrix}
+\index{pages!ExRankMatrix!exmatrix.ht}
+\index{exmatrix.ht!pages!ExRankMatrix}
+\index{ExRankMatrix!exmatrix.ht!pages}
+<<exmatrix.ht>>=
+\begin{page}{ExRankMatrix}{Rank of a Matrix}
+\beginscroll
+The function \spadfun{rank} gives you the rank of a matrix:
+\spadpaste{rank(matrix([[0,4,1],[5,3,-7],[-5,5,9]]))}
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{expr.ht}
+<<expr.ht>>=
+\newcommand{\ExpressionXmpTitle}{Expression}
+\newcommand{\ExpressionXmpNumber}{9.21}
+
+@
+\subsection{Expression}
+\label{ExpressionXmpPage}
+\begin{itemize}
+\item KernelXmpPage \ref{KernelXmpPage} on
+page~pageref{KernelXmpPage}
+\item ugIntroCalcDerivPage \ref{ugIntroCalcDerivPage} on
+page~pageref{ugIntroCalcDerivPage}
+\item ugIntroCalcLimitsPage \ref{ugIntroCalcLimitsPage} on
+page~pageref{ugIntroCalcLimitsPage}
+\item ugIntroSeriesPage \ref{ugIntroSeriesPage} on
+page~pageref{ugIntroSeriesPage}
+\item ugProblemDEQPage \ref{ugProblemDEQPage} on
+page~pageref{ugProblemDEQPage}
+\item ugProblemIntegrationPage \ref{ugProblemIntegrationPage} on
+page~pageref{ugProblemIntegrationPage}
+\item ugUserRulesPage \ref{ugUserRulesPage} on
+page~pageref{ugUserRulesPage}
+\end{itemize}
+\index{pages!ExpressionXmpPage!expr.ht}
+\index{expr.ht!pages!ExpressionXmpPage}
+\index{ExpressionXmpPage!expr.ht!pages}
+<<expr.ht>>=
+\begin{page}{ExpressionXmpPage}{Expression}
+\beginscroll
+
+\axiomType{Expression} is a constructor that creates domains whose
+objects can have very general symbolic forms.
+Here are some examples:
+\xtc{
+This is an object of type \axiomType{Expression Integer}.
+}{
+\spadpaste{sin(x) + 3*cos(x)**2}
+}
+\xtc{
+This is an object of type \axiomType{Expression Float}.
+}{
+\spadpaste{tan(x) - 3.45*x}
+}
+\xtc{
+This object contains symbolic function applications, sums,
+products, square roots, and a quotient.
+}{
+\spadpaste{(tan sqrt 7 - sin sqrt 11)**2 / (4 - cos(x - y))}
+}
+As you can see, \axiomType{Expression} actually takes an argument
+domain.
+The {\it coefficients} of the terms within the expression belong
+to the argument domain.
+\axiomType{Integer} and \axiomType{Float}, along with
+\axiomType{Complex Integer} and \axiomType{Complex Float}
+are the most common coefficient domains.
+\xtc{
+The choice of whether
+to use a \axiomType{Complex} coefficient domain or not is
+important since Axiom can perform some simplifications
+on real-valued objects
+}{
+\spadpaste{log(exp  x)@Expression(Integer)} 
+}
+\xtc{
+... which are not valid on complex ones.
+}{
+\spadpaste{log(exp  x)@Expression(Complex Integer)} 
+}
+\xtc{
+Many potential coefficient domains, such as
+\axiomType{AlgebraicNumber}, are not usually used because
+\axiomType{Expression} can subsume them.
+}{
+\spadpaste{sqrt 3 + sqrt(2 + sqrt(-5)) \bound{algnum1}}
+}
+\xtc{
+}{
+\spadpaste{\% :: Expression Integer \free{algnum1}}
+}
+Note that we sometimes talk about ``an object of type
+\axiomType{Expression}.'' This is not really correct because we
+should say, for example, ``an object of type \axiomType{Expression
+Integer}'' or ``an object of type \axiomType{Expression Float}.''
+By a similar abuse of language, when we refer to an ``expression''
+in this section we will mean an object of type
+\axiomType{Expression R} for some domain {\bf R}.
+
+The Axiom documentation contains many examples of the use
+of \axiomType{Expression}.
+For the rest of this section, we'll give you some pointers to those
+examples plus give you some idea of how to manipulate expressions.
+
+It is important for you to know that \axiomType{Expression}
+creates domains that have category \axiomType{Field}.
+Thus you can invert any non-zero expression and you shouldn't
+expect an operation like \axiomFun{factor} to give you much
+information.
+You can imagine expressions as being represented as quotients of
+``multivariate'' polynomials where the ``variables'' are kernels
+(see \downlink{`Kernel'}{KernelXmpPage}\ignore{Kernel}).
+A kernel can either be a symbol such as \axiom{x} or a symbolic
+function application like \axiom{sin(x + 4)}.
+The second example is actually a nested kernel since the argument
+to \axiomFun{sin} contains the kernel \axiom{x}.
+\xtc{
+}{
+\spadpaste{height mainKernel sin(x + 4)}
+}
+Actually, the argument to \axiomFun{sin} is an expression, and so
+the structure of \axiomType{Expression} is recursive.
+\downlink{`Kernel'}{KernelXmpPage}\ignore{Kernel} 
+demonstrates how to extract the kernels in an
+expression.
+
+Use the \HyperName{} Browse facility to see what operations are
+applicable to expression.
+At the time of this writing, there were 262 operations with 147
+distinct name in \axiomType{Expression Integer}.
+For example, \axiomFunFrom{numer}{Expression} and
+\axiomFunFrom{denom}{Expression} extract the numerator and
+denominator of an expression.
+\xtc{
+}{
+\spadpaste{e := (sin(x) - 4)**2 / ( 1 - 2*y*sqrt(- y) ) \bound{e}}
+}
+\xtc{
+}{
+\spadpaste{numer e \free{e}}
+}
+\xtc{
+}{
+\spadpaste{denom e \free{e}}
+}
+\xtc{
+Use \axiomFunFrom{D}{Expression} to compute partial derivatives.
+}{
+\spadpaste{D(e, x) \free{e}}
+}
+\xtc{
+See \downlink{``\ugIntroCalcDerivTitle''}{ugIntroCalcDerivPage} in Section 
+\ugIntroCalcDerivNumber\ignore{ugIntroCalcDeriv}
+for more examples of expressions and derivatives.
+}{
+\spadpaste{D(e, [x, y], [1, 2]) \free{e}}
+}
+See \downlink{``\ugIntroCalcLimitsTitle''}{ugIntroCalcLimitsPage} 
+in Section \ugIntroCalcLimitsNumber\ignore{ugIntroCalcLimits} and
+\downlink{``\ugIntroSeriesTitle''}{ugIntroSeriesPage} in Section 
+\ugIntroSeriesNumber\ignore{ugIntroSeries}
+for more examples of expressions and calculus.
+Differential equations involving expressions are discussed in
+\downlink{``\ugProblemDEQTitle''}{ugProblemDEQPage} in Section 
+\ugProblemDEQNumber\ignore{ugProblemDEQ}.
+Chapter 8 has many advanced examples: see
+\downlink{``\ugProblemIntegrationTitle''}{ugProblemIntegrationPage} 
+in Section \ugProblemIntegrationNumber\ignore{ugProblemIntegration}
+for a discussion of Axiom's integration facilities.
+
+When an expression involves no ``symbol kernels'' (for example,
+\axiom{x}), it may be possible to numerically evaluate the
+expression.
+\xtc{
+If you suspect the evaluation will create a complex number,
+use \axiomFun{complexNumeric}.
+}{
+\spadpaste{complexNumeric(cos(2 - 3*\%i))}
+}
+\xtc{
+If you know it will be real, use \axiomFun{numeric}.
+}{
+\spadpaste{numeric(tan 3.8)}
+}
+The \axiomFun{numeric} operation will display an error message if
+the evaluation yields a calue with an non-zero imaginary part.
+Both of these operations have an optional second argument
+\axiom{n} which specifies that the accuracy of the approximation
+be up to \axiom{n} decimal places.
+
+When an expression involves no ``symbolic application'' kernels,
+it may be possible to convert it a polynomial or rational
+function in the variables that are present.
+\xtc{
+}{
+\spadpaste{e2 := cos(x**2 - y + 3) \bound{e2}}
+}
+\xtc{
+}{
+\spadpaste{e3 := asin(e2) - \%pi/2 \free{e2}\bound{e3}}
+}
+\xtc{
+}{
+\spadpaste{e3 :: Polynomial Integer \free{e3}}
+}
+\xtc{
+This also works for the polynomial types where specific variables
+and their ordering are given.
+}{
+\spadpaste{e3 :: DMP([x, y], Integer) \free{e3}}
+}
+
+Finally, a certain amount of simplication takes place as
+expressions are constructed.
+\xtc{
+}{
+\spadpaste{sin \%pi}
+}
+\xtc{
+}{
+\spadpaste{cos(\%pi / 4)}
+}
+\xtc{
+For simplications that involve multiple terms of the expression,
+use \axiomFun{simplify}.
+}{
+\spadpaste{tan(x)**6 + 3*tan(x)**4 + 3*tan(x)**2 + 1 \bound{tan6}}
+}
+\xtc{
+}{
+\spadpaste{simplify \% \free{tan6}}
+}
+See \downlink{``\ugUserRulesTitle''}{ugUserRulesPage} in Section \ugUserRulesNumber\ignore{ugUserRules}
+for examples of how to write your own rewrite rules for
+expressions.
+
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{explot2d.ht}
+\subsection{Plotting Functions of One Variable}
+\label{ExPlot2DFunctions}
+\index{pages!ExPlot2DFunctions!explot2d.ht}
+\index{explot2d.ht!pages!ExPlot2DFunctions}
+\index{ExPlot2DFunctions!explot2d.ht!pages}
+<<explot2d.ht>>=
+\begin{page}{ExPlot2DFunctions}{Plotting Functions of One Variable}
+\beginscroll
+To plot a function {\em y = f(x)}, you need only specify the function and the
+interval on which it is to be plotted.
+\graphpaste{draw(sin(tan(x)) - tan(sin(x)),x = 0..6)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Plotting Parametric Curves}
+\label{ExPlot2DParametric}
+\index{pages!ExPlot2DParametric!explot2d.ht}
+\index{explot2d.ht!pages!ExPlot2DParametric}
+\index{ExPlot2DParametric!explot2d.ht!pages}
+<<explot2d.ht>>=
+\begin{page}{ExPlot2DParametric}{Plotting Parametric Curves}
+\beginscroll
+To plot a parametric curve defined by {\em x = f(t)},
+{\em y = g(t)}, specify the functions
+{\em f(t)} and {\em g(t)}
+as arguments of the function `curve', then give
+the interval over which {\em t} is to range.
+\graphpaste{draw(curve(9 * sin(3*t/4),8 * sin(t)),t = -4*\%pi..4*\%pi)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Plotting Using Polar Coordinates}
+\label{ExPlot2DPolar}
+\index{pages!ExPlot2DPolar!explot2d.ht}
+\index{explot2d.ht!pages!ExPlot2DPolar}
+\index{ExPlot2DPolar!explot2d.ht!pages}
+<<explot2d.ht>>=
+\begin{page}{ExPlot2DPolar}{Plotting Using Polar Coordinates}
+\beginscroll
+To plot the function {\em r = f(theta)} in polar coordinates,
+use the option {\em coordinates == polar}.
+As usual,
+call the function 'draw' and specify the function {\em f(theta)} and the
+interval over which {\em theta} is to range.
+\graphpaste{draw(sin(4*t/7),t = 0..14*\%pi,coordinates == polar)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Plotting Plane Algebraic Curves}
+\label{ExPlot2DAlgebraic}
+\index{pages!ExPlot2DAlgebraic!explot2d.ht}
+\index{explot2d.ht!pages!ExPlot2DAlgebraic}
+\index{ExPlot2DAlgebraic!explot2d.ht!pages}
+<<explot2d.ht>>=
+\begin{page}{ExPlot2DAlgebraic}{Plotting Plane Algebraic Curves}
+\beginscroll
+Axiom can also plot plane algebraic curves (i.e. curves defined by
+an equation {\em f(x,y) = 0}) provided that the curve is non-singular in the
+region to be sketched.
+Here's an example:
+\graphpaste{draw(y**2 + y - (x**3 - x) = 0, x, y, range == [-2..2,-2..1])}
+Here the region of the sketch is {\em -2 <= x <= 2, -2 <= y <= 1}.
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{explot3d.ht}
+\subsection{Plotting Functions of Two Variables}
+\label{ExPlot3DFunctions}
+\index{pages!ExPlot3DFunctions!explot3d.ht}
+\index{explot3d.ht!pages!ExPlot3DFunctions}
+\index{ExPlot3DFunctions!explot3d.ht!pages}
+<<explot3d.ht>>=
+\begin{page}{ExPlot3DFunctions}{Plotting Functions of Two Variables}
+\beginscroll
+To plot a function {\em z = f(x,y)}, you need only specify the function and the
+intervals over which the dependent variables will range.
+For example, here's how you plot the function {\em z = cos(x*y)} as the 
+variables {\em x} and {\em y} both range between -3 and 3:
+\graphpaste{draw(cos(x*y),x = -3..3,y = -3..3)}
+\endscroll
+\autobuttons\end{page}
+ 
+@
+\subsection{Plotting Parametric Surfaces}
+\label{ExPlot3DParametricSurface}
+\index{pages!ExPlot3DParametricSurface!explot3d.ht}
+\index{explot3d.ht!pages!ExPlot3DParametricSurface}
+\index{ExPlot3DParametricSurface!explot3d.ht!pages}
+<<explot3d.ht>>=
+\begin{page}{ExPlot3DParametricSurface}{Plotting Parametric Surfaces}
+\beginscroll
+To plot a parametric surface defined by {\em x = f(u,v)}, 
+{\em y = g(u,v)}, {\em z = h(u,v)}, specify the functions
+{\em f(u,v)}, {\em g(u,v)}, and {\em h(u,v)}
+as arguments of the function `surface', then give
+the intervals over which {\em u} and {\em v} are to range.
+With parametric surfaces, we can create some interesting graphs.
+Here's an egg:
+\graphpaste{draw(surface(5*sin(u)*cos(v),4*sin(u)*sin(v),3*cos(u)),u=0..\%pi,v=0..2*\%pi)}
+Here's a cone:
+\graphpaste{draw(surface(u*cos(v),u*sin(v),u),u=0..4,v=0..2*\%pi)}
+\endscroll
+\autobuttons\end{page}
+ 
+@
+\subsection{Plotting Parametric Curves}
+\label{ExPlot3DParametricCurve}
+\index{pages!ExPlot3DParametricCurve!explot3d.ht}
+\index{explot3d.ht!pages!ExPlot3DParametricCurve}
+\index{ExPlot3DParametricCurve!explot3d.ht!pages}
+<<explot3d.ht>>=
+\begin{page}{ExPlot3DParametricCurve}{Plotting Parametric Curves}
+\beginscroll
+To plot a parametric curve defined by {\em x = f(t)}, 
+{\em y = g(t)}, {\em z = h(t)}, specify the functions
+{\em f(t)}, {\em g(t)}, and {\em h(t)}
+as arguments of the function `curve', then give
+the interval over which {\em t} is to range.
+Here is a spiral:
+\graphpaste{draw(curve(cos(t),sin(t),t),t=0..6)}
+Here is the {\em twisted cubic curve}:
+\graphpaste{draw(curve(t,t**2,t**3),t=-3..3)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{expose.ht}
+\subsection{TITLE}
+\label{TPD}
+\index{pages!TPD!expose.ht}
+\index{expose.ht!pages!TPD}
+\index{TPD!expose.ht!pages}
+<<expose.ht>>=
+\begin{page}{helpExpose}{Exposure}
+\beginscroll
+Exposure determines what part of the Axiom library
+is available to you when using Axiom.
+At any time during your interactive Axiom session,
+each constructor is either {\em exposed} or {\em unexposed}.
+If a constructor is exposed, its operations are available to
+the interpreter and therefore to you.
+If a constructor is unexposed, the operations are not seen
+by the interpreter and thus not available to you.
+\par
+If you are a beginner, you may only want
+basic parts of the library exposed.
+If you are an expert, you may want to have all parts of the
+library exposed.
+If you have an application that requires
+only a segment of the library, you may want to arrange to expose
+only that segment for your use.
+\par
+\endscroll
+Additional Information:
+\beginmenu
+\menulink{What}{ExposureDef}\tab{8}What is an exposure group?
+\menulink{System}{ExposureSystem}\tab{8}What exposure groups are system defined?
+% \menulink{User}{ExposureUser}\tab{8}How can I define my own?
+\menulink{Details}{ExposureDetails}\tab{8}Some details on exposure
+\endmenu
+\end{page}
+
+@
+\subsection{System Defined Exposure Groups}
+\label{ExposureSystem}
+\index{pages!ExposureSystem!expose.ht}
+\index{expose.ht!pages!ExposureSystem}
+\index{ExposureSystem!expose.ht!pages}
+<<expose.ht>>=
+\begin{page}{ExposureSystem}{System Defined Exposure Groups}
+\beginscroll
+Exposure is defined by {\em groups}.
+Groups have names.
+Seven exposure groups are system-defined:\beginmenu
+\item\tab{3}{\em current}\tab{12}The currently active exposure group
+\item\tab{3}{\em basic}\tab{12}The default value of {\em current}
+\item\tab{3}{\em category}\tab{13}Category constructors not in {\em basic}
+\item\tab{3}{\em domain}\tab{13}Domain constructors not in {\em basic}
+\item\tab{3}{\em package}\tab{13}Package constructors not in {\em basic}
+\item\tab{3}{\em default}\tab{13}Default constructors not in {\em basic}
+\item\tab{3}{\em hidden}\tab{13}All constructors not in {\em basic}
+\item\tab{3}{\em naglink}\tab{13}All constructors used in the AXIOM NAG Link
+\endmenu
+\par
+When you first use Axiom, the {\em current} exposure group is
+set to {\em basic} and {\em naglink}. Using \HyperName{} or the system command
+{\em expose}, you may
+change the current exposure group by
+adding or dropping constructors or by setting {\em current}
+to an exposure group you have created.
+\endscroll
+Additional Information:
+\beginmenu
+\menulink{What}{ExposureDef}\tab{10}What is an exposure group?
+%\menulink{User}{ExposureUser}\tab{10}How you can define your own exposure group
+\endmenu
+\end{page}
+
+@
+\subsection{What is an Exposure Group?}
+\label{ExposureDef}
+\index{pages!ExposureDef!expose.ht}
+\index{expose.ht!pages!ExposureDef}
+\index{ExposureDef!expose.ht!pages}
+<<expose.ht>>=
+\begin{page}{ExposureDef}{What is an Exposure Group?}
+\beginscroll
+\par
+An exposure group is a list of constructors to be exposed.
+Those constructors on the list are exposed;
+those not on the list are not exposed.
+The library contains 4 kinds of constructors intuitively described as follows:
+\beginmenu
+\item\menuitemstyle{}{\em domain}\tab{10}Describes computational objects and functions defined on these objects
+\item\menuitemstyle{}{\em package}\tab{10}Describes functions which will work over a variety of domains
+\item\menuitemstyle{}{\em category}\tab{10}Names a set of operations
+\item\menuitemstyle{}{\em default}\tab{10}Provides default functions for a cateogry
+\endmenu
+
+An exposure group is defined by three lists:
+\beginmenu
+\item\menuitemstyle{}{\em groups}\tab{13}A list of other (more basic) groups
+\item\menuitemstyle{}{\em additions}\tab{13}A list of explicit constructors to be included
+\item\menuitemstyle{}{\em subtractions}\tab{13}A list of explicit constructors to be dropped
+\endmenu
+You can define your own exposure groups: give them names and define the
+three above lists to be anything you like.
+Using \HyperName{}, you can conveniently edit your exposure groups,
+install them as the {\em current} exposure, and so on.
+\endscroll
+\end{page}
+
+@
+\subsection{Details on Exposure}
+\label{ExposureDetails}
+\index{pages!ExposureDetails!expose.ht}
+\index{expose.ht!pages!ExposureDetails}
+\index{ExposureDetails!expose.ht!pages}
+<<expose.ht>>=
+\begin{page}{ExposureDetails}{Details on Exposure}
+\beginscroll
+Exposure is generally defined by the set of domain and package constructors
+you want to have available.
+Category and default constructors are generally implied.
+A category constructor is exposed if mentioned by {\em any} other constructor
+(including another category).
+A default constructor is exposed if its corresponding category constructor is exposed.
+\par
+If you explicitly add a domain or package
+constructor, its name will be put in an {\em Additions} list.
+The system will also add automatically to the {\em Additions} list
+any category explicity exported by that domain or package.
+If that category has a corresponding default constructor, that
+default constructor will also be added as well.
+\par
+If you like, you can explicitly drop a constructor.
+Any such name is added to the {\em Subtractions} list.
+The system will drop this name from the {\em Additions} list if it appears.
+\par
+If the package or domain takes arguments from an unexported
+domain or declares that its arguments can come from a domain
+which is a member of an unexported category, these constructors
+will {\em not} be added.
+\endscroll
+\end{page}
+
+@
+\section{exseries.ht}
+\subsection{Converting Expressions to Series}
+\label{ExSeriesConvert}
+\index{pages!ExSeriesConvert!exseries.ht}
+\index{exseries.ht!pages!ExSeriesConvert}
+\index{ExSeriesConvert!exseries.ht!pages}
+<<exseries.ht>>=
+\begin{page}{ExSeriesConvert}{Converting Expressions to Series}
+\beginscroll
+You can convert a functional expression to a power series by using the
+function 'series'.
+Here's an example:
+\spadpaste{series(sin(a*x),x = 0)}
+This causes {\em sin(a*x)} to be expanded in powers of {\em (x - 0)}, that is, in powers
+of {\em x}.
+You can have {\em sin(a*x)} expanded in powers of {\em (a - \%pi/4)} by
+issuing the following command:
+\spadpaste{series(sin(a*x),a = \%pi/4)}
+\endscroll
+\autobuttons\end{page}
+ 
+@
+\subsection{Manipulating Power Series}
+\label{ExSeriesManipulate}
+\index{pages!ExSeriesManipulate!exseries.ht}
+\index{exseries.ht!pages!ExSeriesManipulate}
+\index{ExSeriesManipulate!exseries.ht!pages}
+<<exseries.ht>>=
+\begin{page}{ExSeriesManipulate}{Manipulating Power Series}
+\beginscroll
+Once you have created a power series, you can perform arithmetic operations
+on that series.
+First compute the Taylor expansion of {\em 1/(1-x)}:
+\spadpaste{f := series(1/(1-x),x = 0) \bound{f}}
+Now compute the square of that series:
+\spadpaste{f ** 2 \free{f}}
+It's as easy as 1, 2, 3,...
+\endscroll
+\autobuttons\end{page}
+ 
+@
+\subsection{Functions on Power Series}
+\label{ExSeriesFunctions}
+\index{pages!ExSeriesFunctions!exseries.ht}
+\index{exseries.ht!pages!ExSeriesFunctions}
+\index{ExSeriesFunctions!exseries.ht!pages}
+<<exseries.ht>>=
+\begin{page}{ExSeriesFunctions}{Functions on Power Series}
+\beginscroll
+The usual elementary functions ({\em log}, {\em exp}, 
+trigonometric functions, etc.)
+are defined for power series.
+You can create a power series:
+% Warning: currently there are (interpretor) problems with converting
+% rational functions and polynomials to power series.
+\spadpaste{f := series(1/(1-x),x = 0) \bound{f1}}
+and then apply these functions to the series:
+\spadpaste{g := log(f) \free{f1} \bound{g}}
+\spadpaste{exp(g) \free{g}}
+\endscroll
+\autobuttons\end{page}
+ 
+@
+\subsection{Substituting Numerical Values in Power Series}
+\label{ExSeriesSubstitution}
+\index{pages!ExSeriesSubstitution!exseries.ht}
+\index{exseries.ht!pages!ExSeriesSubstitution}
+\index{ExSeriesSubstitution!exseries.ht!pages}
+<<exseries.ht>>=
+\begin{page}{ExSeriesSubstitution}
+{Substituting Numerical Values in Power Series}
+\beginscroll
+Here's a way to obtain numerical approximations of 
+{\em e} from the Taylor series
+expansion of {\em exp(x)}.
+First you create the desired Taylor expansion:
+\spadpaste{f := taylor(exp(x)) \bound{f2}}
+Now you evaluate the series at the value {\em 1.0}:
+% Warning: syntax for evaluating power series may change.
+\spadpaste{eval(f,1.0) \free{f2}}
+You get a sequence of partial sums.
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{exsum.ht}
+\subsection{Summing the Entries of a List I}
+\label{ExSumListEntriesI}
+\index{pages!ExSumListEntriesI!exsum.ht}
+\index{exsum.ht!pages!ExSumListEntriesI}
+\index{ExSumListEntriesI!exsum.ht!pages}
+<<exsum.ht>>=
+\begin{page}{ExSumListEntriesI}{Summing the Entries of a List I}
+\beginscroll
+In Axiom, you can create lists of consecutive integers by giving the
+first and last entries of the list.
+Here's how you create a list of the integers between {\em 1} and {\em 15}:
+\spadpaste{[i for i in 1..15]}
+To sum the entries of a list, simply put {\em +/} in front of the list.
+For example, the following command will sum the integers from 1 to 15:
+\spadpaste{reduce(+,[i for i in 1..15])}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Summing the Entries of a List II}
+\label{ExSumListEntriesII}
+\index{pages!ExSumListEntriesII!exsum.ht}
+\index{exsum.ht!pages!ExSumListEntriesII}
+\index{ExSumListEntriesII!exsum.ht!pages}
+<<exsum.ht>>=
+\begin{page}{ExSumListEntriesII}{Summing the Entries of a List II}
+\beginscroll
+In Axiom, you can also create lists whose elements are some expression
+{\em f(n)} as the parameter n ranges between two integers.
+For example, the following command will create a list of the squares of
+the integers between {\em 5} and {\em 20}:
+\spadpaste{[n**2 for n in 5..20]}
+You can also compute the sum of the entries of this list:
+\spadpaste{reduce(+,[n**2 for n in 5..20])}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Approximating $e$}
+\label{ExSumApproximateE}
+\index{pages!ExSumApproximateE!exsum.ht}
+\index{exsum.ht!pages!ExSumApproximateE}
+\index{ExSumApproximateE!exsum.ht!pages}
+<<exsum.ht>>=
+\begin{page}{ExSumApproximateE}{Approximating e}
+\beginscroll
+You can obtain a numerical approximation of the number {\em e} by summing the
+entries of the following list:
+\spadpaste{reduce(+,[1.0/factorial(n) for n in 0..20])}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Closed Form Summations}
+\label{ExSumClosedForm}
+\index{pages!ExSumClosedForm!exsum.ht}
+\index{exsum.ht!pages!ExSumClosedForm}
+\index{ExSumClosedForm!exsum.ht!pages}
+<<exsum.ht>>=
+\begin{page}{ExSumClosedForm}{Closed Form Summations}
+\beginscroll
+In a previous example, we found the sum of the squares of the integers
+between {\em 5} and {\em 20}.
+We can also use Axiom to find a formula for the sum of the squares of
+the integers between {\em a} and {\em b}, where {\em a} and {\em b}
+are integers which will remain
+unspecified:
+\spadpaste{s := sum(k**2,k = a..b) \bound{s}}
+{\em sum(k**2,k = a..b)} returns the sum of {\em k**2} as the index {\em k}
+runs from {\em a} to {\em b}.
+Let's check our answer in one particular case by substituting specific values
+for {\em a} and {\em b} in our formula:
+% Warning: syntax for polynomial evaluation will probably change.
+\spadpaste{eval(s,[a,b],[1,25]) \free{s}}
+\spadpaste{reduce(+,[i**2 for i in 1..25])}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Sums of Cubes}
+\label{ExSumCubes}
+\index{pages!ExSumCubes!exsum.ht}
+\index{exsum.ht!pages!ExSumCubes}
+\index{ExSumCubes!exsum.ht!pages}
+<<exsum.ht>>=
+\begin{page}{ExSumCubes}{Sums of Cubes}
+\beginscroll
+Here's a cute example.
+First compute the sum of the cubes from {\em 1} to {\em n}:
+\spadpaste{sum(k**3,k = 1..n)}
+Then compute the square of the sum of the integers from {\em 1} to {\em n}:
+\spadpaste{sum(k,k = 1..n) ** 2}
+The answers are the same.
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Sums of Polynomials}
+\label{ExSumPolynomial}
+\index{pages!ExSumPolynomial!exsum.ht}
+\index{exsum.ht!pages!ExSumPolynomial}
+\index{ExSumPolynomial!exsum.ht!pages}
+<<exsum.ht>>=
+\begin{page}{ExSumPolynomial}{Sums of Polynomials}
+\beginscroll
+Axiom can compute {\em sum(f,k = a..b)}
+when {\em f} is any polynomial in {\em k}, even
+one with parameters.
+\spadpaste{sum(3*k**2/(c**2 + 1) + 12*k/d,k = (3*a)..(4*b))}
+\endscroll
+\autobuttons\end{page}
+
+@
+\begin{verbatim}
+%\begin{page}{ExSumRationalFunction}{Sums of Rational Functions}
+%\beginscroll
+%Axiom can compute {\em sum(f,k = a..b)} for some rational functions (quotients
+%of polynomials) in {\em k}.
+%\spadpaste{sum(1/(k * (k + 2)),k = 1..n)}
+%However, the method used (Gosper's method) does not guarantee an answer
+%in every case.
+%Here's an example of a sum that the method cannot compute:
+%\spadpaste{sum(1/(k**2 + 1),k = 1..n)}
+%\endscroll
+%\autobuttons\end{page}
+\end{verbatim}
+
+\subsection{Sums of General Functions}
+\label{ExSumGeneralFunction}
+\index{pages!ExSumGeneralFunction!exsum.ht}
+\index{exsum.ht!pages!ExSumGeneralFunction}
+\index{ExSumGeneralFunction!exsum.ht!pages}
+<<exsum.ht>>=
+\begin{page}{ExSumGeneralFunction}{Sums of General Functions}
+\beginscroll
+Gosper's method can also be used to compute {\em sum(f,k = a..b)}
+for some functions
+f which are not rational functions in {\em k}.
+Here's an example:
+\spadpaste{sum(k * x**k,k = 1..n)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\subsection{Infinite Sums}
+\label{ExSumInfinite}
+Provide a package for infinite sums
+\index{pages!ExSumInfinite!exsum.ht}
+\index{exsum.ht!pages!ExSumInfinite}
+\index{ExSumInfinite!exsum.ht!pages}
+<<exsum.ht>>=
+\begin{page}{ExSumInfinite}{Infinite Sums}
+\beginscroll
+In a few cases, we can compute infinite sums by taking limits of finite
+sums.
+For instance, you can compute the sum of {\em 1/(k * (k + 2))} as {\em k}
+ranges from
+{\em 1} to {\em infinity}.
+Use {\em \%plusInfinity} to denote `plus infinity'.
+\spadpaste{limit( sum(1/(k * (k + 2)),k = 1..n) ,n = \%plusInfinity)}
+\endscroll
+\autobuttons\end{page}
+
+@
+\section{farray.ht}
+<<farray.ht>>=
+\newcommand{\FlexibleArrayXmpTitle}{FlexibleArray}
+\newcommand{\FlexibleArrayXmpNumber}{9.26}
+
+@
+\subsection{FlexibleArray}
+\label{FlexibleArrayXmpPage}
+\begin{itemize}
+\item OneDimensionalArrayXmpPage \ref{OneDimensionalArrayXmpPage} on
+page~pageref{OneDimensionalArrayXmpPage}
+\item VectorXmpPage \ref{VectorXmpPage} on
+page~pageref{VectorXmpPage}
+\end{itemize}
+\index{pages!FlexibleArrayXmpPage!farray.ht}
+\index{farray.ht!pages!FlexibleArrayXmpPage}
+\index{FlexibleArrayXmpPage!farray.ht!pages}
+<<farray.ht>>=
+\begin{page}{FlexibleArrayXmpPage}{FlexibleArray}
+\beginscroll
+The \spadtype{FlexibleArray} domain constructor creates
+one-dimensional arrays of elements of the same type.
+Flexible arrays are an attempt to provide a data type that has the
+best features of both one-dimensional arrays (fast, random access
+to elements) and lists (flexibility).
+They are implemented by a fixed block of storage.
+When necessary for expansion, a new, larger block of storage is
+allocated and the elements from the old storage area are copied
+into the new block.
+
+Flexible arrays have available most of the operations provided by
+\spadtype{OneDimensionalArray} 
+(see \downlink{`OneDimensionalArray'}{OneDimensionalArrayXmpPage}
+\ignore{OneDimensionalArray}
+and \downlink{`Vector'}{VectorXmpPage}\ignore{Vector}).
+Since flexible arrays are also of category
+\spadtype{ExtensibleLinearAggregate}, they have operations
+\spadfunX{concat}, \spadfunX{delete}, \spadfunX{insert},
+\spadfunX{merge}, \spadfunX{remove}, \spadfunX{removeDuplicates},
+and \spadfunX{select}.
+In addition, the operations \spadfun{physicalLength} and
+\spadfunX{physicalLength} provide user-control over expansion and
+contraction.
+
+\xtc{
+A convenient way to create a flexible array is to apply
+the operation \spadfun{flexibleArray} to a list of values.
+}{
+\spadpaste{flexibleArray [i for i in 1..6]}
+}
+\xtc{
+Create a flexible array of six zeroes.
+}{
+\spadpaste{f : FARRAY INT := new(6,0)\bound{f}}
+}
+\xtc{
+For \texht{$i=1\ldots 6$}{i = 1..6},
+set the \eth{\smath{i}} element to \smath{i}.
+Display \spad{f}.
+}{
+\spadpaste{for i in 1..6 repeat f.i := i; f\bound{f1}\free{f}}
+}
+\xtc{
+Initially, the physical length is the same as the number of elements.
+}{
+\spadpaste{physicalLength f\free{f1}}
+}
+\xtc{
+Add an element to the end of \spad{f}.
+}{
+\spadpaste{concat!(f,11)\bound{f2}\free{f1}}
+}
+\xtc{
+See that its physical length has grown.
+}{
+\spadpaste{physicalLength f\free{f2}}
+}
+\xtc{
+Make \spad{f} grow to have room for \spad{15} elements.
+}{
+\spadpaste{physicalLength!(f,15)\bound{f3}\free{f2}}
+}
+\xtc{
+Concatenate the elements of \spad{f} to itself.
+The physical length allows room for three more values at the end.
+}{
+\spadpaste{concat!(f,f)\bound{f4}\free{f3}}
+}
+\xtc{
+Use \spadfunX{insert} to add an element to the front of
+a flexible array.
+}{
+\spadpaste{insert!(22,f,1)\bound{f5}\free{f4}}
+}
+\xtc{
+Create a second flexible array from \spad{f} consisting of the
+elements from index 10 forward.
+}{
+\spadpaste{g := f(10..)\bound{g}\free{f5}}
+}
+\xtc{
+Insert this array at the front of \spad{f}.
+}{
+\spadpaste{insert!(g,f,1)\bound{g1}\free{g f5}}
+}
+\xtc{
+Merge the flexible array \spad{f} into \spad{g} after sorting each in place.
+}{
+\spadpaste{merge!(sort! f, sort! g)\bound{f6}\free{g f5}}
+}
+\xtc{
+Remove duplicates in place.
+}{
+\spadpaste{removeDuplicates! f\bound{f7}\free{f6}}
+}
+\xtc{
+Remove all odd integers.
+}{
+\spadpaste{select!(i +-> even? i,f)\bound{f8}\free{f7}}
+}
+\xtc{
+All these operations have shrunk the physical length of \spad{f}.
+}{
+\spadpaste{physicalLength f\free{b8}}
+}
+\xtc{
+To force Axiom not to shrink flexible arrays call the
+\spadfun{shrinkable} operation with the argument \axiom{false}.
+You must package call this operation.
+The previous value is returned.
+}{
+\spadpaste{shrinkable(false)\$FlexibleArray(Integer)}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+%
+
+@
+\section{file.ht}
+<<file.ht>>=
+\newcommand{\FileXmpTitle}{File}
+\newcommand{\FileXmpNumber}{9.24}
+
+@
+\subsection{File}
+\label{FileXmpPage}
+\begin{itemize}
+\item TextFileXmpPage \ref{TextFileXmpPage} on
+page~pageref{TextFileXmpPage}
+\item KeyedAccessFileXmpPage \ref{KeyedAccessFileXmpPage} on
+page~pageref{KeyedAccessFileXmpPage}
+\item LibraryXmpPage \ref{LibraryXmpPage} on
+page~pageref{LibraryXmpPage}
+\item FileNameXmpPage \ref{FileNameXmpPage} on
+page~pageref{FileNameXmpPage}
+\end{itemize}
+\index{pages!FileXmpPage!file.ht}
+\index{file.ht!pages!FileXmpPage}
+\index{FileXmpPage!file.ht!pages}
+<<file.ht>>=
+\begin{page}{FileXmpPage}{File}
+\beginscroll
+
+The \spadtype{File(S)} domain provides a basic interface to read and
+write values of type \spad{S} in files.
+\xtc{
+Before working with a file, it must be made accessible to Axiom with
+the \spadfunFrom{open}{File} operation.
+}{
+\spadpaste{ifile:File List Integer:=open("/tmp/jazz1","output")  \bound{ifile}}
+}
+The \spadfunFrom{open}{File} function arguments are a \spadtype{FileName}
+and a \spadtype{String} specifying the mode.
+If a full pathname is not specified, the current default directory is
+assumed.
+The mode must be one of \spad{"input"} or \spad{"output"}.
+If it is not specified, \spad{"input"} is assumed.
+Once the file has been opened, you can read or write data.
+\xtc{
+The operations \spadfunFromX{read}{File} and \spadfunFromX{write}{File} are
+provided.
+}{
+\spadpaste{write!(ifile, [-1,2,3])        \free{ifile}\bound{ifile1}}
+}
+\xtc{
+}{
+\spadpaste{write!(ifile, [10,-10,0,111])  \free{ifile1}\bound{ifile2}}
+}
+\xtc{
+}{
+\spadpaste{write!(ifile, [7])             \free{ifile2}\bound{ifile3}}
+}
+\xtc{
+You can change from writing to reading (or vice versa)
+by reopening a file.
+}{
+\spadpaste{reopen!(ifile, "input")        \free{ifile3}\bound{ifile4}}
+}
+\xtc{
+}{
+\spadpaste{read! ifile                    \free{ifile4}\bound{ifile5}}
+}
+\xtc{
+}{
+\spadpaste{read! ifile                    \free{ifile5}\bound{ifile6}}
+}
+\xtc{
+The \spadfunFromX{read}{File} operation can cause an error if one tries to
+read more data than is in the file.
+To guard against this possibility the \spadfunFromX{readIfCan}{File}
+operation should be used.
+}{
+\spadpaste{readIfCan! ifile  \free{ifile6}\bound{ifile7}}
+}
+\xtc{
+}{
+\spadpaste{readIfCan! ifile  \free{ifile7}\bound{ifile8}}
+}
+\xtc{
+You can find the current mode of the file, and the file's name.
+}{
+\spadpaste{iomode ifile           \free{ifile}}
+}
+\xtc{
+}{
+\spadpaste{name ifile             \free{ifile}}
+}
+\xtc{
+When you are finished with a file, you should close it.
+}{
+\spadpaste{close! ifile           \free{ifile}\bound{ifileA}}
+}
+\noOutputXtc{
+}{
+\spadpaste{)system rm /tmp/jazz1  \free{ifileA}}
+}
+%\xtc{
+%}{
+%\spadcommand{)clear all  \free{}\bound{}}
+%}
+
+A limitation of the underlying LISP system is that not all values can be
+represented in a file.
+In particular, delayed values containing compiled functions cannot be
+saved.
+
+For more information on related topics, see
+\downlink{`TextFile'}{TextFileXmpPage}\ignore{TextFile},
+\downlink{`KeyedAccessFile'}{KeyedAccessFileXmpPage}\ignore{KeyedAccessFile},
+\downlink{`Library'}{LibraryXmpPage}\ignore{Library}, and
+\downlink{`FileName'}{FileNameXmpPage}\ignore{FileName}.
+\showBlurb{File}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{float.ht}
+<<float.ht>>=
+\newcommand{\FloatXmpTitle}{Float}
+\newcommand{\FloatXmpNumber}{9.27}
+
+@
+\subsection{Float}
+\label{FloatXmpPage}
+\begin{itemize}
+\item ugGraphPage \ref{ugGraphPage} on
+page~pageref{ugGraphPage}
+\item ugProblemNumericPage \ref{ugProblemNumericPage} on
+page~pageref{ugProblemNumericPage}
+\item DoubleFloatXmpPage \ref{DoubleFloatXmpPage} on
+page~pageref{DoubleFloatXmpPage}
+\item ugFloatIntroPage \ref{ugFloatIntroPage} on
+page~pageref{ugFloatIntroPage}
+\item ugFloatConvertPage \ref{ugFloatConvertPage} on
+page~pageref{ugFloatConvertPage}
+\item ugxFloatOutputPage \ref{ugxFloatOutputPage} on
+page~pageref{ugxFloatOutputPage}
+\item ugxFloatHilbertPage \ref{ugxFloatHilbertPage} on
+page~pageref{ugxFloatHilbertPage}
+\end{itemize}
+\index{pages!FloatXmpPage!float.ht}
+\index{float.ht!pages!FloatXmpPage}
+\index{FloatXmpPage!float.ht!pages}
+<<float.ht>>=
+\begin{page}{FloatXmpPage}{Float}
+\beginscroll
+
+ Axiom provides two kinds of floating point numbers.
+The domain \spadtype{Float} (abbreviation \spadtype{FLOAT})
+implements a model of arbitrary
+precision floating point numbers.
+The domain \spadtype{DoubleFloat} (abbreviation \spadtype{DFLOAT})
+is intended to make available
+hardware floating point arithmetic in Axiom.
+The actual model of floating point that \spadtype{DoubleFloat} provides is
+system-dependent.
+For example, on the IBM system 370 Axiom uses IBM double
+precision which has fourteen hexadecimal digits of precision or roughly
+sixteen decimal digits.
+Arbitrary precision floats allow the user to specify the
+precision at which arithmetic operations are computed.
+Although this is an attractive facility, it comes at a cost.
+Arbitrary-precision floating-point arithmetic typically takes
+twenty to two hundred times more time than hardware floating point.
+
+For more information about Axiom's numeric and graphic
+facilities,  see
+\downlink{``\ugGraphTitle''}{ugGraphPage} in 
+Section \ugGraphNumber\ignore{ugGraph},
+\downlink{``\ugProblemNumericTitle''}{ugProblemNumericPage} in 
+Section \ugProblemNumericNumber\ignore{ugProblemNumeric}, and
+\downlink{`DoubleFloat'}{DoubleFloatXmpPage}\ignore{DoubleFloat}.
+
+\beginmenu
+    \menudownlink{{9.27.1. Introduction to Float}}{ugxFloatIntroPage}
+    \menudownlink{{9.27.2. Conversion Functions}}{ugxFloatConvertPage}
+    \menudownlink{{9.27.3. Output Functions}}{ugxFloatOutputPage}
+    \menudownlink{{9.27.4. An Example: Determinant of a Hilbert Matrix}}
+{ugxFloatHilbertPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<float.ht>>=
+\newcommand{\ugxFloatIntroTitle}{Introduction to Float}
+\newcommand{\ugxFloatIntroNumber}{9.27.1.}
+
+@
+\subsection{Introduction to Float}
+\label{ugxFloatIntroPage}
+\index{pages!ugxFloatIntroPage!float.ht}
+\index{float.ht!pages!ugxFloatIntroPage}
+\index{ugxFloatIntroPage!float.ht!pages}
+<<float.ht>>=
+\begin{page}{ugxFloatIntroPage}{Introduction to Float}
+\beginscroll
+
+Scientific notation is supported for input and output
+of floating point numbers.
+A floating point number is written as a string of digits containing a
+decimal point optionally followed by the letter ``{\tt E}'', and then
+the exponent.
+\xtc{
+We begin by doing some calculations using arbitrary precision floats.
+The default precision is twenty decimal digits.
+}{
+\spadpaste{1.234}
+}
+\xtc{
+A decimal base for the exponent is assumed, so the number
+\spad{1.234E2}  denotes
+\texht{$1.234 \cdot  10^2$}{\spad{1.234 * 10**2}}.
+}{
+\spadpaste{1.234E2}
+}
+\xtc{
+The normal arithmetic operations are available for floating point
+numbers.
+}{
+\spadpaste{sqrt(1.2 + 2.3 / 3.4 ** 4.5)}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<float.ht>>=
+\newcommand{\ugxFloatConvertTitle}{Conversion Functions}
+\newcommand{\ugxFloatConvertNumber}{9.27.2.}
+
+@
+\subsection{Conversion Functions}
+\label{ugxFloatConvertPage}
+See ugTypesConvertPage \ref{ugTypesConvertPage} on 
+page~/pageref{ugTypesConvertPage}
+\index{pages!ugxFloatConvertPage!float.ht}
+\index{float.ht!pages!ugxFloatConvertPage}
+\index{ugxFloatConvertPage!float.ht!pages}
+<<float.ht>>=
+\begin{page}{ugxFloatConvertPage}{Conversion Functions}
+\beginscroll
+
+\labelSpace{3pc}
+\xtc{
+You can use conversion
+(\downlink{``\ugTypesConvertTitle''}{ugTypesConvertPage} 
+in Section \ugTypesConvertNumber\ignore{ugTypesConvert})
+to go back and forth between \spadtype{Integer}, \spadtype{Fraction Integer}
+and \spadtype{Float}, as appropriate.
+}{
+\spadpaste{i := 3 :: Float \bound{i}}
+}
+\xtc{
+}{
+\spadpaste{i :: Integer \free{i}}
+}
+\xtc{
+}{
+\spadpaste{i :: Fraction Integer \free{i}}
+}
+\xtc{
+Since you are explicitly asking for a conversion, you must take
+responsibility for any loss of exactness.
+}{
+\spadpaste{r := 3/7 :: Float \bound{r}}
+}
+\xtc{
+}{
+\spadpaste{r :: Fraction Integer \free{r}}
+}
+\xtc{
+This conversion cannot be performed: use
+\spadfunFrom{truncate}{Float} or \spadfunFrom{round}{Float} if that
+is what you intend.
+}{
+\spadpaste{r :: Integer \free{r}}
+}
+
+\xtc{
+The operations \spadfunFrom{truncate}{Float} and \spadfunFrom{round}{Float}
+truncate  \ldots
+}{
+\spadpaste{truncate 3.6}
+}
+\xtc{
+and round
+to the nearest integral \spadtype{Float} respectively.
+}{
+\spadpaste{round 3.6}
+}
+\xtc{
+}{
+\spadpaste{truncate(-3.6)}
+}
+\xtc{
+}{
+\spadpaste{round(-3.6)}
+}
+\xtc{
+The operation \spadfunFrom{fractionPart}{Float} computes the fractional part of
+\spad{x}, that is, \spad{x - truncate x}.
+}{
+\spadpaste{fractionPart 3.6}
+}
+\xtc{
+The operation \spadfunFrom{digits}{Float} allows the user to set the
+precision.
+It returns the previous value it was using.
+}{
+\spadpaste{digits 40 \bound{d40}}
+}
+\xtc{
+}{
+\spadpaste{sqrt 0.2}
+}
+\xtc{
+}{
+\spadpaste{pi()\$Float \free{d40}}
+}
+\xtc{
+The precision is only limited by the computer memory available.
+Calculations at 500 or more digits of precision are not difficult.
+}{
+\spadpaste{digits 500 \bound{d1000}}
+}
+\xtc{
+}{
+\spadpaste{pi()\$Float \free{d1000}}
+}
+\xtc{
+Reset \spadfunFrom{digits}{Float} to its default value.
+}{
+\spadpaste{digits 20}
+}
+Numbers of type \spadtype{Float} are represented as a record of two
+integers, namely, the mantissa and the exponent where the base of the
+exponent is binary.
+That is, the floating point number \spad{(m,e)} represents the number
+\texht{$m \cdot 2^e$}{\spad{m * 2**e}}.
+A consequence of using a binary base is that decimal numbers can not, in
+general, be represented exactly.
+
+\endscroll
+\autobuttons
+\end{page}
+
+<<float.ht>>=
+\newcommand{\ugxFloatOutputTitle}{Output Functions}
+\newcommand{\ugxFloatOutputNumber}{9.27.3.}
+
+@
+\subsection{Output Functions}
+\label{ugxFloatOutputPage}
+\index{pages!ugxFloatOutputPage!float.ht}
+\index{float.ht!pages!ugxFloatOutputPage}
+\index{ugxFloatOutputPage!float.ht!pages}
+<<float.ht>>=
+\begin{page}{ugxFloatOutputPage}{Output Functions}
+\beginscroll
+
+A number of operations exist for specifying how 
+numbers of type \spadtype{Float} are to be
+displayed.
+By default, spaces are inserted every ten digits in the
+output for readability.\footnote{Note that you cannot include spaces
+in the input form of a floating point number, though you can use
+underscores.}
+
+
+\xtc{
+Output spacing can be modified with the \spadfunFrom{outputSpacing}{Float}
+operation.
+This inserts no spaces and then displays the value of \spad{x}.
+}{
+\spadpaste{outputSpacing 0; x := sqrt 0.2 \bound{x}\bound{os0}}
+}
+\xtc{
+Issue this to have the spaces inserted every \spad{5} digits.
+}{
+\spadpaste{outputSpacing 5; x \bound{os5}\free{x}}
+}
+\xtc{
+By default, the system displays floats in either fixed format
+or scientific format, depending on the magnitude of the number.
+}{
+\spadpaste{y := x/10**10 \bound{y}\free{x os5}}
+}
+\xtc{
+A particular format may be requested with the operations
+\spadfunFrom{outputFloating}{Float} and \spadfunFrom{outputFixed}{Float}.
+}{
+\spadpaste{outputFloating(); x \bound{of} \free{os5 x}}
+}
+\xtc{
+}{
+\spadpaste{outputFixed(); y \bound{ox} \free{os5 y}}
+}
+\xtc{
+Additionally, you can ask for \spad{n} digits to be displayed after the
+decimal point.
+}{
+\spadpaste{outputFloating 2; y \bound{of2} \free{os5 y}}
+}
+\xtc{
+}{
+\spadpaste{outputFixed 2; x \bound{ox2} \free{os5 x}}
+}
+\xtc{
+This resets the output printing to the default behavior.
+}{
+\spadpaste{outputGeneral()}
+}
+%
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<float.ht>>=
+\newcommand{\ugxFloatHilbertTitle}{An Example: Determinant of a Hilbert Matrix}
+\newcommand{\ugxFloatHilbertNumber}{9.27.4.}
+
+@
+\subsection{An Example: Determinant of a Hilbert Matrix}
+\label{ugxFloatHilbertPage}
+\index{pages!ugxFloatHilbertPage!float.ht}
+\index{float.ht!pages!ugxFloatHilbertPage}
+\index{ugxFloatHilbertPage!float.ht!pages}
+<<float.ht>>=
+\begin{page}{ugxFloatHilbertPage}{An Example: Determinant of a Hilbert Matrix}
+\beginscroll
+
+Consider the problem of computing the determinant of a \spad{10} by \spad{10}
+Hilbert matrix.
+The \eth{\spad{(i,j)}} entry of a Hilbert matrix is given by
+\spad{1/(i+j+1)}.
+
+\labelSpace{2pc}
+\xtc{
+First do the computation using rational numbers to obtain the
+exact result.
+}{
+\spadpaste{a: Matrix Fraction Integer := matrix [[1/(i+j+1) for j in 0..9] for i in 0..9] \bound{a}}
+}
+\xtc{
+This version of \spadfunFrom{determinant}{Matrix} uses Gaussian
+elimination.
+}{
+\spadpaste{d:= determinant a \free{a}\bound{d}}
+}
+\xtc{
+}{
+\spadpaste{d :: Float \free{d}}
+}
+\xtc{
+Now use hardware floats. Note that a semicolon (;) is used
+to prevent the display of the matrix.
+}{
+\spadpaste{b: Matrix DoubleFloat := matrix [[1/(i+j+1\$DoubleFloat) for j in 0..9] for i in 0..9]; \bound{b}}
+}
+\xtc{
+The result given by hardware floats is correct only to four significant
+digits of precision.
+In the jargon of numerical analysis, the Hilbert matrix is said to be
+``ill-conditioned.''
+}{
+\spadpaste{determinant b \free{b}}
+}
+\xtc{
+Now repeat the computation at a higher precision using \spadtype{Float}.
+}{
+\spadpaste{digits 40 \bound{d40}}
+}
+\xtc{
+}{
+\spadpaste{c: Matrix Float := matrix [[1/(i+j+1\$Float) for j in 0..9] for i in 0..9]; \free{d40} \bound{c}}
+}
+\xtc{
+}{
+\spadpaste{determinant c \free{c}}
+}
+\xtc{
+Reset \spadfunFrom{digits}{Float} to its default value.
+}{
+\spadpaste{digits 20}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{fname.ht}
+<<fname.ht>>=
+\newcommand{\FileNameXmpTitle}{FileName}
+\newcommand{\FileNameXmpNumber}{9.25}
+
+@
+\subsection{FileName}
+\label{FileNameXmpPage}
+\index{pages!FileNameXmpPage!fname.ht}
+\index{fname.ht!pages!FileNameXmpPage}
+\index{FileNameXmpPage!fname.ht!pages}
+<<fname.ht>>=
+\begin{page}{FileNameXmpPage}{FileName}
+\beginscroll
+ 
+The \spadtype{FileName} domain provides an interface to the computer's
+file system.
+Functions are provided to manipulate file names and to test properties of
+files.
+ 
+The simplest way to use file names in the Axiom interpreter is to
+rely on conversion to and from strings.
+The syntax of these strings depends on the operating system.
+\xtc{
+}{
+\spadpaste{fn: FileName \bound{fndecl}}
+}
+\xtc{
+On AIX, this is a proper file syntax:
+}{
+\spadpaste{fn := "/spad/src/input/fname.input" \free{fndecl}\bound{fn}}
+}
+ 
+Although it is very convenient to be able to use string notation
+for file names in the interpreter, it is desirable to have a portable
+way of creating and manipulating file names from within programs.
+\xtc{
+A measure of portability is obtained by considering a file name
+to consist of three parts: the {\it directory}, the {\it name},
+and the {\it extension}.
+}{
+\spadpaste{directory fn \free{fn}}
+}
+\xtc{
+}{
+\spadpaste{name fn \free{fn}}
+}
+\xtc{
+}{
+\spadpaste{extension fn \free{fn}}
+}
+The meaning of these three parts depends on the operating system.
+For example, on CMS the file \spad{"SPADPROF INPUT M"}
+would have directory \spad{"M"}, name \spad{"SPADPROF"} and
+extension \spad{"INPUT"}.
+ 
+\xtc{
+It is possible to create a filename from its parts.
+}{
+\spadpaste{fn := filename("/u/smwatt/work", "fname", "input") \free{fndecl}\bound{fn1}}
+}
+\xtc{
+When writing programs, it is helpful to refer to directories via
+variables.
+}{
+\spadpaste{objdir := "/tmp" \bound{objdir}}
+}
+\xtc{
+}{
+\spadpaste{fn := filename(objdir, "table", "spad") \free{fndecl,objdir}\bound{fn2}}
+}
+\xtc{
+If the directory or the extension is given as an empty string, then
+a default is used.  On AIX, the defaults are the current directory
+and no extension.
+}{
+\spadpaste{fn := filename("", "letter", "") \free{fndecl}\bound{fn3}}
+}
+ 
+Three tests provide information about names in the file system.
+\xtc{
+The \spadfunFrom{exists?}{FileName} operation tests whether 
+the named file exists.
+}{
+\spadpaste{exists? "/etc/passwd"}
+}
+\xtc{
+The operation \spadfunFrom{readable?}{FileName} tells whether the named file
+can be read.  If the file does not exist, then it cannot be read.
+}{
+\spadpaste{readable? "/etc/passwd"}
+}
+\xtc{
+}{
+\spadpaste{readable? "/etc/security/passwd"}
+}
+\xtc{
+}{
+\spadpaste{readable? "/ect/passwd"}
+}
+\xtc{
+Likewise, the operation \spadfunFrom{writable?}{FileName} 
+tells whether the named file
+can be written.
+If the file does not exist, the test is determined
+by the properties of the directory.
+}{
+\spadpaste{writable? "/etc/passwd"}
+}
+\xtc{
+}{
+\spadpaste{writable? "/dev/null"}
+}
+\xtc{
+}{
+\spadpaste{writable? "/etc/DoesNotExist"}
+}
+\xtc{
+}{
+\spadpaste{writable? "/tmp/DoesNotExist"}
+}
+ 
+The \spadfunFrom{new}{FileName} operation constructs the name of a new
+writable file.
+The argument sequence is the same as for \spadfunFrom{filename}{FileName},
+except that the name part is actually a prefix for a constructed
+unique name.
+\xtc{
+The resulting file is in the specified directory
+with the given extension, and the same defaults are used.
+}{
+\spadpaste{fn := new(objdir, "xxx", "yy") \free{objdir,fndecl}\bound{fn4}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{fr.ht}
+<<fr.ht>>=
+\newcommand{\FactoredXmpTitle}{Factored}
+\newcommand{\FactoredXmpNumber}{9.22}
+
+@
+\subsection{Factored}
+\label{FactoredXmpPage}
+\begin{itemize}
+\item ugxFactoredDecompPage \ref{ugxFactoredDecompPage} on
+page~pageref{ugxFactoredDecompPage}
+\item ugxFactoredExpandPage \ref{ugxFactoredExpandPage} on
+page~pageref{ugxFactoredExpandPage}
+\item ugxFactoredArithPage \ref{ugxFactoredArithPage} on
+page~pageref{ugxFactoredArithPage}
+\item ugxFactoredNewPage \ref{ugxFactoredNewPage} on
+page~pageref{ugxFactoredNewPage}
+\item ugxFactoredVarPage \ref{ugxFactoredVarPage} on
+page~pageref{ugxFactoredVarPage}
+\end{itemize}
+\index{pages!FactoredXmpPage!fr.ht}
+\index{fr.ht!pages!FactoredXmpPage}
+\index{FactoredXmpPage!fr.ht!pages}
+<<fr.ht>>=
+\begin{page}{FactoredXmpPage}{Factored}
+\beginscroll
+
+\spadtype{Factored} creates a domain whose objects are kept in factored
+form as long as possible.
+Thus certain operations like \spadopFrom{*}{Factored}
+(multiplication) and \spadfunFrom{gcd}{Factored} are relatively
+easy to do.
+Others, such as addition, require somewhat more work, and
+the result may not be completely factored
+unless the argument domain \spad{R} provides a
+\spadfunFrom{factor}{Factored} operation.
+Each object consists of a unit and a list of factors, where each
+factor consists of a member of \spad{R} (the {\em base}), an
+exponent, and a flag indicating what is known about the base.
+A flag may be one of \spad{"nil"}, \spad{"sqfr"}, \spad{"irred"}
+or \spad{"prime"}, which mean that nothing is known about the
+base, it is square-free, it is irreducible, or it is prime,
+respectively.
+The current restriction to factored objects of integral domains
+allows simplification to be performed without worrying about
+multiplication order.
+
+\beginmenu
+    \menudownlink{{9.22.1. Decomposing Factored Objects}}
+{ugxFactoredDecompPage}
+    \menudownlink{{9.22.2. Expanding Factored Objects}}
+{ugxFactoredExpandPage}
+    \menudownlink{{9.22.3. Arithmetic with Factored Objects}}
+{ugxFactoredArithPage}
+    \menudownlink{{9.22.4. Creating New Factored Objects}}
+{ugxFactoredNewPage}
+    \menudownlink{{9.22.5. Factored Objects with Variables}}
+{ugxFactoredVarPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<fr.ht>>=
+\newcommand{\ugxFactoredDecompTitle}{Decomposing Factored Objects}
+\newcommand{\ugxFactoredDecompNumber}{9.22.1.}
+
+@
+\subsection{Decomposing Factored Objects}
+\label{ugxFactoredDecompPage}
+\index{pages!ugxFactoredDecompPage!fr.ht}
+\index{fr.ht!pages!ugxFactoredDecompPage}
+\index{ugxFactoredDecompPage!fr.ht!pages}
+<<fr.ht>>=
+\begin{page}{ugxFactoredDecompPage}{Decomposing Factored Objects}
+\beginscroll
+
+\labelSpace{4pc}
+\xtc{
+In this section we will work with a factored integer.
+}{
+\spadpaste{g := factor(4312) \bound{g}}
+}
+\xtc{
+Let's begin by decomposing \spad{g} into pieces.
+The only possible units for integers are \spad{1} and \spad{-1}.
+}{
+\spadpaste{unit(g) \free{g}}
+}
+\xtc{
+There are three factors.
+}{
+\spadpaste{numberOfFactors(g) \free{g}}
+}
+\xtc{
+We can make a list of the bases, \ldots
+}{
+\spadpaste{[nthFactor(g,i) for i in 1..numberOfFactors(g)] \free{g}}
+}
+\xtc{
+and the exponents, \ldots
+}{
+\spadpaste{[nthExponent(g,i) for i in 1..numberOfFactors(g)] \free{g}}
+}
+\xtc{
+and the flags.
+You can see that all the bases (factors) are prime.
+}{
+\spadpaste{[nthFlag(g,i) for i in 1..numberOfFactors(g)] \free{g}}
+}
+\xtc{
+A useful operation for pulling apart a factored object into a list
+of records of the components is \spadfunFrom{factorList}{Factored}.
+}{
+\spadpaste{factorList(g) \free{g}}
+}
+\xtc{
+If you don't care about the flags, use \spadfunFrom{factors}{Factored}.
+}{
+\spadpaste{factors(g) \free{g}\bound{prev1}}
+}
+\xtc{
+Neither of these operations returns the unit.
+}{
+\spadpaste{first(\%).factor \free{prev1}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<fr.ht>>=
+\newcommand{\ugxFactoredExpandTitle}{Expanding Factored Objects}
+\newcommand{\ugxFactoredExpandNumber}{9.22.2.}
+
+@
+@
+\subsection{Expanding Factored Objects}
+\label{ugxFactoredExpandPage}
+\index{pages!ugxFactoredExpandPage!fr.ht}
+\index{fr.ht!pages!ugxFactoredExpandPage}
+\index{ugxFactoredExpandPage!fr.ht!pages}
+<<fr.ht>>=
+\begin{page}{ugxFactoredExpandPage}{Expanding Factored Objects}
+\beginscroll
+
+\labelSpace{4pc}
+\xtc{
+Recall that we are working with this factored integer.
+}{
+\spadpaste{g := factor(4312) \bound{g}}
+}
+\xtc{
+To multiply out the factors with their multiplicities, use
+\spadfunFrom{expand}{Factored}.
+}{
+\spadpaste{expand(g) \free{g}}
+}
+\xtc{
+If you would like, say, the distinct factors multiplied together
+but with multiplicity one, you could do it this way.
+}{
+\spadpaste{reduce(*,[t.factor for t in factors(g)]) \free{g}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<fr.ht>>=
+\newcommand{\ugxFactoredArithTitle}{Arithmetic with Factored Objects}
+\newcommand{\ugxFactoredArithNumber}{9.22.3.}
+
+@
+\subsection{Arithmetic with Factored Objects}
+\label{ugxFactoredArithPage}
+\index{pages!ugxFactoredArithPage!fr.ht}
+\index{fr.ht!pages!ugxFactoredArithPage}
+\index{ugxFactoredArithPage!fr.ht!pages}
+<<fr.ht>>=
+\begin{page}{ugxFactoredArithPage}{Arithmetic with Factored Objects}
+\beginscroll
+
+\labelSpace{4pc}
+\xtc{
+We're still working with this factored integer.
+}{
+\spadpaste{g := factor(4312) \bound{g}}
+}
+\xtc{
+We'll also define this factored integer.
+}{
+\spadpaste{f := factor(246960) \bound{f}}
+}
+\xtc{
+Operations involving multiplication and division are particularly
+easy with factored objects.
+}{
+\spadpaste{f * g \free{f g}}
+}
+\xtc{
+}{
+\spadpaste{f**500 \free{f}}
+}
+\xtc{
+}{
+\spadpaste{gcd(f,g) \free{f g}}
+}
+\xtc{
+}{
+\spadpaste{lcm(f,g) \free{f g}}
+}
+\xtc{
+If we use addition and subtraction things can slow down because
+we may need to compute greatest common divisors.
+}{
+\spadpaste{f + g \free{f g}}
+}
+\xtc{
+}{
+\spadpaste{f - g \free{f g}}
+}
+\xtc{
+Test for equality with \spad{0} and \spad{1} by using
+\spadfunFrom{zero?}{Factored} and \spadfunFrom{one?}{Factored},
+respectively.
+}{
+\spadpaste{zero?(factor(0))}
+}
+\xtc{
+}{
+\spadpaste{zero?(g) \free{g}}
+}
+\xtc{
+}{
+\spadpaste{one?(factor(1))}
+}
+\xtc{
+}{
+\spadpaste{one?(f) \free{f}}
+}
+\xtc{
+Another way to get the zero and one factored objects is to use
+package calling 
+(see \downlink{``\ugTypesPkgCallTitle''}{ugTypesPkgCallPage} 
+in Section \ugTypesPkgCallNumber\ignore{ugTypesPkgCall}).
+}{
+\spadpaste{0\$Factored(Integer)}
+}
+\xtc{
+}{
+\spadpaste{1\$Factored(Integer)}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<fr.ht>>=
+\newcommand{\ugxFactoredNewTitle}{Creating New Factored Objects}
+\newcommand{\ugxFactoredNewNumber}{9.22.4.}
+
+@
+\subsection{Creating New Factored Objects}
+\label{ugxFactoredNewPage}
+See FactoredFunctionsTwoXmpPage \ref{FactoredFunctionsTwoXmpPage} on
+page~\pageref{FactoredFunctionsTwoXmpPage}
+\index{pages!ugxFactoredNewPage!fr.ht}
+\index{fr.ht!pages!ugxFactoredNewPage}
+\index{ugxFactoredNewPage!fr.ht!pages}
+<<fr.ht>>=
+\begin{page}{ugxFactoredNewPage}{Creating New Factored Objects}
+\beginscroll
+
+The \spadfunFrom{map}{Factored} operation is used to iterate across the
+unit and bases of a factored object.
+See \downlink{`FactoredFunctions2'}{FactoredFunctionsTwoXmpPage}
+\ignore{FactoredFunctions2} for a discussion of
+\spadfunFrom{map}{Factored}.
+
+\labelSpace{1pc}
+\xtc{
+The following four operations take a base and an exponent and create
+a factored object.
+They differ in handling the flag component.
+}{
+\spadpaste{nilFactor(24,2) \bound{prev2}}
+}
+\xtc{
+This factor has no associated information.
+}{
+\spadpaste{nthFlag(\%,1) \free{prev2}}
+}
+\xtc{
+This factor is asserted to be square-free.
+}{
+\spadpaste{sqfrFactor(30,2) \bound{prev3}}
+}
+\xtc{
+This factor is asserted to be irreducible.
+}{
+\spadpaste{irreducibleFactor(13,10) \bound{prev4}}
+}
+\xtc{
+This factor is asserted to be prime.
+}{
+\spadpaste{primeFactor(11,5) \bound{prev5}}
+}
+
+\xtc{
+A partial inverse to \spadfunFrom{factorList}{Factored} is
+\spadfunFrom{makeFR}{Factored}.
+}{
+\spadpaste{h := factor(-720) \bound{h}}
+}
+\xtc{
+The first argument is the unit and the second is a list of records as
+returned by \spadfunFrom{factorList}{Factored}.
+}{
+\spadpaste{h - makeFR(unit(h),factorList(h)) \free{h}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<fr.ht>>=
+\newcommand{\ugxFactoredVarTitle}{Factored Objects with Variables}
+\newcommand{\ugxFactoredVarNumber}{9.22.5.}
+
+@
+\subsection{Factored Objects with Variables}
+\label{ugxFactoredVarPage}
+\index{pages!ugxFactoredVarPage!fr.ht}
+\index{fr.ht!pages!ugxFactoredVarPage}
+\index{ugxFactoredVarPage!fr.ht!pages}
+<<fr.ht>>=
+\begin{page}{ugxFactoredVarPage}{Factored Objects with Variables}
+% =====================================================================
+\beginscroll
+
+\labelSpace{4pc}
+\xtc{
+Some of the operations available for polynomials are also available
+for factored polynomials.
+}{
+\spadpaste{p := (4*x*x-12*x+9)*y*y + (4*x*x-12*x+9)*y + 28*x*x - 84*x + 63 \bound{p}}
+}
+\xtc{
+}{
+\spadpaste{fp := factor(p) \free{p}\bound{fp}}
+}
+\xtc{
+You can differentiate with respect to a variable.
+}{
+\spadpaste{D(p,x) \free{p}}
+}
+\xtc{
+}{
+\spadpaste{D(fp,x) \free{fp}\bound{prev1}}
+}
+\xtc{
+}{
+\spadpaste{numberOfFactors(\%) \free{prev1}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{fr2.ht}
+<<fr2.ht>>=
+\newcommand{\FactoredFunctionsTwoXmpTitle}{FactoredFunctions2}
+\newcommand{\FactoredFunctionsTwoXmpNumber}{9.23}
+
+@
+\subsection{FactoredFunctions2}
+\label{FactoredFunctionsTwoXmpPage}
+\begin{itemize}
+\item FactoredXmpPage \ref{FactoredXmpPage} on
+page~pageref{FactoredXmpPage}
+\item ugProblemGaloisPage \ref{ugProblemGaloisPage} on
+page~pageref{ugProblemGaloisPage}
+\end{itemize}
+\index{pages!FactoredFunctionsTwoXmpPage!fr2.ht}
+\index{fr2.ht!pages!FactoredFunctionsTwoXmpPage}
+\index{FactoredFunctionsTwoXmpPage!fr2.ht!pages}
+<<fr2.ht>>=
+\begin{page}{FactoredFunctionsTwoXmpPage}{FactoredFunctions2}
+\beginscroll
+
+The \spadtype{FactoredFunctions2} package implements one operation,
+\spadfunFrom{map}{FactoredFunctions2}, for applying an operation to every
+base in a factored object and to the unit.
+\xtc{
+}{
+\spadpaste{double(x) == x + x \bound{double}}
+}
+\xtc{
+}{
+\spadpaste{f := factor(720) \bound{f}}
+}
+\xtc{
+Actually, the \spadfunFrom{map}{FactoredFunctions2} operation used
+in this example comes from \spadtype{Factored} itself, since
+\userfun{double} takes an integer argument and returns an integer
+result.
+}{
+\spadpaste{map(double,f) \free{f}\free{double}}
+}
+\xtc{
+If we want to use an operation that returns an object that has a type
+different from the operation's argument,
+the \spadfunFrom{map}{FactoredFunctions2} in \spadtype{Factored}
+cannot be used and we use the one in \spadtype{FactoredFunctions2}.
+}{
+\spadpaste{makePoly(b) == x + b \bound{makePoly}}
+}
+\xtc{
+In fact, the ``2'' in the name of the package means that we might
+be using factored objects of two different types.
+}{
+\spadpaste{g := map(makePoly,f) \free{f}\free{makePoly}\bound{g}}
+}
+It is important to note that both versions of 
+\spadfunFrom{map}{FactoredFunctions2}
+destroy any information known about the bases (the fact that they are prime,
+for instance).
+\xtc{
+The flags for each base are set to ``nil'' in the object returned
+by \spadfunFrom{map}{FactoredFunctions2}.
+}{
+\spadpaste{nthFlag(g,1) \free{g}}
+}
+
+For more information about factored objects and their use, see
+\downlink{`Factored'}{FactoredXmpPage}\ignore{Factored} and
+\downlink{``\ugProblemGaloisTitle''}{ugProblemGaloisPage} in 
+Section \ugProblemGaloisNumber\ignore{ugProblemGalois}.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{frac.ht}
+<<frac.ht>>=
+\newcommand{\FractionXmpTitle}{Fraction}
+\newcommand{\FractionXmpNumber}{9.28}
+
+@
+\subsection{Fraction}
+\label{FractionXmpPage}
+\begin{itemize}
+\item ContinuedFractionXmpPage \ref{ContinuedFractionXmpPage} on
+page~pageref{ContinuedFractionXmpPage}
+\item PartialFractionXmpPage \ref{PartialFractionXmpPage} on
+page~pageref{PartialFractionXmpPage}
+\end{itemize}
+\index{pages!FractionXmpPage!frac.ht}
+\index{frac.ht!pages!FractionXmpPage}
+\index{FractionXmpPage!frac.ht!pages}
+<<frac.ht>>=
+\begin{page}{FractionXmpPage}{Fraction}
+\beginscroll
+
+The \spadtype{Fraction} domain implements quotients.
+The elements must belong to a domain of category \spadtype{IntegralDomain}:
+multiplication must be commutative and the product of two non-zero
+elements must not be zero.
+This allows you to make fractions of most things you would think of,
+but don't expect to create a fraction of two matrices!
+The abbreviation for \spadtype{Fraction} is \spadtype{FRAC}.
+
+\xtc{
+Use \spadopFrom{/}{Fraction} to create a fraction.
+}{
+\spadpaste{a := 11/12 \bound{a}}
+}
+\xtc{
+}{
+\spadpaste{b := 23/24 \bound{b}}
+}
+\xtc{
+The standard arithmetic operations are available.
+}{
+\spadpaste{3 - a*b**2 + a + b/a \free{a}\free{b}}
+}
+\xtc{
+Extract the numerator and denominator by using
+\spadfunFrom{numer}{Fraction} and \spadfunFrom{denom}{Fraction},
+respectively.
+}{
+\spadpaste{numer(a) \free{a}}
+}
+\xtc{
+}{
+\spadpaste{denom(b) \free{b}}
+}
+Operations like \spadfunFrom{max}{Fraction}, \spadfunFrom{min}{Fraction},
+\spadfunFrom{negative?}{Fraction}, \spadfunFrom{positive?}{Fraction} and
+\spadfunFrom{zero?}{Fraction} are all available if they are provided for
+the numerators and denominators.
+See \downlink{`Integer'}{IntegerXmpPage}\ignore{Integer} for examples.
+
+Don't expect a useful answer from \spadfunFrom{factor}{Fraction},
+\spadfunFrom{gcd}{Fraction} or \spadfunFrom{lcm}{Fraction} if you apply
+them to fractions.
+\xtc{
+}{
+\spadpaste{r := (x**2 + 2*x + 1)/(x**2 - 2*x + 1) \bound{r}}
+}
+\xtc{
+Since all non-zero fractions are invertible, these operations have trivial
+definitions.
+}{
+\spadpaste{factor(r) \free{r}}
+}
+\xtc{
+Use \spadfunFrom{map}{Fraction} to apply \spadfunFrom{factor}{Fraction} to
+the numerator and denominator, which is probably what you mean.
+}{
+\spadpaste{map(factor,r) \free{r}}
+}
+
+\xtc{
+Other forms of fractions are available.
+Use \spadfun{continuedFraction} to create a continued fraction.
+}{
+\spadpaste{continuedFraction(7/12)}
+}
+\xtc{
+Use \spadfun{partialFraction} to create a partial fraction.
+See \downlink{`ContinuedFraction'}{ContinuedFractionXmpPage}
+\ignore{ContinuedFraction} and 
+\downlink{`PartialFraction'}{PartialFractionXmpPage}
+\ignore{PartialFraction} for
+additional information and examples.
+}{
+\spadpaste{partialFraction(7,12)}
+}
+
+\xtc{
+Use conversion to create alternative views of fractions with objects
+moved in and out of the numerator and denominator.
+}{
+\spadpaste{g := 2/3 + 4/5*\%i \bound{g}}
+}
+\xtc{
+Conversion is discussed in detail in 
+\downlink{``\ugTypesConvertTitle''}{ugTypesConvertPage} 
+in Section \ugTypesConvertNumber\ignore{ugTypesConvert}.
+}{
+\spadpaste{g :: FRAC COMPLEX INT \free{g}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{fparfrac.ht}
+<<fparfrac.ht>>=
+\newcommand{\FullPartialFractionExpansionXmpTitle}
+{FullPartialFractionExpansion}
+\newcommand{\FullPartialFractionExpansionXmpNumber}{9.29}
+
+@
+\subsection{FullPartialFractionExpansion}
+\label{FullPartialFractionExpansionXmpPage}
+See PartialFractionXmpPage \ref{PartialFractionXmpPage} on 
+page~\pageref{PartialFractionXmpPage}
+\index{pages!FullPartialFractionExpansionXmpPage!fparfrac.ht}
+\index{fparfrac.ht!pages!FullPartialFractionExpansionXmpPage}
+\index{FullPartialFractionExpansionXmpPage!fparfrac.ht!pages}
+<<fparfrac.ht>>=
+\begin{page}{FullPartialFractionExpansionXmpPage}{FullPartialFractionExpansion}
+\beginscroll
+
+The domain \spadtype{FullPartialFractionExpansion} implements
+factor-free conversion of quotients to full partial fractions.
+
+\xtc{
+Our examples will all involve quotients of univariate polynomials
+with rational number coefficients.
+}{
+\spadpaste{Fx := FRAC UP(x, FRAC INT) \bound{Fx}}
+}
+\xtc{
+Here is a simple-looking rational function.
+}{
+\spadpaste{f : Fx := 36 / (x**5-2*x**4-2*x**3+4*x**2+x-2) \bound{f}\free{Fx}}
+}
+\xtc{
+We use \spadfunFrom{fullPartialFraction}{FullPartialFractionExpansion}
+to convert it to an object of type
+\spadtype{FullPartialFractionExpansion}.
+}{
+\spadpaste{g := fullPartialFraction f \bound{g}\free{f}}
+}
+\xtc{
+Use a coercion to change it back into a quotient.
+}{
+\spadpaste{g :: Fx \free{g}}
+}
+\xtc{
+Full partial fractions differentiate faster than rational
+functions.
+}{
+\spadpaste{g5 := D(g, 5) \free{g}\bound{g5}}
+}
+\xtc{
+}{
+\spadpaste{f5 := D(f, 5) \free{f}\bound{f5}}
+}
+\xtc{
+We can check that the two forms represent the same function.
+}{
+\spadpaste{g5::Fx - f5 \free{Fx g5 f5}}
+}
+\xtc{
+Here are some examples that are more complicated.
+}{
+\spadpaste{f : Fx := (x**5 * (x-1)) / ((x**2 + x + 1)**2 * (x-2)**3) \free{Fx}\bound{f2}}
+}
+\xtc{
+}{
+\spadpaste{g := fullPartialFraction f \free{f2}\bound{g2}}
+}
+\xtc{
+}{
+\spadpaste{g :: Fx - f \free{f2 g2 Fx}}
+}
+\xtc{
+}{
+\spadpaste{f : Fx := (2*x**7-7*x**5+26*x**3+8*x) / (x**8-5*x**6+6*x**4+4*x**2-8) \free{Fx}\bound{f3}}
+}
+\xtc{
+}{
+\spadpaste{g := fullPartialFraction f \free{f3}\bound{g3}}
+}
+\xtc{
+}{
+\spadpaste{g :: Fx - f \free{f3 g3 Fx}}
+}
+\xtc{
+}{
+\spadpaste{f:Fx := x**3 / (x**21 + 2*x**20 + 4*x**19 + 7*x**18 + 10*x**17 + 17*x**16 + 22*x**15 + 30*x**14 + 36*x**13 + 40*x**12 + 47*x**11 + 46*x**10 + 49*x**9 + 43*x**8 + 38*x**7 + 32*x**6 + 23*x**5 + 19*x**4 + 10*x**3 + 7*x**2 + 2*x + 1)\free{Fx}\bound{f4}}
+}
+\xtc{
+}{
+\spadpaste{g := fullPartialFraction f \free{f4}\bound{g4}}
+}
+\xtc{
+This verification takes much longer than the conversion to
+partial fractions.
+}{
+\spadpaste{g :: Fx - f \free{f4 g4 Fx}}
+}
+
+For more information, see the paper:
+Bronstein, M and Salvy, B.
+``Full Partial Fraction Decomposition of Rational Functions,''
+{\it Proceedings of ISSAC'93, Kiev}, ACM Press.
+All see \downlink{`PartialFraction'}{PartialFractionXmpPage}
+\ignore{PartialFraction} for standard partial fraction
+decompositions.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{function.ht}
+\subsection{Functions in Axiom}
+\label{FunctionPage}
+\begin{itemize}
+\item RationalFunctionPage \ref{RationalFunctionPage} on
+page~\pageref{RationalFunctionPage}
+\item AlgebraicFunctionPage \ref{AlgebraicFunctionPage} on
+page~\pageref{AlgebraicFunctionPage}
+\item ElementaryFunctionPage \ref{ElementaryFunctionPage} on
+page~\pageref{ElementaryFunctionPage}
+\item FunctionSimplificationPage \ref{FunctionSimplificationPage} on
+page~\pageref{FunctionSimplificationPage}
+\end{itemize}
+\index{pages!FunctionPage!function.ht}
+\index{function.ht!pages!FunctionPage}
+\index{FunctionPage!function.ht!pages}
+<<function.ht>>=
+\begin{page}{FunctionPage}{Functions in Axiom}
+%
+In Axiom, a function is an expression in one or more variables.
+(Think of it as a function of those variables).
+You can also define a function by rules or use a built-in function
+Axiom lets you convert expressions to compiled functions.
+\beginscroll
+\beginmenu
+\menulink{Rational Functions}{RationatFunctionPage} \tab{22}
+Quotients of polynomials.
+
+\menulink{Algebraic Functions}{AlgebraicFunctionPage} \tab{22}
+Those defined by polynomial equations.
+
+\menulink{Elementary Functions}{ElementaryFunctionPage} \tab{22}
+The elementary functions of calculus.
+
+\menulink{Simplification}{FunctionSimplificationPage} \tab{22}
+How to simplify expressions.
+
+\menulink{Pattern Matching}{ugUserRulesPage} \tab{22}
+How to use the pattern matcher.
+\endmenu
+\endscroll
+\newline
+Additional Topics:
+\beginmenu
+
+\menulink{Operator Algebra}{OperatorXmpPage}\tab{22}
+The operator algebra facility.
+
+\endmenu
+\autobuttons \end{page}
+
+@
+\subsection{Rational Functions}
+\label{RationatFunctionPage}
+\index{pages!RationatFunctionPage!function.ht}
+\index{function.ht!pages!RationatFunctionPage}
+\index{RationatFunctionPage!function.ht!pages}
+<<function.ht>>=
+\begin{page}{RationatFunctionPage}{Rational Functions}
+\beginscroll
+To create a rational function, just compute the
+quotient of two polynomials:
+\spadpaste{f := (x - y) / (x + y)\bound{f}}
+Use the functions \spadfun{numer} and \spadfun{denom}:
+to recover the numerator and denominator of a fraction:
+%
+\spadpaste{numer f\free{f}}
+\spadpaste{denom f\free{f}}
+%
+Since these are polynomials, you can apply all the
+\downlink{polynomial operations}{PolynomialPage}
+to them.
+You can substitute values or
+other rational functions for the variables using
+the function \spadfun{eval}. The syntax for \spadfun{eval} is
+similar to the one for polynomials:
+\spadpaste{eval(f, x = 1/x)\free{f}}
+\spadpaste{eval(f, [x = y, y = x])\free{f}}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\subsection{Algebraic Functions}
+\label{AlgebraicFunctionPage}
+\index{pages!AlgebraicFunctionPage!function.ht}
+\index{function.ht!pages!AlgebraicFunctionPage}
+\index{AlgebraicFunctionPage!function.ht!pages}
+<<function.ht>>=
+\begin{page}{AlgebraicFunctionPage}{Algebraic Functions}
+\beginscroll
+Algebraic functions are functions defined by algebraic equations. There
+are two ways of constructing them: using rational powers, or implicitly.
+For rational powers, use \spadopFrom{**}{RadicalCategory}
+(or the system functions \spadfun{sqrt} and
+\spadfun{nthRoot} for square and nth roots):
+\spadpaste{f := sqrt(1 + x ** (1/3))\bound{f}}
+To define an algebraic function implicitly
+use \spadfun{rootOf}. The following
+line defines a function \spad{y} of \spad{x} satisfying the equation
+\spad{y**3 = x*y - y**2 - x**3 + 1}:
+\spadpaste{y := rootOf(y**3 + y**2 - x*y + x**3 - 1, y)\bound{y}}
+You can manipulate, differentiate or integrate an implicitly defined
+algebraic function like any other Axiom function:
+\spadpaste{differentiate(y, x)\free{y}}
+Higher powers of algebraic functions are automatically reduced during
+calculations:
+\spadpaste{(y + 1) ** 3\free{y}}
+But denominators, are not automatically rationalized:
+\spadpaste{g := inv f\bound{g}\free{y}}
+Use \spadfun{ratDenom} to remove the algebraic quantities from the denominator:
+\spadpaste{ratDenom g\free{g}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Elementary Functions}
+\label{ElementaryFunctionPage}
+\index{pages!ElementaryFunctionPage!function.ht}
+\index{function.ht!pages!ElementaryFunctionPage}
+\index{ElementaryFunctionPage!function.ht!pages}
+<<function.ht>>=
+\begin{page}{ElementaryFunctionPage}{Elementary Functions}
+\beginscroll
+Axiom has most of the usual functions from calculus built-in:
+\spadpaste{f := x * log y * sin(1/(x+y))\bound{f}}
+You can substitute values or another elementary functions for the variables
+with the function \spadfun{eval}:
+\spadpaste{eval(f, [x = y, y = x])\free{f}}
+As you can see, the substitutions are made 'in parallel' as in the case
+of polynomials. It's also possible to substitute expressions for kernels
+instead of variables:
+\spadpaste{eval(f, log y = acosh(x + sqrt y))\free{f}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Simplification}
+\label{FunctionSimplificationPage}
+See ugUserRulesPage \ref{ugUserRulesPage} on page~\pageref{ugUserRulesPage}
+\index{pages!FunctionSimplificationPage!function.ht}
+\index{function.ht!pages!FunctionSimplificationPage}
+\index{FunctionSimplificationPage!function.ht!pages}
+<<function.ht>>=
+\begin{page}{FunctionSimplificationPage}{Simplification}
+\beginscroll
+Simplifying an expression often means different things at
+different times, so Axiom offers a large number of
+`simplification' functions.
+The most common one, which performs the usual trigonometric
+simplifications is \spadfun{simplify}:
+\spadpaste{f := cos(x)/sec(x) * log(sin(x)**2/(cos(x)**2+sin(x)**2)) \bound{f}}
+\spadpaste{g := simplify f\bound{g}\free{f}}
+If the result of \spadfun{simplify} is not satisfactory, specific
+transformations are available.
+For example, to rewrite \spad{g} in terms of secants and
+cosecants instead of sines and cosines, issue:
+%
+\spadpaste{h := sin2csc cos2sec g\bound{h}\free{g}}
+%
+To apply the logarithm simplification rules to \spad{h}, issue:
+\spadpaste{expandLog h\free{h}}
+Since the square root of \spad{x**2} is the absolute value of
+\spad{x} and not \spad{x} itself, algebraic radicals are not
+automatically simplified, but you can specifically request it by
+calling \spadfun{rootSimp}:
+%
+\spadpaste{f1 := sqrt((x+1)**3)\bound{f1}}
+\spadpaste{rootSimp f1\free{f1}}
+%
+There are other transformations which are sometimes useful.
+Use the functions \spadfun{complexElementary} and \spadfun{trigs}
+to go back and forth between the complex exponential and
+trigonometric forms of an elementary function:
+%
+\spadpaste{g1 := sin(x + cos x)\bound{g1}}
+\spadpaste{g2 := complexElementary g1\bound{g2}\free{g1}}
+\spadpaste{trigs g2\free{g2}}
+%
+Similarly, the functions \spadfun{realElementary} and
+\spadfun{htrigs} convert hyperbolic functions in and out of their
+exponential form:
+%
+\spadpaste{h1 := sinh(x + cosh x)\bound{h1}}
+\spadpaste{h2 := realElementary h1\bound{h2}\free{h1}}
+\spadpaste{htrigs h2\free{h2}}
+%
+Axiom has other transformations, most of which
+are in the packages
+\spadtype{ElementaryFunctionStructurePackage},
+\spadtype{TrigonometricManipulations},
+\spadtype{AlgebraicManipulations},
+and \spadtype{TranscendentalManipulations}.
+If you need to apply a simplification rule not built into the
+system, you can use Axiom's \downlink{pattern
+matcher}{ugUserRulesPage}.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{gbf.ht}
+<<gbf.ht>>=
+\newcommand{\GroebnerFactorizationPackageXmpTitle}{GroebnerFactorizationPackage}
+\newcommand{\GroebnerFactorizationPackageXmpNumber}{9.31}
+
+@
+\subsection{GroebnerFactorizationPackage}
+\label{GroebnerFactorizationPackageXmpPage}
+\index{pages!GroebnerFactorizationPackageXmpPage!gbf.ht}
+\index{gbf.ht!pages!GroebnerFactorizationPackageXmpPage}
+\index{GroebnerFactorizationPackageXmpPage!gbf.ht!pages}
+<<gbf.ht>>=
+\begin{page}{GroebnerFactorizationPackageXmpPage}{GroebnerFactorizationPackage}
+% =====================================================================
+\beginscroll
+%%  J. Grabmeier 26 04 91
+Solving systems of polynomial equations with the
+\texht{Gr\"{o}bner}{Groebner}
+basis algorithm can often be very time consuming because, in general,
+the algorithm has exponential run-time.
+These systems, which often come from concrete applications,
+frequently have symmetries which are not taken advantage of by the
+algorithm.
+However, it often happens in this case
+that the polynomials which occur during the
+\texht{Gr\"{o}bner}{Groebner} calculations are reducible.
+Since Axiom has an excellent polynomial factorization algorithm, it is
+very natural to combine the
+\texht{Gr\"{o}bner}{Groebner} and factorization algorithms.
+
+\spadtype{GroebnerFactorizationPackage} exports the
+\axiomFunFrom{groebnerFactorize}{GroebnerFactorizationPackage}
+operation which implements a modified
+\texht{Gr\"{o}bner}{Groebner} basis algorithm.
+In this algorithm, each polynomial that is to be put into the
+partial list of the basis is first factored.
+The remaining calculation is split into as many parts as there are
+irreducible factors.
+Call these factors \texht{$p_1, \ldots,p_n.$}{\spad{p1, ..., pn.}}
+In the branches corresponding to \texht{$p_2,
+\ldots,p_n,$}{\spad{p2, ..., pn,}} the factor
+\texht{$p_1$}{\spad{p1}} can be divided out, and so on.
+This package also contains operations that allow you to specify the
+polynomials that are not zero on the common roots of the final
+\texht{Gr\"{o}bner}{Groebner} basis.
+
+Here is an example from chemistry.
+In a theoretical model of the cyclohexan 
+\texht{${\rm C}_6{\rm H}_{12}$}{C6H12},
+the six carbon atoms each sit in the center of gravity of a
+tetrahedron that has two hydrogen atoms and two carbon atoms at its
+corners.
+We first normalize and set the length of each edge to 1.
+Hence, the distances of one fixed carbon atom to each of its
+immediate neighbours is 1.
+We will denote the distances to the other three carbon atoms by
+\smath{x}, \smath{y} and \smath{z}.
+
+\texht{A.~Dress}{A. Dress} developed a theory to decide whether a set of points
+%% reference?
+and distances between them can be realized in an \smath{n}-dimensional space.
+Here, of course, we have \smath{n = 3}.
+\xtc{
+}{
+\spadpaste{mfzn : SQMATRIX(6,DMP([x,y,z],Fraction INT)) := [[0,1,1,1,1,1], [1,0,1,8/3,x,8/3], [1,1,0,1,8/3,y], [1,8/3,1,0,1,8/3], [1,x,8/3,1,0,1], [1,8/3,y,8/3,1,0]] \bound{mfzn}}
+}
+\xtc{
+For the cyclohexan, the distances have to satisfy this equation.
+}{
+\spadpaste{eq := determinant mfzn \free{mfzn}\bound{eq}}
+}
+\xtc{
+They also must satisfy the equations
+given by cyclic shifts of the indeterminates.
+}{
+\spadpaste{groebnerFactorize [eq, eval(eq, [x,y,z], [y,z,x]), eval(eq, [x,y,z], [z,x,y])] \free{eq}}
+}
+
+The union of the solutions of this list is the
+solution of our original problem.
+If we impose positivity conditions, we get two relevant ideals.
+One ideal is
+zero-dimensional, namely \smath{x = y = z = 11/3}, and this
+determines the ``boat'' form of the cyclohexan.
+The other ideal is one-dimensional,
+which means that we have a solution space given by one parameter.
+This gives the ``chair'' form of the cyclohexan.
+The parameter describes the angle of the ``back of the chair.''
+
+\axiomFunFrom{groebnerFactorize}{GroebnerFactorizationPackage}
+has an optional \axiomType{Boolean}-valued second argument.
+When it is \spad{true} partial results are displayed, 
+since it may happen that the
+calculation does not terminate in a reasonable time.
+See the source code for \spadtype{GroebnerFactorizationPackage}
+in {\bf groebf\spadFileExt{}} for more details about the algorithms
+used.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{gloss.ht}
+\subsection{Glossary}
+\label{GlossaryPage}
+\index{pages!GlossaryPage!gloss.ht}
+\index{gloss.ht!pages!GlossaryPage}
+\index{GlossaryPage!gloss.ht!pages}
+<<gloss.ht>>=
+\begin{page}{GlossaryPage}{G l o s s a r y}
+\beginscroll\beginmenu\item\newline{\em \menuitemstyle{}}{\em !}\space{}
+{\em (syntax)} Suffix character for \spadgloss{destructive operations}.
+\item\newline{\em \menuitemstyle{}}{\em ,}\space{}
+{\em (syntax)} a separator for items in a \spadgloss{tuple},{} 
+\spadignore{e.g.} to separate arguments of a function \spad{f(x,{}y)}.
+\item\newline{\em \menuitemstyle{}}{\em =>}\space{}
+{\em (syntax)} the expression \spad{a => b} is equivalent to 
+\spad{if a then} \spadgloss{exit} \spad{b}.
+\item\newline{\em \menuitemstyle{}}{\em ?}\space{}
+1. {\em (syntax)} a suffix character for Boolean-valued \spadfun{function} 
+names,{} \spadignore{e.g.} \spadfun{odd?}. 2. Suffix character for pattern 
+variables. 3. The special type \spad{?} means {\em don't care}. For 
+example,{} the declaration \newline\center{\spad{x : Polynomial ?}}\newline,
+{} means that values assigned to \spad{x} must be polynomials over an 
+arbitrary \spadgloss{underlying domain}.
+\item\newline{\em \menuitemstyle{}}{\em abstract datatype}\space{}
+a programming language principle used in Axiom where a datatype 
+is defined in two parts: (1) a {\em public} part describing a set of 
+\spadgloss{exports},{} principally operations that apply to objects of 
+that type,{} and (2) a {\em private} part describing the implementation 
+of the datatype usually in terms of a \spadgloss{representation} for 
+objects of the type. Programs which create and otherwise manipulate 
+objects of the type may only do so through its exports. The representation 
+and other implementation information is specifically hidden.
+\item\newline{\em \menuitemstyle{}}{\em abstraction}\space{}
+described functionally or conceptually without regard to implementation
+\item\newline{\em \menuitemstyle{}}{\em accuracy}\space{}
+the degree of exactness of an approximation or measurement. In computer 
+algebra systems,{} computations are typically carried out with complete 
+accuracy using integers or rational numbers of indefinite size. Domain 
+\spadtype{Float} provides a function \spadfunFrom{precision}{Float} to 
+change the precision for floating point computations. Computations using 
+\spadtype{DoubleFloat} have a fixed precision but uncertain accuracy.
+\item\newline{\em \menuitemstyle{}}{\em add-chain}\space{}
+a hierarchy formed by \spadgloss{domain extensions}. If domain \spad{A} 
+extends domain \spad{B} and domain \spad{B} extends domain \spad{C},{} 
+then \spad{A} has {\em add-chain} \spad{B}-\spad{C}.
+\item\newline{\em \menuitemstyle{}}{\em aggregate}\space{}
+a data structure designed to hold multiple values. Examples of aggregates 
+are \spadtype{List},{} \spadtype{Set},{} \spadtype{Matrix} and \spadtype{Bits}.
+\item\newline{\em \menuitemstyle{}}{\em AKCL}\space{}
+Austin Kyoto Common LISP,{} a version of \spadgloss{\spad{KCL}} produced 
+by William Schelter,{} Austin,{} Texas.
+\item\newline{\em \menuitemstyle{}}{\em algorithm}\space{}
+a step-by-step procedure for a solution of a problem; a program
+\item\newline{\em \menuitemstyle{}}{\em ancestor}\space{}
+(of a domain) a category which is a \spadgloss{parent} of the domain,{} 
+or a \spadgloss{parent} of a \spadgloss{parent},{} and so on.
+\item\newline{\em \menuitemstyle{}}{\em application}\space{}
+{\em (syntax)} an expression denoting "application" of a function to a set 
+of \spadgloss{argument} parameters. Applications are written as a 
+\spadgloss{parameterized form}. For example,{} the form \spad{f(x,{}y)} 
+indicates the "application of the function \spad{f} to the tuple of 
+arguments \spad{x} and \spad{y}". See also \spadgloss{evaluation} and 
+\spadgloss{invocation}.
+\item\newline{\em \menuitemstyle{}}{\em apply}\space{}
+See \spadgloss{application}.
+\item\newline{\em \menuitemstyle{}}{\em argument}\space{}
+1. (actual argument) a value passed to a function at the time of a 
+\spadglossSee{function call}{application}; also called an {\em actual 
+parameter}. 2. (formal argument) a variable used in the definition of 
+a function to denote the actual argument passed when the function is called.
+\item\newline{\em \menuitemstyle{}}{\em arity}\space{}
+1. (function) the number of arguments. 2. (operator or operation) 
+corresponds to the arity of a function implementing the operator or operation.
+\item\newline{\em \menuitemstyle{}}{\em assignment}\space{}
+{\em (syntax)} an expression of the form \spad{x := e},{} meaning 
+"assign the value of \spad{e} to \spad{x"}. After \spadgloss{evaluation},{} 
+the \spadgloss{variable} \spad{x} \spadglossSee{points}{pointer} to an 
+object obtained by evaluating the expression \spad{e}. If \spad{x} has 
+a \spadgloss{type} as a result of a previous \spadgloss{declaration},{} 
+the object assigned to \spad{x} must have that type. An interpreter must 
+often \spadglossSee{coerce}{coercion} the value of \spad{e} to make that 
+happen. For example,{} in the interpreter,{} \center{\spad{x : Float := 11}} 
+first \spadglossSee{declares}{declaration} \spad{x} to be a float. This 
+declaration causes the interpreter to coerce 11 to 11.0 in order to assign 
+a floating point value to \spad{x}.
+\item\newline{\em \menuitemstyle{}}{\em attribute}\space{}
+a name or functional form denoting {\em any} useful computational property. 
+For example,{} \spadatt{commutative(\spad{"*"})} asserts that "\spadfun{*} 
+is commutative". Also,{} \spadatt{finiteAggregate} is used to assert that 
+an aggregate has a finite number of immediate components.
+\item\newline{\em \menuitemstyle{}}{\em basis}\space{}
+{\em (algebra)} \spad{S} is a basis of a module \spad{M} over a 
+\spadgloss{ring} if \spad{S} generates \spad{M},{} and \spad{S} is 
+linearly independent
+\item\newline{\em \menuitemstyle{}}{\em benefactor}\space{}
+(of a given domain) a domain or package that the given domain explicitly 
+references (for example,{} calls functions from) in its implementation
+\item\newline{\em \menuitemstyle{}}{\em binary}\space{}
+operation or function with \spadgloss{arity} 2
+\item\newline{\em \menuitemstyle{}}{\em binding}\space{}
+the association of a variable with properties such as \spadgloss{value} 
+and \spadgloss{type}. The top-level \spadgloss{environment} in the 
+interpreter consists of bindings for all user variables and functions. 
+Every \spadgloss{function} has an associated set of bindings,{} one for 
+each formal \spadgloss{argument} and \spadgloss{local variable}.
+\item\newline{\em \menuitemstyle{}}{\em block}\space{}
+{\em (syntax)} a control structure where expressions are sequentially 
+\spadglossSee{evaluated}{evaluation}.
+\item\newline{\em \menuitemstyle{}}{\em body}\space{}
+a \spadgloss{function body} or \spadgloss{loop body}.
+\item\newline{\em \menuitemstyle{}}{\em boolean}\space{}
+objects denoted by the \spadgloss{literals} \spad{true} and \spad{false}; 
+elements of domain \spadtype{Boolean}. See also \spadtype{Bits}.
+\item\newline{\em \menuitemstyle{}}{\em built-in function}\space{}
+a \spadgloss{function} in the standard Axiom library. Contrast 
+\spadgloss{user function}.
+\item\newline{\em \menuitemstyle{}}{\em cache}\space{}
+1. (noun) a mechanism for immediate retrieval of previously computed data. 
+For example,{} a function which does a lengthy computation might store its 
+values in a \spadgloss{hash table} using argument as a key. The hash table 
+then serves as a cache for the function (see also \spadsyscom{)set function 
+cache}). Also,{} when \spadgloss{recurrence relations} which depend upon 
+\spad{n} previous values are compiled,{} the previous \spad{n} values are 
+normally cached (use \spadsyscom{)set functions recurrence} to change this). 
+2. (verb) to save values in a cache.
+\item\newline{\em \menuitemstyle{}}{\em capsule}\space{}
+the part of the \spadglossSee{body}{function body} of a 
+\spadgloss{domain constructor} that defines the functions implemented by 
+the constructor.
+\item\newline{\em \menuitemstyle{}}{\em case}\space{}
+{\em (syntax)} an operator used to conditionally evaluate code based on 
+the branch of a \spadgloss{Union}. For example,{} if value \spad{u} is 
+\spad{Union(Integer,{}"failed")},{} the conditional expression \spad{if u 
+case Integer then A else B} evaluate \spad{A} if \spad{u} is an integer 
+and \spad{B} otherwise.
+\item\newline{\em \menuitemstyle{}}{\em Category}\space{}
+the distinguished object denoting the type of a category; the class of 
+all categories.
+\item\newline{\em \menuitemstyle{}}{\em category}\space{}
+{\em (basic concept)} second-order types which serve to define useful 
+"classification worlds" for domains,{} such as algebraic constructs 
+(\spadignore{e.g.} groups,{} rings,{} fields),{} and data structures 
+(\spadignore{e.g.} homogeneous aggregates,{} collections,{} dictionaries). 
+Examples of categories are \spadtype{Ring} ("the class of all rings") and 
+\spadtype{Aggregate} ("the class of all aggregates"). The categories of a 
+given world are arranged in a hierarchy (formally,{} a directed acyclic 
+graph). Each category inherits the properties of all its ancestors. Thus,{} 
+for example,{} the category of ordered rings (\spadtype{OrderedRing}) 
+inherits the properties of the category of rings (\spadtype{Ring}) and 
+those of the ordered sets (\spadtype{OrderedSet}). Categories provide a 
+database of algebraic knowledge and ensure mathematical correctness,{} 
+\spadignore{e.g.} that "matrices of polynomials" is correct but "polynomials 
+of hash tables" is not,{} that the multiply operation for "polynomials of 
+continued fractions" is commutative,{} but that for "matrices of power 
+series" is not. optionally provide "default definitions" for operations 
+they export. Categories are defined in Axiom by functions called 
+\spadgloss{category constructors}. Technically,{} a category designates 
+a class of domains with common \spadgloss{operations} and 
+\spadgloss{attributes} but usually with different \spadgloss{functions} 
+and \spadgloss{representations} for its constituent \spadgloss{objects}. 
+Categories are always defined using the Axiom library language 
+(see also \spadgloss{category extension}). See also file {\em catdef.spad} 
+for definitions of basic algebraic categories in Axiom.
+\item\newline{\em \menuitemstyle{}}{\em category constructor}\space{}
+a function that creates categories,{} described by an abstract datatype in 
+the Axiom programming language. For example,{} the category 
+constructor \spadtype{Module} is a function which takes a domain parameter 
+\spad{R} and creates the category "modules over \spad{R}".
+\item\newline{\em \menuitemstyle{}}{\em category extension}\space{}
+created by a category definition,{} an expression usually of the form 
+\spad{A == B with ...}. In English,{} this means "category A is a \spad{B} 
+with the new operations and attributes as given by ... . See,{} for 
+example,{} file {\em catdef.spad} for a definitions of the algebra 
+categories in Axiom,{} {\em aggcat.spad} for data structure categories.
+\item\newline{\em \menuitemstyle{}}{\em category hierarchy}\space{}
+hierarchy formed by category extensions. The root category is 
+\spadtype{Object}. A category can be defined as a \spadgloss{Join} of two 
+or more categories so as to have multiple \spadgloss{parents}. Categories 
+may also have parameterized so as to allow conditional inheritance.
+\item\newline{\em \menuitemstyle{}}{\em character}\space{}
+1. an element of a character set,{} as represented by a keyboard key. 2. 
+a component of a string. For example,{} the 0th element of the string 
+\spad{"hello there"} is the character {\em h}.
+\item\newline{\em \menuitemstyle{}}{\em client}\space{}
+(of a given domain) any domain or package that explicitly calls functions 
+from the given domain
+\item\newline{\em \menuitemstyle{}}{\em coercion}\space{}
+an automatic transformation of an object of one \spadgloss{type} to an 
+object of a similar or desired target type. In the interpreter,{} coercions 
+and \spadgloss{retractions} are done automatically by the interpreter when 
+a type mismatch occurs. Compare \spadgloss{conversion}.
+\item\newline{\em \menuitemstyle{}}{\em comment}\space{}
+textual remarks imbedded in code. Comments are preceded by a double dash 
+({\em --}). For Axiom library code,{} stylized comments for on-line 
+documentation are preceded by a two plus signs ({\em ++}).
+\item\newline{\em \menuitemstyle{}}{\em Common LISP}\space{}
+A version of \spadgloss{LISP} adopted as an informal standard by major 
+users and suppliers of LISP
+\item\newline{\em \menuitemstyle{}}{\em compile-time}\space{}
+the time when category or domain constructors are compiled. Contrast 
+\spadgloss{run-time}.
+\item\newline{\em \menuitemstyle{}}{\em compiler}\space{}
+a program that generates low-level code from a higher-level source 
+language. Axiom has three compilers. A {\em graphics compiler} 
+converts graphical formulas to a compiled subroutine so that points can 
+be rapidly produced for graphics commands. An {\em interpreter compiler} 
+optionally compiles \spadgloss{user functions} when first 
+\spadglossSee{invoked}{invocation} (use \spadsyscom{)set functions compile} 
+to turn this feature on). A {\em library compiler} compiles all constructors 
+(not available in Release 1)
+\item\newline{\em \menuitemstyle{}}{\em computational object}\space{}
+In Axiom,{} domains are objects. This term is used to distinquish 
+the objects which are members of domains rather than domains themselves.
+\item\newline{\em \menuitemstyle{}}{\em conditional}\space{}
+a \spadgloss{control structure} of the form \spad{if A then B else C}; 
+The \spadgloss{evaluation} of \spad{A} produces \spad{true} or \spad{false}. 
+If \spad{true},{} \spad{B} evaluates to produce a value; otherwise \spad{C} 
+evaluates to produce a value. When the value is not used,{} \spad{else C} 
+part can be omitted.
+\item\newline{\em \menuitemstyle{}}{\em constant}\space{}
+{\em (syntax)} a reserved word used in \spadgloss{signatures} in Axiom 
+programming language to signify that mark an operation always returns the 
+same value. For example,{} the signature \spad{0: constant -> \$} in the 
+source code of \spadtype{AbelianMonoid} tells the Axiom compiler that 
+\spad{0} is a constant so that suitable optimizations might be performed.
+\item\newline{\em \menuitemstyle{}}{\em constructor}\space{}
+a \spadgloss{function} which creates a \spadgloss{category},{} 
+\spadgloss{domain},{} or \spadgloss{package}.
+\item\newline{\em \menuitemstyle{}}{\em continuation}\space{}
+when a line of a program is so long that it must be broken into several 
+lines,{} then all but the first line are called {\em continuation lines}. 
+If such a line is given interactively,{} then each incomplete line must 
+end with an underscore.
+\item\newline{\em \menuitemstyle{}}{\em control structure}\space{}
+program structures which can specify a departure from normal sequential 
+execution. Axiom has four kinds of control structures: 
+\spadgloss{blocks},{} \spadgloss{case} statements,{} 
+\spadgloss{conditionals},{} and \spadgloss{loops}.
+\item\newline{\em \menuitemstyle{}}{\em conversion}\space{}
+the transformation of an object on one \spadgloss{type} to one of another 
+type. Conversions performed automatically are called \spadgloss{coercions}. 
+These happen when the interpreter has a type mismatch and a similar or 
+declared target type is needed. In general,{} the user must use the 
+infix operation \spadSyntax{\spad{::}} to cause this transformation.
+\item\newline{\em \menuitemstyle{}}{\em copying semantics}\space{}
+the programming language semantics used in Pascal but {\em not} in 
+Axiom. See also \spadgloss{pointer semantics} for details.
+\item\newline{\em \menuitemstyle{}}{\em data structure}\space{}
+a structure for storing data in the computer. Examples are 
+\spadgloss{lists} and \spadgloss{hash tables}.
+\item\newline{\em \menuitemstyle{}}{\em datatype}\space{}
+equivalent to \spadgloss{domain} in Axiom.
+\item\newline{\em \menuitemstyle{}}{\em declaration}\space{}
+{\em (syntax)} an expression of the form \spad{x : T} where \spad{T} is 
+some \spad{type}. A declaration forces all values 
+\spadglossSee{assigned}{assignment} to \spad{T} to be of that type. If a 
+value is of a different type,{} the interpreter will try to 
+\spadglossSee{coerce}{coercion} the value to type \spad{T}. Declarations 
+are necessary in case of ambiguity or when a user wants to introduce an 
+an \spadglossSee{unexposed}{expose} domain.
+\item\newline{\em \menuitemstyle{}}{\em default definition}\space{}
+a function defined by a \spadgloss{category}. Such definitions appear 
+category definitions of the form \spad{C: Category == T add I} in an 
+optional implmentation part \spad{I} to the right of the keyword \spad{add}.
+\item\newline{\em \menuitemstyle{}}{\em default package}\space{}
+a optional \spadgloss{package} of \spadgloss{functions} associated with 
+a category. Such functions are necessarily defined in terms over other 
+functions exported by the category.
+\item\newline{\em \menuitemstyle{}}{\em definition}\space{}
+{\em (syntax)} 1. An expression of the form \spad{f(a) == b} defining 
+function \spad{f} with \spadgloss{formal arguments} \spad{a} and 
+\spadgloss{body} \spad{b}; equivalent to the statement 
+\spad{f == (a) +-> b}. 2. An expression of the form \spad{a == b} 
+where \spad{a} is a \spadgloss{symbol},{} equivalent to \spad{a() == b}. 
+See also \spadgloss{macro} where a similar substitution is done at 
+\spadgloss{parse} time.
+\item\newline{\em \menuitemstyle{}}{\em delimiter}\space{}
+a \spadgloss{character} which marks the beginning or end of some 
+syntactically correct unit in the language,{} \spadignore{e.g.} 
+\spadSyntax{"} for strings,{} blanks for identifiers.
+\item\newline{\em \menuitemstyle{}}{\em destructive operation}\space{}
+An operation which changes a component or structure of a value. In 
+Axiom,{} all destructive operations have names which end with an 
+exclamation mark ({\em !}). For example,{} domain \spadtype{List} has 
+two operations to reverse the elements of a list,{} one named 
+\spadfunFrom{reverse}{List} which returns a copy of the original list with 
+the elements reversed,{} another named \spadfunFrom{reverse!}{List} which 
+reverses the elements {\em in place} thus destructively changing the 
+original list.
+\item\newline{\em \menuitemstyle{}}{\em documentation}\space{}
+1. on-line or hard copy descriptions of Axiom; 2. text in library 
+code preceded by {\em ++} comments as opposed to general comments 
+preceded by {\em --}.
+\item\newline{\em \menuitemstyle{}}{\em domain}\space{}
+{\em (basic concept)} a domain corresponds to the usual notion of 
+abstract datatypes: that of a set of values and a set of "exported 
+operations" for the creation and manipulation of these values. Datatypes 
+are parameterized,{} dynamically constructed,{} and can combine with others 
+in any meaningful way,{} \spadignore{e.g.} "lists of floats" 
+(\spadtype{List Float}),{} "fractions of polynomials with integer 
+coefficients" (\spadtype{Fraction Polynomial Integer}),{} "matrices 
+of infinite \spadgloss{streams} of cardinal numbers" 
+(\spadtype{Matrix Stream CardinalNumber}). The term {\em domain} is 
+actually abbreviates {\em domain of computation}. Technically,{} a 
+domain denotes a class of objects,{} a class of \spadgloss{operations} 
+for creating and other manipulating these objects,{} and a class of 
+\spadgloss{attributes} describing computationally useful properties. 
+Domains also provide \spadgloss{functions} for each operation often in 
+terms of some \spadgloss{representation} for the objects. A domain 
+itself is an \spadgloss{object} created by a \spadgloss{function} 
+called a \spadgloss{domain constructor}.
+\item\newline{\em \menuitemstyle{}}{\em domain constructor}\space{}
+a function that creates domains,{} described by an abstract datatype 
+in the Axiom programming language. Simple domains like 
+\spadtype{Integer} and \spadtype{Boolean} are created by domain 
+constructors with no arguments. Most domain constructors take one or 
+more parameters,{} one usually denoting an \spadgloss{underlying domain}. 
+For example,{} the domain \spadtype{Matrix(R)} denotes "matrices over 
+\spad{R"}. Domains {\em Mapping},{} {\em Record},{} and {\em Union} are 
+primitive domains. All other domains are written in the Axiom 
+programming language and can be modified by users with access to the 
+library source code.
+\item\newline{\em \menuitemstyle{}}{\em domain extension}\space{}
+a domain constructor \spad{A} is said to {\em extend} a domain 
+constructor \spad{B} if \spad{A}\spad{'s} definition has the form 
+\spad{A == B add ...}. This intuitively means "functions not defined 
+by \spad{A} are assumed to come from \spad{B}". Successive domain 
+extensions form \spadgloss{add-chains} affecting the the 
+\spadglossSee{search order}{lineage} for functions not implemented 
+directly by the domain during \spadgloss{dynamic lookup}.
+\item\newline{\em \menuitemstyle{}}{\em dot notation}\space{}
+using an infix dot ({\em .}) for function application. If \spad{u} is 
+the list \spad{[7,{}4,{}-11]} then both \spad{u(2)} and \spad{u.2} return 
+4. Dot notation nests to left. Thus \spad{f . g . h} is equivalent to 
+\spad{(f . g) . h}.
+\item\newline{\em \menuitemstyle{}}{\em dynamic}\space{}
+that which is done at \spadgloss{run-time} as opposed to 
+\spadgloss{compile-time}. For example,{} the interpreter will build the 
+domain "matrices over integers" dynamically in response to user input. 
+However,{} the compilation of all functions for matrices and integers is 
+done during \spadgloss{compile-time}. Constrast \spadgloss{static}.
+\item\newline{\em \menuitemstyle{}}{\em dynamic lookup}\space{}
+In Axiom,{} a \spadgloss{domain} may or may not explicitly provide 
+\spadgloss{function} definitions for all of its exported 
+\spadgloss{operations}. These definitions may instead come from domains 
+in the \spadgloss{add-chain} or from \spadgloss{default packages}. When 
+a \spadglossSee{function call}{application} is made for an operation in 
+the domain,{} up to five steps are carried out.\begin{items} \item (1) 
+If the domain itself implements a function for the operation,{} that 
+function is returned. \item (2) Each of the domains in the 
+\spadgloss{add-chain} are searched for one which implements the function; 
+if found,{} the function is returned. \item (3) Each of the 
+\spadgloss{default packages} for the domain are searched in order of 
+the \spadgloss{lineage}. If any of the default packages implements the 
+function,{} the first one found is returned. \item (4) Each of the 
+\spadgloss{default packages} for each of the domains in the 
+\spadgloss{add-chain} are searched in the order of their 
+\spadgloss{lineage}. If any of the default packages implements the 
+function,{} the first one found is returned. \item (5) If all of the 
+above steps fail,{} an error message is reported. \end{items}
+\item\newline{\em \menuitemstyle{}}{\em empty}\space{}
+the unique value of objects with type \spadtype{Void}.
+\item\newline{\em \menuitemstyle{}}{\em environment}\space{}
+a set of \spadgloss{bindings}.
+\item\newline{\em \menuitemstyle{}}{\em evaluation}\space{}
+a systematic process which transforms an \spadgloss{expression} into an 
+object called the \spadgloss{value} of the expression. Evaluation may 
+produce \spadgloss{side effects}.
+\item\newline{\em \menuitemstyle{}}{\em exit}\space{}
+{\em (reserved word)} an \spadgloss{operator} which forces an exit from 
+the current block. For example,{} the \spadgloss{block} \spad{(a := 1; 
+if i > 0 then exit a; a := 2)} will prematurely exit at the second 
+statement with value 1 if the value of \spad{i} is greater than 0. 
+See \spadgloss{\spad{=>}} for an alternate syntax.
+\item\newline{\em \menuitemstyle{}}{\em explicit export}\space{}
+1. (of a domain \spad{D}) any \spadgloss{attribute},{} 
+\spadgloss{operation},{} or \spadgloss{category} explicitly mentioned 
+in the \spadgloss{type} specification part \spad{T} for the domain 
+constructor definition \spad{D: T == I} 2. (of a category \spad{C}) 
+any \spadgloss{attribute},{} \spadgloss{operation},{} or 
+\spadgloss{category} explicitly mentioned in the \spadgloss{type} 
+specification part \spad{T} for the domain constructor definition 
+\spad{C: \spadgloss{Category} == T}
+\item\newline{\em \menuitemstyle{}}{\em export}\space{}
+\spadgloss{explicit export} or \spadgloss{implicit export} of a domain 
+or category
+\item\newline{\em \menuitemstyle{}}{\em expose}\space{}
+some constructors are {\em exposed},{} others {\em unexposed}. Exposed 
+domains and packages are recognized by the interpreter. Use \spadsys{)set 
+expose} to control change what is exposed. To see both exposed and 
+unexposed constructors,{} use \Browse{} with give the system command 
+\spadsyscom{)set hyperdoc browse exposure on}. Unexposed constructors 
+will now appear prefixed by star(\spad{*}).
+\item\newline{\em \menuitemstyle{}}{\em expression}\space{}
+1. any syntactically correct program fragment. 2. an element of domain 
+\spadtype{Expression}
+\item\newline{\em \menuitemstyle{}}{\em extend}\space{}
+see \spadgloss{category extension} or \spadgloss{domain extension}
+\item\newline{\em \menuitemstyle{}}{\em field}\space{}
+{\em (algebra)} a \spadgloss{domain} which is \spadgloss{ring} where 
+every non-zero element is invertible and where \spad{xy=yx}; a member 
+of category \spadtype{Field}. For a complete list of fields,{} click 
+on {\em Domains} under {\em Cross Reference} for \spadtype{Field}.
+\item\newline{\em \menuitemstyle{}}{\em file}\space{}
+a program or collection of data stored on disk,{} tape or other medium.
+\item\newline{\em \menuitemstyle{}}{\em float}\space{}
+a floating-point number with user-specified precision; an element of 
+domain \spadtype{Float}. Floats are \spadgloss{literals} which are written 
+two ways: without an exponent (\spadignore{e.g.} \spad{3.1416}),{} or with 
+an exponent (\spadignore{e.g.} \spad{3.12E-12}). Use function 
+\spadgloss{precision} to change the precision of the mantissage 
+(20 digits by default). See also \spadgloss{small float}.
+\item\newline{\em \menuitemstyle{}}{\em formal parameter}\space{}
+(of a function) an identifier \spadglossSee{bound}{binding} to the value 
+of an actual \spadgloss{argument} on \spadgloss{invocation}. In the 
+function definition \spad{f(x,{}y) == u},{} for example,{} \spad{x} 
+and \spad{y} are the formal parameter.
+\item\newline{\em \menuitemstyle{}}{\em frame}\space{}
+the basic unit of an interactive session; each frame has its own 
+\spadgloss{step number},{} \spadgloss{environment},{} and 
+\spadgloss{history}. In one interactive session,{} users can create 
+and drop frames,{} and have several active frames simultaneously.
+\item\newline{\em \menuitemstyle{}}{\em free}\space{}
+{\em (syntax)} A keyword used in user-defined functions to declare 
+that a variable is a \spadgloss{free variable} of that function. For 
+example,{} the statement \spad{free x} declares the variable \spad{x} 
+within the body of a function \spad{f} to be a free variable in \spad{f}. 
+Without such a declaration,{} any variable \spad{x} which appears on the 
+left hand side of an assignment is regarded as a \spadgloss{local variable} 
+of that function. If the intention of the assignment is to give an value 
+to a \spadgloss{global variable} \spad{x},{} the body of that function 
+must contain the statement \spad{free x}.
+\item\newline{\em \menuitemstyle{}}{\em free variable}\space{}
+(of a function) a variable which appears in a body of a function but is 
+not \spadglossSee{bound}{binding} by that function. See \spadgloss{local 
+variable} by default.
+\item\newline{\em \menuitemstyle{}}{\em function}\space{}
+implementation of \spadgloss{operation}; it takes zero or more 
+\spadgloss{argument} parameters and produces zero or more values. 
+Functions are objects which can be passed as parameters to functions 
+and can be returned as values of functions. Functions can also create 
+other functions (see also \spadtype{InputForm}). See also 
+\spadgloss{application} and \spadgloss{invocation}. The terms 
+{\em operation} and {\em function} are distinct notions in Axiom. 
+An operation is an abstraction of a function,{} described by declaring a 
+\spadgloss{signature}. A function is created by providing an implementation 
+of that operation by some piece of Axiom code. Consider the example 
+of defining a user-function \spad{fact} to compute the \spadfun{factorial} 
+of a nonnegative integer. The Axiom statement 
+\spad{fact: Integer -> Integer} describes the operation,{} whereas the 
+statement \spad{fact(n) = reduce(*,{}[1..n])} defines the functions. See 
+also \spadgloss{generic function}.
+\item\newline{\em \menuitemstyle{}}{\em function body}\space{}
+the part of a \spadgloss{function}\spad{'s} definition which is evaluated 
+when the function is called at \spadgloss{run-time}; the part of the 
+function definition to the right of the \spadSyntax{\spad{==}}.
+\item\newline{\em \menuitemstyle{}}{\em garbage collection}\space{}
+a system function that automatically recycles memory cells from the 
+\spadgloss{heap}. Axiom is built upon \spadgloss{Common LISP} 
+which provides this facility.
+\item\newline{\em \menuitemstyle{}}{\em garbage collector}\space{}
+a mechanism for reclaiming storage in the \spadgloss{heap}.
+\item\newline{\em \menuitemstyle{}}{\em Gaussian}\space{}
+a complex-valued expression,{} \spadignore{e.g.} one with both a real 
+and imaginary part; a member of a \spadtype{Complex} domain.
+\item\newline{\em \menuitemstyle{}}{\em generic function}\space{}
+the use of one function to operate on objects of different types; One 
+might regard Axiom as supporting generic \spadgloss{operations} 
+but not generic functions. One operation \spad{+: (D,{}D) -> D} exists 
+for adding elements in a ring; each ring however provides its own 
+type-specific function for implementing this operation.
+\item\newline{\em \menuitemstyle{}}{\em global variable}\space{}
+A variable which can be referenced freely by functions. In Axiom,{} 
+all top-level user-defined variables defined during an interactive user 
+session are global variables. Axiom does not allow {\em fluid 
+variables},{} that is,{} variables \spadglossSee{bound}{binding} by 
+functions which can be referenced by functions those functions call.
+\item\newline{\em \menuitemstyle{}}{\em Groebner basis}\space{}
+{\em (algebra)} a special basis for a polynomial ideal that allows a 
+simple test for membership. It is useful in solving systems of polynomial 
+equations.
+\item\newline{\em \menuitemstyle{}}{\em group}\space{}
+{\em (algebra)} a monoid where every element has a multiplicative inverse.
+\item\newline{\em \menuitemstyle{}}{\em hash table}\space{}
+A data structure that efficiency maps a given object to another. A hash 
+table consists of a set of {\em entries},{} each of which associates a 
+{\em key} with a {\em value}. Finding the object stored under a key can 
+be very fast even if there are a large number of entries since keys are 
+{\em hashed} into numerical codes for fast lookup.
+\item\newline{\em \menuitemstyle{}}{\em heap}\space{}
+an area of storage used by data in programs. For example,{} AXIOM will 
+use the heap to hold the partial results of symbolic computations. When 
+cancellations occur,{} these results remain in the heap until 
+\spadglossSee{garbage collected}{garbage collector}.
+\item\newline{\em \menuitemstyle{}}{\em history}\space{}
+a mechanism which records the results for an interactive computation. 
+Using the history facility,{} users can save computations,{} review 
+previous steps of a computation,{} and restore a previous interactive 
+session at some later time. For details,{} issue the system command 
+{\em )history ?} to the interpreter. See also \spadgloss{frame}.
+\item\newline{\em \menuitemstyle{}}{\em ideal}\space{}
+{\em (algebra)} a subset of a ring that is closed under addition and 
+multiplication by arbitrary ring elements,{} \spadignore{i.e.} 
+it\spad{'s} a module over the ring.
+\item\newline{\em \menuitemstyle{}}{\em identifier}\space{}
+{\em (syntax)} an Axiom name; a \spadgloss{literal} of type 
+\spadtype{Symbol}. An identifier begins with an alphabetical character or 
+\% and may be followed by alphabetic characters,{} digits,{} ? or !.
+Certain distinquished \spadgloss{reserved words} are not allowed as 
+identifiers but have special meaning in the Axiom.
+\item\newline{\em \menuitemstyle{}}{\em immutable}\space{}
+an object is immutable if it cannot be changed by an \spadgloss{operation}; 
+not a \spadglossSee{mutable object}{mutable}. Algebraic objects generally 
+immutable: changing an algebraic expression involves copying parts of the 
+original object. One exception is a matrix object of type \spadtype{Matrix}. 
+Examples of mutable objects are data structures such as those of type 
+\spadtype{List}. See also \spadgloss{pointer semantics}.
+\item\newline{\em \menuitemstyle{}}{\em implicit export}\space{}
+(of a domain or category) any \spadgloss{attribute} or 
+\spadgloss{operation} which is either an explicit export or else an 
+explicit export of some category which an explicit category export 
+\spadglossSee{extends}{category extension}.
+\item\newline{\em \menuitemstyle{}}{\em index}\space{}
+1. a variable that counts the number of times a \spadgloss{loop} is 
+repeated. 2. the "address" of an element in a data structure (see also 
+category \spadtype{LinearAggregate}).
+\item\newline{\em \menuitemstyle{}}{\em infix}\space{}
+{\em (syntax)} an \spadgloss{operator} placed between two 
+\spadgloss{operands}; also called a {\em binary operator},{} 
+\spadignore{e.g.} \spad{a + b}. An infix operator may also be used as a 
+\spadgloss{prefix},{} \spadignore{e.g.} \spad{+(a,{}b)} is also permissable 
+in the Axiom language. Infix operators have a relative 
+\spadgloss{precedence}.
+\item\newline{\em \menuitemstyle{}}{\em input area}\space{}
+a rectangular area on a \HyperName{} screen into which users can enter text.
+\item\newline{\em \menuitemstyle{}}{\em instantiate}\space{}
+to build a \spadgloss{category},{} \spadgloss{domain},{} or 
+\spadgloss{package} at run-time
+\item\newline{\em \menuitemstyle{}}{\em integer}\space{}
+a \spadgloss{literal} object of domain \spadtype{Integer},{} the class 
+of integers with an unbounded number of digits. Integer literals consist 
+of one or more consecutive digits (0-9) with no embedded blanks. 
+Underscores can be used to separate digits in long integers if desirable.
+\item\newline{\em \menuitemstyle{}}{\em interactive}\space{}
+a system where the user interacts with the computer step-by-step
+\item\newline{\em \menuitemstyle{}}{\em interpreter}\space{}
+the subsysystem of Axiom responsible for handling user input during 
+an interactive session. The following somewhat simplified description of 
+the typical action of the interpreter. The interpreter parsers the 
+user\spad{'s} input expression to create an expression tree then does a 
+bottom-up traversal of the tree. Each subtree encountered which is not a 
+value consists of a root node denoting an operation name and one or more 
+leaf nodes denoting \spadgloss{operands}. The interpreter resolves type 
+mismatches and uses type-inferencing and a library database to determine 
+appropriate types of the operands and the result,{} and an operation to 
+be performed. The interpreter then builds a domain to perform the 
+indicated operation,{} then invokes a function from the domain to compute 
+a value. The subtree is then replaced by that value and the process 
+continues. Once the entire tree has been processed,{} the value replacing 
+the top node of the tree is displayed back to the user as the value of the 
+expression.
+\item\newline{\em \menuitemstyle{}}{\em invocation}\space{}
+(of a function) the run-time process involved in 
+\spadglossSee{evaluating}{evaluation} a a \spadgloss{function} 
+\spadgloss{application}. This process has two steps. First,{} a 
+local \spadgloss{environment} is created where \spadgloss{formal arguments} 
+are locally \spadglossSee{bound}{binding} by \spadgloss{assignment} to 
+their respective actual \spadgloss{argument}. Second,{} the 
+\spadgloss{function body} is evaluated in that local environment. 
+The evaluation of a function is terminated either by completely 
+evaluating the function body or by the evaluation of a 
+\spadSyntax{return} expression.
+\item\newline{\em \menuitemstyle{}}{\em iteration}\space{}
+repeated evaluation of an expression or a sequence of expressions. 
+Iterations use the reserved words \spadSyntax{for},{} 
+\spadSyntax{while},{} and \spadSyntax{repeat}.
+\item\newline{\em \menuitemstyle{}}{\em Join}\space{}
+a primitive Axiom function taking two or more categories as 
+arguments and producing a category containing all of the operations 
+and attributes from the respective categories.
+\item\newline{\em \menuitemstyle{}}{\em KCL}\space{}
+Kyoto Common LISP,{} a version of \spadgloss{Common LISP} which 
+features compilation of the compilation of LISP into the \spad{C} 
+Programming Language
+\item\newline{\em \menuitemstyle{}}{\em library}\space{}
+In Axiom,{} a collection of compiled modules respresenting 
+the \spadgloss{category} or \spadgloss{domain} constructor.
+\item\newline{\em \menuitemstyle{}}{\em lineage}\space{}
+the sequence of \spadgloss{default packages} for a given domain to be 
+searched during \spadgloss{dynamic lookup}. This sequence is computed 
+first by ordering the category \spadgloss{ancestors} of the domain 
+according to their {\em level number},{} an integer equal to to the 
+minimum distance of the domain from the category. Parents have level 
+1,{} parents of parents have level 2,{} and so on. Among categories 
+with equal level numbers,{} ones which appear in the left-most branches 
+of {\em Join}\spad{s} in the source code come first. See also 
+\spadgloss{dynamic lookup}.
+\item\newline{\em \menuitemstyle{}}{\em LISP}\space{}
+acronymn for List Processing Language,{} a language designed for the 
+manipulation of nonnumerical data. The Axiom library is 
+translated into LISP then compiled into machine code by an underlying LISP.
+\item\newline{\em \menuitemstyle{}}{\em list}\space{}
+an object of a \spadtype{List} domain.
+\item\newline{\em \menuitemstyle{}}{\em literal}\space{}
+an object with a special syntax in the language. In Axiom,{} 
+there are five types of literals: \spadgloss{booleans},{} 
+\spadgloss{integers},{} \spadgloss{floats},{} \spadgloss{strings},{} 
+and \spadgloss{symbols}.
+\item\newline{\em \menuitemstyle{}}{\em local}\space{}
+{\em (syntax)} A keyword used in user-defined functions to declare that 
+a variable is a \spadgloss{local variable} of that function. Because of 
+default assumptions on variables,{} such a declaration is not necessary 
+but is available to the user for clarity when appropriate.
+\item\newline{\em \menuitemstyle{}}{\em local variable}\space{}
+(of a function) a variable \spadglossSee{bound}{binding} by that function 
+and such that its binding is invisible to any function that function calls. 
+Also called a {\em lexical} variable. By default in the 
+interpreter:\begin{items} \item 1. any variable \spad{x} which appears 
+on the left hand side of an assignment is regarded a local variable of 
+that function. If the intention of an assignment is to change the value 
+of a \spadgloss{global variable} \spad{x},{} the body of the function 
+must then contain the statement \spad{free x}. \item 2. any other variable 
+is regarded as a \spadgloss{free variable}. \end{items} An optional 
+declaration \spad{local x} is available to explicitly declare a variable 
+to be a local variable. All \spadgloss{formal parameters} to the function 
+can be regarded as local variables to the function.
+\item\newline{\em \menuitemstyle{}}{\em loop}\space{}
+1. an expression containing a \spadSyntax{repeat} 2. a collection expression 
+having a \spadSyntax{for} or a \spadSyntax{while},{} \spadignore{e.g.} 
+\spad{[f(i) for i in S]}.
+\item\newline{\em \menuitemstyle{}}{\em loop body}\space{}
+the part of a loop following the \spadSyntax{repeat} that tells what to 
+do each iteration. For example,{} the body of the loop \spad{for x in S 
+repeat B} is \spad{B}. For a collection expression,{} the body of the loop 
+precedes the initial \spadSyntax{for} or \spadSyntax{while}.
+\item\newline{\em \menuitemstyle{}}{\em macro}\space{}
+{\em (syntax)} 1. An expression of the form \spad{macro a == b} where 
+\spad{a} is a \spadgloss{symbol} causes \spad{a} to be textually replaced 
+by the expression \spad{b} at \spadgloss{parse} time. 2. An expression of 
+the form \spad{macro f(a) == b} defines a parameterized macro expansion for 
+a parameterized form \spad{f} This macro causes a form \spad{f}(\spad{x}) 
+to be textually replaced by the expression \spad{c} at parse time,{} where 
+\spad{c} is the expression obtained by replacing \spad{a} by \spad{x} 
+everywhere in \spad{b}. See also \spadgloss{definition} where a similar 
+substitution is done during \spadgloss{evaluation}.
+\item\newline{\em \menuitemstyle{}}{\em mode}\space{}
+a type expression containing a question-mark ({\em ?}). For example,{} 
+the mode {\em P ?} designates {\em the class of all polynomials over an 
+arbitrary ring}.
+\item\newline{\em \menuitemstyle{}}{\em mutable}\space{}
+objects which contain \spadgloss{pointers} to other objects and which 
+have operations defined on them which alter these pointers. Contrast 
+\spadgloss{immutable}. Axiom uses \spadgloss{pointer semantics} 
+as does \spadgloss{LISP} in contrast with many other languages such as 
+Pascal which use \spadgloss{copying semantics}. See \spadgloss{pointer 
+semantics} for details.
+\item\newline{\em \menuitemstyle{}}{\em name}\space{}
+1. a \spadgloss{symbol} denoting a \spadgloss{variable},{} 
+\spadignore{i.e.} the variable \spad{x}. 2. a \spadgloss{symbol} 
+denoting an \spadgloss{operation},{} \spadignore{i.e.} the operation 
+\spad{divide: (Integer,{}Integer) -> Integer}.
+\item\newline{\em \menuitemstyle{}}{\em nullary}\space{}
+a function with no arguments,{} \spadignore{e.g.} \spadfun{characteristic}.
+\item\newline{\em \menuitemstyle{}}{\em nullary}\space{}
+operation or function with \spadgloss{arity} 0
+\item\newline{\em \menuitemstyle{}}{\em Object}\space{}
+a category with no operations or attributes,{} from which most categories 
+in Axiom are \spadglossSee{extensions}{category extension}.
+\item\newline{\em \menuitemstyle{}}{\em object}\space{}
+a data entity created or manipulated by programs. Elements of domains,{} 
+functions,{} and domains themselves are objects. Whereas categories are 
+created by functions,{} they cannot be dynamically manipulated in the 
+current system and are thus not considered as objects. The most basic 
+objects are \spadgloss{literals}; all other objects must be created 
+\spadgloss{functions}. Objects can refer to other objects using 
+\spadgloss{pointers}. Axiom language uses 
+\spadgloss{pointer semantics} when dealing with \spadgloss{mutable} objects.
+\item\newline{\em \menuitemstyle{}}{\em object code}\space{}
+code which can be directly executed by hardware; also known as 
+{\em machine language}.
+\item\newline{\em \menuitemstyle{}}{\em operand}\space{}
+an argument of an \spadgloss{operator} (regarding an operator as a 
+\spadgloss{function}).
+\item\newline{\em \menuitemstyle{}}{\em operation}\space{}
+an abstraction of a \spadgloss{function},{} described by a 
+\spadgloss{signature}. For example,{} 
+\center{\spad{fact: NonNegativeInteger -> NonNegativeInteger}} describes 
+an operation for "the factorial of a (non-negative) integer".
+\item\newline{\em \menuitemstyle{}}{\em operator}\space{}
+special reserved words in the language such as \spadop{+} and \spadop{*}; 
+operators can be either \spadgloss{prefix} or \spadgloss{infix} and have a
+relative \spadgloss{precedence}.
+\item\newline{\em \menuitemstyle{}}{\em overloading}\space{}
+the use of the same name to denote distinct functions; a function is 
+identified by a \spadgloss{signature} identifying its name,{} the number 
+and types of its arguments,{} and its return types. If two functions can 
+have identical signatures,{} a \spadgloss{package call} must be made to 
+distinquish the two.
+\item\newline{\em \menuitemstyle{}}{\em package}\space{}
+a domain whose exported operations depend solely on the parameters and 
+other explicit domains,{} \spadignore{e.g.} a package for solving systems 
+of equations of polynomials over any field,{} \spadignore{e.g.} floats,{} 
+rational numbers,{} complex rational functions,{} or power series. 
+Facilities for integration,{} differential equations,{} solution of 
+linear or polynomial equations,{} and group theory are provided by 
+"packages". Technically,{} a package is a domain which has no 
+\spadgloss{signature} containing the symbol \$. While domains intuitively 
+provide computational objects you can compute with,{} packages intuitively 
+provide functions (\spadgloss{polymorphic} functions) which will work over 
+a variety of datatypes.
+\item\newline{\em \menuitemstyle{}}{\em package call}\space{}
+{\em (syntax)} an expression of the form \spad{e \$ D} where \spad{e} is 
+an \spadgloss{application} and \spad{D} denotes some \spadgloss{package} 
+(or \spadgloss{domain}).
+\item\newline{\em \menuitemstyle{}}{\em package call}\space{}
+{\em (syntax)} an expression of the form \spad{f(x,{}y)\$D} used to identify 
+that the function \spad{f} is to be one from \spad{D}.
+\item\newline{\em \menuitemstyle{}}{\em package constructor}\space{}
+same as \spadgloss{domain constructor}.
+\item\newline{\em \menuitemstyle{}}{\em parameter}\space{}
+see \spadgloss{argument}
+\item\newline{\em \menuitemstyle{}}{\em parameterized datatype}\space{}
+a domain that is built on another,{} for example,{} polynomials with integer 
+coefficients.
+\item\newline{\em \menuitemstyle{}}{\em parameterized form}\space{}
+a expression of the form \spad{f(x,{}y)},{} an \spadgloss{application} of a 
+function.
+\item\newline{\em \menuitemstyle{}}{\em parent}\space{}
+(of a domain) a category which is explicitly declared in the source code 
+definition for the domain to be an \spadgloss{export} of the domain.
+\item\newline{\em \menuitemstyle{}}{\em parse}\space{}
+1. (verb) to produce an internal representation of a user input string; 
+the resultant internal representation is then "interpreted" by Axiom 
+to perform some indicated action.
+\item\newline{\em \menuitemstyle{}}{\em parse}\space{}
+the transformation of a user input string representing a valid Axiom 
+expression into an internal representation as a tree-structure.
+\item\newline{\em \menuitemstyle{}}{\em partially ordered set}\space{}
+a set with a reflexive,{} transitive and antisymetric \spadgloss{binary} 
+operation.
+\item\newline{\em \menuitemstyle{}}{\em pattern match}\space{}
+1. (on expressions) Given a expression called a "subject" \spad{u},{} the 
+attempt to rewrite \spad{u} using a set of "rewrite rules". Each rule has 
+the form \spad{A == B} where \spad{A} indicates a expression called a 
+"pattern" and \spad{B} denotes a "replacement". The meaning of this rule 
+is "replace \spad{A} by \spad{B"}. If a given pattern \spad{A} matches a 
+subexpression of \spad{u},{} that subexpression is replaced by \spad{B}. 
+Once rewritten,{} pattern matching continues until no further changes occur. 
+2. (on strings) the attempt to match a string indicating a "pattern" to 
+another string called a "subject",{} for example,{} for the purpose of 
+identifying a list of names. In \Browse{},{} users may enter 
+\spadgloss{search strings} for the purpose of identifying constructors,{} 
+operations,{} and attributes.
+\item\newline{\em \menuitemstyle{}}{\em pile}\space{}
+alternate syntax for a block,{} using indentation and column alignment 
+(see also \spadgloss{block}).
+\item\newline{\em \menuitemstyle{}}{\em pointer}\space{}
+a reference implemented by a link directed from one object to another in 
+the computer memory. An object is said to {\em refer} to another if it 
+has a pointer to that other object. Objects can also refer to themselves 
+(cyclic references are legal). Also more than one object can refer to the 
+same object. See also \spadgloss{pointer semantics}.
+\item\newline{\em \menuitemstyle{}}{\em pointer semantics}\space{}
+the programming language semantics used in languages such as LISP which 
+allow objects to be \spadgloss{mutable}. Consider the following sequence 
+of Axiom statements:\begin{items} \item \spad{x : Vector Integer := 
+[1,{}4,{}7]} \item \spad{y := x} \item \spad{swap!(x,{}2,{}3)} \end{items} 
+The function \spadfunFrom{swap!}{Vector} is used to interchange the 2nd and 
+3rd value in the list \spad{x} producing the value \spad{[1,{}7,{}4]}. 
+What value does \spad{y} have after evaluation of the third statement? 
+The answer is different in Axiom than it is in a language with 
+\spadgloss{copying semantics}. In Axiom,{} first the vector 
+[1,{}2,{}3] is created and the variable \spad{x} set to 
+\spadglossSee{point}{pointer} to this object. Let\spad{'s} call this 
+object \spad{V}. Now \spad{V} refers to its \spadgloss{immutable} 
+components 1,{}2,{} and 3. Next,{} the variable \spad{y} is made to 
+point to \spad{V} just as \spad{x} does. Now the third statement 
+interchanges the last 2 elements of \spad{V} (the {\em !} at the end 
+of the name \spadfunFrom{swap!}{Vector} tells you that this operation 
+is destructive,{} that is,{} it changes the elements {\em in place}). 
+Both \spad{x} and \spad{y} perceive this change to \spad{V}. Thus both 
+\spad{x} and \spad{y} then have the value \spad{[1,{}7,{}4]}. In Pascal,{} 
+the second statement causes a copy of \spad{V} to be stored under \spad{y}. 
+Thus the change to \spad{V} made by the third statement does not affect 
+\spad{y}.
+\item\newline{\em \menuitemstyle{}}{\em polymorphic}\space{}
+a \spadgloss{function} parameterized by one or more \spadgloss{domains}; 
+a \spadgloss{algorithm} defined \spadglossSee{categorically}{category}. 
+Every function defined in a domain or package constructor with a 
+domain-valued parameter is polymorphic. For example,{} the same matrix 
+\spadSyntax{*} function is used to multiply "matrices over integers" as 
+"matrices over matrices over integers" Likewise,{} various 
+\ignore{\spad{???}} in \ignore{\spad{???}} solves polynomial equations 
+over any \spadgloss{field}.
+\item\newline{\em \menuitemstyle{}}{\em postfix}\space{}
+an \spadgloss{operator} that follows its single \spadgloss{operand}. 
+Postfix operators are not available in Axiom.
+\item\newline{\em \menuitemstyle{}}{\em precedence}\space{}
+{\em (syntax)} refers to the so-called {\em binding power} of an operator. 
+For example,{} \spad{*} has higher binding power than \spad{+} so that the 
+expression \spad{a + b * c} is equivalent to \spad{a + (b * c)}.
+\item\newline{\em \menuitemstyle{}}{\em precision}\space{}
+the number of digits in the specification of a number,{} \spadignore{e.g.} 
+as set by \spadfunFrom{precision}{Float}.
+\item\newline{\em \menuitemstyle{}}{\em predicate}\space{}
+1. a Boolean valued function,{} \spadignore{e.g.} 
+\spad{odd: Integer -> Boolean}. 2. an Boolean valued expression
+\item\newline{\em \menuitemstyle{}}{\em prefix}\space{}
+{\em (syntax)} an \spadgloss{operator} such as \spad{-} and \spad{not} 
+that is written {\em before} its single \spadgloss{operand}. Every 
+function of one argument can be used as a prefix operator. For example,{} 
+all of the following have equivalent meaning in Axiom: \spad{f(x)},{} 
+\spad{f x},{} and \spad{f.x}. See also \spadgloss{dot notation}.
+\item\newline{\em \menuitemstyle{}}{\em quote}\space{}
+the prefix \spadgloss{operator} \spadSyntax{'} meaning {\em do not evaluate}.
+\item\newline{\em \menuitemstyle{}}{\em Record}\space{}
+(basic domain constructor) a domain constructor used to create a 
+inhomogeneous aggregate composed of pairs of "selectors" and 
+\spadgloss{values}. A Record domain is written in the form 
+\spad{Record(a1:D1,{}...,{}an:Dn)} (\spad{n} > 0) where 
+\spad{a1},{}...,{}\spad{an} are identifiers called the 
+{\em selectors} of the record,{} and \spad{D1},{}...,{}\spad{Dn} 
+are domains indicating the type of the component stored under selector 
+\spad{an}.
+\item\newline{\em \menuitemstyle{}}{\em recurrence relation}\space{}
+A relation which can be expressed as a function \spad{f} with some 
+argument \spad{n} which depends on the value of \spad{f} at \spad{k} 
+previous values. In many cases,{} Axiom will rewrite a recurrence 
+relation on compilation so as to \spadgloss{cache} its previous \spad{k} 
+values and therefore make the computation significantly more efficient.
+\item\newline{\em \menuitemstyle{}}{\em recursion}\space{}
+use of a self-reference within the body of a function. Indirect recursion 
+is when a function uses a function below it in the call chain.
+\item\newline{\em \menuitemstyle{}}{\em recursive}\space{}
+1. A function that calls itself,{} either directly or indirectly through 
+another function. 2. self-referential. See also \spadgloss{recursive}.
+\item\newline{\em \menuitemstyle{}}{\em reference}\space{}
+see \spadgloss{pointer}
+\item\newline{\em \menuitemstyle{}}{\em Rep}\space{}
+a special identifier used as \spadgloss{local variable} of a domain 
+constructor body to denote the representation domain for objects of a domain.
+\item\newline{\em \menuitemstyle{}}{\em representation}\space{}
+a \spadgloss{domain} providing a data structure for elements of a 
+domain; generally denoted by the special identifier \spadgloss{Rep} 
+in the Axiom programming language. As domains are 
+\spadgloss{abstract datatypes},{} this representation is not available 
+to users of the domain,{} only to functions defined in the 
+\spadgloss{function body} for a domain constructor. Any domain can be used 
+as a representation.
+\item\newline{\em \menuitemstyle{}}{\em reserved word}\space{}
+a special sequence of non-blank characters with special meaning in the 
+Axiom language. Examples of reserved words are names such as 
+\spadSyntax{for},{} \spadSyntax{if},{} and \spadSyntax{free},{} operator 
+names such as \spadSyntax{+} and \spad{mod},{} special character strings 
+such as spadSyntax{\spad{==}} and spadSyntax{\spad{:=}}.
+\item\newline{\em \menuitemstyle{}}{\em retraction}\space{}
+to move an object in a parameterized domain back to the underlying 
+domain,{} for example to move the object \spad{7} from a "fraction of 
+integers" (domain \spadtype{Fraction Integer}) to "the integers" 
+(domain \spadtype{Integer}).
+\item\newline{\em \menuitemstyle{}}{\em return}\space{}
+when leaving a function,{} the value of the expression following 
+\spadSyntax{return} becomes the value of the function.
+\item\newline{\em \menuitemstyle{}}{\em ring}\space{}
+a set with a commutative addition,{} associative multiplication,{} 
+a unit element,{} and multiplication distributes over addition and 
+subtraction.
+\item\newline{\em \menuitemstyle{}}{\em rule}\space{}
+{\em (syntax)} 1. An expression of the form \spad{rule A == B} 
+indicating a "rewrite rule". 2. An expression of the form 
+\spad{rule (R1;...;Rn)} indicating a set of "rewrite rules" 
+\spad{R1},{}...,{}\spad{Rn}. See \spadgloss{pattern matching} for details.
+\item\newline{\em \menuitemstyle{}}{\em run-time}\space{}
+the time of doing a computation. Contrast \spadgloss{compile-time}.
+ rather than prior to it; \spadgloss{dynamic} as opposed to 
+\spadgloss{static}. For example,{} the decision of the intepreter 
+to build a structure such as "matrices with power series entries" 
+in response to user input is made at run-time.
+\item\newline{\em \menuitemstyle{}}{\em run-time check}\space{}
+an error-checking which can be done only when the program receives 
+user input; for example,{} confirming that a value is in the proper 
+range for a computation.
+\item\newline{\em \menuitemstyle{}}{\em search string}\space{}
+a string entered into an \spadgloss{input area} on a \HyperName{} screen
+\item\newline{\em \menuitemstyle{}}{\em selector}\space{}
+an identifier used to address a component value of a gloss{Record} datatype.
+\item\newline{\em \menuitemstyle{}}{\em semantics}\space{}
+the relationships between symbols and their meanings. The rules for 
+obtaining the {\em meaning} of any syntactically valid expression.
+\item\newline{\em \menuitemstyle{}}{\em semigroup}\space{}
+{\em (algebra)} a \spadgloss{monoid} which need not have an identity; 
+it is closed and associative.
+\item\newline{\em \menuitemstyle{}}{\em side effect}\space{}
+action which changes a component or structure of a value. See 
+\spadgloss{destructive operation} for details.
+\item\newline{\em \menuitemstyle{}}{\em signature}\space{}
+{\em (syntax)} an expression describing an \spadgloss{operation}. 
+A signature has the form as \spad{name : source -> target},{} where 
+\spad{source} gives the type of the arguments of the operation,{} and 
+\spad{target} gives the type of the result.
+\item\newline{\em \menuitemstyle{}}{\em small float}\space{}
+the domain for hardware floating point arithmetic as provided by the 
+computer hardware.
+\item\newline{\em \menuitemstyle{}}{\em small integer}\space{}
+the domain for hardware integer arithmetic. as provided by the computer 
+hardware.
+\item\newline{\em \menuitemstyle{}}{\em source}\space{}
+the \spadgloss{type} of the argument of a \spadgloss{function}; the type 
+expression before the \spad{->} in a \spadgloss{signature}. For example,{} 
+the source of \spad{f : (Integer,{}Integer) -> Integer} is 
+\spad{(Integer,{}Integer)}.
+\item\newline{\em \menuitemstyle{}}{\em sparse}\space{}
+data structure whose elements are mostly identical (a sparse matrix is 
+one filled with mostly zeroes).
+\item\newline{\em \menuitemstyle{}}{\em static}\space{}
+that computation done before run-time,{} such as compilation. Contrast 
+\spadgloss{dynamic}.
+\item\newline{\em \menuitemstyle{}}{\em step number}\space{}
+the number which precedes user input lines in an interactive session; 
+the output of user results is also labeled by this number.
+\item\newline{\em \menuitemstyle{}}{\em stream}\space{}
+an object of \spadtype{Stream(R)},{} a generalization of a 
+\spadgloss{list} to allow an infinite number of elements. Elements of 
+a stream are computed "on demand". Strings are used to implement various 
+forms of power series (\ignore{\spad{???}}).
+\item\newline{\em \menuitemstyle{}}{\em string}\space{}
+an object of domain \spadtype{String}. Strings are \spadgloss{literals} 
+consisting of an arbitrary sequence of \spadgloss{characters} surrounded 
+by double-quotes (\spadSyntax{"}),{} \spadignore{e.g.} \spad{"Look here!"}.
+\item\newline{\em \menuitemstyle{}}{\em subdomain}\space{}
+{\em (basic concept)} a \spadgloss{domain} together with a 
+\spadgloss{predicate} characterizing which members of the domain belong 
+to the subdomain. The exports of a subdomain are usually distinct from the 
+domain itself. A fundamental assumption however is that values in the 
+subdomain are automatically \spadglossSee{coerceable}{coercion} to values 
+in the domain. For example,{} if \spad{n} and \spad{m} are declared to be 
+members of a subdomain of the integers,{} then {\em any} \spadgloss{binary} 
+operation from \spadtype{Integer} is available on \spad{n} and \spad{m}. 
+On the other hand,{} if the result of that operation is to be assigned 
+to,{} say,{} \spad{k},{} also declared to be of that subdomain,{} a 
+\spadgloss{run-time} check is generally necessary to ensure that the 
+result belongs to the subdomain.
+\item\newline{\em \menuitemstyle{}}{\em such that clause}\space{}
+the use of \spadSyntax{|} followed by an expression to filter an iteration.
+\item\newline{\em \menuitemstyle{}}{\em suffix}\space{}
+{\em (syntax)} an \spadgloss{operator} which placed after its operand. 
+Suffix operators are not allowed in the Axiom language.
+\item\newline{\em \menuitemstyle{}}{\em symbol}\space{}
+objects denoted by \spadgloss{identifier} \spadgloss{literals}; an 
+element of domain \spadtype{Symbol}. The interpreter defaultly converts 
+a symbol \spad{x} into \spadtype{Variable(x)}.
+\item\newline{\em \menuitemstyle{}}{\em syntax}\space{}
+rules of grammar,{} punctuation etc. for forming correct expressions.
+\item\newline{\em \menuitemstyle{}}{\em system commands}\space{}
+top-level Axiom statements that begin with {\em )}. System 
+commands allow users to query the database,{} read files,{} trace 
+functions,{} and so on.
+\item\newline{\em \menuitemstyle{}}{\em tag}\space{}
+an identifier used to discriminate a branch of a \spadgloss{Union} type.
+\item\newline{\em \menuitemstyle{}}{\em target}\space{}
+the \spadgloss{type} of the result of a \spadgloss{function}; the 
+type expression following the \spad{->} in a \spadgloss{signature}.
+\item\newline{\em \menuitemstyle{}}{\em top-level}\space{}
+refers to direct user interactions with the Axiom interpreter.
+\item\newline{\em \menuitemstyle{}}{\em totally ordered set}\space{}
+{\em (algebra)} a partially ordered set where any two elements are 
+comparable.
+\item\newline{\em \menuitemstyle{}}{\em trace}\space{}
+use of system function \spadsys{)trace} to track the arguments passed 
+to a function and the values returned.
+\item\newline{\em \menuitemstyle{}}{\em tuple}\space{}
+an expression of two or more other expressions separated by commas,{} 
+\spadignore{e.g.} \spad{4,{}7,{}11}. Tuples are also used for multiple 
+arguments both for \spadgloss{applications} (\spadignore{e.g.} 
+\spad{f(x,{}y)}) and in \spadgloss{signatures} (\spadignore{e.g.} 
+\spad{(Integer,{}Integer) -> Integer}). A tuple is not a data structure,{} 
+rather a syntax mechanism for grouping expressions.
+\item\newline{\em \menuitemstyle{}}{\em type}\space{}
+The type of any \spadgloss{subdomain} is the unique symbol {\em Category}. 
+The type of a \spadgloss{domain} is any \spadgloss{category} that domain 
+belongs to. The type of any other object is either the (unique) domain 
+that object belongs to or any \spadgloss{subdomain} of that domain. The 
+type of objects is in general not unique.
+\item\newline{\em \menuitemstyle{}}{\em type checking}\space{}
+a system function which determines whether the datatype of an object is 
+appropriate for a given operation.
+\item\newline{\em \menuitemstyle{}}{\em type constructor}\space{}
+a \spadgloss{domain constructor} or \spadgloss{category constructor}.
+\item\newline{\em \menuitemstyle{}}{\em type inference}\space{}
+when the interpreter chooses the type for an object based on context. 
+For example,{} if the user interactively issues the definition 
+\center{\spad{f(x) == (x + \%i)**2}} then issues \spad{f(2)},{} 
+the interpreter will infer the type of \spad{f} to be 
+\spad{Integer -> Complex Integer}.
+\item\newline{\em \menuitemstyle{}}{\em unary}\space{}
+operation or function with \spadgloss{arity} 1
+\item\newline{\em \menuitemstyle{}}{\em underlying domain}\space{}
+for a \spadgloss{domain} that has a single domain-valued parameter,{} 
+the {\em underlying domain} refers to that parameter. For example,{} 
+the domain "matrices of integers" (\spadtype{Matrix Integer}) has 
+underlying domain \spadtype{Integer}.
+\item\newline{\em \menuitemstyle{}}{\em Union}\space{}
+(basic domain constructor) a domain constructor used to combine any 
+set of domains into a single domain. A Union domain is written in the 
+form \spad{Union(a1:D1,{}...,{}an:Dn)} (\spad{n} > 0) where 
+\spad{a1},{}...,{}\spad{an} are identifiers called the {\em tags} of 
+the union,{} and \spad{D1},{}...,{}\spad{Dn} are domains called the 
+{\em branches} of the union. The tags \spad{\spad{ai}} are optional,{} 
+but required when two of the \spad{\spad{Di}} are equal,{} 
+\spadignore{e.g.} \spad{Union(inches:Integer,{}centimeters:Integer)}. 
+In the interpreter,{} values of union domains are automatically coerced 
+to values in the branches and vice-versa as appropriate. See also 
+\spadgloss{case}.
+\item\newline{\em \menuitemstyle{}}{\em unit}\space{}
+{\em (algebra)} an invertible element.
+\item\newline{\em \menuitemstyle{}}{\em user function}\space{}
+a function defined by a user during an interactive session. Contrast 
+\spadgloss{built-in function}.
+\item\newline{\em \menuitemstyle{}}{\em user variable}\space{}
+a variable created by the user at top-level during an interactive session
+\item\newline{\em \menuitemstyle{}}{\em value}\space{}
+1. the result of \spadglossSee{evaluating}{evaluation} an expression. 
+2. a property associated with a \spadgloss{variable} in a \spadgloss{binding} 
+in an \spadgloss{environment}.
+\item\newline{\em \menuitemstyle{}}{\em variable}\space{}
+a means of referring to an object but itself {\spad{\bf} not} an object. A 
+variable has a name and an associated \spadgloss{binding} created by 
+\spadgloss{evaluation} of Axiom expressions such as 
+\spadgloss{declarations},{} \spadgloss{assignments},{} and 
+\spadgloss{definitions}. In the top-level \spadgloss{environment} of the 
+interpreter,{} variables are \spadgloss{global variables}. Such variables 
+can be freely referenced in user-defined functions although a 
+\spadgloss{free} declaration is needed to assign values to them. 
+See \spadgloss{local variable} for details.
+\item\newline{\em \menuitemstyle{}}{\em Void}\space{}
+the type given when the \spadgloss{value} and \spadgloss{type} of an 
+expression are not needed. Also used when there is no guarantee at 
+run-time that a value and predictable mode will result.
+\item\newline{\em \menuitemstyle{}}{\em wild card}\space{}
+a symbol which matches any substring including the empty string; for 
+example,{} the search string {\em *an*} matches an word containing the 
+consecutive letters {\em a} and {\em n}
+\item\newline{\em \menuitemstyle{}}{\em workspace}\space{}
+an interactive record of the user input and output held in an interactive 
+history file. Each user input and corresponding output expression in the 
+workspace has a corresponding \spadgloss{step number}. The current output 
+expression in the workspace is referred to as \spad{\%}. The output 
+expression associated with step number \spad{n} is referred to by 
+\spad{\%\%(n)}. The \spad{k}-th previous output expression relative 
+to the current step number \spad{n} is referred to by \spad{\%\%(- k)}. 
+Each interactive \spadgloss{frame} has its own workspace.
+\endmenu\endscroll\lispdownlink{Search}{(|htGloss| "\stringvalue{pattern}")} 
+for glossary entry matching \inputstring{pattern}{24}{*}\end{page}
+
+@
+\section{graphics.ht}
+\subsection{Graphics}
+\begin{itemize}
+\item GraphicsExamplePage \ref{GraphicsExamplePage} on 
+page~\pageref{GraphicsExamplePage}
+\item TwoDimensionalGraphicsPage \ref{TwoDimensionalGraphicsPage} on 
+page~\pageref{TwoDimensionalGraphicsPage}
+\item ThreeDimensionalGraphicsPage \ref{ThreeDimensionalGraphicsPage} on 
+page~\pageref{ThreeDimensionalGraphicsPage}
+\item ViewportPage \ref{ViewportPage} on page~\pageref{ViewportPage}
+\end{itemize}
+\label{GraphicsPage}
+\index{pages!GraphicsPage!graphics.ht}
+\index{graphics.ht!pages!GraphicsPage}
+\index{GraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{GraphicsPage}{Graphics}
+Axiom can plot curves and surfaces of
+various types, as well as lists of points in the plane.
+% sequences, and complex functions.
+\beginscroll
+\beginmenu
+\menulink{Examples}{GraphicsExamplePage} \tab{13}
+See examples of Axiom graphics
+\menulink{2D Graphics}{TwoDimensionalGraphicsPage} \tab{13}
+Graphics in the real and complex plane
+\menulink{3D Graphics}{ThreeDimensionalGraphicsPage} \tab{13}
+Plot surfaces, curves, or tubes around curves
+\menulink{Viewports}{ViewportPage} \tab{13}
+Customize graphics using Viewports
+\endmenu
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Graphics Examples}
+\label{GraphicsExamplePage}
+\begin{itemize}
+\item AssortedGraphicsExamplePage \ref{AssortedGraphicsExamplePage} on 
+page~\pageref{AssortedGraphicsExamplePage}
+\item ThreeDimensionalGraphicsExamplePage 
+\ref{ThreeDimensionalGraphicsExamplePage} on 
+page~\pageref{ThreeDimensionalGraphicsExamplePage}
+\item OneVariableGraphicsExamplePage 
+\ref{OneVariableGraphicsExamplePage} on 
+page~\pageref{OneVariableGraphicsExamplePage}
+\item PolarGraphicsExamplePage \ref{PolarGraphicsExamplePage} on 
+page~\pageref{PolarGraphicsExamplePage}
+\item ParametricCurveGraphicsExamplePage 
+\ref{ParametricCurveGraphicsExamplePage} on 
+page~\ref{ParametricCurveGraphicsExamplePage}
+\item ImplicitCurveGraphicsExamplePage \ref{ImplicitCurveGraphicsExamplePage} 
+on page~\pageref{ImplicitCurveGraphicsExamplePage}
+\item ListPointsGraphicsExamplePage \ref{ListPointsGraphicsExamplePage} 
+on page~\pageref{ListPointsGraphicsExamplePage}
+\end{itemize}
+\index{pages!GraphicsExamplePage!graphics.ht}
+\index{graphics.ht!pages!GraphicsExamplePage}
+\index{GraphicsExamplePage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{GraphicsExamplePage}{Graphics Examples}
+\beginscroll
+Here are some examples of Axiom graphics.
+Choose a specific type of graph or choose Assorted Examples.
+\beginmenu
+\menulink{Assorted Examples}{AssortedGraphicsExamplePage} \newline
+Examples of each type of Axiom graphics.
+\menulink{Three Dimensional Graphics}{ThreeDimensionalGraphicsExamplePage} \newline
+Plot parametrically defined surfaces of three functions.
+\menulink{Functions of One Variable}{OneVariableGraphicsExamplePage} \newline
+Plot curves defined by an equation y = f(x).
+\menulink{Parametric Curves}{ParametricCurveGraphicsExamplePage} \newline
+Plot curves defined by parametric equations x = f(t), y = g(t).
+\menulink{Polar Coordinates}{PolarGraphicsExamplePage} \newline
+Plot curves given in polar form by an equation r = f(theta).
+\menulink{Implicit Curves}{ImplicitCurveGraphicsExamplePage} \newline
+Plot non-singular curves defined by a polynomial equation
+\menulink{Lists of Points}{ListPointsGraphicsExamplePage} \newline
+Plot lists of points in the (x,y)-plane.
+% \menulink{Sequences}{SequenceGraphicsExamplePage}
+% Plot a sequence a1, a2, a3,...
+% \menulink{Complex Functions}{ComplexFunctionGraphicsExamplePage}
+% Plot complex functions of a complex variable by means of grid plots.
+\endmenu
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Assorted Graphics Examples}
+\label{AssortedGraphicsExamplePage}
+\index{pages!AssortedGraphicsExamplePage!graphics.ht}
+\index{graphics.ht!pages!AssortedGraphicsExamplePage}
+\index{AssortedGraphicsExamplePage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{AssortedGraphicsExamplePage}{Assorted Graphics Examples}
+\beginscroll
+Pick a specific example or choose 'All' to see all the examples.\newline
+Function of two variables: z = f(x,y).
+\graphpaste{draw(sin(x * y), x = -2.5..2.5, y = -2.5..2.5) \bound{example1}}
+Function of one variable: y = f(x).
+\graphpaste{draw(sin tan x - tan sin x,x = 0..6) \bound{example2} }
+Plane parametric curve: x = f(t), y = g(t).
+\graphpaste{draw(curve(sin(t)*sin(2*t), sin(3*t)*sin(4*t)), t = 0..2*\%pi) \bound{example3}}
+Space parametric curve: x = f(t), y = g(t), z = h(t).
+\graphpaste{draw(curve(sin(t)*sin(2*t), sin(3*t)*sin(4*t), sin(5*t)*sin(6*t)), t = 0..2*\%pi) \bound{example4}}
+Polar coordinates: r = f(theta).
+\graphpaste{draw(sin(17*t), t = 0..2*\%pi, coordinates == polar) \bound{example5}}
+Implicit curves: p(x,y) = 0.
+\graphpaste{draw(y**2 + y = x**3 - x, x, y,range == \[-2..2,-2..1\]) \bound{example6}}
+Run all examples.
+\spadpaste{All \free{example1 example2 example3 example4 example5 example6}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Three Dimensional Graphics}
+\label{ThreeDimensionalGraphicsExamplePage}
+\index{pages!ThreeDimensionalGraphicsExamplePage!graphics.ht}
+\index{graphics.ht!pages!ThreeDimensionalGraphicsExamplePage}
+\index{ThreeDimensionalGraphicsExamplePage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ThreeDimensionalGraphicsExamplePage}{Three Dimensional Graphics}
+Plots of parametric surfaces defined by functions f(u,v), g(u,v), and h(u,v).
+Choose a particular example or choose 'All' to see all the examples.
+\beginscroll
+Pear Surface.
+\graphpaste{draw(surface((1+exp(-100*u*u))*sin(\%pi*u)*sin(\%pi*v), (1+exp(-100*u*u))*sin(\%pi*u)*cos(\%pi*v), (1+exp(-100*u*u))*cos(\%pi*u)), u=0..1, v=0..2, title=="Pear") \bound{example1}}
+Trigonometric Screw.
+\graphpaste{draw(surface(x*cos(y),x*sin(y),y*cos(x)), x=-4..4, y=0..2*\%pi, var1Steps==40, var2Steps==40, title=="Trig Screw") \bound{example2}}
+Etruscan Venus. \newline
+(click on the draw button to execute this example)
+\spadpaste{a := 1.3 * cos(2*x) * cos(y) + sin(y) * cos(x)\bound{a}} 
+\newline
+\spadpaste{b := 1.3 * sin(2*x) * cos(y) - sin(y) * sin(x)\bound{b}} 
+\newline
+\spadpaste{c := 2.5 * cos(y) \bound{c}} 
+\newline
+\graphpaste{draw(surface(a,b,c), x=0..\%pi, y=-\%pi..\%pi, var1Steps==40, var2Steps==40, title=="Etruscan Venus") \free{a b c} \bound{example3}}
+Banchoff Klein Bottle. \newline
+(click on the draw button to execute this example)
+\spadpaste{f:=cos(x)*(cos(x/2)*(sqrt(2) + cos(y))+(sin(x/2)*sin(y)*cos(y)))\bound{f}} 
+\newline
+\spadpaste{g:=sin(x)*(cos(x/2)*(sqrt(2) + cos(y))+(sin(x/2)*sin(y)*cos(y)))\bound{g}} 
+\newline
+\spadpaste{h:=-sin(x/2)*(sqrt(2)+cos(y)) + cos(x/2)*sin(y)*cos(y) \bound{h}}
+\newline
+\graphpaste{draw(surface(f,g,h), x=0..4*\%pi, y=0..2*\%pi, var1Steps==50, var2Steps==50, title=="Banchoff Klein Bottle") \free{f g h} \bound{example4}}
+\newline
+\spadpaste{All \free{example1 example2 example3 example4}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Functions of One Variable}
+\label{OneVariableGraphicsExamplePage}
+\index{pages!OneVariableGraphicsExamplePage!graphics.ht}
+\index{graphics.ht!pages!OneVariableGraphicsExamplePage}
+\index{OneVariableGraphicsExamplePage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{OneVariableGraphicsExamplePage}{Functions of One Variable}
+\beginscroll
+Plots of functions y = f(x).
+Choose a particular example or choose 'All' to see all the examples.
+\graphpaste{draw(sin tan x - tan sin x, x = 0..6) \bound{example1}}
+\newline
+\graphpaste{draw(sin x + cos x, x = 0..2*\%pi) \bound{example2}}
+\newline
+\graphpaste{draw(sin(1/x), x = -1..1) \bound{example3}}
+\newline
+\graphpaste{draw(x * sin(1/x), x = -1..1) \bound{example4}}
+\newline
+\spadpaste{All \free{example1 example2 example3 example4}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Parametric Curves}
+\label{ParametricCurveGraphicsExamplePage}
+\index{pages!ParametricCurveGraphicsExamplePage!graphics.ht}
+\index{graphics.ht!pages!ParametricCurveGraphicsExamplePage}
+\index{ParametricCurveGraphicsExamplePage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ParametricCurveGraphicsExamplePage}{Parametric Curves}
+Plots of parametric curves x = f(t), y = g(t).
+Pick a particular example or choose 'All' to see all the examples.
+\beginscroll
+The Lemniscate of Bernoulli.
+\graphpaste{draw(curve(cos(t/(1+sin(t)**2)), sin(t)*cos(t)/(1+sin(t)**2)), t = -\%pi..\%pi) \bound{example1}}
+Lissajous curve.
+\graphpaste{draw(curve(9*sin(3*t/4), 8*sin(t)), t = -4*\%pi..4*\%pi) \bound{example2}}
+A gnarly closed curve.
+\graphpaste{draw(curve(sin(t)*sin(2*t)*sin(3*t), sin(4*t)*sin(5*t)*sin(6*t)),t = 0..2*\%pi)
+             \bound{example3}}
+Another closed curve.
+\graphpaste{draw(curve(cos(4*t)*cos(7*t), cos(4*t)*sin(7*t)), t = 0..2*\%pi) \bound{example4}}
+Run all examples on this page.
+\spadpaste{All \free{example1 example2 example3 example4}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Polar Coordinates}
+\label{PolarGraphicsExamplePage}
+\index{pages!PolarGraphicsExamplePage!graphics.ht}
+\index{graphics.ht!pages!PolarGraphicsExamplePage}
+\index{PolarGraphicsExamplePage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{PolarGraphicsExamplePage}{Polar Coordinates}
+Plots of curves given by an equation in polar coordinates, r = f(theta).
+Pick a particular example or choose 'All' to see all the examples.
+\beginscroll
+A Circle.
+\graphpaste{draw(1,t = 0..2*\%pi, coordinates == polar) \bound{example1} }
+A Spiral.
+\graphpaste{draw(t,t = 0..100, coordinates == polar) \bound{example2} }
+A Petal Curve.
+\graphpaste{draw(sin(4*t), t = 0..2*\%pi, coordinates == polar) \bound{example3} }
+A Limacon.
+\graphpaste{draw(2 + 3 * sin t, t = 0..2*\%pi, coordinates == polar) \bound{example4} }
+Run all examples on this page.
+\spadpaste{All \free{
+%example1
+example2 example3 example4}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Implicit Curves}
+\label{ImplicitCurveGraphicsExamplePage}
+\index{pages!ImplicitCurveGraphicsExamplePage!graphics.ht}
+\index{graphics.ht!pages!ImplicitCurveGraphicsExamplePage}
+\index{ImplicitCurveGraphicsExamplePage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ImplicitCurveGraphicsExamplePage}{Implicit Curves}
+Non-singular curves defined by a polynomial equation p(x,y) = 0
+in a rectangular region in the plane.
+Pick a particular example or choose 'All' to see all the examples.
+\beginscroll
+A Conic Section (Hyperbola).
+\graphpaste{draw(x * y = 1, x, y, range == \[-3..3, -3..3\]) \bound{example1} }
+An Elliptic Curve.
+\graphpaste{draw(y**2 + y = x**3 - x, x, y, range == \[-2..2, -2..1\]) \bound{example2} }
+Cartesian Ovals.
+\spadpaste{p := ((x**2 + y**2 + 1) - 8*x)**2 - (8*(x**2 + y**2 + 1) - 4*x - 1) \bound{p} }
+\graphpaste{draw(p = 0, x, y, range == \[-1..11, -7..7\], title == "Cartesian Ovals") \free{p} \bound{example3} }
+Cassinian Ovals: two loops.
+\spadpaste{q := (x**2 + y**2 + 7**2)**2 - (6**4 + 4*7**2*x**2) \bound{q} }
+\graphpaste{draw(q = 0, x, y, range == \[-10..10, -4..4\], title == "Cassinian oval with two loops") \free{q} \bound{example4} }
+Run all examples on this page.
+\spadpaste{All \free{example1 example2 example3 example4}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Lists of Points}
+\label{ListPointsGraphicsExamplePage}
+\index{pages!ListPointsGraphicsExamplePage!graphics.ht}
+\index{graphics.ht!pages!ListPointsGraphicsExamplePage}
+\index{ListPointsGraphicsExamplePage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ListPointsGraphicsExamplePage}{Lists of Points}
+Axiom has the ability to create lists of points in a two dimensional
+graphics viewport.  This is done by utilizing the \spadtype{GraphImage} and
+\spadtype{TwoDimensionalViewport} domain facilities.
+\beginscroll
+\indent{5}\newline
+{\em NOTE:  It is only necessary to click on the makeViewport2D command button to plot this curve example}.
+\indent{0}\newline
+\spadpaste{p1 := point [1::SF,1::SF]\$(Point SF) \bound{p1}} 
+\newline
+\spadpaste{p2 := point [0::SF,1::SF]\$(Point SF) \bound{p2}} 
+\newline
+\spadpaste{p3 := point [0::SF,0::SF]\$(Point SF) \bound{p3}} 
+\newline
+\spadpaste{p4 := point [1::SF,0::SF]\$(Point SF) \bound{p4}} 
+\newline
+\spadpaste{p5 := point [1::SF,.5::SF]\$(Point SF) \bound{p5}} 
+\newline
+\spadpaste{p6 := point [.5::SF,0::SF]\$(Point SF) \bound{p6}} 
+\newline
+\spadpaste{p7 := point [0::SF,0.5::SF]\$(Point SF) \bound{p7}} 
+\newline
+\spadpaste{p8 := point [.5::SF,1::SF]\$(Point SF) \bound{p8}} 
+\newline
+\spadpaste{p9 := point [.25::SF,.25::SF]\$(Point SF) \bound{p9}} 
+\newline
+\spadpaste{p10 := point [.25::SF,.75::SF]\$(Point SF) \bound{p10}} 
+\newline
+\spadpaste{p11 := point [.75::SF,.75::SF]\$(Point SF) \bound{p11}} 
+\newline
+\spadpaste{p12 := point [.75::SF,.25::SF]\$(Point SF) \bound{p12}} 
+\newline
+\spadpaste{llp := [[p1,p2],[p2,p3],[p3,p4],[p4,p1],[p5,p6],[p6,p7],[p7,p8],[p8,p5],[p9,p10],[p10,p11],[p11,p12],[p12,p9]] \bound{llp} \free{p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12}} 
+\newline
+\spadpaste{size1 := 6::PositiveInteger \bound{size1}} 
+\newline
+\spadpaste{size2 := 8::PositiveInteger \bound{size2}} 
+\newline
+\spadpaste{size3 := 10::PositiveInteger \bound{size3}} 
+\newline
+\spadpaste{lsize := [size1, size1, size1, size1, size2, size2, size2, size2, size3, size3, size3, size3] \bound{lsize} \free{size1 size2 size3}} 
+\newline
+\spadpaste{pc1 := pastel red() \bound{pc1}} 
+\newline
+\spadpaste{pc2 := dim green() \bound{pc2}} 
+\newline
+\spadpaste{pc3 := pastel yellow() \bound{pc3}} 
+\newline
+\spadpaste{lpc := [pc1, pc1, pc1, pc1, pc2, pc2, pc2, pc2, pc3, pc3, pc3, pc3] \bound{lpc} \free{pc1 pc2 pc3}} 
+\newline
+\spadpaste{lc := [pastel blue(), light yellow(), dim green(), bright red(), light green(), dim yellow(), bright blue(), dark red(), pastel red(), light blue(), dim green(), light yellow()] \bound{lc}} 
+\newline
+\spadpaste{g := makeGraphImage(llp,lpc,lc,lsize)\$GRIMAGE \bound{g} \free{llp lpc lc lsize}} 
+\newline
+\graphpaste{makeViewport2D(g,[title("Lines")])\$VIEW2D \free{g}}
+The \spadfun{makeViewport2D} command takes a list of options as a parameter
+in this example.  The string "Lines" is designated as the viewport's title.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Three Dimensional Graphing}
+\label{ThreeDimensionalGraphicsPage}
+\begin{itemize}
+\item TwoVariableGraphicsPage \ref{TwoVariableGraphicsPage} on 
+page~\pageref{TwoVariableGraphicsPage}
+\item SpaceCurveGraphicsPage \ref{SpaceCurveGraphicsPage} on 
+page~\pageref{SpaceCurveGraphicsPage}
+\item ParametricTubeGraphicsPage \ref{ParametricTubeGraphicsPage} on 
+page~\pageref{ParametricTubeGraphicsPage}
+\item ParametricSurfaceGraphicsPage \ref{ParametricSurfaceGraphicsPage} on 
+page~\pageref{ParametricSurfaceGraphicsPage}
+\item ugGraphThreeDBuildPage \ref{ugGraphThreeDBuildPage} on 
+page~\pageref{ugGraphThreeDBuildPage}
+\end{itemize}
+\index{pages!ThreeDimensionalGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!ThreeDimensionalGraphicsPage}
+\index{ThreeDimensionalGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ThreeDimensionalGraphicsPage}{Three Dimensional Graphing}
+\beginscroll
+\beginmenu
+\menulink{Functions of Two Variables}{TwoVariableGraphicsPage} \newline
+Plot surfaces defined by an equation z = f(x,y).
+\menulink{Parametric Curves}{SpaceCurveGraphicsPage} \newline
+Plot curves defined by equations x = f(t), y = g(t), z = g(t).
+\menulink{Parametric Tube Plots}{ParametricTubeGraphicsPage} \newline
+Plot a tube around a parametric space curve.
+\menulink{Parametric Surfaces}{ParametricSurfaceGraphicsPage} \newline
+Plot surfaces defined by x = f(u,v), y = g(u,v), z = h(u,v).
+\menulink{Building Objects}{ugGraphThreeDBuildPage} \newline
+Create objects constructed from geometric primitives.
+\endmenu
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Functions of Two Variables}
+\label{TwoVariableGraphicsPage}
+\index{pages!TwoVariableGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!TwoVariableGraphicsPage}
+\index{TwoVariableGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{TwoVariableGraphicsPage}{Functions of Two Variables}
+\beginscroll
+This page describes the plotting of surfaces defined by an equation
+of two variables, z = f(x,y), for which the ranges of x and y are explicitly
+defined.  The basic draw command for this function utilizes either the
+uncompiled function or compiled function format.  The general format for an
+uncompiled function is:
+\indent{5}\newline
+{\em draw(f(x,y), x = a..b, y = c..d)}
+\indent{0}\newline
+where a..b and c..d are segments defining the intervals [a,b] and [c,d] over
+which the variables x and y span.  In this case the function is not compiled
+until the draw command is executed.  Here is an example:
+\graphpaste{draw(cos(x*y),x=-3..3,y=-3..3)}
+In the case of a compiled function, the function is named and compiled
+independently.  This is useful if you intend to use a function often, or
+if the function is long and complex.  The following line shows a function
+whose parameters are of the type Small Float. The function is compiled and
+stored by Axiom when it is entered.
+\indent{5}\newline
+{\em NOTE:  It is only necessary to click on the draw command button to plot
+this example}.
+\indent{0}\newline
+\spadpaste{f(x:SF,y:SF):SF == sin(x)*cos(y) \bound{f}}
+\newline
+Once the function is compiled the draw command only needs the name of the
+function to execute.  Here is a compiled function example:
+\graphpaste{draw(f,-\%pi..\%pi,-\%pi..\%pi) \free{f}}
+Note that the parameter ranges do not take the variable names as in the
+case of uncompiled functions.  The variables are entered in the order in
+which they are defined in the function specification.  In this case the
+first range specifies the x-variable and the second range specifies the
+y-variable.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Parametric Space Curves}
+\label{SpaceCurveGraphicsPage}
+\index{pages!SpaceCurveGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!SpaceCurveGraphicsPage}
+\index{SpaceCurveGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{SpaceCurveGraphicsPage}{Parametric Space Curves}
+\beginscroll
+This page describes the plotting in three dimensional space of a curve
+defined by the parametric equations x = f(t), y = g(t), z = h(t), where
+f, g, and h are functions of the parameter t which ranges over a specified
+interval.  The basic draw command for this function utilizes either the
+uncompiled functions or compiled functions format and uses the \spadfun{curve}
+command to specify the three functions for the x, y, and z components of
+the curve.  The general format for uncompiled functions is:
+\indent{5}\newline
+{\em draw(curve(f(t),g(t),h(t)), t = a..b)}
+\indent{0}\newline
+where a..b is the segment defining the interval [a,b] over which the
+parameter t ranges.  In this case the functions are not compiled until the
+draw command is executed.  Here is an example:
+\graphpaste{draw(curve(cos(t),sin(t),t), t=-12..12)}
+In the case of compiled functions, the functions are named and compiled
+independently.  This is useful if you intend to use the functions often, or
+if the functions are long and complex.  The following lines show functions
+whose parameters are of the type Small Float. The functions are compiled and
+stored by Axiom when entered.
+\indent{5}\newline
+{\em NOTE:  It is only necessary to click on the draw command button to plot
+this example}.
+\indent{0}\newline
+\spadpaste{i1(t:SF):SF == sin(t)*cos(3*t/5) \bound{i1}}
+\spadpaste{i2(t:SF):SF == cos(t)*cos(3*t/5) \bound{i2}}
+\spadpaste{i3(t:SF):SF == cos(t)*sin(3*t/5) \bound{i3}}
+Once the functions are compiled the draw command only needs the names of
+the functions to execute.  Here is a compiled functions example:
+\graphpaste{draw(curve(i1,i2,i3),0..15*\%pi) \free{i1 i2 i3}}
+Note that the parameter range does not take the variable name as in the
+case of uncompiled functions. It is understood that the indicated range
+applies to the parameter of the functions, which in this case is t.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Parametric Tube Plots}
+\label{ParametricTubeGraphicsPage}
+\index{pages!ParametricTubeGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!ParametricTubeGraphicsPage}
+\index{ParametricTubeGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ParametricTubeGraphicsPage}{Parametric Tube Plots}
+\beginscroll
+This page describes the plotting in three dimensional space of a tube
+around a parametric space curve defined by the parametric equations
+x = f(t), y = g(t), z = h(t), where f, g, and h are functions of the
+parameter t which ranges over a specified interval.  The basic draw command
+for this function utilizes either the uncompiled functions or compiled
+functions format and uses the \spadfun{curve} command to specify the three
+functions for the x, y, and z components of the curve.  This uses the same
+format as that for space curves except that it requires a specification for
+the radius of the tube.  If the radius of the tube is 0, then the result is
+the space curve itself.  The general format for uncompiled functions is:
+\indent{5}\newline
+{\em draw(curve(f(t),g(t),h(t)), t = a..b, tubeRadius == r)}
+\indent{0}\newline
+where a..b is the segment defining the interval [a,b] over which the
+parameter t ranges, and the tubeRadius is indicated by the variable r.
+In this case the functions are not compiled until the draw command is
+executed.  Here is an example:
+\graphpaste{draw(curve(sin(t)*cos(3*t/5), cos(t)*cos(3*t/5), cos(t)*sin(3*t/5)), t=0..15*\%pi,tubeRadius == .15)}
+In the case of compiled functions, the functions are named and compiled
+independently.  This is useful if you intend to use the functions often, or
+if the functions are long and complex.  The following lines show functions
+whose parameters are of the type Small Float. The functions are compiled and
+stored by Axiom when entered.
+\indent{5}\newline
+{\em NOTE:  It is only necessary to click on the draw command button to plot
+this example}.
+\indent{0}\newline
+\spadpaste{t1(t:SF):SF == 4/(2-sin(3*t))*cos(2*t) \bound{t1}} 
+\newline
+\spadpaste{t2(t:SF):SF == 4/(2-sin(3*t))*sin(2*t) \bound{t2}} 
+\newline
+\spadpaste{t3(t:SF):SF == 4/(2-sin(3*t))*cos(3*t) \bound{t3}} 
+\newline
+Once the function is compiled the draw command only needs the names of the
+functions to execute.  Here is a compiled functions example of a trefoil knot:
+\graphpaste{draw(curve(t1,t2,t3),0..2*\%pi,tubeRadius == .2) \free{t1 t2 t3}}
+Note that the parameter range does not take the variable name as in the
+case of uncompiled functions. It is understood that the indicated range
+applies to the parameter of the functions, which in this case is t.
+Typically, the radius of the tube should be set between 0 and 1.  A radius
+of less than 0 results in it's positive counterpart and a radius of greater
+than one causes self intersection.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Parametric Surfaces}
+\label{ParametricSurfaceGraphicsPage}
+\index{pages!ParametricSurfaceGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!ParametricSurfaceGraphicsPage}
+\index{ParametricSurfaceGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ParametricSurfaceGraphicsPage}{Parametric Surfaces}
+\beginscroll
+Graphing a surface defined by x = f(u,v), y = g(u,v), z = h(u,v). \newline
+This page describes the plotting of surfaces defined by the parametric
+equations of two variables, x = f(u,v), y = g(u,v), and z = h(u,v),
+for which the ranges of u and v are explicitly defined.  The basic draw
+command for this function utilizes either the uncompiled function or
+compiled function format and uses the \spadfun{surface} command to specify the
+three functions for the x, y and z components of the surface.  The general
+format for uncompiled functions is:
+\indent{5}\newline
+{\em draw(surface(f(u,v),g(u,v),h(u,v)), u = a..b, v = c..d)}
+\indent{0}\newline
+where a..b and c..d are segments defining the intervals [a,b] and [c,d] over
+which the parameters u and v span.  In this case the functions are not
+compiled until the draw command is executed.  Here is an example of a
+surface plotted using the parabolic cylindrical coordinate system option:
+\graphpaste{draw(surface(u*cos(v), u*sin(v),v*cos(u)),u=-4..4,v=0..2*\%pi,
+                  coordinates== parabolicCylindrical)}
+In the case of compiled functions, the functions are named and compiled
+independently.  This is useful if you intend to use the functions often, or
+if the functions are long and complex.  The following lines show functions
+whose parameters are of the type Small Float. The functions are compiled and
+stored by Axiom when entered.
+\indent{5}\newline
+{\em NOTE:  It is only necessary to click on the draw command button to plot
+this example}.
+\indent{0}\newline
+\spadpaste{n1(u:SF,v:SF):SF == u*cos(v) \bound{n1}} 
+\newline
+\spadpaste{n2(u:SF,v:SF):SF == u*sin(v) \bound{n2}} 
+\newline
+\spadpaste{n3(u:SF,v:SF):SF == u \bound{n3}}
+Once the function is compiled the draw command only needs the names of the
+functions to execute.  Here is a compiled functions example plotted using
+the toroidal coordinate system option: \newline
+\graphpaste{draw(surface(n1,n2,n3), 1.0..4.0, 1.0..4*\%pi,
+             coordinates == toroidal(1\$SF)) \free{n1 n2 n3}}
+Note that the parameter ranges do not take the variable names as in the
+case of uncompiled functions.  The variables are entered in the order in
+which they are defined in the function specification.  In this case the
+first range specifies the u-variable and the second range specifies the
+v-variable.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Building 3D Objects}
+\label{3DObjectGraphicsPage}
+\index{pages!3DObjectGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!3DObjectGraphicsPage}
+\index{3DObjectGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{3DObjectGraphicsPage}{Building 3D Objects}
+\beginscroll
+This page describes the Axiom facilities for creating three dimensional
+objects constructed from geometric primitives.  The Axiom operation
+\spadfun{create3Space()} creates a space to which points, curves, and
+polygons can be added using the operations from the \spadtype{ThreeSpace}
+domain.  The contents of this space can then be displayed in a viewport
+using the \spadfun{makeViewport3D()} command.  It will be necessary to
+have these operations exposed in order to use them. \indent{5}\newline
+{\em NOTE:  It is only necessary to click on the makeViewport3D command button
+to plot this curve example}.
+\indent{0}\newline
+Initially, the space which will hold the objects must be defined and
+compiled, as in the following example:
+\spadpaste{space := create3Space()\$(ThreeSpace SF) \bound{space}}
+Now objects can be sent to this {\em space} as per the operations allowed by
+the \spadtype{ThreeSpace} domain.  The following examples place curves into
+{\em space}.
+\spadpaste{curve(space,[[0,20,20],[0,20,30],[0,30,30],[0,30,100], [0,20,100],[0,20,110],[0,50,110],[0,50,100],[0,40,100], [0,40,30],[0,50,30],[0,50,20],[0,20,20]]) \bound{curveI}} 
+\newline
+\spadpaste{curve(space,[[0,80,20],[0,70,20],[0,70,110],[0,110,110], [0,120,100],[0,120,70],[0,115,65],[0,120,60],[0,120,30], [0,110,20],[0,80,20],[0,80,30],[0,105,30],[0,110,35]]) \bound{curveB1}} 
+\newline
+\spadpaste{curve(space,[[0,110,35],[0,110,55],[0,105,60],[0,80,60],[0,80,70], [0,105,70],[0,110,75],[0,110,95],[0,105,100],[0,80,100], [0,80,30]]) \bound{curveB2}} 
+\newline
+\spadpaste{closedCurve(space,[[0,140,20],[0,140,110],[0,150,110],[0,170,50], [0,190,110],[0,200,110],[0,200,20],[0,190,20],[0,190,75], [0,175,35],[0,165,35],[0,150,75],[0,150,20]]) \bound{curveM}}
+\spadpaste{closedCurve(space,[[200,0,20], [200,0,110], [185,0,110], [160,0,45], [160,0,110], [150,0,110], [150,0,20], [165,0,20], [190,0,85], [190,0,20]]) \bound{curveN}}
+\spadpaste{closedCurve(space,[[140,0,20], [120,0,110], [110,0,110], [90,0,20], [100,0,20], [108,0,50], [123,0,50], [121,0,60], [110,0,60], [115,0,90], [130,0,20]]) \bound{curveA}}
+\spadpaste{closedCurve(space,[[80,0,30], [80,0,100], [70,0,110], [40,0,110], [30,0,100], [30,0,90], [40,0,90], [40,0,95], [45,0,100], [65,0,100], [70,0,95], [70,0,35], [65,0,30], [45,0,30], [40,0,35], [40,0,60], [50,0,60], [50,0,70], [30,0,70], [30,0,30], [40,0,20], [70,0,20]]) \bound{curveG}}
+Once {\em space} contains the desired elements a viewport is created and
+displayed with the following command:
+\graphpaste{makeViewport3D(space,[title("Curves")])\$VIEW3D \free{space curveI curveB1 curveB2 curveM curveN curveA curveG}}
+The parameters for \spadfun{makeViewport3D()} in this example are {\em space},
+which is the name of the three dimensional space that was defined, and a
+string, "curve", which is the title for the viewport.  The tailing string
+{\em \$VIEW3D} exposes the command \spadfun{makeViewport3D()} from the domain
+\spadtype{ThreeDimensionalViewport} if these commands are unexposed.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Two Dimensional Graphics}
+\label{TwoDimensionalGraphicsPage}
+\begin{itemize}
+\item OneVariableGraphicsPage \ref{OneVariableGraphicsPage} on 
+page~\pageref{OneVariableGraphicsPage}
+\item ParametricCurveGraphicsPage \ref{ParametricCurveGraphicsPage} on 
+page~\pageref{ParametricCurveGraphicsPage}
+\item PolarGraphicsPage \ref{PolarGraphicsPage} on 
+page~\pageref{PolarGraphicsPage}
+\item ImplicitCurveGraphicsPage \ref{ImplicitCurveGraphicsPage} on 
+page~\pageref{ImplicitCurveGraphicsPage}
+\item ListPoinstsGraphicsPage \ref{ListPoinstsGraphicsPage} on 
+page~\pageref{ListPoinstsGraphicsPage}
+\end{itemize}
+\index{pages!TwoDimensionalGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!TwoDimensionalGraphicsPage}
+\index{TwoDimensionalGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{TwoDimensionalGraphicsPage}{Two Dimensional Graphics}
+\beginscroll
+\beginmenu
+\menulink{Functions of One Variable}{OneVariableGraphicsPage} \newline
+Plot curves defined by an equation y = f(x).
+\menulink{Parametric Curves}{ParametricCurveGraphicsPage} \newline
+Plot curves defined by parametric equations x = f(t), y = g(t).
+\menulink{Polar Coordinates}{PolarGraphicsPage} \newline
+Plot curves given in polar form by an equation r = f(theta).
+\menulink{Implicit Curves}{ImplicitCurveGraphicsPage} \newline
+Plot non-singular curves defined by a polynomial equation
+\menulink{Lists of Points}{ListPointsGraphicsPage} \newline
+Plot lists of points in the (x,y)-plane.
+% \menulink{Sequences}{SeqGraphicsPage} \newline
+% Plot a sequence a1, a2, a3,...
+% \menulink{Complex Functions}{CxFuncGraphicsPage} \newline
+% Plot functions of a complex variable using grid plots.
+\endmenu
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Functions of One Variable}
+\label{OneVariableGraphicsPage}
+\index{pages!OneVariableGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!OneVariableGraphicsPage}
+\index{OneVariableGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{OneVariableGraphicsPage}{Functions of One Variable}
+\beginscroll
+Here we wish to plot a function y = f(x) on an interval [a,b].
+As an example, let's take the function y = sin(tan(x)) - tan(sin(x))
+on the interval [0,6].
+Here is the simplest command that will do this:
+\graphpaste{draw(sin(tan(x)) - tan(sin(x)),x = 0..6)}
+Notice that Axiom compiled a function before the graph was put
+on the screen.
+The expression sin(tan(x)) - tan(sin(x)) was converted to a compiled
+function so that it's value for various values of x could be computed
+quickly and efficiently.
+Let's graph the same function on a different interval and this time
+we'll give the graph a title.
+The title is a String, which is an optional argument of the command 'draw'.
+\graphpaste{draw(sin(tan(x)) - tan(sin(x)),x = 10..16,title == "y = sin tan x - tan sin x")}
+Once again the expression sin(tan(x)) - tan(sin(x)) was converted to a
+compiled function before any points were computed.
+If you want to graph the same function on a number of intervals, it's
+a good idea to write down a function definition so that the function
+only has to be compiled once.
+Here's an example:
+\spadpaste{f(x) == (x-1)*(x-2)*(x-3) \bound{f}}
+\newline
+\graphpaste{draw(f, 0..2, title == "y = f(x) on \[0,2\]") \free{f}}
+\newline
+\graphpaste{draw(f, 0..4,title == "y = f(x) on \[0,4\]") \free{f}}
+Notice that our titles can be whatever we want, as long as they are
+enclosed by double quotes.  However, a title which is too long to fit
+within the viewport title window will be clipped.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Parametric Curves}
+\label{ParametricCurveGraphicsPage}
+\index{pages!ParametricCurveGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!ParametricCurveGraphicsPage}
+\index{ParametricCurveGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ParametricCurveGraphicsPage}{Parametric Curves}
+\beginscroll
+One way of producing interesting curves is by using parametric equations.
+Let x = f(t) and y = g(t) for two functions f and g as the parameter
+t ranges over an interval \[a,b\].
+Here's an example:
+\graphpaste{draw(curve(sin(t)*sin(2*t)*sin(3*t), sin(4*t)*sin(5*t)*sin(6*t)), t = 0..2*\%pi)}
+Here 0..2*\%pi represents the interval over which the variable t ranges.
+In the case of parametric curves, Axiom will compile two functions,
+one for each of the functions f and g.
+You may also put a title on a graph.
+The title may be an arbitrary string and is an optional argument
+to the command 'draw'.
+For example:
+\graphpaste{draw(curve(cos(t), sin(t)), t = 0..2*\%pi, title == "The Unit Circle")}
+If you plan on plotting x = f(t), y = g(t) as t ranges over several intervals,
+you may want to define functions f and g, so that they need not be
+recompiled every time you create a new graph.
+Here's an example:
+\spadpaste{f(t:SF):SF == sin(3*t/4) \bound{f}} 
+\newline
+\spadpaste{g(t:SF):SF == sin(t) \bound{g}} 
+\newline
+\graphpaste{draw(curve(f,g), 0..\%pi) \free{f g}} 
+\newline
+\graphpaste{draw(curve(f,g) ,\%pi..2*\%pi) \free{f g}} 
+\newline
+\graphpaste{draw(curve(f,g), -4*\%pi..4*\%pi) \free{f g}}
+These examples show how the curve changes as the range of parameter t varies.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Polar Coordinates}
+\label{PolarGraphicsPage}
+\index{pages!PolarGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!PolarGraphicsPage}
+\index{PolarGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{PolarGraphicsPage}{Polar Coordinates}
+\beginscroll
+Graphs in polar coordinates are given by an equation r = f(theta) as
+theta ranges over an interval.
+This is equivalent to the parametric curve x = f(theta) * cos(theta),
+y = f(theta) * sin(theta) as theta ranges over the same interval.
+You may create such curves using the command 'draw', with the optional
+argument 'coordinates == polar'.
+Here are some examples:
+\graphpaste{draw(1,t = 0..2*\%pi,coordinates == polar, title == "The Unit Circle")} 
+\newline
+\graphpaste{draw(sin(17*t), t = 0..2*\%pi, coordinates == polar, title == "A Petal Curve")}
+%When you don't specify an interval, Axiom will assume that you
+%mean 0..2*\%pi.
+You may also define your own functions, when you plan on plotting the
+same curve as theta varies over several intervals.
+\spadpaste{f(t) == cos(4*t/7) \bound{f}} 
+\newline
+\graphpaste{draw(f, 0..2*\%pi, coordinates == polar) \free{f}} 
+\newline
+\graphpaste{draw(f, 0..14*\%pi, coordinates == polar) \free{f}}
+For information on plotting graphs in other coordinate systems see the
+pages for the \spadtype{CoordinateSystems} domain.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Implicit Curves}
+\label{ImplicitCurveGraphicsPage}
+\index{pages!ImplicitCurveGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!ImplicitCurveGraphicsPage}
+\index{ImplicitCurveGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ImplicitCurveGraphicsPage}{Implicit Curves}
+\beginscroll
+Axiom has facilities for graphing a non-singular algebraic curve
+in a rectangular region of the plane.
+An algebraic curve is a curve defined by a polynomial equation
+p(x,y) = 0.
+Non-singular means that the curve is "smooth" in that it does not
+cross itself or come to a point (cusp).
+Algebraically, this means that for any point (a,b) on the curve
+(i.e. a point such that p(a,b) = 0), the partial derivatives
+dp/dx(a,b) and dp/dy(a,b) are not both zero.
+We require that the polynomial have rational or integral coefficients.
+Here is a Cartesian ovals algebraic curve example:
+(click on the draw button to execute this example)
+\spadpaste{p := ((x**2 + y**2 + 1) - 8*x)**2 - (8*(x**2 + y**2 + 1) - 4*x - 1) \bound{p} }
+\graphpaste{draw(p = 0, x, y, range == \[-1..11, -7..7\], title == "Cartesian Ovals") \free{p}}
+{\em A range must be declared for each variable specified in the algebraic
+curve equation}.
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Lists of Points}
+\label{ListPointsGraphicsPage}
+\index{pages!ListPointsGraphicsPage!graphics.ht}
+\index{graphics.ht!pages!ListPointsGraphicsPage}
+\index{ListPointsGraphicsPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ListPointsGraphicsPage}{Lists of Points}
+\beginscroll
+Axiom has the ability to create lists of points in a two dimensional
+graphics viewport.  This is done by utilizing the \spadtype{GraphImage} and
+\spadtype{TwoDimensionalViewport} domain facilities.
+\indent{5}\newline
+{\em NOTE:  It is only necessary to click on the makeViewport2D command button
+to plot this curve example}.
+\indent{0}\newline
+In this example, the \spadfun{makeGraphImage} command takes a list of lists of
+points parameter, a list of colors for each point in the graph, a list of
+colors for each line in the graph, and a list of numbers which indicate the
+size of each point in the graph.  The following lines create list of lists of
+points which can be read be made into two dimensional graph images.
+\spadpaste{p1 := point [1::SF,1::SF]\$(Point SF) \bound{p1}} 
+\newline
+\spadpaste{p2 := point [0::SF,1::SF]\$(Point SF) \bound{p2}} 
+\newline
+\spadpaste{p3 := point [0::SF,0::SF]\$(Point SF) \bound{p3}} 
+\newline
+\spadpaste{p4 := point [1::SF,0::SF]\$(Point SF) \bound{p4}} 
+\newline
+\spadpaste{p5 := point [1::SF,.5::SF]\$(Point SF) \bound{p5}} 
+\newline
+\spadpaste{p6 := point [.5::SF,0::SF]\$(Point SF) \bound{p6}} 
+\newline
+\spadpaste{p7 := point [0::SF,0.5::SF]\$(Point SF) \bound{p7}} 
+\newline
+\spadpaste{p8 := point [.5::SF,1::SF]\$(Point SF) \bound{p8}} 
+\newline
+\spadpaste{p9 := point [.25::SF,.25::SF]\$(Point SF) \bound{p9}} 
+\newline
+\spadpaste{p10 := point [.25::SF,.75::SF]\$(Point SF) \bound{p10}} 
+\newline
+\spadpaste{p11 := point [.75::SF,.75::SF]\$(Point SF) \bound{p11}} 
+\newline
+\spadpaste{p12 := point [.75::SF,.25::SF]\$(Point SF) \bound{p12}} 
+\newline
+\spadpaste{llp := [[p1,p2],[p2,p3],[p3,p4],[p4,p1],[p5,p6],[p6,p7],[p7,p8],[p8,p5],[p9,p10],[p10,p11],[p11,p12],[p12,p9]] \bound{llp} \free{p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12}} 
+\newline
+These lines set the point color and size, and the line color for all components
+of the graph.
+\spadpaste{size1 := 6::PositiveInteger \bound{size1}} 
+\newline
+\spadpaste{size2 := 8::PositiveInteger \bound{size2}} 
+\newline
+\spadpaste{size3 := 10::PositiveInteger \bound{size3}} 
+\newline
+\spadpaste{lsize := [size1, size1, size1, size1, size2, size2, size2, size2, size3, size3, size3, size3] \bound{lsize} \free{size1 size2 size3}} 
+\newline
+\spadpaste{pc1 := pastel red() \bound{pc1}} 
+\newline
+\spadpaste{pc2 := dim green() \bound{pc2}} 
+\newline
+\spadpaste{pc3 := pastel yellow() \bound{pc3}} 
+\newline
+\spadpaste{lpc := [pc1, pc1, pc1, pc1, pc2, pc2, pc2, pc2, pc3, pc3, pc3, pc3] \bound{lpc} \free{pc1 pc2 pc3}} 
+\newline
+\spadpaste{lc := [pastel blue(), light yellow(), dim green(), bright red(), light green(), dim yellow(), bright blue(), dark red(), pastel red(), light blue(), dim green(), light yellow()] \bound{lc}} 
+\newline
+Now the graph image is created and named according to the component
+specifications indicated above.  The \spadfun{makeViewport2D} command then
+creates a two dimensional viewport for this graph according to the list of
+options specified within the brackets.
+\spadpaste{g := makeGraphImage(llp,lpc,lc,lsize)\$GRIMAGE \bound{g} \free{llp lpc lc lsize}} 
+\newline
+\graphpaste{makeViewport2D(g,[title("Lines")])\$VIEW2D \free{g}}
+The \spadfun{makeViewport2D} command takes a list of options as a parameter.
+In this example the string "Lines" is designated as the viewport's title.
+\endscroll
+\autobuttons \end{page}
+
+@
+
+\subsection{Stand-alone Viewport}
+\label{ViewportPage}
+\index{pages!ViewportPage!graphics.ht}
+\index{graphics.ht!pages!ViewportPage}
+\index{ViewportPage!graphics.ht!pages}
+<<graphics.ht>>=
+\begin{page}{ViewportPage}{Stand-alone Viewport}
+\beginscroll
+To get a viewport on a \HyperName{} page, you first need to
+create one in Axiom and write it out to a
+file that \HyperName{} can call up. \newline
+For example, here we draw a saddle function and assign
+the result to the variable \spad{v}:
+\newline
+\graphpaste{v := draw(x*x-y*y,x=-1..1,y=-1..1) \bound{v}} 
+\newline
+Now that we've created the viewport, we want to write
+the data out to a file. \newline
+To do this, we use the \spadfunFrom{write}{ThreeDimensionalViewport} command which takes
+the following arguments: the viewport to write out,
+the title of the file to write it out to, and an optional
+argument telling the write command what type (or types) of
+data you want to write in additional to the one Axiom will
+always write out. The optional argument could be
+a string, like "pixmap", or a list of strings, like \["postscript","pixmap"\].
+\HyperName{} needs a "pixmap" data type to include a graph in a page
+so in this case, we write the viewport and tell it to
+also write a "pixmap" file, as well:
+\newline
+\spadpaste{write(v,"saddle","pixmap") \free{v}}
+\newline
+Now we want to put this viewport into a \HyperName{} page.
+Say you've created a viewport and written it out
+to a file called "/tmp/mobius". (Axiom actually
+tags a ".view" at the end of a viewport data file to
+make it easier to spot when you're rummaging through
+your file system, but you needn't worry about that here
+since Axiom will always automatically add on a
+".view" for you.)  \newline
+
+{\bf Including Viewports} \newline
+To put a viewport in a
+\HyperName{} page, include the following line in your \HyperName{}
+source code: \newline
+\space{5}\\viewport\{/tmp/mobius\} \newline
+You will get this on your page: \newline
+%%%\space{4}\viewport{/tmp/mobius}\newline
+%\space{4}\spadviewport{mobius}\newline
+\centerline{\spadviewport{mobius}}\newline
+
+{\bf Creating Viewport Buttons} \newline
+To make an active button that would make this viewport
+come to life, include the following: \newline
+\space{5}\\viewportbutton\{ViewButton\}\{/tmp/mobius\} \newline
+this creates this button...\newline
+%%%\centerline{\viewportbutton{ViewButton}{/tmp/mobius}}\newline
+\centerline{\spadviewportbutton{ViewButton}{mobius}}\newline
+
+{\bf Creating Active Viewports} \newline
+To merge the two things descibed above, namely, getting a picture of a
+viewport and creating a button to invoke a live viewport, you can do
+the following: \newline
+
+%\space{5}\\viewportasbutton\{/tmp/mobius\} \newline
+\centerline{\\viewportasbutton\{/tmp/mobius\}}\newline
+
+This would create a picture of a viewport that is an active
+button as well. Try it:
+
+%%%\space{5}\viewportasbutton{/tmp/mobius} \newline
+%\space{5}\spadviewportasbutton{mobius} \newline
+\centerline{\spadviewportasbutton{mobius}}\newline
+
+{\bf Including Viewports Distributed with Axiom} \newline
+All the above commands have counterparts that allow you to
+access viewports that are already packaged with Axiom.
+To include those viewports, just add on an "axiom" prefix
+to the above commands: \newline
+
+\centerline{\\axiomviewport\{vA\} for \\viewport\{vA\}}
+\centerline{\\axiomviewportbutton\{vB\} for \\viewportbutton\{vB\}}
+\centerline{\\axiomviewportasbutton\{vC\} for \\viewportasbutton\{vC\}} \newline
+
+All these macros really do is include some path that
+indicates where Axiom stores the viewports.
+\newline
+\endscroll
+\autobuttons \end{page}
+
+@
+\section{grpthry.ht}
+\subsection{Group Theory}
+\label{GroupTheoryPage}
+\begin{itemize}
+\item InfoGroupTheoryPage \ref{InfoGroupTheoryPage} on
+page~\pageref{InfoGroupTheoryPage}
+\item InfoRepTheoryPage \ref{InfoRepTheoryPage} on
+page~\pageref{InfoRepTheoryPage}
+\item RepA6Page \ref{RepA6Page} on
+page~\pageref{RepA6Page}
+\end{itemize}
+\index{pages!GroupTheoryPage!grpthry.ht}
+\index{grpthry.ht!pages!GroupTheoryPage}
+\index{GroupTheoryPage!grpthry.ht!pages}
+<<grpthry.ht>>=
+\begin{page}{GroupTheoryPage}{Group Theory}
+% authors: H. Gollan, J. Grabmeier, August 1989
+\beginscroll
+Axiom can work with individual permutations, permutation
+groups and do representation theory.
+\horizontalline
+\newline
+\beginmenu
+\menulink{Info on Group Theory}{InfoGroupTheoryPage}
+
+
+%\menulink{Permutation}{PermutationXmpPage}
+%Calculating within symmetric groups.
+
+%\menulink{Permutation Groups}{PermutationGroupXmpPage}
+%Working with subgroups of a symmetric group.
+
+%\menulink{Permutation Group Examples}{PermutationGroupExampleXmpPage}
+%Working with permutation groups, predefined in the system as Rubik's group.
+
+\menulink{Info on Representation Theory}{InfoRepTheoryPage}
+
+%\menulink{Irreducible Representations of Symmetric Groups}{IrrRepSymNatXmpPage}
+%Alfred Young's natural form for these representations.
+
+%\menulink{Representations of Higher Degree}{RepresentationPackage1XmpPage}
+%Constructing new representations by symmetric and antisymmetric
+%tensors.
+
+%\menulink{Decomposing Representations}{RepresentationPackage2XmpPage}
+%Parker's `Meat-Axe', working in prime characteristics.
+
+\menulink{Representations of \texht{$A_6$}{A6}}{RepA6Page}
+The irreducible representations of the alternating group \texht{$A_6$}{A6} over fields
+of characteristic 2.
+\endmenu
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Representations of $A_6$ A6}
+\label{RepA6Page}
+\index{pages!RepA6Page!grpthry.ht}
+\index{grpthry.ht!pages!RepA6Page}
+\index{RepA6Page!grpthry.ht!pages}
+<<grpthry.ht>>=
+\begin{page}{RepA6Page}{Representations of \texht{$A_6$}{A6}}
+% author: J. Grabmeier,  08/08/89
+\beginscroll
+In what follows you'll see how to use Axiom to get all the irreducible
+representations of the alternating group \texht{$A_6$}{A6} over the field with two
+elements (GF 2).
+First, we generate \texht{$A_6$}{A6} by a three-cycle: x = (1,2,3)
+and a 5-cycle: y = (2,3,4,5,6).  Next we have Axiom calculate
+the permutation representation over the integers and over GF 2:
+\spadpaste{genA6 : LIST PERM INT := [cycle [1,2,3],cycle [2,3,4,5,6]] \bound{genA6}}
+\spadpaste{pRA6 := permutationRepresentation (genA6, 6) \bound{pRA6} \free{genA6}
+}
+Now we apply Parker's 'Meat-Axe' and split it:
+\spadpaste{sp0 := meatAxe (pRA6::(LIST MATRIX PF 2)) \free{pRA6} \bound{sp0}}
+We have found the trivial module as a quotient module
+and a 5-dimensional sub-module.
+Try to split again:
+\spadpaste{sp1 := meatAxe sp0.1 \bound{sp1}}
+and we find a 4-dimensional sub-module and the trivial one again.
+Now we can test if this representaton is absolutely irreducible:
+\spadpaste{isAbsolutelyIrreducible? sp1.2 }
+and we see that this 4-dimensional representation is absolutely irreducible.
+So, we have found a second irreducible representation.
+Now, we construct a representation by reducing an irreducible one
+of the symmetric group S_6 over the integers mod 2.
+We take the one labelled by the partition [2,2,1,1] and
+restrict it to \texht{$A_6$}{A6}:
+\spadpaste{d2211 := irreducibleRepresentation ([2,2,1,1],genA6) \bound{d2211} }
+Now split it:
+\spadpaste{d2211m2 := d2211:: (LIST MATRIX PF 2); sp2 := meatAxe d2211m2 \free{d2211}
+\bound{sp2}}
+This gave both a five and a four dimensional representation.
+Now we take the 4-dimensional one
+and we shall see that it is absolutely irreducible:
+\spadpaste{isAbsolutelyIrreducible? sp2.1}
+The two 4-dimensional representations are not equivalent:
+\spadpaste{areEquivalent? (sp1.2, sp2.1)}
+So we have found a third irreducible representation.
+Now we construct a new representation using the tensor product
+and try to split it:
+\spadpaste{dA6d16 := tensorProduct(sp1.2,sp2.1); meatAxe dA6d16 \bound{dA6d16}}
+The representation is irreducible, but it may be not absolutely irreducible.
+\spadpaste{isAbsolutelyIrreducible? dA6d16}
+So let's try the same procedure over the field with 4 elements:
+\spadpaste{sp3 := meatAxe (dA6d16 :: (LIST MATRIX FF(2,2))) \bound{sp3}}
+Now we find two 8-dimensional representations, dA6d8a and dA6d8b.
+Both are absolutely irreducible...
+\spadpaste{isAbsolutelyIrreducible?  sp3.1}
+\spadpaste{isAbsolutelyIrreducible?  sp3.2}
+and they are not equivalent:
+\spadpaste{areEquivalent? (sp3.1,sp3.2)}
+So we have found five absolutely irreducible representations of \texht{$A_6$}{A6}
+in characteristic 2.
+General theory now tells us that there are no more irreducible ones.
+Here, for future reference are all the absolutely irreducible 2-modular
+representations of \texht{$A_6$}{A6}
+\spadpaste{sp0.2 \free{sp0}}
+\spadpaste{sp1.2 \free{sp1}}
+\spadpaste{sp2.1 \free{sp2}}
+\spadpaste{sp3.1 \free{sp3}}
+\spadpaste{sp3.2 \free{sp3}}
+And here again is the irreducible, but not absolutely irreducible
+representations of \texht{$A_6$}{A6} over GF 2
+\spadpaste{dA6d16 \free{dA6d16}}
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Representation Theory}
+\label{InfoRepTheoryPage}
+\index{pages!InfoRepTheoryPage!grpthry.ht}
+\index{grpthry.ht!pages!InfoRepTheoryPage}
+\index{InfoRepTheoryPage!grpthry.ht!pages}
+<<grpthry.ht>>=
+\begin{page}{InfoRepTheoryPage}{Representation Theory}
+\beginscroll
+\horizontalline
+Representation theory for finite groups studies finite groups by
+embedding them in a general linear group over a field or an
+integral domain.
+Hence, we are representing each element of the group by
+an invertible matrix.
+Two matrix representations of a given group are equivalent, if, by changing the
+basis of the underlying
+space, you can go from one to the other.  When you change bases, you
+transform the matrices that are the images of elements by
+conjugating them by an invertible matrix.
+\newline
+\newline
+If we can find a subspace which is fixed under the image
+of the group, then there exists a `base change' after which all the representing
+ matrices
+are in upper triangular block form. The block matrices on
+the main diagonal give a new representation of the group of lower degree.
+Such a representation is said to be `reducible'.
+\newline
+\beginmenu
+%\menulink{Irreducible Representations of Symmetric Groups}{IrrRepSymNatXmpPage}
+
+%Alfred Young's natural form for these representations.
+
+%\menulink{Representations of Higher Degree}{RepresentationPackage1XmpPage}
+%Constructing new representations by symmetric and antisymmetric
+%tensors.
+
+%\menulink{Decomposing Representations}{RepresentationPackage2XmpPage}
+%Parker's `Meat-Axe', working in prime characteristics.
+
+\menulink{Representations of \texht{$A_6$}{A6}}{RepA6Page}
+The irreducible representations of the alternating group \texht{$A_6$}{A6} over fields
+of characteristic 2.
+\endmenu
+\endscroll
+\autobuttons \end{page}
+
+@
+\subsection{Group Theory}
+\label{InfoGroupTheoryPage}
+\index{pages!InfoGroupTheoryPage!grpthry.ht}
+\index{grpthry.ht!pages!InfoGroupTheoryPage}
+\index{InfoGroupTheoryPage!grpthry.ht!pages}
+<<grpthry.ht>>=
+\begin{page}{InfoGroupTheoryPage}{Group Theory}
+%%
+%% Johannes Grabmeier 03/02/90
+%%
+\beginscroll
+A {\it group} is a set G together with an associative operation
+* satisfying the axioms of existence
+of a unit element and an inverse of every element of the group.
+The Axiom category \spadtype{Group} represents this setting.
+Many data structures in Axiom are groups and therefore there
+is a large variety of examples as fields and polynomials,
+although the main interest there is not the group structure.
+
+To work with and in groups in a concrete manner some way of
+representing groups has to be chosen. A group can be given
+as a list of generators and a set of relations. If there
+are no relations, then  we have a {\it free group}, realized
+in the domain \spadtype{FreeMonoid} which won't be discussed here.
+We consider {\it permutation groups}, where a group
+is realized as a subgroup of the symmetric group of a set, i.e.
+the group of all bijections of a set, the operation being the
+composition of maps.
+Indeed,  every group can be realized this way, although
+this may not be practical.
+
+Furthermore group elements can be given as invertible matrices.
+The group operation is reflected by matrix multiplication.
+More precise in representation theory group homomophisms
+from a group to general linear groups are contructed.
+Some algorithms are implemented in Axiom.
+\newline
+%\beginmenu
+%\menulink{Permutation}{PermutationXmpPage}
+%Calculating within symmetric groups.
+
+%\menulink{Permutation Groups}{PermutationGroupXmpPage}
+%Working with subgroups of a symmetric group.
+
+%\menulink{Permutation Group Examples}{PermutationGroupExampleXmpPage}
+%Working with permutation groups, predefined in the system as Rubik's group.
+%\endmenu
+\endscroll
+\autobuttons \end{page}
+
+
+@
+\section{gstbl.ht}
+<<gstbl.ht>>=
+\newcommand{\GeneralSparseTableXmpTitle}{GeneralSparseTable}
+\newcommand{\GeneralSparseTableXmpNumber}{9.30}
+
+@
+\subsection{GeneralSparseTable}
+\label{GeneralSparseTableXmpPage}
+See TableXmpPage \ref{TableXmpPage} on page~\pageref{TableXmpPage}
+\index{pages!GeneralSparseTableXmpPage!gstbl.ht}
+\index{gstbl.ht!pages!GeneralSparseTableXmpPage}
+\index{GeneralSparseTableXmpPage!gstbl.ht!pages}
+<<gstbl.ht>>=
+\begin{page}{GeneralSparseTableXmpPage}{GeneralSparseTable}
+\beginscroll
+
+Sometimes when working with tables there is a natural value to use
+as the entry in all but a few cases.
+The \spadtype{GeneralSparseTable} constructor can be used to provide any
+table type with a default value for entries.
+See \downlink{`Table'}{TableXmpPage}\ignore{Table} 
+for general information about tables.
+\showBlurb{GeneralSparseTable}
+
+Suppose we launched a fund-raising campaign to raise fifty thousand dollars.
+To record the contributions, we want a table with strings as keys
+(for the names) and integer entries (for the amount).
+In a data base of cash contributions, unless someone
+has been explicitly entered, it is reasonable to assume they have made
+a zero dollar contribution.
+\xtc{
+This creates a keyed access file with default entry \spad{0}.
+}{
+\spadpaste{patrons: GeneralSparseTable(String, Integer, KeyedAccessFile(Integer), 0) := table() ; \bound{patrons}}
+}
+\xtc{
+Now \spad{patrons} can be used just as any other table.
+Here we record two gifts.
+}{
+\spadpaste{patrons."Smith" := 10500 \free{patrons}\bound{smith}}
+}
+\xtc{
+}{
+\spadpaste{patrons."Jones" := 22000 \free{smith}\bound{jones}}
+}
+\xtc{
+Now let us look up the size of the contributions from Jones and Stingy.
+}{
+\spadpaste{patrons."Jones"  \free{jones}}
+}
+\xtc{
+}{
+\spadpaste{patrons."Stingy" \free{jones}}
+}
+\xtc{
+Have we met our seventy thousand dollar goal?
+}{
+\spadpaste{reduce(+, entries patrons) \free{jones}}
+}
+\noOutputXtc{
+So the project is cancelled and we can delete the data base:
+}{
+\spadpaste{)system rm -r kaf*.sdata \free{patrons}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{heap.ht}
+<<heap.ht>>=
+\newcommand{\HeapXmpTitle}{Heap}
+\newcommand{\HeapXmpNumber}{9.32}
+
+@
+\subsection{Heap}
+\label{HeapXmpPage}
+See FlexibleArrayXmpPage \ref{FlexibleArrayXmpPage} 
+on page~\pageref{FlexibleArrayXmpPage}
+\index{pages!HeapXmpPage!heap.ht}
+\index{heap.ht!pages!HeapXmpPage}
+\index{HeapXmpPage!heap.ht!pages}
+<<heap.ht>>=
+\begin{page}{HeapXmpPage}{Heap}
+\beginscroll
+The domain \spadtype{Heap(S)} implements a priority queue of
+objects of type \spad{S} such that
+the operation \spadfunX{extract} removes and returns
+the maximum element.
+The implementation represents heaps as flexible arrays
+(see \downlink{`FlexibleArray'}{FlexibleArrayXmpPage}\ignore{FlexibleArray}).
+The representation and algorithms give complexity
+of \texht{$O(\log(n))$}{O(log n)} for insertion and extractions,
+and \texht{$O(n)$}{O(n)} for construction.
+
+\xtc{
+Create a heap of six elements.
+}{
+\spadpaste{h := heap [-4,9,11,2,7,-7]\bound{h}}
+}
+\xtc{
+Use \spadfunX{insert} to add an element.
+}{
+\spadpaste{insert!(3,h)\bound{h1}\free{h}}
+}
+\xtc{
+The operation \spadfunX{extract} removes and returns
+the maximum element.
+}{
+\spadpaste{extract! h\bound{h2}\free{h1}}
+}
+\xtc{
+The internal structure of \spad{h} has been
+appropriately adjusted.
+}{
+\spadpaste{h\free{h2}}
+}
+\xtc{
+Now \spadfunX{extract} elements repeatedly
+until none are left, collecting the elements in a list.
+}{
+\spadpaste{[extract!(h) while not empty?(h)]\bound{h2}}
+}
+\xtc{
+Another way to produce the same result is by defining
+a \userfun{heapsort} function.
+}{
+\spadpaste{heapsort(x) == (empty? x => []; cons(extract!(x),heapsort x))\bound{f}}
+}
+\xtc{
+Create another sample heap.
+}{
+\spadpaste{h1 := heap [17,-4,9,-11,2,7,-7]\bound{h1}}
+}
+\xtc{
+Apply \spadfun{heapsort} to present elements in order.
+}{
+\spadpaste{heapsort h1\free{f}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{hexadec.ht}
+<<hexadec.ht>>=
+\newcommand{\HexadecimalExpansionXmpTitle}{HexadecimalExpansion}
+\newcommand{\HexadecimalExpansionXmpNumber}{9.33}
+
+@
+\subsection{HexadecimalExpansion}
+\label{HexadecimalExpansionXmpPage}
+\begin{itemize}
+\item DecimalExpansion \ref{DecimalExpansion} on
+page~pageref{DecimalExpansion}
+\item BinaryExpansion \ref{BinaryExpansion} on
+page~pageref{BinaryExpansion}
+\item RadixExpansion \ref{RadixExpansion} on
+page~pageref{RadixExpansion}
+\end{itemize}
+\index{pages!HexadecimalExpansionXmpPage!hexadec.ht}
+\index{hexadec.ht!pages!HexadecimalExpansionXmpPage}
+\index{HexadecimalExpansionXmpPage!hexadec.ht!pages}
+<<hexadec.ht>>=
+\begin{page}{HexadecimalExpansionXmpPage}{HexadecimalExpansion}
+\beginscroll
+
+All rationals have repeating hexadecimal expansions.
+The operation \spadfunFrom{hex}{HexadecimalExpansion} returns these
+expansions of type \spadtype{HexadecimalExpansion}.
+Operations to access the individual numerals of a hexadecimal expansion can
+be obtained by converting the value to \spadtype{RadixExpansion(16)}.
+More examples of expansions are available in the
+\downlink{`DecimalExpansion'}{DecimalExpansionXmpPage}\ignore{DecimalExpansion},
+\downlink{`BinaryExpansion'}{BinaryExpansionXmpPage}\ignore{BinaryExpansion}, and
+\downlink{`RadixExpansion'}{RadixExpansionXmpPage}\ignore{RadixExpansion}.
+
+\showBlurb{HexadecimalExpansion}
+
+\xtc{
+This is a hexadecimal expansion of a rational number.
+}{
+\spadpaste{r := hex(22/7) \bound{r}}
+}
+\xtc{
+Arithmetic is exact.
+}{
+\spadpaste{r + hex(6/7) \free{r}}
+}
+\xtc{
+The period of the expansion can be short or long \ldots
+}{
+\spadpaste{[hex(1/i) for i in 350..354] }
+}
+\xtc{
+or very long!
+}{
+\spadpaste{hex(1/1007) }
+}
+\xtc{
+These numbers are bona fide algebraic objects.
+}{
+\spadpaste{p := hex(1/4)*x**2 + hex(2/3)*x + hex(4/9)  \bound{p}}
+}
+\xtc{
+}{
+\spadpaste{q := D(p, x) \free{p}\bound{q}}
+}
+\xtc{
+}{
+\spadpaste{g := gcd(p, q)            \free{p}\free{q}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{htxadvpage1.ht}
+\subsection{Input Areas}
+\label{HTXAdvPage1}
+See HTXAdvPage2 \ref{HTXAdvPage2} on page~\pageref{HTXAdvPage2}
+\index{pages!HTXAdvPage1!htxadvpage1.ht}
+\index{htxadvpage1.ht!pages!HTXAdvPage1}
+\index{HTXAdvPage1!htxadvpage1.ht!pages}
+<<htxadvpage1.ht>>=
+\begin{page}{HTXAdvPage1}{Input areas}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+You have probably seen input areas in other \HyperName{}
+pages. They provide {\it dynamic link} capabilities.
+Instead of having a choice between certain actions,
+they allow you to specify an action on--the--fly.
+To use them, you need the following commands:
+\beginImportant
+\newline
+{\tt \\inputstring\{{\it label}\}\{{\it length}\}\{{\it default value}\}}
+\newline
+{\tt \\stringvalue\{{\it label}\}}
+\endImportant
+
+The first command puts up an input area of the {\it length}
+specified. The {\it default value} is placed in it.
+The first argument, {\it label} gives a name to the
+contents of the input area.
+You can refer to those contents by using
+the second command. Never place a {\tt \\stringvalue} command
+in an "exposed" part of the page. It is only meant
+to be used as an argument to an {\it action}.
+Here are some examples.
+
+
+
+
+
+\beginImportant
+\begin{paste}{HTXAdvPage1xPaste1}{HTXAdvPage1xPatch1}
+\pastebutton{HTXAdvPage1xPaste1}{Interpret}
+\newline
+{\tt Page name \\tab\{16\} }
+{\tt \\inputstring\{pagetogo\}\{30\}\{RootPage\}}\newline
+{\tt \\newline}\newline
+{\tt \\downlink\{GO!\}\{\\stringvalue\{pagetogo\}\}}\newline
+\end{paste}
+\endImportant
+
+\beginImportant
+\begin{paste}{HTXAdvPage1xPaste2}{HTXAdvPage1xPatch2}
+\pastebutton{HTXAdvPage1xPaste2}{Interpret}
+\newline
+{\tt File to edit \\tab\{16\}}\newline
+{\tt \\inputstring\{filetoedit\}\{30\}\{/etc/passwd\}}\newline
+{\tt \\newline}\newline
+{\tt \\unixcommand\{Ready!\}\{xterm  -e vi \\stringvalue\{filetoedit\}\}}
+\end{paste}
+\endImportant
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next Page --- Radio boxes}{HTXAdvPage2}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXAdvPage1xPatch1 patch}
+\label{HTXAdvPage1xPatch1}
+\index{patch!HTXAdvPage1xPatch1!htxadvpage1.ht}
+\index{htxadvpage1.ht!patch!HTXAdvPage1xPatch1}
+\index{HTXAdvPage1xPatch1!htxadvpage1.ht!patch}
+<<htxadvpage1.ht>>=
+\begin{patch}{HTXAdvPage1xPatch1}
+\begin{paste}{HTXAdvPage1xPaste1A}{HTXAdvPage1xPatch1A}
+\pastebutton{HTXAdvPage1xPaste1A}{Source}
+\newline
+Page name \tab{16}
+\inputstring{pagetogo}{30}{RootPage}
+\newline
+\downlink{GO!}{\stringvalue{pagetogo}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXAdvPage1xPatch1A patch}
+\label{HTXAdvPage1xPatch1A}
+\index{patch!HTXAdvPage1xPatch1A!htxadvpage1.ht}
+\index{htxadvpage1.ht!patch!HTXAdvPage1xPatch1A}
+\index{HTXAdvPage1xPatch1A!htxadvpage1.ht!patch}
+<<htxadvpage1.ht>>=
+\begin{patch}{HTXAdvPage1xPatch1A}
+\begin{paste}{HTXAdvPage1xPaste1B}{HTXAdvPage1xPatch1}
+\pastebutton{HTXAdvPage1xPaste1B}{Interpret}
+\newline
+{\tt Page name \\tab\{16\} }
+{\tt \\inputstring\{pagetogo\}\{30\}\{RootPage\}}\newline
+{\tt \\newline}\newline
+{\tt \\downlink\{GO!\}\{\\stringvalue\{pagetogo\}\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXAdvPage1xPatch2 patch}
+\label{HTXAdvPage1xPatch2}
+\index{patch!HTXAdvPage1xPatch2!htxadvpage1.ht}
+\index{htxadvpage1.ht!patch!HTXAdvPage1xPatch2}
+\index{HTXAdvPage1xPatch2!htxadvpage1.ht!patch}
+<<htxadvpage1.ht>>=
+\begin{patch}{HTXAdvPage1xPatch2}
+\begin{paste}{HTXAdvPage1xPaste2A}{HTXAdvPage1xPatch2A}
+\pastebutton{HTXAdvPage1xPaste2A}{Source}
+\newline
+File to edit \tab{16}
+\inputstring{filetoedit}{30}{/etc/passwd}
+\newline
+\unixcommand{Ready!}{xterm  -e vi \stringvalue{filetoedit}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXAdvPage1xPatch2A patch}
+\label{HTXAdvPage1xPatch2A}
+\index{patch!HTXAdvPage1xPatch2A!htxadvpage1.ht}
+\index{htxadvpage1.ht!patch!HTXAdvPage1xPatch2A}
+\index{HTXAdvPage1xPatch2A!htxadvpage1.ht!patch}
+<<htxadvpage1.ht>>=
+\begin{patch}{HTXAdvPage1xPatch2A}
+\begin{paste}{HTXAdvPage1xPaste2B}{HTXAdvPage1xPatch2}
+\pastebutton{HTXAdvPage1xPaste2B}{Interpret}
+\newline
+{\tt File to edit \\tab\{16\}}\newline
+{\tt \\inputstring\{filetoedit\}\{30\}\{/etc/passwd\}}\newline
+{\tt \\newline}\newline
+{\tt \\unixcommand\{Ready!\}\{xterm  -e vi \\stringvalue\{filetoedit\}\}}
+\end{paste}
+\end{patch}
+
+@
+\section{htxadvpage2.ht}
+\subsection{Radio buttons}
+\label{HTXAdvPage2}
+See HTXAdvPage3 \ref{HTXAdvPage3} on page~\pageref{HTXAdvPage3}
+\index{pages!HTXAdvPage2!htxadvpage2.ht}
+\index{htxadvpage2.ht!pages!HTXAdvPage2}
+\index{HTXAdvPage2!htxadvpage2.ht!pages}
+<<htxadvpage2.ht>>=
+\begin{page}{HTXAdvPage2}{Radio buttons}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+
+If you just want to make a multiple-choice
+type selection, why not use the {\it radio buttons}.
+
+You need to use bitmaps for the active areas (the buttons) but
+\HyperName{} will keep track of the currently activated button.
+You can use this boolean information somewhere else on your page.
+The commands to use are:
+\beginImportant
+\newline
+{\tt \\radioboxes\{{\it group name}\}\{{\it bitmap file1}\}\{{\it bitmap file0}\}}
+\newline
+{\tt \\radiobox[{\it initial state}]\{{\it label}\}\{{\it group name}\}}
+\newline
+{\tt \\boxvalue\{{\it label}\}}
+\endImportant
+
+The {\tt \\radioboxes} command sets up a group of {\tt \\radiobox}
+buttons. The {\it group name} is a label for the group. The filenames
+for the bitmaps are specified in {\it bitmap file1} and {\it bitmap file0}.
+The first one should denote an activated button and the second
+a de-activated one.
+
+To display each button in a group, use {\tt \\radiobox}.
+The {\it initial state} should be either {\tt 1} or {\tt 0}
+depending on whether the button should first be displayed as activated or not.
+The second {\it label} argument defines the name by which the
+current state of the button can be referred to.
+The third argument specifies which group this button belongs to.
+
+The {\tt \\boxvalue} command can then be used in various
+actions. The value of it will
+be either {\tt t} or {\tt nil}.
+
+In the example below, we use the {\tt \\htbmfile} macro
+defined in {\bf util.ht} so that we do not have to write
+the full bitmap file pathnames.
+
+This is how we set up the group. The {\tt \\radioboxes} command does not display
+anything.
+Note that these commands cannot be included in a {\it patch}.
+This is why we display this time the source and the result
+at the same time.
+\beginImportant
+\newline
+{\tt \\radioboxes\{group\}\{\\htbmfile\{pick\}\}\{\\htbmfile\{unpick\}\}}\newline
+{\tt \\newline \\table\{}\newline
+{\tt \{\\radiobox[1]\{b1\}\{group\}\}}\newline
+{\tt \{\\radiobox[0]\{b2\}\{group\}\}}\newline
+{\tt \{\\radiobox[0]\{b3\}\{group\}\}\}}\newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{lisp\}\{(pprint (list}\newline
+{\tt \\boxvalue\{b1\} \\boxvalue\{b2\} \\boxvalue\{b3\}))\}}\newline
+{\tt \\newline}\newline
+{\tt \\unixcommand\{unix\}\{echo '\\boxvalue\{b1\}}\newline
+{\tt \\boxvalue\{b2\} \\boxvalue\{b3\}'\}}
+\endImportant
+\radioboxes{group}{\htbmfile{pick}}{\htbmfile{unpick}}
+\table{
+{\radiobox[1]{b1}{group}}
+{\radiobox[0]{b2}{group}}
+{\radiobox[0]{b3}{group}}}
+\newline
+\lispcommand{lisp}{(pprint (list
+\boxvalue{b1} \boxvalue{b2} \boxvalue{b3}))}
+\newline
+\unixcommand{unix}{echo '\boxvalue{b1}
+\boxvalue{b2} \boxvalue{b3}'}
+\endImportant
+
+
+
+
+You can only set one radio button at a time. If you want
+a non--exclusive selection, try {\tt \\inputbox}.
+The syntax for this command is
+\beginImportant
+\newline
+{\tt \\inputbox[{\it initial state}]\{{\it label}\}\{{\it bitmap file1}\}\{{\it bitmap file0}\}}
+\endImportant
+
+There is no group command for these.
+\beginImportant
+\newline
+{\tt \\table\{}\newline
+{\tt \{\\inputbox[1]\{c1\}\{\\htbmfile\{pick\}\}\{\\htbmfile\{unpick\}\}\}}\newline
+{\tt \{\\inputbox\{c2\}\{\\htbmfile\{pick\}\}\{\\htbmfile\{unpick\}\}\}}\newline
+{\tt \{\\inputbox[1]\{c3\}\{\\htbmfile\{pick\}\}\{\\htbmfile\{unpick\}\}\}\}}\newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{lisp\}\{(pprint (list}\newline
+{\tt \\boxvalue\{c1\} \\boxvalue\{c2\} \\boxvalue\{c3\}))\}}\newline
+{\tt \\newline}\newline
+{\tt \\unixcommand\{unix\}\{echo }\newline
+{\tt '\\boxvalue\{c1\} \\boxvalue\{c2\} \\boxvalue\{c3\}'\}}\newline
+\endImportant
+\table{
+{\inputbox[1]{c1}{\htbmfile{pick}}{\htbmfile{unpick}}}
+{\inputbox{c2}{\htbmfile{pick}}{\htbmfile{unpick}}}
+{\inputbox[1]{c3}{\htbmfile{pick}}{\htbmfile{unpick}}}}
+\newline
+\lispcommand{lisp}{(pprint (list
+\boxvalue{c1} \boxvalue{c2} \boxvalue{c3}))}
+\newline
+\unixcommand{unix}{echo
+'\boxvalue{c1} \boxvalue{c2} \boxvalue{c3}'}
+\endImportant
+
+
+Note that the {\it initial state} is an
+optional argument. If omitted
+the button will initially
+be deactivated.
+
+\end{scroll}
+\beginmenu
+\menulink{Next Page --- Macros}{HTXAdvPage3}
+\endmenu
+
+\end{page}
+
+@
+\section{htxadvpage3.ht}
+\subsection{Macros}
+\label{HTXAdvPage3}
+See HTXAdvPage4 \ref{HTXAdvPage4} on page~\ref{HTXAdvPage4}p
+\index{pages!HTXAdvPage3!htxadvpage3.ht}
+\index{htxadvpage3.ht!pages!HTXAdvPage3}
+\index{HTXAdvPage3!htxadvpage3.ht!pages}
+<<htxadvpage3.ht>>=
+\begin{page}{HTXAdvPage3}{Macros}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+
+Sometimes you may find yourself having to
+write
+almost the same piece of \HyperName{}
+text many times. Thankfully, there is a command to ease
+the work.
+It is the {\tt \\newcommand} command and provides
+a macro facility for \HyperName{}.
+In this way, you can give a short name to a sequence of \HyperName{}
+text and use that name to include the sequence in your pages.
+The way this works is the following
+\beginImportant
+\newline
+\centerline{{\tt \\newcommand\{\\{\it name}\}[{\it number of arguments}]\{{\it \HyperName{} text}\}}}
+\endImportant
+and here is an example from {\bf util.ht}
+\beginImportant
+\newline
+{\tt \\newcommand\{\\axiomSig\}[2]\{\\axiomType\{\#1\} \{\\tt ->\} \\axiomType\{\#2\}\}}
+\newline
+{\tt \\newcommand\{\\axiomType\}[1]\{\\lispdownlink\{\#1\}\{(|spadType| '|\#1|)\}\}}
+\endImportant
+
+You see that a macro's definition can invoke another.
+Don't create a circular definition though!
+Notice how the arguments of the macro are used
+in the definition. The {\tt \#{\it n}} construct
+is the place--holder of the {\it n}'th argument.
+
+To use the macro, just treat it as an ordinary command.
+For instance
+\beginImportant
+\newline
+{\tt \\axiomSig\{Integer\}\{List Integer\}}
+\endImportant
+displays and acts like this
+\beginImportant
+\newline
+\axiomSig{Integer}{List Integer}
+\endImportant
+
+The best way to familiarise yourself to
+macros is to study the macros defined in
+\centerline{
+{\bf \env{AXIOM}/doc/hypertex/pages/util.ht}
+}
+It is highly probable that a good many of them
+will prove useful to you.
+Clever use of macros will allow you to
+create \HyperName{} text that can be
+formatted by other programs (such as TeX).
+The Axiom User Guide was written
+in such a way as to make translation in
+\HyperName{} form and TeX form a mechanical process.
+
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next Page --- Patch and Paste}{HTXAdvPage4}
+\endmenu
+
+\end{page}
+
+@
+\section{htxadvpage4.ht}
+\subsection{Patch and Paste}
+\label{HTXAdvPage4}
+See HTXAdvPage5 \ref{HTXAdvPage5} on page~\pageref{HTXAdvPage5}
+\index{pages!HTXAdvPage4!htxadvpage4.ht}
+\index{htxadvpage4.ht!pages!HTXAdvPage4}
+\index{HTXAdvPage4!htxadvpage4.ht!pages}
+<<htxadvpage4.ht>>=
+\begin{page}{HTXAdvPage4}{Patch and Paste}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+
+A powerful \HyperName{} feature is
+the ability to {\it replace}
+part of a displayed page with another part
+when an active area is clicked. The group commands
+{\it patch} and {\it paste} offer this facility.
+A {\it paste} region can appear anywhere
+within a page or a {\it patch}. A {\it patch} region must be defined
+outside a page definition.
+
+We need a few  objects to define the {\it paste}
+region. These are a {\it name} with which to
+refer to it, some way of specifying what it
+is to be replaced by and a {\it trigger} for the
+replacement. A {\it patch} is how we specify the
+second of these objects.
+The {\it patch} is generally a sequence of \HyperName{}
+text.
+
+If we want to have the option of returning to the original
+(or ,indeed, proceeding to a {\it third} alternative)
+we clearly must include a {\it paste} in the {\it patch}.
+
+Let us start with a simple example. We wish to
+have the word {\tt initial} somewhere on the page replaced by the
+word {\tt final} at a click of a button.
+Let us first define the {\it patch}. It will just contain
+the word {\tt final}. Here is a definition of a
+patch called {\tt patch1} (note that
+the actual definition must be outside this page's definition).
+\beginImportant
+\newline
+{\tt \\begin\{patch\}\{patch1\}} \newline
+{\tt final}\newline
+{\tt \\end\{patch\}}
+\endImportant
+We now define a {\it paste} region exactly where we
+want the word {\tt initial} to appear.
+\beginImportant
+\newline
+{\tt \\begin\{paste\}\{paste1\}\{patch1\}}\newline
+{\tt initial}\newline
+{\tt \\end\{paste\}}
+\centerline{{\it results in}}
+\begin{paste}{paste1}{patch1}
+initial
+\end{paste}
+\endImportant
+We have specified first the name of the {\it paste} region
+which is {\tt paste1} and then the name of the
+replacement {\it patch} which is {\tt patch1}.
+Something is missing -- the trigger.
+To include a trigger we write
+\beginImportant
+\newline
+{\tt \\pastebutton\{paste1\}\{trigger\}
+\centerline{{\it results in}}
+\pastebutton{paste1}{trigger}
+\endImportant
+This new command {\tt \\pastebutton} displays the second argument
+as an active area. The first argument specifies the {\it paste}
+region it refers to. Clicking on {\tt trigger} above will
+replace the word {\tt initial} with the word {\tt final}.
+
+We can, if we like, include the {\tt \\pastebutton} in the {\it paste}
+region.
+Let us improve on the situation by providing a way
+of going back to the original word {\tt initial} on the page.
+The {\it patch} must itself include a {\it paste}.
+What will the replacement {\it patch} for this new {\it paste}
+be ? Well, we  have to define a second {\it patch}
+that contains all the stuff in the original {\it paste}
+region. Here is the updated {\it patch} for the first replacement.
+The {\tt \\MenuDotBitmap} macro is defined in {\bf util.ht}.
+It displays a button bitmap.
+This time we put the {\tt \\pastebutton}
+inside the {\it paste}.
+\beginImportant
+\newline
+{\tt \\begin\{patch\}\{Patch1\}}\newline
+{\tt \\begin\{paste\}\{Paste2\}\{Patch2\}}\newline
+{\tt \\pastebutton\{Paste2\}\{\\MenuDotBitmap\}}\newline
+{\tt final}\newline
+{\tt \\end\{paste\}}\newline
+{\tt \\end\{patch\}}\newline
+\endImportant
+and the new {\tt Patch2} {\it patch}
+\beginImportant
+\newline
+{\tt \\begin\{patch\}\{Patch2\}}\newline
+{\tt \\begin\{paste\}\{Paste3\}\{Patch1\}}\newline
+{\tt \\pastebutton\{Paste3\}\{\\MenuDotBitmap\}}\newline
+{\tt initial}\newline
+{\tt \\end\{paste\}}\newline
+{\tt \\end\{patch\}}\newline
+\endImportant
+
+Remember that these {\it patch} definitons must
+occur outside a {\tt \\begin\{page\} - \\end\{page\}} group.
+What is left now is to define the starting {\it paste}
+region.
+\beginImportant
+\newline
+{\tt \\begin\{paste\}\{Paste1\}\{Patch1\}}\newline
+{\tt \\pastebutton\{Paste1\}\{\\MenuDotBitmap\}}\newline
+{\tt initial}\newline
+{\tt \\end\{paste\}}
+\centerline{{\it results in}}
+\begin{paste}{Paste1}{Patch1}
+\pastebutton{Paste1}{\MenuDotBitmap}
+initial
+\end{paste}
+\endImportant
+
+Clicking on the button above next to {\tt initial}
+will replace the {\tt Paste1} region with
+{\tt Patch1}. That {\it patch}
+also contains a {\it paste} region ({\tt Paste2}).
+Clicking on {\it its} button will put up
+{\tt Patch2} which has a {\it paste} region ({\tt Paste3}).
+Clicking on {\it its} button will put up {\tt Patch1}
+again. In that way, we close the chain of replacements.
+
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next Page --- Axiom paste-ins}{HTXAdvPage5}
+\endmenu
+
+\end{page}
+
+@
+\subsection{patch1 patch}
+\label{patch1}
+\index{patch!patch1!htxadvpage4.ht}
+\index{htxadvpage4.ht!patch!patch1}
+\index{patch1!htxadvpage4.ht!patch}
+<<htxadvpage4.ht>>=
+\begin{patch}{patch1}
+final
+\end{patch}
+
+@
+\subsection{Patch1 patch}
+\label{Patch1}
+\index{patch!Patch1!htxadvpage4.ht}
+\index{htxadvpage4.ht!patch!Patch1}
+\index{Patch1!htxadvpage4.ht!patch}
+<<htxadvpage4.ht>>=
+\begin{patch}{Patch1}
+\begin{paste}{Paste2}{Patch2}
+\pastebutton{Paste2}{\MenuDotBitmap}
+final
+\end{paste}
+\end{patch}
+
+@
+\subsection{Patch2 patch}
+\label{Patch2}
+\index{patch!Patch2!htxadvpage4.ht}
+\index{htxadvpage4.ht!patch!Patch2}
+\index{Patch2!htxadvpage4.ht!patch}
+<<htxadvpage4.ht>>=
+\begin{patch}{Patch2}
+\begin{paste}{Paste3}{Patch1}
+\pastebutton{Paste3}{\MenuDotBitmap}
+initial
+\end{paste}
+\end{patch}
+
+@
+\section{htxadvpage5.ht}
+\subsection{Axiom paste-ins}
+\label{HTXAdvPage5}
+See HTXAdvPage6 \ref{HTXAdvPage6} on page~\pageref{HTXAdvPage6}
+\index{pages!HTXAdvPage5!htxadvpage5.ht}
+\index{htxadvpage5.ht!pages!HTXAdvPage5}
+\index{HTXAdvPage5!htxadvpage5.ht!pages}
+<<htxadvpage5.ht>>=
+\begin{page}{HTXAdvPage5}{Axiom paste-ins}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+The {\it paste} and {\it patch} facility (see \downlink{previous page}{HTXAdvPage4})
+is used to display (or hide) the Axiom output
+of an Axiom command ({\tt\\axiomcommand})
+included in a
+\HyperName{} page.
+
+A mechanism has been set up to {\it automatically} generate
+these paste-ins. It amounts to replacing an
+{\tt \\axiomcommand} by a {\tt \\pastecommand} in the
+\HyperName{} page.
+
+In the case of a \axiomOp{draw} Axiom command
+, where the result is to create an interactive viewport,
+the appropriate command to use is {\tt \\pastegraph}.
+The effect of this is to include (as the output)
+the Axiom generated {\it image} of the graph
+as an active area. Clicking on it will put up an
+interactive viewport.
+The {\tt \\pastegraph} command should be used only when
+the result of the associated Axiom operation is
+to {\it create} an interactive viewport. It is {\it not} necessarily
+appropriate for all commands whose result
+is a \axiomType{Two{}Dimensional{}Viewport} or \axiomType{Three{}Dimensional{}Viewport}.
+The {\tt \\pastecommand} and {\tt \\pastegraph}
+are  macros defined in {\bf util.ht}.
+
+
+
+There is no automatic paste-in generation facility
+for Axiom piles (the {\tt \\begin\{axiomsrc\}} command).
+
+
+The automatic paste-in generation mechanism works
+by invoking Axiom with a particular option.
+\HyperName{} is also started automatically. It reads
+the {\tt \\pastecommand} and {\tt \\pastegraph}
+commands in all pages in a specified
+{\bf somefile.ht}  and passes them to
+Axiom for evaluation. \HyperName{}
+captures the output and writes it out (to a
+file called {\bf somefile.pht}) as the body of
+some {\it patch} definitions. The commands
+encountered are written to a file
+{\bf somefile.input} which you can {\tt )read} from an Axiom session.
+It also creates directories for the graphics
+images encountered. Those files and directories
+will be written under the {\it current} directory.
+The idea is that you then include the {\it patch} definitions
+in {\bf somefile.pht} in your local database using {\bf htadd}.
+
+
+You can try this feature now. Edit a file called, say, {\bf trypaste.ht}
+in a directory, say {\bf /tmp}. Put the following \HyperName{} text
+in it.
+\beginImportant
+\newline
+{\tt \\begin\{page\}\{TryPaste\}\{Trying out paste-in generation\}}\newline
+{\tt \\begin\{scroll\}}\newline
+{\tt \\pastecommand\{f z == z**2 \\bound\{f\}\}}\newline
+{\tt \\pastegraph\{draw(f,-1..1) \\free\{f\}\}}\newline
+{\tt \\pastecommand\{x:= f 3 \\free\{f\}\}}\newline
+{\tt \\end\{scroll\}}\newline
+{\tt \\end\{page\}}\newline
+\endImportant
+
+From the directory that contains the {\bf trypaste.ht},
+issue
+\centerline{
+{\tt htadd -l ./trypaste.ht}
+}
+You will get the
+{\bf ht.db} database file.
+Set the environment variable {\tt HTPATH} so that
+it points first to your directory and then the system directory.
+In the {\bf /bin/csh}, you might use
+\centerline{
+{\tt setenv HTPATH /tmp:\$AXIOM/doc/hypertex/pages}
+}
+Make sure that no {\bf trypaste.input} or {\bf trypaste.pht}
+files exist in the directory.
+Then issue
+\centerline{
+{\tt axiom -paste trypaste.ht}
+}
+ and wait for
+Axiom to finish.
+
+There is a modification you will wish to make to
+the {\bf trypaste.pht} file.
+This is because the generated \HyperName{} text will assume that
+the {\it viewport} data will be located in the
+{\it system} directory.
+\centerline{{\bf \env{AXIOM}/doc/viewports}}
+You may want to place your images in a different directory,
+say, {\bf /u/sugar/viewports}.
+If so, then change all occurences of
+\beginImportant
+\newline
+{\tt \\env\{AXIOM\}/doc/viewports/}
+\centerline{{\it by}}
+{\tt /u/sugar/viewports/}
+\endImportant
+in the file {\bf trypaste.pht}. The last step
+is to include the {\it patch} definitions
+in {\bf trypaste.pht} to your local database.
+Issue
+\centerline{
+{\tt htadd -l ./trypaste.pht}
+}
+to update the database. If you have provided
+a link to your pages from the {\tt RootPage}
+via the {\tt \\localinfo} macro, you should now
+be able to start Axiom or \HyperName{}
+and see the computed Axiom output whenever you
+click on the buttons to the left of each command.
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next Page --- Miscellaneous}{HTXAdvPage6}
+\endmenu
+
+\end{page}
+
+@
+\section{htxadvpage6.ht}
+\subsection{Miscellaneous}
+\label{HTXAdvPage6}
+See HTXAdvTopPage \ref{HTXAdvTopPage} on page~\pageref{HTXAdvTopPage}
+\index{pages!HTXAdvPage6!htxadvpage6.ht}
+\index{htxadvpage6.ht!pages!HTXAdvPage6}
+\index{HTXAdvPage6!htxadvpage6.ht!pages}
+<<htxadvpage6.ht>>=
+\begin{page}{HTXAdvPage6}{Miscellaneous}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+
+We present here a few commands that may be of some use
+to you.
+You may want to know certain parameters so that you can pass
+them to one of the action {\tt \\command}s.
+
+The {\tt \\thispage} command shows the name of the
+current page.
+
+\beginImportant
+\begin{paste}{HTXAdvPage6xPaste1}{HTXAdvPage6xPatch1}
+\pastebutton{HTXAdvPage6xPaste1}{Interpret}
+\newline
+{\tt \\thispage}\newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{Lisp\}\{(pprint "\\thispage")\}}\newline
+\end{paste}
+\endImportant
+
+
+The {\tt \\windowid} command shows the X Windows
+{\it WindowID} of the current window.
+
+\beginImportant
+\begin{paste}{HTXAdvPage6xPaste2}{HTXAdvPage6xPatch2}
+\pastebutton{HTXAdvPage6xPaste2}{Interpret}
+\newline
+{\tt \\windowid}\newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{Lisp\}\{(pprint \\windowid)\}}\newline
+\end{paste}
+\endImportant
+
+% \examplenumber not documented
+
+The {\tt \\env} command gets the value of an environment
+variable. It is an error to use {\tt \\env} with an undefined
+environment variable.
+
+\beginImportant
+\begin{paste}{HTXAdvPage6xPaste3}{HTXAdvPage6xPatch3}
+\pastebutton{HTXAdvPage6xPaste3}{Interpret}
+\newline
+{\tt \\env\{AXIOM\}}
+\end{paste}
+\endImportant
+
+
+The {\tt \\nolines} command, if included somewhere
+in the page, eliminates the horizontal lines that
+delimit the header and footer regions.
+
+
+% \beep not documented
+
+%\returnbutton{homebutton}{ReturnPage}
+
+%\upbutton{upbutton}{UpPage}
+
+
+\end{scroll}
+\beginmenu
+\menulink{Back to Menu}{HTXAdvTopPage}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXAdvPage6xPatch1 patch}
+\label{HTXAdvPage6xPatch1}
+\index{patch!HTXAdvPage6xPatch1!htxadvpage6.ht}
+\index{htxadvpage6.ht!patch!HTXAdvPage6xPatch1}
+\index{HTXAdvPage6xPatch1!htxadvpage6.ht!patch}
+<<htxadvpage6.ht>>=
+\begin{patch}{HTXAdvPage6xPatch1}
+\begin{paste}{HTXAdvPage6xPaste1A}{HTXAdvPage6xPatch1A}
+\pastebutton{HTXAdvPage6xPaste1A}{Source}
+\newline
+\thispage
+\newline
+\lispcommand{Lisp}{(pprint "\thispage")}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXAdvPage6xPatch1A patch}
+\label{HTXAdvPage6xPatch1A}
+\index{patch!HTXAdvPage6xPatch1A!htxadvpage6.ht}
+\index{htxadvpage6.ht!patch!HTXAdvPage6xPatch1A}
+\index{HTXAdvPage6xPatch1A!htxadvpage6.ht!patch}
+<<htxadvpage6.ht>>=
+\begin{patch}{HTXAdvPage6xPatch1A}
+\begin{paste}{HTXAdvPage6xPaste1B}{HTXAdvPage6xPatch1}
+\pastebutton{HTXAdvPage6xPaste1B}{Interpret}
+\newline
+{\tt \\thispage}\newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{Lisp\}\{(pprint "\\thispage")\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXAdvPage6xPatch2 patch}
+\label{HTXAdvPage6xPatch2}
+\index{patch!HTXAdvPage6xPatch2!htxadvpage6.ht}
+\index{htxadvpage6.ht!patch!HTXAdvPage6xPatch2}
+\index{HTXAdvPage6xPatch2!htxadvpage6.ht!patch}
+<<htxadvpage6.ht>>=
+\begin{patch}{HTXAdvPage6xPatch2}
+\begin{paste}{HTXAdvPage6xPaste2A}{HTXAdvPage6xPatch2A}
+\pastebutton{HTXAdvPage6xPaste2A}{Source}
+\newline
+\windowid
+\newline
+\lispcommand{Lisp}{(pprint \windowid)}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXAdvPage6xPatch2A patch}
+\label{HTXAdvPage6xPatch2A}
+\index{patch!HTXAdvPage6xPatch2A!htxadvpage6.ht}
+\index{htxadvpage6.ht!patch!HTXAdvPage6xPatch2A}
+\index{HTXAdvPage6xPatch2A!htxadvpage6.ht!patch}
+<<htxadvpage6.ht>>=
+\begin{patch}{HTXAdvPage6xPatch2A}
+\begin{paste}{HTXAdvPage6xPaste2B}{HTXAdvPage6xPatch2}
+\pastebutton{HTXAdvPage6xPaste2B}{Interpret}
+\newline
+{\tt \\windowid}\newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{Lisp\}\{(pprint \\windowid)\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXAdvPage6xPatch3 patch}
+\label{HTXAdvPage6xPatch3}
+\index{patch!HTXAdvPage6xPatch3!htxadvpage6.ht}
+\index{htxadvpage6.ht!patch!HTXAdvPage6xPatch3}
+\index{HTXAdvPage6xPatch3!htxadvpage6.ht!patch}
+<<htxadvpage6.ht>>=
+\begin{patch}{HTXAdvPage6xPatch3}
+\begin{paste}{HTXAdvPage6xPaste3A}{HTXAdvPage6xPatch3A}
+\pastebutton{HTXAdvPage6xPaste3A}{Source}
+\newline
+\env{AXIOM}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXAdvPage6xPatch3A patch}
+\label{HTXAdvPage6xPatch3A}
+\index{patch!HTXAdvPage6xPatch3A!htxadvpage6.ht}
+\index{htxadvpage6.ht!patch!HTXAdvPage6xPatch3A}
+\index{HTXAdvPage6xPatch3A!htxadvpage6.ht!patch}
+<<htxadvpage6.ht>>=
+\begin{patch}{HTXAdvPage6xPatch3A}
+\begin{paste}{HTXAdvPage6xPaste3B}{HTXAdvPage6xPatch3}
+\pastebutton{HTXAdvPage6xPaste3B}{Interpret}
+\newline
+{\tt \\env\{AXIOM\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\section{htxadvtoppage.ht}
+\subsection{Advanced features in Hyperdoc}
+\label{HTXAdvTopPage}
+\begin{itemize}
+\item HTXAdvPage1 \ref{HTXAdvPage1} on page~\pageref{HTXAdvPage1}
+\item HTXAdvPage2 \ref{HTXAdvPage2} on page~\pageref{HTXAdvPage2}
+\item HTXAdvPage3 \ref{HTXAdvPage3} on page~\pageref{HTXAdvPage3}
+\item HTXAdvPage4 \ref{HTXAdvPage4} on page~\pageref{HTXAdvPage4}
+\item HTXAdvPage5 \ref{HTXAdvPage5} on page~\pageref{HTXAdvPage5}
+\item HTXAdvPage6 \ref{HTXAdvPage6} on page~\pageref{HTXAdvPage6}
+\end{itemize}
+\index{pages!HTXAdvTopPage!htxadvtoppage.ht}
+\index{htxadvtoppage.ht!pages!HTXAdvTopPage}
+\index{HTXAdvTopPage!htxadvtoppage.ht!pages}
+<<htxadvtoppage.ht>>=
+\begin{page}{HTXAdvTopPage}{Advanced features in Hyperdoc}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\beginscroll
+\beginmenu
+\menudownlink{Creating input areas}{HTXAdvPage1}
+\menudownlink{Creating radio boxes}{HTXAdvPage2}
+\menudownlink{Define new macros     }{HTXAdvPage3}
+\menudownlink{Using patch and paste}{HTXAdvPage4}
+\menudownlink{Generate paste-ins for Axiom commands}{HTXAdvPage5}
+\menudownlink{Miscellaneous}{HTXAdvPage6}
+\endmenu
+\endscroll
+\end{page}
+
+@
+\section{htxformatpage1.ht}
+\subsection{Using the special characters}
+\label{HTXFormatPage1}
+See HTXFormatPage2 \ref{HTXFormatPage2} on page~\pageref{HTXFormatPage2}
+\index{pages!HTXFormatPage1!htxformatpage1.ht}
+\index{htxformatpage1.ht!pages!HTXFormatPage1}
+\index{HTXFormatPage1!htxformatpage1.ht!pages}
+<<htxformatpage1.ht>>=
+\begin{page}{HTXFormatPage1}{Using the special characters}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+You can display the special characters ({\tt \$ \\ \{ \{ \[ \] \% \#})
+by simply inserting the backslash {\tt \\} character just before any 
+one of them. So,
+\beginImportant
+\begin{paste}{HTXFormatPage1xPaste1}{HTXFormatPage1xPatch1}
+\pastebutton{HTXFormatPage1xPaste1}{Interpret}
+\newline
+{\tt the characters \\\$, \\\\, \\\{, \\\}, \\\[, \\\], \\\%, \\\# }
+\end{paste}
+\endImportant
+
+
+The {\tt \%} character is used in \HyperName{} as a comment marker.
+If it is encountered on any line (without being preceded by the {\tt \\}
+ character,
+of course), \HyperName{} will ignore all remaining characters on that line.
+\beginImportant
+\begin{paste}{HTXFormatPage1xPaste2}{HTXFormatPage1xPatch2}
+\pastebutton{HTXFormatPage1xPaste2}{Interpret}
+\newline
+{\tt  the latest figures indicate \% GET THE LATEST FIGURES}\newline
+{\tt a steady rise}\indent{0}
+\end{paste}
+\endImportant
+
+Earlier versions of \HyperName{} merged the words "indicate" and "a"
+into one word in the example above. This no longer occurs.
+
+%The two lines below are from Release 1.x
+%Note that you must leave a space at the beginning of the line after the comment,
+%otherwise \HyperName{} would treat "indicate" and "a" as one word.
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Formatting without commands}{HTXFormatPage2}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXFormatPage1xPatch1 patch}
+\label{HTXFormatPage1xPatch1}
+\index{patch!HTXFormatPage1xPatch1!htxformatpage1.ht}
+\index{htxformatpage1.ht!patch!HTXFormatPage1xPatch1}
+\index{HTXFormatPage1xPatch1!htxformatpage1.ht!patch}
+<<htxformatpage1.ht>>=
+\begin{patch}{HTXFormatPage1xPatch1}
+\begin{paste}{HTXFormatPage1xPaste1A}{HTXFormatPage1xPatch1A}
+\pastebutton{HTXFormatPage1xPaste1A}{Source}
+\newline
+the characters \$, \\, \{, \}, \[, \],  \%, \#
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage1xPatch1A}
+\begin{paste}{HTXFormatPage1xPaste1B}{HTXFormatPage1xPatch1}
+\pastebutton{HTXFormatPage1xPaste1B}{Interpret}
+\newline
+{\tt the characters \\\$, \\\\, \\\{, \\\}, \\\[, \\\], \\\%, \\\# }
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage1xPatch2 patch}
+\label{HTXFormatPage1xPatch2}
+\index{patch!HTXFormatPage1xPatch2!htxformatpage1.ht}
+\index{htxformatpage1.ht!patch!HTXFormatPage1xPatch2}
+\index{HTXFormatPage1xPatch2!htxformatpage1.ht!patch}
+<<htxformatpage1.ht>>=
+\begin{patch}{HTXFormatPage1xPatch2}
+\begin{paste}{HTXFormatPage1xPaste2A}{HTXFormatPage1xPatch2A}
+\pastebutton{HTXFormatPage1xPaste2A}{Source}
+\newline
+the latest figures indicate % GET THE LATEST FIGURES
+a steady rise
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage1xPatch2A}
+\begin{paste}{HTXFormatPage1xPaste2B}{HTXFormatPage1xPatch2}
+\pastebutton{HTXFormatPage1xPaste2B}{Interpret}
+\newline
+{\tt  the latest figures indicate \% GET THE LATEST FIGURES}\newline
+{\tt a steady rise}\indent{0}
+\end{paste}
+\end{patch}
+
+@
+\section{htxformatpage2.ht}
+\subsection{Formatting without commands}
+\label{HTXFormatPage2}
+\index{pages!HTXFormatPage2!htxformatpage2.ht}
+\index{htxformatpage2.ht!pages!HTXFormatPage2}
+\index{HTXFormatPage2!htxformatpage2.ht!pages}
+<<htxformatpage2.ht>>=
+\begin{page}{HTXFormatPage2}{Formatting without commands}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+\HyperName{} will interpret normal text in a {\em source file}
+according to the following rules. \newline
+\menuitemstyle{\indentrel{4}
+Spaces mark the ends of words. The number of spaces between
+words is {\em not} significant, that is, you cannot control word spacing
+by inserting or removing extra space characters.
+\indentrel{-4}}
+\beginImportant
+\begin{paste}{HTXFormatPage2xxPaste1}{HTXFormatPage2xPatch1}
+\pastebutton{HTXFormatPage2xxPaste1}{Interpret}
+\begin{verbatim}
+word    spacing is       not  important
+\end{verbatim}
+\end{paste}
+\endImportant
+\menuitemstyle{\indentrel{4}
+End-of-line  characters are not significant.
+You can break up lines in the source file as you like. The end-of-line
+will be interpreted as a space. 
+Take advantage of this feature to improve the readability of the
+source file.
+\indentrel{-4}}
+\beginImportant
+\begin{paste}{HTXFormatPage2xxPaste2}{HTXFormatPage2xPatch2}
+\pastebutton{HTXFormatPage2xxPaste2}{Interpret}
+\begin{verbatim}
+This is
+one
+sentence.
+\end{verbatim}
+\end{paste}
+\endImportant
+\menuitemstyle{\indentrel{4}
+A blank line marks the end of a paragraph. 
+Leaving more blank lines that necessary has no effect.
+\indentrel{-4}}
+\beginImportant
+\begin{paste}{HTXFormatPage2xxPaste3}{HTXFormatPage2xPatch3}
+\pastebutton{HTXFormatPage2xxPaste3}{Interpret}
+\begin{verbatim}
+some end.% A COMMENT
+
+
+Start a paragraph
+
+Start another paragraph.
+\end{verbatim}
+\end{paste}
+\endImportant
+\menuitemstyle{\indentrel{4}
+The two-character combination {\tt \{\}} can be used to indicate
+possible breaking of long words. It does not affect the formatting
+in any other way.
+\indentrel{-4}}
+\beginImportant
+\begin{paste}{HTXFormatPage2xxPaste4}{HTXFormatPage2xPatch4}
+\pastebutton{HTXFormatPage2xxPaste4}{Interpret}
+\begin{verbatim}
+Generalized{}Multivariate{}Factorize
+One{}Dimensional{}Array{}Aggregate
+Elementary{}Function{}Definite{}Integration
+Elementary{}Functions{}Univariate{}Puiseux{}Series
+Finite{}Field{}Cyclic{}Group{}Extension{}ByPolynomial
+\end{verbatim}
+\end{paste}
+\endImportant
+
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Using different fonts}{HTXFormatPage3}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXFormatPage2xPatch1 patch}
+\label{HTXFormatPage2xPatch1}
+\index{patch!HTXFormatPage2xPatch1!htxformatpage2.ht}
+\index{htxformatpage2.ht!patch!HTXFormatPage2xPatch1}
+\index{HTXFormatPage2xPatch1!htxformatpage2.ht!patch}
+<<htxformatpage2.ht>>=
+\begin{patch}{HTXFormatPage2xPatch1}
+\begin{paste}{HTXFormatPage2xxPaste1A}{HTXFormatPage2xPatch1A}
+\pastebutton{HTXFormatPage2xxPaste1A}{Source}
+\newline
+word    spacing is       not  important
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage2xPatch1A}
+\begin{paste}{HTXFormatPage2xxPaste1B}{HTXFormatPage2xPatch1}
+\pastebutton{HTXFormatPage2xxPaste1B}{Interpret}
+\begin{verbatim}
+word    spacing is       not  important
+\end{verbatim}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage2xPatch2 patch}
+\label{HTXFormatPage2xPatch2}
+\index{patch!HTXFormatPage2xPatch2!htxformatpage2.ht}
+\index{htxformatpage2.ht!patch!HTXFormatPage2xPatch2}
+\index{HTXFormatPage2xPatch2!htxformatpage2.ht!patch}
+<<htxformatpage2.ht>>=
+\begin{patch}{HTXFormatPage2xPatch2}
+\begin{paste}{HTXFormatPage2xxPaste2A}{HTXFormatPage2xPatch2A}
+\pastebutton{HTXFormatPage2xxPaste2A}{Source}
+\newline
+This is
+one
+sentence.
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage2xPatch2A patch}
+\label{HTXFormatPage2xPatch2A}
+\index{patch!HTXFormatPage2xPatch2A!htxformatpage2.ht}
+\index{htxformatpage2.ht!patch!HTXFormatPage2xPatch2A}
+\index{HTXFormatPage2xPatch2A!htxformatpage2.ht!patch}
+<<htxformatpage2.ht>>=
+\begin{patch}{HTXFormatPage2xPatch2A}
+\begin{paste}{HTXFormatPage2xxPaste2B}{HTXFormatPage2xPatch2}
+\pastebutton{HTXFormatPage2xxPaste2B}{Interpret}
+\begin{verbatim}
+This is
+one
+sentence.
+\end{verbatim}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage2xPatch3 patch}
+\label{HTXFormatPage2xPatch3}
+\index{patch!HTXFormatPage2xPatch3!htxformatpage2.ht}
+\index{htxformatpage2.ht!patch!HTXFormatPage2xPatch3}
+\index{HTXFormatPage2xPatch3!htxformatpage2.ht!patch}
+<<htxformatpage2.ht>>=
+\begin{patch}{HTXFormatPage2xPatch3}
+\begin{paste}{HTXFormatPage2xxPaste3A}{HTXFormatPage2xPatch3A}
+\pastebutton{HTXFormatPage2xxPaste3A}{Source}
+\newline
+some end.% A COMMENT
+
+
+Start a paragraph.
+
+Start another paragraph.
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage2xPatch3A patch}
+\label{HTXFormatPage2xPatch3A}
+\index{patch!HTXFormatPage2xPatch3A!htxformatpage2.ht}
+\index{htxformatpage2.ht!patch!HTXFormatPage2xPatch3A}
+\index{HTXFormatPage2xPatch3A!htxformatpage2.ht!patch}
+<<htxformatpage2.ht>>=
+\begin{patch}{HTXFormatPage2xPatch3A}
+\begin{paste}{HTXFormatPage2xxPaste3B}{HTXFormatPage2xPatch3}
+\pastebutton{HTXFormatPage2xxPaste3B}{Interpret}
+\begin{verbatim}
+some end.% A COMMENT
+
+
+Start a paragraph
+
+Start another paragraph.
+\end{verbatim}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage2xPatch4 patch}
+\label{HTXFormatPage2xPatch4}
+\index{patch!HTXFormatPage2xPatch4!htxformatpage2.ht}
+\index{htxformatpage2.ht!patch!HTXFormatPage2xPatch4}
+\index{HTXFormatPage2xPatch4!htxformatpage2.ht!patch}
+<<htxformatpage2.ht>>=
+\begin{patch}{HTXFormatPage2xPatch4}
+\begin{paste}{HTXFormatPage2xxPaste4A}{HTXFormatPage2xPatch4A}
+\pastebutton{HTXFormatPage2xxPaste4A}{Source}
+\newline
+Generalized{}Multivariate{}Factorize
+One{}Dimensional{}Array{}Aggregate
+Elementary{}Function{}Definite{}Integration
+Elementary{}Functions{}Univariate{}Puiseux{}Series
+Finite{}Field{}Cyclic{}Group{}Extension{}ByPolynomial
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage2xPatch4A patch}
+\label{HTXFormatPage2xPatch4A}
+\index{patch!HTXFormatPage2xPatch4A!htxformatpage2.ht}
+\index{htxformatpage2.ht!patch!HTXFormatPage2xPatch4A}
+\index{HTXFormatPage2xPatch4A!htxformatpage2.ht!patch}
+<<htxformatpage2.ht>>=
+\begin{patch}{HTXFormatPage2xPatch4A}
+\begin{paste}{HTXFormatPage2xxPaste4B}{HTXFormatPage2xPatch4}
+\pastebutton{HTXFormatPage2xxPaste4B}{Interpret}
+\begin{verbatim}
+Generalized{}Multivariate{}Factorize
+One{}Dimensional{}Array{}Aggregate
+Elementary{}Function{}Definite{}Integration
+Elementary{}Functions{}Univariate{}Puiseux{}Series
+Finite{}Field{}Cyclic{}Group{}Extension{}ByPolynomial
+\end{verbatim}
+\end{paste}
+\end{patch}
+
+@
+\section{htxformatpage3.ht}
+\subsection{Using different fonts}
+\label{HTXFormatPage3}
+\index{pages!HTXFormatPage3!htxformatpage3.ht}
+\index{htxformatpage3.ht!pages!HTXFormatPage3}
+\index{HTXFormatPage3!htxformatpage3.ht!pages}
+<<htxformatpage3.ht>>=
+\begin{page}{HTXFormatPage3}{Using different fonts}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+You can use various fonts for the text. \HyperName{} makes
+four {\em logical} fonts available to you: a {\em roman} font, an
+{\em emphasised} font, a {\em bold} font and a
+{\em typewriter} font. The actual font that corresponds to
+each logical font is determined by the end user via a
+defaults file. The colour for each of these fonts can also
+be specified.
+
+Normal text is displayed with the roman font.
+If you want to emphasize some text, use the {\tt \\em}
+command in the following way.
+\beginImportant
+\begin{paste}{HTXFormatPage3xPaste1}{HTXFormatPage3xPatch1}
+\pastebutton{HTXFormatPage3xPaste1}{Interpret}
+\newline
+{\tt this is \{\\em emphasised\} text}
+\end{paste}
+\endImportant
+
+Note the use of the braces to enclose command and "arguments".
+All font commands are specified in the same way. The {\tt \\em} command
+will in fact {\em switch} between roman and emphasised
+font every time it is used.
+\beginImportant
+\begin{paste}{HTXFormatPage3xPaste2}{HTXFormatPage3xPatch2}
+\pastebutton{HTXFormatPage3xPaste2}{Interpret}
+\newline
+{\tt \{\\em this is \{\\em emphasised\} text\}}
+\end{paste}
+\endImportant
+
+If you want to be sure that the emphasized font will be used, specify
+the {\tt \\it} command. Similarly, you can explicitly select the roman font
+with the {\tt \\rm} command.
+\beginImportant
+\begin{paste}{HTXFormatPage3xPaste3}{HTXFormatPage3xPatch3}
+\pastebutton{HTXFormatPage3xPaste3}{Interpret}
+\newline
+{\tt \{\\em this is \{\\it emphasised\} text and this is \{\\rm roman\}\}}
+\end{paste}
+\endImportant
+
+
+The bold font is selected with the {\tt \\bf} command and the typewriter
+font with the {\tt \\tt} command. All these commands can be applied to
+individual characters, words, sentences etc.
+\beginImportant
+\begin{paste}{HTXFormatPage3xPaste4}{HTXFormatPage3xPatch4}
+\pastebutton{HTXFormatPage3xPaste4}{Interpret}
+\newline
+{\tt \{\\bf U\}\{\\tt g\}\{\\it l\}\{\\rm y\}}
+\end{paste}
+\endImportant
+
+
+Currently, \HyperName{} does not adjust its internal spacing rules
+to each font individually. This means that, for consistent results,
+users are encouraged to specify (in the defaults file)
+"character-cell" fonts that are not
+too small or too large for \HyperName{}. Here is the correspondence
+between the above font commands and the defaults names:\newline
+\menuitemstyle{RmFont \tab{26} {\tt \\rm} or {\tt \\em} }\newline
+\menuitemstyle{BoldFont \tab{26} {\tt \\bf} }\newline
+\menuitemstyle{EmphasizeFont \tab{26} {\tt \\it} or {\tt \\em} }\newline
+\menuitemstyle{Ttfont \tab{26} {\tt \\tt} }\newline
+
+\HyperName{} uses two more logical fonts that can be specified by
+the end user : AxiomFont and ActiveFont. However, you cannot
+explicitly use these fonts in your text. The ActiveFont is automatically
+used for active area text and the AxiomFont is reserved for
+active Axiom commands.
+
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Indentation}{HTXFormatPage4}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXFormatPage3xPatch1 patch}
+\label{HTXFormatPage3xPatch1}
+\index{patch!HTXFormatPage3xPatch1!htxformatpage3.ht}
+\index{htxformatpage3.ht!patch!HTXFormatPage3xPatch1}
+\index{HTXFormatPage3xPatch1!htxformatpage3.ht!patch}
+<<htxformatpage3.ht>>=
+\begin{patch}{HTXFormatPage3xPatch1}
+\begin{paste}{HTXFormatPage3xPaste1A}{HTXFormatPage3xPatch1A}
+\pastebutton{HTXFormatPage3xPaste1A}{Source}
+\newline
+this is {\em emphasised} text
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage3xPatch1A}
+\begin{paste}{HTXFormatPage3xPaste1B}{HTXFormatPage3xPatch1}
+\pastebutton{HTXFormatPage3xPaste1B}{Interpret}
+\newline
+{\tt this is \{\\em emphasised\} text}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage3xPatch2 patch}
+\label{HTXFormatPage3xPatch2}
+\index{patch!HTXFormatPage3xPatch2!htxformatpage3.ht}
+\index{htxformatpage3.ht!patch!HTXFormatPage3xPatch2}
+\index{HTXFormatPage3xPatch2!htxformatpage3.ht!patch}
+<<htxformatpage3.ht>>=
+\begin{patch}{HTXFormatPage3xPatch2}
+\begin{paste}{HTXFormatPage3xPaste2A}{HTXFormatPage3xPatch2A}
+\pastebutton{HTXFormatPage3xPaste2A}{Source}
+\newline
+{\em this is {\em emphasised} text}
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage3xPatch2A}
+\begin{paste}{HTXFormatPage3xPaste2B}{HTXFormatPage3xPatch2}
+\pastebutton{HTXFormatPage3xPaste2B}{Interpret}
+\newline
+{\tt \{\\em this is \{\\em emphasised\} text\}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage3xPatch3 patch}
+\label{HTXFormatPage3xPatch3}
+\index{patch!HTXFormatPage3xPatch3!htxformatpage3.ht}
+\index{htxformatpage3.ht!patch!HTXFormatPage3xPatch3}
+\index{HTXFormatPage3xPatch3!htxformatpage3.ht!patch}
+<<htxformatpage3.ht>>=
+\begin{patch}{HTXFormatPage3xPatch3}
+\begin{paste}{HTXFormatPage3xPaste3A}{HTXFormatPage3xPatch3A}
+\pastebutton{HTXFormatPage3xPaste3A}{Source}
+\newline
+{\em this is {\it emphasised} text and this is {\rm roman}}
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage3xPatch3A}
+\begin{paste}{HTXFormatPage3xPaste3B}{HTXFormatPage3xPatch3}
+\pastebutton{HTXFormatPage3xPaste3B}{Interpret}
+\newline
+{\tt \{\\em this is \{\\it emphasised\} text and this is \{\\rm roman\}\}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage3xPatch4 patch}
+\label{HTXFormatPage3xPatch4}
+\index{patch!HTXFormatPage3xPatch4!htxformatpage3.ht}
+\index{htxformatpage3.ht!patch!HTXFormatPage3xPatch4}
+\index{HTXFormatPage3xPatch4!htxformatpage3.ht!patch}
+<<htxformatpage3.ht>>=
+\begin{patch}{HTXFormatPage3xPatch4}
+\begin{paste}{HTXFormatPage3xPaste4A}{HTXFormatPage3xPatch4A}
+\pastebutton{HTXFormatPage3xPaste4A}{Source}
+\newline
+{\bf U}{\tt g}{\it l}{\rm y}
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage3xPatch4A}
+\begin{paste}{HTXFormatPage3xPaste4B}{HTXFormatPage3xPatch4}
+\pastebutton{HTXFormatPage3xPaste4B}{Interpret}
+\newline
+{\tt \{\\bf U\}\{\\tt g\}\{\\it l\}\{\\rm y\}}
+\end{paste}
+\end{patch}
+
+@
+\section{htxformatpage4.ht}
+\subsection{Indentation}
+\label{HTXFormatPage4}
+\index{pages!HTXFormatPage4!htxformatpage4.ht}
+\index{htxformatpage4.ht!pages!HTXFormatPage4}
+\index{HTXFormatPage4!htxformatpage4.ht!pages}
+<<htxformatpage4.ht>>=
+\begin{page}{HTXFormatPage4}{Indentation}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+You can control the indentation of lines of text in \HyperName{} with
+some useful commands.
+Use the command {\tt \\par} to force a new paragraph if you don't want
+to use the blank-line rule. The first line of a new paragraph
+will normally be indented by a standard small amount. If you
+just want to start on a new line, use the {\tt \\newline}
+command.
+\beginImportant
+\begin{paste}{HTXFormatPage4xPaste1}{HTXFormatPage4xPatch1}
+\pastebutton{HTXFormatPage4xPaste1}{Interpret}
+\newline
+{\tt let us start a new line \\newline here }
+\end{paste}
+\endImportant
+
+The  command {\tt \\indent\{{\it value}\}} will
+set the left-page-margin {\it value} characters
+to the right of the standard left-page-margin.
+The initial (standard) state of a page can be reset by the
+{\tt \\indent\{0\}} command.
+The first lines of paragraphs will be indented
+by the {\it extra} standard  amount. The {\tt \\indent\{{\it value}\}}
+command does {\em not} force a new line or paragraph.
+
+You can also use the {\tt \\indentrel\{{\it value}\}} command.
+Here, the {\it value} argument is a {\em relative} indentation
+which can be positive or negative.
+Otherwise, it behaves in the same way as the {\tt \\indent} command.
+\beginImportant
+\begin{paste}{HTXFormatPage4xPaste2}{HTXFormatPage4xPatch2}
+\pastebutton{HTXFormatPage4xPaste2}{Interpret}
+\newline
+{\tt let us start a new line \\newline \\indent\{10\} here }\newline
+{\tt \\newline \\indentrel\{-5\} there}\newline
+{\tt \\newline \\indentrel\{-5\} back}
+\end{paste}
+\endImportant
+
+The {\tt \\centerline\{{\it some text}\}} command will center its
+argument between the current left and right margins. The argument of
+the command should not be more than a paragraph of text and should not contain
+any commands that change the left margin. The centered text will
+start on a new line.
+\beginImportant
+\begin{paste}{HTXFormatPage4xPaste3}{HTXFormatPage4xPatch3}
+\pastebutton{HTXFormatPage4xPaste3}{Interpret}
+\newline
+{\tt previous text. \\centerline\{This could}\newline
+{\tt be some heading.\} Carry on}
+\end{paste}
+\endImportant
+
+Placing text in vertically aligned columns is easily done with the
+{\tt \\tab\{{\it value}\}} command. The {\tt \\tab} command has the
+immediate effect of placing the next word {\it value} characters to
+the right of the current left margin.
+\beginImportant
+\begin{paste}{HTXFormatPage4xPaste4}{HTXFormatPage4xPatch4}
+\pastebutton{HTXFormatPage4xPaste4}{Interpret}
+\newline
+{\tt \\indent\{5\}\\newline}\newline
+{\tt Team A \\tab\{17\}Score\\tab\{25\}Team B\\tab\{42\}Score\\newline}\newline
+{\tt 012345678901234567890123456789012345678901234567890\\newline}\newline
+{\tt Green-Red\\tab\{17\}4\\tab\{25\}Blue-Black\\tab\{42\}6\\newline}\newline
+{\tt \\indent\{0\}}
+\end{paste}
+\endImportant
+
+If you wish to preserve the indentation of a piece of text
+you can use the {\tt verbatim} group command. Simply place
+a {\tt \\begin\{verbatim\}} and {\tt \\end\{verbatim\}} around
+the text. Note that \HyperName{} commands will
+not be interpreted within the {\tt verbatim} group.
+\beginImportant
+\begin{paste}{HTXFormatPage4xPaste5}{HTXFormatPage4xPatch5}
+\pastebutton{HTXFormatPage4xPaste5}{Interpret}
+\newline
+{\tt \\begin\{verbatim\}}
+\begin{verbatim}
+This    spacing     will be      preserved
+                    {\bf is}     preserved
+\end{verbatim}
+{\tt \\end\{verbatim\}}\newline
+\end{paste}
+
+
+
+
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Creating Lists and Tables}{HTXFormatPage5}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXFormatPage4xPatch1 patch}
+\label{HTXFormatPage4xPatch1}
+\index{patch!HTXFormatPage4xPatch1!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch1}
+\index{HTXFormatPage4xPatch1!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch1}
+\begin{paste}{HTXFormatPage4xPaste1A}{HTXFormatPage4xPatch1A}
+\pastebutton{HTXFormatPage4xPaste1A}{Source}
+\newline
+let us start a new line \newline here
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage4xPatch1A patch}
+\label{HTXFormatPage4xPatch1A}
+\index{patch!HTXFormatPage4xPatch1A!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch1A}
+\index{HTXFormatPage4xPatch1A!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch1A}
+\begin{paste}{HTXFormatPage4xPaste1B}{HTXFormatPage4xPatch1}
+\pastebutton{HTXFormatPage4xPaste1B}{Interpret}
+\newline
+{\tt let us start a new line \\newline here }
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage4xPatch2 patch}
+\label{HTXFormatPage4xPatch2}
+\index{patch!HTXFormatPage4xPatch2!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch2}
+\index{HTXFormatPage4xPatch2!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch2}
+\begin{paste}{HTXFormatPage4xPaste2A}{HTXFormatPage4xPatch2A}
+\pastebutton{HTXFormatPage4xPaste2A}{Source}
+\newline
+let us start a new line\newline\indent{10} here
+\newline\indentrel{-5} there
+\newline\indentrel{-5} back
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage4xPatch2A patch}
+\label{HTXFormatPage4xPatch2A}
+\index{patch!HTXFormatPage4xPatch2A!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch2A}
+\index{HTXFormatPage4xPatch2A!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch2A}
+\begin{paste}{HTXFormatPage4xPaste2B}{HTXFormatPage4xPatch2}
+\pastebutton{HTXFormatPage4xPaste2B}{Interpret}
+\newline
+{\tt let us start a new line \\newline \\indent\{10\} here }\newline
+{\tt \\newline \\indentrel\{-5\} there}\newline
+{\tt \\newline \\indentrel\{-5\} back}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage4xPatch3 patch}
+\label{HTXFormatPage4xPatch3}
+\index{patch!HTXFormatPage4xPatch3!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch3}
+\index{HTXFormatPage4xPatch3!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch3}
+\begin{paste}{HTXFormatPage4xPaste3A}{HTXFormatPage4xPatch3A}
+\pastebutton{HTXFormatPage4xPaste3A}{Source}
+\newline
+previous text. \centerline{This could
+be some heading.} Carry on
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage4xPatch3A patch}
+\label{HTXFormatPage4xPatch3A}
+\index{patch!HTXFormatPage4xPatch3A!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch3A}
+\index{HTXFormatPage4xPatch3A!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch3A}
+\begin{paste}{HTXFormatPage4xPaste3B}{HTXFormatPage4xPatch3}
+\pastebutton{HTXFormatPage4xPaste3B}{Interpret}
+\newline
+{\tt previous text. \\centerline\{This could}\newline
+{\tt be some heading.\} Carry on}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage4xPatch4 patch}
+\label{HTXFormatPage4xPatch4}
+\index{patch!HTXFormatPage4xPatch4!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch4}
+\index{HTXFormatPage4xPatch4!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch4}
+\begin{paste}{HTXFormatPage4xPaste4A}{HTXFormatPage4xPatch4A}
+\pastebutton{HTXFormatPage4xPaste4A}{Source}
+\newline
+\indent{5}\newline
+Team A \tab{17}Score\tab{25}Team B\tab{42}Score\newline
+012345678901234567890123456789012345678901234567890\newline
+Green-Red\tab{17}4\tab{25}Blue-Black\tab{42}6\newline
+\indent{0}
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage4xPatch4A}
+\begin{paste}{HTXFormatPage4xPaste4B}{HTXFormatPage4xPatch4}
+\pastebutton{HTXFormatPage4xPaste4B}{Interpret}
+\newline
+{\tt \\indent\{5\}\\newline}\newline
+{\tt Team A \\tab\{17\}Score\\tab\{25\}Team B\\tab\{42\}Score\\newline}\newline
+{\tt 012345678901234567890123456789012345678901234567890\\newline}\newline
+{\tt Green-Red\\tab\{17\}4\\tab\{25\}Blue-Black\\tab\{42\}6\\newline}\newline
+{\tt \\indent\{0\}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage4xPatch5 patch}
+\label{HTXFormatPage4xPatch5}
+\index{patch!HTXFormatPage4xPatch5!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch5}
+\index{HTXFormatPage4xPatch5!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch5}
+\begin{paste}{HTXFormatPage4xPaste5A}{HTXFormatPage4xPatch5A}
+\pastebutton{HTXFormatPage4xPaste5A}{Source}
+\begin{verbatim}
+This    spacing     will be      preserved
+                    {\bf is}     preserved
+\end{verbatim}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage4xPatch5A patch}
+\label{HTXFormatPage4xPatch5A}
+\index{patch!HTXFormatPage4xPatch5A!htxformatpage4.ht}
+\index{htxformatpage4.ht!patch!HTXFormatPage4xPatch5A}
+\index{HTXFormatPage4xPatch5A!htxformatpage4.ht!patch}
+<<htxformatpage4.ht>>=
+\begin{patch}{HTXFormatPage4xPatch5A}
+\begin{paste}{HTXFormatPage4xPaste5B}{HTXFormatPage4xPatch5}
+\pastebutton{HTXFormatPage4xPaste5B}{Interpret}
+\newline
+{\tt \\begin\{verbatim\}}
+\begin{verbatim}
+This    spacing     will be      preserved
+                    {\bf is}     preserved
+\end{verbatim}
+{\tt \\end\{verbatim\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\section{htxformatpage5.ht}
+\subsection{Creating Lists and Tables}
+\label{HTXFormatPage5}
+See HTXFormatPage6 \ref{HTXFormatPage6} on page~\pageref{HTXFormatPage6}
+\index{pages!HTXFormatPage5!htxformatpage5.ht}
+\index{htxformatpage5.ht!pages!HTXFormatPage5}
+\index{HTXFormatPage5!htxformatpage5.ht!pages}
+<<htxformatpage5.ht>>=
+\begin{page}{HTXFormatPage5}{Creating Lists and Tables}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+The {\tt \\begin\{items\} {\rm -}  \\end\{items\}} 
+group command constructs itemized lists.
+The {\tt \\item} command separates the items in the list.
+The indentation rules for the list group are different from those
+of a paragraph. The first line of an item will
+normally extend further to the left than the rest of the lines.
+Both commands accept {\em optional} arguments.
+Optional arguments are enclosed in square brackets ({\tt \[ \]}) rather
+than braces.
+
+The indentation of subsequent lines in an item is determined by the
+optional argument {\it some text} in the 
+{\tt \\begin\{items\}\[{\it some text}\]}
+command. The optional argument is {\em not} displayed. Its width is calculated
+and used to indent all subsequent lines in the group except from the
+first line of each new item. This indentation rule applies to all text
+{\em before} the first {\tt \\item} command as well.
+
+The {\tt \\item\[{\it some text}\]} command specifies the start of a new item.
+The {\it some text} optional argument will be displayed in {\em bold}
+font at the current left-page-margin. Then, the text following the command
+will be displayed in normal fashion with the above indentation rule.
+\beginImportant
+\begin{paste}{HTXFormatPage5xPaste1}{HTXFormatPage5xPatch1}
+\pastebutton{HTXFormatPage5xPaste1}{Interpret}
+\newline
+{\tt \\indent\{5\}}\newline
+{\tt \\begin\{items\}\[how wide am I\]}\newline
+{\tt Here we carry on but a \\newline} \newline
+{\tt new line will be indented } \newline
+{\tt \\item\[how wide am I\] fits nicely. 
+Here is a \\newline new line in an item.}\newline
+{\tt \\item\[again\] to show another item}\newline
+{\tt \\item\[\\\\tab\]\\tab\{0\} can be used \\tab\{15\} effectively}\newline
+{\tt \\end\{items\}}\newline
+{\tt \\indent\{0\}}\newline
+\end{paste}
+\endImportant
+
+
+Note that the {\tt \\begin\{items\}} command immediately sets the left-
+page-margin to a new value. Subsequent 
+{\tt \\tab} or {\tt \\centerline} commands
+refer to this new margin.
+Any explicit margin setting commands included
+in the group {\em will} have the normal effect.
+The {\tt \\par} command does not produce
+the standard paragraph indentation within a list group --- it behaves
+instead like {\tt \\newline}.
+
+
+You can nest list groups like the following example suggests.
+\beginImportant
+\begin{paste}{HTXFormatPage5xPaste2}{HTXFormatPage5xPatch2}
+\pastebutton{HTXFormatPage5xPaste2}{Interpret}
+\newline
+{\tt \\begin\{items\}\[quitealot\]}\newline
+{\tt A nested list:}\newline
+{\tt \\item\[The first\] item of an itemized list is on this line.}\newline
+{\tt \\item\[The second\] item of the list starts here.  It contains another}\newline
+{\tt list nested inside it.}\newline
+{\tt \\begin\{items\}\[somuchmore\]}\newline
+{\tt \\item \[First\]\\tab\{0\}This is the first item of an enumerated}\newline
+{\tt list that is nested within the itemized list.}\newline
+{\tt \\item \[Second\]\\tab\{0\}This is the second item of the inner list.}\newline
+{\tt \\end\{items\}}\newline
+{\tt This is the rest of the second item of the outer list.  It}\newline
+{\tt is no more interesting than any other part of the item.}\newline
+{\tt \\item\[The third\] item of the list.}\newline
+{\tt \\end\{items\}}\newline
+\end{paste}
+\endImportant
+
+Another facility for presenting lists is the {\tt \\table} command.
+The correct syntax for it is : {\tt \\table\{\{{\it item a}\} \{{\it item b}\} {\it ..}\}}.
+The items in the braces will be placed in as many aligned columns
+as is possible for the current window dimensions or page width.
+If one item is particularly long there will probably be only one column
+in the table. Here is a table of color names.
+\beginImportant
+\begin{paste}{HTXFormatPage5xPaste3}{HTXFormatPage5xPatch3}
+\pastebutton{HTXFormatPage5xPaste3}{Interpret}
+\newline
+{\tt
+\\table\{
+\{Dark Orchid\} \{Dark Salmon\} \{Dark Sea Green\} \{Dark Slate Blue\}
+\{Dark Slate Gray\} \{Dark Turquoise\} \{Dark Violet\} \{Deep Pink\}
+\{Deep Sky Blue\} \{Dodger Blue\} \{Floral White\} \{Forest Green\}
+\{Ghost White\} \{Hot Pink\} \{Indian Red\} \{Lavender Blush\}
+\}
+}
+\end{paste}
+\endImportant
+
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Boxes and Lines}{HTXFormatPage6}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXFormatPage5xPatch1 patch}
+\label{HTXFormatPage5xPatch1}
+\index{patch!HTXFormatPage5xPatch1!htxformatpage5.ht}
+\index{htxformatpage5.ht!patch!HTXFormatPage5xPatch1}
+\index{HTXFormatPage5xPatch1!htxformatpage5.ht!patch}
+<<htxformatpage5.ht>>=
+\begin{patch}{HTXFormatPage5xPatch1}
+\begin{paste}{HTXFormatPage5xPaste1A}{HTXFormatPage5xPatch1A}
+\pastebutton{HTXFormatPage5xPaste1A}{Source}
+\newline
+\indent{5}
+\begin{items}[how wide am I]
+Here we carry on but a \newline
+new line will be indented
+\item[how wide am I] fits nicely. Here is a \newline new line in an item.
+\item[again] to show another item
+\item[\\tab]\tab{0} can be used \tab{15} effectively
+\end{items}
+\indent{0}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage5xPatch1A patch}
+\label{HTXFormatPage5xPatch1A}
+\index{patch!HTXFormatPage5xPatch1A!htxformatpage5.ht}
+\index{htxformatpage5.ht!patch!HTXFormatPage5xPatch1A}
+\index{HTXFormatPage5xPatch1A!htxformatpage5.ht!patch}
+<<htxformatpage5.ht>>=
+\begin{patch}{HTXFormatPage5xPatch1A}
+\begin{paste}{HTXFormatPage5xPaste1B}{HTXFormatPage5xPatch1}
+\pastebutton{HTXFormatPage5xPaste1B}{Interpret}
+\newline
+{\tt \\indent\{5\}}\newline
+{\tt \\begin\{items\}\[how wide am I\]}\newline
+{\tt Here we carry on but a \\newline} \newline
+{\tt new line will be indented } \newline
+{\tt \\item\[how wide am I\] fits nicely. Here is a \\newline new line in an item.}\newline
+{\tt \\item\[again\] to show another item}\newline
+{\tt \\item\[\\\\tab\]\\tab\{0\} can be used \\tab\{15\} effectively}\newline
+{\tt \\end\{items\}}\newline
+{\tt \\indent\{0\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage5xPatch2 patch}
+\label{HTXFormatPage5xPatch2}
+\index{patch!HTXFormatPage5xPatch2!htxformatpage5.ht}
+\index{htxformatpage5.ht!patch!HTXFormatPage5xPatch2}
+\index{HTXFormatPage5xPatch2!htxformatpage5.ht!patch}
+<<htxformatpage5.ht>>=
+\begin{patch}{HTXFormatPage5xPatch2}
+\begin{paste}{HTXFormatPage5xPaste2A}{HTXFormatPage5xPatch2A}
+\pastebutton{HTXFormatPage5xPaste2A}{Source}
+\newline
+\begin{items}[quitealot]
+A nested list:
+\item[The first] item of an itemized list is on this line.
+\item[The second] item of the list starts here.  It contains another
+list nested inside it.
+\begin{items}[somuchmore]
+\item [First]\tab{0}This is the first item of the
+list that is nested within the itemized list.
+\item [Second]\tab{0}This is the second item of the inner list.
+\end{items}
+This is the rest of the second item of the outer list.  It
+is no more interesting than any other part of the item.
+\item [The third] item of the list.
+\end{items}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage5xPatch2A patch}
+\label{HTXFormatPage5xPatch2A}
+\index{patch!HTXFormatPage5xPatch2A!htxformatpage5.ht}
+\index{htxformatpage5.ht!patch!HTXFormatPage5xPatch2A}
+\index{HTXFormatPage5xPatch2A!htxformatpage5.ht!patch}
+<<htxformatpage5.ht>>=
+\begin{patch}{HTXFormatPage5xPatch2A}
+\begin{paste}{HTXFormatPage5xPaste2B}{HTXFormatPage5xPatch2}
+\pastebutton{HTXFormatPage5xPaste2B}{Interpret}
+\newline
+{\tt \\begin\{items\}\[quitealot\]}\newline
+{\tt A nested list:}\newline
+{\tt \\item\[The first\] item of an itemized list is on this line.}\newline
+{\tt \\item\[The second\] item of the list starts here.  It contains another}\newline
+{\tt list nested inside it.}\newline
+{\tt \\begin\{items\}\[somuchmore\]}\newline
+{\tt \\item \[First\]\\tab\{0\}This is the first item of an enumerated}\newline
+{\tt list that is nested within the itemized list.}\newline
+{\tt \\item \[Second\]\\tab\{0\}This is the second item of the inner list.}\newline
+{\tt \\end\{items\}}\newline
+{\tt This is the rest of the second item of the outer list.  It}\newline
+{\tt is no more interesting than any other part of the item.}\newline
+{\tt \\item\[The third\] item of the list.}\newline
+{\tt \\end\{items\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage5xPatch3 patch}
+\label{HTXFormatPage5xPatch3}
+\index{patch!HTXFormatPage5xPatch3!htxformatpage5.ht}
+\index{htxformatpage5.ht!patch!HTXFormatPage5xPatch3}
+\index{HTXFormatPage5xPatch3!htxformatpage5.ht!patch}
+<<htxformatpage5.ht>>=
+\begin{patch}{HTXFormatPage5xPatch3}
+\begin{paste}{HTXFormatPage5xPaste3A}{HTXFormatPage5xPatch3A}
+\pastebutton{HTXFormatPage5xPaste3A}{Source}
+\newline
+\table{
+{Dark Orchid} {Dark Salmon} {Dark Sea Green} {Dark Slate Blue} {Dark Slate Gray}
+{Dark Turquoise} {Dark Violet} {Deep Pink} {Deep Sky Blue} {Dodger Blue}
+{Floral White} {Forest Green} {Ghost White} {Hot Pink} {Indian Red}
+{Lavender Blush}
+}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage5xPatch3A patch}
+\label{HTXFormatPage5xPatch3A}
+\index{patch!HTXFormatPage5xPatch3A!htxformatpage5.ht}
+\index{htxformatpage5.ht!patch!HTXFormatPage5xPatch3A}
+\index{HTXFormatPage5xPatch3A!htxformatpage5.ht!patch}
+<<htxformatpage5.ht>>=
+\begin{patch}{HTXFormatPage5xPatch3A}
+\begin{paste}{HTXFormatPage5xPaste3B}{HTXFormatPage5xPatch3}
+\pastebutton{HTXFormatPage5xPaste3B}{Interpret}
+\newline
+{\tt
+\\table\{
+\{Dark Orchid\} \{Dark Salmon\} \{Dark Sea Green\} \{Dark Slate Blue\}
+\{Dark Slate Gray\} \{Dark Turquoise\} \{Dark Violet\} \{Deep Pink\}
+\{Deep Sky Blue\} \{Dodger Blue\} \{Floral White\} \{Forest Green\}
+\{Ghost White\} \{Hot Pink\} \{Indian Red\} \{Lavender Blush\}
+\}
+}
+\end{paste}
+\end{patch}
+
+@
+\section{htxformatpage6}
+\subsection{Boxes and Lines}
+\label{HTXFormatPage6}
+\index{pages!HTXFormatPage6!htxformatpage6.ht}
+\index{htxformatpage6.ht!pages!HTXFormatPage6}
+\index{HTXFormatPage6!htxformatpage6.ht!pages}
+<<htxformatpage6.ht>>=
+\begin{page}{HTXFormatPage6}{Boxes and Lines}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+The {\tt \\fbox} command can be used to place a box around one or more
+words. The argument of the {\tt \\fbox} command is the text that will be
+placed in the box. This command should only be used for text that can fit
+in one line.
+
+\beginImportant
+\begin{paste}{HTXFormatPage6xPaste1}{HTXFormatPage6xPatch1}
+\pastebutton{HTXFormatPage6xPaste1}{Interpret}
+\newline
+{\tt \\fbox\{Boxed!\}}\newline
+\end{paste}
+\endImportant
+
+
+Use the {\tt \\horizontalline} command to draw a horizontal line
+across the window. This might be useful for added emphasis.
+
+\beginImportant
+\begin{paste}{HTXFormatPage6xPaste2}{HTXFormatPage6xPatch2}
+\pastebutton{HTXFormatPage6xPaste2}{Interpret}
+\newline
+{\tt \\horizontalline}\newline
+\end{paste}
+\endImportant
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Micro-Spacing}{HTXFormatPage7}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXFormatPage6xPatch1 patch}
+\label{HTXFormatPage6xPatch1}
+\index{patch!HTXFormatPage6xPatch1!htxformatpage6.ht}
+\index{htxformatpage6.ht!patch!HTXFormatPage6xPatch1}
+\index{HTXFormatPage6xPatch1!htxformatpage6.ht!patch}
+<<htxformatpage6.ht>>=
+\begin{patch}{HTXFormatPage6xPatch1}
+\begin{paste}{HTXFormatPage6xPaste1A}{HTXFormatPage6xPatch1A}
+\pastebutton{HTXFormatPage6xPaste1A}{Source}
+\newline
+\fbox{Boxed!}
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage6xPatch1A}
+\begin{paste}{HTXFormatPage6xPaste1B}{HTXFormatPage6xPatch1}
+\pastebutton{HTXFormatPage6xPaste1B}{Interpret}
+\newline
+{\tt \\fbox\{Boxed!\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage6xPatch2 patch}
+\label{HTXFormatPage6xPatch2}
+\index{patch!HTXFormatPage6xPatch2!htxformatpage6.ht}
+\index{htxformatpage6.ht!patch!HTXFormatPage6xPatch2}
+\index{HTXFormatPage6xPatch2!htxformatpage6.ht!patch}
+<<htxformatpage6.ht>>=
+\begin{patch}{HTXFormatPage6xPatch2}
+\begin{paste}{HTXFormatPage6xPaste2A}{HTXFormatPage6xPatch2A}
+\pastebutton{HTXFormatPage6xPaste2A}{Source}
+\newline
+\horizontalline
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage6xPatch2A}
+\begin{paste}{HTXFormatPage6xPaste2B}{HTXFormatPage6xPatch2}
+\pastebutton{HTXFormatPage6xPaste2B}{Interpret}
+\newline
+{\tt \\horizontalline}\newline
+\end{paste}
+\end{patch}
+
+@
+\section{htxformatpage7}
+\subsection{Micro-Spacing}
+\label{HTXFormatPage7}
+\index{pages!HTXFormatPage7!htxformatpage7.ht}
+\index{htxformatpage7.ht!pages!HTXFormatPage7}
+\index{HTXFormatPage7!htxformatpage7.ht!pages}
+<<htxformatpage7.ht>>=
+\begin{page}{HTXFormatPage7}{Micro-Spacing}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+There are three commands that one can use to exercise finer control
+over the appearance of text on a page: {\tt \\space}, {\tt \\hspace}
+and {\tt \\vspace}.
+
+The {\tt \\space\{{\it value}\}} command accepts an integer argument and simply
+changes the position of the next character to the right or to the left.
+A negative argument will move the next character to the left and a
+positive one to the right. The unit of movement is {\it the width
+of a character}. In this way one can overstrike characters to produce
+various effects.
+
+\beginImportant
+\begin{paste}{HTXFormatPage7xPaste1}{HTXFormatPage7xPatch1}
+\pastebutton{HTXFormatPage7xPaste1}{Interpret}
+\newline
+{\tt 0\\space\{-1\}\\}\newline
+{\tt underlined\\space\{-10\}__________}\newline
+\end{paste}
+\endImportant
+
+
+The {\tt \\hspace\{{\it value}\}} command
+is similar to the {\tt \\space\{{\it value}\}} command.
+It also accepts an integer argument and
+changes the position of the next character to the right or to the left.
+A negative argument will move the next character to the left and a
+positive one to the right. The unit of movement is {\it a pixel}.
+The {\it value} argument specifies an offset from the default placement
+of the character.
+
+\beginImportant
+\begin{paste}{HTXFormatPage7xPaste2}{HTXFormatPage7xPatch2}
+\pastebutton{HTXFormatPage7xPaste2}{Interpret}
+\newline
+{\tt x\\hspace\{-4\}x\\hspace\{-3\}x\\hspace\{-2\}x\\hspace\{-1\}x\%}\newline
+{\tt x\\hspace\{1\}x\\hspace\{2\}x\\hspace\{3\}x\\hspace\{4\}x}
+\end{paste}
+\endImportant
+
+The {\tt \\vspace\{{\it value}\}} command is similar to the
+{\tt \\hspace\{{\it value}\}} command but (as the name suggests)
+works in the vertical direction. The unit of movement is {\it a
+pixel}. The {\it value} argument specifies an offset from {\it
+the next line}. A negative argument moves the next character up
+and a positive down. This command can be used for subscripts and
+superscripts. One drawback in the use of {\tt \\vspace} is that
+it can only work with a particular font at a time. This is
+because the inter-line spacing depends on the font being used
+and the value of it is needed to get "back" on the line.
+In general, the command {\tt \\vspace\{{\it - ils}\}} will
+have a null effect when {\it ils} = ( font ascent + font descent + 5 ).
+The example below assumes that {\it ils} = 25 e.g. the Rom14 font
+on the RISC System/6000.
+
+\beginImportant
+\begin{paste}{HTXFormatPage7xPaste3}{HTXFormatPage7xPatch3}
+\pastebutton{HTXFormatPage7xPaste3}{Interpret}
+\newline
+{\tt CO\\vspace\{-18\}2\\vspace\{-32\} + CaO ->}\newline
+{\tt CaCO\\vspace\{-18\}3\\vspace\{-32\}\\newline}\newline
+{\tt R\\space\{-1\}~\\vspace\{-18\}æv\\vspace\{-32\}}\newline
+{\tt \\hspace\{4\}-\\hspace\{8\}---\\hspace\{-12\}}\newline
+{\tt \\vspace\{-32\}1\\space\{-1\}\\vspace\{-7\}2}\newline
+{\tt \\vspace\{-36\}\\hspace\{8\}g\\space\{-1\}~}\newline
+{\tt \\vspace\{-18\}æv\\vspace\{-32\}\\hspace\{2\}R}\newline
+{\tt \\space\{-1\}~ = T\\vspace\{-18\}æv\\vspace\{-32\}}\newline
+{\tt \\vspace\{-25\}}
+\end{paste}
+\endImportant
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Bitmaps and Images}{HTXFormatPage8}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXFormatPage7xPatch1 patch}
+\label{HTXFormatPage7xPatch1}
+\index{patch!HTXFormatPage7xPatch1!htxformatpage7.ht}
+\index{htxformatpage7.ht!patch!HTXFormatPage7xPatch1}
+\index{HTXFormatPage7xPatch1!htxformatpage7.ht!patch}
+<<htxformatpage7.ht>>=
+\begin{patch}{HTXFormatPage7xPatch1}
+\begin{paste}{HTXFormatPage7xPaste1A}{HTXFormatPage7xPatch1A}
+\pastebutton{HTXFormatPage7xPaste1A}{Source}
+\newline
+0\space{-1}\\
+underlined\space{-10}__________
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage7xPatch1A}
+\begin{paste}{HTXFormatPage7xPaste1B}{HTXFormatPage7xPatch1}
+\pastebutton{HTXFormatPage7xPaste1B}{Interpret}
+\newline
+{\tt 0\\space\{-1\}\\}\newline
+{\tt underlined\\space\{-10\}__________}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage7xPatch2 patch}
+\label{HTXFormatPage7xPatch2}
+\index{patch!HTXFormatPage7xPatch2!htxformatpage7.ht}
+\index{htxformatpage7.ht!patch!HTXFormatPage7xPatch2}
+\index{HTXFormatPage7xPatch2!htxformatpage7.ht!patch}
+<<htxformatpage7.ht>>=
+\begin{patch}{HTXFormatPage7xPatch2}
+\begin{paste}{HTXFormatPage7xPaste2A}{HTXFormatPage7xPatch2A}
+\pastebutton{HTXFormatPage7xPaste2A}{Source}
+\newline
+x\hspace{-4}x\hspace{-3}x\hspace{-2}x\hspace{-1}x%
+x\hspace{1}x\hspace{2}x\hspace{3}x\hspace{4}x
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage7xPatch2A patch}
+\label{HTXFormatPage7xPatch2A}
+\index{patch!HTXFormatPage7xPatch2A!htxformatpage7.ht}
+\index{htxformatpage7.ht!patch!HTXFormatPage7xPatch2A}
+\index{HTXFormatPage7xPatch2A!htxformatpage7.ht!patch}
+<<htxformatpage7.ht>>=
+\begin{patch}{HTXFormatPage7xPatch2A}
+\begin{paste}{HTXFormatPage7xPaste2B}{HTXFormatPage7xPatch2}
+\pastebutton{HTXFormatPage7xPaste2B}{Interpret}
+\newline
+{\tt x\\hspace\{-4\}x\\hspace\{-3\}x\\hspace\{-2\}x\\hspace\{-1\}x\%}\newline
+{\tt x\\hspace\{1\}x\\hspace\{2\}x\\hspace\{3\}x\\hspace\{4\}x}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage7xPatch3 patch}
+\label{HTXFormatPage7xPatch3}
+\index{patch!HTXFormatPage7xPatch3!htxformatpage7.ht}
+\index{htxformatpage7.ht!patch!HTXFormatPage7xPatch3}
+\index{HTXFormatPage7xPatch3!htxformatpage7.ht!patch}
+<<htxformatpage7.ht>>=
+\begin{patch}{HTXFormatPage7xPatch3}
+\begin{paste}{HTXFormatPage7xPaste3A}{HTXFormatPage7xPatch3A}
+\pastebutton{HTXFormatPage7xPaste3A}{Source}
+\newline
+CO\vspace{-18}2\vspace{-32} + CaO ->
+CaCO\vspace{-18}3\vspace{-32}\newline
+R\space{-1}~\vspace{-18}æv\vspace{-32}
+\hspace{4}-\hspace{8}---\hspace{-12}
+\vspace{-32}1\space{-1}\vspace{-7}2
+\vspace{-36}\hspace{8}g\space{-1}~
+\vspace{-18}æv\vspace{-32}\hspace{2}R
+\space{-1}~ = T\vspace{-18}æv\vspace{-32}
+\vspace{-25}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage7xPatch3A patch}
+\label{HTXFormatPage7xPatch3A}
+\index{patch!HTXFormatPage7xPatch3A!htxformatpage7.ht}
+\index{htxformatpage7.ht!patch!HTXFormatPage7xPatch3A}
+\index{HTXFormatPage7xPatch3A!htxformatpage7.ht!patch}
+<<htxformatpage7.ht>>=
+\begin{patch}{HTXFormatPage7xPatch3A}
+\begin{paste}{HTXFormatPage7xPaste3B}{HTXFormatPage7xPatch3}
+\pastebutton{HTXFormatPage7xPaste3B}{Interpret}
+\newline
+{\tt CO\\vspace\{-18\}2\\vspace\{-32\} + CaO ->}\newline
+{\tt CaCO\\vspace\{-18\}3\\vspace\{-32\}\\newline}\newline
+{\tt R\\space\{-1\}~\\vspace\{-18\}æv\\vspace\{-32\}}\newline
+{\tt \\hspace\{4\}-\\hspace\{8\}---\\hspace\{-12\}}\newline
+{\tt \\vspace\{-32\}1\\space\{-1\}\\vspace\{-7\}2}\newline
+{\tt \\vspace\{-36\}\\hspace\{8\}g\\space\{-1\}~}\newline
+{\tt \\vspace\{-18\}æv\\vspace\{-32\}\\hspace\{2\}R}\newline
+{\tt \\space\{-1\}~ = T\\vspace\{-18\}æv\\vspace\{-32\}}\newline
+{\tt \\vspace\{-25\}}
+\end{paste}
+\end{patch}
+
+@
+\section{htxformatpage8}
+\subsection{Bitmaps and Images}
+\label{HTXFormatPage8}
+\index{pages!HTXFormatPage8!htxformatpage8.ht}
+\index{htxformatpage8.ht!pages!HTXFormatPage8}
+\index{HTXFormatPage8!htxformatpage8.ht!pages}
+<<htxformatpage8.ht>>=
+\begin{page}{HTXFormatPage8}{Bitmaps and Images}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+The commands {\tt \\inputbitmap\{{\it filename}\}}
+and {\tt \\inputimage\{{\it filename}\}}
+allow you to include an X11 bitmap or an
+Axiom-generated viewport in a \HyperName{}
+page.
+
+In the case of the {\tt \\inputbitmap} command
+the {\it filename} parameter must be the full pathname
+of an X11 bitmap file.
+
+\beginImportant
+\begin{paste}{HTXFormatPage8xPaste1}{HTXFormatPage8xPatch1}
+\pastebutton{HTXFormatPage8xPaste1}{Interpret}
+\newline
+{\tt \\inputbitmap\{\env{AXIOM}/doc/hypertex/bitmaps/sup.bitmap\} }
+\end{paste}
+\endImportant
+
+The {\it filename} parameter of the {\tt \\inputimage}
+command must be the full pathname of a {\it compressed XPM image} file without the name extensions.
+\HyperName{} always adds ".xpm.Z" to whatever filename you give and looks for the augmented filename.
+Such files can be generated by Axiom command
+\axiomOp{write} with the {\tt "image"} or {\tt "pixmap"}
+options.
+
+\beginImportant
+\begin{paste}{HTXFormatPage8xPaste2}{HTXFormatPage8xPatch2}
+\pastebutton{HTXFormatPage8xPaste2}{Interpret}
+\newline
+{\tt \\inputimage\{\env{AXIOM}/doc/viewports/ugProblemNumericPage30.view/image\}}
+\end{paste}
+\endImportant
+
+Be careful not to break the pathname across lines.
+
+The {\tt \\inputimage} command will automatically select
+the {\it image.xpm} or the {\it image.bm} file for you
+based on the capabilities of your X server. 
+
+For your convenience, there are two macros defined
+in \centerline{ {\bf \env{AXIOM}{}/doc/hypertex/pages/util.ht}.}
+The {\tt \\viewport} macro eliminates the need to specify
+the {\tt .view/image} part and the
+{\tt \\axiomViewport} macro automatically selects viewport
+files in the system directories. The above {\tt \\inputimage}
+could have been written
+\beginImportant
+{\tt \\viewport\{\env{AXIOM}/doc/viewports/ugProblemNumericPage30\}}
+\endImportant
+or
+\beginImportant
+{\tt \\axiomViewport\{ugProblemNumericPage30\}}
+\endImportant
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Back to Formatting menu}{HTXFormatTopPage}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXFormatPage8xPatch1 patch}
+\label{HTXFormatPage8xPatch1}
+\index{patch!HTXFormatPage8xPatch1!htxformatpage8.ht}
+\index{htxformatpage8.ht!patch!HTXFormatPage8xPatch1}
+\index{HTXFormatPage8xPatch1!htxformatpage8.ht!patch}
+<<htxformatpage8.ht>>=
+\begin{patch}{HTXFormatPage8xPatch1}
+\begin{paste}{HTXFormatPage8xPaste1A}{HTXFormatPage8xPatch1A}
+\pastebutton{HTXFormatPage8xPaste1A}{Source}
+\newline
+\inputbitmap{\env{AXIOM}/doc/hypertex/bitmaps/sup.bitmap}
+\end{paste}
+\end{patch}
+\begin{patch}{HTXFormatPage8xPatch1A}
+\begin{paste}{HTXFormatPage8xPaste1B}{HTXFormatPage8xPatch1}
+\pastebutton{HTXFormatPage8xPaste1B}{Interpret}
+\newline
+{\tt \\inputbitmap\{\env{AXIOM}/doc/hypertex/bitmaps/sup.bitmap\} }
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXFormatPage8xPatch2 patch}
+\label{HTXFormatPage8xPatch2}
+\index{patch!HTXFormatPage8xPatch2!htxformatpage8.ht}
+\index{htxformatpage8.ht!patch!HTXFormatPage8xPatch2}
+\index{HTXFormatPage8xPatch2!htxformatpage8.ht!patch}
+<<htxformatpage8.ht>>=
+\begin{patch}{HTXFormatPage8xPatch2}
+\begin{paste}{HTXFormatPage8xPaste2A}{HTXFormatPage8xPatch2A}
+\pastebutton{HTXFormatPage8xPaste2A}{Source}
+\newline
+\inputimage{\env{AXIOM}/doc/viewports/ugProblemNumericPage30.view/image}
+\end{paste}
+\end{patch}
+@
+\subsection{HTXFormatPage8xPatch2A patch}
+\label{HTXFormatPage8xPatch2A}
+\index{patch!HTXFormatPage8xPatch2A!htxformatpage8.ht}
+\index{htxformatpage8.ht!patch!HTXFormatPage8xPatch2A}
+\index{HTXFormatPage8xPatch2A!htxformatpage8.ht!patch}
+<<htxformatpage8.ht>>=
+\begin{patch}{HTXFormatPage8xPatch2A}
+\begin{paste}{HTXFormatPage8xPaste2B}{HTXFormatPage8xPatch2}
+\pastebutton{HTXFormatPage8xPaste2B}{Interpret}
+\newline
+{\tt \\inputimage\{\env{AXIOM}/doc/viewports/ugProblemNumericPage30.view/image\}}
+\end{paste}
+\end{patch}
+
+@
+\section{htxformattoppage.ht}
+\subsection{Formatting in Hyperdoc}
+\begin{itemize}
+\item HTXFormatPage1 \ref{HTXFormatPage1} on page~\pageref{HTXFormatPage1}
+\item HTXFormatPage2 \ref{HTXFormatPage2} on page~\pageref{HTXFormatPage2}
+\item HTXFormatPage3 \ref{HTXFormatPage3} on page~\pageref{HTXFormatPage3}
+\item HTXFormatPage4 \ref{HTXFormatPage4} on page~\pageref{HTXFormatPage4}
+\item HTXFormatPage5 \ref{HTXFormatPage5} on page~\pageref{HTXFormatPage5}
+\item HTXFormatPage6 \ref{HTXFormatPage6} on page~\pageref{HTXFormatPage6}
+\item HTXFormatPage7 \ref{HTXFormatPage7} on page~\pageref{HTXFormatPage7}
+\item HTXFormatPage8 \ref{HTXFormatPage8} on page~\pageref{HTXFormatPage8}
+\end{itemize}
+\label{HTXFormatTopPage}
+\index{pages!HTXFormatTopPage!htxformattoppage.ht}
+\index{htxformattoppage.ht!pages!HTXFormatTopPage}
+\index{HTXFormatTopPage!htxformattoppage.ht!pages}
+<<htxformattoppage.ht>>=
+\begin{page}{HTXFormatTopPage}{Formatting in Hyperdoc}
+\centerline{\fbox{{\tt \thispage}}}\newline
+
+\HyperName{} offers various facilities for formatting text and images.
+You can learn about these facilities by clicking on the topics below.
+\begin{scroll}
+\beginmenu
+\menudownlink{Special Characters}{HTXFormatPage1}
+\menudownlink{Formatting without commands}{HTXFormatPage2}
+\menudownlink{Using different fonts}{HTXFormatPage3}
+\menudownlink{Indentation}{HTXFormatPage4}
+\menudownlink{Creating Lists and Tables}{HTXFormatPage5}
+\menudownlink{Boxes and Lines}{HTXFormatPage6}
+\menudownlink{Micro-Spacing}{HTXFormatPage7}
+\menudownlink{Bitmaps and Images}{HTXFormatPage8}
+\endmenu
+\end{scroll}
+\end{page}
+
+
+@
+\section{htxintropage1.ht}
+\subsection{What Hyperdoc does}
+\label{HTXIntroPage1}
+\begin{itemize}
+\item HTXIntroPage2 \ref{HTXIntroPage2} on page~\pageref{HTXIntroPage2}
+\item ugHyperPage \ref{ugHyperPage} on page~\pageref{ugHyperPage}
+\end{itemize}
+\index{pages!HTXIntroPage1!htxintropage1.ht}
+\index{htxintropage1.ht!pages!HTXIntroPage1}
+\index{HTXIntroPage1!htxintropage1.ht!pages}
+<<htxintropage1.ht>>=
+\begin{page}{HTXIntroPage1}{What Hyperdoc does}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\beginscroll
+
+Take a close look at the objects in the \HyperName{} window you are now reading.
+Most of them are text. Resize the window using the window manager
+facilities. The text is reformatted to fit the window
+border. This action is performed by \HyperName{}. At the simplest
+level, it provides a method for {\em formatting} text in a window.
+In fact, it can place other things on the window as well, such as
+bitmaps or color images. The {\em buttons} you see at either
+side at the top of the window are bitmaps.
+
+Move the cursor so that it rests on one of those buttons. You notice that
+the cursor has changed appearance. This indicates that there is an action associated
+with the button. This action will be performed when you click the mouse button
+over the {\em active area}. If you are familiar with \HyperName{}, you know
+that the active area can be words, bitmaps, images or {\em input areas}. In
+fact, anything that can be displayed in a \HyperName{} window can be an
+active area.
+
+So, what can the action associated with an active area be? \HyperName{}
+allows quite a bit of freedom in defining that action. We will have a close
+look at this issue \downlink{later on}{HTXLinkTopPage}. For now, recall
+the various actions that you have encountered so far --- executing Axiom
+commands, popping up new windows, providing parameters for other active areas,
+and replacing or changing the contents of the window. The most common action
+is to bring up some \HyperName{} text in the same or a different window.
+This lets us create {\em links} between pieces of text and images. A
+system with such capability is usually called a {\em hypertext} system.
+\HyperName{} is in fact much more.
+
+\endscroll
+\beginmenu
+\menulink{Next -- How \HyperName{} does it}{HTXIntroPage2}
+\menuwindowlink{Review some features of \HyperName{}}{ugHyperPage}
+\endmenu
+
+\helppage{ugHyperPage}
+\end{page}
+
+@
+\section{htxintropage2.ht}
+\subsection{How Hyperdoc does it}
+\label{HTXIntroPage2}
+See HTXIntroPage3 \ref{HTXIntroPage3} on page~\pageref{HTXIntroPage3}
+\index{pages!HTXIntroPage2!htxintropage2.ht}
+\index{htxintropage2.ht!pages!HTXIntroPage2}
+\index{HTXIntroPage2!htxintropage2.ht!pages}
+<<htxintropage2.ht>>=
+\begin{page}{HTXIntroPage2}{How Hyperdoc does it}
+{\centerline{\fbox{{\tt \thispage}}}\newline}
+\beginscroll
+
+\HyperName{} can read the {\em hypertext} information from standard text
+files. This means that you can create or change this information with any
+text editor. Once this information has been entered into the files, a
+special program, called {\bf htadd}, scans these files and produces
+a database (another file called {\bf ht.db}) of {\em objects}
+encountered in the files. \HyperName{}
+consults this database when it first starts and so knows where it might
+find the definitions of these objects. You can maintain several such
+databases on different directories. You indicate which database you
+want \HyperName{} to consult by setting an {\em environment variable}
+called {\bf HTPATH}.
+
+In general, hypertext must obviously use some kind of special (that is,
+non-textual) marks for all the  extra functionality it provides. In
+\HyperName{}, these marks are some special characters --- special
+in the sense that they are not interpreted as ordinary displayable text.
+These characters, however, are part of the standard ASCII set.
+There is also a way to display these special characters as text .
+The \HyperName{} special characters are :
+
+\beginImportant
+\noindent{\em Special Characters}: {\tt \table{{\$}{\\}{\{}{\}}{\[}{\]}{\%}{\#}}}
+\endImportant
+
+
+
+\HyperName{} uses the special characters to distinguish between
+{\em text} and {\em commands} (by {\em text}, we mean here anything
+displayable). The commands are instructions to
+\HyperName{} to treat some text in a particular way. Some commands
+define special \HyperName{} objects. The most important objects
+are {\em pages}, {\em patches}, and {\em macros}.
+A {\em page} is a description of the contents of a
+\HyperName{} window. A {\em patch} is a portion of a page.
+A {\em macro} is a user-defined new \HyperName{} command.
+Some commands allow special text {\em formatting} and others
+associate some text with an action.
+
+In order to display anything at all in \HyperName, you must define a
+{\em page}. The next section explains how to define a {\em page} and put
+some simple text into it.
+\endscroll
+\beginmenu
+\menudownlink{Next -- Define a simple text page}{HTXIntroPage3}
+\endmenu
+
+\end{page}
+
+
+@
+\section{htxintropage3.ht}
+\subsection{A simple text page}
+\begin{itemize}
+\item HTXLinkPage6 \ref{HTXLinkPage6} on page~\pageref{HTXLinkPage6}
+\item HTXTryPage \ref{HTXTryPage} on page~\pageref{HTXTryPage}
+\item HTXFormatTopPage \ref{HTXFormatTopPage} on 
+page~\pageref{HTXFormatTopPage}
+\end{itemize}
+\label{HTXIntroPage3}
+\index{pages!HTXIntroPage3!htxintropage3.ht}
+\index{htxintropage3.ht!pages!HTXIntroPage3}
+\index{HTXIntroPage3!htxintropage3.ht!pages}
+<<htxintropage3.ht>>=
+\begin{page}{HTXIntroPage3}{A simple text page}
+{\centerline{\fbox{{\tt \thispage}}}\newline}
+\begin{scroll}
+
+
+A page is defined by a {\em group} command. Group commands are used to
+delimit a group, that is, to declare where a group starts and where it
+ends. The proper syntax for a page definition is as follows:
+\beginImportant
+{\tt \\begin\{page\}\{{\it name}\}\{{\it a title}\}}
+\newline
+.
+\newline
+.
+\newline
+.
+\newline
+{\tt \\end\{page\}}
+\beginImportant
+
+Note the use of the special characters {\tt \\}, {\tt \{} and {\tt
+\}}.  The {\tt \\} (backslash) character introduces a command, in this
+case, {\tt begin}.  The {\tt \{ \}} (braces) delimit the {\em
+parameters} to the command.  The first parameter (the word {\tt page})
+specifies this as a page definition command.
+
+The second parameter can be any single unbroken word consisting of
+alphanumeric characters only, and specifies the name of the page by which
+it can be referred to by other commands. You should choose
+this internal name with care so as to avoid potential conflict with
+page names that are defined by the Axiom system. This caveat only
+applies in the case where you have started \HyperName{} with the Axiom
+database --- see \downlink{later on}{HTXLinkPage6}. It is suggested that
+the page names you define start with the letters {\tt UX} (standing for
+{\tt U}ser e{\tt X}tensions). You can have a look at the Axiom
+system database file {\centerline{\bf \env{AXIOM}/doc/hypertex/pages/ht.db} }
+which contains the names of all pages, macros and patches used by Axiom.
+
+The third parameter specifies a title for the page.
+The title of a page is the area at the very top
+of the window, between the buttons. Virtually anything
+that can be put in the main page can also be put in the
+title. As an example, {\em this} page's
+declaration is like this:\newline
+{\tt \\begin\{page\}\{\thispage\}\{A simple text page\}}
+
+Everything you type between the {\tt \\begin\{page\}} command and the next
+{\tt \\end\{page\}} command will become the body of the page. It is
+an error to insert another {\tt \\begin\{page\}} between the two, that is,
+this group command cannot be nested.
+
+There is another useful group command that should be mentioned here
+--- the {\em scroll} command. It controls the portion of the page that
+will be scrollable. \HyperName{} will split a page in three sections:
+a {\em header}, a {\em scroll region} and a {\em footer}. \HyperName{}
+will always try to keep the header and footer regions visible on the
+page; the header at the top and the footer at the bottom. The middle
+scroll region will be truncated and a scroll bar will be automatically
+provided if the window becomes too small for the whole contents of the
+page. Only one scroll region can be defined in a page and the correct
+syntax is as follows:
+\beginImportant
+{\tt \\begin\{scroll\}}
+\newline
+.
+\newline
+.
+\newline
+.
+\newline
+{\tt \\end\{scroll\}}
+\beginImportant
+
+This group should be placed inside the relevant page group. The text
+between the {\tt \\begin\{page\}} and {\tt \\begin\{scroll\}} commands
+defines the header region, the text inside the scroll group defines
+the scroll region and the text between the {\tt \\end\{scroll\}} and
+{\tt \\end\{page\}} commands defines the footer region. It is
+important to keep the header and footer areas small.  Use them to
+display information that might be needed at any time by the user.  If
+you don't define a scroll region in your page, you may find that a
+portion of the page is truncated.
+
+You are now ready to experiment with a page of your own. If you just
+want to display some text on a page, you don't need any other
+\HyperName{} commands. Just make sure that the text you type for the
+title, header, scroll and footer regions does not contain (for the
+moment) any of the \HyperName{} special characters.
+
+\end{scroll}
+\beginmenu
+\menuwindowlink{Try out what you learned}{HTXTryPage}
+\menudownlink{Next -- Learn how to format text}{HTXFormatTopPage}
+\endmenu
+\end{page}
+
+
+@
+\section{htxintrotoppage.ht}
+\subsection{First Steps}
+\begin{itemize}
+\item HTXIntroPage1 \ref{HTXIntroPage1} on page~\pageref{HTXIntroPage1}
+\item HTXIntroPage2 \ref{HTXIntroPage2} on page~\pageref{HTXIntroPage2}
+\item HTXIntroPage3 \ref{HTXIntroPage3} on page~\pageref{HTXIntroPage3}
+\end{itemize}
+\label{HTXIntroTopPage}
+\index{pages!HTXIntroTopPage!htxintrotoppage.ht}
+\index{htxintrotoppage.ht!pages!HTXIntroTopPage}
+\index{HTXIntroTopPage!htxintrotoppage.ht!pages}
+<<htxintrotoppage.ht>>=
+\begin{page}{HTXIntroTopPage}{First Steps}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\beginscroll
+
+\HyperName{} is both a way of presenting information and
+a customisable front-end. Axiom uses
+it for its own purpose as a front-end and documentation system.
+\HyperName{} has special facilities that allow it to interact
+very closely with Axiom.  The \Browse{} facility, the Basic
+Commands section and the ability to execute Axiom commands
+by clicking on \HyperName{} text are witness to this.
+
+These pages will show you the features of \HyperName{} that might
+make it appropriate for your own use in, for example, providing
+documentation for Axiom code that you write or some other purpose.
+
+It is recommended that you get familiar with the {\em use} of
+\HyperName{} before proceeding.
+
+\endscroll
+\beginmenu
+\menudownlink{What \HyperName{} does}{HTXIntroPage1}
+\menudownlink{How \HyperName{} does it}{HTXIntroPage2}
+\menudownlink{Define a simple text page}{HTXIntroPage3}
+\endmenu
+
+\end{page}
+
+@
+\section{htxlinkpage1.ht}
+\subsection{Linking to a named page}
+\label{HTXLinkPage1}
+\begin{itemize}
+\item HTXLinkTopPage \ref{HTXLinkTopPage} on page~\pageref{HTXLinkTopPage}
+\item TestHelpPage \ref{TestHelpPage} on page~\pageref{TestHelpPage}
+\item HTXLinkPage2 \ref{HTXLinkPage2} on page~pageref{HTXLinkPage2}
+\end{itemize}
+\index{pages!HTXLinkPage1!htxlinkpage1.ht}
+\index{htxlinkpage1.ht!pages!HTXLinkPage1}
+\index{HTXLinkPage1!htxlinkpage1.ht!pages}
+<<htxlinkpage1.ht>>=
+\begin{page}{HTXLinkPage1}{Linking to a named page}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+In \HyperName{}, hypertext links are specified by different
+flavors of the {\tt \\link} command. These commands take two
+arguments. One argument specifies the active area, that
+is, the {\it trigger} of the link. The second argument specifies the
+{\it target} of the link, that is, a page. The trigger can be quite arbitrary
+\HyperName{} text and can include images or whole paragraphs. The trigger
+text will be formatted in the normal fashion but its default font will be
+the font specified by the ActiveFont resource.
+
+The simplest kind of \HyperName{} link is a link to a named page.
+Clicking on the trigger will cause the named page to appear in a
+\HyperName{} window.
+There are three flavors for such a link.
+\begin{items}[123456]
+\item\menuitemstyle{{\tt \\windowlink\{{\it trigger}\}\{{\it page name}\}}}
+\newline
+This link command, when activated, will create a new window for the named page.
+\newline
+There will be no \centerline{\UpBitmap{}  or \ReturnBitmap{}}  
+buttons on the new page.
+The new page will have a \centerline{\ExitBitmap{}} button, however.
+The original page containing the {\tt \\windowlink} command will be unaffected.
+\item\menuitemstyle{{\tt \\downlink\{{\it trigger}\}\{{\it page name}\}} }
+\newline This link command, when activated, will cause the
+current page to be replaced by the target page
+in the same \HyperName{} window.
+A \centerline{\UpBitmap{}}  button will automatically be placed
+on the new page allowing you to get back to the page
+containing the {\tt \\downlink} command.
+If the current page has a \centerline{\ReturnBitmap{}} button then
+the target page will also carry it. The associated
+target page of that button will be the same as it is
+in the current page.
+\item\menuitemstyle{{\tt \\memolink\{{\it trigger}\}\{{\it page name}\}}}
+\newline This link command is similar to the {\tt \\downlink} command.
+In addition, it will cause a \centerline{\ReturnBitmap{}}  
+button to be included in
+the target page and all pages {\tt \\downlink}ed from it. 
+This button will act as a
+direct link to the page containing the {\tt \\memolink} command allowing
+a short-cut to be taken.
+\end{items}
+
+\beginImportant
+\begin{paste}{HTXLinkPage1xPaste1}{HTXLinkPage1xPatch1}
+\pastebutton{HTXLinkPage1xPaste1}{Interpret}
+\newline
+{\tt \\windowlink\{windowlink to Actions menu\}\{HTXLinkTopPage\}\\newline}\newline
+{\tt \\downlink\{downlink to Actions menu\}\{HTXLinkTopPage\}\\newline}\newline
+{\tt \\memolink\{memolink to Actions menu\}\{HTXLinkTopPage\}}
+\end{paste}
+\endImportant
+
+
+There is a fourth button that can appear at the top of the page
+next to the \centerline{\ExitBitmap{}} button.
+Its purpose is to provide access to a particular {\it help page}
+associated with the current page.
+That is the \centerline{\HelpBitmap{}} button. The command to use
+is
+\centerline{{\tt \\helppage\{{\it help page name}\}}}
+The {\tt \\helppage} command {\it must } be placed
+just before the {\tt \\end\{page\}} command.
+For instance, to get a help button on this page
+the following command is used.
+\centerline{{\tt {\\helppage\{TestHelpPage\}}}}
+Clicking on the help button at the top
+will display the {\tt TestHelpPage} page in a new window.
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Standard Pages}{HTXLinkPage2}
+\endmenu
+
+\helppage{TestHelpPage}
+\end{page}
+
+@
+\subsection{HTXLinkPage1xPatch1 patch}
+\label{HTXLinkPage1xPatch1}
+\index{patch!HTXLinkPage1xPatch1!htxlinkpage1.ht}
+\index{htxlinkpage1.ht!patch!HTXLinkPage1xPatch1}
+\index{HTXLinkPage1xPatch1!htxlinkpage1.ht!patch}
+<<htxlinkpage1.ht>>=
+\begin{patch}{HTXLinkPage1xPatch1}
+\begin{paste}{HTXLinkPage1xPaste1A}{HTXLinkPage1xPatch1A}
+\pastebutton{HTXLinkPage1xPaste1A}{Source}
+\newline
+\windowlink{windowlink to Actions
+menu}{HTXLinkTopPage}\newline
+\downlink{downlink to Actions menu}{HTXLinkTopPage}\newline
+\memolink{memolink to Actions menu}{HTXLinkTopPage}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage1xPatch1A patch}
+\label{HTXLinkPage1xPatch1A}
+\index{patch!HTXLinkPage1xPatch1A!htxlinkpage1.ht}
+\index{htxlinkpage1.ht!patch!HTXLinkPage1xPatch1A}
+\index{HTXLinkPage1xPatch1A!htxlinkpage1.ht!patch}
+<<htxlinkpage1.ht>>=
+\begin{patch}{HTXLinkPage1xPatch1A}
+\begin{paste}{HTXLinkPage1xPaste1B}{HTXLinkPage1xPatch1}
+\pastebutton{HTXLinkPage1xPaste1B}{Interpret}
+\newline
+{\tt \\windowlink\{windowlink to Actions menu\}\{HTXLinkTopPage\}\\newline}\newline
+{\tt \\downlink\{downlink to Actions menu\}\{HTXLinkTopPage\}\\newline}\newline
+{\tt \\memolink\{memolink to Actions menu\}\{HTXLinkTopPage\}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{Test Help Page}
+\label{TestHelpPage}
+\index{pages!TestHelpPage!htxlinkpage1.ht}
+\index{htxlinkpage1.ht!pages!TestHelpPage}
+\index{TestHelpPage!htxlinkpage1.ht!pages}
+<<htxlinkpage1.ht>>=
+\begin{page}{TestHelpPage}{Test Help Page}
+\begin{scroll}
+
+\vspace{100}
+\centerline{Is this any help?}
+\end{scroll}
+\end{page}
+
+@
+\section{htxlinkpage2.ht}
+\subsection{Standard Pages}
+\label{HTXLinkPage2}
+\begin{itemize}
+\item HTXLinkPage6 \ref{HTXLinkPage6} on page~\pageref{HTXLinkPage6}
+\item SpadNotConnectedPage \ref{SpadNotConnectedPage} on 
+page~\pageref{SpadNotConnectedPage}
+\item UnknownPage \ref{UnknownPage} on page~\pageref{UnknownPage}
+\item ErrorPage \ref{ErrorPage} on page~\pageref{ErrorPage}
+\item ProtectedQuitPage \ref{ProtectedQuitPage} on 
+page~\pageref{ProtectedQuitPage}
+\item HTXLinkPage3 \ref{HTXLinkPage3} on page~\pageref{HTXLinkPage3}
+\end{itemize}
+\index{pages!HTXLinkPage2!htxlinkpage2.ht}
+\index{htxlinkpage2.ht!pages!HTXLinkPage2}
+\index{HTXLinkPage2!htxlinkpage2.ht!pages}
+<<htxlinkpage2.ht>>=
+\begin{page}{HTXLinkPage2}{Standard Pages}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+You have reached this page after performing
+a series of mouse clicks on \HyperName{}
+active areas. Each time, a {\tt \\link}
+command was activated. Well, how does it all
+start?
+The answer is that \HyperName{} always puts up
+a particular page called {\tt RootPage} when
+it starts up. If this page is not found in the database,
+\HyperName{} will immediately exit.
+It is, of course, desirable that the {\tt RootPage}
+contains links to other pages!
+It is possible to override
+Axiom's choice of {\tt RootPage} and provide your own
+to \HyperName{}. This is done in the same way as
+you would override any Axiom-defined page and is
+discussed in \downlink{How to use your pages with \HyperName{}}{HTXLinkPage6}.
+
+
+
+You may have noticed that \HyperName{}
+uses some pages when certain events occur.
+There is a page that is put up, for instance,
+whenever \HyperName{} cannot connect to Axiom.
+Another page is put up whenever there is a formatting
+error and yet another when a request for an unknown page
+is made. Finally, there is a page that prompts
+for confirmation when you press the
+exit button on the initial page.
+
+
+These pages have standard names and must be provided
+in the \HyperName{} page database.
+They are already defined in the Axiom system
+\HyperName{} page database so that you do not have to
+define them yourself.
+
+Here are the pages required by \HyperName{}. You can click on any of these
+to see their contents. Click on their exit buttons when you are finished.
+
+\beginImportant
+\begin{paste}{HTXLinkPage2xPaste1}{HTXLinkPage2xPatch1}
+\pastebutton{HTXLinkPage2xPaste1}{Interpret}
+\newline
+{\tt \\table\{}\newline
+{\tt \{\\windowlink\{SpadNotConnectedPage\}\{SpadNotConnectedPage\}\}}\newline
+{\tt \{\\windowlink\{UnknownPage\}\{UnknownPage\}\}}\newline
+{\tt \{\\windowlink\{ErrorPage\}\{ErrorPage\}\}}\newline
+{\tt \{\\windowlink\{ProtectedQuitPage\}\{ProtectedQuitPage\}\}}\newline
+{\tt \}}\newline
+\end{paste}
+\endImportant
+
+
+In addition, \HyperName{} uses certain bitmaps for its buttons.
+They are also provided in the Axiom system
+bitmap directory and \HyperName{} knows where to find them.
+
+The bitmap files required by \HyperName{} are the following.
+\newline
+\tab{7}{\it exit.bitmap}\tab{22} = \tab{25}{\ExitBitmap{}} \newline
+\tab{7}{\it help2.bitmap}\tab{22} = \tab{25}{\HelpBitmap{}} \newline
+\tab{7}{\it up3.bitmap}\tab{22} = \tab{25}{\UpBitmap{}}\newline
+\tab{7}{\it return3.bitmap}\tab{22} = \tab{25}{\ReturnBitmap{}}\newline
+\tab{7}{\it noop.bitmap}\tab{22} = \tab{25}{\NoopBitmap{}}
+
+These files must exist in your current directory if
+the {\tt AXIOM} environment variable is not set.
+If it is, then \HyperName{} will assume that it points
+to the Axiom system directory and will look for
+these files in
+{\bf \$AXIOM/doc/hypertex/bitmaps}.
+
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Active Axiom commands}{HTXLinkPage3}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXLinkPage2xPatch1 patch}
+\label{HTXLinkPage2xPatch1}
+\index{patch!HTXLinkPage2xPatch1!htxlinkpage2.ht}
+\index{htxlinkpage2.ht!patch!HTXLinkPage2xPatch1}
+\index{HTXLinkPage2xPatch1!htxlinkpage2.ht!patch}
+<<htxlinkpage2.ht>>=
+\begin{patch}{HTXLinkPage2xPatch1}
+\begin{paste}{HTXLinkPage2xPaste1A}{HTXLinkPage2xPatch1A}
+\pastebutton{HTXLinkPage2xPaste1A}{Source}
+\newline
+\table{
+{\windowlink{SpadNotConnectedPage}{SpadNotConnectedPage}}
+{\windowlink{UnknownPage}{UnknownPage}}
+{\windowlink{ErrorPage}{ErrorPage}}
+{\windowlink{ProtectedQuitPage}{ProtectedQuitPage}}
+}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage2xPatch1A patch}
+\label{HTXLinkPage2xPatch1A}
+\index{patch!HTXLinkPage2xPatch1A!htxlinkpage2.ht}
+\index{htxlinkpage2.ht!patch!HTXLinkPage2xPatch1A}
+\index{HTXLinkPage2xPatch1A!htxlinkpage2.ht!patch}
+<<htxlinkpage2.ht>>=
+\begin{patch}{HTXLinkPage2xPatch1A}
+\begin{paste}{HTXLinkPage2xPaste1B}{HTXLinkPage2xPatch1}
+\pastebutton{HTXLinkPage2xPaste1B}{Interpret}
+\newline
+{\tt \\table\{}\newline
+{\tt \{\\windowlink\{SpadNotConnectedPage\}\{SpadNotConnectedPage\}\}}\newline
+{\tt \{\\windowlink\{UnknownPage\}\{UnknownPage\}\}}\newline
+{\tt \{\\windowlink\{ErrorPage\}\{ErrorPage\}\}}\newline
+{\tt \{\\windowlink\{ProtectedQuitPage\}\{ProtectedQuitPage\}\}}\newline
+{\tt \}}\newline
+\end{paste}
+\end{patch}
+
+@
+\section{htxlinkpage3.ht}
+\subsection{Active Axiom commands}
+\label{HTXLinkPage3}
+See HTXLinkPage4 \ref{HTXLinkPage4} on page~\pageref{HTXLinkPage4}
+\index{pages!HTXLinkPage3!htxlinkpage3.ht.ht}
+\index{htxlinkpage3.ht.ht!pages!HTXLinkPage3}
+\index{HTXLinkPage3!htxlinkpage3.ht.ht!pages}
+<<htxlinkpage3.ht.ht>>=
+\begin{page}{HTXLinkPage3}{Active Axiom commands}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+This section explains how to include Axiom
+commands in your page. The commands we will
+introduce are actually {\it macros} that are defined
+in
+\centerline{{\bf \env{AXIOM}/doc/hypertex/pages/util.ht}}
+This means that you can use them only if you include
+this file in your \HyperName{} database.
+
+The first command to learn is
+\horizontalline
+{\tt \\axiomcommand\{ {\it command }{\tt \ \\free\{}{\it var1 var2 ...}{\tt \}\ \\bound\{}{\it var}{\tt \}\ \}} }
+\horizontalline
+
+
+The {\tt \\free\{\}} and {\tt \\bound\{\}} directives are optional.
+We will come to them in a minute. The {\it command} above is the
+text of the Axiom command. Only single line commands are allowed
+here.
+This text will be displayed in the reserved AxiomFont logical
+font.  The area of the text will be active and clicking on it
+will attempt to send the command to Axiom for evaluation.
+A new Axiom interpreter window (and Axiom frame)
+will be created if this was the first Axiom command
+activated in the current page. If not, the command will be sent
+to the already opened Axiom interpreter window for the current page.
+Note that it {\it is} necessary to escape special
+\HyperName{} characters with the {\tt '\\'} backslash character.
+The exceptions are the characters {\tt \[\]}; they do not
+need to be escaped in this context.
+
+\beginImportant
+\begin{paste}{HTXLinkPage3xPaste1}{HTXLinkPage3xPatch1}
+\pastebutton{HTXLinkPage3xPaste1}{Interpret}
+\newline
+{\tt \\axiomcommand\{ l:=brace[1,2,3] ; length:=\\\# l ; m:=[1,2]\}}
+\end{paste}
+\endImportant
+
+
+The optional {\tt \\free\{\}} and {\tt \\bound\{\}} directives
+provide dependency control. The reader of a \HyperName{}
+page is not forced to click on the commands in the
+order in which in they appear on the page.  If the
+correct {\tt \\free\{\}} and {\tt \\bound\{\}}
+specifications are made, clicking on a command
+will result in execution of all those other
+commands that should be executed before it.
+This will {\it only} happen the first time the command is
+clicked.
+
+So, how are the dependencies specified?
+The arguments of the {\tt \\free\{\}} directive must
+be space-separated words (labels). The argument of {\tt \\bound\{\}}
+must be a single (unique for the page) label. Each label in the {\tt \\free\{\}} list
+must exist as an argument to one (and only one) {\tt \\bound\{\}} directive
+somewhere in the current page.
+When the command is activated, \HyperName{} will look
+in the {\tt \\free\{\}} list and check each label.
+For each label, it will find the command that specifies that label
+in its {\tt \\bound\{\}} directive and
+execute it if it has not been already executed.
+The order of labels in the {\tt \\free\{\}} directive list
+is respected. \HyperName{} will follow all
+dependency links recursively.
+
+Here is  an example.
+Clicking on the third command will automatically
+execute all of them in the correct sequence.
+Note that in this case the order of labels in the last
+line is immaterial since {\tt v2} explicitly depends on {\tt v1}.
+
+\beginImportant
+\begin{paste}{HTXLinkPage3xPaste2}{HTXLinkPage3xPatch2}
+\pastebutton{HTXLinkPage3xPaste2}{Interpret}
+\newline
+{\tt \\axiomcommand\{a:=1;d:=4 \\bound\{v1\}\}}\newline
+{\tt \\newline}\newline
+{\tt \\axiomcommand\{b:=a+3 \\free\{v1\} \\bound\{v2\}\}}\newline
+{\tt \\newline}\newline
+{\tt \\axiomcommand\{c:=b+d \\free\{v1 v2\} \\bound\{v3\}\}}\newline
+\end{paste}
+\endImportant
+
+The second command deals with multi-line Axiom
+code. This is the command to use for execution of
+an Axiom {\it pile}. It is a {\it group}
+command. The proper syntax for it is as follows:
+\horizontalline
+{\tt \\begin\{spadsrc\}\ [\\free\{{\it var1 var2} ...\}\ \\bound\{{\it var}\}]}
+\newline
+.
+\newline
+.
+\newline
+{\tt \\end\{spadsrc\}}
+\horizontalline
+
+Again, the {\tt \\free} and {\tt \\bound} directives are
+optional. If they are specified (in exactly the same way
+as {\tt \\axiomcommand}), they must be enclosed in
+square brackets {\tt []}.
+The lines between the {\tt \\begin} and {\tt \\end}
+contain the Axiom statements. Indentation
+will be respected. \HyperName{} will
+actually save this part in a temporary file
+and instruct Axiom to read the file
+with the {\tt )read} system command.
+
+Here is an example. The execution of the following
+fragment is dependent on the {\tt v3} label.
+Make sure that previous commands are active (and
+hence the label {\tt v3} is "visible") before
+trying to execute it. If the label {\tt v3}
+is not seen in the page, \HyperName{} will
+print an error message on standard output
+and ignore the dependency.
+
+
+\beginImportant
+\begin{paste}{HTXLinkPage3xPaste3}{HTXLinkPage3xPatch3}
+\pastebutton{HTXLinkPage3xPaste3}{Interpret}
+\newline
+{\tt \\begin\{spadsrc\}\ [\\free\{v3\}\ \\bound\{v4\}]}\newline
+{\tt f\ x\ ==}\newline
+{\tt \ \ \ x+c}\newline
+{\tt f\ 3}\newline
+{\tt \\end\{spadsrc\}}
+\end{paste}
+\endImportant
+
+There is, in fact, more that one can do
+with Axiom commands. In pages elsewhere
+in the system, Axiom commands appear next
+to button like this \ \MenuDotBitmap{}.
+Clicking on this button, one can see the output
+for that command. The output has been
+pre-computed and is also stored in
+\HyperName{} files. This is done using
+{\it patch} and {\it paste}.
+It is the same mechanism that
+is used to alternatively display
+\HyperName{} source and interpreted
+result in this and other pages.
+It is explained \downlink{later on}{HTXAdvPage5}.
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Linking to Lisp}{HTXLinkPage4}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXLinkPage3xPatch1 patch}
+\label{HTXLinkPage3xPatch1}
+\index{patch!HTXLinkPage3xPatch1!htxlinkpage3.ht}
+\index{htxlinkpage3.ht!patch!HTXLinkPage3xPatch1}
+\index{HTXLinkPage3xPatch1!htxlinkpage3.ht!patch}
+<<htxlinkpage3.ht>>=
+\begin{patch}{HTXLinkPage3xPatch1}
+\begin{paste}{HTXLinkPage3xPaste1A}{HTXLinkPage3xPatch1A}
+\pastebutton{HTXLinkPage3xPaste1A}{Source}
+\newline
+\axiomcommand{ l:=brace[1,2,3] ; length:=\# l ; m:=[1,2]}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage3xPatch1A patch}
+\label{HTXLinkPage3xPatch1A}
+\index{patch!HTXLinkPage3xPatch1A!htxlinkpage3.ht}
+\index{htxlinkpage3.ht!patch!HTXLinkPage3xPatch1A}
+\index{HTXLinkPage3xPatch1A!htxlinkpage3.ht!patch}
+<<htxlinkpage3.ht>>=
+\begin{patch}{HTXLinkPage3xPatch1A}
+\begin{paste}{HTXLinkPage3xPaste1B}{HTXLinkPage3xPatch1}
+\pastebutton{HTXLinkPage3xPaste1B}{Interpret}
+\newline
+{\tt \\axiomcommand\{ l:=brace[1,2,3] ; length:=\\\# l ; m:=[1,2]\}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage3xPatch2 patch}
+\label{HTXLinkPage3xPatch2}
+\index{patch!HTXLinkPage3xPatch2!htxlinkpage3.ht}
+\index{htxlinkpage3.ht!patch!HTXLinkPage3xPatch2}
+\index{HTXLinkPage3xPatch2!htxlinkpage3.ht!patch}
+<<htxlinkpage3.ht>>=
+\begin{patch}{HTXLinkPage3xPatch2}
+\begin{paste}{HTXLinkPage3xPaste2A}{HTXLinkPage3xPatch2A}
+\pastebutton{HTXLinkPage3xPaste2A}{Source}
+\newline
+\axiomcommand{a:=1;d:=4 \bound{v1}}
+\newline
+\axiomcommand{b:=a+3 \free{v1} \bound{v2}}
+\newline
+\axiomcommand{c:=b+d \free{v1 v2} \bound{v3}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage3xPatch2A patch}
+\label{HTXLinkPage3xPatch2A}
+\index{patch!HTXLinkPage3xPatch2A!htxlinkpage3.ht}
+\index{htxlinkpage3.ht!patch!HTXLinkPage3xPatch2A}
+\index{HTXLinkPage3xPatch2A!htxlinkpage3.ht!patch}
+<<htxlinkpage3.ht>>=
+\begin{patch}{HTXLinkPage3xPatch2A}
+\begin{paste}{HTXLinkPage3xPaste2B}{HTXLinkPage3xPatch2}
+\pastebutton{HTXLinkPage3xPaste2B}{Interpret}
+\newline
+{\tt \\axiomcommand\{a:=1;d:=4 \\bound\{v1\}\}}\newline
+{\tt \\newline}\newline
+{\tt \\axiomcommand\{b:=a+3 \\free\{v1\} \\bound\{v2\}\}}\newline
+{\tt \\newline}\newline
+{\tt \\axiomcommand\{c:=b+d \\free\{v1 v2\} \\bound\{v3\}\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage3xPatch3 patch}
+\label{HTXLinkPage3xPatch3}
+\index{patch!HTXLinkPage3xPatch3!htxlinkpage3.ht}
+\index{htxlinkpage3.ht!patch!HTXLinkPage3xPatch3}
+\index{HTXLinkPage3xPatch3!htxlinkpage3.ht!patch}
+<<htxlinkpage3.ht>>=
+\begin{patch}{HTXLinkPage3xPatch3}
+\begin{paste}{HTXLinkPage3xPaste3A}{HTXLinkPage3xPatch3A}
+\pastebutton{HTXLinkPage3xPaste3A}{Source}
+\newline
+\begin{spadsrc} [\free{v3} \bound{v4}]
+f x ==
+   x+c
+f 3
+\end{spadsrc}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage3xPatch3A patch}
+\label{HTXLinkPage3xPatch3A}
+\index{patch!HTXLinkPage3xPatch3A!htxlinkpage3.ht}
+\index{htxlinkpage3.ht!patch!HTXLinkPage3xPatch3A}
+\index{HTXLinkPage3xPatch3A!htxlinkpage3.ht!patch}
+<<htxlinkpage3.ht>>=
+\begin{patch}{HTXLinkPage3xPatch3A}
+\begin{paste}{HTXLinkPage3xPaste3B}{HTXLinkPage3xPatch3}
+\pastebutton{HTXLinkPage3xPaste3B}{Interpret}
+\newline
+{\tt \\begin\{spadsrc\}\ [\\free\{v3\}\ \\bound\{v4\}]}\newline
+{\tt f\ x\ ==}\newline
+{\tt \ \ \ x+c}\newline
+{\tt f\ 3}\newline
+{\tt \\end\{spadsrc\}}
+\end{paste}
+\end{patch}
+
+@
+\section{htxlinkpage4.ht}
+\subsection{Linking to Lisp}
+\label{HTXLinkPage4}
+See HTXLinkPage5 \ref{HTXLinkPage5} on page~\pageref{HTXLinkPage5}
+\index{pages!HTXLinkPage4!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!pages!HTXLinkPage4}
+\index{HTXLinkPage4!htxlinkpage4.ht!pages}
+<<htxlinkpage4.ht>>=
+\begin{page}{HTXLinkPage4}{Linking to Lisp}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+Another feature of the Axiom\hspace{2}--\HyperName{}
+link is the ability to execute {\it Lisp}
+code at a click of a button.
+There are two things one can do.
+
+The first is to cause the evaluation
+of a {\it Lisp} form and ignore (as far as \HyperName{}
+is concerned) its value. The evaluation of the function
+might have an effect however on your Axiom session.
+
+The command for this is
+\horizontalline
+\centerline{ {\tt \\lispcommand\{{\it text}\}\{{\it Lisp form}\}}}
+\horizontalline
+
+Here is an example. We will first define a {\it Lisp} function
+and then execute it.  Notice that the \HyperName{}
+special characters must be escaped (this is on top
+of {\it Lisp} escaping conventions).
+
+
+\beginImportant
+\begin{paste}{HTXLinkPage4xPaste1}{HTXLinkPage4xPatch1}
+\pastebutton{HTXLinkPage4xPaste1}{Interpret}
+\newline
+{\tt \\lispcommand\{Definition\}\{(defun HTXTESTFUNCTION ()}\newline
+{\tt  (print "Hello from HyperDoc \\\\\\\\ \\\% \\\{ \\\}"))\}} \newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{Execution\}\{(HTXTESTFUNCTION)\}} \newline
+\end{paste}
+\endImportant
+
+Your command will be executed as soon as
+Axiom completes any computation it might be
+carrying out.
+
+
+%\axiomcommand{)lisp (defun f () (pprint "hello"))}
+%\lispcommand{f}{(|f|)}
+
+
+The second thing you can do is quite powerful. It allows you
+to delegate to a {\it Lisp} function
+the {\it dynamic} creation of a page. This is used
+in \Browse{} to present
+the Axiom Library in a hypertext form.
+
+The command to use is a lot like the {\tt link} commands
+you encountered \downlink{earlier}{HTXLinkPage1} and comes in three flavours.
+\centerline{{\tt \\lispwindowlink\{{\it trigger}\}\{{\it Lisp form}\}}}
+\centerline{{\tt \\lispdownlink\{{\it trigger}\}\{{\it Lisp form}\}}}
+\centerline{{\tt \\lispmemolink\{{\it trigger}\}\{{\it Lisp form}\}}}
+
+The difference between the three versions is the same as before.
+When such a link is activated, \HyperName{} issues the
+{\it Lisp form} to Axiom and waits for a full
+page definition. An important point to note is that
+\HyperName{} does {\it not} use
+the value of the {\it Lisp form} but, instead, it
+depends on its {\it side-effects}.
+What {\it must} happen during evaluation
+of the form is enough evaluations of a special {\it Lisp}
+function called {\bf issueHT} to define a page.
+The argument of {\bf issueHT} is a string
+containing \HyperName{} text. Perhaps an example will clarify
+matters.
+
+First we will define a {\it Lisp} function that accepts
+a string argument and calls {\bf issueHT} a few times.
+The strings that are passed to {\bf issueHT} construct
+a \HyperName{} page that would just contain our
+original argument centered roughly on the page.
+Then we write the {\tt \\lisplink} with a call to
+the function. Finally, we execute a {\it Lisp}
+command that just pretty--prints the function's definition.
+
+
+
+\beginImportant
+\begin{paste}{HTXLinkPage4xPaste2}{HTXLinkPage4xPatch2}
+\pastebutton{HTXLinkPage4xPaste2}{Interpret}
+\newline
+{\tt \\lispcommand\{Definition\}\{(defun HTXTESTPAGE (x) (|issueHT|}\newline
+{\tt  "\\\\\\\\begin\\\{page\\\}\\\{LispTestPage\\\}\\\{Lisp Test Page\\\}}\newline
+{\tt  \\\\\\\\vspace\\\{150\\\} \\\\\\\\centerline\\\{") (|issueHT| x) (|issueHT|}\newline
+{\tt  "\\\} \\\\\\\\end\\\{page\\\}" ) ) \}}\newline
+{\tt \\newline}\newline
+{\tt \\lispwindowlink\{Link to it\}\{(HTXTESTPAGE "Hi there")\}}\newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{Show Lisp definition\}\{(pprint (symbol-function 'HTXTESTPAGE))\}}\newline
+\end{paste}
+\endImportant
+
+The {\tt '\\\{'} and {\tt '\\\}'} is required to escape
+\HyperName{}'s special characters {\tt '\{'} and {\tt  '\}'}.
+The {\tt '\\\\\\\\'} has the following rationale.
+We need to send to \HyperName{} (from {\it Lisp}) the sequence
+{\tt \\begin}. But {\tt '\\'} is a special {\it Lisp}
+character. Therefore the {\it Lisp} string must be
+{\tt '\\\\begin'}. But to specify this
+in \HyperName{} we need to escape the two {\tt '\\'}.
+Therefore, we write {\tt '\\\\\\\\begin'}.
+
+
+The definition of {\tt HTXTESTPAGE} would have been written in {\it Lisp}
+as follows.
+\begin{verbatim}
+(defun HTXTESTPAGE (X)
+   (|issueHT|
+      "\\begin{page}{LispTestPage}{Lisp Test Page} \\vspace{200} \\centerline{")
+   (|issueHT| X)
+   (|issueHT| "} \\end{page}"))
+\end{verbatim}
+
+
+
+You should not execute {\tt HTXTESTPAGE} in the
+{\it Lisp} environment manually. It is meant to
+be executed {\it only} in response to a
+\HyperName{} request.
+
+Can you pop-up a named page from {\it Lisp} regardless of
+user action? Yes --- use {\it Lisp} function {\bf linkToHTPage}
+with the page name as a string argument. Click on the
+{\tt \\axiomcommand} below. Then, in your Axiom
+session, you can repeat it if you like.
+
+\beginImportant
+\begin{paste}{HTXLinkPage4xPaste3}{HTXLinkPage4xPatch3}
+\pastebutton{HTXLinkPage4xPaste3}{Interpret}
+\newline
+{\tt \\axiomcommand\{)lisp (|linkToHTPage| "RootPage")\}}
+\end{paste}
+\endImportant
+
+You can also pop-up a {\it dynamic} page regardless of user action.
+To do this, make sure you evaluate the {\it Lisp form}
+{\bf (|startHTPage| 50)} before using {\bf issueHT}.
+The example below requires the {\tt HTXTESTPAGE} function
+to be defined in {\it Lisp} so you should make sure
+you have executed the command above that defines it.
+
+\beginImportant
+\begin{paste}{HTXLinkPage4xPaste4}{HTXLinkPage4xPatch4}
+\pastebutton{HTXLinkPage4xPaste4}{Interpret}
+\newline
+{\tt \\axiomcommand\{)lisp (progn (|startHTPage| 50)(HTXTESTPAGE "Immediately"))\}}
+\end{paste}
+\endImportant
+
+Now, the most important use of this facility
+so far has been in the \Browse{} and Basic Commands components of
+\HyperName{}. Instead of giving you details of the various
+\Browse{} {\it Lisp} functions, a few macros are defined in
+\centerline{{\bf \$AXIOM/doc/hypertex/pages/util.ht}}
+
+The most important defined macros are
+\beginImportant
+\table{
+{ {\tt \\axiomType\{{\it constructor}\}} }
+{ {\tt \\axiomOp\{{\it operation}\}} }
+{ {\tt \\axiomOpFrom\{{\it operation }\}\{{\it constructor}\}}}
+}
+\endImportant
+
+Here are some examples of their use.
+\beginImportant
+\begin{paste}{HTXLinkPage4xPaste5}{HTXLinkPage4xPatch5}
+\pastebutton{HTXLinkPage4xPaste5}{Interpret}
+\newline
+{\tt \\axiomType\{Expression Integer\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomType\{Expression\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomType\{EXPR\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomOp\{reduce\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomOp\{as*\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomOpFrom\{reduce\}\{Expression\}}\newline
+\end{paste}
+\endImportant
+
+The macro {\tt \\axiomType} brings up the \Browse{}
+constructor page for the constructor specified.
+You can specify a full name, or an abbreviation
+or just the top level name.
+The macro {\tt \\axiomOp} brings up a list of operations
+matching the argument.
+The macro {\tt \\axiomOpFrom} shows documentation
+about the specified operation whose origin is
+constructor. No wildcard in the operation name
+or type abbreviation is
+allowed here.  You should also specify just the top level type.
+
+
+
+
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- Linking to Unix}{HTXLinkPage5}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXLinkPage4xPatch1 patch}
+\label{HTXLinkPage4xPatch1}
+\index{patch!HTXLinkPage4xPatch1!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch1}
+\index{HTXLinkPage4xPatch1!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch1}
+\begin{paste}{HTXLinkPage4xPaste1A}{HTXLinkPage4xPatch1A}
+\pastebutton{HTXLinkPage4xPaste1A}{Source}
+\newline
+\lispcommand{Definition}{(defun HTXTESTFUNCTION ()
+(print "Hello from HyperDoc \\\\ \% \{ \}"))}
+\newline
+\lispcommand{Execution}{(HTXTESTFUNCTION)}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch1A patch}
+\label{HTXLinkPage4xPatch1A}
+\index{patch!HTXLinkPage4xPatch1A!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch1A}
+\index{HTXLinkPage4xPatch1A!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch1A}
+\begin{paste}{HTXLinkPage4xPaste1B}{HTXLinkPage4xPatch1}
+\pastebutton{HTXLinkPage4xPaste1B}{Interpret}
+\newline
+{\tt \\lispcommand\{Definition\}\{(defun HTXTESTFUNCTION () (print "Hello from HyperDoc \\\\\\\\ \\\% \\\{ \\\}"))\}} \newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{Execution\}\{(HTXTESTFUNCTION)\}} \newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch2 patch}
+\label{HTXLinkPage4xPatch2}
+\index{patch!HTXLinkPage4xPatch2!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch2}
+\index{HTXLinkPage4xPatch2!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch2}
+\begin{paste}{HTXLinkPage4xPaste2A}{HTXLinkPage4xPatch2A}
+\pastebutton{HTXLinkPage4xPaste2A}{Source}
+\newline
+\lispcommand{Definition}{(defun HTXTESTPAGE (x) (|issueHT|
+"\\\\begin\{page\}\{LispTestPage\}\{Lisp Test Page\}
+\\\\vspace\{150\} \\\\centerline\{") (|issueHT| x) (|issueHT|
+"\} \\\\end\{page\}" ) ) }
+\newline
+\lispwindowlink{Link to it}{(HTXTESTPAGE "Hi there")}
+\newline
+\lispcommand{Show Lisp definition}{(pprint (symbol-function 'HTXTESTPAGE))}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch2A patch}
+\label{HTXLinkPage4xPatch2A}
+\index{patch!HTXLinkPage4xPatch2A!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch2A}
+\index{HTXLinkPage4xPatch2A!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch2A}
+\begin{paste}{HTXLinkPage4xPaste2B}{HTXLinkPage4xPatch2}
+\pastebutton{HTXLinkPage4xPaste2B}{Interpret}
+\newline
+{\tt \\lispcommand\{Definition\}\{(defun HTXTESTPAGE (x) (|issueHT|}\newline
+{\tt  "\\\\\\\\begin\\\{page\\\}\\\{LispTestPage\\\}\\\{Lisp Test Page\\\}}\newline
+{\tt  \\\\\\\\vspace\\\{150\\\} \\\\\\\\centerline\\\{") (|issueHT| x) (|issueHT|}\newline
+{\tt  "\\\} \\\\\\\\end\\\{page\\\}" ) ) \}}\newline
+{\tt \\newline}\newline
+{\tt \\lispwindowlink\{Link to it\}\{(HTXTESTPAGE "Hi there")\}}\newline
+{\tt \\newline}\newline
+{\tt \\lispcommand\{Show Lisp definition\}\{(pprint (symbol-function 'HTXTESTPAGE))\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch3 patch}
+\label{HTXLinkPage4xPatch3}
+\index{patch!HTXLinkPage4xPatch3!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch3}
+\index{HTXLinkPage4xPatch3!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch3}
+\begin{paste}{HTXLinkPage4xPaste3A}{HTXLinkPage4xPatch3A}
+\pastebutton{HTXLinkPage4xPaste3A}{Source}
+\newline
+\axiomcommand{)lisp (|linkToHTPage| "RootPage")}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch3A patch}
+\label{HTXLinkPage4xPatch3A}
+\index{patch!HTXLinkPage4xPatch3A!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch3A}
+\index{HTXLinkPage4xPatch3A!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch3A}
+\begin{paste}{HTXLinkPage4xPaste3B}{HTXLinkPage4xPatch3}
+\pastebutton{HTXLinkPage4xPaste3B}{Interpret}
+\newline
+{\tt \\axiomcommand\{)lisp (|linkToHTPage| "RootPage")\}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch4 patch}
+\label{HTXLinkPage4xPatch4}
+\index{patch!HTXLinkPage4xPatch4!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch4}
+\index{HTXLinkPage4xPatch4!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch4}
+\begin{paste}{HTXLinkPage4xPaste4A}{HTXLinkPage4xPatch4A}
+\pastebutton{HTXLinkPage4xPaste4A}{Source}
+\newline
+\axiomcommand{)lisp (progn (|startHTPage| 50)(HTXTESTPAGE "Immediately"))}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch4A patch}
+\label{HTXLinkPage4xPatch4A}
+\index{patch!HTXLinkPage4xPatch4A!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch4A}
+\index{HTXLinkPage4xPatch4A!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch4A}
+\begin{paste}{HTXLinkPage4xPaste4B}{HTXLinkPage4xPatch4}
+\pastebutton{HTXLinkPage4xPaste4B}{Interpret}
+\newline
+{\tt \\axiomcommand\{)lisp (progn (|startHTPage| 50)(HTXTESTPAGE "Immediately"))\}}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch5 patch}
+\label{HTXLinkPage4xPatch5}
+\index{patch!HTXLinkPage4xPatch5!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch5}
+\index{HTXLinkPage4xPatch5!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch5}
+\begin{paste}{HTXLinkPage4xPaste5A}{HTXLinkPage4xPatch5A}
+\pastebutton{HTXLinkPage4xPaste5A}{Source}
+\newline
+\axiomType{Expression Integer}
+\newline
+\axiomType{Expression}
+\newline
+\axiomType{EXPR}
+\newline
+\axiomOp{reduce}
+\newline
+\axiomOp{as*}
+\newline
+\axiomOpFrom{reduce}{Expression}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage4xPatch5A patch}
+\label{HTXLinkPage4xPatch5A}
+\index{patch!HTXLinkPage4xPatch5A!htxlinkpage4.ht}
+\index{htxlinkpage4.ht!patch!HTXLinkPage4xPatch5A}
+\index{HTXLinkPage4xPatch5A!htxlinkpage4.ht!patch}
+<<htxlinkpage4.ht>>=
+\begin{patch}{HTXLinkPage4xPatch5A}
+\begin{paste}{HTXLinkPage4xPaste5B}{HTXLinkPage4xPatch5}
+\pastebutton{HTXLinkPage4xPaste5B}{Interpret}
+\newline
+{\tt \\axiomType\{Expression Integer\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomType\{Expression\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomType\{EXPR\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomOp\{reduce\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomOp\{as*\}}\newline
+{\tt \newline}\newline
+{\tt \\axiomOpFrom\{reduce\}\{Expression\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\section{htxlinkpage5.ht}
+\subsection{Linking to Unix}
+\label{HTXLinkPage5}
+\index{pages!HTXLinkPage5!htxlinkpage5.ht}
+\index{htxlinkpage5.ht!pages!HTXLinkPage5}
+\index{HTXLinkPage5!htxlinkpage5.ht!pages}
+<<htxlinkpage5.ht>>=
+\begin{page}{HTXLinkPage5}{Linking to Unix}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+Let us conclude the tour of \HyperName{}
+actions that can be triggered with a click of a button
+with two more facilities. These are
+\beginImportant
+\table{
+{ {\tt \\unixcommand\{{\it trigger text}\}\{{\it unix command}\}}}
+{ {\tt \\unixlink\{{\it trigger text}\}\{{\it unix command}\}}}
+}
+\endImportant
+
+
+The first one, {\tt \\unixcommand}, is very much like
+{\tt \\axiomcommand} and {\tt \\lispcommand}.
+The trigger text becomes an active area. Clicking on it
+will force \HyperName{} to pass the second argument
+to the system as a shell command to be executed.
+The shell used is {\bf /bin/sh}.
+\HyperName{} ignores the output of the command.
+
+
+\beginImportant
+\begin{paste}{HTXLinkPage5xPaste1}{HTXLinkPage5xPatch1}
+\pastebutton{HTXLinkPage5xPaste1}{Interpret}
+\newline
+{\tt \\unixcommand\{List \\\$HOME directory\}\{ls \\\$HOME\}}\newline
+\end{paste}
+\endImportant
+
+The {\tt \\unixlink} command delegates to a another
+program the creation of a dynamic page. When the trigger
+text is activated, \HyperName{} will invoke the command
+specified in the second argument. It will then start reading
+the {\it standard output} of the command until
+a complete page has been received. It is important that
+a single page and nothing more is written by the command.
+This command is essentially a {\tt \\downlink}, i.e.
+the new page replaces the current page in the window.
+There aren't any other flavours of {\tt \\unixlink}.
+A trivial example is to use {\bf cat} on a \HyperName{}
+file known to contain just one page.
+
+\beginImportant
+\begin{paste}{HTXLinkPage5xPaste2}{HTXLinkPage5xPatch2}
+\pastebutton{HTXLinkPage5xPaste2}{Interpret}
+\newline
+{\tt \\unixlink\{Some file\}} \newline
+{\tt \{cat\\ \\env\{AXIOM\}/doc/hypertex/pages/HTXplay.ht\}}
+\end{paste}
+\endImportant
+
+
+Two things to notice in the second argument of
+{\tt \\unixlink}: You must use a {\it hard space}
+{\tt '\\\ '} to preserve the spacing in the command.
+Also, the {\tt \\env} command allows you to use
+an environment variable in \HyperName{} text.
+
+With a little ingenuity (and maybe some shell and {\bf awk} scripts !)
+, one can use these
+facilities to create, say, a point-and-click
+directory viewer which allows you to edit
+a file by clicking on its name.
+
+\end{scroll}
+\beginmenu
+\menulink{Next -- How to use your pages with \HyperName{}}{HTXLinkPage6}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXLinkPage5xPatch1 patch}
+\label{HTXLinkPage5xPatch1}
+\index{patch!HTXLinkPage5xPatch1!htxlinkpage5.ht}
+\index{htxlinkpage5.ht!patch!HTXLinkPage5xPatch1}
+\index{HTXLinkPage5xPatch1!htxlinkpage5.ht!patch}
+<<htxlinkpage5.ht>>=
+\begin{patch}{HTXLinkPage5xPatch1}
+\begin{paste}{HTXLinkPage5xPaste1A}{HTXLinkPage5xPatch1A}
+\pastebutton{HTXLinkPage5xPaste1A}{Source}
+\newline
+\unixcommand{List \$HOME directory}{ls \$HOME}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage5xPatch1A patch}
+\label{HTXLinkPage5xPatch1A}
+\index{patch!HTXLinkPage5xPatch1A!htxlinkpage5.ht}
+\index{htxlinkpage5.ht!patch!HTXLinkPage5xPatch1A}
+\index{HTXLinkPage5xPatch1A!htxlinkpage5.ht!patch}
+<<htxlinkpage5.ht>>=
+\begin{patch}{HTXLinkPage5xPatch1A}
+\begin{paste}{HTXLinkPage5xPaste1B}{HTXLinkPage5xPatch1}
+\pastebutton{HTXLinkPage5xPaste1B}{Interpret}
+\newline
+{\tt \\unixcommand\{List \\\$HOME directory\}\{ls \\\$HOME\}}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage5xPatch2 patch}
+\label{HTXLinkPage5xPatch2}
+\index{patch!HTXLinkPage5xPatch2!htxlinkpage5.ht}
+\index{htxlinkpage5.ht!patch!HTXLinkPage5xPatch2}
+\index{HTXLinkPage5xPatch2!htxlinkpage5.ht!patch}
+<<htxlinkpage5.ht>>=
+\begin{patch}{HTXLinkPage5xPatch2}
+\begin{paste}{HTXLinkPage5xPaste2A}{HTXLinkPage5xPatch2A}
+\pastebutton{HTXLinkPage5xPaste2A}{Source}
+\newline
+\unixlink{Some file}
+{cat\ \env{AXIOM}/doc/hypertex/pages/HTXplay.ht}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage5xPatch2A patch}
+\label{HTXLinkPage5xPatch2A}
+\index{patch!HTXLinkPage5xPatch2A!htxlinkpage5.ht}
+\index{htxlinkpage5.ht!patch!HTXLinkPage5xPatch2A}
+\index{HTXLinkPage5xPatch2A!htxlinkpage5.ht!patch}
+<<htxlinkpage5.ht>>=
+\begin{patch}{HTXLinkPage5xPatch2A}
+\begin{paste}{HTXLinkPage5xPaste2B}{HTXLinkPage5xPatch2}
+\pastebutton{HTXLinkPage5xPaste2B}{Interpret}
+\newline
+{\tt \\unixlink\{Some file\}} \newline
+{\tt \{cat\\ \\env\{AXIOM\}/doc/hypertex/pages/HTXplay.ht\}}
+\end{paste}
+\end{patch}
+
+@
+\section{htxlinkpage6.ht}
+\subsection{How to use your pages with Hyperdoc}
+\label{HTXLinkPage6}
+\index{pages!HTXLinkPage6!htxlinkpage6.ht}
+\index{htxlinkpage6.ht!pages!HTXLinkPage6}
+\index{HTXLinkPage6!htxlinkpage6.ht!pages}
+<<htxlinkpage6.ht>>=
+\begin{page}{HTXLinkPage6}{How to use your pages with Hyperdoc}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\begin{scroll}
+
+Let us say that you have written a few \HyperName{}
+pages and you would like to incorporate them in the system.
+Here is what you should do.
+
+Put all your files in some directory and make sure that
+they all have the {\bf .ht} extension.
+
+You will need a way of "hooking" into a system--defined
+\HyperName{} page. The proper way to do this is to use
+the {\tt \\localinfo} macro. The Axiom system
+\HyperName{} page database includes, as it should,
+a {\tt RootPage}. This is the page that first comes up
+when you start \HyperName{}. This page contains
+a line like this.
+\beginImportant
+\newline
+{\tt \\localinfo}
+\endImportant
+
+This macro is defined in
+\centerline{ {\bf \env{AXIOM}/doc/hypertex/pages/util.ht}}
+to be (see \downlink{Macros}{HTXAdvPage3} to learn how to define macros):
+\beginImportant
+\newline
+{\tt \\newcommand\{\\localinfo\}\{\}}
+\endImportant
+which is an empty definition (the second argument of {\tt \\newcommand}).
+The idea then is that you {\it override} this definition of the macro
+with your own.
+To do that, include a definition like the following in one (possibly the
+one that contains your top--level page) of your files. You can
+put this definition in its own file if you like.
+\beginImportant
+\newline
+{\tt \\newcommand\{\\localinfo\}\{\\menuwindowlink\{{\it active text}\}} \newline
+{\tt \{{\it page name}\} \\tab\{16\}{\it short description}\}}
+\endImportant
+
+If you have a look at the initial \HyperName{} page, you will
+probably be able to decipher what this does. The macro
+{\tt \\menuwindowlink} is defined (again in {\bf util.ht})
+and is responsible for putting the little square to the left of the
+active area.
+Specify a word or two for {\it active text}. That will become the
+trigger of the {\tt \\link}. Specify the page name of your top--level page
+in {\it page name}. Finally, you can give a comment about the topic
+under {\it short description}. That will appear to the right of the
+{\it active text}.
+
+The next thing you need to do is to create a {\it local database}
+for your files. You will use the {\bf \env{AXIOM}/bin/htadd} program.
+This program will create an {\bf ht.db} file that summarises your
+definitions and acts as an index. Let us present an example
+of its use. Suppose you have two files {\bf user1.ht} and {\bf user2.ht}
+in directory {\bf /u/sugar/\HyperName{}}. You should create the {\bf ht.db}
+in that same directory. To create the {\bf ht.db} file you issue to
+the unix shell:
+\beginImportant
+\newline
+{\tt htadd -f /u/sugar/\HyperName{} /u/sugar/\HyperName{}/user1.ht /u/sugar/\HyperName{}/user2.ht}
+\centerline{or ,if you are already in /u/sugar/\HyperName{}}
+{\tt htadd -l ./user1.ht ./user2.ht}
+\endImportant
+
+
+The options and conventions for {\bf htadd} will be explained below.
+To start \HyperName{} with your own pages, you now need to tell
+it where to search for {\bf ht.db} files and \HyperName{} {\bf .ht}
+files. To do this, define the shell environment variable
+{\bf HTPATH}. The value should be a colon {\tt ':'} separated
+list of directory full pathnames.
+The order of the directories is respected with earlier entries overriding
+later ones. Since we want all the Axiom pages but need to override the
+{\tt \\localinfo} macro, we should use the value
+\centerline{{\bf /u/sugar/\HyperName{}:\env{AXIOM}/doc/hypertex/pages}}
+The way that you define environment variables depends on the shell
+you are using. In the {\bf /bin/csh}, it would be
+\newline
+{\bf setenv HTPATH /u/sugar/\HyperName{}:\env{AXIOM}{}/doc{}/hypertex{}/pages}
+
+
+
+\beginImportant
+\begin{paste}{HTXLinkPage6xPaste1}{HTXLinkPage6xPatch1}
+\pastebutton{HTXLinkPage6xPaste1}{Options for {\bf htadd}}
+\newline
+\end{paste}
+\endImportant
+
+
+\beginImportant
+\begin{paste}{HTXLinkPage6xPaste2}{HTXLinkPage6xPatch2}
+\pastebutton{HTXLinkPage6xPaste2}{Where does \HyperName{} look for files}
+\newline
+\end{paste}
+\endImportant
+
+
+
+\end{scroll}
+\beginmenu
+\menulink{Back to Actions menu}{HTXLinkTopPage}
+\endmenu
+
+\end{page}
+
+@
+\subsection{HTXLinkPage6xPatch1 patch}
+\label{HTXLinkPage6xPatch1}
+\index{patch!HTXLinkPage6xPatch1!htxlinkpage6.ht}
+\index{htxlinkpage6.ht!patch!HTXLinkPage6xPatch1}
+\index{HTXLinkPage6xPatch1!htxlinkpage6.ht!patch}
+<<htxlinkpage6.ht>>=
+\begin{patch}{HTXLinkPage6xPatch1}
+\begin{paste}{HTXLinkPage6xPaste1A}{HTXLinkPage6xPatch1A}
+\pastebutton{HTXLinkPage6xPaste1A}{Hide}
+\newline
+Name:
+
+{\tt htadd - create or modify a \HyperName{} database}
+\vspace{}
+\newline
+Syntax:
+
+{\tt htadd [ -l | -s | -f\ }{\it path}{\tt ] [ -d | -n ]\ }{\it filename ...}
+\vspace{}
+\newline
+Options:\indentrel{4}\newline
+{\tt -l}\tab{8}\indentrel{8}
+build {\bf ht.db} database in current working directory.
+This is the default behaviour if no {\tt -l}, {\tt -s} or {\tt -f}
+is specified.
+
+\indentrel{-8}\newline
+{\tt -s}\tab{8}\indentrel{8}
+build {\bf ht.db} database in {\it system} directory. The
+system directory is built as follows. If the {\tt AXIOM}
+variable is defined, the {\bf \$AXIOM/doc/hypertex/pages} directory
+is used. If {\tt AXIOM} is not defined, the
+{\bf /usr/local/axiom/doc/hypertex/pages} directory is used.
+
+
+\indentrel{-8}\newline
+{\tt -f\ }{\it path}\newline\tab{8}\indentrel{8}
+build {\bf ht.db} database in specified {\it path}.
+
+\indentrel{-8}\newline
+{\tt -d}\tab{8}\indentrel{8}
+delete the entries in the specified files from {\bf ht.db}.
+
+\indentrel{-8}\newline
+{\tt -n}\tab{8}\indentrel{8}
+delete {\bf ht.db} and create a new one using only the files
+specified.
+
+If none of {\tt -n} and {\tt -d} is specified, the {\bf ht.db}
+is updated with the entries in the file specified.
+
+
+\indentrel{-8}
+\indentrel{-4}
+\vspace{}\newline
+Filename interpretation :
+\indentrel{12}\newline
+A full pathname (i.e. anything that has a {\tt '/'} in it)
+will be taken do be a completely specified file.
+Otherwise, the following interpretation will occur:
+If the {\tt HTPATH} variable is defined, the directories
+specified in it will be tried in order. If {\tt HTPATH}
+is not defined, then, if {\tt AXIOM} is defined, the
+{\bf \$AXIOM/doc/hypertex/pages} will be tried, else
+the file will be deemed missing and {\bf htadd} will fail.
+\indentrel{-12}
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage6xPatch1A patch}
+\label{HTXLinkPage6xPatch1A}
+\index{patch!HTXLinkPage6xPatch1A!htxlinkpage6.ht}
+\index{htxlinkpage6.ht!patch!HTXLinkPage6xPatch1A}
+\index{HTXLinkPage6xPatch1A!htxlinkpage6.ht!patch}
+<<htxlinkpage6.ht>>=
+\begin{patch}{HTXLinkPage6xPatch1A}
+\begin{paste}{HTXLinkPage6xPaste1B}{HTXLinkPage6xPatch1}
+\pastebutton{HTXLinkPage6xPaste1B}{Options for {\bf htadd}}
+\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage6xPatch2 patch}
+\label{HTXLinkPage6xPatch2}
+\index{patch!HTXLinkPage6xPatch2!htxlinkpage6.ht}
+\index{htxlinkpage6.ht!patch!HTXLinkPage6xPatch2}
+\index{HTXLinkPage6xPatch2!htxlinkpage6.ht!patch}
+<<htxlinkpage6.ht>>=
+\begin{patch}{HTXLinkPage6xPatch2}
+\begin{paste}{HTXLinkPage6xPaste2A}{HTXLinkPage6xPatch2A}
+\pastebutton{HTXLinkPage6xPaste2A}{Hide}
+\indentrel{12}\newline
+The \HyperName{} program is
+\centerline{{\bf \env{AXIOM}/lib/hypertex}}
+If {\tt AXIOM} is defined and {\tt HTPATH} is not
+(this is the case when Axiom starts \HyperName{})
+\HyperName{} will look in
+\centerline{{\bf \env{AXIOM}/doc/hypertex/pages}}
+for the {\bf ht.db} file and all \HyperName{} pages.
+If {\tt HTPATH} is defined, it is assumed that
+it alone points to the directories to be searched
+(the above default will NOT be searched unless
+explicitly specified in {\tt HTPATH}).
+For each directory in {\tt HTPATH}, the {\bf ht.db}
+file, if there, will be read.
+Each file listed in {\bf ht.db} will
+then be searched for in the complete sequence
+of directories in {\tt HTPATH}. Note that
+the {\bf ht.db} does not keep full pathnames
+ of files.
+If a {\it page}, {\it macro} or {\it patch}
+(specified in some {\bf ht.db}) happens
+to be (in a file) in more than one of the directories
+specified in {\tt HTPATH}, \HyperName{}
+will print a warning and explain which version
+in which file is ignored. Generally, earlier
+directories in {\tt HTPATH} are preferred over later
+ones.
+\indentrel{-12}\newline
+\end{paste}
+\end{patch}
+
+@
+\subsection{HTXLinkPage6xPatch2A patch}
+\label{HTXLinkPage6xPatch2A}
+\index{patch!HTXLinkPage6xPatch2A!htxlinkpage6.ht}
+\index{htxlinkpage6.ht!patch!HTXLinkPage6xPatch2A}
+\index{HTXLinkPage6xPatch2A!htxlinkpage6.ht!patch}
+<<htxlinkpage6.ht>>=
+\begin{patch}{HTXLinkPage6xPatch2A}
+\begin{paste}{HTXLinkPage6xPaste2B}{HTXLinkPage6xPatch2}
+\pastebutton{HTXLinkPage6xPaste2B}{Where does \HyperName{} look for files}}
+\newline
+\end{paste}
+\end{patch}
+
+@
+\section{htxlinktoppage.ht}
+\subsection{Actions in Hyperdoc}
+\label{HTXLinkTopPage}
+\begin{itemize}
+\item HTXLinkPage1 \ref{HTXLinkPage1} on page~\pageref{HTXLinkPage1}
+\item HTXLinkPage2 \ref{HTXLinkPage2} on page~\pageref{HTXLinkPage2}
+\item HTXLinkPage3 \ref{HTXLinkPage3} on page~\pageref{HTXLinkPage3}
+\item HTXLinkPage4 \ref{HTXLinkPage4} on page~\pageref{HTXLinkPage4}
+\item HTXLinkPage5 \ref{HTXLinkPage5} on page~\pageref{HTXLinkPage5}
+\item HTXLinkPage6 \ref{HTXLinkPage6} on page~\pageref{HTXLinkPage6}
+\end{itemize}
+\index{pages!HTXLinkTopPage!htxlinktoppage.ht}
+\index{htxlinktoppage.ht!pages!HTXLinkTopPage}
+\index{HTXLinkTopPage!htxlinktoppage.ht!pages}
+<<htxlinktoppage.ht>>=
+\begin{page}{HTXLinkTopPage}{Actions in Hyperdoc}
+\centerline{\fbox{{\tt \thispage}}}\newline
+\HyperName{} offers various types of hypertext links.
+You can learn about these facilities by clicking on the topics below.
+\begin{scroll}
+\beginmenu
+\menudownlink{Linking to a named page}{HTXLinkPage1}
+\menudownlink{Standard pages}{HTXLinkPage2}
+\menudownlink{Active Axiom commands}{HTXLinkPage3}
+\menudownlink{Linking to Lisp}{HTXLinkPage4}
+\menudownlink{Linking to Unix}{HTXLinkPage5}
+\menudownlink{How to use your pages with \HyperName{}}{HTXLinkPage6}
+\endmenu
+\end{scroll}
+\end{page}
+
+@
+\section{htxtoppage.ht}
+\subsection{Extending Hyperdoc}
+\label{HTXTopPage}
+\begin{itemize}
+\item HTXIntroTopPage \ref{HTXIntroTopPage} on page~\pageref{HTXIntroTopPage}
+\item HTXFormatTopPage \ref{HTXFormatTopPage} on 
+page~\pageref{HTXFormatTopPage}
+\item HTXLinkTopPage \ref{HTXLinkTopPage} on page~\pageref{HTXLinkTopPage}
+\item HTXAdvTopPage \ref{HTXAdvTopPage} on page~\pageref{HTXAdvTopPage}
+\item HTXTryPage \ref{HTXTryTopPage} on page~\pageref{HTXTryPage}
+\end{itemize}
+\index{pages!HTXTopPage!htxtoppage.ht}
+\index{htxtoppage.ht!pages!HTXTopPage}
+\index{HTXTopPage!htxtoppage.ht!pages}
+<<htxtoppage.ht>>=
+\begin{page}{HTXTopPage}{Extending Hyperdoc}
+\centerline{\fbox{{\tt \thispage}}}\newline
+This is a guide to extending \HyperName{}. You can learn
+how to write your own \HyperName{} pages and link them to the
+\HyperName{} page database that Axiom uses.
+\begin{scroll}
+\beginmenu
+\menumemolink{Introduction}{HTXIntroTopPage} \tab{20} An easy start.
+\menumemolink{Formatting}{HTXFormatTopPage} \tab{20} Learn how to format text.
+\menumemolink{Actions}{HTXLinkTopPage} \tab{20} Learn how to define actions.
+\menumemolink{Advanced features}{HTXAdvTopPage} \tab{20} More effects.
+\menuwindowlink{Try it!}{HTXTryPage} \tab{20} Try out what you learn.
+\endmenu
+\end{scroll}
+\end{page}
+
+@
+\section{htxtrypage.ht}
+\subsection{Try out Hyperdoc}
+\label{HTXTryPage}
+\index{pages!HTXTryPage!htxtrypage.ht}
+\index{htxtrypage.ht!pages!HTXTryPage}
+\index{HTXTryPage!htxtrypage.ht!pages}
+<<htxtrypage.ht>>=
+\begin{page}{HTXTryPage}{Try out Hyperdoc}
+\centerline{\fbox{{\tt \thispage}}}\newline
+
+This page allows you to quickly experiment with \HyperName{}.
+It is a good idea to keep it handy as you learn about various commands.
+
+\beginscroll
+
+We are going to use here the \HyperName{} facilities that allow
+us to communicate with external programs and files. For more
+information see \downlink{later on}{HTXLinkPage5}.
+\beginmenu
+\item\menuitemstyle{
+In order to use the buttons at the bottom of this page, you must
+first specify a name for the file you are going to use to hold
+\HyperName{} commands. Edit the input area below to change the
+name of the file.}
+\item\menuitemstyle{
+If the file you specified does not yet exist, click on the
+{\bf Initialize} button below. This action will fill the file
+with the minimum of \HyperName{} commands necessary to define a page.}
+\item\menuitemstyle{
+If you want to edit the file, just click on the {\bf Edit} button.
+This action will pop up a window, and invoke the {\it vi}
+editor on the file. Alternatively, use an editor of your choice.}
+\item\menuitemstyle{
+Once you have finished making the changes to the file, update it and
+click on the {\bf Link} button. \HyperName{} will then read
+the file, interpret it as a new page, and display the page on
+this window. If you change the file and want to display it again,
+just get back to this page and click on {\bf Link} again. }
+\endmenu
+\endscroll
+\beginmenu
+{\it Filename: }{\inputstring{filename}{40}{\env{HOME}/HTXplay.ht}}
+\menuunixcommand{Initialize}{cp\space{1}\env{AXIOM}/doc/hypertex/pages/HTXplay.ht \stringvalue{filename}} \tab{20} Get a fresh copy from the system.
+\menuunixcommand{Edit}{xterm -T "\stringvalue{filename}" -e vi \stringvalue{filename}} \tab{20} Edit the file.
+\menuunixwindow{Link}{cat \space{1}\stringvalue{filename}} \tab{20} Link to the page defined in the file.
+\endmenu
+{\it Important : The file must contain
+one and only one page definition and must not contain any macro or patch
+definitions.}
+\end{page}
+
+@
+\section{hyperdoc.ht}
+\subsection{Creating Hyperdoc Pages}
+\label{Hyperdoc}
+\begin{itemize}
+\item ViewportPage \ref{ViewportPage} on
+page~\pageref{ViewportPage}
+\item BitMaps \ref{BitMaps} on
+page~\pageref{BitMaps}
+\item CPHelp \ref{CPHelp} on
+page~\pageref{CPHelp}
+\end{itemize}
+\index{pages!Hyperdoc!hyperdoc.ht}
+\index{hyperdoc.ht!pages!Hyperdoc}
+\index{Hyperdoc!hyperdoc.ht!pages}
+<<hyperdoc.ht>>=
+\begin{page}{Hyperdoc}{Creating Hyperdoc Pages}
+
+\beginscroll
+This document tells how to create \HyperName pages.
+To start with, it is rather meager but it will grow with time.
+\beginmenu
+\menulink{Viewports}{ViewportPage} Including live graphics in documents.
+\menulink{Gadjets}{BitMaps} Bitmaps for use in macros.
+\menulink{Control Panel Bits}{CPHelp} Development page for help 
+facility for viewports. yuck.
+%\menulink{Test Pages}{TestPage} Some test pages left by J.M.
+%\menulink{Paste Pages}{PastePage} Examples of how to use paste in areas.
+\endmenu
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{int.ht}
+<<int.ht>>=
+\newcommand{\IntegerXmpTitle}{Integer}
+\newcommand{\IntegerXmpNumber}{9.34}
+
+@
+\subsection{Integer}
+\label{IntegerXmpPage}
+\begin{itemize}
+\item ugIntroNumbersPage \ref{ugIntroNumbersPage} on
+page~pageref{ugIntroNumbersPage}
+\item IntegerNumberTheoryFunctionsXmpPage 
+\ref{IntegerNumberTheoryFunctionsXmpPage} on
+page~pageref{IntegerNumberTheoryFunctionsXmpPage}
+\item DecimalExpansionXmpPage \ref{DecimalExpansionXmpPage} on
+page~pageref{DecimalExpansionXmpPage}
+\item BinaryExpansionXmpPage \ref{BinaryExpansionXmpPage} on
+page~pageref{BinaryExpansionXmpPage}
+\item HexadecimalExpansionXmpPage \ref{HexadecimalExpansionXmpPage} on
+page~pageref{HexadecimalExpansionXmpPage}
+\item RadixExpansionXmpPage \ref{RadixExpansionXmpPage} on
+page~pageref{RadixExpansionXmpPage}
+\item ugxIntegerBasicPage \ref{ugxIntegerBasicPage} on
+page~pageref{ugxIntegerBasicPage}
+\item ugxIntegerPrimesPage \ref{ugxIntegerPrimesPage} on
+page~pageref{ugxIntegerPrimesPage}
+\item ugxIntegerNtPage \ref{ugxIntegerNtPage} on
+page~pageref{ugxIntegerNtPage}
+\end{itemize}
+\index{pages!IntegerXmpPage!int.ht}
+\index{int.ht!pages!IntegerXmpPage}
+\index{IntegerXmpPage!int.ht!pages}
+<<int.ht>>=
+\begin{page}{IntegerXmpPage}{Integer}
+\beginscroll
+Axiom provides many operations for manipulating arbitrary
+precision integers.
+In this section we will show some of those that come from \spadtype{Integer}
+itself plus some that are implemented in other packages.
+More examples of using integers are in the following sections:
+\downlink{``\ugIntroNumbersTitle''}{ugIntroNumbersPage} in section \ugIntroNumbersNumber
+\downlink{`IntegerNumberTheoryFunctions'}{IntegerNumberTheoryFunctionsXmpPage}\ignore{IntegerNumberTheoryFunctions},
+\downlink{`DecimalExpansion'}{DecimalExpansionXmpPage}\ignore{DecimalExpansion},
+\downlink{`BinaryExpansion'}{BinaryExpansionXmpPage}\ignore{BinaryExpansion},
+\downlink{`HexadecimalExpansion'}{HexadecimalExpansionXmpPage}\ignore{HexadecimalExpansion}, and
+\downlink{`RadixExpansion'}{RadixExpansionXmpPage}\ignore{RadixExpansion}.
+
+\beginmenu
+    \menudownlink{{9.34.1. Basic Functions}}{ugxIntegerBasicPage}
+    \menudownlink{{9.34.2. Primes and Factorization}}{ugxIntegerPrimesPage}
+    \menudownlink{{9.34.3. Some Number Theoretic Functions}}{ugxIntegerNTPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<int.ht>>=
+\newcommand{\ugxIntegerBasicTitle}{Basic Functions}
+\newcommand{\ugxIntegerBasicNumber}{9.34.1.}
+
+@
+\subsection{Basic Functions}
+\label{ugxIntegerBasicPage}
+\begin{itemize}
+\item FractionXmpPage \ref{FractionXmpPage} on
+page~pageref{FractionXmpPage}
+\item ugTypesUnionsPage \ref{ugTypesUnionsPage} on
+page~pageref{ugTypesUnionsPage}
+\item ugTypesRecordsPage \ref{ugTypesRecordsPage} on
+page~pageref{ugTypesRecordsPage}
+\end{itemize}
+\index{pages!ugxIntegerBasicPage!int.ht}
+\index{int.ht!pages!ugxIntegerBasicPage}
+\index{ugxIntegerBasicPage!int.ht!pages}
+<<int.ht>>=
+\begin{page}{ugxIntegerBasicPage}{Basic Functions}
+\beginscroll
+
+\labelSpace{3pc}
+\xtc{
+The size of an integer in Axiom is only limited by the amount of
+computer storage you have available.
+The usual arithmetic operations are available.
+}{
+\spadpaste{2**(5678 - 4856 + 2 * 17)}
+}
+
+\xtc{
+There are a number of ways of working with the sign of an integer.
+Let's use this \spad{x} as an example.
+}{
+\spadpaste{x := -101 \bound{x}}
+}
+\xtc{
+First of all, there is the absolute value function.
+}{
+\spadpaste{abs(x) \free{x}}
+}
+\xtc{
+The \spadfunFrom{sign}{Integer} operation returns \spad{-1} if its argument
+is negative, \spad{0} if zero and \spad{1} if positive.
+}{
+\spadpaste{sign(x) \free{x}}
+}
+%
+\xtc{
+You can determine if an integer is negative in several other ways.
+}{
+\spadpaste{x < 0 \free{x}}
+}
+\xtc{
+}{
+\spadpaste{x <= -1 \free{x}}
+}
+\xtc{
+}{
+\spadpaste{negative?(x) \free{x}}
+}
+%
+\xtc{
+Similarly, you can find out if it is positive.
+}{
+\spadpaste{x > 0 \free{x}}
+}
+\xtc{
+}{
+\spadpaste{x >= 1 \free{x}}
+}
+\xtc{
+}{
+\spadpaste{positive?(x) \free{x}}
+}
+\xtc{
+This is the recommended way of determining whether an integer is zero.
+}{
+\spadpaste{zero?(x) \free{x}}
+}
+
+\beginImportant
+Use the \spadfunFrom{zero?}{Integer} operation whenever you are testing any
+mathematical object for equality with zero.
+This is usually more efficient that using \spadop{=} (think of matrices:
+it is easier to tell if a matrix is zero by just checking term by term
+than constructing another ``zero'' matrix and comparing the two
+matrices term by term) and also avoids the problem that \spadop{=} is
+usually used for creating equations.
+\endImportant
+
+\xtc{
+This is the recommended way of determining
+whether an integer is equal to one.
+}{
+\spadpaste{one?(x) \free{x}}
+}
+
+\xtc{
+This syntax is used to test equality using \spadopFrom{=}{Integer}.
+It says that you want a \spadtype{Boolean} (\spad{true} or
+\spad{false}) answer rather than an equation.
+}{
+\spadpaste{(x = -101)@Boolean \free{x}}
+}
+
+\xtc{
+The operations \spadfunFrom{odd?}{Integer} and
+\spadfunFrom{even?}{Integer} determine whether an integer is odd or even,
+respectively.
+They each return a \spadtype{Boolean} object.
+}{
+\spadpaste{odd?(x) \free{x}}
+}
+\xtc{
+}{
+\spadpaste{even?(x) \free{x}}
+}
+\xtc{
+The operation \spadfunFrom{gcd}{Integer} computes the greatest common divisor of
+two integers.
+}{
+\spadpaste{gcd(56788,43688)}
+}
+\xtc{
+The operation
+\spadfunFrom{lcm}{Integer} computes their least common multiple.
+}{
+\spadpaste{lcm(56788,43688)}
+}
+\xtc{
+To determine the maximum of two integers, use \spadfunFrom{max}{Integer}.
+}{
+\spadpaste{max(678,567)}
+}
+\xtc{
+To determine the minimum, use \spadfunFrom{min}{Integer}.
+}{
+\spadpaste{min(678,567)}
+}
+
+\xtc{
+The \spadfun{reduce} operation is used to extend
+binary operations to more than two arguments.
+For example, you can use \spadfun{reduce} to find the maximum integer in
+a list or compute the least common multiple of all integers in the list.
+}{
+\spadpaste{reduce(max,[2,45,-89,78,100,-45])}
+}
+\xtc{
+}{
+\spadpaste{reduce(min,[2,45,-89,78,100,-45])}
+}
+\xtc{
+}{
+\spadpaste{reduce(gcd,[2,45,-89,78,100,-45])}
+}
+\xtc{
+}{
+\spadpaste{reduce(lcm,[2,45,-89,78,100,-45])}
+}
+
+\xtc{
+The infix operator ``/'' is {\it not} used to compute the quotient
+of integers.
+Rather, it is used to create rational numbers as described in
+\downlink{`Fraction'}{FractionXmpPage}\ignore{Fraction}.
+}{
+\spadpaste{13 / 4}
+}
+\xtc{
+The infix operation \spadfunFrom{quo}{Integer} computes the integer
+quotient.
+}{
+\spadpaste{13 quo 4}
+}
+\xtc{
+The infix operation \spadfunFrom{rem}{Integer} computes the integer
+remainder.
+}{
+\spadpaste{13 rem 4}
+}
+\xtc{
+One integer is evenly divisible by another if the remainder is zero.
+The operation \spadfunFrom{exquo}{Integer} can also be used.
+See \downlink{``\ugTypesUnionsTitle''}{ugTypesUnionsPage} in Section 
+\ugTypesUnionsNumber\ignore{ugTypesUnions} for an example.
+}{
+\spadpaste{zero?(167604736446952 rem 2003644)}
+}
+
+\xtc{
+The operation \spadfunFrom{divide}{Integer} returns a record of the
+quotient and remainder and thus is more efficient when both are needed.
+}{
+\spadpaste{d := divide(13,4) \bound{d}}
+}
+\xtc{
+}{
+\spadpaste{d.quotient \free{d}}
+}
+\xtc{
+Records are discussed in detail in 
+\downlink{``\ugTypesRecordsTitle''}{ugTypesRecordsPage} in Section 
+\ugTypesRecordsNumber\ignore{ugTypesRecords}.
+}{
+\spadpaste{d.remainder \free{d}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<int.ht>>=
+\newcommand{\ugxIntegerPrimesTitle}{Primes and Factorization}
+\newcommand{\ugxIntegerPrimesNumber}{9.34.2.}
+
+@
+\subsection{Primes and Factorization}
+\label{ugxIntegerPrimesPage}
+\begin{itemize}
+\item FactoredXmpPage \ref{FactoredXmpPage} on
+page~pageref{FactoredXmpPage}
+\item ComplexXmpPage \ref{ComplexXmpPage} on
+page~pageref{ComplexXmpPage}
+\end{itemize}
+\index{pages!ugxIntegerPrimesPage!int.ht}
+\index{int.ht!pages!ugxIntegerPrimesPage}
+\index{ugxIntegerPrimesPage!int.ht!pages}
+<<int.ht>>=
+\begin{page}{ugxIntegerPrimesPage}{Primes and Factorization}
+\beginscroll
+
+\labelSpace{3pc}
+\xtc{
+Use the operation \spadfunFrom{factor}{Integer} to factor integers.
+It returns an object of type \spadtype{Factored Integer}.
+See \downlink{`Factored'}{FactoredXmpPage}\ignore{Factored} 
+for a discussion of the
+manipulation of factored objects.
+}{
+\spadpaste{factor 102400}
+}
+
+\xtc{
+The operation \spadfunFrom{prime?}{Integer} returns \spad{true} or \spad{false} depending
+on whether its argument is a prime.
+}{
+\spadpaste{prime? 7}
+}
+\xtc{
+}{
+\spadpaste{prime? 8}
+}
+\xtc{
+The operation \spadfunFrom{nextPrime}{IntegerPrimesPackage} returns the
+least prime number greater than its argument.
+}{
+\spadpaste{nextPrime 100}
+}
+\xtc{
+The operation
+\spadfunFrom{prevPrime}{IntegerPrimesPackage} returns the greatest prime
+number less than its argument.
+}{
+\spadpaste{prevPrime 100}
+}
+\xtc{
+To compute all primes between two integers (inclusively), use the
+operation \spadfunFrom{primes}{IntegerPrimesPackage}.
+}{
+\spadpaste{primes(100,175)}
+}
+\xtc{
+You might sometimes want to see the factorization of an integer
+when it is considered a {\it Gaussian integer}.
+See \downlink{`Complex'}{ComplexXmpPage}\ignore{Complex} for more details.
+}{
+\spadpaste{factor(2 :: Complex Integer)}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<int.ht>>=
+\newcommand{\ugxIntegerNTTitle}{Some Number Theoretic Functions}
+\newcommand{\ugxIntegerNTNumber}{9.34.3.}
+
+@
+\subsection{Some Number Theoretic Functions}
+\label{ugxIntegerNTPage}
+\index{pages!ugxIntegerNTPage!int.ht}
+\index{int.ht!pages!ugxIntegerNTPage}
+\index{ugxIntegerNTPage!int.ht!pages}
+<<int.ht>>=
+\begin{page}{ugxIntegerNTPage}{Some Number Theoretic Functions}
+\beginscroll
+
+Axiom provides several number theoretic operations for integers.
+More examples are in \downlink{`IntegerNumberTheoryFunctions'}
+{IntegerNumberTheoryFunctionsXmpPage}\ignore{IntegerNumberTheoryFunctions}.
+
+\labelSpace{1pc}
+\xtc{
+The operation \spadfunFrom{fibonacci}{IntegerNumberTheoryFunctions}
+computes the Fibonacci numbers.
+The algorithm has running time
+\texht{$O\,(\log^3(n))$}{O(\spad{log(n)**3})} for argument \spad{n}.
+}{
+\spadpaste{[fibonacci(k) for k in 0..]}
+}
+\xtc{
+The operation \spadfunFrom{legendre}{IntegerNumberTheoryFunctions}
+computes the Legendre symbol for its two integer arguments where the
+second one is prime.
+If you know the second argument to be prime, use
+\spadfunFrom{jacobi}{IntegerNumberTheoryFunctions} instead where no check
+is made.
+}{
+\spadpaste{[legendre(i,11) for i in 0..10]}
+}
+\xtc{
+The operation \spadfunFrom{jacobi}{IntegerNumberTheoryFunctions} computes
+the Jacobi symbol for its two integer arguments.
+By convention, \spad{0} is returned if the greatest common divisor of the
+numerator and denominator is not \spad{1}.
+}{
+\spadpaste{[jacobi(i,15) for i in 0..9]}
+}
+\xtc{
+The operation \spadfunFrom{eulerPhi}{IntegerNumberTheoryFunctions} computes
+the values of Euler's \texht{$\phi$}{phi}-function where
+\texht{$\phi(n)$}{\spad{phi(n)}}
+equals the number of positive integers
+less than or equal to \spad{n} that are relatively prime to
+the positive integer \spad{n}.
+}{
+\spadpaste{[eulerPhi i for i in 1..]}
+}
+\xtc{
+The operation \spadfunFrom{moebiusMu}{IntegerNumberTheoryFunctions}
+computes the \texht{M\"{o}bius $\mu$}{Moebius mu} function.
+}{
+\spadpaste{[moebiusMu i for i in 1..]}
+}
+
+\xtc{
+Although they have somewhat limited utility, Axiom provides
+Roman numerals.
+}{
+\spadpaste{a := roman(78) \bound{a}}
+}
+\xtc{
+}{
+\spadpaste{b := roman(87) \bound{b}}
+}
+\xtc{
+}{
+\spadpaste{a + b \free{a}\free{b}}
+}
+\xtc{
+}{
+\spadpaste{a * b \free{a}\free{b}}
+}
+\xtc{
+}{
+\spadpaste{b rem a \free{a}\free{b}}
+}
+\endscroll
+\autobuttons
+\end{page}
+%
+
+@
+\section{intheory.ht}
+<<intheory.ht>>=
+\newcommand{\IntegerNumberTheoryFunctionsXmpTitle}
+{IntegerNumberTheoryFunctions}
+\newcommand{\IntegerNumberTheoryFunctionsXmpNumber}{9.36}
+
+@
+\subsection{IntegerNumberTheoryFunctions}
+\label{IntegerNumberTheoryFunctionsXmpPage}
+\index{pages!IntegerNumberTheoryFunctionsXmpPage!intheory.ht}
+\index{intheory.ht!pages!IntegerNumberTheoryFunctionsXmpPage}
+\index{IntegerNumberTheoryFunctionsXmpPage!intheory.ht!pages}
+<<intheory.ht>>=
+\begin{page}{IntegerNumberTheoryFunctionsXmpPage}{IntegerNumberTheoryFunctions}
+\beginscroll
+
+The \spadtype{IntegerNumberTheoryFunctions} package contains a variety of
+operations of interest to number theorists.
+Many of these operations deal with divisibility properties of integers.
+(Recall that an integer \spad{a} divides an integer \spad{b} if there is
+an integer \spad{c} such that \spad{b = a * c}.)
+
+\xtc{
+The operation \spadfunFrom{divisors}{IntegerNumberTheoryFunctions}
+returns a list of the divisors of an integer.
+}{
+\spadpaste{div144 := divisors(144) \bound{div144}}
+}
+\xtc{
+You can now compute the number of divisors of \spad{144} and the sum of
+the divisors of \spad{144} by counting and summing the elements of the
+list we just created.
+}{
+\spadpaste{\#(div144) \free{div144}}
+}
+\xtc{
+}{
+\spadpaste{reduce(+,div144) \free{div144}}
+}
+
+Of course, you can compute the number of divisors of an integer \spad{n},
+usually denoted \spad{d(n)}, and the sum of the divisors of an integer
+\spad{n}, usually denoted \spad{\texht{$\sigma$}{sigma}(n)},
+without ever listing the divisors of \spad{n}.
+
+\xtc{
+In Axiom, you can simply call the operations
+\spadfunFrom{numberOfDivisors}{IntegerNumberTheoryFunctions} and
+\spadfunFrom{sumOfDivisors}{IntegerNumberTheoryFunctions}.
+}{
+\spadpaste{numberOfDivisors(144)}
+}
+\xtc{
+}{
+\spadpaste{sumOfDivisors(144)}
+}
+
+The key is that \spad{d(n)} and
+\spad{\texht{$\sigma$}{sigma}(n)}
+are ``multiplicative functions.''
+This means that when \spad{n} and \spad{m} are relatively prime, that is, when
+\spad{n} and \spad{m} have no prime factor in common, then
+\spad{d(nm) = d(n) d(m)} and
+\spad{\texht{$\sigma$}{sigma}(nm) = \texht{$\sigma$}{sigma}(n)
+\texht{$\sigma$}{sigma}(m)}.
+Note that these functions are trivial to compute when \spad{n} is a prime
+power and are computed for general \spad{n} from the prime factorization
+of \spad{n}.
+Other examples of multiplicative functions are
+\spad{\texht{$\sigma_k$}{sigma_k}(n)}, the sum of the \eth{\spad{k}} powers of
+the divisors of \spad{n} and \texht{$\varphi(n)$}{\spad{phi(n)}}, the
+number of integers between 1 and \spad{n} which are prime to \spad{n}.
+The corresponding Axiom operations are called
+\spadfunFrom{sumOfKthPowerDivisors}{IntegerNumberTheoryFunctions} and
+\spadfunFrom{eulerPhi}{IntegerNumberTheoryFunctions}.
+
+An interesting function is \spad{\texht{$\mu$}{mu}(n)},
+the \texht{M\"{o}bius $\mu$}{Moebius mu} function, defined
+as follows:
+\spad{\texht{$\mu$}{mu}(1) = 1}, \spad{\texht{$\mu$}{mu}(n) = 0},
+when \spad{n} is divisible by a
+square, and
+\spad{\texht{$\mu = {(-1)}^k$}{mu(n) = (-1) ** k}}, when \spad{n}
+is the product of \spad{k} distinct primes.
+The corresponding Axiom operation is
+\spadfunFrom{moebiusMu}{IntegerNumberTheoryFunctions}.
+This function occurs in the following theorem:
+
+\noindent
+{\bf Theorem} (\texht{M\"{o}bius}{Moebius} Inversion Formula): \newline
+%\texht{\begin{quotation}\noindent}{\newline\indent{5}}
+Let \spad{f(n)} be a function on the positive integers and let \spad{F(n)}
+be defined by
+\texht{\narrowDisplay{F(n) = \sum_{d \mid n} f(n)}}{\spad{F(n) =}
+sum of \spad{f(n)} over \spad{d | n}}
+where the sum is taken over the positive divisors of \spad{n}.
+Then the values of \spad{f(n)} can be recovered from the values of
+\spad{F(n)}:
+\texht{\narrowDisplay{f(n) = \sum_{d \mid n} \mu(n) F({{n}\over {d}})}}
+{\spad{f(n) =}
+sum of \spad{mu(n) F(n/d)} over \spad{d | n},}
+where again the sum is taken over the positive divisors of \spad{n}.
+
+\xtc{
+When \spad{f(n) = 1}, then \spad{F(n) = d(n)}.
+Thus, if you sum \spad{\texht{$\mu$}{mu}(d) \texht{$\cdot$}{*} d(n/d)}
+over the positive divisors
+\spad{d} of \spad{n}, you should always get \spad{1}.
+}{
+\spadpaste{f1(n) == reduce(+,[moebiusMu(d) * numberOfDivisors(quo(n,d)) for d in divisors(n)]) \bound{f1}}
+}
+\xtc{
+}{
+\spadpaste{f1(200) \free{f1}}
+}
+\xtc{
+}{
+\spadpaste{f1(846) \free{f1}}
+}
+\xtc{
+Similarly, when \spad{f(n) = n}, then \spad{F(n) = \texht{$\sigma$}{sigma}(n)}.
+Thus, if you sum \spad{\texht{$\mu$}{mu}(d) \texht{$\cdot$}{*}
+\texht{$\sigma$}{sigma}(n/d)} over the positive divisors
+\spad{d} of \spad{n}, you should always get \spad{n}.
+}{
+\spadpaste{f2(n) == reduce(+,[moebiusMu(d) * sumOfDivisors(quo(n,d)) for d in divisors(n)]) \bound{f2}}
+}
+\xtc{
+}{
+\spadpaste{f2(200) \free{f2}}
+}
+\xtc{
+}{
+\spadpaste{f2(846) \free{f2}}
+}
+
+
+The Fibonacci numbers are defined by \spad{F(1) = F(2) = 1} and
+\spad{F(n) = F(n-1) + F(n-2)} for \spad{n = 3,4, ...}.
+\xtc{
+The operation \spadfunFrom{fibonacci}{IntegerNumberTheoryFunctions}
+computes the \eth{\spad{n}} Fibonacci number.
+}{
+\spadpaste{fibonacci(25)}
+}
+\xtc{
+}{
+\spadpaste{[fibonacci(n) for n in 1..15]}
+}
+\xtc{
+Fibonacci numbers can also be expressed as sums of binomial coefficients.
+}{
+\spadpaste{fib(n) == reduce(+,[binomial(n-1-k,k) for k in 0..quo(n-1,2)]) \bound{fib}}
+}
+\xtc{
+}{
+\spadpaste{fib(25) \free{fib}}
+}
+\xtc{
+}{
+\spadpaste{[fib(n) for n in 1..15] \free{fib}}
+}
+
+Quadratic symbols can be computed with the operations
+\spadfunFrom{legendre}{IntegerNumberTheoryFunctions} and
+\spadfunFrom{jacobi}{IntegerNumberTheoryFunctions}.
+The Legendre symbol
+\texht{$\left({a \over p}\right)$}{\spad{(a/p)}}
+is defined for integers \spad{a} and
+\spad{p} with \spad{p} an odd prime number.
+By definition, \texht{$\left({a \over p}\right)$}{\spad{(a/p) = +1}},
+when \spad{a} is a square \spad{(mod p)},
+\texht{$\left({a \over p}\right)$}{\spad{(a/p) = -1}},
+when \spad{a} is not a square \spad{(mod p)}, and
+\texht{$\left({a \over p}\right)$}{\spad{(a/p) = 0}},
+when \spad{a} is divisible by \spad{p}.
+\xtc{
+You compute \texht{$\left({a \over p}\right)$}{\spad{(a/p)}}
+via the command \spad{legendre(a,p)}.
+}{
+\spadpaste{legendre(3,5)}
+}
+\xtc{
+}{
+\spadpaste{legendre(23,691)}
+}
+The Jacobi symbol \texht{$\left({a \over n}\right)$}{\spad{(a/n)}}
+is the usual extension of the Legendre
+symbol, where \spad{n} is an arbitrary integer.
+The most important property of the Jacobi symbol is the following:
+if \spad{K} is a quadratic field with discriminant \spad{d} and quadratic
+character \texht{$\chi$}{\spad{chi}},
+then \texht{$\chi$}{\spad{chi}}\spad{(n) = (d/n)}.
+Thus, you can use the Jacobi symbol
+to compute, say, the class numbers of
+imaginary quadratic fields from a standard class number formula.
+\xtc{
+This function computes the class number of the imaginary
+quadratic field with discriminant \spad{d}.
+}{
+\spadpaste{h(d) == quo(reduce(+, [jacobi(d,k) for k in 1..quo(-d, 2)]), 2 - jacobi(d,2)) \bound{h}}
+}
+\xtc{
+}{
+\spadpaste{h(-163) \free{h}}   
+}
+\xtc{
+}{
+\spadpaste{h(-499) \free{h}}   
+}
+\xtc{
+}{
+\spadpaste{h(-1832) \free{h}}  
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{kafile.ht}
+<<kafile.ht>>=
+\newcommand{\KeyedAccessFileXmpTitle}{KeyedAccessFile}
+\newcommand{\KeyedAccessFileXmpNumber}{9.38}
+
+@
+\subsection{KeyedAccessFile}
+\label{KeyedAccessFileXmpPage}
+\begin{itemize}
+\item FileXmpPage \ref{FileXmpPage} on
+page~pageref{FileXmpPage}
+\item TextFileXmpPage \ref{TextFileXmpPage} on
+page~pageref{TextFileXmpPage}
+\item LibraryXmpPage \ref{LibraryXmpPage} on
+page~pageref{LibraryXmpPage}
+\end{itemize}
+\index{pages!KeyedAccessFileXmpPage!kafile.ht}
+\index{kafile.ht!pages!KeyedAccessFileXmpPage}
+\index{KeyedAccessFileXmpPage!kafile.ht!pages}
+<<kafile.ht>>=
+\begin{page}{KeyedAccessFileXmpPage}{KeyedAccessFile}
+\beginscroll
+
+The domain \spadtype{KeyedAccessFile(S)} provides files which can be used as
+associative tables.
+Data values are stored in these files and can be retrieved according to
+their keys.
+The keys must be strings so this type behaves very much like the
+\spadtype{StringTable(S)} domain.
+The difference is that keyed access files reside in secondary storage while
+string tables are kept in memory.
+For more information on table-oriented operations, see the description of
+\spadtype{Table}.
+
+\xtc{
+Before a keyed access file can be used, it must first be opened.
+A new file can be created by opening it for output.
+}{
+\spadpaste{ey: KeyedAccessFile(Integer) := open("/tmp/editor.year", "output")  \bound{ey}}
+}
+\xtc{
+Just as for vectors, tables or lists, values are saved in a keyed access file
+by setting elements.
+}{
+\spadpaste{ey."Char"     := 1986 \free{ey}\bound{eya}}
+}
+\xtc{
+}{
+\spadpaste{ey."Caviness" := 1985 \free{ey}\bound{eyb}}
+}
+\xtc{
+}{
+\spadpaste{ey."Fitch"    := 1984 \free{ey}\bound{eyc}}
+}
+\xtc{
+Values are retrieved using application, in any of its syntactic forms.
+}{
+\spadpaste{ey."Char"     \free{eya}}
+}
+\xtc{
+}{
+\spadpaste{ey("Char")    \free{eya}}
+}
+\xtc{
+}{
+\spadpaste{ey "Char"     \free{eya}}
+}
+\xtc{
+Attempting to retrieve a non-existent element in this way causes an error.
+If it is not known whether a key exists, you should use the
+\spadfunFrom{search}{KeyedAccessFile} operation.
+}{
+\spadpaste{search("Char", ey)   \free{eya,eyb,eyc}\bound{eyaa}}
+}
+\xtc{
+}{
+\spadpaste{search("Smith", ey)  \free{eyaa}}
+}
+\xtc{
+When an entry is no longer needed, it can be removed from the file.
+}{
+\spadpaste{remove!("Char", ey)  \free{eyaa}\bound{eybb}}
+}
+\xtc{
+The \spadfunFrom{keys}{KeyedAccessFile} operation returns a list of all the
+keys for a given file.
+}{
+\spadpaste{keys ey  \free{eybb}}
+}
+\xtc{
+The \spadfunFrom{\#}{KeyedAccessFile} operation gives the
+number of entries.
+}{
+\spadpaste{\#ey     \free{eybb}}
+}
+
+The table view of keyed access files provides safe operations.
+That is, if the Axiom program is terminated between file operations,
+the file is left in a consistent, current state.
+This means, however, that the operations are somewhat costly.
+For example, after each update the file is closed.
+\xtc{
+Here we add several more items to the file, then check its contents.
+}{
+\spadpaste{KE := Record(key: String, entry: Integer)  \bound{KE}}
+}
+\xtc{
+}{
+\spadpaste{reopen!(ey, "output")  \free{eybb,KE}\bound{eycc}}
+}
+\xtc{
+If many items are to be added to a file at the same time, then
+it is more efficient to use the 
+\spadfunFromX{write}{KeyedAccessFile} operation.
+}{
+\spadpaste{write!(ey, ["van Hulzen", 1983]\$KE)  \bound{eyccA}\free{eycc}}
+}
+\xtc{
+}{
+\spadpaste{write!(ey, ["Calmet", 1982]\$KE)      \bound{eyccB}\free{eycc}}
+}
+\xtc{
+}{
+\spadpaste{write!(ey, ["Wang", 1981]\$KE)        \bound{eyccC}\free{eycc}}
+}
+\xtc{
+}{
+\spadpaste{close! ey   \free{eyccA,eyccB,eyccC}\bound{eydd}}
+}
+\xtc{
+The \spadfunFromX{read}{KeyedAccessFile} operation is also available from
+the file view, but it returns elements in a random order.
+It is generally clearer and more efficient to use the
+\spadfunFrom{keys}{KeyedAccessFile} operation and to extract elements by
+key.
+}{
+\spadpaste{keys ey     \free{eydd}}
+}
+\xtc{
+}{
+\spadpaste{members ey  \free{eydd}}
+}
+\noOutputXtc{
+}{
+\spadpaste{)system rm -r /tmp/editor.year  \free{ey}}
+}
+
+For more information on related topics,  see
+\downlink{`File'}{FileXmpPage}\ignore{File},
+\downlink{`TextFile'}{TextFileXmpPage}\ignore{TextFile}, and
+\downlink{`Library'}{LibraryXmpPage}\ignore{Library}.
+%
+\showBlurb{KeyedAccessFile}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{kernel.ht}
+<<kernel.ht>>=
+\newcommand{\KernelXmpTitle}{Kernel}
+\newcommand{\KernelXmpNumber}{9.37}
+
+@
+\subsection{Kernel}
+\label{KernelXmpPage}
+\begin{itemize}
+\item BasicOperatorXmpPage \ref{BasicOperatorXmpPage} on
+page~pageref{BasicOperatorXmpPage}
+\item ExpressionXmpPage \ref{ExpressionXmpPage} on
+page~pageref{ExpressionXmpPage}
+\end{itemize}
+\index{pages!KernelXmpPage!kernel.ht}
+\index{kernel.ht!pages!KernelXmpPage}
+\index{KernelXmpPage!kernel.ht!pages}
+<<kernel.ht>>=
+\begin{page}{KernelXmpPage}{Kernel}
+\beginscroll
+
+A {\it kernel} is a symbolic function application (such as
+\spad{sin(x + y)}) or a symbol (such as \spad{x}).
+More precisely, a non-symbol kernel over a set {\it S} is an operator applied
+to a given list of arguments from {\it S}.
+The operator has type \axiomType{BasicOperator}
+(see 
+\downlink{`BasicOperator'}{BasicOperatorXmpPage}\ignore{BasicOperator}) 
+and the kernel object is usually part of
+an expression object (see 
+\downlink{`Expression'}{ExpressionXmpPage}\ignore{Expression}).
+
+Kernels are created implicitly for you when you
+create expressions.
+\xtc{
+}{
+\spadpaste{x :: Expression Integer}
+}
+\xtc{
+You can directly create a ``symbol'' kernel by using the
+\axiomFunFrom{kernel}{Kernel} operation.
+}{
+\spadpaste{kernel x}
+}
+\xtc{
+This expression has two different kernels.
+}{
+\spadpaste{sin(x) + cos(x) \bound{sincos}}
+}
+\xtc{
+The operator \axiomFunFrom{kernels}{Expression} returns a list
+of the kernels in an object of type \axiomType{Expression}.
+}{
+\spadpaste{kernels \% \free{sincos}}
+}
+\xtc{
+This expression also has two different kernels.
+}{
+\spadpaste{sin(x)**2 + sin(x) + cos(x) \bound{sincos2}}
+}
+\xtc{
+The \spad{sin(x)} kernel is used twice.
+}{
+\spadpaste{kernels \% \free{sincos2}}
+}
+\xtc{
+An expression need not contain any kernels.
+}{
+\spadpaste{kernels(1 :: Expression Integer)}
+}
+\xtc{
+If one or more kernels are present, one of them is
+designated the {\it main} kernel.
+}{
+\spadpaste{mainKernel(cos(x) + tan(x))}
+}
+\xtc{
+Kernels can be nested. Use \axiomFunFrom{height}{Kernel} to determine
+the nesting depth.
+}{
+\spadpaste{height kernel x}
+}
+\xtc{
+This has height 2 because the \spad{x} has height 1 and then we apply
+an operator to that.
+}{
+\spadpaste{height mainKernel(sin x)}
+}
+\xtc{
+}{
+\spadpaste{height mainKernel(sin cos x)}
+}
+\xtc{
+}{
+\spadpaste{height mainKernel(sin cos (tan x + sin x))}
+}
+\xtc{
+Use the \axiomFunFrom{operator}{Kernel} operation to extract the
+operator component of the kernel.
+The operator has type \axiomType{BasicOperator}.
+}{
+\spadpaste{operator mainKernel(sin cos (tan x + sin x))}
+}
+\xtc{
+Use the \axiomFunFrom{name}{Kernel} operation to extract the name of the
+operator component of the kernel.
+The name has type \axiomType{Symbol}.
+This is really just a shortcut for a two-step process of extracting the
+operator and then calling \axiomFunFrom{name}{BasicOperator} on the
+operator.
+}{
+\spadpaste{name mainKernel(sin cos (tan x + sin x))}
+}
+Axiom knows about functions such as \axiomFun{sin}, \axiomFun{cos}
+and so on and can make kernels and then expressions using them.
+To create a kernel and expression using an arbitrary operator, use
+\axiomFunFrom{operator}{BasicOperator}.
+\xtc{
+Now \spad{f} can be used to create symbolic function applications.
+}{
+\spadpaste{f := operator 'f \bound{f}}
+}
+\xtc{
+}{
+\spadpaste{e := f(x, y, 10) \free{f}\bound{e}}
+}
+\xtc{
+Use the \axiomFunFrom{is?}{Kernel} operation to learn if the
+operator component of a kernel is equal to a given operator.
+}{
+\spadpaste{is?(e, f) \free{f e}}
+}
+\xtc{
+You can also use a symbol or a string as the second
+argument to \axiomFunFrom{is?}{Kernel}.
+}{
+\spadpaste{is?(e, 'f) \free{e}}
+}
+\xtc{
+Use the \axiomFunFrom{argument}{Kernel} operation to get a list containing
+the argument component of a kernel.
+}{
+\spadpaste{argument mainKernel e \free{f}\free{e}}
+}
+
+Conceptually, an object of type \axiomType{Expression} can be thought
+of a quotient of multivariate polynomials, where the ``variables''
+are kernels.
+The arguments of the kernels are again expressions and so the
+structure recurses.
+See 
+\downlink{`Expression'}{ExpressionXmpPage}\ignore{Expression} 
+for examples of using kernels to
+take apart expression objects.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{lazm3pk.ht}
+<<lazm3pk.ht>>=
+\newcommand{\LazardSetSolvingPackageXmpTitle}{LazardSetSolvingPackage}
+\newcommand{\LazardSetSolvingPackageXmpNumber}{9.40}
+
+@
+\subsection{LazardSetSolvingPackage}
+\label{LazardSetSolvingPackageXmpPage}
+\index{pages!LazardSetSolvingPackageXmpPage!lazm3pk.ht}
+\index{lazm3pk.ht!pages!LazardSetSolvingPackageXmpPage}
+\index{LazardSetSolvingPackageXmpPage!lazm3pk.ht!pages}
+<<lazm3pk.ht>>=
+\begin{page}{LazardSetSolvingPackageXmpPage}{LazardSetSolvingPackage}
+\beginscroll
+The \spadtype{LazardSetSolvingPackage} package constructor solves 
+polynomial systems by means of Lazard triangular sets.
+However one condition is relaxed:
+Regular triangular sets whose saturated ideals have positive dimension
+are not necessarily normalized.
+
+The decompositions are computed in two steps.
+First the algorithm of Moreno Maza (implemented in 
+the \spadtype{RegularTriangularSet} domain constructor)
+is called.
+Then the resulting decompositions are converted into lists 
+of square-free regular triangular sets
+and the redundant components are removed.
+Moreover, zero-dimensional regular triangular sets are normalized.
+
+Note that the way of understanding triangular decompositions 
+is detailed in the example of the \spadtype{RegularTriangularSet}
+constructor.
+
+The \spadtype{LazardSetSolvingPackage} constructor takes six arguments.
+The first one, {\bf R}, is the coefficient ring of the polynomials;
+it must belong to the category \spadtype{GcdDomain}.
+The second one, {\bf E}, is the exponent monoid of the polynomials;
+it must belong to the category \spadtype{OrderedAbelianMonoidSup}.
+the third one, {\bf V}, is the ordered set of variables;
+it must belong to the category \spadtype{OrderedSet}.
+The fourth one is the polynomial ring;
+it must belong to the category \spadtype{RecursivePolynomialCategory(R,E,V)}.
+The fifth one is a domain of the category \spadtype{RegularTriangularSetCategory(R,E,V,P)}
+and the last one is a domain of the category \spadtype{SquareFreeRegularTriangularSetCategory(R,E,V,P)}.
+The abbreviation for \spadtype{LazardSetSolvingPackage} is \spad{LAZM3PK}.
+
+{\bf N.B.} For the purpose of solving zero-dimensional algebraic systems,
+see also \spadtype{LexTriangularPackage} and \spadtype{ZeroDimensionalSolvePackage}.
+These packages are easier to call than \spad{LAZM3PK}.
+Moreover, the \spadtype{ZeroDimensionalSolvePackage} 
+package  provides operations
+to compute either the complex roots or the real roots.
+
+We illustrate now the use of the \spadtype{LazardSetSolvingPackage} package 
+constructor with two examples (Butcher and Vermeer).
+
+
+\xtc{
+Define the coefficient ring.
+}{
+\spadpaste{R := Integer \bound{R}}
+}
+
+
+\xtc{
+Define the list of variables,
+}{
+\spadpaste{ls : List Symbol := [b1,x,y,z,t,v,u,w] \bound{ls}}
+} 
+
+\xtc{
+and make it an ordered set;
+}{
+\spadpaste{V := OVAR(ls) \free{ls} \bound{V}}
+}
+
+\xtc{
+then define the exponent monoid.
+}{
+\spadpaste{E := IndexedExponents V \free{V} \bound{E}}
+}
+
+\xtc{
+Define the polynomial ring.
+}{
+\spadpaste{P := NSMP(R, V) \free{R} \free{V} \bound{P}}
+}
+
+\xtc{
+Let the variables be polynomial.
+}{
+\spadpaste{b1: P := 'b1  \free{P} \bound{b1}}
+}
+\xtc{
+}{
+\spadpaste{x: P := 'x \free{P} \bound{x}}
+}
+\xtc{
+}{
+\spadpaste{y: P := 'y \free{P} \bound{y}}
+}
+\xtc{
+}{
+\spadpaste{z: P := 'z \free{P} \bound{z}}
+}
+\xtc{
+}{
+\spadpaste{t: P := 't \free{P} \bound{t}}
+}
+\xtc{
+}{
+\spadpaste{u: P := 'u  \free{P} \bound{u}}
+}
+\xtc{
+}{
+\spadpaste{v: P := 'v  \free{P} \bound{v}}
+}
+\xtc{
+}{
+\spadpaste{w: P := 'w  \free{P} \bound{w}}
+}
+
+\xtc{
+Now call the \spadtype{RegularTriangularSet} domain constructor.
+}{
+\spadpaste{T := REGSET(R,E,V,P) \free{R} \free{E} \free{V} \free{P} \bound{T} }
+}
+
+\xtc{
+Define a polynomial system (the Butcher example).
+}{
+\spadpaste{p0 := b1 + y + z - t - w \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{p0}}
+}
+\xtc{
+}{
+\spadpaste{p1 := 2*z*u + 2*y*v + 2*t*w - 2*w**2 - w - 1 \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{p1}}
+}
+\xtc{
+}{
+\spadpaste{p2 := 3*z*u**2 + 3*y*v**2 - 3*t*w**2 + 3*w**3 + 3*w**2 - t + 4*w \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{p2}}
+}
+\xtc{
+}{
+\spadpaste{p3 := 6*x*z*v - 6*t*w**2 + 6*w**3 - 3*t*w + 6*w**2 - t + 4*w \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{p3}}
+}
+\xtc{
+}{
+\spadpaste{p4 := 4*z*u**3+ 4*y*v**3+ 4*t*w**3- 4*w**4 - 6*w**3+ 4*t*w- 10*w**2- w- 1 \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{p4}}
+}
+\xtc{
+}{
+\spadpaste{p5 := 8*x*z*u*v +8*t*w**3 -8*w**4 +4*t*w**2 -12*w**3 +4*t*w -14*w**2 -3*w -1  \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{p5}}
+}
+\xtc{
+}{
+\spadpaste{p6 := 12*x*z*v**2+12*t*w**3 -12*w**4 +12*t*w**2 -18*w**3 +8*t*w -14*w**2 -w -1 \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{p6}}
+}
+\xtc{
+}{
+\spadpaste{p7 := -24*t*w**3 + 24*w**4 - 24*t*w**2 + 36*w**3 - 8*t*w + 26*w**2 + 7*w + 1 \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{p7}}
+}
+\xtc{
+}{
+\spadpaste{lp := [p0, p1, p2, p3, p4, p5, p6, p7] \free{p0} \free{p1} \free{p2} \free{p3} \free{p4} \free{p5} \free{p6} \free{p7} \bound{lp}}
+}
+
+\xtc{
+First of all, let us solve this system in the sense of Lazard by means of the \spadtype{REGSET}
+constructor:
+}{
+\spadpaste{lts := zeroSetSplit(lp,false)$T \free{lp} \free{T} \bound{lts}}
+}
+
+\xtc{
+We can get the dimensions of each component
+of a decomposition as follows.
+}{
+\spadpaste{[coHeight(ts) for ts in lts] \free{lts}}
+}
+
+The first five sets have a simple shape.
+However, the last one, which has dimension zero, can be simplified
+by using Lazard triangular sets.
+
+\xtc{
+Thus we call the \spadtype{SquareFreeRegularTriangularSet} domain constructor,
+}{
+\spadpaste{ST := SREGSET(R,E,V,P) \free{R} \free{E} \free{V} \free{P} \bound{ST} }
+}
+
+\xtc{
+and set the \spadtype{LAZM3PK} package constructor to our situation.
+}{
+\spadpaste{pack := LAZM3PK(R,E,V,P,T,ST) \free{R} \free{E} \free{V} \free{P} \free{T} \free{ST} \bound{pack} }
+}
+
+\xtc{
+We are ready to solve the system by means of Lazard triangular sets:
+}{
+\spadpaste{zeroSetSplit(lp,false)$pack \free{lp} \free{pack}}
+}
+
+We see the sixth triangular set is {\em nicer} now: 
+each one of its polynomials has a constant initial.
+
+We follow with the Vermeer example. The ordering is the usual one
+for this system.
+
+\xtc{
+Define the polynomial system.
+}{
+\spadpaste{f0 := (w - v) ** 2 + (u - t) ** 2 - 1 \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{f0}}
+}
+\xtc{
+}{
+\spadpaste{f1 := t ** 2 - v ** 3 \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{f1}}
+}
+\xtc{
+}{
+\spadpaste{f2 := 2 * t * (w - v) + 3 * v ** 2 * (u - t) \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{f2}}
+}
+\xtc{
+}{
+\spadpaste{f3 := (3 * z * v ** 2 - 1) * (2 * z * t - 1) \free{b1} \free{x} \free{y} \free{z} \free{t} \free{u} \free{v} \free{w} \bound{f3}}
+}
+\xtc{
+}{
+\spadpaste{lf := [f0, f1, f2, f3] \free{f0} \free{f1} \free{f2} \free{f3} \bound{lf}}
+}
+
+
+\xtc{
+First of all, let us solve this system in the sense of Kalkbrener by 
+means of the \spadtype{REGSET}
+constructor:
+}{
+\spadpaste{zeroSetSplit(lf,true)$T \free{lf} \free{T}}
+}
+
+We have obtained one regular chain (i.e. regular triangular set) with 
+dimension 1.
+This set is in fact a characterist set of the (radical of) of the ideal
+generated by the input system {\bf lf}.
+Thus we have only the {\em generic points} of the variety associated 
+with {\bf lf}
+(for the elimination ordering given by {\bf ls}).
+
+So let us get now a full description of this variety.
+\xtc{
+Hence, we solve this system in the sense of Lazard by means of the 
+\spadtype{REGSET}
+constructor:
+}{
+\spadpaste{zeroSetSplit(lf,false)$T \free{lf} \free{T}}
+}
+
+We retrieve our regular chain of dimension 1 and we get three regular chains
+of dimension 0 corresponding to the {\em degenerated cases}.
+We want now to simplify these zero-dimensional regular chains
+by using Lazard triangular sets.
+Moreover, this will allow us to prove that the above decomposition has 
+no redundant component.
+{\bf N.B.} Generally, decompositions computed by the \spadtype{REGSET}
+constructor do not have redundant components.
+However, to be sure that no redundant component occurs one needs to use
+the \spadtype{SREGSET} or \spadtype{LAZM3PK} constructors.
+
+\xtc{
+So let us solve the input system  in the sense of Lazard by means of 
+the \spadtype{LAZM3PK} constructor:
+}{
+\spadpaste{zeroSetSplit(lf,false)$pack \free{lf} \free{pack}}
+}
+Due to square-free factorization, we obtained now four zero-dimensional 
+regular chains.
+Moreover, each of them is normalized (the initials are constant).
+Note that these zero-dimensional components may be investigated further
+with the \spadtype{ZeroDimensionalSolvePackage} package constructor.
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{lexp.ht}
+<<lexp.ht>>=
+\newcommand{\LieExponentialsXmpTitle}{LieExponentials}
+\newcommand{\LieExponentialsXmpNumber}{9.42}
+
+@
+\subsection{LieExponentials}
+\label{LieExponentialsXmpPage}
+\index{pages!LieExponentialsXmpPage!lexp.ht}
+\index{lexp.ht!pages!LieExponentialsXmpPage}
+\index{LieExponentialsXmpPage!lexp.ht!pages}
+<<lexp.ht>>=
+\begin{page}{LieExponentialsXmpPage}{LieExponentials}
+% =====================================================================
+\beginscroll
+\xtc{
+}{
+\spadpaste{ a: Symbol := 'a \bound{a}}
+}
+\xtc{
+}{
+\spadpaste{ b: Symbol := 'b \bound{b}}
+}
+
+Declarations of domains
+\xtc{
+}{
+\spadpaste{ coef     := Fraction(Integer) \bound{coef}}
+}
+\xtc{
+}{
+\spadpaste{ group    := LieExponentials(Symbol, coef, 3) \free{coef} \bound{group}}
+}
+\xtc{
+}{
+\spadpaste{ lpoly    := LiePolynomial(Symbol, coef) \free{coef} \bound{lpoly}}
+}
+\xtc{
+}{
+\spadpaste{ poly     := XPBWPolynomial(Symbol, coef) \free{coef} \bound{poly}}
+}
+
+Calculations
+\xtc{
+}{
+\spadpaste{ ea := exp(a::lpoly)$group \free{a} \free{lpoly} \free{group} \bound{ea}}
+}
+\xtc{
+}{
+\spadpaste{ eb := exp(b::lpoly)$group \free{b} \free{lpoly} \free{group}  \bound{eb}}
+}
+\xtc{
+}{
+\spadpaste{ g: group := ea*eb \free{ea} \free{eb} \bound{g}}
+}
+\xtc{
+}{
+\spadpaste{ g :: poly \free{g} \free{poly}}
+}
+\xtc{
+}{
+\spadpaste{ log(g)$group \free{g} \free{group}}
+}
+\xtc{
+}{
+\spadpaste{ g1: group := inv(g) \free{g} \free{group} \bound{g1}}
+}
+\xtc{
+}{
+\spadpaste{ g*g1 \free{g} \free{g1}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+%
+
+@
+\section{lextripk.ht}
+<<lextripk.ht>>=
+\newcommand{\LexTriangularPackageXmpTitle}{LexTriangularPackage}
+\newcommand{\LexTriangularPackageXmpNumber}{9.39}
+
+@
+\subsection{LexTriangularPackage}
+\label{LexTriangularPackageXmpPage}
+\index{pages!LexTriangularPackageXmpPage!lextripk.ht}
+\index{lextripk.ht!pages!LexTriangularPackageXmpPage}
+\index{LexTriangularPackageXmpPage!lextripk.ht!pages}
+<<lextripk.ht>>=
+\begin{page}{LexTriangularPackageXmpPage}{LexTriangularPackage}
+\beginscroll
+The \spadtype{LexTriangularPackage} package constructor provides 
+an implementation of the {\em lexTriangular} algorithm 
+(D. Lazard "Solving Zero-dimensional Algebraic Systems", 
+J. of Symbol. Comput., 1992).
+This algorithm decomposes a zero-dimensional variety into zero-sets of regular
+triangular sets.
+Thus the input system must have a finite number of complex solutions.
+Moreover, this system needs to be a lexicographical Groebner basis.
+
+This package takes two arguments: 
+the coefficient-ring {\bf R} of the polynomials,
+which must be a \spadtype{GcdDomain}
+and their set of variables given by {\bf ls} a \spadtype{List Symbol}.
+The type of the input polynomials must be 
+\spadtype{NewSparseMultivariatePolynomial(R,V)}
+where {\bf V} is \spadtype{OrderedVariableList(ls)}.
+The abbreviation for \spadtype{LexTriangularPackage} is \spadtype{LEXTRIPK}.
+The main operations are \axiomOpFrom{lexTriangular}{LexTriangularPackage}
+and \axiomOpFrom{squareFreeLexTriangular}{LexTriangularPackage}.
+The later provide decompositions by means of 
+square-free regular triangular sets,
+built with the \spadtype{SREGSET} constructor,
+whereas the former uses the \spadtype{REGSET} constructor.
+Note that these constructors also implement another algorithm
+for solving algebraic systems by means of regular triangular sets;
+in that case no computations of Groebner bases are needed and the input
+system may have any dimension (i.e. it may have an infinite number
+of solutions).
+
+The implementation of the {\em lexTriangular} algorithm
+provided in the \spadtype{LexTriangularPackage} constructor
+differs from that reported in "Computations of gcd over
+algebraic towers of simple extensions" by M. Moreno Maza and R. Rioboo
+(in proceedings of AAECC11, Paris, 1995).
+Indeed, the \axiomOpFrom{squareFreeLexTriangular}{LexTriangularPackage} 
+operation
+removes all multiplicities of the solutions (i.e. the computed solutions
+are pairwise different) and the 
+\axiomOpFrom{lexTriangular}{LexTriangularPackage}
+operation may keep some multiplicities; 
+this latter operation runs generally faster
+than the former. 
+
+The interest of the {\em lexTriangular} algorithm is due
+to the following experimental remark.
+For some examples, a triangular decomposition
+of a zero-dimensional variety can be computed faster 
+via a lexicographical Groebner basis computation than
+by using a direct method (like that of \spadtype{SREGSET}
+and \spadtype{REGSET}).
+This happens typically when the total degree of the system
+relies essentially on its smallest variable (like in the
+{\em Katsura} systems).
+When this is not the case, the direct method may give better timings
+(like in the {\em Rose} system).
+
+Of course, the direct method can also be applied to a
+lexicographical Groebner basis.
+However, the {\em lexTriangular} algorithm takes advantage
+of the structure of this basis and avoids many unnecessary
+computations which are performed by the direct method.
+
+For this purpose of solving algebraic systems with a 
+finite number of solutions,
+see also the \spadtype{ZeroDimensionalSolvePackage}.
+It allows to use both strategies (the lexTriangular algorithm and the direct
+method) for computing either the complex or real roots of a system.
+
+Note that the way of understanding triangular decompositions 
+is detailed in the example of the \spadtype{RegularTriangularSet}
+constructor.
+
+Since the \spadtype{LEXTRIPK} package constructor is limited 
+to zero-dimensional systems, it provides a
+\axiomOpFrom{zeroDimensional?}{LexTriangularPackage}
+operation to check whether this requirement holds.
+There is also a \axiomOpFrom{groebner}{LexTriangularPackage}
+operation to compute the lexicographical Groebner basis
+of a set of polynomials with type 
+\spadtype{NewSparseMultivariatePolynomial(R,V)}.
+The elimination ordering is that given by {\bf ls}
+(the greatest variable being the first element of {\bf ls}).
+This basis is computed by the {\em FLGM} algorithm 
+(Faugere et al. "Efficient Computation of Zero-Dimensional Groebner Bases by 
+        Change of Ordering" , J. of Symbol. Comput., 1993)
+implemented in the \spadtype{LinGroebnerPackage} package constructor.
+Once a lexicographical Groebner basis is computed,
+then one can call the operations 
+\axiomOpFrom{lexTriangular}{LexTriangularPackage}
+and \axiomOpFrom{squareFreeLexTriangular}{LexTriangularPackage}.
+Note that these operations admit an optional argument
+to produce normalized triangular sets.
+There is also a \axiomOpFrom{zeroSetSplit}{LexTriangularPackage} operation
+which does all the job from the input system;
+an error is produced if this system is not zero-dimensional.
+
+Let us illustrate the facilities of the \spadtype{LEXTRIPK} constructor
+by a famous example, the {\em cyclic-6 root} system.
+\xtc{
+Define the coefficient ring.
+}{
+\spadpaste{R := Integer \bound{R}}
+}
+\xtc{
+Define the list of variables,
+}{
+\spadpaste{ls : List Symbol := [a,b,c,d,e,f] \bound{ls}}
+}
+\xtc{
+and make it an ordered set.
+}{
+\spadpaste{V := OVAR(ls) \free{ls} \bound{V}}
+}
+\xtc{
+Define the polynomial ring.
+}{
+\spadpaste{P := NSMP(R, V) \free{R} \free{V} \bound{P}}
+}
+\xtc{
+Define the polynomials.
+}{
+\spadpaste{p1: P :=  a*b*c*d*e*f - 1 \free{P} \bound{p1}}
+}
+\xtc{
+}{
+\spadpaste{p2: P := a*b*c*d*e +a*b*c*d*f +a*b*c*e*f +a*b*d*e*f +a*c*d*e*f +b*c*d*e*f  \free{P} \bound{p2}}
+}
+\xtc{
+}{
+\spadpaste{p3: P :=  a*b*c*d + a*b*c*f + a*b*e*f + a*d*e*f + b*c*d*e + c*d*e*f \free{P} \bound{p3}}
+}
+\xtc{
+}{
+\spadpaste{p4: P := a*b*c + a*b*f + a*e*f + b*c*d + c*d*e + d*e*f  \free{P} \bound{p4}}
+}
+\xtc{
+}{
+\spadpaste{p5: P := a*b + a*f + b*c + c*d + d*e + e*f \free{P} \bound{p5}}
+}
+\xtc{
+}{
+\spadpaste{p6: P := a + b + c + d + e + f  \free{P} \bound{p6}}
+}
+\xtc{
+}{
+\spadpaste{lp := [p1, p2, p3, p4, p5, p6] \free{p1} \free{p2} \free{p3} \free{p4} \free{p5} \free{p6} \bound{lp}}
+}
+\xtc{
+Now call \spadtype{LEXTRIPK} .
+}{
+\spadpaste{lextripack :=  LEXTRIPK(R,ls) \free{R} \free{ls} \bound{lextripack}}
+}
+\xtc{
+Compute the lexicographical Groebner basis of the system.
+This may take between 5 minutes and one hour, depending on your machine.
+}{
+\spadpaste{lg := groebner(lp)$lextripack \free{lp} \free{lextripack} \bound{lg}}
+}
+\xtc{
+Apply lexTriangular to compute a decomposition into regular triangular sets.
+This should not take more than 5 seconds.
+}{
+\spadpaste{lexTriangular(lg,false)$lextripack \free{lg} \free{lextripack}}
+}
+Note that the first set of the decomposition is normalized
+(all initials are integer numbers) but not the second one
+(normalized triangular sets are defined in the
+description of the \spadtype{NormalizedTriangularSetCategory} constructor).
+\xtc{
+So apply now lexTriangular to produce normalized triangular sets.
+}{
+\spadpaste{lts := lexTriangular(lg,true)$lextripack \free{lg} \free{lextripack} \bound{lts}}
+}
+\xtc{
+We check that all initials are constant.
+}{
+\spadpaste{[[init(p) for p in (ts :: List(P))] for ts in lts]  \free{lts}}
+}
+Note that each triangular set in {\bf lts} is a lexicographical Groebner basis.
+Recall that a point belongs to the variety 
+associated with {\bf lp} if and only if
+it belongs to that associated with one triangular set {\bf ts} in {\bf lts}.
+
+By running the 
+\axiomOpFrom{squareFreeLexTriangular}{LexTriangularPackage} operation,
+we retrieve the above decomposition.
+\xtc{
+}{
+\spadpaste{squareFreeLexTriangular(lg,true)$lextripack \free{lg} \free{lextripack}}
+}
+Thus the solutions given by {\bf lts} are pairwise different.
+\xtc{
+We count them as follows.
+}{
+\spadpaste{reduce(+,[degree(ts) for ts in lts]) \free{lts}}
+}
+
+We can investigate the triangular decomposition {\bf lts} by
+using the \spadtype{ZeroDimensionalSolvePackage}.
+\xtc{
+This requires to add an extra variable (smaller than the others) as follows.
+}{
+\spadpaste{ls2 : List Symbol := concat(ls,new()$Symbol) \free{ls} \bound{ls2}}
+}
+
+\xtc{
+Then we call the package.
+}{
+\spadpaste{zdpack := ZDSOLVE(R,ls,ls2) \free{R} \free{ls} \free{ls2} \bound{zdpack}}
+}
+
+
+\xtc{
+We compute a univariate representation of the variety associated with the input
+system as follows.
+}{
+\spadpaste{concat [univariateSolve(ts)$zdpack for ts in lts] \free{lts} \free{zdpack}}
+}
+Since the 
+\axiomOpFrom{univariateSolve}{ZeroDimensionalSolvePackage} operation may
+split a regular set, it returns a list. This explains the use
+of \axiomOpFrom{concat}{List}.
+
+Look at the last item of the result. It consists of two parts.
+For any complex root {\bf ?} of the univariate polynomial in the first part,
+we get a tuple of 
+univariate polynomials (in {\bf a}, ..., {\bf f} respectively)
+by replacing {\bf \%A} by {\bf ?} in the second part.
+Each of these tuples {\bf t} 
+describes a point of the variety associated with {\bf lp}
+by equaling to zero the polynomials in {\bf t}.
+
+Note that the way of reading these univariate representations is explained also
+in the example illustrating the 
+\spadtype{ZeroDimensionalSolvePackage} constructor.
+
+\xtc{
+Now, we compute the points of the variety with real coordinates.
+}{
+\spadpaste{concat [realSolve(ts)$zdpack for ts in lts] \free{lts} \free{zdpack}}
+}
+We obtain 24 points given by lists of elements in the \spadtype{RealClosure}
+of \spadtype{Fraction} of {\bf R}.
+In each list, the first value corresponds to the indeterminate {\bf f},
+the second to {\bf e} and so on.
+See \spadtype{ZeroDimensionalSolvePackage} to learn more about
+the \axiomOpFrom{realSolve}{ZeroDimensionalSolvePackage} operation.
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{lib.ht}
+<<lib.ht>>=
+\newcommand{\LibraryXmpTitle}{Library}
+\newcommand{\LibraryXmpNumber}{9.41}
+
+@
+\subsection{Library}
+\label{LibraryXmpPage}
+\begin{itemize}
+\item FileXmpPage \ref{FileXmpPage} on
+page~pageref{FileXmpPage}
+\item TextFileXmpPage \ref{TextFileXmpPage} on
+page~pageref{TextFileXmpPage}
+\item KeyedAccessFileXmpPage \ref{KeyedAccessFileXmpPage} on
+page~pageref{KeyedAccessFileXmpPage}
+\end{itemize}
+\index{pages!LibraryXmpPage!lib.ht}
+\index{lib.ht!pages!LibraryXmpPage}
+\index{LibraryXmpPage!lib.ht!pages}
+<<lib.ht>>=
+\begin{page}{LibraryXmpPage}{Library}
+\beginscroll
+ 
+The \spadtype{Library} domain provides a simple way to store Axiom
+values in a file.
+This domain is similar to \spadtype{KeyedAccessFile} but fewer declarations
+are needed and items of different types can be saved together in the same
+file.
+ 
+\xtc{
+To create a library, you supply a file name.
+}{
+\spadpaste{stuff := library "/tmp/Neat.stuff" \bound{stuff}}
+}
+\xtc{
+Now values can be saved by key in the file.
+The keys should be mnemonic, just as the field names are for records.
+They can be given either as strings or symbols.
+}{
+\spadpaste{stuff.int    := 32**2     \free{stuff}\bound{stuffa}}
+}
+\xtc{
+}{
+\spadpaste{stuff."poly" := x**2 + 1  \free{stuffa}\bound{stuffb}}
+}
+\xtc{
+}{
+\spadpaste{stuff.str    := "Hello"   \free{stuffb}\bound{stuffc}}
+}
+\xtc{
+You obtain
+the set of available keys using the \spadfunFrom{keys}{Library} operation.
+}{
+\spadpaste{keys stuff \free{stuffa,stuffb,stuffc}\bound{stuffabc}}
+}
+\xtc{
+You extract values  by giving the desired key in this way.
+}{
+\spadpaste{stuff.poly     \free{stuffb}}
+}
+\xtc{
+}{
+\spadpaste{stuff("poly")  \free{stuffb}}
+}
+\noOutputXtc{
+When the file is no longer needed, you should remove it from the
+file system.
+}{
+\spadpaste{)system rm -rf /tmp/Neat.stuff  \free{stuff}\bound{rmstuff}}
+}
+ 
+For more information on related topics, see
+\downlink{`File'}{FileXmpPage}\ignore{File},
+\downlink{`TextFile'}{TextFileXmpPage}\ignore{TextFile}, and
+\downlink{`KeyedAccessFile'}{KeyedAccessFileXmpPage}\ignore{KeyedAccessFile}.
+\showBlurb{Library}
+\endscroll
+\autobuttons
+\end{page}
+%
+
+@
+\section{link.ht}
+\subsection{The AXIOM Link to NAG Software}
+\begin{itemize}
+\item nagLinkIntroPage \ref{nagLinkIntroPage} on
+page~\pageref{nagLinkIntroPage}
+\item htxl1 \ref{htxl1} on
+page~\pageref{htxl1}
+\item FoundationLibraryDocPage \ref{FoundationLibraryDocPage} on
+page~\pageref{FoundationLibraryDocPage}
+\end{itemize}
+\label{htxl}
+\index{pages!htxl!link.ht}
+\index{link.ht!pages!htxl}
+\index{htxl!link.ht!pages}
+<<link.ht>>=
+\begin{page}{htxl}{The AXIOM Link to NAG Software}
+\beginscroll
+\beginmenu
+\item \menumemolink{Introduction to the NAG Library Link}{nagLinkIntroPage}
+\menumemolink{Access the Link from HyperDoc}{htxl1}
+\menulispmemolink{Browser pages for individual routines}{(|kSearch| "Nag*")}
+\menumemolink{NAG Library Documentation}{FoundationLibraryDocPage}
+\endmenu
+\endscroll
+\end{page}
+
+@
+\subsection{Use of the Link from HyperDoc}
+\label{htx11}
+\begin{itemize}
+\item c02 \ref{c02} on
+page~\pageref{c02}
+\item c05 \ref{c05} on
+page~\pageref{c05}
+\item c06 \ref{c06} on
+page~\pageref{c06}
+\item d01 \ref{d01} on
+page~\pageref{d01}
+\item d02 \ref{d02} on
+page~\pageref{d02}
+\item d03 \ref{d03} on
+page~\pageref{d03}
+\item e01 \ref{e01} on
+page~\pageref{e01}
+\item e02 \ref{e02} on
+page~\pageref{e02}
+\item e04 \ref{e04} on
+page~\pageref{e04}
+\item f01 \ref{f01} on
+page~\pageref{f01}
+\item f02 \ref{f02} on
+page~\pageref{f02}
+\item f04 \ref{f04} on
+page~\pageref{f04}
+\item f07 \ref{f07} on
+page~\pageref{f07}
+\item s \ref{s} on
+page~\pageref{s}
+\end{itemize}
+\index{pages!htx11!link.ht}
+\index{link.ht!pages!htx11}
+\index{htx11!link.ht!pages}
+<<link.ht>>=
+\begin{page}{htxl1}{Use of the Link from HyperDoc}
+Click on the chapter of routines that you would like to use.
+\beginscroll
+\beginmenu
+\menumemolink{C02}{c02}\tab{8} Zeros of Polynomials
+\menumemolink{C05}{c05}\tab{8} Roots of One or More Transcendental Equations
+\menumemolink{C06}{c06}\tab{8} Summation of Series
+\menumemolink{D01}{d01}\tab{8} Quadrature
+\menumemolink{D02}{d02}\tab{8} Ordinary Differential Equations
+\menumemolink{D03}{d03}\tab{8} Partial Differential Equations
+\menumemolink{E01}{e01}\tab{8} Interpolation
+\menumemolink{E02}{e02}\tab{8} Curve and Surface Fitting
+\menumemolink{E04}{e04}\tab{8} Minimizing or Maximizing a Function
+\menumemolink{F01}{f01}\tab{8} Matrix Operations, Including Inversion
+\menumemolink{F02}{f02}\tab{8} Eigenvalues and Eigenvectors
+\menumemolink{F04}{f04}\tab{8} Simultaneous Linear Equations
+\menumemolink{F07}{f07}\tab{8} Linear Equations (LAPACK)
+\menumemolink{S}{s}\tab{8} Approximations of Special Functions
+\endmenu
+\endscroll
+\end{page}
+
+@
+\subsection{C02 Zeros of Polynomials}
+\label{c02}
+\begin{itemize}
+\item manpageXXc02 \ref{manpageXXc02} on
+page~\pageref{manpageXXc02}
+\end{itemize}
+\index{pages!c02!link.ht}
+\index{link.ht!pages!c02}
+\index{c02!link.ht!pages}
+<<link.ht>>=
+\begin{page}{c02}{C02 Zeros of Polynomials}
+\beginscroll
+\centerline{What would you like to do?}
+\newline
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter c02 Manual Page}{manpageXXc02}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagPolynomialRootsPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{C02AFF}{(|c02aff|)}\space{}
+\tab{10}  All zeros of a complex polynomial 
+\menulispdownlink{C02AGF}{(|c02agf|)}\space{}
+\tab{10}  All zeros of a real polynomial
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{C05 Roots of One or More Transcendental Equations}
+\label{c05}
+\begin{itemize}
+\item manpageXXc05 \ref{manpageXXc05} on
+page~\pageref{manpageXXc05}
+\end{itemize}
+\index{pages!c05!link.ht}
+\index{link.ht!pages!c05}
+\index{c05!link.ht!pages}
+<<link.ht>>=
+\begin{page}{c05}{C05 Roots of One or More Transcendental Equations}
+\beginscroll
+\centerline{What would you like to do?}
+\newline
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter c05 Manual Page}{manpageXXc05}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagRootFindingPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{C05ADF}{(|c05adf|)}\space{}
+\tab{10}  Zero of continuous function in given interval, Bus and Dekker algorithm
+\menulispdownlink{C05NBF}{(|c05nbf|)}\space{}
+\tab{10}  Solution of system of nonlinear equations using function values only
+\menulispdownlink{C05PBF}{(|c05pbf|)}\space{}
+\tab{10}  Solution of system of nonlinear equations using 1st derivatives
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{C06 Summation of Series}
+\label{c06}
+\begin{itemize}
+\item manpageXXc06 \ref{manpageXXc06} on
+page~\pageref{manpageXXc06}
+\end{itemize}
+\index{pages!c06!link.ht}
+\index{link.ht!pages!c06}
+\index{c06!link.ht!pages}
+<<link.ht>>=
+\begin{page}{c06}{C06 Summation of Series}
+\beginscroll
+\centerline{What would you like to do?}
+\newline
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter c06 Manual Page}{manpageXXc06}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagSeriesSummationPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{C06EAF}{(|c06eaf|)}\space{}
+\tab{10}  Single 1-D real discrete Fourier transform, no extra workspace
+\menulispdownlink{C06EBF}{(|c06ebf|)}\space{}
+\tab{10}  Single 1-D Hermitian discrete Fourier transform, no extra workspace
+\menulispdownlink{C06ECF}{(|c06ecf|)}\space{}
+\tab{10}  Single 1-D complex discrete Fourier transform, no extra workspace
+\menulispdownlink{C06EKF}{(|c06ekf|)}\space{}
+\tab{10}  Circular convolution or correlation of two real vectors, no extra
+workspace
+\menulispdownlink{C06FPF}{(|c06fpf|)}\space{}
+\tab{10}  Multiple 1-D real discrete Fourier transforms
+\menulispdownlink{C06FQF}{(|c06fqf|)}\space{}
+\tab{10}  Multiple 1-D Hermitian discrete Fourier transforms
+\menulispdownlink{C06FRF}{(|c06frf|)}\space{}
+\tab{10}  Multiple 1-D complex discrete Fourier transforms
+\menulispdownlink{C06FUF}{(|c06fuf|)}\space{}
+\tab{10}  2-D complex discrete Fourier transforms
+\menulispdownlink{C06GBF}{(|c06gbf|)}\space{}
+\tab{10}  Complex conjugate of Hermitian sequence
+\menulispdownlink{C06GCF}{(|c06gcf|)}\space{}
+\tab{10}  Complex conjugate of complex sequence
+\menulispdownlink{C06GQF}{(|c06gqf|)}\space{}
+\tab{10}  Complex conjugate of multiple Hermitian sequences
+\menulispdownlink{C06GSF}{(|c06gsf|)}\space{}
+\tab{10}  Convert Hermitian sequences to general complex sequences
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{D01 Quadrature}
+\label{d01}
+\begin{itemize}
+\item manpageXXd01 \ref{manpageXXd01} on
+page~\pageref{manpageXXd01}
+\end{itemize}
+\index{pages!d01!link.ht}
+\index{link.ht!pages!d01}
+\index{d01!link.ht!pages}
+<<link.ht>>=
+\begin{page}{d01}{D01 Quadrature}
+\beginscroll
+\centerline{What would you like to do?}
+\newline
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter d01 Manual Page}{manpageXXd01}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagIntegrationPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{D01AJF}{(|d01ajf|)}\space{}
+\tab{10}  1-D quadrature, adaptive, finite interval, strategy due to Plessens
+and de Doncker, allowing for badly-behaved integrands
+\menulispdownlink{D01AKF}{(|d01akf|)}\space{}
+\tab{10}  1-D quadrature, adaptive, finite interval, method suitable for
+oscillating functions
+\menulispdownlink{D01ALF}{(|d01alf|)}\space{}
+\tab{10}  1-D quadrature, adaptive, finite interval, allowing for 
+singularities at user specified points
+\menulispdownlink{D01AMF}{(|d01amf|)}\space{}
+\tab{10}  1-D quadrature, adaptive, infinite or semi-finite interval
+\menulispdownlink{D01ANF}{(|d01anf|)}\space{}
+\tab{10}  1-D quadrature, adaptive, finite interval, weight function
+ cos(\omega x) or sin(\omega x)
+\menulispdownlink{D01APF}{(|d01apf|)}\space{}
+\tab{10}  1-D quadrature, adaptive, finite interval, weight function
+with end point singularities of algebraico-logarithmic type
+\menulispdownlink{D01AQF}{(|d01aqf|)}\space{}
+\tab{10}  1-D quadrature, adaptive, finite interval, weight function
+1/(x-c), Cauchy principle value (Hilbert transform)
+\menulispdownlink{D01ASF}{(|d01asf|)}\space{}
+\tab{10}  1-D quadrature, adaptive, semi-infinite interval, weight function
+cos(\omega x) or sin(\omega x)
+\menulispdownlink{D01BBF}{(|d01bbf|)}\space{}
+\tab{10} Pre-computed weights and abscissae for Gaussian quadrature rules,
+restricted choice of rule
+\menulispdownlink{D01FCF}{(|d01fcf|)}\space{}
+\tab{10} Multi-dimensional adaptive quadrature over hyper-rectangle
+\menulispdownlink{D01GAF}{(|d01gaf|)}\space{}
+\tab{10} 1-D quadrature, integration of function defined by data values,
+Gill-Miller method
+\menulispdownlink{D01GBF}{(|d01gbf|)}\space{}
+\tab{10} Multi-dimensional quadrature over hyper-rectangle, Monte Carlo method
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{D02 Ordinary Differential Equations}
+\label{d02}
+\begin{itemize}
+\item manpageXXd02 \ref{manpageXXd02} on
+page~\pageref{manpageXXd02}
+\end{itemize}
+\index{pages!d02!link.ht}
+\index{link.ht!pages!d02}
+\index{d02!link.ht!pages}
+<<link.ht>>=
+\begin{page}{d02}{D02 Ordinary Differential Equations}
+\beginscroll
+\centerline{What would you like to do?}
+\newline
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter d02 Manual Page}{manpageXXd02}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagOrdinaryDifferentialEquationsPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{D02BBF}{(|d02bbf|)}\space{}
+\tab{10}  ODEs, IVP, Runge-Kutta-Merson method, over a range, 
+intermediate output
+\menulispdownlink{D02BHF}{(|d02bhf|)}\space{}
+\tab{10}  ODEs, IVP, Runge-Kutta-Merson method, until function of 
+solution is zero
+\menulispdownlink{D02CJF}{(|d02cjf|)}\space{}
+\tab{10}  ODEs, IVP, Adams method, until function of solution is zero,
+intermediate output
+\menulispdownlink{D02EJF}{(|d02ejf|)}\space{}
+\tab{10}  ODEs, stiff IVP, BDF method, until function of solution is zero,
+intermediate output
+\menulispdownlink{D02GAF}{(|d02gaf|)}\space{}
+\tab{10}  ODEs, boundary value problem, finite difference technique with
+deferred correction, simple nonlinear problem
+\menulispdownlink{D02GBF}{(|d02gbf|)}\space{}
+\tab{10}  ODEs, boundary value problem, finite difference technique with
+deferred correction, general nonlinear problem
+\menulispdownlink{D02KEF}{(|d02kef|)}\space{}
+\tab{10}  2nd order Sturm-Liouville problem, regular/singular system,
+finite/infinite range, eigenvalue and eigenfunction, user-specified 
+break-points
+\menulispdownlink{D02RAF}{(|d02raf|)}\space{}
+\tab{10}  ODEs, general nonlinear boundary value problem, finite difference
+technique with deferred correction, continuation facility
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{D03 Partial Differential Equations}
+\label{d03}
+\begin{itemize}
+\item manpageXXd03 \ref{manpageXXd03} on
+page~\pageref{manpageXXd03}
+\end{itemize}
+\index{pages!d03!link.ht}
+\index{link.ht!pages!d03}
+\index{d03!link.ht!pages}
+<<link.ht>>=
+\begin{page}{d03}{D03 Partial Differential Equations}
+\beginscroll
+\centerline{What would you like to do?}
+\newline
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter d03 Manual Page}{manpageXXd03}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagPartialDifferentialEquationsPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{D03EDF}{(|d03edf|)}\space{}
+\tab{10}  Elliptic PDE, solution of finite difference equations by a multigrid 
+technique
+\menulispdownlink{D03EEF}{(|d03eef|)}\space{}
+\tab{10}  Discretize a 2nd order elliptic PDE on a rectangle
+\menulispdownlink{D03FAF}{(|d03faf|)}\space{}
+\tab{10}  Elliptic PDE, Helmholtz equation, 3-D Cartesian co-ordinates
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{E01 Interpolation}
+\label{e01}
+\begin{itemize}
+\item manpageXXe01 \ref{manpageXXe01} on
+page~\pageref{manpageXXe01}
+\end{itemize}
+\index{pages!e01!link.ht}
+\index{link.ht!pages!e01}
+\index{e01!link.ht!pages}
+<<link.ht>>=
+\begin{page}{e01}{E01 Interpolation}
+\beginscroll
+\centerline{What would you like to do?}
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter e01 Manual Page}{manpageXXe01}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagInterpolationPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{E01BAF}{(|e01baf|)}\space{}
+\tab{10}  Interpolating functions, cubic spline interpolant, one variable
+\menulispdownlink{E01BEF}{(|e01bef|)}\space{}
+\tab{10}  Interpolating functions, monotonicity-preserving, piecewise
+cubic Hermite, one variable
+\menulispdownlink{E01BFF}{(|e01bff|)}\space{}
+\tab{10}  Interpolated values, interpolant computed by E01BEF, function
+only, one variable
+\menulispdownlink{E01BGF}{(|e01bgf|)}\space{}
+\tab{10}  Interpolated values, interpolant computed by E01BEF, function
+and 1st derivative, one variable
+\menulispdownlink{E01BHF}{(|e01bhf|)}\space{}
+\tab{10}  Interpolated values, interpolant computed by E01BEF, definite
+integral, one variable
+\menulispdownlink{E01DAF}{(|e01daf|)}\space{}
+\tab{10}  Interpolating functions, fitting bicubic spline, data on a 
+rectangular grid
+\menulispdownlink{E01SAF}{(|e01saf|)}\space{}
+\tab{10}  Interpolating functions, method of Renka and Cline, two variables
+\menulispdownlink{E01SEF}{(|e01sef|)}\space{}
+\tab{10}  Interpolating functions, modified Shepherd's method, two variables
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{E02 Curve and Surface Fitting}
+\label{e02}
+\begin{itemize}
+\item manpageXXe02 \ref{manpageXXe02} on
+page~\pageref{manpageXXe02}
+\end{itemize}
+\index{pages!e02!link.ht}
+\index{link.ht!pages!e02}
+\index{e02!link.ht!pages}
+<<link.ht>>=
+\begin{page}{e02}{E02 Curve and Surface Fitting}
+\beginscroll
+\centerline{What would you like to do?}
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter e02 Manual Page}{manpageXXe02}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagFittingPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{E02ADF}{(|e02adf|)}\space{}
+\tab{10}  Least-squares curve fit, by polynomials, arbitrary data points
+\menulispdownlink{E02AEF}{(|e02aef|)}\space{}
+\tab{10}  Evaluation of fitted polynomial in one variable from Chebyshev series
+form (simplified parameter list)
+\menulispdownlink{E02AGF}{(|e02agf|)}\space{}
+\tab{10}  Least-squares polynomial fit, values and derivatives may be
+constrained, arbitrary data points
+\menulispdownlink{E02AHF}{(|e02ahf|)}\space{}
+\tab{10}  Derivative of fitted polynomial in Chebyshev series form
+\menulispdownlink{E02AJF}{(|e02ajf|)}\space{}
+\tab{10}  Integral of fitted polynomial in Chebyshev series form
+\menulispdownlink{E02AKF}{(|e02akf|)}\space{}
+\tab{10}  Evaluation of fitted polynomial in one variable, from Chebyshev 
+series form
+\menulispdownlink{E02BAF}{(|e02baf|)}\space{}
+\tab{10}  Least-squares curve cubic spline fit (including interpolation)
+\menulispdownlink{E02BBF}{(|e02bbf|)}\space{}
+\tab{10}  Evaluation of fitted cubic spline, function only
+\menulispdownlink{E02BCF}{(|e02bcf|)}\space{}
+\tab{10}  Evaluation of fitted cubic spline, function and derivatives
+\menulispdownlink{E02BDF}{(|e02bdf|)}\space{}
+\tab{10}  Evaluation of fitted cubic spline, definite integral
+\menulispdownlink{E02BEF}{(|e02bef|)}\space{}
+\tab{10}  Least-squares curve cubic spline fit, automatic knot placement
+\menulispdownlink{E02DAF}{(|e02daf|)}\space{}
+\tab{10}  Least-squares surface fit, bicubic splines
+\menulispdownlink{E02DCF}{(|e02dcf|)}\space{}
+\tab{10}  Least-squares surface fit by bicubic splines with automatic knot
+placement, data on a rectangular grid
+\menulispdownlink{E02DDF}{(|e02ddf|)}\space{}
+\tab{10}  Least-squares surface fit by bicubic splines with automatic knot
+placement, scattered data
+\menulispdownlink{E02DEF}{(|e02def|)}\space{}
+\tab{10}  Evaluation of a fitted bicubic spline at a vector of points
+\menulispdownlink{E02DFF}{(|e02dff|)}\space{}
+\tab{10}  Evaluation of a fitted bicubic spline at a mesh of points
+\menulispdownlink{E02GAF}{(|e02gaf|)}\space{}
+\tab{10}  \htbitmap{l1}-approximation by general linear function
+\menulispdownlink{E02ZAF}{(|e02zaf|)}\space{}
+\tab{10}  Sort 2-D sata into panels for fitting bicubic splines
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{E04 Minimizing or Maximizing a Function}
+\label{e04}
+\begin{itemize}
+\item manpageXXe04 \ref{manpageXXe04} on
+page~\pageref{manpageXXe04}
+\end{itemize}
+\index{pages!e04!link.ht}
+\index{link.ht!pages!e04}
+\index{e04!link.ht!pages}
+<<link.ht>>=
+\begin{page}{e04}{E04 Minimizing or Maximizing a Function}
+\beginscroll
+\centerline{What would you like to do?}
+\newline
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter e04 Manual Page}{manpageXXe04}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagOptimisationPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{E04DGF}{(|e04dgf|)}\space{}
+\tab{10}  Unconstrained minimum, pre-conditioned conjugate gradient algorithm,
+function of several variables using 1st derivatives
+\menulispdownlink{E04FDF}{(|e04fdf|)}\space{}
+\tab{10}  Unconstrained minimum of a sum of squares, combined Gauss-Newton
+and modified Newton algorithm using function values only
+\menulispdownlink{E04GCF}{(|e04gcf|)}\space{}
+\tab{10}  Unconstrained minimum, of a sum of squares, combined Gauss-Newton
+and modified Newton algorithm using 1st derivatives
+\menulispdownlink{E04JAF}{(|e04jaf|)}\space{}
+\tab{10}  Minimum, function of several variables, quasi-Newton algorithm,
+simple bounds, using function values only
+\menulispdownlink{E04MBF}{(|e04mbf|)}\space{}
+\tab{10}  Linear programming problem
+\menulispdownlink{E04NAF}{(|e04naf|)}\space{}
+\tab{10}  Quadratic programming problem
+\menulispdownlink{E04UCF}{(|e04ucf|)}\space{}
+\tab{10}  Minimum, function of several variables, sequential QP method,
+nonlinear constraints, using function values and optionally 1st derivatives
+\menulispdownlink{E04YCF}{(|e04ycf|)}\space{}
+\tab{10}  Covariance matrix for non-linear least-squares problem
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{F01 Matrix Operations - Including Inversion}
+\label{f01}
+\begin{itemize}
+\item manpageXXf \ref{manpageXXf} on
+page~\pageref{manpageXXf}
+\item manpageXXf01 \ref{manpageXXf01} on
+page~\pageref{manpageXXf01}
+\end{itemize}
+\index{pages!f01!link.ht}
+\index{link.ht!pages!f01}
+\index{f01!link.ht!pages}
+<<link.ht>>=
+\begin{page}{f01}{F01 Matrix Operations - Including Inversion}
+\beginscroll
+\centerline{What would you like to do?}
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter f Manual Page}{manpageXXf}
+\menuwindowlink{Foundation Library Chapter f01 Manual Page}{manpageXXf01}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagMatrixOperationsPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{F01BRF}{(|f01brf|)}\space{}
+\tab{10}  {\it LU} factorization of real sparse matrix
+\menulispdownlink{F01BSF}{(|f01bsf|)}\space{}
+\tab{10}  {\it LU} factorization of real sparse matrix with known sparsity
+pattern
+\menulispdownlink{F01MAF}{(|f01maf|)}\space{}
+\tab{10}  \htbitmap{llt} factorization of real sparse
+symmetric positive-definite matrix
+\menulispdownlink{F01MCF}{(|f01mcf|)}\space{}
+\tab{10}  \htbitmap{ldlt} factorization of real 
+symmetric positive-definite variable-bandwith matrix
+\menulispdownlink{F01QCF}{(|f01qcf|)}\space{}
+\tab{10}  {\it QR} factorization of real {\it m} by {\it n} matrix 
+(m \htbitmap{great=} n)
+\menulispdownlink{F01QDF}{(|f01qdf|)}\space{}
+\tab{10} Operations with orthogonal matrices, compute {\it QB} or
+\htbitmap{f01qdf} after factorization by F01QCF or F01QFF
+\menulispdownlink{F01QEF}{(|f01qef|)}\space{}
+\tab{10} Operations with orthogonal matrices, form columns of {\it Q}
+after factorization by F01QCF or F01QFF 
+\menulispdownlink{F01RCF}{(|f01rcf|)}\space{}
+\tab{10} {\it QR} factorization of complex {\it m} by {\it n} matrix 
+(m \htbitmap{great=} n) 
+\menulispdownlink{F01RDF}{(|f01rdf|)}\space{}
+\tab{10} Operations with unitary matrices, compute {\it QB} or
+\htbitmap{f01rdf} after factorization by F01RCF
+\menulispdownlink{F01REF}{(|f01ref|)}\space{}
+\tab{10} Operations with unitary matrices, form columns of {\it Q}
+after factorization by F01RCF
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{F02 Eigenvalues and Eigenvectors}
+\label{f02}
+\begin{itemize}
+\item manpageXXf \ref{manpageXXf} on
+page~\pageref{manpageXXf}
+\item manpageXXf02 \ref{manpageXXf02} on
+page~\pageref{manpageXXf02}
+\end{itemize}
+\index{pages!f02!link.ht}
+\index{link.ht!pages!f02}
+\index{f02!link.ht!pages}
+<<link.ht>>=
+\begin{page}{f02}{F02 Eigenvalues and Eigenvectors}
+\beginscroll
+\centerline{What would you like to do?}
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter f Manual Page}{manpageXXf}
+\menuwindowlink{Foundation Library Chapter f02 Manual Page}{manpageXXf02}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagEigenPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{F02AAF}{(|f02aaf|)}\space{}
+\tab{10}  All eigenvalues of real symmetric matrix (Black box)
+\menulispdownlink{F02ABF}{(|f02abf|)}\space{}
+\tab{10}  All eigenvalues and eigenvectors of real symmetric matrix (Black box)
+\menulispdownlink{F02ADF}{(|f02adf|)}\space{}
+\tab{10}  All eigenvalues of generalized real eigenproblem of the form
+Ax = \lambda Bx where A and B are symmetric and B is positive definite
+\menulispdownlink{F02AEF}{(|f02aef|)}\space{}
+\tab{10}  All eigenvalues and eigenvectors of generalized real eigenproblem 
+of the form Ax = \lambda Bx where A and B are symmetric and B is positive 
+definite
+\menulispdownlink{F02AFF}{(|f02aff|)}\space{}
+\tab{10}  All eigenvalues of real matrix (Black box)
+\menulispdownlink{F02AGF}{(|f02agf|)}\space{}
+\tab{10}  All eigenvalues and eigenvectors of real matrix (Black box)
+\menulispdownlink{F02AJF}{(|f02ajf|)}\space{}
+\tab{10}  All eigenvalues of complex matrix (Black box)
+\menulispdownlink{F02AKF}{(|f02akf|)}\space{}
+\tab{10}  All eigenvalues and eigenvectors of complex matrix (Black box)
+\menulispdownlink{F02AWF}{(|f02awf|)}\space{}
+\tab{10}  All eigenvalues of complex Hermitian matrix (Black box)
+\menulispdownlink{F02AXF}{(|f02axf|)}\space{}
+\tab{10}  All eigenvalues and eigenvectors of complex Hermitian 
+matrix (Black box)
+\menulispdownlink{F02BBF}{(|f02bbf|)}\space{}
+\tab{10}  Selected eigenvalues and eigenvectors of real symmetric
+matrix (Black box)
+\menulispdownlink{F02BJF}{(|f02bjf|)}\space{}
+\tab{10}  All eigenvalues and optionally eigenvectors of generalized
+eigenproblem by {\it QZ} algorithm, real matrices (Black box)
+\menulispdownlink{F02FJF}{(|f02fjf|)}\space{}
+\tab{10}  Selected eigenvalues and eigenvectors of sparse symmetric 
+eigenproblem
+\menulispdownlink{F02WEF}{(|f02wef|)}\space{}
+\tab{10}  SVD of real matrix
+\menulispdownlink{F02XEF}{(|f02xef|)}\space{}
+\tab{10}  SVD of complex matrix
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{F04 Simultaneous Linear Equations}
+\label{f04}
+\begin{itemize}
+\item manpageXXf \ref{manpageXXf} on
+page~\pageref{manpageXXf}
+\item manpageXXf04 \ref{manpageXXf04} on
+page~\pageref{manpageXXf04}
+\end{itemize}
+\index{pages!f04!link.ht}
+\index{link.ht!pages!f04}
+\index{f04!link.ht!pages}
+<<link.ht>>=
+\begin{page}{f04}{F04 Simultaneous Linear Equations}
+\beginscroll
+\centerline{What would you like to do?}
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter f Manual Page}{manpageXXf}
+\menuwindowlink{Foundation Library Chapter f04 Manual Page}{manpageXXf04}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagLinearEquationSolvingPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{F04ADF}{(|f04adf|)}\space{}
+\tab{10}  Solution of complex simultaneous linear equations, with multiple
+right-hand sides (Black box)
+\menulispdownlink{F04ARF}{(|f04arf|)}\space{}
+\tab{10}  Solution of real simultaneous linear equations, one right-hand side
+(Black box)
+\menulispdownlink{F04ASF}{(|f04asf|)}\space{}
+\tab{10}  Solution of real symmetric positive-definite simultaneous linear
+equations, one right-hand side using iterative refinement (Black box)
+\menulispdownlink{F04ATF}{(|f04atf|)}\space{}
+\tab{10}  Solution of real simultaneous linear equations, one right-hand side 
+using iterative refinement (Black box)
+\menulispdownlink{F04AXF}{(|f04axf|)}\space{}
+\tab{10}  Approximate solution of real sparse simultaneous linear equations
+(coefficient matrix already factorized by F01BRF or F01BSF)
+\menulispdownlink{F04FAF}{(|f04faf|)}\space{}
+\tab{10}  Solution of real symmetric positive-definite tridiagonal 
+simultaneous linear equations, one right-hand side (Black box)
+\menulispdownlink{F04JGF}{(|f04jgf|)}\space{}
+\tab{10}  Least-squares (if rank = n) or minimal least-squares (if rank < n) 
+solution of m real equations in n unknowns, rank \htbitmap{less=} n,
+ m \htbitmap{great=} n
+\menulispdownlink{F04MAF}{(|f04maf|)}\space{}
+\tab{10}  Real sparse symmetric positive-definite simultaneous linear
+equations(coefficient matrix already factorized)
+\menulispdownlink{F04MBF}{(|f04mbf|)}\space{}
+\tab{10}  Real sparse symmetric simultaneous linear equations
+\menulispdownlink{F04MCF}{(|f04mcf|)}\space{}
+\tab{10}  Approximate solution of real symmetric positive-definite 
+variable-bandwidth simultaneous linear equations (coefficient matrix 
+already factorized)
+\menulispdownlink{F04QAF}{(|f04qaf|)}\space{}
+\tab{10}  Sparse linear least-squares problem, {\it m} real equations
+in {\it n} unknowns
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\subsection{F07 Linear Equations (LAPACK)}
+\label{f07}
+\begin{itemize}
+\item manpageXXf \ref{manpageXXf} on
+page~\pageref{manpageXXf}
+\item manpageXXf07 \ref{manpageXXf07} on
+page~\pageref{manpageXXf07}
+\end{itemize}
+\index{pages!f07!link.ht}
+\index{link.ht!pages!f07}
+\index{f07!link.ht!pages}
+<<link.ht>>=
+\begin{page}{f07}{F07 Linear Equations (LAPACK)}
+\beginscroll
+\centerline{What would you like to do?}
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter f Manual Page}{manpageXXf}
+\menuwindowlink{Foundation Library Chapter f07 Manual Page}{manpageXXf07}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagLapack")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{F07ADF}{(|f07adf|)}\space{}
+\tab{10}  (DGETRF) {\it LU} factorization of real {\it m} by {\it n} matrix
+\menulispdownlink{F07AEF}{(|f07aef|)}\space{}
+\tab{10}  (DGETRS) Solution of real system of linear equations, multiple 
+right hand sides, matrix factorized by F07ADF
+\menulispdownlink{F07FDF}{(|f07fdf|)}\space{}
+\tab{10}  (DPOTRF) Cholesky factorization of real symmetric positive-definite
+matrix
+\menulispdownlink{F07FEF}{(|f07fef|)}\space{}
+\tab{10}  (DPOTRS) Solution of real symmetric positive-definite system of
+linear equations, multiple right-hand sides, matrix already factorized by 
+F07FDF
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+
+@
+\subsection{S \space{2} Approximations of Special Functions}
+\label{s}
+\begin{itemize}
+\item manpageXXs \ref{manpageXXs} on
+page~\pageref{manpageXXs}
+\end{itemize}
+\index{pages!s!link.ht}
+\index{link.ht!pages!s}
+\index{s!link.ht!pages}
+<<link.ht>>=
+\begin{page}{s}{S \space{2} Approximations of Special Functions}
+\beginscroll
+\centerline{What would you like to do?}
+\beginmenu
+\item Read
+\menuwindowlink{Foundation Library Chapter s Manual Page}{manpageXXs}
+\item or
+\menulispwindowlink{Browse}{(|kSearch| "NagSpecialFunctionsPackage")}\tab{10} through this chapter
+\item or use the routines:
+\menulispdownlink{S01EAF}{(|s01eaf|)}\space{}
+\tab{10}  Complex exponential {\em exp(z)}
+\menulispdownlink{S13AAF}{(|s13aaf|)}\space{}
+\tab{10}  Exponential integral \htbitmap{s13aaf2}
+\menulispdownlink{S13ACF}{(|s13acf|)}\space{}
+\tab{10}  Cosine integral {\em Ci(x)}
+\menulispdownlink{S13ADF}{(|s13adf|)}\space{}
+\tab{10}  Sine integral {\em Si(x)}
+\menulispdownlink{S14AAF}{(|s14aaf|)}\space{}
+\tab{10}  Gamma function \Gamma
+\menulispdownlink{S14ABF}{(|s14abf|)}\space{}
+\tab{10}  Log Gamma function {\em ln \Gamma}
+\menulispdownlink{S14BAF}{(|s14baf|)}\space{}
+\tab{10}  Incomplete gamma functions P(a,x) and Q(a,x)
+\menulispdownlink{S15ADF}{(|s15adf|)}\space{}
+\tab{10}  Complement of error function {\em erfc x }
+\menulispdownlink{S15AEF}{(|s15aef|)}\space{}
+\tab{10}  Error function {\em erf x}
+\menulispdownlink{S17ACF}{(|s17acf|)}\space{}
+\tab{10}  Bessel function \space{1} \htbitmap{s17acf} 
+\menulispdownlink{S17ADF}{(|s17adf|)}\space{}
+\tab{10}  Bessel function \space{1} \htbitmap{s17adf} 
+\menulispdownlink{S17AEF}{(|s17aef|)}\space{}
+\tab{10}  Bessel function \space{1} \htbitmap{s17aef1} 
+\menulispdownlink{S17AFF}{(|s17aff|)}\space{}
+\tab{10}  Bessel function \space{1} \htbitmap{s17aff1} 
+\menulispdownlink{S17AGF}{(|s17agf|)}
+\tab{10}  Airy function {\em Ai(x)}
+\menulispdownlink{S17AHF}{(|s17ahf|)}
+\tab{10}  Airy function {\em Bi(x)}
+\menulispdownlink{S17AJF}{(|s17ajf|)}
+\tab{10}  Airy function {\em Ai'(x)}
+\menulispdownlink{S17AKF}{(|s17akf|)}
+\tab{10}  Airy function {\em Bi'(x)}
+\menulispdownlink{S17DCF}{(|s17dcf|)}
+\tab{10} Bessel function \htbitmap{s17dcf}, real a \space{1}
+\htbitmap{great=} 0, complex z, v = 0,1,2,...
+\menulispdownlink{S17DEF}{(|s17def|)}
+\tab{10} Bessel function \htbitmap{s17def}, real a \space{1}
+\htbitmap{great=} 0, complex z, v = 0,1,2,...
+\menulispdownlink{S17DGF}{(|s17dgf|)}
+\tab{10} Airy function {\em Ai(z)} and {\em Ai'(z)}, complex z
+\menulispdownlink{S17DHF}{(|s17dhf|)}
+\tab{10} Airy function {\em Bi(z)} and {\em Bi'(z)}, complex z
+\menulispdownlink{S17DLF}{(|s17dlf|)}
+\tab{10} Hankel function \vspace{-32} \htbitmap{s17dlf}
+\vspace{-37}, j = 1,2, real a \space{1} \htbitmap{great=} 0, 
+complex z, v = 0,1,2,... \newline
+\menulispdownlink{S18ACF}{(|s18acf|)}
+\tab{10} Modified Bessel function \space{1} \htbitmap{s18acf1} 
+\menulispdownlink{S18ADF}{(|s18adf|)}
+\tab{10} Modified Bessel function \space{1} \htbitmap{s18adf1}
+\menulispdownlink{S18AEF}{(|s18aef|)}
+\tab{10} Modified Bessel function \space{1} \htbitmap{s18aef1} 
+\menulispdownlink{S18AFF}{(|s18aff|)}
+\tab{10} Modified Bessel function \space{1} \htbitmap{s18aff1} 
+\menulispdownlink{S18DCF}{(|s18dcf|)}
+\tab{10} Modified bessel function \htbitmap{s18dcf}, real a \space{1}
+\htbitmap{great=} 0, complex z, v = 0,1,2,...
+\menulispdownlink{S18DEF}{(|s18def|)}
+\tab{10} Modified bessel function \htbitmap{s18def}, real a \space{1}
+\htbitmap{great=} 0, complex z, v = 0,1,2,...
+\menulispdownlink{S19AAF}{(|s19aaf|)}
+\tab{10} Kelvin function {\em ber x}
+\menulispdownlink{S19ABF}{(|s19abf|)}
+\tab{10} Kelvin function {\em bei x}
+\menulispdownlink{S19ACF}{(|s19acf|)}
+\tab{10} Kelvin function {\em ker x}
+\menulispdownlink{S19ADF}{(|s19adf|)}
+\tab{10} Kelvin function {\em kei x}
+\menulispdownlink{S20ACF}{(|s20acf|)}
+\tab{10} Fresnel integral {\em S(x)}
+\menulispdownlink{S20ADF}{(|s20adf|)}
+\tab{10} Fresnel integral {\em C(x)}
+\menulispdownlink{S21BAF}{(|s21baf|)}
+\tab{10} Degenerate symmetrised elliptic integral of 1st kind 
+\space{1} \htbitmap{s21baf1} 
+\menulispdownlink{S21BBF}{(|s21bbf|)}
+\tab{10} Symmetrised elliptic integral of 1st kind \space{1} 
+\vspace{-28} \htbitmap{s21bbf1} \vspace{-40} 
+\menulispdownlink{S21BCF}{(|s21bcf|)}
+\tab{10} Symmetrised elliptic integral of 2nd kind \space{1} 
+\vspace{-28} \htbitmap{s21bcf1} \vspace{-40} 
+\menulispdownlink{S21BDF}{(|s21bdf|)}
+\tab{10} Symmetrised elliptic integral of 3rd kind \space{1} 
+\vspace{-26} \htbitmap{s21bdf1} \vspace{-40} 
+\endmenu
+\endscroll
+\autobuttons 
+\end{page}
+
+@
+\section{list.ht}
+<<list.ht>>=
+\newcommand{\ListXmpTitle}{List}
+\newcommand{\ListXmpNumber}{9.47}
+
+@
+\subsection{List}
+\label{ListXmpPage}
+\begin{itemize}
+\item ugxListCreatePage \ref{ugxListCreatePage} on
+page~pageref{ugxListCreatePage}
+\item ugxListAccessPage \ref{ugxListAccessPage} on
+page~pageref{ugxListAccessPage}
+\item ugxListChangePage \ref{ugxListChangePage} on
+page~pageref{ugxListChangePage}
+\item ugxListOtherPage \ref{ugxListOtherPage} on
+page~pageref{ugxListOtherPage}
+\item ugxListDotPage \ref{ugxListDotPage} on
+page~pageref{ugxListDotPage}
+\end{itemize}
+\index{pages!ListXmpPage!list.ht}
+\index{list.ht!pages!ListXmpPage}
+\index{ListXmpPage!list.ht!pages}
+<<list.ht>>=
+\begin{page}{ListXmpPage}{List}
+\beginscroll
+A \spadgloss{list} is a finite collection of elements in a specified
+order that can contain duplicates.
+A list is a convenient structure to work with because it is easy
+to add or remove elements and the length need not be constant.
+There are many different kinds of lists in Axiom, but the
+default types (and those used most often) are created by the
+\spadtype{List} constructor.
+For example, there are objects of type \spadtype{List Integer},
+\spadtype{List Float} and \spadtype{List Polynomial Fraction Integer}.
+Indeed, you can even have \spadtype{List List List Boolean}
+(that is, lists of lists of lists of Boolean values).
+You can have lists of any type of Axiom object.
+
+\beginmenu
+    \menudownlink{{9.47.1. Creating Lists}}{ugxListCreatePage}
+    \menudownlink{{9.47.2. Accessing List Elements}}{ugxListAccessPage}
+    \menudownlink{{9.47.3. Changing List Elements}}{ugxListChangePage}
+    \menudownlink{{9.47.4. Other Functions}}{ugxListOtherPage}
+    \menudownlink{{9.47.5. Dot, Dot}}{ugxListDotPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<list.ht>>=
+\newcommand{\ugxListCreateTitle}{Creating Lists}
+\newcommand{\ugxListCreateNumber}{9.47.1.}
+
+@
+\subsection{Creating Lists}
+\label{ugxListCreatePage}
+\index{pages!ugxListCreatePage!list.ht}
+\index{list.ht!pages!ugxListCreatePage}
+\index{ugxListCreatePage!list.ht!pages}
+<<list.ht>>=
+\begin{page}{ugxListCreatePage}{Creating Lists}
+\beginscroll
+
+The easiest way to create a list with, for example, the elements
+\spad{2, 4, 5, 6} is to enclose the elements with square
+brackets and separate the elements with commas.
+\xtc{
+The spaces after the commas are optional, but they do improve the
+readability.
+}{
+\spadpaste{[2, 4, 5, 6]}
+}
+\xtc{
+To create a list with the single element \spad{1}, you can use
+either \spad{[1]} or the operation \spadfunFrom{list}{List}.
+}{
+\spadpaste{[1]}
+}
+\xtc{
+}{
+\spadpaste{list(1)}
+}
+\xtc{
+Once created, two lists \spad{k} and \spad{m} can be
+concatenated by issuing \spad{append(k,m)}.
+\spadfunFrom{append}{List} does {\it not} physically join the lists,
+but rather produces a new list with the elements coming from the two
+arguments.
+}{
+\spadpaste{append([1,2,3],[5,6,7])}
+}
+\xtc{
+Use \spadfunFrom{cons}{List} to append an element onto the front of a
+list.
+}{
+\spadpaste{cons(10,[9,8,7])}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<list.ht>>=
+\newcommand{\ugxListAccessTitle}{Accessing List Elements}
+\newcommand{\ugxListAccessNumber}{9.47.2.}
+
+@
+\subsection{Accessing List Elements}
+\label{ugxListAccessPage}
+\index{pages!ugxListAccessPage!list.ht}
+\index{list.ht!pages!ugxListAccessPage}
+\index{ugxListAccessPage!list.ht!pages}
+<<list.ht>>=
+\begin{page}{ugxListAccessPage}{Accessing List Elements}
+\beginscroll
+
+\labelSpace{4pc}
+\xtc{
+To determine whether a list has any elements, use the operation
+\spadfunFrom{empty?}{List}.
+}{
+\spadpaste{empty? [x+1]}
+}
+\xtc{
+Alternatively, equality with the list constant \spadfunFrom{nil}{List} can
+be tested.
+}{
+\spadpaste{([] = nil)@Boolean}
+}
+
+\xtc{
+We'll use this in some of the following examples.
+}{
+\spadpaste{k := [4,3,7,3,8,5,9,2] \bound{k}}
+}
+\xtc{
+Each of the next four expressions extracts the \spadfunFrom{first}{List}
+element of \spad{k}.
+}{
+\spadpaste{first k \free{k}}
+}
+\xtc{
+}{
+\spadpaste{k.first \free{k}}
+}
+\xtc{
+}{
+\spadpaste{k.1 \free{k}}
+}
+\xtc{
+}{
+\spadpaste{k(1) \free{k}}
+}
+The last two forms generalize to \spad{k.i} and \spad{k(i)},
+respectively, where
+\texht{$ 1 \leq i \leq n$}{\spad{1 <= i <= n}}
+and
+\spad{n} equals the length of \spad{k}.
+\xtc{
+This length is calculated by \spadopFrom{\#}{List}.
+}{
+\spadpaste{n := \#k \free{k}}
+}
+Performing an operation such as \spad{k.i} is sometimes
+referred to as {\it indexing into k} or
+{\it elting into k}.
+The latter phrase comes about because the name of the operation
+that extracts elements is called \spadfunFrom{elt}{List}.
+That is, \spad{k.3} is just alternative syntax for \spad{elt(k,3)}.
+It is important to remember that list indices
+begin with 1.
+If we issue \spad{k := [1,3,2,9,5]} then \spad{k.4}
+returns \spad{9}.
+It is an error to use an index that is not in the range from
+\spad{1} to the length of the list.
+
+\xtc{
+The last element of a list is extracted by any of the
+following three expressions.
+}{
+\spadpaste{last k \free{k}}
+}
+\xtc{
+}{
+\spadpaste{k.last \free{k}}
+}
+\xtc{
+This form computes the index of the last element and then
+extracts the element from the list.
+}{
+\spadpaste{k.(\#k) \free{k}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<list.ht>>=
+\newcommand{\ugxListChangeTitle}{Changing List Elements}
+\newcommand{\ugxListChangeNumber}{9.47.3.}
+
+@
+\subsection{Changing List Elements}
+\label{ugxListChangePage}
+\index{pages!ugxListChangePage!list.ht}
+\index{list.ht!pages!ugxListChangePage}
+\index{ugxListChangePage!list.ht!pages}
+<<list.ht>>=
+\begin{page}{ugxListChangePage}{Changing List Elements}
+\beginscroll
+
+\labelSpace{4pc}
+\xtc{
+We'll use this in some of the following examples.
+}{
+\spadpaste{k := [4,3,7,3,8,5,9,2] \bound{k}}
+}
+\xtc{
+List elements are reset by using the \spad{k.i} form on
+the left-hand side of an assignment.
+This expression resets the first element of \spad{k} to \spad{999}.
+}{
+\spadpaste{k.1 := 999 \free{k}\bound{k1}}
+}
+\xtc{
+As with indexing into a list, it is an error to use an index
+that is not within the proper bounds.
+Here you see that \spad{k} was modified.
+}{
+\spadpaste{k \free{k1}}
+}
+
+The operation that performs the assignment of an element to a particular
+position in a list is called \spadfunFrom{setelt}{List}.
+This operation is {\it destructive} in that it changes the list.
+In the above example, the assignment returned the value \spad{999} and
+\spad{k} was modified.
+For this reason, lists are called \spadglos{mutable} objects: it is
+possible to change part of a list (mutate it) rather than always returning
+a new list reflecting the intended modifications.
+\xtc{
+Moreover, since lists can share structure, changes to one list can
+sometimes affect others.
+}{
+\spadpaste{k := [1,2] \bound{k2}}
+}
+\xtc{
+}{
+\spadpaste{m := cons(0,k) \free{k2}\bound{m}}
+}
+\xtc{
+Change the second element of \spad{m}.
+}{
+\spadpaste{m.2 := 99 \free{m}\bound{m2}}
+}
+\xtc{
+See, \spad{m} was altered.
+}{
+\spadpaste{m \free{m2}}
+}
+\xtc{
+But what about \spad{k}?
+It changed too!
+}{
+\spadpaste{k  \free{m2 k2}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<list.ht>>=
+\newcommand{\ugxListOtherTitle}{Other Functions}
+\newcommand{\ugxListOtherNumber}{9.47.4.}
+
+@
+\subsection{Other Functions}
+\label{ugxListOtherPage}
+\index{pages!ugxListOtherPage!list.ht}
+\index{list.ht!pages!ugxListOtherPage}
+\index{ugxListOtherPage!list.ht!pages}
+<<list.ht>>=
+\begin{page}{ugxListOtherPage}{Other Functions}
+\beginscroll
+
+\labelSpace{3pc}
+\xtc{
+An operation that is used frequently in list processing is that
+which returns all elements in a list after the first element.
+}{
+\spadpaste{k := [1,2,3] \bound{k}}
+}
+\xtc{
+Use the \spadfunFrom{rest}{List} operation to do this.
+}{
+\spadpaste{rest k \free{k}}
+}
+
+\xtc{
+To remove duplicate elements in a list \spad{k}, use
+\spadfunFrom{removeDuplicates}{List}.
+}{
+\spadpaste{removeDuplicates [4,3,4,3,5,3,4]}
+}
+\xtc{
+To get a list with elements in the order opposite to those in
+a list \spad{k}, use \spadfunFrom{reverse}{List}.
+}{
+\spadpaste{reverse [1,2,3,4,5,6]}
+}
+\xtc{
+To test whether an element is in a list, use \spadfunFrom{member?}{List}:
+\spad{member?(a,k)} returns \spad{true} or \spad{false}
+depending on whether \spad{a} is in \spad{k} or not.
+}{
+\spadpaste{member?(1/2,[3/4,5/6,1/2])}
+}
+\xtc{
+}{
+\spadpaste{member?(1/12,[3/4,5/6,1/2])}
+}
+
+As an exercise, the reader should determine how to get a
+list containing all but the last of the elements in a given non-empty
+list \spad{k}.\footnote{\spad{reverse(rest(reverse(k)))} works.}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<list.ht>>=
+\newcommand{\ugxListDotTitle}{Dot, Dot}
+\newcommand{\ugxListDotNumber}{9.47.5.}
+
+@
+\subsection{Dot, Dot}
+\label{ugxListDotPage}
+\index{pages!ugxListDotPage!list.ht}
+\index{list.ht!pages!ugxListDotPage}
+\index{ugxListDotPage!list.ht!pages}
+<<list.ht>>=
+\begin{page}{ugxListDotPage}{Dot, Dot}
+\beginscroll
+
+Certain lists are used so often that Axiom provides an easy way
+of constructing them.
+If \spad{n} and \spad{m} are integers, then \spad{expand [n..m]}
+creates a list containing \spad{n, n+1, ... m}.
+If \spad{n > m} then the list is empty.
+It is actually permissible to leave off the \spad{m} in the
+dot-dot construction (see below).
+
+\xtc{
+The dot-dot notation can be used more than once in a list
+construction and with specific elements being given.
+Items separated by dots are called {\it segments.}
+}{
+\spadpaste{[1..3,10,20..23]}
+}
+\xtc{
+Segments can be expanded into the range of items between the
+endpoints by using \spadfunFrom{expand}{Segment}.
+}{
+\spadpaste{expand [1..3,10,20..23]}
+}
+\xtc{
+What happens if we leave off a number on the right-hand side of
+\spadopFrom{..}{UniversalSegment}?
+}{
+\spadpaste{expand [1..]}
+}
+What is created in this case is a \spadtype{Stream} which is a
+generalization of a list.
+See \downlink{`Stream'}{StreamXmpPage}\ignore{Stream} for more information.
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{lodo.ht}
+<<lodo.ht>>=
+\newcommand{\LinearOrdinaryDifferentialOperatorXmpTitle}{LinearOrdinaryDifferentialOperator}
+\newcommand{\LinearOrdinaryDifferentialOperatorXmpNumber}{9.44}
+
+@
+\subsection{LinearOrdinaryDifferentialOperator}
+\label{LinearOrdinaryDifferentialOperatorXmpPage}
+See ugxLinearOrdinaryDifferentialOperatorSeriesPage
+\ref{ugxLinearOrdinaryDifferentialOperatorSeriesPage} on
+page~\pageref{ugxLinearOrdinaryDifferentialOperatorSeriesPage}
+\index{pages!LinearOrdinaryDifferentialOperatorXmpPage!lodo.ht}
+\index{lodo.ht!pages!LinearOrdinaryDifferentialOperatorXmpPage}
+\index{LinearOrdinaryDifferentialOperatorXmpPage!lodo.ht!pages}
+<<lodo.ht>>=
+\begin{page}{LinearOrdinaryDifferentialOperatorXmpPage}
+{LinearOrdinaryDifferentialOperator}
+\beginscroll
+
+\spadtype{LinearOrdinaryDifferentialOperator(A, diff)} is the domain of linear
+ordinary differential operators with coefficients in a ring
+\spad{A} with a given derivation.
+%This includes the cases of operators which are polynomials in \spad{D}
+%acting upon scalar or vector expressions of a single variable.
+%The coefficients of the operator polynomials can be integers, rational
+%functions, matrices or elements of other domains.
+\showBlurb{LinearOrdinaryDifferentialOperator}
+
+\beginmenu
+    \menudownlink{{9.44.1. Differential Operators with Series Coefficients}}
+{ugxLinearOrdinaryDifferentialOperatorSeriesPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<lodo.ht>>=
+\newcommand{\ugxLinearOrdinaryDifferentialOperatorSeriesTitle}{Differential Operators with Series Coefficients}
+\newcommand{\ugxLinearOrdinaryDifferentialOperatorSeriesNumber}{9.44.1.}
+
+@
+\subsection{Differential Operators with Series Coefficients}
+\label{ugxLinearOrdinaryDifferentialOperatorSeriesPage}
+\index{pages!ugxLinearOrdinaryDifferentialOperatorSeriesPage!lodo.ht}
+\index{lodo.ht!pages!ugxLinearOrdinaryDifferentialOperatorSeriesPage}
+\index{ugxLinearOrdinaryDifferentialOperatorSeriesPage!lodo.ht!pages}
+<<lodo.ht>>=
+\begin{page}{ugxLinearOrdinaryDifferentialOperatorSeriesPage}
+{Differential Operators with Series Coefficients}
+\beginscroll
+
+\noindent
+{\bf Problem:}
+Find the first few coefficients of \spad{exp(x)/x**i} of \spad{Dop phi} where
+\begin{verbatim}
+Dop := D**3 + G/x**2 * D + H/x**3 - 1
+phi := sum(s[i]*exp(x)/x**i, i = 0..)
+\end{verbatim}
+
+\noindent
+{\bf Solution:}
+\xtc{
+Define the differential.
+}{
+\spadpaste{Dx: LODO(EXPR INT, f +-> D(f, x)) \bound{Dxd}}
+}
+\xtc{
+}{
+\spadpaste{Dx := D() \free{Dxd}\bound{Dx}}
+}
+\xtc{
+Now define the differential operator \spad{Dop}.
+}{
+\spadpaste{Dop:= Dx**3 + G/x**2*Dx + H/x**3 - 1 \free{Dx}\bound{Dop}}
+}
+\xtc{
+}{
+\spadpaste{n == 3 \bound{n3}}
+}
+\xtc{
+}{
+\spadpaste{phi == reduce(+,[subscript(s,[i])*exp(x)/x**i for i in 0..n]) \bound{phi}}
+}
+\xtc{
+}{
+\spadpaste{phi1 ==  Dop(phi) / exp x \bound{phi1}\free{Dop phi}}
+}
+\xtc{
+}{
+\spadpaste{phi2 == phi1 *x**(n+3) \bound{phi2}\free{phi1}}
+}
+\xtc{
+}{
+\spadpaste{phi3 == retract(phi2)@(POLY INT) \bound{phi3}\free{phi2}}
+}
+\xtc{
+}{
+\spadpaste{pans == phi3 ::UP(x,POLY INT) \free{phi3}\bound{pans}}
+}
+\xtc{
+}{
+\spadpaste{pans1 == [coefficient(pans, (n+3-i) :: NNI) for i in 2..n+1] \bound{pans1}\free{pans}}
+}
+\xtc{
+}{
+\spadpaste{leq == solve(pans1,[subscript(s,[i]) for i in 1..n]) \bound{leq}\free{pans1}}
+}
+\xtc{
+Evaluate this for several values of \spad{n}.
+}{
+\spadpaste{leq \free{n3 leq}}
+}
+\xtc{
+}{
+\spadpaste{n==4 \bound{n4}}
+}
+\xtc{
+}{
+\spadpaste{leq \free{n4 leq}}
+}
+\xtc{
+}{
+\spadpaste{n==7 \bound{n7}}
+}
+\xtc{
+}{
+\spadpaste{leq \free{n7 leq}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{lodo1.ht}
+<<lodo1.ht>>=
+\newcommand{\LinearOrdinaryDifferentialOperatorOneXmpTitle}{LinearOrdinaryDifferentialOperator1}
+\newcommand{\LinearOrdinaryDifferentialOperatorOneXmpNumber}{9.45}
+
+@
+\subsection{LinearOrdinaryDifferentialOperator1}
+\label{LinearOrdinaryDifferentialOperatorOneXmpPage}
+See ugxLinearOrdinaryDifferentialOperatorOneRatPage
+\ref{ugxLinearOrdinaryDifferentialOperatorOneRatPage} on
+page~\pageref{ugxLinearOrdinaryDifferentialOperatorOneRatPage}
+\index{pages!LinearOrdinaryDifferentialOperatorOneXmpPage!lodo1.ht}
+\index{lodo1.ht!pages!LinearOrdinaryDifferentialOperatorOneXmpPage}
+\index{LinearOrdinaryDifferentialOperatorOneXmpPage!lodo1.ht!pages}
+<<lodo1.ht>>=
+\begin{page}{LinearOrdinaryDifferentialOperatorOneXmpPage}
+{LinearOrdinaryDifferentialOperator1}
+\beginscroll
+
+\spadtype{LinearOrdinaryDifferentialOperator1(A)} is the domain of linear
+ordinary differential operators with coefficients in the differential ring
+\spad{A}.
+%This includes the cases of operators which are polynomials in \spad{D}
+%acting upon scalar or vector expressions of a single variable.
+%The coefficients of the operator polynomials can be integers, rational
+%functions, matrices or elements of other domains.
+\showBlurb{LinearOrdinaryDifferentialOperator1}
+
+\beginmenu
+    \menudownlink{
+{9.45.1. Differential Operators with Rational Function Coefficients}}
+{ugxLinearOrdinaryDifferentialOperatorOneRatPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+<<lodo1.ht>>=
+\newcommand{\ugxLinearOrdinaryDifferentialOperatorOneRatTitle}{Differential Operators with Rational Function Coefficients}
+\newcommand{\ugxLinearOrdinaryDifferentialOperatorOneRatNumber}{9.45.1.}
+
+@
+\subsection{Differential Operators with Rational Function Coefficients}
+\label{ugxLinearOrdinaryDifferentialOperatorOneRatPage}
+\index{pages!ugxLinearOrdinaryDifferentialOperatorOneRatPage!lodo1.ht}
+\index{lodo1.ht!pages!ugxLinearOrdinaryDifferentialOperatorOneRatPage}
+\index{ugxLinearOrdinaryDifferentialOperatorOneRatPage!lodo1.ht!pages}
+<<lodo1.ht>>=
+\begin{page}{ugxLinearOrdinaryDifferentialOperatorOneRatPage}
+{Differential Operators with Rational Function Coefficients}
+\beginscroll
+
+This example shows differential operators with rational function
+coefficients.  In this case operator multiplication is non-commutative and,
+since the coefficients form a field, an operator division algorithm exists.
+
+\labelSpace{2pc}
+\xtc{
+We begin by defining \spad{RFZ} to be the rational functions in
+\spad{x} with integer coefficients and \spad{Dx} to be the differential
+operator for \spad{d/dx}.
+}{
+\spadpaste{RFZ := Fraction UnivariatePolynomial('x, Integer) \bound{RFZ0}}
+}
+\xtc{
+}{
+\spadpaste{x : RFZ := 'x \free{RFZ0}\bound{RFZ}}
+}
+\xtc{
+}{
+\spadpaste{Dx : LODO1 RFZ := D()\bound{Dx}\free{RFZ}}
+}
+\xtc{
+Operators are created using the usual arithmetic operations.
+}{
+\spadpaste{b : LODO1 RFZ := 3*x**2*Dx**2 + 2*Dx + 1/x  \free{Dx}\bound{b}}
+}
+\xtc{
+}{
+\spadpaste{a : LODO1 RFZ := b*(5*x*Dx + 7)             \free{b Dx}\bound{a}}
+}
+\xtc{
+Operator multiplication corresponds to functional composition.
+}{
+\spadpaste{p := x**2 + 1/x**2 \bound{p}\free{RFZ}}
+}
+\xtc{
+Since operator coefficients depend on \spad{x}, the multiplication is
+not commutative.
+}{
+\spadpaste{(a*b - b*a) p \free{a b p}}
+}
+
+When the coefficients of operator polynomials come from a field, as in this
+case, it is possible to define operator division.
+Division on the left and division on the right yield different results when
+the multiplication is non-commutative.
+
+The results of 
+\spadfunFrom{leftDivide}{LinearOrdinaryDifferentialOperator1} and
+\spadfunFrom{rightDivide}{LinearOrdinaryDifferentialOperator1} are
+quotient-remainder pairs satisfying: \newline
+%
+\spad{leftDivide(a,b) = [q, r]} such that  \spad{a = b*q + r} \newline
+\spad{rightDivide(a,b) = [q, r]} such that  \spad{a = q*b + r} \newline
+%
+\xtc{
+In both cases, the \spadfunFrom{degree}{LinearOrdinaryDifferentialOperator1}
+of the remainder, \spad{r}, is less than
+the degree of \spad{b}.
+}{
+\spadpaste{ld := leftDivide(a,b) \bound{ld}\free{a b}}
+}
+\xtc{
+}{
+\spadpaste{a = b * ld.quotient + ld.remainder \free{a b ld}}
+}
+\xtc{
+The operations of left and right division
+are so-called because the quotient is obtained by dividing
+\spad{a} on that side by \spad{b}.
+}{
+\spadpaste{rd := rightDivide(a,b) \bound{rd}\free{a b}}
+}
+\xtc{
+}{
+\spadpaste{a = rd.quotient * b + rd.remainder \free{a b rd}}
+}
+
+\xtc{
+Operations \spadfunFrom{rightQuotient}{LinearOrdinaryDifferentialOperator1}
+and \spadfunFrom{rightRemainder}{LinearOrdinaryDifferentialOperator1}
+are available if only one of the quotient or remainder are of
+interest to you.
+This is the quotient from right division.
+}{
+\spadpaste{rightQuotient(a,b) \free{a b}}
+}
+\xtc{
+This is the remainder from right division.
+The corresponding ``left'' functions
+\spadfunFrom{leftQuotient}{LinearOrdinaryDifferentialOperator1} and
+\spadfunFrom{leftRemainder}{LinearOrdinaryDifferentialOperator1}
+are also available.
+}{
+\spadpaste{rightRemainder(a,b) \free{a b}}
+}
+
+\xtc{
+For exact division, the operations
+\spadfunFrom{leftExactQuotient}{LinearOrdinaryDifferentialOperator1} and
+\spadfunFrom{rightExactQuotient}{LinearOrdinaryDifferentialOperator1} are supplied.
+These return the quotient but only if the remainder is zero.
+The call \spad{rightExactQuotient(a,b)} would yield an error.
+}{
+\spadpaste{leftExactQuotient(a,b) \free{a b}}
+}
+
+\xtc{
+The division operations allow the computation of left and right greatest
+common divisors (\spadfunFrom{leftGcd}{LinearOrdinaryDifferentialOperator1} and
+\spadfunFrom{rightGcd}{LinearOrdinaryDifferentialOperator1}) via remainder
+sequences, and consequently the computation of left and right least common
+multiples (\spadfunFrom{rightLcm}{LinearOrdinaryDifferentialOperator1} and
+\spadfunFrom{leftLcm}{LinearOrdinaryDifferentialOperator1}).
+}{
+\spadpaste{e := leftGcd(a,b) \bound{e}\free{a b}}
+}
+\xtc{
+Note that a greatest common divisor doesn't necessarily divide \spad{a} and
+{9.45.1.}{Differential Operators with Rational Function Coefficients}
+\spad{b} on both sides.
+Here the left greatest common divisor does not divide \spad{a} on the right.
+}{
+\spadpaste{leftRemainder(a, e) \free{a e}}
+}
+\xtc{
+}{
+\spadpaste{rightRemainder(a, e) \free{a e}}
+}
+
+\xtc{
+Similarly, a least common multiple
+is not necessarily divisible from both sides.
+}{
+\spadpaste{f := rightLcm(a,b) \bound{f}\free{a b}}
+}
+\xtc{
+}{
+\spadpaste{rightRemainder(f, b) \free{f b}}
+}
+\xtc{
+}{
+\spadpaste{leftRemainder(f, b) \free{f b}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{lodo2.ht}
+<<lodo2.ht>>=
+\newcommand{\LinearOrdinaryDifferentialOperatorTwoXmpTitle}{LinearOrdinaryDifferentialOperator2}
+\newcommand{\LinearOrdinaryDifferentialOperatorTwoXmpNumber}{9.46}
+
+@
+\subsection{LinearOrdinaryDifferentialOperator2}
+\label{LinearOrdinaryDifferentialOperatorTwoXmpPage}
+\begin{itemize}
+\item ugxLinearOrdinaryDifferentialOperatorTwoConstPage 
+\ref{ugxLinearOrdinaryDifferentialOperatorTwoConstPage} on
+page~pageref{ugxLinearOrdinaryDifferentialOperatorTwoConstPage}
+\item ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage 
+\ref{ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage} on
+page~pageref{ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage}
+\end{itemize}
+\index{pages!LinearOrdinaryDifferentialOperatorTwoXmpPage!lodo2.ht}
+\index{lodo2.ht!pages!LinearOrdinaryDifferentialOperatorTwoXmpPage}
+\index{LinearOrdinaryDifferentialOperatorTwoXmpPage!lodo2.ht!pages}
+<<lodo2.ht>>=
+\begin{page}{LinearOrdinaryDifferentialOperatorTwoXmpPage}
+{LinearOrdinaryDifferentialOperator2}
+\beginscroll
+
+\spadtype{LinearOrdinaryDifferentialOperator2(A, M)} is the domain of linear
+ordinary differential operators with coefficients in the differential ring
+\spad{A} and operating on \spad{M}, an \spad{A}-module.
+This includes the cases of operators which are polynomials in \spad{D}
+acting upon scalar or vector expressions of a single variable.
+The coefficients of the operator polynomials can be integers, rational
+functions, matrices or elements of other domains.
+\showBlurb{LinearOrdinaryDifferentialOperator2}
+
+\beginmenu
+    \menudownlink{
+{9.46.1. Differential Operators with Constant Coefficients}}
+{ugxLinearOrdinaryDifferentialOperatorTwoConstPage}
+    \menudownlink{
+{9.46.2. Differential Operators with Matrix Coefficients Operating on Vectors}}
+{ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<lodo2.ht>>=
+\newcommand{\ugxLinearOrdinaryDifferentialOperatorTwoConstTitle}{Differential Operators with Constant Coefficients}
+\newcommand{\ugxLinearOrdinaryDifferentialOperatorTwoConstNumber}{9.46.1.}
+
+@
+\subsection{Differential Operators with Constant Coefficients}
+\label{ugxLinearOrdinaryDifferentialOperatorTwoConstPage}
+\index{pages!ugxLinearOrdinaryDifferentialOperatorTwoConstPage!lodo2.ht}
+\index{lodo2.ht!pages!ugxLinearOrdinaryDifferentialOperatorTwoConstPage}
+\index{ugxLinearOrdinaryDifferentialOperatorTwoConstPage!lodo2.ht!pages}
+<<lodo2.ht>>=
+\begin{page}{ugxLinearOrdinaryDifferentialOperatorTwoConstPage}
+{Differential Operators with Constant Coefficients}
+\beginscroll
+
+This example shows differential operators with rational
+number coefficients operating on univariate polynomials.
+
+\labelSpace{3pc}
+\xtc{
+We begin by making type assignments so we can conveniently refer
+to univariate polynomials in \spad{x} over the rationals.
+}{
+\spadpaste{Q  := Fraction Integer \bound{Q}}
+}
+\xtc{
+}{
+\spadpaste{PQ := UnivariatePolynomial('x, Q) \free{Q}\bound{PQ0}}
+}
+\xtc{
+}{
+\spadpaste{x: PQ := 'x \free{PQ0}\bound{x}}
+}
+\xtc{
+Now we assign \spad{Dx} to be the differential operator
+\spadfunFrom{D}{LinearOrdinaryDifferentialOperator2}
+corresponding to \spad{d/dx}.
+}{
+\spadpaste{Dx: LODO2(Q, PQ) := D() \free{Q PQ0}\bound{Dx}}
+}
+\xtc{
+New operators are created as polynomials in \spad{D()}.
+}{
+\spadpaste{a := Dx  + 1 \bound{a}\free{Dx}}
+}
+\xtc{
+}{
+\spadpaste{b := a + 1/2*Dx**2 - 1/2 \bound{b}\free{Dx}}
+}
+\xtc{
+To apply the operator \spad{a} to the value \spad{p} the usual function
+call syntax is used.
+}{
+\spadpaste{p := 4*x**2 + 2/3 \free{x}\bound{p}}
+}
+\xtc{
+}{
+\spadpaste{a p \free{a p}}
+}
+\xtc{
+Operator multiplication is defined by the identity \spad{(a*b) p = a(b(p))}
+}{
+\spadpaste{(a * b) p = a b p \free{a b p}}
+}
+\xtc{
+Exponentiation follows from multiplication.
+}{
+\spadpaste{c := (1/9)*b*(a + b)**2 \free{a b}\bound{c}}
+}
+\xtc{
+Finally, note that operator expressions may be applied directly.
+}{
+\spadpaste{(a**2 - 3/4*b + c) (p + 1) \free{a b c p}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<lodo2.ht>>=
+\newcommand{\ugxLinearOrdinaryDifferentialOperatorTwoMatrixTitle}{Differential Operators with Matrix Coefficients Operating on Vectors}
+\newcommand{\ugxLinearOrdinaryDifferentialOperatorTwoMatrixNumber}{9.46.2.}
+
+@
+\subsection{Differential Operators with Matrix Coefficients Operating on Vectors}
+\label{ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage}
+\index{pages!ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage!lodo2.ht}
+\index{lodo2.ht!pages!ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage}
+\index{ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage!lodo2.ht!pages}
+<<lodo2.ht>>=
+\begin{page}{ugxLinearOrdinaryDifferentialOperatorTwoMatrixPage}
+{Differential Operators with Matrix Coefficients Operating on Vectors}
+\beginscroll
+
+This is another example of linear ordinary differential
+operators with non-commutative multiplication.
+Unlike the rational function case, the differential ring of
+square matrices (of a given dimension) with univariate
+polynomial entries does not form a field.
+Thus the number of operations available is more limited.
+
+\labelSpace{1pc}
+\xtc{
+In this section, the operators have three by three
+matrix coefficients with polynomial entries.
+}{
+\spadpaste{PZ   := UnivariatePolynomial(x,Integer)\bound{PZ0}}
+}
+\xtc{
+}{
+\spadpaste{x:PZ := 'x \free{PZ0}\bound{PZ}}
+}
+\xtc{
+}{
+\spadpaste{Mat  := SquareMatrix(3,PZ)\free{PZ}\bound{Mat}}
+}
+\xtc{
+The operators act on the vectors considered as a \spad{Mat}-module.
+}{
+\spadpaste{Vect := DPMM(3, PZ, Mat, PZ);\free{PZ,Mat}\bound{Vect}}
+}
+\xtc{
+}{
+\spadpaste{Modo := LODO2(Mat, Vect);\free{Mat Vect}\bound{Modo}}
+}
+\xtc{
+The matrix \spad{m} is used as a coefficient and the vectors \spad{p}
+and \spad{q} are operated upon.
+}{
+\spadpaste{m:Mat := matrix [[x**2,1,0],[1,x**4,0],[0,0,4*x**2]]\free{Mat}\bound{m}}
+}
+\xtc{
+}{
+\spadpaste{p:Vect := directProduct [3*x**2+1,2*x,7*x**3+2*x]\free{Vect}\bound{p}}
+}
+\xtc{
+}{
+\spadpaste{q: Vect := m * p\free{m p Vect}\bound{q}}
+}
+\xtc{
+Now form a few operators.
+}{
+\spadpaste{Dx : Modo := D()\bound{Dx}\free{Modo}}
+}
+\xtc{
+}{
+\spadpaste{a : Modo := Dx  + m\bound{a}\free{m Dx}}
+}
+\xtc{
+}{
+\spadpaste{b : Modo := m*Dx  + 1\bound{b}\free{m Dx}}
+}
+\xtc{
+}{
+\spadpaste{c := a*b \bound{c}\free{a b}}
+}
+\xtc{
+These operators can be applied to vector values.
+}{
+\spadpaste{a p \free{p a}}
+}
+\xtc{
+}{
+\spadpaste{b p \free{p b}}
+}
+\xtc{
+}{
+\spadpaste{(a + b + c) (p + q) \free{a b c p q}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{lpoly.ht}
+<<lpoly.ht>>=
+\newcommand{\LiePolynomialXmpTitle}{LiePolynomial}
+\newcommand{\LiePolynomialXmpNumber}{9.43}
+
+@
+\subsection{LiePolynomial}
+\label{LiePolynomialXmpPage}
+\index{pages!LiePolynomialXmpPage!lpoly.ht}
+\index{lpoly.ht!pages!LiePolynomialXmpPage}
+\index{LiePolynomialXmpPage!lpoly.ht!pages}
+<<lpoly.ht>>=
+\begin{page}{LiePolynomialXmpPage}{LiePolynomial}
+% =====================================================================
+\beginscroll
+Declaration of domains
+\xtc{
+}{
+\spadpaste{RN    := Fraction Integer \bound{RN}}
+}
+\xtc{
+}{
+\spadpaste{Lpoly := LiePolynomial(Symbol,RN) \bound{Lpoly} \free{RN}}
+}
+\xtc{
+}{
+\spadpaste{Dpoly := XDPOLY(Symbol,RN) \bound{Dpoly} \free{RN}}
+}
+\xtc{
+}{
+\spadpaste{Lword := LyndonWord Symbol \bound{Lword}}
+}
+
+Initialisation
+\xtc{
+}{
+\spadpaste{a:Symbol := 'a \bound{a}}
+}
+\xtc{
+}{
+\spadpaste{b:Symbol := 'b \bound{b}}
+}
+\xtc{
+}{
+\spadpaste{c:Symbol := 'c \bound{c}}
+}
+\xtc{
+}{
+\spadpaste{aa: Lpoly := a \bound{aa} \free{Lpoly} \free{a}}
+}
+\xtc{
+}{
+\spadpaste{bb: Lpoly := b \bound{bb} \free{Lpoly} \free{b}}
+}
+\xtc{
+}{
+\spadpaste{cc: Lpoly := c \bound{cc} \free{Lpoly} \free{c}}
+}
+\xtc{
+}{
+\spadpaste{p : Lpoly := [aa,bb] \bound{p} \free{aa} \free{bb} \free{Lpoly}}
+}
+\xtc{
+}{
+\spadpaste{q : Lpoly := [p,bb] \bound{q} \free{p} \free{bb} \free{Lpoly}}
+}
+\xtc{
+All the Lyndon words of order 4
+}{
+\spadpaste{liste : List Lword := LyndonWordsList([a,b], 4) \free{a} \free{b} \free{Lword} \bound{liste}}
+}
+\xtc{
+}{
+\spadpaste{r: Lpoly := p + q + 3*LiePoly(liste.4)$Lpoly \bound{r} \free{Lpoly} \free{p} \free{q} \free{liste}}
+}
+\xtc{
+}{
+\spadpaste{s:Lpoly := [p,r] \bound{s} \free{Lpoly} \free{p} \free{r}}
+}
+\xtc{
+}{
+\spadpaste{t:Lpoly  := s  + 2*LiePoly(liste.3) - 5*LiePoly(liste.5) \bound{t} \free{Lpoly} \free{s} \free{liste} }
+}
+\xtc{
+}{
+\spadpaste{degree t \free{t}}
+}
+\xtc{
+}{
+\spadpaste{mirror t \free{t}}
+}
+
+Jacobi Relation
+\xtc{
+}{
+\spadpaste{Jacobi(p: Lpoly, q: Lpoly, r: Lpoly): Lpoly == [[p,q]$Lpoly, r] + [[q,r]$Lpoly, p] + [[r,p]$Lpoly, q] \free{Lpoly} \bound{J}}
+}
+
+Tests
+\xtc{
+}{
+\spadpaste{test: Lpoly := Jacobi(a,b,b) \free{J Lpoly a b} \bound{test1}}
+}
+\xtc{
+}{
+\spadpaste{test: Lpoly := Jacobi(p,q,r) \free{J p q r Lpoly} \bound{test2}}
+}
+\xtc{
+}{
+\spadpaste{test: Lpoly := Jacobi(r,s,t) \free{J r s t Lpoly} \bound{test3}}
+}
+
+Evaluation
+\xtc{
+}{
+\spadpaste{eval(p, a, p)$Lpoly}
+}
+\xtc{
+}{
+\spadpaste{eval(p, [a,b], [2*bb, 3*aa])$Lpoly \free{p a b bb aa Lpoly}}
+}
+\xtc{
+}{
+\spadpaste{r: Lpoly := [p,c] \free{p c Lpoly} \bound{rr}}
+}
+\xtc{
+}{
+\spadpaste{r1: Lpoly := eval(r, [a,b,c], [bb, cc, aa])$Lpoly \free{rr a b c aa bb cc Lpoly} \bound{r1}}
+}
+\xtc{
+}{
+\spadpaste{r2: Lpoly := eval(r, [a,b,c], [cc, aa, bb])$Lpoly \free{rr a b c cc bb aa Lpoly} \bound{r2}}
+}
+\xtc{
+}{
+\spadpaste{r + r1 + r2 \free{rr r1 r2}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+%
+
+@
+\section{lword.ht}
+<<lword.ht>>=
+\newcommand{\LyndonWordXmpTitle}{LyndonWord}
+\newcommand{\LyndonWordXmpNumber}{9.48}
+
+@
+\subsection{LyndonWord}
+\label{LyndonWordXmpPage}
+\index{pages!LyndonWordXmpPage!lword.ht}
+\index{lword.ht!pages!LyndonWordXmpPage}
+\index{LyndonWordXmpPage!lword.ht!pages}
+<<lword.ht>>=
+\begin{page}{LyndonWordXmpPage}{LyndonWord}
+\beginscroll
+Initialisations
+\xtc{
+}{
+\spadpaste{a:Symbol :='a \bound{a}}
+}
+\xtc{
+}{
+\spadpaste{b:Symbol :='b \bound{b}}
+}
+\xtc{
+}{
+\spadpaste{c:Symbol :='c \bound{c}}
+}
+\xtc{
+}{
+\spadpaste{lword:= LyndonWord(Symbol) \bound{lword}}
+}
+\xtc{
+}{
+\spadpaste{magma := Magma(Symbol) \bound{magma}}
+}
+\xtc{
+}{
+\spadpaste{word   := OrderedFreeMonoid(Symbol) \bound{word}}
+}
+\xtc{
+All Lyndon words of with a, b, c to order 3
+}{
+\spadpaste{LyndonWordsList1([a,b,c],3)$lword \free{lword} \free{a} \free{b} \free{c} }
+}
+\xtc{
+All Lyndon words of with a, b, c to order 3 in flat list
+}{
+\spadpaste{LyndonWordsList([a,b,c],3)$lword \free{a} \free{b} \free{c} \free{lword}}
+}
+\xtc{
+All Lyndon words of with a, b to order 5
+}{
+\spadpaste{lw := LyndonWordsList([a,b],5)$lword \free{a} \free{b} \free{lword} \bound{lw}}
+}
+\xtc{
+}{
+\spadpaste{w1 : word := lw.4 :: word \free{word} \free{lw} \bound{w1}}
+}
+\xtc{
+}{
+\spadpaste{w2 : word := lw.5 :: word \free{word} \free{lw} \bound{w2}}
+}
+
+Let's try factoring
+\xtc{
+}{
+\spadpaste{factor(a::word)$lword \free{a word lword}}
+}
+\xtc{
+}{
+\spadpaste{factor(w1*w2)$lword \free{ w1 w2 lword}}
+}
+\xtc{
+}{
+\spadpaste{factor(w2*w2)$lword \free{w2 lword}}
+}
+\xtc{
+}{
+\spadpaste{factor(w2*w1)$lword \free{w1 w2 lword}}
+}
+
+Checks and coercions
+\xtc{
+}{
+\spadpaste{lyndon?(w1)$lword \free{w1 lword}}
+}
+\xtc{
+}{
+\spadpaste{lyndon?(w1*w2)$lword \free{w1 w2 lword}}
+}
+\xtc{
+}{
+\spadpaste{lyndon?(w2*w1)$lword \free{w1 w2 lword}}
+}
+\xtc{
+}{
+\spadpaste{lyndonIfCan(w1)$lword \free{w1 lword}}
+}
+\xtc{
+}{
+\spadpaste{lyndonIfCan(w2*w1)$lword \free{w1 w2 lword}}
+}
+\xtc{
+}{
+\spadpaste{lyndon(w1)$lword \free{w1 lword}}
+}
+\xtc{
+}{
+\spadpaste{lyndon(w1*w2)$lword \free{w1 w2 lword}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{magma.ht}
+<<magma.ht>>=
+\newcommand{\MagmaXmpTitle}{Magma}
+\newcommand{\MagmaXmpNumber}{9.49}
+
+@
+\subsection{Magma}
+\label{MagmaXmpPage}
+\index{pages!MagmaXmpPage!magma.ht}
+\index{magma.ht!pages!MagmaXmpPage}
+\index{MagmaXmpPage!magma.ht!pages}
+<<magma.ht>>=
+\begin{page}{MagmaXmpPage}{Magma}
+\beginscroll
+Initialisations
+\xtc{
+}{
+\spadpaste{x:Symbol :='x \bound{x}}
+}
+\xtc{
+}{
+\spadpaste{y:Symbol :='y \bound{y}}
+}
+\xtc{
+}{
+\spadpaste{z:Symbol :='z \bound{z}}
+}
+\xtc{
+}{
+\spadpaste{word := OrderedFreeMonoid(Symbol) \bound{word}}
+}
+\xtc{
+}{
+\spadpaste{tree := Magma(Symbol) \bound{tree}}
+}
+
+Let's make some trees
+\xtc{
+}{
+\spadpaste{a:tree := x*x \free{x tree} \bound{a}}
+}
+\xtc{
+}{
+\spadpaste{b:tree := y*y \free{y tree} \bound{b}}
+}
+\xtc{
+}{
+\spadpaste{c:tree := a*b \free{a b tree} \bound{c}}
+}
+
+Query the trees
+\xtc{
+}{
+\spadpaste{left c \free{c}}
+}
+\xtc{
+}{
+\spadpaste{right c \free{c}}
+}
+\xtc{
+}{
+\spadpaste{length c \free{c}}
+}
+\xtc{
+Coerce to the monoid
+}{
+\spadpaste{c::word \free{c word}}
+}
+
+Check ordering
+\xtc{
+}{
+\spadpaste{a < b \free{a b}}
+}
+\xtc{
+}{
+\spadpaste{a < c \free{a c}}
+}
+\xtc{
+}{
+\spadpaste{b < c \free{b c}}
+}
+
+Navigate the tree
+\xtc{
+}{
+\spadpaste{first c \free{c}}
+}
+\xtc{
+}{
+\spadpaste{rest c \free{c}}
+}
+\xtc{
+}{
+\spadpaste{rest rest c  \free{c}}
+}
+
+Check ordering
+\xtc{
+}{
+\spadpaste{ax:tree := a*x \free{a x tree} \bound{ax}}
+}
+\xtc{
+}{
+\spadpaste{xa:tree := x*a \free{a x tree} \bound{xa}}
+}
+\xtc{
+}{
+\spadpaste{xa < ax \free{ax xa}}
+}
+\xtc{
+}{
+\spadpaste{lexico(xa,ax) \free{ax xa}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{man0.ht}
+\subsection{Reference Search}
+\label{RefSearchPage}
+See ugSysCmdPage \ref{ugSysCmdPage} on page~\pageref{ugSysCmdPage}
+\index{pages!RefSearchPage!man0.ht}
+\index{man0.ht!pages!RefSearchPage}
+\index{RefSearchPage!man0.ht!pages}
+<<man0.ht>>=
+\begin{page}{RefSearchPage}{Reference Search}
+\beginscroll
+Enter search string :
+\inputstring{pattern}{40}{}
+\newline
+\beginmenu
+\menuunixlink{Search}
+  {htsearch "\stringvalue{pattern}"}
+  \tab{15} Reference documentation ({\em *} wild card is not accepted).
+\endmenu
+\endscroll
+\end{page}
+
+@
+\subsection{Axiom Browser}
+\label{Man0Page}
+See ugSysCmdPage \ref{ugSysCmdPage} on page~\pageref{ugSysCmdPage}
+\index{pages!Man0Page!man0.ht}
+\index{man0.ht!pages!Man0Page}
+\index{Man0Page!man0.ht!pages}
+<<man0.ht>>=
+\begin{page}{Man0Page}{A x i o m \   B r o w s e r}
+
+\beginscroll
+Enter search string (use {\em *} for wild card unless counter-indicated):
+\inputstring{pattern}{40}{}
+\newline
+\beginmenu
+\menulispmemolink{Constructors}
+  { (|kSearch| '|\stringvalue{pattern}|) }
+  \tab{15} Search for \lispmemolink{categories}{(|cSearch| '|\stringvalue{pattern}|)}, \lispmemolink{domains}{(|dSearch| '|\stringvalue{pattern}|)}, or \lispmemolink{packages}{(|pSearch| '|\stringvalue{pattern}|)}
+\menulispmemolink{Operations}
+  { (|oSearch| '|\stringvalue{pattern}|) }
+  \tab{15} Search for operations.
+\menulispmemolink{Attributes}
+  { (|aSearch| '|\stringvalue{pattern}|) }
+  \tab{15} Search for attributes.
+\menulispmemolink{General}
+  { (|aokSearch| '|\stringvalue{pattern}|) }
+  \tab{15} Search for all three of the above.
+\menulispmemolink{Documentation}
+  { (|docSearch| '|\stringvalue{pattern}|) }
+  \tab{15} Search library documentation.
+\menulispmemolink{Complete}
+  { (|genSearch| '|\stringvalue{pattern}|) }
+  \tab{15} All of the above.
+\menulispmemolink{Selectable}
+  { (|detailedSearch| '|\stringvalue{pattern}|) }
+  \tab{15} Detailed search with selectable options.
+\horizontalline
+\menuunixlink{Reference}
+  {htsearch "\stringvalue{pattern}"}
+  \tab{15} Search Reference documentation ({\em *} wild card is not accepted).
+\menumemolink{Commands}{ugSysCmdPage}
+\tab{15} View system command documentation.
+\endmenu
+\endscroll
+\autobutt{BROWSEhelp}
+\end{page}
+
+@
+\subsection{The Hyperdoc Browse Facility}
+\label{BROWSEhelp}
+\index{pages!BROWSEhelp!man0.ht}
+\index{man0.ht!pages!BROWSEhelp}
+\index{BROWSEhelp!man0.ht!pages}
+<<man0.ht>>=
+\begin{page}{BROWSEhelp}{The Hyperdoc Browse Facility}
+
+\beginscroll
+\beginmenu
+    \menudownlink{{The Front Page: Searching the Library}}{ugBrowseStartPage}
+    \menudownlink{{The Constructor Page}}{ugBrowseDomainPage}
+    \menudownlink{{Miscellaneous Features of Browse}}{ugBrowseMiscellaneousFeaturesPage}
+\endmenu
+\endscroll
+\newline
+\end{page}
+
+@
+\section{mapping.ht}
+\subsection{Domain {\bf Mapping(T,S,...)}}
+\label{DomainMapping}
+\index{pages!DomainMapping!mapping.ht}
+\index{mapping.ht!pages!DomainMapping}
+\index{DomainMapping!mapping.ht!pages}
+<<mapping.ht>>=
+\begin{page}{DomainMapping}{Domain {\em Mapping(T,S,...)}}
+\beginscroll
+{\em Mapping} takes any number of arguments of the form:
+\indentrel{2}
+\newline \spad{T}, a domain of category \spadtype{SetCategory}
+\newline \spad{S}, a domain of category \spadtype{SetCategory}
+\newline\tab{10}...
+\indentrel{-2}\newline
+This constructor is a primitive in Axiom.
+\newline
+\beginmenu
+\item\menulispdownlink{Description}
+{(|dbSpecialDescription| '|Mapping|)}\tab{19}General description
+\item\menulispdownlink{Operations} 
+{(|dbSpecialOperations| '|Mapping|)}
+\tab{19}All exported operations of \spad{Mapping(T,S)}
+%\item\menudownlink{Examples}   {MappingExamples}   
+\tab{19}Examples illustrating use
+%\item\menudownlink{Exports}    {MappingExports}    
+\tab{19}Explicit categories and operations
+\endmenu
+\endscroll\end{page}
+ 
+@
+\subsection{Domain Constructor {\bf Mapping}}	
+\label{MappingDescription}
+\index{pages!MappingDescription!mapping.ht}
+\index{mapping.ht!pages!MappingDescription}
+\index{MappingDescription!mapping.ht!pages}
+<<mapping.ht>>=
+\begin{page}{MappingDescription}{Domain Constructor {\em Mapping}}	
+\beginscroll
+\newline\menuitemstyle{}\tab{2}Mapping({\em T},{\em S,...})
+\newline\tab{2}{\em Arguments:}\indent{17}\tab{-2}
+{\em T}, a domain of category \spadtype{SetCategory}
+\newline\tab{-2}
+{\em S}, a domain of category \spadtype{SetCategory}
+\newline\tab{10}...
+\indent{0}\newline\tab{2}{\em Returns:}\indent{15}\tab{0}
+the class of mappings from domain ({\em S,...}) 
+into domain {\em T} as described below.
+\indent{0}\newline\tab{2}{\em Description:}\indent{15}\tab{0}
+{\em Mapping(T,S,...)} denotes the class of objects which are
+mappings from a source domain ({\em S,...}) into a target domain {\em T}.
+The {\em Mapping} constructor can take any number of arguments.
+All but the first argument is regarded as part of a source tuple
+for the mapping. 
+For example, {\em Mapping(T,A,B)} denotes the
+class of mappings from {\em (A,B)} into {\em T}.
+{\em Mapping} is a primitive domain of Axiom which cannot be
+defined in the Axiom language. 
+\endscroll
+\end{page}
+
+
+@
+\section{mappkg1.ht}
+<<mappkg1.ht>>=
+\newcommand{\MappingPackageOneXmpTitle}{MappingPackage1}
+\newcommand{\MappingPackageOneXmpNumber}{9.51}
+
+@
+\subsection{MappingPackage1}
+\label{MappingPackageOneXmpPage}
+\index{pages!MappingPackageOneXmpPage!mappkg1.ht}
+\index{mappkg1.ht!pages!MappingPackageOneXmpPage}
+\index{MappingPackageOneXmpPage!mappkg1.ht!pages}
+<<mappkg1.ht>>=
+\begin{page}{MappingPackageOneXmpPage}{MappingPackage1}
+\beginscroll
+
+Function are objects of type \pspadtype{Mapping}.
+In this section we demonstrate some library operations from the
+packages \spadtype{MappingPackage1}, \spadtype{MappingPackage2}, and
+\spadtype{MappingPackage3} that manipulate and create functions.
+Some terminology: a {\it nullary} function takes no arguments,
+a {\it unary} function takes one argument, and
+a {\it binary} function takes two arguments.
+
+\xtc{
+We begin by creating an example function that raises a
+rational number to an integer exponent.
+}{
+\spadpaste{power(q: FRAC INT, n: INT): FRAC INT == q**n \bound{power}}
+}
+\xtc{
+}{
+\spadpaste{power(2,3) \free{power}}
+}
+\xtc{
+The \spadfunFrom{twist}{MappingPackage3} operation
+transposes the arguments of a binary function.
+Here \spad{rewop(a, b)} is \spad{power(b, a)}.
+}{
+\spadpaste{rewop := twist power \free{power}\bound{rewop}}
+}
+\xtc{
+This is \texht{$2^3.$}{\spad{2**3.}}
+}{
+\spadpaste{rewop(3, 2) \free{rewop}}
+}
+\xtc{
+Now we define \userfun{square} in terms of \userfun{power}.
+}{
+\spadpaste{square: FRAC INT -> FRAC INT \bound{squaredec}}
+}
+\xtc{
+The \spadfunFrom{curryRight}{MappingPackage3} operation creates a unary
+function from a binary one by providing a constant
+argument on the right.
+}{
+\spadpaste{square:= curryRight(power, 2) \free{squaredec poswer}\bound{square}}
+}
+\xtc{
+Likewise, the
+\spadfunFrom{curryLeft}{MappingPackage3} operation provides a constant
+argument on the left.
+}{
+\spadpaste{square 4 \free{square}}
+}
+\xtc{
+The \spadfunFrom{constantRight}{MappingPackage3} operation creates
+(in a trivial way) a binary function from a unary one:
+\spad{constantRight(f)} is the function \spad{g} such that
+\spad{g(a,b)= f(a).}
+}{
+\spadpaste{squirrel:= constantRight(square)\$MAPPKG3(FRAC INT,FRAC INT,FRAC INT) \free{square}\bound{squirrel}}
+}
+\xtc{
+Likewise,
+\spad{constantLeft(f)} is the function \spad{g} such that \spad{g(a,b)= f(b).}
+}{
+\spadpaste{squirrel(1/2, 1/3) \free{squirrel}}
+}
+\xtc{
+The \spadfunFrom{curry}{MappingPackage2} operation makes a unary function nullary.
+}{
+\spadpaste{sixteen := curry(square, 4/1) \free{square}\bound{sixteen}}
+}
+\xtc{
+}{
+\spadpaste{sixteen() \free{sixteen}}
+}
+\xtc{
+The \spadopFrom{*}{MappingPackage3} operation
+constructs composed functions.
+}{
+\spadpaste{square2:=square*square \free{square}\bound{square2}}
+}
+\xtc{
+}{
+\spadpaste{square2  3 \free{square2}}
+}
+\xtc{
+Use the \spadopFrom{**}{MappingPackage1} operation to create
+functions that are \spad{n}-fold iterations of other functions.
+}{
+\spadpaste{sc(x: FRAC INT): FRAC INT == x + 1 \bound{sc}}
+}
+\xtc{
+This is a list of \pspadtype{Mapping} objects.
+}{
+\spadpaste{incfns := [sc**i for i in 0..10] \free{sc}\bound{incfns}}
+}
+\xtc{
+This is a list of applications of those functions.
+}{
+\spadpaste{[f 4 for f in incfns] \free{incfns}}
+}
+\xtc{
+Use the \spadfunFrom{recur}{MappingPackage1}
+operation for recursion:
+\spad{g := recur f} means \spad{g(n,x) == f(n,f(n-1,...f(1,x))).}
+}{
+\spadpaste{times(n:NNI, i:INT):INT == n*i \bound{rdec}}
+}
+\xtc{
+}{
+\spadpaste{r := recur(times) \free{rdec}\bound{r}}
+}
+\xtc{
+This is a factorial function.
+}{
+\spadpaste{fact := curryRight(r, 1) \free{r}\bound{fact}}
+}
+\xtc{
+}{
+\spadpaste{fact 4 \free{fact}}
+}
+\xtc{
+Constructed functions can be used within other functions.
+}{
+\begin{spadsrc}[\free{square}\bound{mto2ton}]
+mto2ton(m, n) ==
+  raiser := square**n
+  raiser m
+\end{spadsrc}
+}
+\xtc{
+This is \texht{$3^{2^3}.$}{\spad{3**(2**3).}}
+}{
+\spadpaste{mto2ton(3, 3) \free{mto2ton}}
+}
+\xtc{
+Here \userfun{shiftfib} is a unary function that modifies its argument.
+}{
+\begin{spadsrc}[\bound{shiftfib}]
+shiftfib(r: List INT) : INT ==
+  t := r.1
+  r.1 := r.2
+  r.2 := r.2 + t
+  t
+\end{spadsrc}
+}
+\xtc{
+By currying over the argument we get a function with private state.
+}{
+\spadpaste{fibinit: List INT := [0, 1] \bound{fibinitdec}}
+}
+\xtc{
+}{
+\spadpaste{fibs := curry(shiftfib, fibinit) \free{shiftfib fibinit}\bound{fibs}}
+}
+\xtc{
+}{
+\spadpaste{[fibs() for i in 0..30] \free{fibs}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{mset.ht}
+<<mset.ht>>=
+\newcommand{\MultiSetXmpTitle}{MultiSet}
+\newcommand{\MultiSetXmpNumber}{9.53}
+
+@
+\subsection{MultiSet}
+\label{MultiSetXmpPage}
+\index{pages!MultiSetXmpPage!mset.ht}
+\index{mset.ht!pages!MultiSetXmpPage}
+\index{MultiSetXmpPage!mset.ht!pages}
+<<mset.ht>>=
+\begin{page}{MultiSetXmpPage}{MultiSet}
+\beginscroll
+The domain \spadtype{Multiset(R)} is similar to \spadtype{Set(R)}
+except that multiplicities
+(counts of duplications) are maintained and displayed.
+Use the operation \spadfunFrom{multiset}{Multiset} to create
+multisets from lists.
+All the standard operations from sets are available for
+multisets.
+An element with multiplicity greater than one has the
+multiplicity displayed first, then a colon, and then the element.
+
+\xtc{
+Create a multiset of integers.
+}{
+\spadpaste{s := multiset [1,2,3,4,5,4,3,2,3,4,5,6,7,4,10]\bound{s}}
+}
+\xtc{
+The operation \spadfunX{insert} adds an element to a multiset.
+}{
+\spadpaste{insert!(3,s)\bound{s1}\free{s}}
+}
+\xtc{
+Use \spadfunX{remove} to remove an element.
+If a third argument is present, it specifies how many instances
+to remove. Otherwise all instances of the element are removed.
+Display the resulting multiset.
+}{
+\spadpaste{remove!(3,s,1); s\bound{s2}\free{s1}}
+}
+\xtc{
+}{
+\spadpaste{remove!(5,s); s\bound{s2}\free{s1}}
+}
+\xtc{
+The operation \spadfun{count} returns the number of copies
+of a given value.
+}{
+\spadpaste{count(5,s)\free{s2}}
+}
+\xtc{
+A second multiset.
+}{
+\spadpaste{t := multiset [2,2,2,-9]\bound{t}}
+}
+\xtc{
+The \spadfun{union} of two multisets is additive.
+}{
+\spadpaste{U := union(s,t)\bound{U}}
+}
+\xtc{
+The \spadfun{intersect} operation gives the elements that are in
+common, with additive multiplicity.
+}{
+\spadpaste{I := intersect(s,t)\bound{I}}
+}
+\xtc{
+The \spadfun{difference} of \spad{s} and \spad{t} consists of
+the elements that \spad{s} has but \spad{t} does not.
+Elements are regarded as indistinguishable, so that if \spad{s}
+and \spad{t} have any element in common, the \spadfun{difference}
+does not contain that element.
+}{
+\spadpaste{difference(s,t)\free{s2 t}}
+}
+\xtc{
+The \spadfun{symmetricDifference} is the \spadfun{union}
+of \spad{difference(s, t)} and \spad{difference(t, s)}.
+}{
+\spadpaste{S := symmetricDifference(s,t)\bound{S}\free{s2 t}}
+}
+\xtc{
+Check that the \spadfun{union} of the \spadfun{symmetricDifference} and
+the \spadfun{intersect} equals the \spadfun{union} of the elements.
+}{
+\spadpaste{(U = union(S,I))@Boolean\free{S I U}}
+}
+\xtc{
+Check some inclusion relations.
+}{
+\spadpaste{t1 := multiset [1,2,2,3]; [t1 < t, t1 < s, t < s, t1 <= s]\free{t s2}}
+}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{matrix.ht}
+<<matrix.ht>>=
+\newcommand{\MatrixXmpTitle}{Matrix}
+\newcommand{\MatrixXmpNumber}{9.52}
+
+@
+\subsection{Matrix}
+\label{MatrixXmpPage}
+\begin{itemize}
+\item ugxMatrixCreatePage \ref{ugxMatrixCreatePage} on
+page~pageref{ugxMatrixCreatePage}
+\item ugxMatrixOpsPage \ref{ugxMatrixOpsPage} on
+page~pageref{ugxMatrixOpsPage}
+\end{itemize}
+\index{pages!MatrixXmpPage!matrix.ht}
+\index{matrix.ht!pages!MatrixXmpPage}
+\index{MatrixXmpPage!matrix.ht!pages}
+<<matrix.ht>>=
+\begin{page}{MatrixXmpPage}{Matrix}
+\beginscroll
+
+The \spadtype{Matrix} domain provides arithmetic operations on matrices
+and standard functions from linear algebra.
+This domain is similar to the \spadtype{TwoDimensionalArray} domain, except
+that the entries for \spadtype{Matrix} must belong to a \spadtype{Ring}.
+
+\beginmenu
+    \menudownlink{{9.52.1. Creating Matrices}}{ugxMatrixCreatePage}
+    \menudownlink{{9.52.2. Operations on Matrices}}{ugxMatrixOpsPage}
+\endmenu
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<matrix.ht>>=
+\newcommand{\ugxMatrixCreateTitle}{Creating Matrices}
+\newcommand{\ugxMatrixCreateNumber}{9.52.1.}
+
+@
+\subsection{Creating Matrices}
+\label{ugxMatrixCreatePage}
+\index{pages!ugxMatrixCreatePage!matrix.ht}
+\index{matrix.ht!pages!ugxMatrixCreatePage}
+\index{ugxMatrixCreatePage!matrix.ht!pages}
+<<matrix.ht>>=
+\begin{page}{ugxMatrixCreatePage}{Creating Matrices}
+\beginscroll
+
+There are many ways to create a matrix from a collection of
+values or from existing matrices.
+
+\xtc{
+If the matrix has almost all items equal to the same value,
+use \spadfunFrom{new}{Matrix} to create a matrix filled with that
+value and then reset the entries that are different.
+}{
+\spadpaste{m : Matrix(Integer) := new(3,3,0) \bound{m}}
+}
+\xtc{
+To change the entry in the second row, third column to \spad{5}, use
+\spadfunFrom{setelt}{Matrix}.
+}{
+\spadpaste{setelt(m,2,3,5) \free{m}\bound{m1}}
+}
+\xtc{
+An alternative syntax is to use assignment.
+}{
+\spadpaste{m(1,2) := 10 \free{m1}\bound{m2}}
+}
+\xtc{
+The matrix was {\it destructively modified}.
+}{
+\spadpaste{m \free{m2}}
+}
+
+\xtc{
+If you already have the matrix entries as a list of lists,
+use \spadfunFrom{matrix}{Matrix}.
+}{
+\spadpaste{matrix [[1,2,3,4],[0,9,8,7]]}
+}
+
+\xtc{
+If the matrix is diagonal, use
+\spadfunFrom{diagonalMatrix}{Matrix}.
+}{
+\spadpaste{dm := diagonalMatrix [1,x**2,x**3,x**4,x**5] \bound{dm}}
+}
+\xtc{
+Use \spadfunFromX{setRow}{Matrix} and
+\spadfunFromX{setColumn}{Matrix} to change a row or column of a matrix.
+}{
+\spadpaste{setRow!(dm,5,vector [1,1,1,1,1]) \free{dm}\bound{dm1}}
+}
+\xtc{
+}{
+\spadpaste{setColumn!(dm,2,vector [y,y,y,y,y]) \free{dm1}\bound{dm2}}
+}
+
+%
+\xtc{
+Use \spadfunFrom{copy}{Matrix} to make a copy of a matrix.
+}{
+\spadpaste{cdm := copy(dm) \free{dm2}\bound{cdm}}
+}
+\xtc{
+This is useful if you intend to modify a matrix destructively but
+want a copy of the original.
+}{
+\spadpaste{setelt(dm,4,1,1-x**7) \free{dm2}\bound{setdm}}
+}
+\xtc{
+}{
+\spadpaste{[dm,cdm] \free{setdm cdm}}
+}
+
+%
+\xtc{
+Use \spadfunFrom{subMatrix}{Matrix} to extract part of an
+existing matrix.
+The syntax is \spad{subMatrix({\it m, firstrow, lastrow, firstcol,
+lastcol})}.
+}{
+\spadpaste{subMatrix(dm,2,3,2,4) \free{setdm}}
+}
+
+%
+\xtc{
+To change a submatrix, use \spadfunFromX{setsubMatrix}{Matrix}.
+}{
+\spadpaste{d := diagonalMatrix [1.2,-1.3,1.4,-1.5] \bound{d}}
+}
+\xtc{
+If \spad{e} is too big to fit where you specify, an error message
+is displayed.
+Use \spadfunFrom{subMatrix}{Matrix} to extract part of \spad{e}, if
+necessary.
+}{
+\spadpaste{e := matrix [[6.7,9.11],[-31.33,67.19]] \bound{e}}
+}
+\xtc{
+This changes the submatrix of \spad{d} whose upper left corner is
+at the first row and second column and whose size is that of \spad{e}.
+}{
+\spadpaste{setsubMatrix!(d,1,2,e) \free{d e}\bound{d1}}
+}
+\xtc{
+}{
+\spadpaste{d \free{d1}}
+}
+%
+
+%
+\xtc{
+Matrices can be joined either horizontally or vertically to make
+new matrices.
+}{
+\spadpaste{a := matrix [[1/2,1/3,1/4],[1/5,1/6,1/7]] \bound{a}}
+}
+\xtc{
+}{
+\spadpaste{b := matrix [[3/5,3/7,3/11],[3/13,3/17,3/19]] \bound{b}}
+}
+\xtc{
+Use \spadfunFrom{horizConcat}{Matrix} to append them side to side.
+The two matrices must have the same number of rows.
+}{
+\spadpaste{horizConcat(a,b) \free{a b}}
+}
+\xtc{
+Use \spadfunFrom{vertConcat}{Matrix} to stack one upon the other.
+The two matrices must have the same number of columns.
+}{
+\spadpaste{vab := vertConcat(a,b) \free{a b}\bound{vab}}
+}
+
+%
+\xtc{
+The operation
+\spadfunFrom{transpose}{Matrix} is used to create a new matrix by reflection
+across the main diagonal.
+}{
+\spadpaste{transpose vab \free{vab}}
+}
+
+\endscroll
+\autobuttons
+\end{page}
+
+@
+<<matrix.ht>>=
+\newcommand{\ugxMatrixOpsTitle}{Operations on Matrices}
+\newcommand{\ugxMatrixOpsNumber}{9.52.2.}
+
+@
+\subsection{Operations on Matrices}
+\label{ugxMatrixOpsPage}
+\begin{itemize}
+\item ugIntroTwoDimPage \ref{ugIntroTwoDimPage} on
+page~pageref{ugIntroTwoDimPage}
+\item ugProblemEigenPage \ref{ugProblemEigenPage} on
+page~pageref{ugProblemEigenPage}
+\item ugxFloatHilbertPage \ref{ugxFloatHilbertPage} on
+page~pageref{ugxFloatHilbertPage}
+\item PermanentXmpPage \ref{PermanentXmpPage} on
+page~pageref{PermanentXmpPage}
+\item VectorXmpPage \ref{VectorXmpPage} on
+page~pageref{VectorXmpPage}
+\item OneDimensionalArrayXmpPage \ref{OneDimensionalArrayXmpPage} on
+page~pageref{OneDimensionalArrayXmpPage}
+\item TwoDimensionalArrayXmpPage \ref{TwoDimensionalArrayXmpPage} on
+page~pageref{TwoDimensionalArrayXmpPage}
+\end{itemize}
+\index{pages!ugxMatrixOpsPage!matrix.ht}
+\index{matrix.ht!pages!ugxMatrixOpsPage}
+\index{ugxMatrixOpsPage!matrix.ht!pages}
+<<matrix.ht>>=
+\begin{page}{ugxMatrixOpsPage}{Operations on Matrices}
+\beginscroll
+
+\labelSpace{3pc}
+\xtc{
+Axiom provides both left and right scalar multiplication.
+}{
+\spadpaste{m := matrix [[1,2],[3,4]] \bound{m}}
+}
+\xtc{
+}{
+\spadpaste{4 * m * (-5)\free{m}}
+}
+\xtc{
+You can add, subtract, and multiply matrices provided, of course, that
+the matrices have compatible dimensions.
+If not, an error message is displayed.
+}{
+\spadpaste{n := matrix([[1,0,-2],[-3,5,1]]) \bound{n}}
+}
+\xtc{
+This following product is defined but \spad{n * m} is not.
+}{
+\spadpaste{m * n \free{m n}}
+}
+
+The operations \spadfunFrom{nrows}{Matrix} and \spadfunFrom{ncols}{Matrix}
+return the number of rows and columns of a matrix.
+You can extract a row or a column of a matrix using the operations
+\spadfunFrom{row}{Matrix} and \spadfunFrom{column}{Matrix}.
+The object returned is a \spadtype{Vector}.
+\xtc{
+Here is the third column of the matrix \spad{n}.
+}{
+\spadpaste{vec := column(n,3) \free{n} \bound{vec}}
+}
+\xtc{
+You can multiply a matrix on the left by a ``row vector'' and on the right
+by a ``column vector.''
+}{
+\spadpaste{vec * m \free{vec m}}
+}
+\xtc{
+Of course, the dimensions of the vector and the matrix must be compatible
+or an error message is returned.
+}{
+\spadpaste{m * vec \free{vec m}}
+}
+
+The operation \spadfunFrom{inverse}{Matrix} computes the inverse of a
+matrix if
+{Operations on Matrices}
+the matrix is invertible, and returns \spad{"failed"} if not.
+\xtc{
+This Hilbert matrix is invertible.
+}{
+\spadpaste{hilb := matrix([[1/(i + j) for i in 1..3] for j in 1..3]) \bound{hilb}}
+}
+\xtc{
+}{
+\spadpaste{inverse(hilb) \free{hilb}}
+}
+\xtc{
+This matrix is not invertible.
+}{
+\spadpaste{mm := matrix([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]) \bound{mm}}
+}
+\xtc{
+}{
+\spadpaste{inverse(mm) \free{mm}}
+}
+
+The operation 
+\spadfunFrom{determinant}{Matrix} computes the determinant of a matrix
+{Operations on Matrices}
+provided that the entries of the matrix belong to a \spadtype{CommutativeRing}.
+\xtc{
+The above matrix \spad{mm} is not invertible and, hence, must have
+determinant \spad{0}.
+}{
+\spadpaste{determinant(mm) \free{mm}}
+}
+\xtc{
+The operation
+\spadfunFrom{trace}{SquareMatrix} computes the trace of a {\em square} matrix.
+{Operations on Matrices}
+}{
+\spadpaste{trace(mm) \free{mm}}
+}
+
+\xtc{
+The operation \spadfunFrom{rank}{Matrix} computes the {\it rank} of a
+matrix:
+the maximal number of linearly independent rows or columns.
+}{
+\spadpaste{rank(mm) \free{mm}}
+}
+\xtc{
+The operation \spadfunFrom{nullity}{Matrix} computes the {\it nullity} of
+a matrix: the dimension of its null space.
+}{
+\spadpaste{nullity(mm) \free{mm}}
+}
+\xtc{
+The operation \spadfunFrom{nullSpace}{Matrix} returns a list containing 
+a basis for the null space of a matrix.
+Note that the nullity is the number of elements in a basis for the null space.
+}{
+\spadpaste{nullSpace(mm) \free{mm}}
+}
+\xtc{
+The operation 
+\spadfunFrom{rowEchelon}{Matrix} returns the row echelon form of a
+{Operations on Matrices}
+matrix.
+It is easy to see that the rank of this matrix is two and that its nullity
+is also two.
+}{
+\spadpaste{rowEchelon(mm) \free{mm}}
+}
+
+For more information on related topics, see
+\downlink{``\ugIntroTwoDimTitle''}{ugIntroTwoDimPage} in Section \ugIntroTwoDimNumber\ignore{ugIntroTwoDim},
+\downlink{``\ugProblemEigenTitle''}{ugProblemEigenPage} in Section \ugProblemEigenNumber\ignore{ugProblemEigen},
+\downlink{``\ugxFloatHilbertTitle''}{ugxFloatHilbertPage} in Section \ugxFloatHilbertNumber\ignore{ugxFloatHilbert},
+\downlink{`Permanent'}{PermanentXmpPage}\ignore{Permanent},
+\downlink{`Vector'}{VectorXmpPage}\ignore{Vector},
+\downlink{`OneDimensionalArray'}{OneDimensionalArrayXmpPage}\ignore{OneDimensionalArray}, and
+\downlink{`TwoDimensionalArray'}{TwoDimensionalArrayXmpPage}\ignore{TwoDimensionalArray}.
+%
+\showBlurb{Matrix}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{mkfunc.ht}
+<<mkfunc.ht>>=
+\newcommand{\MakeFunctionXmpTitle}{MakeFunction}
+\newcommand{\MakeFunctionXmpNumber}{9.50}
+
+@
+\subsection{MakeFunction}
+\label{MakeFunctionXmpPage}
+See ugUserMakePage \ref{ugUserMakePage} on page~\pageref{ugUserMakePage}
+\index{pages!MakeFunctionXmpPage!mkfunc.ht}
+\index{mkfunc.ht!pages!MakeFunctionXmpPage}
+\index{MakeFunctionXmpPage!mkfunc.ht!pages}
+<<mkfunc.ht>>=
+\begin{page}{MakeFunctionXmpPage}{MakeFunction}
+\beginscroll
+It is sometimes useful to be able to define a function given by
+the result of a calculation.
+%
+\xtc{
+Suppose that you have obtained the following expression
+after several computations
+and that you now want to tabulate the numerical values of \spad{f}
+for \spad{x} between \spad{-1} and \spad{+1} with increment
+\spad{0.1}.
+}{
+\spadpaste{expr := (x - exp x + 1)**2 * (sin(x**2) * x + 1)**3 \bound{expr}}
+}
+%
+You could, of course, use the function
+\spadfunFrom{eval}{Expression} within a loop and evaluate
+\spad{expr} twenty-one times, but this would be quite slow.
+A better way is to create a numerical function \spad{f} such that
+\spad{f(x)} is defined by the expression \spad{expr} above,
+but without retyping \spad{expr}!
+The package \spadtype{MakeFunction} provides the operation
+\spadfunFrom{function}{MakeFunction} which does exactly this.
+%
+\xtc{
+Issue this to create the function \spad{f(x)} given by \spad{expr}.
+}{
+\spadpaste{function(expr, f, x) \bound{f}\free{expr}}
+}
+\xtc{
+To tabulate \spad{expr}, we can now quickly evaluate \spad{f} 21 times.
+}{
+\spadpaste{tbl := [f(0.1 * i - 1) for i in 0..20]; \free{f}\bound{tbl}}
+}
+%
+%
+\xtc{
+Use the list \spad{[x1,...,xn]} as the
+third argument to \spadfunFrom{function}{MakeFunction}
+to create a multivariate function \spad{f(x1,...,xn)}.
+}{
+\spadpaste{e := (x - y + 1)**2 * (x**2 * y + 1)**2 \bound{e}}
+}
+\xtc{
+}{
+\spadpaste{function(e, g, [x, y]) \free{e}}
+}
+%
+%
+\xtc{
+In the case of just two
+variables, they can be given as arguments without making them into a list.
+}{
+\spadpaste{function(e, h, x, y) \free{e}\bound{h}}
+}
+%
+%
+\xtc{
+Note that the functions created by \spadfunFrom{function}{MakeFunction}
+are not limited to floating point numbers, but can be applied to any type
+for which they are defined.
+}{
+\spadpaste{m1 := squareMatrix [[1, 2], [3, 4]] \bound{m1}}
+}
+\xtc{
+}{
+\spadpaste{m2 := squareMatrix [[1, 0], [-1, 1]] \bound{m2}}
+}
+\xtc{
+}{
+\spadpaste{h(m1, m2) \free{h m1 m2}}
+}
+%
+For more information, see \downlink{``\ugUserMakeTitle''}{ugUserMakePage} 
+in Section \ugUserMakeNumber\ignore{ugUserMake}.
+\showBlurb{MakeFunction}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{mpoly.ht}
+<<mpoly.ht>>=
+\newcommand{\MultivariatePolynomialXmpTitle}{MultivariatePolynomial}
+\newcommand{\MultivariatePolynomialXmpNumber}{9.54}
+
+@
+\subsection{MultivariatePolynomial}
+\label{MultivariatePolynomialXmpPage}
+\begin{itemize}
+\item PolynomialXmpPage \ref{PolynomialXmpPage} on
+page~pageref{PolynomialXmpPage}
+\item UnivariatePolynomialXmpPage \ref{UnivariatePolynomialXmpPage} on
+page~pageref{UnivariatePolynomialXmpPage}
+\item DistributedMultivariatePolynomialXmpPage \ref{DistributedMultivariatePolynomialXmpPage} on
+page~pageref{DistributedMultivariatePolynomialXmpPage}
+\end{itemize}
+\index{pages!MultivariatePolynomialXmpPage!mpoly.ht}
+\index{mpoly.ht!pages!MultivariatePolynomialXmpPage}
+\index{MultivariatePolynomialXmpPage!mpoly.ht!pages}
+<<mpoly.ht>>=
+\begin{page}{MultivariatePolynomialXmpPage}{MultivariatePolynomial}
+\beginscroll
+
+The domain constructor \spadtype{MultivariatePolynomial} is similar to
+\spadtype{Polynomial} except that it specifies the variables to be used.
+\spadtype{Polynomial} are available for \spadtype{MultivariatePolynomial}.
+The abbreviation for \spadtype{MultivariatePolynomial} is
+\spadtype{MPOLY}.
+The type expressions
+\centerline{{\spadtype{MultivariatePolynomial([x,y],Integer)}}}
+and
+\centerline{{\spadtype{MPOLY([x,y],INT)}}}
+refer to the domain of multivariate polynomials in the variables
+\spad{x} and \spad{y} where the coefficients are restricted to be integers.
+The first
+variable specified is the main variable and the display of the
+polynomial reflects this.
+\xtc{
+This polynomial appears with
+terms in descending powers of the variable \spad{x}.
+}{
+\spadpaste{m : MPOLY([x,y],INT) := (x**2 - x*y**3 +3*y)**2 \bound{m}}
+}
+\xtc{
+It is easy to see a different variable ordering by doing a conversion.
+}{
+\spadpaste{m :: MPOLY([y,x],INT) \free{m}}
+}
+\xtc{
+You can use other, unspecified variables, by using
+\spadtype{Polynomial} in the coefficient type of \spadtype{MPOLY}.
+}{
+\spadpaste{p : MPOLY([x,y],POLY INT) \bound{pdec}}
+}
+\xtc{
+}{
+\spadpaste{p := (a**2*x - b*y**2 + 1)**2 \free{pdec}\bound{p}}
+}
+\xtc{
+Conversions can be used to re-express such polynomials in terms of
+the other variables.  For example, you can first push all the
+variables into a polynomial with integer coefficients.
+}{
+\spadpaste{p :: POLY INT \free{p}\bound{prev}}
+}
+\xtc{
+Now pull out the variables of interest.
+}{
+\spadpaste{\% :: MPOLY([a,b],POLY INT) \free{prev}}
+}
+
+\beginImportant
+\noindent {\bf Restriction:}
+\texht{\begin{quotation}\noindent}{\newline\indent{5}}
+Axiom does not allow you to create types where
+\spadtype{MultivariatePolynomial} is contained in the coefficient type of
+\spadtype{Polynomial}. Therefore,
+\spad{MPOLY([x,y],POLY INT)} is legal but
+\spad{POLY MPOLY([x,y],INT)} is not.
+\texht{\end{quotation}}{\indent{0}}
+\endImportant
+
+\xtc{
+Multivariate polynomials may be combined with univariate polynomials
+to create types with special structures.
+}{
+\spadpaste{q : UP(x, FRAC MPOLY([y,z],INT)) \bound{qdec}}
+}
+\xtc{
+This is a polynomial in \spad{x} whose coefficients are
+quotients of polynomials in \spad{y} and \spad{z}.
+}{
+\spadpaste{q := (x**2 - x*(z+1)/y +2)**2 \free{qdec}\bound{q}}
+}
+\xtc{
+Use conversions for structural rearrangements.
+\spad{z} does not appear in a denominator and so it can be made
+the main variable.
+}{
+\spadpaste{q :: UP(z, FRAC MPOLY([x,y],INT)) \free{q}}
+}
+\xtc{
+Or you can make a multivariate polynomial in \spad{x} and \spad{z}
+whose coefficients are fractions in polynomials in \spad{y}.
+}{
+\spadpaste{q :: MPOLY([x,z], FRAC UP(y,INT)) \free{q}}
+}
+A conversion like \spad{q :: MPOLY([x,y], FRAC UP(z,INT))} is not
+possible in this example
+because \spad{y} appears in the denominator of a fraction.
+As you can see, Axiom provides extraordinary flexibility in the
+manipulation and display of expressions via its conversion facility.
+
+For more information on related topics, see
+\downlink{`Polynomial'}{PolynomialXmpPage}\ignore{Polynomial},
+\downlink{`UnivariatePolynomial'}{UnivariatePolynomialXmpPage}\ignore{UnivariatePolynomial}, and
+\downlink{`DistributedMultivariatePolynomial'}{DistributedMultivariatePolynomialXmpPage}\ignore{DistributedMultivariatePolynomial}.
+\showBlurb{MultivariatePolynomial}
+\endscroll
+\autobuttons
+\end{page}
+
+@
+\section{nagaux.ht}
+\subsection{NAG On-line Documentation}
+\label{manpageXXonline}
+\index{pages!manpageXXonline!nagaux.ht}
+\index{nagaux.ht!pages!manpageXXonline}
+\index{manpageXXonline!nagaux.ht!pages}
+<<nagaux.ht>>=
+\begin{page}{manpageXXonline}{NAG On-line Documentation}
+\beginscroll
+\begin{verbatim}
+
+
+
+     DOC INTRO(3NAG)   Foundation Library (12/10/92)   DOC INTRO(3NAG)
+
+
+
+                    Introduction to NAG On-Line Documentation
+
+
+          The on-line documentation for the NAG Foundation Library has been
+          generated automatically from the same base material used to
+          create the printed Reference Manual. To make the documentation
+          readable on the widest range of machines, only the basic set of
+          ascii characters has been used.
+
+          Certain mathematical symbols have been constructed using plain
+          ascii characters:
+
+          integral signs                /
+                                        |
+
+                                        /
+
+          summation signs               --
+                                        >
+                                        --
+
+          square root signs                ----
+                                          /
+                                        \/
+
+
+          Large brackets are constructed using vertical stacks of the
+          equivalent ascii character:
+
+                              (  )  [  ]  {  }  |
+                              (  )  [  ]  {  }  |
+                              (  )  [  ]  {  }  |
+
+
+          Fractions are represented as:
+
+                                       a
+                                      ---
+                                      x+1
+
+
+          Greek letters are represented by their names enclosed in round
+          brackets:
+
+                  (alpha)  (beta)  (gamma) .....
+
+                  (Alpha)  (Beta)  (Gamma) .....
+
+
+          Some characters are accented using:
+
+                  ^     ~     
+                  X     X     X
+
+          Other mathematical symbols are represented as follows:
+
+                 *           times
+
+                 <=>         left-right arrow
+
+                 <-          left arrow
+
+                 ~           similar to
+
+                 ~=          similar or equal to
+
+                 ==          equivalent to
+
+                 >=          greater than or equal to
+
+                 <=          less than or equal to
+
+                 >>          much greater than
+
+                 <<          much less than
+
+                 >~          greater than or similar to
+
+                 /=          not equal to
+
+                 dd          partial derivative
+
+                 +-          plus or minus
+
+                 (nabla)     Nabla
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\subsection{NAG Documentation: summary}
+\label{manpageXXsummary}
+\index{pages!manpageXXsummary!nagaux.ht}
+\index{nagaux.ht!pages!manpageXXsummary}
+\index{manpageXXsummary!nagaux.ht!pages}
+<<nagaux.ht>>=
+\begin{page}{manpageXXsummary}{NAG Documentation: summary}
+\beginscroll
+\begin{verbatim}
+
+
+
+     SUMMARY(3NAG)     Foundation Library (12/10/92)     SUMMARY(3NAG)
+
+
+
+          Introduction                                     List of Routines
+          List of Routines
+
+          The NAG Foundation Library contains three categories of routines
+          which can be called by users. They are listed separately in the
+          three sections below.
+
+          Fully Documented Routines
+                254 routines, for each of which an individual routine
+                document is provided. These are regarded as the primary
+                contents of the Foundation Library.
+
+          Fundamental Support Routines
+                83 comparatively simple routines which are documented in
+                compact form in the relevant Chapter Introductions (F06,
+                X01, X02).
+
+          Routines from the NAG Fortran Library
+                An additional 167 routines from the NAG Fortran Library,
+                which are used as auxiliaries in the Foundation Library.
+                They are not documented in this publication, but can be
+                called if you are already familiar with their use in the
+                Fortran Library. Only their names are given here.
+
+
+          Note: all the routines in the above categories have names ending
+          in 'F'. Occasionally this publication may refer to routines whose
+          names end in some other letter (e.g. 'Z', 'Y', 'X'). These are
+          auxiliary routines whose names may be passed as parameters to a
+          Foundation Library routine; you only need to know their names,
+          not how to call them directly.
+
+          Fully Documented Routines
+
+          The Foundation Library contains 254 user-callable routines, for
+          each of which an individual routine document is provided, in the
+          following chapters:
+
+          C02 -- Zeros of Polynomials
+
+          C02AFF  All zeros of complex polynomial, modified Laguerre method
+
+          C02AGF  All zeros of real polynomial, modified Laguerre method
+
+          C05 -- Roots of One or More Transcendental Equations
+
+          C05ADF  Zero of continuous function in given interval, Bus and
+                  Dekker algorithm
+
+          C05NBF  Solution of system of nonlinear equations using function
+                  values only
+
+          C05PBF  Solution of system of nonlinear equations using 1st
+                  derivatives
+
+          C05ZAF  Check user's routine for calculating 1st derivatives
+
+          C06 -- Summation of Series
+
+          C06EAF  Single 1-D real discrete Fourier transform, no extra
+                  workspace
+
+          C06EBF  Single 1-D Hermitian discrete Fourier transform, no extra
+                  workspace
+
+          C06ECF  Single 1-D complex discrete Fourier transform, no extra
+                  workspace
+
+          C06EKF  Circular convolution or correlation of two real vectors,
+                  no extra workspace
+
+          C06FPF  Multiple 1-D real discrete Fourier transforms
+
+          C06FQF  Multiple 1-D Hermitian discrete Fourier transforms
+
+          C06FRF  Multiple 1-D complex discrete Fourier transforms
+
+          C06FUF  2-D complex discrete Fourier transform
+
+          C06GBF  Complex conjugate of Hermitian sequence
+
+          C06GCF  Complex conjugate of complex sequence
+
+          C06GQF  Complex conjugate of multiple Hermitian sequences
+
+          C06GSF  Convert Hermitian sequences to general complex sequences
+
+          D01 -- Quadrature
+
+          D01AJF  1-D quadrature, adaptive, finite interval, strategy due
+                  to Piessens and de Doncker, allowing for badly-behaved
+                  integrands
+
+          D01AKF  1-D quadrature, adaptive, finite interval, method
+                  suitable for oscillating functions
+
+          D01ALF  1-D quadrature, adaptive, finite interval, allowing for
+                  singularities at user-specified break-points
+
+          D01AMF  1-D quadrature, adaptive, infinite or semi-infinite
+                  interval
+
+          D01ANF  1-D quadrature, adaptive, finite interval, weight
+                  function cos((omega)x) or sin((omega)x)
+
+          D01APF  1-D quadrature, adaptive, finite interval, weight
+                  function with end-point singularities of algebraico-
+                  logarithmic type
+
+          D01AQF  1-D quadrature, adaptive, finite interval, weight
+                  function 1/(x-c), Cauchy principal value (Hilbert
+                  transform)
+
+          D01ASF  1-D quadrature, adaptive, semi-infinite interval, weight
+                  function cos((omega)x) or sin((omega)x)
+
+          D01BBF  Weights and abscissae for Gaussian quadrature rules
+
+          D01FCF  Multi-dimensional adaptive quadrature over hyper-
+                  rectangle
+
+          D01GAF  1-D quadrature, integration of function defined by data
+                  values, Gill-Miller method
+
+          D01GBF  Multi-dimensional quadrature over hyper-rectangle, Monte
+                  Carlo method
+
+          D02 -- Ordinary Differential Equations
+
+          D02BBF  ODEs, IVP, Runge-Kutta-Merson method, over a range,
+                  intermediate output
+
+          D02BHF  ODEs, IVP, Runge-Kutta-Merson method, until function of
+                  solution is zero
+
+          D02CJF  ODEs, IVP, Adams method, until function of solution is
+                  zero, intermediate output
+
+          D02EJF  ODEs, stiff IVP, BDF method, until function of solution
+                  is zero, intermediate output
+
+          D02GAF  ODEs, boundary value problem, finite difference technique
+                  with deferred correction, simple nonlinear problem
+
+          D02GBF  ODEs, boundary value problem, finite difference technique
+                  with deferred correction, general linear problem
+
+          D02KEF  2nd order Sturm-Liouville problem, regular/singular
+                  system, finite/infinite range, eigenvalue and
+                  eigenfunction, user-specified break-points
+
+          D02RAF  ODEs, general nonlinear boundary value problem, finite
+                  difference technique with deferred correction,
+                  continuation facility
+
+          D03 -- Partial Differential Equations
+
+          D03EDF  Elliptic PDE, solution of finite difference equations by
+                  a multigrid technique
+
+          D03EEF  Discretize a 2nd order elliptic PDE on a rectangle
+
+          D03FAF  Elliptic PDE, Helmholtz equation, 3-D Cartesian co-
+                  ordinates
+
+          E01 -- Interpolation
+
+          E01BAF  Interpolating functions, cubic spline interpolant, one
+                  variable
+
+          E01BEF  Interpolating functions, monotonicity-preserving,
+                  piecewise cubic Hermite, one variable
+
+          E01BFF  Interpolated values, interpolant computed by E01BEF,
+                  function only, one variable
+
+          E01BGF  Interpolated values, interpolant computed by E01BEF,
+                  function and 1st derivative, one variable
+
+          E01BHF  Interpolated values, interpolant computed by E01BEF,
+                  definite integral, one variable
+
+          E01DAF  Interpolating functions, fitting bicubic spline, data on
+                  rectangular grid
+
+          E01SAF  Interpolating functions, method of Renka and Cline, two
+                  variables
+
+          E01SBF  Interpolated values, evaluate interpolant computed by
+                  E01SAF, two variables
+
+          E01SEF  Interpolating functions, modified Shepard's method, two
+                  variables
+
+          E01SFF  Interpolated values, evaluate interpolant computed by
+                  E01SEF, two variables
+
+          E02 -- Curve and Surface Fitting
+
+          E02ADF  Least-squares curve fit, by polynomials, arbitrary data
+                  points
+
+          E02AEF  Evaluation of fitted polynomial in one variable from
+                  Chebyshev series form (simplified parameter list)
+
+          E02AGF  Least-squares polynomial fit, values and derivatives may
+                  be constrained, arbitrary data points,
+
+          E02AHF  Derivative of fitted polynomial in Chebyshev series form
+
+          E02AJF  Integral of fitted polynomial in Chebyshev series form
+
+          E02AKF  Evaluation of fitted polynomial in one variable, from
+                  Chebyshev series form
+
+          E02BAF  Least-squares curve cubic spline fit (including
+                  interpolation)
+
+          E02BBF  Evaluation of fitted cubic spline, function only
+
+          E02BCF  Evaluation of fitted cubic spline, function and
+                  derivatives
+
+          E02BDF  Evaluation of fitted cubic spline, definite integral
+
+          E02BEF  Least-squares cubic spline curve fit, automatic knot
+                  placement
+
+          E02DAF  Least-squares surface fit, bicubic splines
+
+          E02DCF  Least-squares surface fit by bicubic splines with
+                  automatic knot placement, data on rectangular grid
+
+          E02DDF  Least-squares surface fit by bicubic splines with
+                  automatic knot placement, scattered data
+
+          E02DEF  Evaluation of a fitted bicubic spline at a vector of
+                  points
+
+          E02DFF  Evaluation of a fitted bicubic spline at a mesh of points
+
+          E02GAF  L -approximation by general linear function
+                   1
+
+          E02ZAF  Sort 2-D data into panels for fitting bicubic splines
+
+          E04 -- Minimizing or Maximizing a Function
+
+          E04DGF  Unconstrained minimum, pre-conditioned conjugate gradient
+                  algorithm, function of several variables using 1st
+                  derivatives
+
+          E04DJF  Read optional parameter values for E04DGF from external
+                  file
+
+          E04DKF  Supply optional parameter values to E04DGF
+
+          E04FDF  Unconstrained minimum of a sum of squares, combined
+                  Gauss-Newton and modified Newton algorithm using function
+                  values only
+
+          E04GCF  Unconstrained minimum of a sum of squares, combined
+                  Gauss-Newton and quasi-Newton algorithm, using 1st
+                  derivatives
+
+          E04JAF  Minimum, function of several variables, quasi-Newton
+                  algorithm, simple bounds, using function values only
+
+          E04MBF  Linear programming problem
+
+          E04NAF  Quadratic programming problem
+
+          E04UCF  Minimum, function of several variables, sequential QP
+                  method, nonlinear constraints, using function values and
+                  optionally 1st derivatives
+
+          E04UDF  Read optional parameter values for E04UCF from external
+                  file
+
+          E04UEF  Supply optional parameter values to E04UCF
+
+          E04YCF  Covariance matrix for nonlinear least-squares problem
+
+          F01 -- Matrix Factorizations
+
+          F01BRF  LU factorization of real sparse matrix
+
+          F01BSF  LU factorization of real sparse matrix with known
+                  sparsity pattern
+
+                    T
+          F01MAF  LL  factorization of real sparse symmetric positive-
+                  definite matrix
+
+                     T
+          F01MCF  LDL  factorization of real symmetric positive-definite
+                  variable-bandwidth matrix
+
+          F01QCF  QR factorization of real m by n matrix (m>=n)
+
+                                                                      T
+          F01QDF  Operations with orthogonal matrices, compute QB or Q B
+                  after factorization by F01QCF
+
+          F01QEF  Operations with orthogonal matrices, form columns of Q
+                  after factorization by F01QCF
+
+          F01RCF  QR factorization of complex m by n matrix (m>=n)
+
+                                                                   H
+          F01RDF  Operations with unitary matrices, compute QB or Q B after
+                  factorization by F01RCF
+
+          F01REF  Operations with unitary matrices, form columns of Q after
+                  factorization by F01RCF
+
+          F02 -- Eigenvalues and Eigenvectors
+
+          F02AAF  All eigenvalues of real symmetric matrix
+
+          F02ABF  All eigenvalues and eigenvectors of real symmetric matrix
+
+          F02ADF  All eigenvalues of generalized real symmetric-definite
+                  eigenproblem
+
+          F02AEF  All eigenvalues and eigenvectors of generalized real
+                  symmetric-definite eigenproblem
+
+          F02AFF  All eigenvalues of real matrix
+
+          F02AGF  All eigenvalues and eigenvectors of real matrix
+
+          F02AJF  All eigenvalues of complex matrix
+
+          F02AKF  All eigenvalues and eigenvectors of complex matrix
+
+          F02AWF  All eigenvalues of complex Hermitian matrix
+
+          F02AXF  All eigenvalues and eigenvectors of complex Hermitian
+                  matrix
+
+          F02BBF  Selected eigenvalues and eigenvectors of real symmetric
+                  matrix
+
+          F02BJF  All eigenvalues and optionally eigenvectors of
+                  generalized eigenproblem by QZ algorithm, real matrices
+
+          F02FJF  Selected eigenvalues and eigenvectors of sparse symmetric
+                  eigenproblem
+
+          F02WEF  SVD of real matrix
+
+          F02XEF  SVD of complex matrix
+
+          F04 -- Simultaneous Linear Equations
+
+          F04ADF  Approximate solution of complex simultaneous linear
+                  equations with multiple right-hand sides
+
+          F04ARF  Approximate solution of real simultaneous linear
+                  equations, one right-hand side
+
+          F04ASF  Accurate solution of real symmetric positive-definite
+                  simultaneous linear equations, one right-hand side
+
+          F04ATF  Accurate solution of real simultaneous linear equations,
+                  one right-hand side
+
+          F04AXF  Approximate solution of real sparse simultaneous linear
+                  equations (coefficient matrix already factorized by
+                  F01BRF or F01BSF)
+
+          F04FAF  Approximate solution of real symmetric positive-definite
+                  tridiagonal simultaneous linear equations, one right-hand
+                  side
+
+          F04JGF  Least-squares (if rank = n) or minimal least-squares (if
+                  rank <n) solution of m real equations in n unknowns, rank
+                  <=n, m>=n
+
+          F04MAF  Real sparse symmetric positive-definite simultaneous
+                  linear equations (coefficient matrix already factorized)
+
+          F04MBF  Real sparse symmetric simultaneous linear equations
+
+          F04MCF  Approximate solution of real symmetric positive-definite
+                  variable-bandwidth simultaneous linear equations
+                  (coefficient matrix already factorized)
+
+          F04QAF  Sparse linear least-squares problem, m real equations in
+                  n unknowns
+
+          F07 -- Linear Equations (LAPACK)
+
+          F07ADF  (DGETRF) LU factorization of real m by n matrix
+
+          F07AEF  (DGETRS) Solution of real system of linear equations,
+                  multiple right-hand sides, matrix already factorized by
+                  F07ADF
+
+          F07FDF  (DPOTRF) Cholesky factorization of real symmetric
+                  positive-definite matrix
+
+          F07FEF  (DPOTRS) Solution of real symmetric positive-definite
+                  system of linear equations, multiple right-hand sides,
+                  matrix already factorized by F07FDF
+
+          G01 -- Simple Calculations on Statistical Data
+
+          G01AAF  Mean, variance, skewness, kurtosis etc, one variable,
+                  from raw data
+
+          G01ADF  Mean, variance, skewness, kurtosis etc, one variable,
+                  from frequency table
+
+          G01AEF  Frequency table from raw data
+
+
+          G01AFF  Two-way contingency table analysis, with (chi) /Fisher's
+                  exact test
+
+          G01ALF  Computes a five-point summary (median, hinges and
+                  extremes)
+
+          G01ARF  Constructs a stem and leaf plot
+
+          G01EAF  Computes probabilities for the standard Normal
+                  distribution
+
+          G01EBF  Computes probabilities for Student's t-distribution
+
+                                                  2
+          G01ECF  Computes probabilities for (chi)  distribution
+
+          G01EDF  Computes probabilities for F-distribution
+
+          G01EEF  Computes upper and lower tail probabilities and
+                  probability density function for the beta distribution
+
+          G01EFF  Computes probabilities for the gamma distribution
+
+          G01FAF  Computes deviates for the standard Normal distribution
+
+          G01FBF  Computes deviates for Student's t-distribution
+
+                                                 2
+          G01FCF  Computes deviates for the (chi)  distribution
+
+          G01FDF  Computes deviates for the F-distribution
+
+          G01FEF  Computes deviates for the beta distribution
+
+          G01FFF  Computes deviates for the gamma distribution
+
+          G01HAF  Computes probabilities for the bivariate Normal
+                  distribution
+
+          G02 -- Correlation and Regression Analysis
+
+          G02BNF  Kendall/Spearman non-parametric rank correlation
+                  coefficients, no missing values, overwriting input data
+
+          G02BQF  Kendall/Spearman non-parametric rank correlation
+                  coefficients, no missing values, preserving input data
+
+          G02BXF  Computes (optionally weighted) correlation and covariance
+                  matrices
+
+          G02CAF  Simple linear regression with constant term, no missing
+                  values
+
+          G02DAF  Fits a general (multiple) linear regression model
+
+          G02DGF  Fits a general linear regression model for new dependent
+                  variable
+
+          G02DNF  Computes estimable function of a general linear
+                  regression model and its standard error
+
+          G02FAF  Calculates standardized residuals and influence
+                  statistics
+
+          G02GBF  Fits a generalized linear model with binomial errors
+
+          G02GCF  Fits a generalized linear model with Poisson errors
+
+          G03 -- Multivariate Methods
+
+          G03AAF  Performs principal component analysis
+
+          G03ADF  Performs canonical correlation analysis
+
+          G03BAF  Computes orthogonal rotations for loading matrix,
+                  generalized orthomax criterion
+
+          G05 -- Random Number Generators
+
+          G05CAF  Pseudo-random double precision numbers, uniform
+                  distribution over (0,1)
+
+          G05CBF  Initialise random number generating routines to give
+                  repeatable sequence
+
+          G05CCF  Initialise random number generating routines to give non-
+                  repeatable sequence
+
+          G05CFF  Save state of random number generating routines
+
+          G05CGF  Restore state of random number generating routines
+
+          G05DDF  Pseudo-random double precision numbers, Normal
+                  distribution
+
+          G05DFF  Pseudo-random double precision numbers, Cauchy
+                  distribution
+
+          G05DPF  Pseudo-random double precision numbers, Weibull
+                  distribution
+
+          G05DYF  Pseudo-random integer from uniform distribution
+
+          G05DZF  Pseudo-random logical (boolean) value
+
+          G05EAF  Set up reference vector for multivariate Normal
+                  distribution
+
+          G05ECF  Set up reference vector for generating pseudo-random
+                  integers, Poisson distribution
+
+          G05EDF  Set up reference vector for generating pseudo-random
+                  integers, binomial distribution
+
+          G05EHF  Pseudo-random permutation of an integer vector
+
+          G05EJF  Pseudo-random sample from an integer vector
+
+          G05EXF  Set up reference vector from supplied cumulative
+                  distribution function or probability distribution
+                  function
+
+          G05EYF  Pseudo-random integer from reference vector
+
+          G05EZF  Pseudo-random multivariate Normal vector from reference
+                  vector
+
+          G05FAF  Generates a vector of pseudo-random numbers from a
+                  uniform distribution
+
+          G05FBF  Generates a vector of pseudo-random numbers from a
+                  (negative) exponential distribution
+
+          G05FDF  Generates a vector of pseudo-random numbers from a Normal
+                  distribution
+
+          G05FEF  Generates a vector of pseudo-random numbers from a beta
+                  distribution
+
+          G05FFF  Generates a vector of pseudo-random numbers from a gamma
+                  distribution
+
+          G05HDF  Generates a realisation of a multivariate time series
+                  from a VARMA model
+
+          G08 -- Nonparameteric Statistics
+
+          G08AAF  Sign test on two paired samples
+
+          G08ACF  Median test on two samples of unequal size
+
+          G08AEF  Friedman two-way analysis of variance on k matched
+                  samples
+
+          G08AFF  Kruskal-Wallis one-way analysis of variance on k samples
+                  of unequal size
+
+          G08AGF  Performs the Wilcoxon one sample (matched pairs) signed
+                  rank test
+
+          G08AHF  Performs the Mann-Whitney U test on two independent
+                  samples
+
+          G08AJF  Computes the exact probabilities for the Mann-Whitney U
+                  statistic, no ties in pooled sample
+
+          G08AKF  Computes the exact probabilities for the Mann-Whitney U
+                  statistic, ties in pooled sample
+
+                                    2
+          G08CGF  Performs the (chi)  goodness of fit test, for standard
+                  continuous distributions
+
+          G13 -- Time Series Analysis
+
+          G13AAF  Univariate time series, seasonal and non-seasonal
+                  differencing
+
+          G13ABF  Univariate time series, sample autocorrelation function
+
+          G13ACF  Univariate time series, partial autocorrelations from
+                  autocorrelations
+
+          G13ADF  Univariate time series, preliminary estimation, seasonal
+                  ARIMA model
+
+          G13AFF  Univariate time series, estimation, seasonal ARIMA model
+
+          G13AGF  Univariate time series, update state set for forecasting
+
+          G13AHF  Univariate time series, forecasting from state set
+
+          G13AJF  Univariate time series, state set and forecasts, from
+                  fully specified seasonal ARIMA model
+
+          G13ASF  Univariate time series, diagnostic checking of residuals,
+                  following G13AFF
+
+          G13BAF  Multivariate time series, filtering (pre-whitening) by an
+                  ARIMA model
+
+          G13BCF  Multivariate time series, cross correlations
+
+          G13BDF  Multivariate time series, preliminary estimation of
+                  transfer function model
+
+          G13BEF  Multivariate time series, estimation of multi-input model
+
+          G13BJF  Multivariate time series, state set and forecasts from
+                  fully specified multi-input model
+
+          G13CBF  Univariate time series, smoothed sample spectrum using
+                  spectral smoothing by the trapezium frequency (Daniell)
+                  window
+
+          G13CDF  Multivariate time series, smoothed sample cross spectrum
+                  using spectral smoothing by the trapezium frequency
+                  (Daniell) window
+
+          M01 -- Sorting
+
+          M01CAF  Sort a vector, double precision numbers
+
+          M01DAF  Rank a vector, double precision numbers
+
+          M01DEF  Rank rows of a matrix, double precision numbers
+
+          M01DJF  Rank columns of a matrix, double precision numbers
+
+          M01EAF  Rearrange a vector according to given ranks, double
+                  precision numbers
+
+          M01ZAF  Invert a permutation
+
+          S -- Approximations of Special Functions
+
+                                        z
+          S01EAF  Complex exponential, e
+
+          S13AAF  Exponential integral E (x)
+                                        1
+
+          S13ACF  Cosine integral Ci(x)
+
+          S13ADF  Sine integral Si(x)
+
+          S14AAF  Gamma function
+
+          S14ABF  Log Gamma function
+
+          S14BAF  Incomplete gamma functions P(a,x) and Q(a,x)
+
+          S15ADF  Complement of error function erfc x
+
+          S15AEF  Error function erf x
+
+          S17ACF  Bessel function Y (x)
+                                   0
+
+          S17ADF  Bessel function Y (x)
+                                   1
+
+          S17AEF  Bessel function J (x)
+                                   0
+
+          S17AFF  Bessel function J (x)
+                                   1
+
+          S17AGF  Airy function Ai(x)
+
+          S17AHF  Airy function Bi(x)
+
+          S17AJF  Airy function Ai'(x)
+
+          S17AKF  Airy function Bi'(x)
+
+          S17DCF  Bessel functions Y      (z), real a>=0, complex z,
+                                    (nu)+a
+                  (nu)=0,1,2,...
+
+          S17DEF  Bessel functions J      (z), real a>=0, complex z,
+                                    (nu)+a
+                  (nu)=0,1,2,...
+
+          S17DGF  Airy functions Ai(z) and Ai'(z), complex z
+
+          S17DHF  Airy functions Bi(z) and Bi'(z), complex z
+
+                                    (j)
+          S17DLF  Hankel functions H      (z), j=1,2, real a>=0, complex z,
+                                    (nu)+a
+                  (nu)=0,1,2,...
+
+          S18ACF  Modified Bessel function K (x)
+                                            0
+
+          S18ADF  Modified Bessel function K (x)
+                                            1
+
+          S18AEF  Modified Bessel function I (x)
+                                            0
+
+          S18AFF  Modified Bessel function I (x)
+                                            1
+
+          S18DCF  Modified Bessel functions K      (z), real a>=0, complex
+                                             (nu)+a
+                  z, (nu)=0,1,2,...
+
+          S18DEF  Modified Bessel functions I      (z), real a>=0, complex
+                                             (nu)+a
+                  z, (nu)=0,1,2,...
+
+          S19AAF  Kelvin function ber x
+
+          S19ABF  Kelvin function bei x
+
+          S19ACF  Kelvin function ker x
+
+          S19ADF  Kelvin function kei x
+
+          S20ACF  Fresnel integral S(x)
+
+          S20ADF  Fresnel integral C(x)
+
+          S21BAF  Degenerate symmetrised elliptic integral of 1st kind
+                  R (x,y)
+                   C
+
+          S21BBF  Symmetrised elliptic integral of 1st kind R (x,y,z)
+                                                             F
+
+          S21BCF  Symmetrised elliptic integral of 2nd kind R (x,y,z)
+                                                             D
+
+          S21BDF  Symmetrised elliptic integral of 3rd kind R (x,y,z,r)
+                                                             J
+
+          X04 -- Input/Output Utilities
+
+          X04AAF  Return or set unit number for error messages
+
+          X04ABF  Return or set unit number for advisory messages
+
+          X04CAF  Print a real general matrix
+
+          X04DAF  Print a complex general matrix
+
+          X05 -- Date and Time Utilities
+
+          X05AAF  Return date and time as an array of integers
+
+          X05ABF  Convert array of integers representing date and time to
+                  character string
+
+          X05ACF  Compare two character strings representing date and time
+
+          X05BAF  Return the CPU time
+
+
+
+          Fundamental Support Routines
+
+          The following fundamental support routines are provided and are
+          documented in compact form in the relevant chapter introductory
+          material:
+
+          F06 -- Linear Algebra Support Routines
+
+          F06AAF  (DROTG) Generate real plane rotation
+
+          F06EAF  (DDOT) Dot product of two real vectors
+
+          F06ECF  (DAXPY) Add scalar times real vector to real vector
+
+          F06EDF  (DSCAL) Multiply real vector by scalar
+
+          F06EFF  (DCOPY) Copy real vector
+
+          F06EGF  (DSWAP) Swap two real vectors
+
+          F06EJF  (DNRM2) Compute Euclidean norm of real vector
+
+          F06EKF  (DASUM) Sum the absolute values of real vector elements
+
+          F06EPF  (DROT) Apply real plane rotation
+
+          F06GAF  (ZDOTU) Dot product of two complex vectors, unconjugated
+
+          F06GBF  (ZDOTC) Dot product of two complex vectors, conjugated
+
+          F06GCF  (ZAXPY) Add scalar times complex vector to complex vector
+
+          F06GDF  (ZSCAL) Multiply complex vector by complex scalar
+
+          F06GFF  (ZCOPY) Copy complex vector
+
+          F06GGF  (ZSWAP) Swap two complex vectors
+
+          F06JDF  (ZDSCAL) Multiply complex vector by real scalar
+
+          F06JJF  (DZNRM2) Compute Euclidean norm of complex vector
+
+          F06JKF  (DZASUM) Sum the absolute values of complex vector
+                  elements
+
+          F06JLF  (IDAMAX) Index, real vector element with largest absolute
+                  value
+
+          F06JMF  (IZAMAX) Index, complex vector element with largest
+                  absolute value
+
+          F06PAF  (DGEMV) Matrix-vector product, real rectangular matrix
+
+          F06PBF  (DGBMV) Matrix-vector product, real rectangular band
+                  matrix
+
+          F06PCF  (DSYMV) Matrix-vector product, real symmetric matrix
+
+          F06PDF  (DSBMV) Matrix-vector product, real symmetric band matrix
+
+          F06PEF  (DSPMV) Matrix-vector product, real symmetric packed
+                  matrix
+
+          F06PFF  (DTRMV) Matrix-vector product, real triangular matrix
+
+          F06PGF  (DTBMV) Matrix-vector product, real triangular band
+                  matrix
+
+          F06PHF  (DTPMV) Matrix-vector product, real triangular packed
+                  matrix
+
+          F06PJF  (DTRSV) System of equations, real triangular matrix
+
+          F06PKF  (DTBSV) System of equations, real triangular band matrix
+
+          F06PLF  (DTPSV) System of equations, real triangular packed
+                  matrix
+
+          F06PMF  (DGER) Rank-1 update, real rectangular matrix
+
+          F06PPF  (DSYR) Rank-1 update, real symmetric matrix
+
+          F06PQF  (DSPR) Rank-1 update, real symmetric packed matrix
+
+          F06PRF  (DSYR2) Rank-2 update, real symmetric matrix
+
+          F06PSF  (DSPR2) Rank-2 update, real symmetric packed matrix
+
+          F06SAF  (ZGEMV) Matrix-vector product, complex rectangular matrix
+
+          F06SBF  (ZGBMV) Matrix-vector product, complex rectangular band
+                  matrix
+
+          F06SCF  (ZHEMV) Matrix-vector product, complex Hermitian matrix
+
+          F06SDF  (ZHBMV) Matrix-vector product, complex Hermitian band
+                  matrix
+
+          F06SEF  (ZHPMV) Matrix-vector product, complex Hermitian packed
+                  matrix
+
+          F06SFF  (ZTRMV) Matrix-vector product, complex triangular matrix
+
+          F06SGF  (ZTBMV) Matrix-vector product, complex triangular band
+                  matrix
+
+          F06SHF  (ZTPMV) Matrix-vector product, complex triangular packed
+                  matrix
+
+          F06SJF  (ZTRSV) System of equations, complex triangular matrix
+
+          F06SKF  (ZTBSV) System of equations, complex triangular band
+                  matrix
+
+          F06SLF  (ZTPSV) System of equations, complex triangular packed
+                  matrix
+
+          F06SMF  (ZGERU) Rank-1 update, complex rectangular matrix,
+                  unconjugated vector
+
+          F06SNF  (ZGERC) Rank-1 update, complex rectangular matrix,
+                  conjugated vector
+
+          F06SPF  (ZHER) Rank-1 update, complex Hermitian matrix
+
+          F06SQF  (ZHPR) Rank-1 update, complex Hermitian packed matrix
+
+          F06SRF  (ZHER2) Rank-2 update, complex Hermitian matrix
+
+          F06SSF  (ZHPR2) Rank-2 update, complex Hermitian packed matrix
+
+          F06YAF  (DGEMM) Matrix-matrix product, two real rectangular
+                  matrices
+
+          F06YCF  (DSYMM) Matrix-matrix product, one real symmetric matrix,
+                  one real rectangular matrix
+
+          F06YFF  (DTRMM) Matrix-matrix product, one real triangular
+                  matrix, one real rectangular matrix
+
+          F06YJF  (DTRSM) Solves a system of equations with multiple right-
+                  hand sides, real triangular coefficient matrix
+
+          F06YPF  (DSYRK) Rank-k update of a real symmetric matrix
+
+          F06YRF  (DSYR2K) Rank-2k update of a real symmetric matrix
+
+          F06ZAF  (ZGEMM) Matrix-matrix product, two complex rectangular
+                  matrices
+
+          F06ZCF  (ZHEMM) Matrix-matrix product, one complex Hermitian
+                  matrix, one complex rectangular matrix
+
+          F06ZFF  (ZTRMM) Matrix-matrix product, one complex triangular
+                  matrix, one complex rectangular matrix
+
+          F06ZJF  (ZTRSM) Solves system of equations with multiple right-
+                  hand sides, complex triangular coefficient matrix
+
+          F06ZPF  (ZHERK) Rank-k update of a complex Hermitian matrix
+
+          F06ZRF  (ZHER2K) Rank-2k update of a complex Hermitian matrix
+
+          F06ZTF  (ZSYMM) Matrix-matrix product, one complex symmetric
+                  matrix, one complex rectangular matrix
+
+          F06ZUF  (ZSYRK) Rank-k update of a complex symmetric matrix
+
+          F06ZWF  (ZSYR2K) Rank-2k update of a complex symmetric matrix
+
+          X01 -- Mathematical Constants
+
+          X01AAF  (pi)
+
+          X01ABF  Euler's constant, (gamma)
+
+          X02 -- Machine Constants
+
+          X02AHF  Largest permissible argument for SIN and COS
+
+          X02AJF  Machine precision
+
+          X02AKF  Smallest positive model number
+
+          X02ALF  Largest positive model number
+
+          X02AMF  Safe range of floating-point arithmetic
+
+          X02ANF  Safe range of complex floating-point arithmetic
+
+          X02BBF  Largest representable integer
+
+          X02BEF  Maximum number of decimal digits that can be represented
+
+          X02BHF  Parameter of floating-point arithmetic model, b
+
+          X02BJF  Parameter of floating-point arithmetic model, p
+
+          X02BKF  Parameter of floating-point arithmetic model, e
+                                                                 min
+
+          X02BLF  Parameter of floating-point arithmetic model, e
+                                                                 max
+
+          X02DJF  Parameter of floating-point arithmetic model, ROUNDS
+
+
+
+          Routines from the NAG Fortran Library
+
+          A number of routines from the NAG Fortran Library are used in the
+          Foundation Library as auxiliaries and are not documented here:
+
+          A00AAF
+
+          A02AAF  A02ABF  A02ACF
+
+          C02AJF
+
+          C05AZF  C05NCF  C05PCF
+
+          C06FAF  C06FBF  C06FCF  C06FFF  C06FJF  C06FKF
+
+          C06HAF  C06HBF  C06HCF  C06HDF
+
+          D02CBF  D02CHF  D02NMF  D02NSF  D02NVF  D02PAF
+
+          D02XAF  D02XKF  D02YAF  D02ZAF
+
+          E02AFF
+
+          E04GBF  E04GEF  E04YAF
+
+          F01ADF  F01AEF  F01AFF  F01AGF  F01AHF  F01AJF
+
+          F01AKF  F01AMF  F01APF  F01ATF  F01AUF  F01AVF
+
+          F01AWF  F01AXF  F01BCF  F01BTF  F01CRF  F01LBF
+
+          F01LZF  F01QAF  F01QFF  F01QGF  F01QJF  F01QKF
+
+          F01RFF  F01RGF  F01RJF  F01RKF
+
+          F02AMF  F02ANF  F02APF  F02AQF  F02AVF  F02AYF
+
+          F02BEF  F02SWF  F02SXF  F02SYF  F02SZF  F02UWF
+
+          F02UXF  F02UYF  F02WDF  F02WUF  F02XUF
+
+          F03AAF  F03ABF  F03AEF  F03AFF
+
+          F04AAF  F04AEF  F04AFF  F04AGF  F04AHF  F04AJF
+
+          F04AMF  F04ANF  F04AYF  F04LDF  F04YAF  F04YCF
+
+          F06BAF  F06BCF  F06BLF  F06BMF  F06BNF  F06CAF
+
+          F06CCF  F06CLF  F06DBF  F06DFF  F06FBF  F06FCF
+
+          F06FDF  F06FGF  F06FJF  F06FLF  F06FPF  F06FQF
+
+          F06FRF  F06FSF  F06HBF  F06HGF  F06HQF  F06HRF
+
+          F06KFF  F06KJF  F06KLF  F06QFF  F06QHF  F06QKF
+
+          F06QRF  F06QSF  F06QTF  F06QVF  F06QWF  F06QXF
+
+          F06RAF  F06RJF  F06TFF  F06THF  F06TTF  F06TXF
+
+          F06VJF  F06VKF  F06VXF
+
+          F07AGF  F07AHF  F07AJF  F07FGF  F07FHF  F07FJF
+
+          F07TJF
+
+          G01CEF
+
+          G02BAF  G02BUF  G02BWF  G02DDF
+
+          G13AEF
+
+          M01CBF  M01CCF  M01DBF  M01DCF  M01DFF  M01ZBF
+
+          P01ABF  P01ACF
+
+          S01BAF  S07AAF  S15ABF
+
+          X03AAF
+
+          X04BAF  X04BBF  X04CBF  X04DBF
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\subsection{NAG Documentation: introduction}
+\label{manpageXXintro}
+\index{pages!manpageXXintro!nagaux.ht}
+\index{nagaux.ht!pages!manpageXXintro}
+\index{manpageXXintro!nagaux.ht!pages}
+<<nagaux.ht>>=
+\begin{page}{manpageXXintro}{NAG Documentation: introduction}
+\beginscroll
+\begin{verbatim}
+
+
+
+     INTRO(3NAG)       Foundation Library (12/10/92)       INTRO(3NAG)
+
+
+
+          Introduction                               Essential Introduction
+          Essential Introduction to the NAG Foundation Library
+
+          This document is essential reading for any prospective user of
+          the Library.
+
+          This document appears in both the Handbook and the Reference
+          Manual for the NAG Foundation Library, but with a different
+          Section 3 to describe the different forms of routine
+          documentation in the two publications.
+
+          1. The Library and its Documentation
+
+          1.1. Structure of the Library
+
+          1.2. Structure of the Documentation
+
+          1.3. On-line Documentation
+
+          1.4. Implementations of the Library
+
+          1.5. Library Identification
+
+          1.6. Fortran Language Standards
+
+          2. Using the Library
+
+          2.1. General Advice
+
+          2.2. Programming Advice
+
+          2.3. Error handling and the Parameter IFAIL
+
+          2.4. Input/output in the Library
+
+          2.5. Auxiliary Routines
+
+          3. Using the Reference Manual
+
+          3.1. General Guidance
+
+          3.2. Structure of Routine Documents
+
+          3.3. Specifications of Parameters
+
+          3.3.1. Classification of Parameters
+
+          3.3.2. Constraints and Suggested Values
+
+          3.3.3. Array Parameters
+
+          3.4. Implementation-dependent Information
+
+          3.5. Example Programs and Results
+
+          3.6. Summary for New Users
+
+          4. Relationship between the Foundation Library and other NAG Libraries
+
+          4.1. NAG Fortran Library
+
+          4.2. NAG Workstation Library
+
+          4.3. NAG C Library
+
+          5. Contact between Users and NAG
+
+          6. General Information about NAG
+
+          7. References
+
+
+
+          1. The Library and its Documentation
+
+          1.1. Structure of the Library
+
+          The NAG Foundation Library is a comprehensive collection of
+          Fortran 77 routines for the solution of numerical and statistical
+          problems. The word 'routine' is used to denote 'subroutine' or '
+          function'.
+
+          The Library is divided into chapters, each devoted to a branch of
+          numerical analysis or statistics. Each chapter has a three-
+          character name and a title, e.g.
+
+               D01 -- Quadrature
+
+          Exceptionally one chapter (S) has a one-character name. (The
+          chapters and their names are based on the ACM modified SHARE
+          classification index [1].)
+
+          All documented routines in the Library have six-character names,
+          beginning with the characters of the chapter name, e.g.
+
+               D01AJF
+
+          Note that the second and third characters are digits, not
+          letters; e.g. 0 is the digit zero, not the letter O. The last
+          letter of each routine name is always 'F'.
+
+          1.2. Structure of the Documentation
+
+          There are two types of manual for the NAG Foundation Library: a
+          Handbook and a Reference Manual.
+
+          The Handbook has the same chapter structure as the Library: each
+          chapter of routines in the Library has a corresponding chapter
+          (of the same name) in the Handbook. The chapters occur in
+          alphanumeric order. General introductory documents and indexes
+          are placed at the beginning of the Handbook.
+
+          Each chapter in the Handbook contains a Chapter Introduction,
+          followed by concise summaries of the functionality and parameter
+          specifications of each routine in the chapter. Exceptionally, in
+          some chapters (F06, X01, X02) which contain simple support
+          routines, there are no concise summaries: all the routines are
+          described together in the Chapter Introduction.
+
+          The Reference Manual provides complete reference documentation
+          for the NAG Foundation Library. In the Reference Manual, each
+          chapter consists of the following documents:
+
+               Chapter Introduction, e.g. Introduction -- D01;
+
+               Chapter Contents, e.g. Contents -- D01;
+
+               routine documents, one for each documented routine in the
+               chapter.
+
+          A routine document has the same name as the routine which it
+          describes. Within each chapter, routine documents occur in
+          alphanumeric order. As in the Handbook, chapters F06, X01 and X02
+          do not contain separate documentation for individual routines.
+
+          The general introductory documents, indexes and chapter
+          introductions are the same in the Reference Manual as in the
+          Handbook. The only exception is that the Essential Introduction
+          contains a different Section 3 in the two publications, to
+          describe the different forms of routine documentation.
+
+          1.3. On-line Documentation
+
+          Extensive on-line documentation is included as an integral part
+          of the Foundation Library product. This consists of a number of
+          components:
+
+               -- general introductory material, including the Essential
+               Introduction
+
+               -- a summary list of all documented routines
+
+               -- a KWIC Index
+
+               -- Chapter Introductions
+
+               -- routine documents
+
+               -- example programs, data and results.
+
+          The material has been derived in a number of forms to cater for
+          different user requirements, e.g. UNIX man pages, plain text,
+          RICH TEXT format etc, and the appropriate version is included on
+          the distribution media. For each implementation of the Foundation
+          Library the specific documentation (Installers' Note, Users' Note
+          etc) gives details of what is provided.
+
+          1.4. Implementations of the Library
+
+          The NAG Foundation Library is available on many different
+          computer systems. For each distinct system, an implementation of
+          the Library is prepared by NAG, e.g. the IBM RISC System/6000
+          implementation. The implementation is distributed as a tested
+          compiled library.
+
+          An implementation is usually specific to a range of machines; it
+          may also be specific to a particular operating system or
+          compilation system.
+
+          Essentially the same facilities are provided in all
+          implementations of the Library, but, because of differences in
+          arithmetic behaviour and in the compilation system, routines
+          cannot be expected to give identical results on different
+          systems, especially for sensitive numerical problems.
+
+          The documentation supports all implementations of the Library,
+          with the help of a few simple conventions, and a small amount of
+          implementation-dependent information, which is published in a
+          separate Users' Note for each implementation (see Section 3.4).
+
+          1.5. Library Identification
+
+          You must know which implementation of the Library you are using
+          or intend to use. To find out which implementation of the Library
+          is available on your machine, you can run a program which calls
+          the NAG Foundation Library routine A00AAF. This routine has no
+          parameters; it simply outputs text to the advisory message unit
+          (see Section 2.4). An example of the output is:
+
+
+          *** Start of NAG Foundation Library implementation details ***
+          Implementation title: IBM RISC System/6000
+          Precision: FORTRAN double precision
+          Product Code: FFIB601D
+          Release: 1
+          *** End of NAG Foundation Library implementation details ***
+
+          (The product code can be ignored, except possibly when
+          communicating with NAG; see Section 4.)
+
+          1.6. Fortran Language Standards
+
+          All routines in the Library conform to ANSI Standard Fortran 90
+          [8].
+
+          Most of the routines in the Library were originally written to
+          conform to the earlier Fortran 66 [6] and Fortran 77 [7]
+          standards, and their calling sequences contain some parameters
+          which are not strictly necessary in Fortran 90.
+
+          2. Using the Library
+
+          2.1. General Advice
+
+          A NAG Foundation Library routine cannot be guaranteed to return
+          meaningful results, irrespective of the data supplied to it. Care
+          and thought must be exercised in:
+
+          (a) formulating the problem;
+
+          (b) programming the use of library routines;
+
+          (c) assessing the significance of the results.
+
+          2.2. Programming Advice
+
+          The NAG Foundation Library and its documentation are designed on
+          the assumption that users know how to write a calling program in
+          Fortran.
+
+          When programming a call to a routine, read the routine document
+          carefully, especially the description of the Parameters. This
+          states clearly which parameters must have values assigned to them
+          on entry to the routine, and which return useful values on exit.
+          See Section 3.3 for further guidance.
+
+          If a call to a Library routine results in an unexpected error
+          message from the system (or possibly from within the Library),
+          check the following:
+
+
+              Has the NAG routine been called with the correct number of
+              parameters?
+
+              Do the parameters all have the correct type?
+
+              Have all array parameters been dimensioned correctly?
+
+          Remember that all floating-point parameters must be declared to
+          be double precision, either with an explicit DOUBLE PRECISION
+          declaration (or COMPLEX(KIND(1.0D0)) if they are complex), or by
+          using a suitable IMPLICIT statement.
+
+          Avoid the use of NAG-type names for your own program units or
+          COMMON blocks: in general, do not use names which contain a
+          three-character NAG chapter name embedded in them; they may clash
+          with the names of an auxiliary routine or COMMON block used by
+          the NAG Library.
+
+          2.3. Error handling and the Parameter IFAIL
+
+          NAG Foundation Library routines may detect various kinds of
+          error, failure or warning conditions. Such conditions are handled
+          in a systematic way by the Library. They fall roughly into three
+          classes:
+
+          (i)   an invalid value of a parameter on entry to a routine;
+
+          (ii)  a numerical failure during computation (e.g. approximate
+                singularity of a matrix, failure of an iteration to
+                converge);
+
+          (iii) a warning that although the computation has been completed,
+                the results cannot be guaranteed to be completely reliable.
+
+          All three classes are handled in the same way by the Library, and
+          are all referred to here simply as 'errors'.
+
+          The error-handling mechanism uses the parameter IFAIL, which is
+          the last parameter in the calling sequence of most NAG Foundation
+          Library routines. IFAIL serves two purposes:
+
+          (i)   it allows users to specify what action a Library routine
+                should take if it detects an error;
+
+          (ii)  it reports the outcome of a call to a Library routine,
+                either success (IFAIL = 0) or failure (IFAIL /= 0, with
+                different values indicating different reasons for the
+                failure, as explained in Section 6 of the routine document)
+                .
+
+          For the first purpose IFAIL must be assigned a value before
+          calling the routine; since IFAIL is reset by the routine, it must
+          be passed as a variable, not as an integer constant. Allowed
+          values on entry are:
+
+              IFAIL=0: an error message is output, and execution is
+              terminated ('hard failure');
+
+              IFAIL=+1: execution continues without any error message;
+
+              IFAIL=-1: an error message is output, and execution
+              continues.
+
+          The settings IFAIL =+-1 are referred to as 'soft failure'.
+          The safest choice is to set IFAIL to 0, but this is not always
+          convenient: some routines return useful results even though a
+          failure (in some cases merely a warning) is indicated. However,
+          if IFAIL is set to +- 1 on entry, it is essential for the program
+          to test its value on exit from the routine, and to take
+          appropriate action.
+
+          The specification of IFAIL in Section 5 of a routine document
+          suggests a suitable setting of IFAIL for that routine.
+
+          2.4. Input/output in the Library
+
+          Most NAG Foundation Library routines perform no output to an
+          external file, except possibly to output an error message. All
+          error messages are written to a logical error message unit. This
+          unit number (which is set by default to 6 in most
+          implementations) can be changed by calling the Library routine
+          X04AAF.
+
+          Some NAG Foundation Library routines may optionally output their
+          final results, or intermediate results to monitor the course of
+          computation. All output other than error messages is written to a
+          logical advisory message unit. This unit number (which is also
+          set by default to 6 in most implementations) can be changed by
+          calling the Library routine X04ABF. Although it is logically
+          distinct from the error message unit, in practice the two unit
+          numbers may be the same.
+
+          All output from the Library is formatted.
+
+          The only Library routines which perform input from an external
+          file are a few 'option-setting' routines in Chapter E04: the unit
+          number is a parameter to the routine, and all input is formatted.
+
+          You must ensure that the relevant Fortran unit numbers are
+          associated with the desired external files, either by an OPEN
+          statement in your calling program, or by operating system
+          commands.
+
+          2.5. Auxiliary Routines
+
+          In addition to those Library routines which are documented and
+          are intended to be called by users, the Library also contains
+          many auxiliary routines.
+
+          In general, you need not be concerned with them at all, although
+          you may be made aware of their existence if, for example, you
+          examine a memory map of an executable program which calls NAG
+          routines. The only exception is that when calling some NAG
+          Foundation Library routines, you may be required or allowed to
+          supply the name of an auxiliary routine from the Library as an
+          external procedure parameter. The routine documents give the
+          necessary details. In such cases, you only need to supply the
+          name of the routine; you never need to know details of its
+          parameter-list.
+
+          NAG auxiliary routines have names which are similar to the name
+          of the documented routine(s) to which they are related, but with
+          last letter 'Z', 'Y', and so on, e.g. D01AJZ is an auxiliary
+          routine called by D01AJF.
+
+          3. Using the Reference Manual
+
+          3.1. General Guidance
+
+          The Reference Manual is designed to serve the following
+          functions:
+
+              -- to give background information about different areas of
+              numerical and statistical computation;
+
+              -- to advise on the choice of the most suitable NAG
+              Foundation Library routine or routines to solve a particular
+              problem;
+
+              -- to give all the information needed to call a NAG
+              Foundation Library routine correctly from a Fortran program,
+              and to assess the results.
+
+          At the beginning of the Manual are some general introductory
+          documents. The following may help you to find the chapter, and
+          possibly the routine, which you need to solve your problem:
+
+              Contents     -- a list of routines in the Library, by
+              Summary      chapter;
+
+              KWIC Index   -- a keyword index to chapters and routines.
+
+          Having found a likely chapter or routine, you should read the
+          corresponding Chapter Introduction, which gives background
+          information about that area of numerical computation, and
+          recommendations on the choice of a routine, including indexes,
+          tables or decision trees.
+
+          When you have chosen a routine, you must consult the routine
+          document. Each routine document is essentially self-contained (it
+          may contain references to related documents). It includes a
+          description of the method, detailed specifications of each
+          parameter, explanations of each error exit, and remarks on
+          accuracy.
+
+          Example programs which illustrate the use of each routine are
+          distributed with the Library in machine-readable form.
+
+          3.2. Structure of Routine Documents
+
+          All routine documents have the same structure, consisting of nine
+          numbered sections:
+
+               1.  Purpose
+
+               2.  Specification
+
+               3.  Description
+
+               4.  References
+
+               5.  Parameters (see Section 3.3 below)
+
+               6.  Error Indicators
+
+               7.  Accuracy
+
+               8.  Further Comments
+
+               9.  Example (see Section 3.5 below)
+
+          In a few documents, Section 5 also includes a description of
+          printed output which may optionally be produced by the routine.
+
+          3.3. Specifications of Parameters
+
+          Section 5 of each routine document contains the specification of
+          the parameters, in the order of their appearance in the parameter
+          list.
+
+          3.3.1.  Classification of Parameters
+
+          Parameters are classified as follows:
+
+          Input : you must assign values to these parameters on or before
+          entry to the routine, and these values are unchanged on exit from
+          the routine.
+
+          Output : you need not assign values to these parameters on or
+          before entry to the routine; the routine may assign values to
+          them.
+
+          Input/Output : you must assign values to these parameters on or
+          before entry to the routine, and the routine may then change
+          these values.
+
+          Workspace: array parameters which are used as workspace by the
+          routine. You must supply arrays of the correct type and
+          dimension, but you need not be concerned with their contents.
+
+          External Procedure: a subroutine or function which must be
+          supplied (e.g. to evaluate an integrand or to print intermediate
+          output). Usually it must be supplied as part of your calling
+          program, in which case its specification includes full details of
+          its parameter-list and specifications of its parameters (all
+          enclosed in a box). Its parameters are classified in the same way
+          as those of the Library routine, but because you must write the
+          procedure rather than call it, the significance of the
+          classification is different:
+
+              Input : values may be supplied on entry, which your procedure
+              must not change.
+
+              Output : you may or must assign values to these parameters
+              before exit from your procedure.
+
+              Input/Output : values may be supplied on entry, and you may
+              or must assign values to them before exit from your
+              procedure.
+
+          Occasionally, as mentioned in Section 2.5, the procedure can be
+          supplied from the NAG Library, and then you only need to know its
+          name.
+
+          User Workspace: array parameters which are passed by the Library
+          routine to an external procedure parameter. They are not used by
+          the routine, but you may use them to pass information between
+          your calling program and the external procedure.
+
+          3.3.2.  Constraints and Suggested Values
+
+          The word 'Constraint:' or 'Constraints:' in the specification of
+          an Input parameter introduces a statement of the range of valid
+          values for that parameter, e.g.
+
+              Constraint: N > 0.
+
+          If the routine is called with an invalid value for the parameter
+          (e.g. N = 0), the routine will usually take an error exit,
+          returning a non-zero value of IFAIL (see Section 2.3).
+
+          In newer documents constraints on parameters of type CHARACTER
+          only list uppercase alphabetic characters, e.g.
+
+              Constraint: STRING = 'A' or 'B'.
+
+          In practice all routines with CHARACTER parameters will permit
+          the use of lower case characters.
+
+          The phrase 'Suggested Value:' introduces a suggestion for a
+          reasonable initial setting for an Input parameter (e.g. accuracy
+          or maximum number of iterations) in case you are unsure what
+          value to use; you should be prepared to use a different setting
+          if the suggested value turns out to be unsuitable for your
+          problem.
+
+          3.3.3.  Array Parameters
+
+          Most array parameters have dimensions which depend on the size of
+          the problem. In Fortran terminology they have 'adjustable
+          dimensions': the dimensions occurring in their declarations are
+          integer variables which are also parameters of the Library
+          routine.
+
+          For example, a Library routine might have the specification:
+
+
+               SUBROUTINE <name> (M, N, A, B, LDB)
+               INTEGER       M, N, A(N), B(LDB,N), LDB
+
+          For a one-dimensional array parameter, such as A in this example,
+          the specification would begin:
+
+           3:  A(N) -- DOUBLE PRECISION array                         Input
+
+          You must ensure that the dimension of the array, as declared in
+          your calling (sub)program, is at least as large as the value you
+          supply for N. It may be larger; but the routine uses only the
+          first N elements.
+
+          For a two-dimensional array parameter, such as B in the example,
+          the specification might be:
+
+           4:  B(LDB,N) -- DOUBLE PRECISION array              Input/Output
+               On entry: the m by n matrix B.
+
+          and the parameter LDB might be described as follows:
+
+           5:  LDB -- INTEGER                                         Input
+               On entry: the first dimension of the array B as declared in
+               the (sub)program from which <name> is called. Constraint:
+               LDB >= M.
+
+          You must supply the first dimension of the array B, as declared
+          in your calling (sub)program, through the parameter LDB, even
+          though the number of rows actually used by the routine is
+          determined by the parameter M. You must ensure that the first
+          dimension of the array is at least as large as the value you
+          supply for M. The extra parameter LDB is needed because Fortran
+          does not allow information about the dimensions of array
+          parameters to be passed automatically to a routine.
+
+          You must also ensure that the second dimension of the array, as
+          declared in your calling (sub)program, is at least as large as
+          the value you supply for N. It may be larger, but the routine
+          only uses the first N columns.
+
+          A program to call the hypothetical routine used as an example in
+          this section might include the statements:
+
+
+               INTEGER AA(100), BB(100,50)
+               LDB = 100
+               .
+               .
+               .
+               M = 80
+               N = 20
+               CALL <name>(M,N,AA,BB,LDB)
+
+          Fortran requires that the dimensions which occur in array
+          declarations, must be greater than zero. Many NAG routines are
+          designed so that they can be called with a parameter like N in
+          the above example set to 0 (in which case they would usually exit
+          immediately without doing anything). If so, the declarations in
+          the Library routine would use the 'assumed size' array dimension,
+          and would be given as:
+
+
+               INTEGER        M, N, A(*), B(LDB,*), LDB
+
+          However, the original declaration of an array in your calling
+          program must always have constant dimensions, greater than or
+          equal to 1.
+
+          Consult an expert or a textbook on Fortran, if you have
+          difficulty in calling NAG routines with array parameters.
+
+          3.4. Implementation-dependent Information
+
+          In order to support all implementations of the Foundation
+          Library, the Manual has adopted a convention of using bold
+          italics to distinguish terms which have different interpretations
+          in different implementations.
+
+          For example, machine precision denotes the relative precision to
+          which double precision floating-point numbers are stored in the
+          computer, e.g. in an implementation with approximately 16 decimal
+          digits of precision, machine precision has a value of
+                          - 16
+          approximately 10    .
+
+          The precise value of machine precision is given by the function
+          X02AJF. Other functions in Chapter X02 return the values of other
+          implementation-dependent constants, such as the overflow
+          threshold, or the largest representable integer. Refer to the X02
+
+          Chapter Introduction for more details.
+
+          For each implementation of the Library, a separate Users' Note is
+          provided. This is a short document, revised at each Mark. At most
+          installations it is available in machine-readable form. It gives
+          any necessary additional information which applies specifically
+          to that implementation, in particular:
+
+              -- the interpretation of bold italicised terms;
+
+              -- the values returned by X02 routines;
+
+              -- the default unit numbers for output (see Section 2.4).
+
+          3.5. Example Programs and Results
+
+          The last section of each routine document describes an example
+          problem which can be solved by simple use of the routine. The
+          example programs themselves, together with data and results, are
+          not printed in the routine document, but are distributed in
+          machine-readable form with the Library. The programs are designed
+          so that they can fairly easily be modified, and so serve as the
+          basis for a simple program to solve a user's own problem.
+
+          The results distributed with each implementation were obtained
+          using that implementation of the Library; they may not be
+          identical to the results obtained with other implementations.
+
+          3.6. Summary for New Users
+
+          If you are unfamiliar with the NAG Foundation Library and are
+          thinking of using a routine from it, please follow these
+          instructions:
+
+          (a) read the whole of the Essential Introduction;
+
+          (b) consult the Contents Summary or KWIC Index to choose an
+              appropriate chapter or routine;
+
+          (c) read the relevant Chapter Introduction;
+
+          (d) choose a routine, and read the routine document. If the
+              routine does not after all meet your needs, return to steps
+              (b) or (c);
+
+          (e) read the Users' Note for your implementation;
+
+          (f) consult local documentation, which should be provided by your
+              local support staff, about access to the NAG Library on your
+              computing system.
+
+          You should now be in a position to include a call to the routine
+          in a program, and to attempt to run it. You may of course need to
+          refer back to the relevant documentation in the case of
+          difficulties, for advice on assessment of results, and so on.
+
+          As you become familiar with the Library, some of steps (a) to (f)
+          can be omitted, but it is always essential to:
+
+              -- be familiar with the Chapter Introduction;
+
+              -- read the routine document;
+
+              -- be aware of the Users' Note for your implementation.
+
+          4. Relationship between the Foundation Library and other NAG Libraries
+
+          4.1. NAG Fortran Library
+
+          The Foundation Library is a strict subset of the full NAG Fortran
+          Library (Mark 15 or later). Routines in both libraries have
+          identical source code (apart from any modifications necessary for
+          implementation on a specific system) and hence can be called in
+          exactly the same way, though you should consult the relevant
+          implementation-specific documentation for details such as values
+          of machine constants.
+
+          By its very nature, the Foundation Library cannot contain the
+          same extensive range of routines as the full Fortran Library. If
+          your application requires a routine which is not in the
+          Foundation Library, then please consult NAG for information on
+          relevant material available in the Fortran Library.
+
+          Some routines which occur as user-callable routines in the full
+          Fortran Library are included as auxiliary routines in the
+          Foundation Library but they are not documented in this
+          publication and direct calls to them should only be made if you
+          are already familiar with their use in the Fortran Library. A
+          list of all such auxiliary routines is given at the end of the
+          Foundation Library Contents Summary.
+
+          Whereas the full Fortran Library may be provided in either a
+          single precision or a double precision version, the Foundation
+          Library is always provided in double precision.
+
+          4.2. NAG Workstation Library
+
+          The Foundation Library is a successor product to an earlier,
+          smaller subset of the full NAG Fortran Library which was called
+          the NAG Workstation Library. The Foundation Library has greater
+          functionality than the Workstation Library but is not strictly
+          upwards compatible, i.e., a number of routines in the earlier
+          product have been replaced by new material to reflect recent
+          algorithmic developments.
+          If you have used the Workstation Library and wish to convert your
+          programs to call routines from the Foundation Library, please
+          consult the document 'Converting from the Workstation Library' in
+          this Manual.
+
+          4.3. NAG C Library
+
+          NAG has also developed a library of numerical and statistical
+          software for use by C programmers. This now contains over 200
+          user-callable functions and provides similar (but not identical)
+          coverage to that of the Foundation Library. Please contact NAG
+          for further details if you have a requirement for similar quality
+          library code in C.
+
+          5. Contact between Users and NAG
+
+          If you are using the NAG Foundation Library in a multi-user
+          environment and require further advice please consult your local
+          support staff who will be receiving regular information from NAG.
+          This covers such matters as:
+
+               -- obtaining a copy of the Users' Note for your
+               implementation;
+
+               -- obtaining information about local access to the Library;
+
+               -- seeking advice about using the Library;
+
+               -- reporting suspected errors in routines or documents;
+
+               -- making suggestions for new routines or features;
+
+               -- purchasing NAG documentation.
+
+          If you are unable to make contact with a local source of support
+          or are in a single-user environment then please contact NAG
+          directly at any one of the addresses given at the beginning of
+          this publication.
+
+          6. General Information about NAG
+
+          NAG produces and distributes numerical, symbolic, statistical and
+          graphical software for the solution of problems in a wide range
+          of applications in such areas as science, engineering, financial
+          analysis and research.
+
+          For users who write programs and build packages NAG produces sub-
+          program libraries in a range of computer languages (Ada, C,
+          Fortran, Pascal, Turbo Pascal). NAG also provides a number of
+          Fortran programming support products in the NAGWare range --
+          Fortran 77 programming tools, Fortran 90 compilers for a number
+          of machine platforms (including PC-DOS) and VecPar 77 for
+          restructuring and tuning programs for execution on vector or
+          parallel computers.
+
+          For users who do not wish to program in the traditional sense but
+          want the same reliability and qualities offered by our libraries,
+          NAG provides several powerful mathematical and statistical
+          packages for interactive use. A major addition to this range of
+          packages is AXIOM -- the powerful symbolic solver which includes
+          a Hypertext system and graphical capabilities.
+
+          For further details of any of these products, please contact NAG
+          at one of the addresses given at the beginning of this
+          publication.
+
+          References [2], [3], [4], and [5] discuss various aspects of the
+          design and development of the NAG Library, and NAG's technical
+          policies and organisation.
+
+          7. References
+
+          [1]   (1960--1976) Collected Algorithms from ACM Index by subject
+                to algorithms.
+
+          [2]   Ford B (1982) Transportable Numerical Software. Lecture
+                Notes in Computer Science. 142 128--140.
+
+          [3]   Ford B, Bentley J, Du Croz J J and Hague S J (1979) The NAG
+                Library 'machine'. Software Practice and Experience. 9(1)
+                65--72.
+
+          [4]   Ford B and Pool J C T (1984) The Evolving NAG Library
+                Service. Sources and Development of Mathematical Software.
+                (ed W Cowell) Prentice-Hall. 375--397.
+
+          [5]   Hague S J, Nugent S M and Ford B (1982) Computer-based
+                Documentation for the NAG Library. Lecture Notes in Computer
+                Science. 142 91--127.
+
+          [6]   (1966) USA Standard Fortran. Publication X3.9. American
+                National Standards Institute.
+
+          [7]   (1978) American National Standard Fortran. Publication X3.9.
+                American National Standards Institute.
+
+          [8]   (1991) American National Standard Programming Language
+                Fortran 90. Publication X3.198.
+                American National Standards Institute.
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\subsection{NAG Documentation: keyword in context}
+\label{manpageXXkwic}
+\index{pages!manpageXXkwic!nagaux.ht}
+\index{nagaux.ht!pages!manpageXXkwic}
+\index{manpageXXkwic!nagaux.ht!pages}
+<<nagaux.ht>>=
+\begin{page}{manpageXXkwic}{NAG Documentation: keyword in context}
+\beginscroll
+\begin{verbatim}
+
+
+
+     KWIC(3NAG)        Foundation Library (12/10/92)        KWIC(3NAG)
+
+
+
+          Introduction                                  Keywords in Context
+          Keywords in Context
+
+          Pre-computed weights and                                 D01BBF
+          abscissae
+          for Gaussian quadrature rules, restricted choice of ...
+
+          Sum the                                                  F06EKF
+          absolute
+          values of real vector elements (DASUM)
+
+          Sum the                                                  F06JKF
+          absolute
+          values of complex vector elements (DZASUM)
+
+          Index, real vector element with largest                  F06JLF
+          absolute
+          value (IDAMAX)
+
+          Index, complex vector element with largest               F06JMF
+          absolute
+          value (IZAMAX)
+
+          ODEs, IVP,                                               D02CJF
+          Adams
+          method, until function of solution is zero, ...
+
+          1-D quadrature,                                          D01AJF
+          adaptive
+          , finite interval, strategy due to Piessens and de ...
+
+          1-D quadrature,                                          D01AKF
+          adaptive
+          , finite interval, method suitable for oscillating ...
+
+          1-D quadrature,                                          D01ALF
+          adaptive
+          , finite interval, allowing for singularities at ...
+
+          1-D quadrature,                                          D01AMF
+          adaptive
+          , infinite or semi-infinite interval
+
+          1-D quadrature,                                          D01ANF
+          adaptive
+          , finite interval, weight function cos((omega)x) ...
+
+          1-D quadrature,                                          D01APF
+          adaptive
+          , finite interval, weight function with end-point ...
+
+          1-D quadrature,                                          D01AQF
+          adaptive
+          , finite interval, weight function 1/(x-c), ...
+
+          1-D quadrature,                                          D01ASF
+          adaptive
+          , semi-infinite interval, weight function cos((omega)x)
+
+          Multi-dimensional                                        D01FCF
+          adaptive
+          quadrature over hyper-rectangle
+
+          Add                                                      F06ECF
+          scalar times real vector to real vector (DAXPY)
+
+          Add                                                      F06GCF
+          scalar times complex vector to complex vector (ZAXPY)
+
+          Return or set unit number for                            X04ABF
+          advisory
+          messages
+
+          Airy                                                     S17AGF
+          function Ai(x)
+
+          Airy                                                     S17AHF
+          function Bi(x)
+
+          Airy                                                     S17AJF
+          function Ai'(x)
+
+          Airy                                                     S17AKF
+          function Bi'(x)
+
+          Airy                                                     S17DGF
+          functions Ai(z) and Ai('z), complex z
+
+          Airy                                                     S17DHF
+          functions Bi(z) and Bi'(z), complex z
+
+          Airy function                                            S17AGF
+          Ai(x)
+
+          Airy function                                            S17AJF
+          Ai'(x)
+
+          Airy functions                                           S17DGF
+          Ai(z)
+          and Ai'(z), complex z
+
+          Airy functions Ai(z) and                                 S17DGF
+          Ai'(z)
+          , complex z
+          algebraico-logarithmic
+          type
+
+          Two-way contingency table                                G01AFF
+          analysis
+                      2
+          , with (chi) /Fisher's exact test
+
+          Performs principal component                             G03AAF
+          analysis
+
+          Performs canonical correlation                           G03ADF
+          analysis
+
+          Friedman two-way                                         G08AEF
+          analysis
+          of variance on k matched samples
+
+          Kruskal-Wallis one-way                                   G08AFF
+          analysis
+          of variance on k samples of unequal size
+
+          L -                                                      E02GAF
+           1
+          approximation
+          by general linear function
+
+          Approximation                                            E02
+
+          Approximation                                            S
+          of special functions
+
+          ARIMA
+          model
+
+          Univariate time series, estimation, seasonal             G13AFF
+          ARIMA
+          model
+
+          ARIMA
+          model
+
+          ARIMA
+          model
+
+          Safe range of floating-point                             X02AMF
+          arithmetic
+
+          Safe range of complex floating-point                     X02ANF
+          arithmetic
+
+          Parameter of floating-point                              X02BHF
+          arithmetic
+          model, b
+
+          Parameter of floating-point                              X02BJF
+          arithmetic
+          model, p
+
+          Parameter of floating-point                              X02BKF
+          arithmetic
+          model, e
+                  min
+
+          Parameter of floating-point                              X02BLF
+          arithmetic
+          model, e
+                  max
+
+          Parameter of floating-point                              X02DJF
+          arithmetic
+          model, ROUNDS
+
+          Univariate time series, sample                           G13ABF
+          autocorrelation
+          function
+
+          Univariate time series, partial                          G13ACF
+          autocorrelations
+          from autocorrelations
+
+          Univariate time series, partial autocorrelations from    G13ACF
+          autocorrelations
+
+          Least-squares cubic spline curve fit,                    E02BEF
+          automatic
+          knot placement
+
+          Least-squares surface fit by bicubic splines with        E02DCF
+          automatic
+          knot placement, data on rectangular grid
+
+          Least-squares surface fit by bicubic splines with        E02DDF
+          automatic
+          knot placement, scattered data
+
+          B-splines                                                E02
+
+          Matrix-vector product, real rectangular                  F06PBF
+          band
+          matrix (DGBMV)
+
+          Matrix-vector product, real symmetric                    F06PDF
+          band
+          matrix (DSBMV)
+
+          Matrix-vector product, real triangular                   F06PGF
+          band
+          matrix (DTBMV)
+
+          System of equations, real triangular                     F06PKF
+          band
+          matrix (DTBSV)
+
+          Matrix-vector product, complex rectangular               F06SBF
+          band
+          matrix (ZGBMV)
+
+          Matrix-vector product, complex Hermitian                 F06SDF
+          band
+          matrix (ZHBMV)
+
+          Matrix-vector product, complex triangular                F06SGF
+          band
+          matrix (ZTBMV)
+
+          System of equations, complex triangular                  F06SKF
+          band
+          matrix (ZTBSV)
+
+          bandwidth
+          matrix
+
+          Solution of real symmetric positive-definite variable-   F04MCF
+          bandwidth
+          simultaneous linear equations (coefficient matrix ...
+
+          Basic                                                    F06
+          Linear Algebra Subprograms
+
+          ODEs, stiff IVP,                                         D02EJF
+          BDF
+          method, until function of solution is zero,
+          intermediate ...
+
+          Kelvin function                                          S19ABF
+          bei
+          x
+
+          Kelvin function                                          S19AAF
+          ber
+          x
+
+          Bessel                                                   S17ACF
+          function Y (x)
+                    0
+
+          Bessel                                                   S17ADF
+          function Y (x)
+                    1
+
+          Bessel                                                   S17AEF
+          function J (x)
+                    0
+
+          Bessel                                                   S17AFF
+          function J (x)
+                    1
+
+          Bessel                                                   S17DCF
+          functions Y      (z), complex z, real (nu)>=0, ...
+                     (nu)+n
+
+          Bessel                                                   S17DEF
+          functions J      (z), complex z, real (nu)>=0, ...
+                     (nu)+n
+
+          Modified                                                 S18ACF
+          Bessel
+          function K (x)
+                    0
+
+          Modified                                                 S18ADF
+          Bessel
+          function K (x)
+                    1
+
+          Modified                                                 S18AEF
+          Bessel
+          function I (x)
+                    0
+
+          Modified                                                 S18AFF
+          Bessel
+          function I (x)
+                    1
+
+          Modified                                                 S18DCF
+          Bessel
+          functions K      (z), complex z, real (nu)>=0, ...
+                     (nu)+n
+
+          Modified                                                 S18DEF
+          Bessel
+          functions I      (z), complex z, real (nu)>=0, ...
+                     (nu)+n
+
+          beta
+          distribution
+
+          Computes deviates for the                                G01FEF
+          beta
+          distribution
+
+          Generates a vector of pseudo-random numbers from a       G05FEF
+          beta
+          distribution
+
+          Interpolating functions, fitting                         E01DAF
+          bicubic
+          spline, data on rectangular grid
+
+          Least-squares surface fit,                               E02DAF
+          bicubic
+          splines
+
+          Least-squares surface fit by                             E02DCF
+          bicubic
+          splines with automatic knot placement, data on ...
+
+          Least-squares surface fit by                             E02DDF
+          bicubic
+          splines with automatic knot placement, scattered data
+
+          Evaluation of a fitted                                   E02DEF
+          bicubic
+          spline at a vector of points
+
+          Evaluation of a fitted                                   E02DFF
+          bicubic
+          spline at a mesh of points
+
+          Sort 2-D data into panels for fitting                    E02ZAF
+          bicubic
+          splines
+
+          Fits a generalized linear model with                     G02GBF
+          binomial
+          errors
+
+          binomial
+          distribution
+
+          Computes probability for the                             G01HAF
+          bivariate
+          Normal distribution
+
+          Airy function                                            S17AHF
+          Bi(x)
+
+          Airy function                                            S17AKF
+          Bi'(x)
+
+          Airy functions                                           S17DHF
+          Bi(z)
+          and Bi'(z), complex z
+
+          Airy functions Bi(z) and                                 S17DHF
+          Bi'(z)
+          , complex z
+
+          BLAS                                                     F06
+
+          Pseudo-random logical                                    G05DZF
+          (boolean)
+          value
+
+          ODEs,                                                    D02GAF
+          boundary
+          value problem, finite difference technique with ...
+
+          ODEs,                                                    D02GBF
+          boundary
+          value problem, finite difference technique with ...
+
+          ODEs, general nonlinear                                  D02RAF
+          boundary
+          value problem, finite difference technique with ...
+
+          bounds
+          , using function values only
+
+          break-points
+
+          break-points
+
+          Zero of continuous function in given interval,           C05ADF
+          Bus
+          and Dekker algorithm
+
+          Performs                                                 G03ADF
+          canonical
+          correlation analysis
+
+          Carlo
+          method
+
+          Elliptic PDE, Helmholtz equation, 3-D                    D03FAF
+          Cartesian
+          co-ordinates
+
+          Cauchy
+          principal value (Hilbert transform)
+
+          Pseudo-random real numbers,                              G05DFF
+
+          Cauchy
+          distribution
+
+          character
+          string
+
+          Compare two                                              X05ACF
+          character
+          strings representing date and time
+
+          Evaluation of fitted polynomial in one variable from     E02AEF
+          Chebyshev
+          series form (simplified parameter list)
+
+          Derivative of fitted polynomial in                       E02AHF
+          Chebyshev
+          series form
+
+          Integral of fitted polynomial in                         E02AJF
+          Chebyshev
+          series form
+
+          Evaluation of fitted polynomial in one variable, from    E02AKF
+          Chebyshev
+          series form
+
+          Check                                                    C05ZAF
+          user's routine for calculating 1st derivatives
+
+          Univariate time series, diagnostic                       G13ASF
+          checking
+          of residuals, following G13AFF
+
+          Cholesky                                                 F07FDF
+          factorization of real symmetric positive-definite ...
+
+          Circular                                                 C06EKF
+          convolution or correlation of two real vectors, no ...
+
+          Cosine integral                                          S13ACF
+          Ci(x)
+
+          Interpolating functions, method of Renka and             E01SAF
+          Cline
+          , two variables
+
+          Elliptic PDE, Helmholtz equation, 3-D Cartesian          D03FAF
+          co-ordinates
+
+          coefficient
+          matrix already factorized by F01MCF)
+
+          coefficient
+          matrix (DTRSM)
+
+          coefficient
+          matrix (ZTRSM)
+
+          Kendall/Spearman non-parametric rank correlation         G02BNF
+          coefficients
+          , no missing values, overwriting input data
+
+          Kendall/Spearman non-parametric rank correlation         G02BQF
+          coefficients
+          , no missing values, preserving input data
+
+          Operations with orthogonal matrices, form                F01QEF
+          columns
+          of Q after factorization by F01QCF
+
+          Operations with unitary matrices, form                   F01REF
+          columns
+          of Q after factorization by F01RCF
+
+          Rank                                                     M01DJF
+          columns
+          of a matrix, real numbers
+
+          Compare                                                  X05ACF
+          two character strings representing date and time
+
+          Complement                                               S15ADF
+          of error function erfcx
+
+          Unconstrained minimum, pre-                              E04DGF
+          conditioned
+          conjugate gradient algorithm, function of several ...
+
+          Complex                                                  C06GBF
+          conjugate
+          of Hermitian sequence
+
+          Complex                                                  C06GCF
+          conjugate
+          of complex sequence
+
+          Complex                                                  C06GQF
+          conjugate
+          of multiple Hermitian sequences
+
+          Unconstrained minimum, pre-conditioned                   E04DGF
+          conjugate
+          gradient algorithm, function of several variables ...
+
+          Dot product of two complex vectors,                      F06GBF
+          conjugated
+          (ZDOTC)
+
+          Rank-1 update, complex rectangular matrix,               F06SNF
+          conjugated
+          vector (ZGERC)
+
+          Mathematical                                             X01
+          Constants
+
+          Machine                                                  X02
+          Constants
+
+          constrained
+          , arbitrary data points
+
+          constraints
+          , using function values and optionally 1st ...
+
+          Two-way                                                  G01AFF
+          contingency
+                                    2
+          table analysis, with (chi) /Fisher's ...
+
+          continuation
+          facility
+
+          Zero of                                                  C05ADF
+          continuous
+          function in given interval, Bus and Dekker algorithm
+
+                   2
+          continuous
+          distributions
+
+          Convert                                                  C06GSF
+          Hermitian sequences to general complex sequences
+
+          Convert                                                  X05ABF
+          array of integers representing date and time to ...
+
+          Circular                                                 C06EKF
+          convolution
+          or correlation of two real vectors, no extra ...
+
+          Copy                                                     F06EFF
+          real vector (DCOPY)
+
+          Copy                                                     F06GFF
+          complex vector (ZCOPY)
+
+          correction
+          , simple nonlinear problem
+
+          correction
+          , general linear problem
+
+          correction
+          , continuation facility
+
+          Circular convolution or                                  C06EKF
+          correlation
+          of two real vectors, no extra workspace
+
+          Kendall/Spearman non-parametric rank                     G02BNF
+          correlation
+          coefficients, no missing values, overwriting ...
+
+          Kendall/Spearman non-parametric rank                     G02BQF
+          correlation
+          coefficients, no missing values, preserving input ...
+
+          Computes (optionally weighted)                           G02BXF
+          correlation
+          and covariance matrices
+
+          Performs canonical                                       G03ADF
+          correlation
+          analysis
+
+          Multivariate time series, cross-                         G13BCF
+          correlations
+
+          cos
+          ((omega)x) or sin((omega)x)
+
+          cos
+          ((omega)x) or sin((omega)x)
+
+          Cosine                                                   S13ACF
+          integral Ci(x)
+
+          Covariance                                               E04YCF
+          matrix for nonlinear least-squares problem
+
+          Computes (optionally weighted) correlation and           G02BXF
+          covariance
+          matrices
+
+          Return the                                               X05BAF
+          CPU
+          time
+
+          Multivariate time series,                                G13BCF
+          cross-correlations
+
+          Multivariate time series, smoothed sample                G13CDF
+          cross
+          spectrum using spectral smoothing by the trapezium ...
+
+          Interpolating functions,                                 E01BAF
+          cubic
+          spline interpolant, one variable
+
+          cubic
+          Hermite, one variable
+
+          Least-squares curve                                      E02BAF
+          cubic
+          spline fit (including interpolation)
+
+          Evaluation of fitted                                     E02BBF
+          cubic
+          spline, function only
+
+          Evaluation of fitted                                     E02BCF
+          cubic
+          spline, function and derivatives
+
+          Evaluation of fitted                                     E02BDF
+          cubic
+          spline, definite integral
+
+          Least-squares                                            E02BEF
+          cubic
+          spline curve fit, automatic knot placement
+
+          Set up reference vector from supplied                    G05EXF
+          cumulative
+          distribution function or probability distribution ...
+
+          Least-squares                                            E02ADF
+          curve
+          fit, by polynomials, arbitrary data points
+
+          Least-squares                                            E02BAF
+          curve
+          cubic spline fit (including interpolation)
+
+          Least-squares cubic spline                               E02BEF
+          curve
+          fit, automatic knot placement
+
+          Fresnel integral                                         S20ADF
+          C(x)
+
+          Daniell)
+          window
+
+          Daniell)
+          window
+
+          Return                                                   X05AAF
+          date
+          and time as an array of integers
+
+          Convert array of integers representing                   X05ABF
+          date
+          and time to character string
+
+          Compare two character strings representing               X05ACF
+          date
+          and time
+
+          deferred
+          correction, simple nonlinear problem
+
+          deferred
+          correction, general linear problem
+
+          deferred
+          correction, continuation facility
+
+          Interpolated values, interpolant computed by E01BEF,     E01BHF
+          definite
+          integral, one variable
+
+          Evaluation of fitted cubic spline,                       E02BDF
+          definite
+          integral
+
+          definite
+          matrix
+
+             T
+          LDL  factorization of real symmetric positive-           F01MCF
+          definite
+          variable-bandwidth matrix
+
+          definite
+
+          definite
+
+          Solution of real symmetric positive-                     F04ASF
+          definite
+          simultaneous linear equations, one right-hand side ...
+
+          Solution of real symmetric positive-                     F04FAF
+          definite
+          tridiagonal simultaneous linear equations, one ...
+
+          Real sparse symmetric positive-                          F04MAF
+          definite
+          simultaneous linear equations (coefficient matrix ...
+
+          Solution of real symmetric positive-                     F04MCF
+          definite
+          variable-bandwidth simultaneous linear equations ...
+
+          Cholesky factorization of real symmetric positive-       F07FDF
+          definite
+          matrix (DPOTRF)
+
+          Solution of real symmetric positive-                     F07FEF
+          definite
+          system of linear equations, multiple right-hand ...
+
+          Degenerate                                               S21BAF
+          symmetrised elliptic integral of 1st kind R  ...
+                                                     C
+
+          Dekker
+          algorithm
+
+          Computes upper and lower tail and probability            G01EEF
+          density
+          function probabilities for the beta distribution
+
+          Solution of system of nonlinear equations using 1st      C05PBF
+          derivatives
+
+          Check user's routine for calculating 1st                 C05ZAF
+          derivatives
+
+          derivative
+          , one variable
+
+          Least-squares polynomial fit, values and                 E02AGF
+          derivatives
+          may be constrained, arbitrary data points
+
+          Derivative                                               E02AHF
+          of fitted polynomial in Chebyshev series form
+
+          Evaluation of fitted cubic spline, function and          E02BCF
+          derivatives
+
+          derivatives
+
+          derivatives
+
+          derivatives
+
+          Computes                                                 G01FAF
+          deviates
+          for the standard Normal distribution
+
+          Computes                                                 G01FBF
+          deviates
+          for Student's t-distribution
+
+          Computes                                                 G01FCF
+          deviates
+                       2
+          for the (chi)  distribution
+
+          Computes                                                 G01FDF
+          deviates
+          for the F-distribution
+
+          Computes                                                 G01FEF
+          deviates
+          for the beta distribution
+
+          Computes                                                 G01FFF
+          deviates
+          for the gamma distribution
+
+          Univariate time series,                                  G13ASF
+          diagnostic
+          checking of residuals, following G13AFF
+
+          ODEs, boundary value problem, finite                     D02GAF
+          difference
+          technique with deferred correction, simple ...
+
+          ODEs, boundary value problem, finite                     D02GBF
+          difference
+          technique with deferred correction, general linear ...
+
+          difference
+          technique with deferred correction, continuation ...
+
+          Elliptic PDE, solution of finite                         D03EDF
+          difference
+          equations by a multigrid technique
+
+          Univariate time series, seasonal and non-seasonal        G13AAF
+          differencing
+
+          Single 1-D real                                          C06EAF
+          discrete
+          Fourier transform, no extra workspace
+
+          Single 1-D Hermitian                                     C06EBF
+          discrete
+          Fourier transform, no extra workspace
+
+          Single 1-D complex                                       C06ECF
+          discrete
+          Fourier transform, no extra workspace
+
+          Multiple 1-D real                                        C06FPF
+          discrete
+          Fourier transforms
+
+          Multiple 1-D Hermitian                                   C06FQF
+          discrete
+          Fourier transforms
+
+          Multiple 1-D complex                                     C06FRF
+          discrete
+          Fourier transforms
+
+          2-D complex                                              C06FUF
+          discrete
+          Fourier transform
+
+          Discretize                                               D03EEF
+          a 2nd order elliptic PDE on a rectangle
+
+          Computes probabilities for the standard Normal           G01EAF
+          distribution
+
+          Computes probabilities for Student's t-                  G01EBF
+          distribution
+
+                                          2
+          Computes probabilities for (chi)                         G01ECF
+          distribution
+
+          Computes probabilities for F-                            G01EDF
+          distribution
+
+          distribution
+
+          Computes probabilities for the gamma                     G01EFF
+          distribution
+
+          Computes deviates for the standard Normal                G01FAF
+          distribution
+
+          Computes deviates for Student's t-                       G01FBF
+          distribution
+
+                                         2
+          Computes deviates for the (chi)                          G01FCF
+          distribution
+
+          Computes deviates for the F-                             G01FDF
+          distribution
+
+          Computes deviates for the beta                           G01FEF
+          distribution
+
+          Computes deviates for the gamma                          G01FFF
+          distribution
+
+          Computes probability for the bivariate Normal            G01HAF
+          distribution
+
+          Pseudo-random real numbers, uniform                      G05CAF
+          distribution
+          over (0,1)
+
+          Pseudo-random real numbers, Normal                       G05DDF
+          distribution
+
+          Pseudo-random real numbers, Cauchy                       G05DFF
+          distribution
+
+          Pseudo-random real numbers, Weibull                      G05DPF
+          distribution
+
+          Pseudo-random integer from uniform                       G05DYF
+          distribution
+
+          Set up reference vector for multivariate Normal          G05EAF
+          distribution
+
+          distribution
+
+          distribution
+
+          Set up reference vector from supplied cumulative         G05EXF
+          distribution
+          function or probability distribution function
+
+          distribution
+          function
+
+          Generates a vector of random numbers from a uniform      G05FAF
+          distribution
+
+          distribution
+
+          Generates a vector of random numbers from a Normal       G05FDF
+          distribution
+
+          distribution
+
+          distribution
+
+               2
+          (chi)  goodness of fit test, for standard continuous     G08CGF
+          distributions
+
+          Inverse                                                  G01F
+          distributions
+
+          Doncker
+          , allowing for badly-behaved integrands
+
+          Dot                                                      F06EAF
+          product of two real vectors (DDOT)
+
+          Dot                                                      F06GAF
+          product of two complex vectors, unconjugated (ZDOTU)
+
+          Dot                                                      F06GBF
+          product of two complex vectors, conjugated (ZDOTC)
+
+          eigenfunction
+          , user-specified break-points
+
+          All eigenvalues of generalized real                      F02ADF
+          eigenproblem
+          of the form Ax=(lambda)Bx where A and B are ...
+
+          All eigenvalues and eigenvectors of generalized real     F02AEF
+          eigenproblem
+          of the form Ax=(lambda)Bx where A and B are ...
+
+          eigenproblem
+          by QZ algorithm, real matrices
+
+          eigenproblem
+
+          eigenvalue
+          and eigenfunction, user-specified break-points
+
+          All                                                      F02AAF
+          eigenvalues
+          of real symmetric matrix
+
+          All                                                      F02ABF
+          eigenvalues
+          and eigenvectors of real symmetric matrix
+
+          All                                                      F02ADF
+          eigenvalues
+          of generalized real eigenproblem of the form
+          Ax=(lambda)Bx
+
+          All                                                      F02AEF
+          eigenvalues
+          and eigenvectors of generalized real ...
+
+          All                                                      F02AFF
+          eigenvalues
+          of real matrix
+
+          All                                                      F02AGF
+          eigenvalues
+          and eigenvectors of real matrix
+
+          All                                                      F02AJF
+          eigenvalues
+          of complex matrix
+
+          All                                                      F02AKF
+          eigenvalues
+          and eigenvectors of complex matrix
+
+          All                                                      F02AWF
+          eigenvalues
+          of complex Hermitian matrix
+
+          All                                                      F02AXF
+          eigenvalues
+          and eigenvectors of complex Hermitian matrix
+
+          Selected                                                 F02BBF
+          eigenvalues
+          and eigenvectors of real symmetric matrix
+
+          All                                                      F02BJF
+          eigenvalues
+          and optionally eigenvectors of generalized ...
+
+          Selected                                                 F02FJF
+          eigenvalues
+          and eigenvectors of sparse symmetric eigenproblem
+
+          All eigenvalues and                                      F02ABF
+          eigenvectors
+          of real symmetric matrix
+
+          All eigenvalues and                                      F02AEF
+          eigenvectors
+          of generalized real eigenproblem of the form ...
+
+          All eigenvalues and                                      F02AGF
+          eigenvectors
+          of real matrix
+
+          All eigenvalues and                                      F02AKF
+          eigenvectors
+          of complex matrix
+
+          All eigenvalues and                                      F02AXF
+          eigenvectors
+          of complex Hermitian matrix
+
+          Selected eigenvalues and                                 F02BBF
+          eigenvectors
+          of real symmetric matrix
+
+          All eigenvalues and optionally                           F02BJF
+          eigenvectors
+          of generalized eigenproblem by QZ algorithm, ...
+
+          Selected eigenvalues and                                 F02FJF
+          eigenvectors
+          of sparse symmetric eigenproblem
+
+          Elliptic                                                 D03EDF
+          PDE, solution of finite difference equations by a ...
+
+          Discretize a 2nd order                                   D03EEF
+          elliptic
+          PDE on a rectangle
+
+          Elliptic                                                 D03FAF
+          PDE, Helmholtz equation, 3-D Cartesian co-ordinates
+
+          Degenerate symmetrised                                   S21BAF
+          elliptic
+          integral of 1st kind R (x,y)
+                                C
+
+          Symmetrised                                              S21BBF
+          elliptic
+          integral of 1st kind R (x,y,z)
+                                F
+
+          Symmetrised                                              S21BCF
+          elliptic
+          integral of 2nd kind R (x,y,z)
+                                D
+
+          Symmetrised                                              S21BDF
+          elliptic
+          integral of 3rd kind R (x,y,z,r)
+                                J
+
+          end-point
+          singularities of algebraico-logarithmic type
+
+          error
+
+          Fits a generalized linear model with binomial            G02GBF
+          errors
+
+          Fits a generalized linear model with Poisson             G02GCF
+          errors
+
+          Complement of                                            S15ADF
+          error
+          function erfc x
+
+          Error                                                    S15AEF
+          function erf x
+
+          Return or set unit number for                            X04AAF
+          error
+          messages
+
+          Computes                                                 G02DNF
+          estimable
+          function of a general linear regression model and ...
+
+          Univariate time series, preliminary                      G13ADF
+          estimation
+          , seasonal ARIMA model
+
+          Univariate time series,                                  G13AFF
+          estimation
+          , seasonal ARIMA model
+
+          Multivariate time series, preliminary                    G13BDF
+          estimation
+          of transfer function model
+
+          Multivariate time series,                                G13BEF
+          estimation
+          of multi-input model
+
+          Compute                                                  F06EJF
+          Euclidean
+          norm of real vector (DNRM2)
+
+          Compute                                                  F06JJF
+          Euclidean
+          norm of complex vector (DZNRM2)
+
+          Evaluation                                               E02AEF
+          of fitted polynomial in one variable from ...
+
+          Evaluation                                               E02AKF
+          of fitted polynomial in one variable, from ...
+
+          Evaluation                                               E02BBF
+          of fitted cubic spline, function only
+
+          Evaluation                                               E02BCF
+          of fitted cubic spline, function and derivatives
+
+          Evaluation                                               E02BDF
+          of fitted cubic spline, definite integral
+
+          Evaluation                                               E02DEF
+          of a fitted bicubic spline at a vector of points
+
+          Evaluation                                               E02DFF
+          of a fitted bicubic spline at a mesh of points
+
+                                        2
+          exact
+          test
+
+          Computes the                                             G08AJF
+          exact
+          probabilities for the Mann-Whitney U statistic, no ...
+
+          Computes the                                             G08AKF
+          exact
+          probabilities for the Mann-Whitney U statistic, ties ..
+
+          exponential
+          distribution
+
+          Complex                                                  S01EAF
+          exponential
+             z
+          , e
+
+          Exponential                                              S13AAF
+          integral E (x)
+                    1
+
+          Computes a five-point summary (median, hinges and        G01ALF
+          extremes)
+
+          Computes probabilities for                               G01EDF
+          F
+          -distribution
+
+          Computes deviates for the                                G01FDF
+          F
+          -distribution
+
+          LU                                                       F01BRF
+          factorization
+          of real sparse matrix
+
+          LU                                                       F01BSF
+          factorization
+          of real sparse matrix with known sparsity pattern
+
+            T
+          LL                                                       F01MAF
+          factorization
+          of real sparse symmetric positive-definite matrix
+
+             T
+          LDL                                                      F01MCF
+          factorization
+          of real symmetric positive-definite ...
+
+          QR                                                       F01QCF
+          factorization
+          of real m by n matrix (m>=n)
+
+                                       T
+          factorization
+          by F01QCF
+
+          factorization
+          by F01QCF
+
+          QR                                                       F01RCF
+          factorization
+          of complex m by n matrix (m>=n)
+
+                                               H
+          factorization
+          by F01RCF
+
+          factorization
+          by F01RCF
+
+          LU                                                       F07ADF
+          factorization
+          of real m by n matrix (DGETRF)
+
+          Cholesky                                                 F07FDF
+          factorization
+          of real symmetric positive-definite matrix ...
+
+          Multivariate time series,                                G13BAF
+          filtering
+          (pre-whitening) by an ARIMA model
+
+          1-D quadrature, adaptive,                                D01AJF
+          finite
+          interval, strategy due to Piessens and de Doncker, ...
+
+          1-D quadrature, adaptive,                                D01AKF
+          finite
+          interval, method suitable for oscillating functions
+
+          1-D quadrature, adaptive,                                D01ALF
+          finite
+          interval, allowing for singularities at user-specified
+
+          1-D quadrature, adaptive,                                D01ANF
+          finite
+          interval, weight function cos((omega)x) or sin...
+
+          1-D quadrature, adaptive,                                D01APF
+          finite
+          interval, weight function with end-point ...
+
+          1-D quadrature, adaptive,                                D01AQF
+          finite
+          interval, weight function 1/(x-c), Cauchy ...
+
+          ODEs, boundary value problem,                            D02GAF
+          finite
+          difference technique with deferred correction, simple .
+
+          ODEs, boundary value problem,                            D02GBF
+          finite
+          difference technique with deferred correction, general
+
+          finite/infinite
+          range, eigenvalue and eigenfunction, ...
+
+          ODEs, general nonlinear boundary value problem,          D02RAF
+          finite
+          difference technique with deferred correction, ...
+
+          Elliptic PDE, solution of                                D03EDF
+          finite
+          difference equations by a multigrid technique
+
+                                                    2
+          Fisher's
+          exact test
+
+          Interpolating functions,                                 E01DAF
+          fitting
+          bicubic spline, data on rectangular grid
+
+          Least-squares curve                                      E02ADF
+          fit
+          , by polynomials, arbitrary data points
+
+          Evaluation of                                            E02AEF
+          fitted
+          polynomial in one variable from Chebyshev series form .
+
+          Least-squares polynomial                                 E02AGF
+          fit
+          , values and derivatives may be constrained, arbitrary
+
+          Derivative of                                            E02AHF
+          fitted
+          polynomial in Chebyshev series form
+
+          Integral of                                              E02AJF
+          fitted
+          polynomial in Chebyshev series form
+
+          Evaluation of                                            E02AKF
+          fitted
+          polynomial in one variable, from Chebyshev series form
+
+          Least-squares curve cubic spline                         E02BAF
+          fit
+          (including interpolation)
+
+          Evaluation of                                            E02BBF
+          fitted
+          cubic spline, function only
+
+          Evaluation of                                            E02BCF
+          fitted
+          cubic spline, function and derivatives
+
+          Evaluation of                                            E02BDF
+          fitted
+          cubic spline, definite integral
+
+          Least-squares cubic spline curve                         E02BEF
+          fit
+          , automatic knot placement
+
+          Least-squares surface                                    E02DAF
+          fit
+          , bicubic splines
+
+          Least-squares surface                                    E02DCF
+          fit
+          by bicubic splines with automatic knot placement, data
+          on ...
+
+          Least-squares surface                                    E02DDF
+          fit
+          by bicubic splines with automatic knot placement, ...
+
+          Evaluation of a                                          E02DEF
+          fitted
+          bicubic spline at a vector of points
+
+          Evaluation of a                                          E02DFF
+          fitted
+          bicubic spline at a mesh of points
+
+          Sort 2-D data into panels for                            E02ZAF
+          fitting
+          bicubic splines
+
+          Fits                                                     G02DAF
+          a general (multiple) linear regression model
+
+          Fits                                                     G02DGF
+          a general linear regression model for new dependent ...
+
+          Fits                                                     G02GBF
+          a generalized linear model with binomial errors
+
+          Fits                                                     G02GCF
+          a generalized linear model with Poisson errors
+
+                            2
+          Performs the (chi)  goodness of                          G08CGF
+          fit
+          test, for standard continuous distributions
+
+          Goodness of                                              G08
+          fit
+          tests
+
+          Computes a                                               G01ALF
+          five-point
+          summary (median, hinges and extremes)
+
+          Safe range of                                            X02AMF
+          floating-point
+          arithmetic
+
+          Safe range of complex                                    X02ANF
+          floating-point
+          arithmetic
+
+          Parameter of                                             X02BHF
+          floating-point
+          arithmetic model, b
+
+          Parameter of                                             X02BJF
+          floating-point
+          arithmetic model, p
+
+          Parameter of                                             X02BKF
+          floating-point
+          arithmetic model, e
+                             min
+
+          Parameter of                                             X02BLF
+          floating-point
+          arithmetic model, e
+                             max
+
+          Parameter of                                             X02DJF
+          floating-point
+          arithmetic model, ROUNDS
+
+          Univariate time series, update state set for             G13AGF
+          forecasting
+
+          Univariate time series,                                  G13AHF
+          forecasting
+          from state set
+
+          Univariate time series, state set and                    G13AJF
+          forecasts
+          , from fully specified seasonal ARIMA model
+
+          Multivariate time series, state set and                  G13BJF
+          forecasts
+          from fully specified multi-input model
+
+          Single 1-D real discrete                                 C06EAF
+          Fourier
+          transform, no extra workspace
+
+          Single 1-D Hermitian discrete                            C06EBF
+          Fourier
+          transform, no extra workspace
+
+          Single 1-D complex discrete                              C06ECF
+          Fourier
+          transform, no extra workspace
+
+          Multiple 1-D real discrete                               C06FPF
+          Fourier
+          transforms
+
+          Multiple 1-D Hermitian discrete                          C06FQF
+          Fourier
+          transforms
+
+          Multiple 1-D complex discrete                            C06FRF
+          Fourier
+          transforms
+
+          2-D complex discrete                                     C06FUF
+          Fourier
+          transform
+
+          frequency
+          table
+
+          Frequency                                                G01AEF
+          table from raw data
+
+          frequency
+          (Daniell) window
+
+          frequency
+          (Daniell) window
+
+          Fresnel                                                  S20ACF
+          integral S(x)
+
+          Fresnel                                                  S20ADF
+          integral C(x)
+
+          Friedman                                                 G08AEF
+          two-way analysis of variance on k matched samples
+
+          Computes probabilities for the                           G01EFF
+          gamma
+          distribution
+
+          Computes deviates for the                                G01FFF
+          gamma
+          distribution
+
+          Generates a vector of pseudo-random numbers from a       G05FFF
+          gamma
+          distribution
+
+          Gamma                                                    S14AAF
+          function
+
+          Log                                                      S14ABF
+          Gamma
+          function
+
+          Incomplete                                               S14BAF
+          gamma
+          functions P(a,x) and Q(a,x)
+
+          Unconstrained minimum of a sum of squares, combined      E04FDF
+          Gauss-Newton
+          and modified Newton algorithm using function ...
+
+          Unconstrained minimum of a sum of squares, combined      E04GCF
+          Gauss-Newton
+          and quasi-Newton algorithm, using 1st derivatives
+
+          Pre-computed weights and abscissae for                   D01BBF
+          Gaussian
+          quadrature rules, restricted choice of rule
+
+          All eigenvalues of                                       F02ADF
+          generalized
+          real eigenproblem of the form Ax=(lambda)Bx where ...
+
+          All eigenvalues and eigenvectors of                      F02AEF
+          generalized
+          real eigenproblem of the form Ax=(lambda)Bx where ...
+
+          All eigenvalues and optionally eigenvectors of           F02BJF
+          generalized
+          eigenproblem by QZ algorithm, real matrices
+
+          Fits a                                                   G02GBF
+          generalized
+          linear model with binomial errors
+
+          Fits a                                                   G02GCF
+          generalized
+          linear model with Poisson errors
+
+          Computes orthogonal rotations for loading matrix,        G03BAF
+          generalized
+          orthomax criterion
+
+          Generate                                                 F06AAF
+          real plane rotation (DROTG)
+
+          Initialise random number                                 G05CBF
+          generating
+          routines to give repeatable sequence
+
+          Initialise random number                                 G05CCF
+          generating
+          routines to give non-repeatable sequence
+
+          Save state of random number                              G05CFF
+          generating
+          routines
+
+          Restore state of random number                           G05CGF
+          generating
+          routines
+
+          Set up reference vector for                              G05ECF
+          generating
+          pseudo-random integers, Poisson distribution
+
+          Set up reference vector for                              G05EDF
+          generating
+          pseudo-random integers, binomial distribution
+
+          Generates                                                G05FAF
+          a vector of random numbers from a uniform ...
+
+          Generates                                                G05FBF
+          a vector of random numbers from an (negative) ...
+
+          Generates                                                G05FDF
+          a vector of random numbers from a Normal distribution
+
+          Generates                                                G05FEF
+          a vector of pseudo-random numbers from a beta ...
+
+          Generates                                                G05FFF
+          a vector of pseudo-random numbers from a gamma ...
+
+          Generates                                                G05HDF
+          a realisation of a multivariate time series from a ...
+
+          Gill-Miller
+          method
+
+                            2
+          Performs the (chi)                                       G08CGF
+          goodness
+          of fit test, for standard continuous distributions
+
+          Goodness                                                 G08
+          of fit tests
+
+          Unconstrained minimum, pre-conditioned conjugate         E04DGF
+          gradient
+          algorithm, function of several variables using 1st ...
+
+          Hankel                                                   S17DLF
+                     (j)
+          functions H      (z), j=1,2, ...
+                     (nu)+n
+
+          Elliptic PDE,                                            D03FAF
+          Helmholtz
+          equation, 3-D Cartesian co-ordinates
+
+          Hermite
+          , one variable
+
+          Single 1-D                                               C06EBF
+          Hermitian
+          discrete Fourier transform, no extra workspace
+
+          Multiple 1-D                                             C06FQF
+          Hermitian
+          discrete Fourier transforms
+
+          Complex conjugate of                                     C06GBF
+          Hermitian
+          sequence
+
+          Complex conjugate of multiple                            C06GQF
+          Hermitian
+          sequences
+
+          Convert                                                  C06GSF
+          Hermitian
+          sequences to general complex sequences
+
+          All eigenvalues of complex                               F02AWF
+          Hermitian
+          matrix
+
+          All eigenvalues and eigenvectors of complex              F02AXF
+          Hermitian
+          matrix
+
+          Matrix-vector product, complex                           F06SCF
+          Hermitian
+          matrix (ZHEMV)
+
+          Matrix-vector product, complex                           F06SDF
+          Hermitian
+          band matrix (ZHBMV)
+
+          Matrix-vector product, complex                           F06SEF
+          Hermitian
+          packed matrix (ZHPMV)
+
+          Rank-1 update, complex                                   F06SPF
+          Hermitian
+          matrix (ZHER)
+
+          Rank-1 update, complex                                   F06SQF
+          Hermitian
+          packed matrix (ZHPR)
+
+          Rank-2 update, complex                                   F06SRF
+          Hermitian
+          matrix (ZHER2)
+
+          Rank-2 update, complex                                   F06SSF
+          Hermitian
+          packed matrix (ZHPR2)
+
+          Matrix-matrix product, one complex                       F06ZCF
+          Hermitian
+          matrix, one complex rectangular matrix (ZHEMM)
+
+          Rank-k update of a complex                               F06ZPF
+          Hermitian
+          matrix (ZHERK)
+
+          Rank-2k update of a complex                              F06ZRF
+          Hermitian
+          matrix (ZHER2K)
+
+          Hilbert
+          transform)
+
+          Computes a five-point summary (median,                   G01ALF
+          hinges
+          and extremes)
+
+          Multi-dimensional adaptive quadrature over               D01FCF
+          hyper-rectangle
+
+          Multi-dimensional quadrature over                        D01GBF
+          hyper-rectangle
+          , Monte Carlo method
+
+          Incomplete                                               S14BAF
+          gamma functions P(a,x) and Q(a,x)
+
+          Index                                                    F06JLF
+          , real vector element with largest absolute value
+          (IDAMAX)
+
+          Index                                                    F06JMF
+          , complex vector element with largest absolute value ..
+
+          1-D quadrature, adaptive,                                D01AMF
+          infinite
+          or semi-infinite interval
+
+          1-D quadrature, adaptive, infinite or semi-              D01AMF
+          infinite
+          interval
+
+          1-D quadrature, adaptive, semi-                          D01ASF
+          infinite
+          interval, weight function cos((omega)x) or ...
+
+          infinite
+          range, eigenvalue and eigenfunction, user-specified ...
+
+          Calculates standardized residuals and                    G02FAF
+          influence
+          statistics
+
+          Initialise                                               G05CBF
+          random number generating routines to give ...
+
+          Initialise                                               G05CCF
+          random number generating routines to give ...
+
+          input
+          data
+
+          input
+          data
+
+          Multivariate time series, estimation of multi-           G13BEF
+          input
+          model
+
+          input
+          model
+
+          Input/output                                             X04
+          utilities
+
+          Pseudo-random                                            G05DYF
+          integer
+          from uniform distribution
+
+          Set up reference vector for generating pseudo-random     G05ECF
+          integers
+          , Poisson distribution
+
+          Set up reference vector for generating pseudo-random     G05EDF
+          integers
+          , binomial distribution
+
+          Pseudo-random permutation of an                          G05EHF
+          integer
+          vector
+
+          Pseudo-random sample from an                             G05EJF
+          integer
+          vector
+
+          Pseudo-random                                            G05EYF
+          integer
+          from reference vector
+
+          Largest representable                                    X02BBF
+          integer
+
+          Return date and time as an array of                      X05AAF
+          integers
+
+          Convert array of                                         X05ABF
+          integers
+          representing date and time to character string
+
+          integral
+          , one variable
+
+          Integral                                                 E02AJF
+          of fitted polynomial in Chebyshev series form
+
+          Evaluation of fitted cubic spline, definite              E02BDF
+          integral
+
+          Exponential                                              S13AAF
+          integral
+          E (x)
+           1
+
+          Cosine                                                   S13ACF
+          integral
+          Ci(x)
+
+          Sine                                                     S13ADF
+          integral
+          Si(x)
+
+          Fresnel                                                  S20ACF
+          integral
+          S(x)
+
+          Fresnel                                                  S20ADF
+          integral
+          C(x)
+
+          Degenerate symmetrised elliptic                          S21BAF
+          integral
+          of 1st kind R (x,y)
+                       C
+
+          Symmetrised elliptic                                     S21BBF
+          integral
+          of 1st kind R (x,y,z)
+                       F
+
+          Symmetrised elliptic                                     S21BCF
+          integral
+          of 2nd kind R (x,y,z)
+                       D
+
+          Symmetrised elliptic                                     S21BDF
+          integral
+          of 3rd kind R (x,y,z,r)
+                       J
+
+          1-D quadrature,                                          D01GAF
+          integration
+          of function defined by data values, Gill-Miller ...
+
+          Numerical                                                D01
+          integration
+
+          Interpolating                                            E01BAF
+          functions, cubic spline interpolant, one variable
+
+          Interpolating functions, cubic spline                    E01BAF
+          interpolant
+          , one variable
+
+          Interpolating                                            E01BEF
+          functions, monotonicity-preserving, piecewise ...
+
+          Interpolated                                             E01BFF
+          values, interpolant computed by E01BEF, function ...
+
+          Interpolated values,                                     E01BFF
+          interpolant
+          computed by E01BEF, function only, one variable
+
+          Interpolated                                             E01BGF
+          values, interpolant computed by E01BEF, function ...
+
+          Interpolated values,                                     E01BGF
+          interpolant
+          computed by E01BEF, function and 1st derivative, ...
+
+          Interpolated                                             E01BHF
+          values, interpolant computed by E01BEF, definite ...
+
+          Interpolated values,                                     E01BHF
+          interpolant
+          computed by E01BEF, definite integral, one variable
+
+          Interpolating                                            E01DAF
+          functions, fitting bicubic spline, data on ...
+
+          Interpolating                                            E01SAF
+          functions, method of Renka and Cline, two ...
+
+          Interpolating                                            E01SEF
+          functions, modified Shepard's method, two ...
+
+          Least-squares curve cubic spline fit (including          E02BAF
+          interpolation)
+
+          Inverse                                                  G01F
+          distributions
+
+          Invert                                                   M01ZAF
+          a permutation
+
+          iterative
+          refinement
+
+          iterative
+          refinement
+
+          ODEs,                                                    D02BBF
+          IVP
+          , Runge-Kutta-Merson method, over a range, intermediate
+
+          ODEs,                                                    D02BHF
+          IVP
+          , Runge-Kutta-Merson method, until function of solution
+          is ...
+
+          ODEs,                                                    D02CJF
+          IVP
+          , Adams method, until function of solution is zero, ...
+
+          ODEs, stiff                                              D02EJF
+          IVP
+          , BDF method, until function of solution is zero, ...
+
+          Kelvin function                                          S19ADF
+          kei
+          x
+
+          Kelvin                                                   S19AAF
+          function ber x
+
+          Kelvin                                                   S19ABF
+          function bei x
+
+          Kelvin                                                   S19ACF
+          function ker x
+
+          Kelvin                                                   S19ADF
+          function kei x
+
+          Kendall/Spearman                                         G02BNF
+          non-parametric rank correlation ...
+
+          Kendall/Spearman                                         G02BQF
+          non-parametric rank correlation ...
+
+          Kelvin function                                          S19ACF
+          ker
+          x
+
+          Least-squares cubic spline curve fit, automatic          E02BEF
+          knot
+          placement
+
+          knot
+          placement, data on rectangular grid
+
+          knot
+          placement, scattered data
+
+          Kruskal-Wallis                                           G08AFF
+          one-way analysis of variance on k samples of ...
+
+          Mean, variance, skewness,                                G01AAF
+          kurtosis
+          etc, one variable, from raw data
+
+          Mean, variance, skewness,                                G01ADF
+          kurtosis
+          etc, one variable, from frequency table
+
+          All zeros of complex polynomial, modified                C02AFF
+          Laguerre
+          method
+
+          All zeros of real polynomial, modified                   C02AGF
+          Laguerre
+          method
+
+          Index, real vector element with                          F06JLF
+          largest
+          absolute value (IDAMAX)
+
+          Index, complex vector element with                       F06JMF
+          largest
+          absolute value (IZAMAX)
+
+          Largest                                                  X02ALF
+          positive model number
+
+          Largest                                                  X02BBF
+          representable integer
+
+          LDL                                                      F01MCF
+          T
+            factorization of real symmetric positive-definite ...
+
+          Constructs a stem and                                    G01ARF
+          leaf
+          plot
+
+          Least-squares                                            E02ADF
+          curve fit, by polynomials, arbitrary data points
+
+          Least-squares                                            E02AGF
+          polynomial fit, values and derivatives may be ...
+
+          Least-squares                                            E02BAF
+          curve cubic spline fit (including interpolation)
+
+          Least-squares                                            E02BEF
+          cubic spline curve fit, automatic knot placement
+
+          Least-squares                                            E02DAF
+          surface fit, bicubic splines
+
+          Least-squares                                            E02DCF
+          surface fit by bicubic splines with automatic ...
+
+          Least-squares                                            E02DDF
+          surface fit by bicubic splines with automatic ...
+
+          Covariance matrix for nonlinear                          E04YCF
+          least-squares
+          problem
+
+          Least-squares                                            F04JGF
+          (if rank=n) or minimal least-squares (if ...
+
+          Least-squares (if rank=n) or minimal                     F04JGF
+          least-squares
+          (if rank<n) solution of m real equations ...
+
+          Sparse linear                                            F04QAF
+          least-squares
+          problem, m real equations in n unknowns
+
+          linear
+          problem
+
+          L -approximation by general                              E02GAF
+           1
+          linear
+          function
+
+          Linear                                                   E04MBF
+          programming problem
+
+          Solution of complex simultaneous                         F04ADF
+          linear
+          equations with multiple right-hand sides
+
+          Solution of real simultaneous                            F04ARF
+          linear
+          equations, one right-hand side
+
+          linear
+          equations, one right-hand side using iterative ...
+
+          Solution of real simultaneous                            F04ATF
+          linear
+          equations, one right-hand side using iterative ...
+
+          Solution of real sparse simultaneous                     F04AXF
+          linear
+          equations (coefficient matrix already factorized)
+
+          linear
+          equations, one right-hand side
+
+          Real sparse symmetric positive-definite simultaneous     F04MAF
+          linear
+          equations (coefficient matrix already factorized by ...
+
+          Real sparse symmetric simultaneous                       F04MBF
+          linear
+          equations
+
+          linear
+          equations (coefficient matrix already factorized by ...
+
+          Sparse                                                   F04QAF
+          linear
+          least-squares problem, m real equations in n ...
+
+          Solution of real system of                               F07AEF
+          linear
+          equations, multiple right-hand sides, matrix already ..
+
+          linear
+          equations, multiple right-hand sides, matrix already ..
+
+          Simple                                                   G02CAF
+          linear
+          regression with constant term, no missing values
+
+          Fits a general (multiple)                                G02DAF
+          linear
+          regression model
+
+          Fits a general                                           G02DGF
+          linear
+          regression model for new dependent variable
+
+          Computes estimable function of a general                 G02DNF
+          linear
+          regression model and its standard error
+
+          Fits a generalized                                       G02GBF
+          linear
+          model with binomial errors
+
+          Fits a generalized                                       G02GCF
+          linear
+          model with Poisson errors
+
+          Basic                                                    F06
+          Linear
+          Algebra Subprograms
+
+          2nd order Sturm-                                         D02KEF
+          Liouville
+          problem, regular/singular system, finite/infinite ...
+
+          Computes orthogonal rotations for                        G03BAF
+          loading
+          matrix, generalized orthomax criterion
+
+          Location                                                 G08
+          tests
+
+          Log                                                      S14ABF
+          Gamma function
+
+          algebraico-
+          logarithmic
+          type
+
+          Computes upper and                                       G01EEF
+          lower
+          tail and probability density function probabilities for
+
+          LU                                                       F01BRF
+          factorization of real sparse matrix
+
+          LU                                                       F01BSF
+          factorization of real sparse matrix with known sparsity
+
+          LU                                                       F07ADF
+          factorization of real m by n matrix (DGETRF)
+
+          Machine                                                  X02AJF
+          precision
+
+          Machine                                                  X02
+          Constants
+
+          Performs the                                             G08AHF
+          Mann-Whitney
+          U test on two independent samples
+
+          Computes the exact probabilities for the                 G08AJF
+          Mann-Whitney
+          U statistic, no ties in pooled sample
+
+          Computes the exact probabilities for the                 G08AKF
+          Mann-Whitney
+          U statistic, ties in pooled sample
+
+          Friedman two-way analysis of variance on k               G08AEF
+          matched
+          samples
+
+          Performs the Wilcoxon one-sample (                       G08AGF
+          matched
+          pairs) signed rank test
+
+          Mathematical                                             X01
+          Constants
+
+          Maximization                                             E04
+
+          Maximum                                                  X02BEF
+          number of decimal digits that can be represented
+
+          Mean                                                     G01AAF
+          , variance, skewness, kurtosis etc, one variable, from
+
+          Mean                                                     G01ADF
+          , variance, skewness, kurtosis etc, one variable, from
+
+          Computes a five-point summary (                          G01ALF
+          median
+          , hinges and extremes)
+
+          Median                                                   G08ACF
+          test on two samples of unequal size
+
+          ODEs, IVP, Runge-Kutta-                                  D02BBF
+          Merson
+          method, over a range, intermediate output
+
+          ODEs, IVP, Runge-Kutta-                                  D02BHF
+          Merson
+          method, until function of solution is zero (simple ...
+
+          Evaluation of a fitted bicubic spline at a               E02DFF
+          mesh
+          of points
+
+          Miller
+          method
+
+          Least-squares (if rank=n) or                             F04JGF
+          minimal
+          least-squares (if rank<n) solution of m real ...
+
+          Minimization                                             E04
+
+          Unconstrained                                            E04DGF
+          minimum
+          , pre-conditioned conjugate gradient algorithm, ...
+
+          Unconstrained                                            E04FDF
+          minimum
+          of a sum of squares, combined Gauss-Newton and ...
+
+          Unconstrained                                            E04GCF
+          minimum
+          of a sum of squares, combined Gauss-Newton and ...
+
+          Minimum                                                  E04JAF
+          , function of several variables, quasi-Newton ...
+
+          Minimum                                                  E04UCF
+          , function of several variables, sequential QP method,
+
+          missing
+          values, overwriting input data
+
+          missing
+          values, preserving input data
+
+          Simple linear regression with constant term, no          G02CAF
+          missing
+          values
+
+          Fits a general (multiple) linear regression              G02DAF
+          model
+
+          Fits a general linear regression                         G02DGF
+          model
+          for new dependent variable
+
+          model
+          and its standard error
+
+          Fits a generalized linear                                G02GBF
+          model
+          with binomial errors
+
+          Fits a generalized linear                                G02GCF
+          model
+          with Poisson errors
+
+          model
+
+          model
+
+          Univariate time series, estimation, seasonal ARIMA       G13AFF
+          model
+
+          model
+
+          model
+
+          model
+
+          Multivariate time series, estimation of multi-input      G13BEF
+          model
+
+          model
+
+          Smallest positive                                        X02AKF
+          model
+          number
+
+          Largest positive                                         X02ALF
+          model
+          number
+
+          Parameter of floating-point arithmetic                   X02BHF
+          model
+          , b
+
+          Parameter of floating-point arithmetic                   X02BJF
+          model
+          , p
+
+          Parameter of floating-point arithmetic                   X02BKF
+          model
+          , e
+             min
+
+          Parameter of floating-point arithmetic                   X02BLF
+          model
+          , e
+             max
+
+          Parameter of floating-point arithmetic                   X02DJF
+          model
+          , ROUNDS
+
+          All zeros of complex polynomial,                         C02AFF
+          modified
+          Laguerre method
+
+          All zeros of real polynomial,                            C02AGF
+          modified
+          Laguerre method
+
+          Interpolating functions,                                 E01SEF
+          modified
+          Shepard's method, two variables
+
+          modified
+          Newton algorithm using function values only ...
+
+          Modified                                                 S18ACF
+          Bessel function K (x)
+                           0
+
+          Modified                                                 S18ADF
+          Bessel function K (x)
+                           1
+
+          Modified                                                 S18AEF
+          Bessel function I (x)
+                           0
+
+          Modified                                                 S18AFF
+          Bessel function I (x)
+                           1
+
+          Modified                                                 S18DCF
+          Bessel functions K      (z), real ...
+                            (nu)+n
+
+          Modified                                                 S18DEF
+          Bessel functions I      (z), real ...
+                            (nu)+n
+
+          Interpolating functions,                                 E01BEF
+          monotonicity-preserving
+          , piecewise cubic Hermite, one variable
+
+          Multi-dimensional quadrature over hyper-rectangle,       D01GBF
+          Monte
+          Carlo method
+
+          Multi-dimensional                                        D01FCF
+          adaptive quadrature over hyper-rectangle
+
+          Multi-dimensional                                        D01GBF
+          quadrature over hyper-rectangle, Monte ...
+
+          Multivariate time series, estimation of                  G13BEF
+          multi-input
+          model
+
+          multi-input
+          model
+
+          multigrid
+          technique
+
+          Multiple                                                 C06FPF
+          1-D real discrete Fourier transforms
+
+          Multiple                                                 C06FQF
+          1-D Hermitian discrete Fourier transforms
+
+          Multiple                                                 C06FRF
+          1-D complex discrete Fourier transforms
+
+          Complex conjugate of                                     C06GQF
+          multiple
+          Hermitian sequences
+
+          multiple
+          right-hand sides
+
+          Solves a system of equations with                        F06YJF
+          multiple
+          right-hand sides, real triangular coefficient matrix ..
+
+          Solves system of equations with                          F06ZJF
+          multiple
+          right-hand sides, complex triangular coefficient ...
+
+          Solution of real system of linear equations,             F07AEF
+          multiple
+          right-hand sides, matrix already factorized by ...
+
+          multiple
+          right-hand sides, matrix already factorized by ...
+          Fits a general (                                         G02DAF
+          multiple)
+          linear regression model
+
+          Multiply                                                 F06EDF
+          real vector by scalar (DSCAL)
+
+          Multiply                                                 F06GDF
+          complex vector by complex scalar (ZSCAL)
+
+          Multiply                                                 F06JDF
+          complex vector by real scalar (ZDSCAL)
+
+          Set up reference vector for                              G05EAF
+          multivariate
+          Normal distribution
+
+          Pseudo-random                                            G05EZF
+          multivariate
+          Normal vector from reference vector
+
+          Generates a realisation of a                             G05HDF
+          multivariate
+          time series from a VARMA model
+
+          Multivariate                                             G13BAF
+          time series, filtering (pre-whitening) by an ...
+
+          Multivariate                                             G13BCF
+          time series, cross-correlations
+
+          Multivariate                                             G13BDF
+          time series, preliminary estimation of transfer ...
+
+          Multivariate                                             G13BEF
+          time series, estimation of multi-input model
+
+          Multivariate                                             G13BJF
+          time series, state set and forecasts from fully ...
+
+          Multivariate                                             G13CDF
+          time series, smoothed sample cross spectrum ...
+
+          Generates a vector of random numbers from an (           G05FBF
+          negative)
+          exponential distribution
+
+          Newton
+          and modified Newton algorithm using function values ...
+
+          Newton
+          algorithm using function values only
+          Newton
+          and quasi-Newton algorithm, using 1st derivatives
+
+          Newton
+          algorithm, using 1st derivatives
+
+          Minimum, function of several variables, quasi-           E04JAF
+          Newton
+          algorithm, simple bounds, using function values only
+
+          Kendall/Spearman                                         G02BNF
+          non-parametric
+          rank correlation coefficients, no missing ...
+
+          Kendall/Spearman                                         G02BQF
+          non-parametric
+          rank correlation coefficients, no missing ...
+
+          Initialise random number generating routines to give     G05CCF
+          non-repeatable
+          sequence
+
+          Univariate time series, seasonal and                     G13AAF
+          non-seasonal
+          differencing
+
+          Non-parametric                                           G08
+          tests
+
+          Solution of system of                                    C05NBF
+          nonlinear
+          equations using function values only
+
+          Solution of system of                                    C05PBF
+          nonlinear
+          equations using 1st derivatives
+
+          nonlinear
+          problem
+
+          ODEs, general                                            D02RAF
+          nonlinear
+          boundary value problem, finite difference technique ...
+
+          nonlinear
+          constraints, using function values and optionally ...
+
+          Covariance matrix for                                    E04YCF
+          nonlinear
+          least-squares problem
+
+          Nonlinear                                                E04
+          optimization
+
+          Nonlinear                                                E04
+          regression
+
+          Compute Euclidean                                        F06EJF
+          norm
+          of real vector (DNRM2)
+
+          Compute Euclidean                                        F06JJF
+          norm
+          of complex vector (DZNRM2)
+
+          Computes probabilities for the standard                  G01EAF
+          Normal
+          distribution
+
+          Computes deviates for the standard                       G01FAF
+          Normal
+          distribution
+
+          Computes probability for the bivariate                   G01HAF
+          Normal
+          distribution
+
+          Pseudo-random real numbers,                              G05DDF
+          Normal
+          distribution
+
+          Set up reference vector for multivariate                 G05EAF
+          Normal
+          distribution
+
+          Pseudo-random multivariate                               G05EZF
+          Normal
+          vector from reference vector
+
+          Generates a vector of random numbers from a              G05FDF
+          Normal
+          distribution
+
+          Numerical                                                D01
+          integration
+
+          ODEs                                                     D02BBF
+          , IVP, Runge-Kutta-Merson method, over a range, ...
+
+          ODEs                                                     D02BHF
+          , IVP, Runge-Kutta-Merson method, until function of ...
+
+          ODEs                                                     D02CJF
+          , IVP, Adams method, until function of solution is
+          zero, ...
+
+          ODEs                                                     D02EJF
+          , stiff IVP, BDF method, until function of solution is
+
+          ODEs                                                     D02GAF
+          , boundary value problem, finite difference technique .
+
+          ODEs                                                     D02GBF
+          , boundary value problem, finite difference technique .
+
+          ODEs                                                     D02RAF
+          , general nonlinear boundary value problem, finite ...
+
+          Kruskal-Wallis                                           G08AFF
+          one-way
+          analysis of variance on k samples of unequal size
+
+          Performs the Wilcoxon                                    G08AGF
+          one-sample
+          (matched pairs) signed rank test
+
+          Operations                                               F01QDF
+                                                   H
+          with orthogonal matrices, compute QB or Q B ...
+
+          Operations                                               F01QEF
+          with orthogonal matrices, form columns of Q ...
+
+          Operations                                               F01RDF
+                                                H
+          with unitary matrices, compute QB or Q B ...
+
+          Operations                                               F01REF
+          with unitary matrices, form columns of Q after ...
+
+          Nonlinear                                                E04
+          optimization
+
+          Operations with                                          F01QDF
+          orthogonal
+                                   T
+          matrices, compute QB or Q B after ...
+
+          Operations with                                          F01QEF
+          orthogonal
+          matrices, form columns of Q after factorization ...
+
+          Computes                                                 G03BAF
+          orthogonal
+          rotations for loading matrix, generalized orthomax ...
+
+          orthomax
+          criterion
+
+          oscillating
+          functions
+
+          Incomplete gamma functions                               S14BAF
+          P(a,x)
+          and Q(a,x)
+
+          Matrix-vector product, real symmetric                    F06PEF
+          packed
+          matrix (DSPMV)
+
+          Matrix-vector product, real triangular                   F06PHF
+          packed
+          matrix (DTPMV)
+
+          System of equations, real triangular                     F06PLF
+          packed
+          matrix (DTPSV)
+
+          Rank-1 update, real symmetric                            F06PQF
+          packed
+          matrix (DSPR)
+
+          Rank-2 update, real symmetric                            F06PSF
+          packed
+          matrix (DSPR2)
+
+          Matrix-vector product, complex Hermitian                 F06SEF
+          packed
+          matrix (ZHPMV)
+
+          Matrix-vector product, complex triangular                F06SHF
+          packed
+          matrix (ZTPMV)
+
+          System of equations, complex triangular                  F06SLF
+          packed
+          matrix (ZTPSV)
+
+          Rank-1 update, complex Hermitian                         F06SQF
+          packed
+          matrix (ZHPR)
+
+          Rank-2 update, complex Hermitian                         F06SSF
+          packed
+          matrix (ZHPR2)
+
+          Sign test on two                                         G08AAF
+          paired
+          samples
+
+          Performs the Wilcoxon one-sample (matched                G08AGF
+          pairs)
+          signed rank test
+
+          Kendall/Spearman non-                                    G02BNF
+          parametric
+          rank correlation coefficients, no missing values, ...
+
+          Kendall/Spearman non-                                    G02BQF
+          parametric
+          rank correlation coefficients, no missing values, ...
+
+          Non-                                                     G08
+          parametric
+          tests
+
+          Univariate time series,                                  G13ACF
+          partial
+          autocorrelations from autocorrelations
+
+          Elliptic                                                 D03EDF
+          PDE
+          , solution of finite difference equations by a
+          multigrid ...
+
+          Discretize a 2nd order elliptic                          D03EEF
+          PDE
+          on a rectangle
+
+          Elliptic                                                 D03FAF
+          PDE
+          , Helmholtz equation, 3-D Cartesian co-ordinates
+
+          Pseudo-random                                            G05EHF
+          permutation
+          of an integer vector
+
+          Invert a                                                 M01ZAF
+          permutation
+
+          Interpolating functions, monotonicity-preserving,        E01BEF
+          piecewise
+          cubic Hermite, one variable
+
+          Piessens
+          and de Doncker, allowing for badly-behaved integrands
+
+          Generate real                                            F06AAF
+          plane
+          rotation (DROTG)
+          Apply real                                               F06EPF
+          plane
+          rotation (DROT)
+
+          Constructs a stem and leaf                               G01ARF
+          plot
+
+          Fits a generalized linear model with                     G02GCF
+          Poisson
+          errors
+
+          Poisson
+          distribution
+
+          All zeros of complex                                     C02AFF
+          polynomial
+          , modified Laguerre method
+
+          All zeros of real                                        C02AGF
+          polynomial
+          , modified Laguerre method
+
+          Least-squares curve fit, by                              E02ADF
+          polynomials
+          , arbitrary data points
+
+          Evaluation of fitted                                     E02AEF
+          polynomial
+          in one variable from Chebyshev series form ...
+
+          Least-squares                                            E02AGF
+          polynomial
+          fit, values and derivatives may be constrained, ...
+
+          Derivative of fitted                                     E02AHF
+          polynomial
+          in Chebyshev series form
+
+          Integral of fitted                                       E02AJF
+          polynomial
+          in Chebyshev series form
+
+          Evaluation of fitted                                     E02AKF
+          polynomial
+          in one variable, from Chebyshev series form
+
+          pooled
+          sample
+
+          pooled
+          sample
+
+          Pre-computed                                             D01BBF
+          weights and abscissae for Gaussian quadrature ...
+
+          Unconstrained minimum,                                   E04DGF
+          pre-conditioned
+          conjugate gradient algorithm, function of ...
+
+          Multivariate time series, filtering (                    G13BAF
+          pre-whitening)
+          by an ARIMA model
+
+          Machine                                                  X02AJF
+          precision
+
+          Univariate time series,                                  G13ADF
+          preliminary
+          estimation, seasonal ARIMA model
+
+          Multivariate time series,                                G13BDF
+          preliminary
+          estimation of transfer function model
+
+          principal
+          value (Hilbert transform)
+
+          Performs                                                 G03AAF
+          principal
+          component analysis
+
+          Print                                                    X04CAF
+          a real general matrix
+
+          Print                                                    X04DAF
+          a complex general matrix
+
+          Computes                                                 G01EAF
+          probabilities
+          for the standard Normal distribution
+
+          Computes                                                 G01EBF
+          probabilities
+          for Student's t-distribution
+
+          Computes                                                 G01ECF
+          probabilities
+                   2
+          for (chi)  distribution
+
+          Computes                                                 G01EDF
+          probabilities
+          for F-distribution
+
+          Computes upper and lower tail and                        G01EEF
+          probability
+          density function probabilities for the beta ...
+
+          probabilities
+          for the beta distribution
+
+          Computes                                                 G01EFF
+          probabilities
+          for the gamma distribution
+
+          Computes                                                 G01HAF
+          probability
+          for the bivariate Normal distribution
+
+          probability
+          distribution function
+
+          Computes the exact                                       G08AJF
+          probabilities
+          for the Mann-Whitney U statistic, no ties in ...
+
+          Computes the exact                                       G08AKF
+          probabilities
+          for the Mann-Whitney U statistic, ties in ...
+
+          Dot                                                      F06EAF
+          product
+          of two real vectors (DDOT)
+
+          Dot                                                      F06GAF
+          product
+          of two complex vectors, unconjugated (ZDOTU)
+
+          Dot                                                      F06GBF
+          product
+          of two complex vectors, conjugated (ZDOTC)
+
+          Matrix-vector                                            F06PAF
+          product
+          , real rectangular matrix (DGEMV)
+
+          Matrix-vector                                            F06PBF
+          product
+          , real rectangular band matrix (DGBMV)
+
+          Matrix-vector                                            F06PCF
+          product
+          , real symmetric matrix (DSYMV)
+
+          Matrix-vector                                            F06PDF
+          product
+          , real symmetric band matrix (DSBMV)
+
+          Matrix-vector                                            F06PEF
+          product
+          , real symmetric packed matrix (DSPMV)
+
+          Matrix-vector                                            F06PFF
+          product
+          , real triangular matrix (DTRMV)
+
+          Matrix-vector                                            F06PGF
+          product
+          , real triangular band matrix (DTBMV)
+
+          Matrix-vector                                            F06PHF
+          product
+          , real triangular packed matrix (DTPMV)
+
+          Matrix-vector                                            F06SAF
+          product
+          , complex rectangular matrix (ZGEMV)
+
+          Matrix-vector                                            F06SBF
+          product
+          , complex rectangular band matrix (ZGBMV)
+
+          Matrix-vector                                            F06SCF
+          product
+          , complex Hermitian matrix (ZHEMV)
+
+          Matrix-vector                                            F06SDF
+          product
+          , complex Hermitian band matrix (ZHBMV)
+
+          Matrix-vector                                            F06SEF
+          product
+          , complex Hermitian packed matrix (ZHPMV)
+
+          Matrix-vector                                            F06SFF
+          product
+          , complex triangular matrix (ZTRMV)
+
+          Matrix-vector                                            F06SGF
+          product
+          , complex triangular band matrix (ZTBMV)
+
+          Matrix-vector                                            F06SHF
+          product
+          , complex triangular packed matrix (ZTPMV)
+
+          Matrix-matrix                                            F06YAF
+          product
+          , two real rectangular matrices (DGEMM)
+
+          Matrix-matrix                                            F06YCF
+          product
+          , one real symmetric matrix, one real rectangular ...
+
+          Matrix-matrix                                            F06YFF
+          product
+          , one real triangular matrix, one real rectangular ...
+
+          Matrix-matrix                                            F06ZAF
+          product
+          , two complex rectangular matrices (ZGEMM)
+
+          Matrix-matrix                                            F06ZCF
+          product
+          , one complex Hermitian matrix, one complex ...
+
+          Matrix-matrix                                            F06ZFF
+          product
+          , one complex triangular matrix, one complex ...
+
+          Matrix-matrix                                            F06ZTF
+          product
+          , one complex symmetric matrix, one complex ...
+
+          Linear                                                   E04MBF
+          programming
+          problem
+
+          Pseudo-random                                            G05CAF
+          real numbers, uniform distribution over (0,1)
+
+          Pseudo-random                                            G05DDF
+          real numbers, Normal distribution
+
+          Pseudo-random                                            G05DFF
+          real numbers, Cauchy distribution
+
+          Pseudo-random                                            G05DPF
+          real numbers, Weibull distribution
+
+          Pseudo-random                                            G05DYF
+          integer from uniform distribution
+
+          Pseudo-random                                            G05DZF
+          logical (boolean) value
+
+          Set up reference vector for generating                   G05ECF
+          pseudo-random
+          integers, Poisson distribution
+
+          Set up reference vector for generating                   G05EDF
+          pseudo-random
+          integers, binomial distribution
+
+          Pseudo-random                                            G05EHF
+          permutation of an integer vector
+
+          Pseudo-random                                            G05EJF
+          sample from an integer vector
+
+          Pseudo-random                                            G05EYF
+          integer from reference vector
+
+          Pseudo-random                                            G05EZF
+          multivariate Normal vector from reference vector
+
+          Generates a vector of                                    G05FEF
+          pseudo-random
+          numbers from a beta distribution
+
+          Generates a vector of                                    G05FFF
+          pseudo-random
+          numbers from a gamma distribution
+
+          Incomplete gamma functions P(a,x) and                    S14BAF
+          Q(a,x)
+
+          QP                                                       E04NAF
+          problem
+
+          Minimum, function of several variables, sequential       E04UCF
+          QP
+          method, nonlinear constraints, using function values
+          and ...
+
+          QR                                                       F01QCF
+          factorization of real m by n matrix (m<=n)
+
+          QR                                                       F01RCF
+          factorization of complex m by n matrix (m<=n)
+
+          1-D                                                      D01AJF
+          quadrature
+          , adaptive, finite interval, strategy due to ...
+
+          1-D                                                      D01AKF
+          quadrature
+          , adaptive, finite interval, method suitable for ...
+
+          1-D                                                      D01ALF
+          quadrature
+          , adaptive, finite interval, allowing for ...
+          1-D                                                      D01AMF
+          quadrature
+          , adaptive, infinite or semi-infinite interval
+
+          1-D                                                      D01ANF
+          quadrature
+          , adaptive, finite interval, weight function
+          cos((omega)x) ...
+
+          1-D                                                      D01APF
+          quadrature
+          , adaptive, finite interval, weight function with ...
+
+          1-D                                                      D01AQF
+          quadrature
+          , adaptive, finite interval, weight function ...
+
+          1-D                                                      D01ASF
+          quadrature
+          , adaptive, semi-infinite interval, weight function ...
+
+          Pre-computed weights and abscissae for Gaussian          D01BBF
+          quadrature
+          rules, restricted choice of rule
+
+          Multi-dimensional adaptive                               D01FCF
+          quadrature
+          over hyper-rectangle
+
+          1-D                                                      D01GAF
+          quadrature
+          , integration of function defined by data values, ...
+
+          Multi-dimensional                                        D01GBF
+          quadrature
+          over hyper-rectangle, Monte Carlo method
+
+          quasi-Newton
+          algorithm, using 1st derivatives
+
+          Minimum, function of several variables,                  E04JAF
+          quasi-Newton
+          algorithm, simple bounds, using function values ...
+
+          QZ
+          algorithm, real matrices
+
+          Pseudo-                                                  G05CAF
+          random
+          real numbers, uniform distribution over (0,1)
+
+          Initialise                                               G05CBF
+          random
+          number generating routines to give repeatable sequence
+
+          Initialise                                               G05CCF
+          random
+          number generating routines to give non-repeatable ...
+
+          Save state of                                            G05CFF
+          random
+          number generating routines
+
+          Restore state of                                         G05CGF
+          random
+          number generating routines
+
+          Pseudo-                                                  G05DDF
+          random
+          real numbers, Normal distribution
+
+          Pseudo-                                                  G05DFF
+          random
+          real numbers, Cauchy distribution
+
+          Pseudo-                                                  G05DPF
+          random
+          real numbers, Weibull distribution
+
+          Pseudo-                                                  G05DYF
+          random
+          integer from uniform distribution
+
+          Pseudo-                                                  G05DZF
+          random
+          logical (boolean) value
+
+          Set up reference vector for generating pseudo-           G05ECF
+          random
+          integers, Poisson distribution
+
+          Set up reference vector for generating pseudo-           G05EDF
+          random
+          integers, binomial distribution
+
+          Pseudo-                                                  G05EHF
+          random
+          permutation of an integer vector
+
+          Pseudo-                                                  G05EJF
+          random
+          sample from an integer vector
+
+          Pseudo-                                                  G05EYF
+          random
+          integer from reference vector
+
+          Pseudo-                                                  G05EZF
+          random
+          multivariate Normal vector from reference vector
+
+          Generates a vector of                                    G05FAF
+          random
+          numbers from a uniform distribution
+
+          Generates a vector of                                    G05FBF
+          random
+          numbers from an (negative) exponential distribution
+
+          Generates a vector of                                    G05FDF
+          random
+          numbers from a Normal distribution
+
+          Generates a vector of pseudo-                            G05FEF
+          random
+          numbers from a beta distribution
+
+          Generates a vector of pseudo-                            G05FFF
+          random
+          numbers from a gamma distribution
+
+          ODEs, IVP, Runge-Kutta-Merson method, over a             D02BBF
+          range
+          , intermediate output
+
+          range
+          , eigenvalue and eigenfunction, user-specified ...
+
+          Safe                                                     X02AMF
+          range
+          of floating-point arithmetic
+
+          Safe                                                     X02ANF
+          range
+          of complex floating-point arithmetic
+
+          Least-squares (if                                        F04JGF
+          rank=n)
+          or minimal least-squares (if rank<n) ...
+
+          rank
+          <n) solution of m real equations in n unknowns, ...
+
+          rank
+          <=n,m>=n
+
+          Rank-1                                                   F06PMF
+          update, real rectangular matrix (DGER)
+
+          Rank-1                                                   F06PPF
+          update, real symmetric matrix (DSYR)
+
+          Rank-1                                                   F06PQF
+          update, real symmetric packed matrix (DSPR)
+
+          Rank-2                                                   F06PRF
+          update, real symmetric matrix (DSYR2)
+
+          Rank-2                                                   F06PSF
+          update, real symmetric packed matrix (DSPR2)
+
+          Rank-1                                                   F06SMF
+          update, complex rectangular matrix, unconjugated ...
+
+          Rank-1                                                   F06SNF
+          update, complex rectangular matrix, conjugated vector .
+
+          Rank-1                                                   F06SPF
+          update, complex Hermitian matrix (ZHER)
+
+          Rank-1                                                   F06SQF
+          update, complex Hermitian packed matrix (ZHPR)
+
+          Rank-2                                                   F06SRF
+          update, complex Hermitian matrix (ZHER2)
+
+          Rank-2                                                   F06SSF
+          update, complex Hermitian packed matrix (ZHPR2)
+
+          Rank-k                                                   F06YPF
+          update of a real symmetric matrix (DSYRK)
+
+          Rank-2k                                                  F06YRF
+          update of a real symmetric matrix (DSYR2K)
+
+          Rank-k                                                   F06ZPF
+          update of a complex Hermitian matrix (ZHERK)
+
+          Rank-2k                                                  F06ZRF
+          update of a complex Hermitian matrix (ZHER2K)
+
+          Rank-k                                                   F06ZUF
+          update of a complex symmetric matrix (ZSYRK)
+
+          Rank-2k                                                  F06ZWF
+          update of a complex symmetric matrix (ZHER2K)
+
+          Kendall/Spearman non-parametric                          G02BNF
+          rank
+          correlation coefficients, no missing values,
+          overwriting ...
+
+          Kendall/Spearman non-parametric                          G02BQF
+          rank
+          correlation coefficients, no missing values, preserving
+
+          rank
+          test
+
+          Rank                                                     M01DAF
+          a vector, real numbers
+
+          Rank                                                     M01DEF
+          rows of a matrix, real numbers
+
+          Rank                                                     M01DJF
+          columns of a matrix, real numbers
+
+          Rearrange a vector according to given                    M01EAF
+          ranks
+          , real numbers
+
+          Generates a                                              G05HDF
+          realisation
+          of a multivariate time series from a VARMA model
+
+          Rearrange                                                M01EAF
+          a vector according to given ranks, real numbers
+
+          Multi-dimensional adaptive quadrature over hyper-        D01FCF
+          rectangle
+
+          Multi-dimensional quadrature over hyper-                 D01GBF
+          rectangle
+          , Monte Carlo method
+
+          Discretize a 2nd order elliptic PDE on a                 D03EEF
+          rectangle
+
+          rectangular
+          grid
+
+          rectangular
+          grid
+
+          Matrix-vector product, real                              F06PAF
+          rectangular
+          matrix (DGEMV)
+
+          Matrix-vector product, real                              F06PBF
+          rectangular
+          band matrix (DGBMV)
+
+          Rank-1 update, real                                      F06PMF
+          rectangular
+          matrix (DGER)
+
+          Matrix-vector product, complex                           F06SAF
+          rectangular
+          matrix (ZGEMV)
+
+          Matrix-vector product, complex                           F06SBF
+          rectangular
+          band matrix (ZGBMV)
+
+          Rank-1 update, complex                                   F06SMF
+          rectangular
+          matrix, unconjugated vector (ZGERU)
+
+          Rank-1 update, complex                                   F06SNF
+          rectangular
+          matrix, conjugated vector (ZGERC)
+
+          Matrix-matrix product, two real                          F06YAF
+          rectangular
+          matrices (DGEMM)
+
+          rectangular
+          matrix (DSYMM)
+
+          rectangular
+          matrix (DTRMM)
+
+          Matrix-matrix product, two complex                       F06ZAF
+          rectangular
+          matrices (ZGEMM)
+
+          rectangular
+          matrix (ZHEMM)
+
+          rectangular
+          matrix (ZTRMM)
+
+          rectangular
+          matrix (ZSYMM)
+
+          Set up                                                   G05EAF
+          reference
+          vector for multivariate Normal distribution
+
+          Set up                                                   G05ECF
+          reference
+          vector for generating pseudo-random integers, ...
+
+          Set up                                                   G05EDF
+          reference
+          vector for generating pseudo-random integers, ...
+
+          Set up                                                   G05EXF
+          reference
+          vector from supplied cumulative distribution ...
+
+          Pseudo-random integer from                               G05EYF
+          reference
+          vector
+
+          Pseudo-random multivariate Normal vector from            G05EZF
+          reference
+          vector
+
+          refinement
+
+          refinement
+
+          Simple linear                                            G02CAF
+          regression
+          with constant term, no missing values
+
+          Fits a general (multiple) linear                         G02DAF
+          regression
+          model
+
+          Fits a general linear                                    G02DGF
+          regression
+          model for new dependent variable
+
+          Computes estimable function of a general linear          G02DNF
+          regression
+          model and its standard error
+
+          Nonlinear                                                E04
+          regression
+
+          2nd order Sturm-Liouville problem,                       D02KEF
+          regular/singular
+          system, finite/infinite range, eigenvalue ...
+
+          Interpolating functions, method of                       E01SAF
+          Renka
+          and Cline, two variables
+
+          Calculates standardized                                  G02FAF
+          residuals
+          and influence statistics
+          Univariate time series, diagnostic checking of           G13ASF
+          residuals
+          , following G13AFF
+
+          right-hand
+          sides
+
+          Solution of real simultaneous linear equations, one      F04ARF
+          right-hand
+          side
+
+          right-hand
+          side using iterative refinement
+
+          Solution of real simultaneous linear equations, one      F04ATF
+          right-hand
+          side using iterative refinement
+
+          right-hand
+          side
+
+          Solves a system of equations with multiple               F06YJF
+          right-hand
+          sides, real triangular coefficient matrix (DTRSM)
+
+          Solves system of equations with multiple                 F06ZJF
+          right-hand
+          sides, complex triangular coefficient matrix (ZTRSM)
+
+          Solution of real system of linear equations, multiple    F07AEF
+          right-hand
+          sides, matrix already factorized by F07ADF (DGETRS)
+
+          right-hand
+          sides, matrix already factorized by F07FDF (DPOTRS)
+
+          Generate real plane                                      F06AAF
+          rotation
+          (DROTG)
+
+          Apply real plane                                         F06EPF
+          rotation
+          (DROT)
+
+          Computes orthogonal                                      G03BAF
+          rotations
+          for loading matrix, generalized orthomax criterion
+
+          rules
+          , restricted choice of rule
+
+          rule
+          ODEs, IVP,                                               D02BBF
+          Runge-Kutta-Merson
+          method, over a range, intermediate output
+
+          ODEs, IVP,                                               D02BHF
+          Runge-Kutta-Merson
+          method, until function of solution is zero ...
+
+          Safe                                                     X02AMF
+          range of floating-point arithmetic
+
+          Safe                                                     X02ANF
+          range of complex floating-point arithmetic
+
+          Pseudo-random                                            G05EJF
+          sample
+          from an integer vector
+
+          Sign test on two paired                                  G08AAF
+          samples
+
+          Median test on two                                       G08ACF
+          samples
+          of unequal size
+
+          Friedman two-way analysis of variance on k matched       G08AEF
+          samples
+
+          Kruskal-Wallis one-way analysis of variance on k         G08AFF
+          samples
+          of unequal size
+
+          Performs the Wilcoxon one-                               G08AGF
+          sample
+          (matched pairs) signed rank test
+
+          Performs the Mann-Whitney U test on two independent      G08AHF
+          samples
+
+          sample
+
+          sample
+
+          Univariate time series,                                  G13ABF
+          sample
+          autocorrelation function
+
+          Univariate time series, smoothed                         G13CBF
+          sample
+          spectrum using spectral smoothing by the trapezium ...
+
+          Multivariate time series, smoothed                       G13CDF
+          sample
+          cross spectrum using spectral smoothing by the ...
+
+          Add                                                      F06ECF
+          scalar
+          times real vector to real vector (DAXPY)
+
+          Multiply real vector by                                  F06EDF
+          scalar
+          (DSCAL)
+
+          Add                                                      F06GCF
+          scalar
+          times complex vector to complex vector (ZAXPY)
+
+          Multiply complex vector by complex                       F06GDF
+          scalar
+          (ZSCAL)
+
+          Multiply complex vector by real                          F06JDF
+          scalar
+          (ZDSCAL)
+
+          scattered
+          data
+
+          Univariate time series,                                  G13AAF
+          seasonal
+          and non-seasonal differencing
+
+          Univariate time series, seasonal and non-                G13AAF
+          seasonal
+          differencing
+
+          Univariate time series, preliminary estimation,          G13ADF
+          seasonal
+          ARIMA model
+
+          Univariate time series, estimation,                      G13AFF
+          seasonal
+          ARIMA model
+
+          seasonal
+          ARIMA model
+
+          1-D quadrature, adaptive, infinite or                    D01AMF
+          semi-infinite
+          interval
+
+          1-D quadrature, adaptive,                                D01ASF
+          semi-infinite
+          interval, weight function cos((omega)x) ...
+          Complex conjugate of Hermitian                           C06GBF
+          sequence
+
+          Complex conjugate of complex                             C06GCF
+          sequence
+
+          Complex conjugate of multiple Hermitian                  C06GQF
+          sequences
+
+          Convert Hermitian                                        C06GSF
+          sequences
+          to general complex sequences
+
+          Convert Hermitian sequences to general complex           C06GSF
+          sequences
+
+          sequence
+
+          sequence
+
+          Minimum, function of several variables,                  E04UCF
+          sequential
+          QP method, nonlinear constraints, using function ...
+
+          Interpolating functions, modified                        E01SEF
+          Shepard's
+          method, two variables
+
+          Sign                                                     G08AAF
+          test on two paired samples
+
+          Performs the Wilcoxon one-sample (matched pairs)         G08AGF
+          signed
+          rank test
+
+          Solution of complex                                      F04ADF
+          simultaneous
+          linear equations with multiple right-hand sides
+
+          Solution of real                                         F04ARF
+          simultaneous
+          linear equations, one right-hand side
+
+          Solution of real symmetric positive-definite             F04ASF
+          simultaneous
+          linear equations, one right-hand side using ...
+
+          Solution of real                                         F04ATF
+          simultaneous
+          linear equations, one right-hand side using ...
+
+          Solution of real sparse                                  F04AXF
+          simultaneous
+          linear equations (coefficient matrix already ...
+
+          simultaneous
+          linear equations, one right-hand side
+
+          Real sparse symmetric positive-definite                  F04MAF
+          simultaneous
+          linear equations (coefficient matrix already ...
+
+          Real sparse symmetric                                    F04MBF
+          simultaneous
+          linear equations
+
+          simultaneous
+          linear equations (coefficient matrix already ...
+
+          sin
+          ((omega)x)
+
+          sin
+          ((omega)x)
+
+          Sine                                                     S13ADF
+          integral Si(x)
+
+          2nd order Sturm-Liouville problem, regular/              D02KEF
+          singular
+          system, finite/infinite range, eigenvalue and ...
+
+          singularities
+          at user-specified break-points
+
+          singularities
+          of algebraico-logarithmic type
+
+          Mean, variance,                                          G01AAF
+          skewness
+          , kurtosis etc, one variable, from raw data
+
+          Mean, variance,                                          G01ADF
+          skewness
+          , kurtosis etc, one variable, from frequency table
+
+          Smallest                                                 X02AKF
+          positive model number
+
+          Univariate time series,                                  G13CBF
+          smoothed
+          sample spectrum using spectral smoothing by the ...
+
+          smoothing
+          by the trapezium frequency (Daniell) window
+
+          Multivariate time series,                                G13CDF
+          smoothed
+          sample cross spectrum using spectral smoothing by ...
+
+          smoothing
+          by the trapezium frequency (Daniell) window
+
+          Sort                                                     E02ZAF
+          2-D data into panels for fitting bicubic splines
+
+          Sort                                                     M01CAF
+          a vector, real numbers
+
+          LU factorization of real                                 F01BRF
+          sparse
+          matrix
+
+          LU factorization of real                                 F01BSF
+          sparse
+          matrix with known sparsity pattern
+
+          LU factorization of real sparse matrix with known        F01BSF
+          sparsity
+          pattern
+
+            T
+          LL  factorization of real                                F01MAF
+          sparse
+          symmetric positive-definite matrix
+
+          Selected eigenvalues and eigenvectors of                 F02FJF
+          sparse
+          symmetric eigenproblem
+
+          Solution of real                                         F04AXF
+          sparse
+          simultaneous linear equations (coefficient matrix ...
+
+          Real                                                     F04MAF
+          sparse
+          symmetric positive-definite simultaneous linear ...
+
+          Real                                                     F04MBF
+          sparse
+          symmetric simultaneous linear equations
+
+          Sparse                                                   F04QAF
+          linear least-squares problem, m real equations in ...
+
+          Kendall/                                                 G02BNF
+          Spearman
+          non-parametric rank correlation coefficients, no ...
+
+          Kendall/                                                 G02BQF
+          Spearman
+          non-parametric rank correlation coefficients, no ...
+
+          Approximation of                                         S
+          special
+          functions
+
+          Univariate time series, smoothed sample                  G13CBF
+          spectrum
+          using spectral smoothing by the trapezium frequency ...
+
+          spectral
+          smoothing by the trapezium frequency (Daniell) window
+
+          Multivariate time series, smoothed sample cross          G13CDF
+          spectrum
+          using spectral smoothing by the trapezium frequency ...
+
+          spectral
+          smoothing by the trapezium frequency (Daniell) window
+
+          Interpolating functions, cubic                           E01BAF
+          spline
+          interpolant, one variable
+
+          Interpolating functions, fitting bicubic                 E01DAF
+          spline
+          , data on rectangular grid
+
+          Least-squares curve cubic                                E02BAF
+          spline
+          fit (including interpolation)
+
+          Evaluation of fitted cubic                               E02BBF
+          spline
+          , function only
+
+          Evaluation of fitted cubic                               E02BCF
+          spline
+          , function and derivatives
+
+          Evaluation of fitted cubic                               E02BDF
+          spline
+          , definite integral
+
+          Least-squares cubic                                      E02BEF
+          spline
+          curve fit, automatic knot placement
+          Least-squares surface fit, bicubic                       E02DAF
+          splines
+
+          Least-squares surface fit by bicubic                     E02DCF
+          splines
+          with automatic knot placement, data on rectangular grid
+
+          Least-squares surface fit by bicubic                     E02DDF
+          splines
+          with automatic knot placement, scattered data
+
+          Evaluation of a fitted bicubic                           E02DEF
+          spline
+          at a vector of points
+
+          Evaluation of a fitted bicubic                           E02DFF
+          spline
+          at a mesh of points
+
+          Sort 2-D data into panels for fitting bicubic            E02ZAF
+          splines
+
+          B-                                                       E02
+          splines
+
+          Least-                                                   E02ADF
+          squares
+          curve fit, by polynomials, arbitrary data points
+
+          Least-                                                   E02AGF
+          squares
+          polynomial fit, values and derivatives may be ...
+
+          Least-                                                   E02BAF
+          squares
+          curve cubic spline fit (including interpolation)
+
+          Least-                                                   E02BEF
+          squares
+          cubic spline curve fit, automatic knot placement
+
+          Least-                                                   E02DAF
+          squares
+          surface fit, bicubic splines
+
+          Least-                                                   E02DCF
+          squares
+          surface fit by bicubic splines with automatic knot ...
+
+          Least-                                                   E02DDF
+          squares
+          surface fit by bicubic splines with automatic knot ...
+          Unconstrained minimum of a sum of                        E04FDF
+          squares
+          , combined Gauss-Newton and modified Newton algorithm .
+
+          Unconstrained minimum of a sum of                        E04GCF
+          squares
+          , combined Gauss-Newton and quasi-Newton algorithm, ...
+
+          Covariance matrix for nonlinear least-                   E04YCF
+          squares
+          problem
+
+          Least-                                                   F04JGF
+          squares
+          (if rank=n) or minimal least-squares (if ...
+
+          Least-squares (if rank=n) or minimal least-              F04JGF
+          squares
+          (if rank<n) solution of m real equations in n ...
+
+          Sparse linear least-                                     F04QAF
+          squares
+          problem, m real equations in n unknowns
+
+          Computes probabilities for the                           G01EAF
+          standard
+          Normal distribution
+
+          Computes deviates for the                                G01FAF
+          standard
+          Normal distribution
+
+          standard
+          error
+
+                            2
+          Performs the (chi)  goodness of fit test, for            G08CGF
+          standard
+          continuous distributions
+
+          Calculates                                               G02FAF
+          standardized
+          residuals and influence statistics
+
+          Calculates standardized residuals and influence          G02FAF
+          statistics
+
+          statistic
+          , no ties in pooled sample
+
+          statistic
+          , ties in pooled sample
+          Constructs a                                             G01ARF
+          stem
+          and leaf plot
+
+          ODEs,                                                    D02EJF
+          stiff
+          IVP, BDF method, until function of solution is zero, ..
+
+          Computes probabilities for                               G01EBF
+          Student's
+          t-distribution
+
+          Computes deviates for                                    G01FBF
+          Student's
+          t-distribution
+
+          2nd order                                                D02KEF
+          Sturm-Liouville
+          problem, regular/singular system, ...
+
+          Basic Linear Algebra                                     F06
+          Subprograms
+
+          Unconstrained minimum of a                               E04FDF
+          sum
+          of squares, combined Gauss-Newton and modified Newton .
+
+          Unconstrained minimum of a                               E04GCF
+          sum
+          of squares, combined Gauss-Newton and quasi-Newton ...
+
+          Sum                                                      F06EKF
+          the absolute values of real vector elements (DASUM)
+
+          Sum                                                      F06JKF
+          the absolute values of complex vector elements (DZASUM)
+
+          Computes a five-point                                    G01ALF
+          summary
+          (median, hinges and extremes)
+
+          Least-squares                                            E02DAF
+          surface
+          fit, bicubic splines
+
+          Least-squares                                            E02DCF
+          surface
+          fit by bicubic splines with automatic knot placement, .
+
+          Least-squares                                            E02DDF
+          surface
+          fit by bicubic splines with automatic knot placement, .
+          SVD                                                      F02WEF
+          of real matrix
+
+          SVD                                                      F02XEF
+          of complex matrix
+
+          Swap                                                     F06EGF
+          two real vectors (DSWAP)
+
+          Swap                                                     F06GGF
+          two complex vectors (ZSWAP)
+
+          Fresnel integral                                         S20ACF
+          S(x)
+
+            T
+          LL  factorization of real sparse                         F01MAF
+          symmetric
+          positive-definite matrix
+
+             T
+          LDL  factorization of real                               F01MCF
+          symmetric
+          positive-definite variable-bandwidth matrix
+
+          All eigenvalues of real                                  F02AAF
+          symmetric
+          matrix
+
+          All eigenvalues and eigenvectors of real                 F02ABF
+          symmetric
+          matrix
+
+          symmetric
+          and B is positive-definite
+
+          symmetric
+          and B is positive-definite
+
+          Selected eigenvalues and eigenvectors of real            F02BBF
+          symmetric
+          matrix
+
+          Selected eigenvalues and eigenvectors of sparse          F02FJF
+          symmetric
+          eigenproblem
+
+          Solution of real                                         F04ASF
+          symmetric
+          positive-definite simultaneous linear equations, ...
+
+          Solution of real                                         F04FAF
+          symmetric
+          positive-definite tridiagonal simultaneous linear ...
+
+          Real sparse                                              F04MAF
+          symmetric
+          positive-definite simultaneous linear equations ...
+
+          Real sparse                                              F04MBF
+          symmetric
+          simultaneous linear equations
+
+          Solution of real                                         F04MCF
+          symmetric
+          positive-definite variable-bandwidth simultaneous ...
+
+          Matrix-vector product, real                              F06PCF
+          symmetric
+          matrix (DSYMV)
+
+          Matrix-vector product, real                              F06PDF
+          symmetric
+          band matrix (DSBMV)
+
+          Matrix-vector product, real                              F06PEF
+          symmetric
+          packed matrix (DSPMV)
+
+          Rank-1 update, real                                      F06PPF
+          symmetric
+          matrix (DSYR)
+
+          Rank-1 update, real                                      F06PQF
+          symmetric
+          packed matrix (DSPR)
+
+          Rank-2 update, real                                      F06PRF
+          symmetric
+          matrix (DSYR2)
+
+          Rank-2 update, real                                      F06PSF
+          symmetric
+          packed matrix (DSPR2)
+
+          Matrix-matrix product, one real                          F06YCF
+          symmetric
+          matrix, one real rectangular matrix (DSYMM)
+
+          Rank-k update of a real                                  F06YPF
+          symmetric
+          matrix (DSYRK)
+
+          Rank-2k update of a real                                 F06YRF
+          symmetric
+          matrix (DSYR2K)
+
+          Matrix-matrix product, one complex                       F06ZTF
+          symmetric
+          matrix, one complex rectangular matrix (ZSYMM)
+
+          Rank-k update of a complex                               F06ZUF
+          symmetric
+          matrix (ZSYRK)
+
+          Rank-2k update of a complex                              F06ZWF
+          symmetric
+          matrix (ZHER2K)
+
+          Cholesky factorization of real                           F07FDF
+          symmetric
+          positive-definite matrix (DPOTRF)
+
+          Solution of real                                         F07FEF
+          symmetric
+          positive-definite system of linear equations, ...
+
+          Degenerate                                               S21BAF
+          symmetrised
+          elliptic integral of 1st kind R (x,y)
+                                         C
+
+          Symmetrised                                              S21BBF
+          elliptic integral of 1st kind R (x,y,z)
+                                         F
+
+          Symmetrised                                              S21BCF
+          elliptic integral of 2nd kind R (x,y,z)
+                                         D
+
+          Symmetrised                                              S21BDF
+          elliptic integral of 3rd kind R (x,y,z,r)
+                                         J
+
+          Solution of                                              C05NBF
+          system
+          of nonlinear equations using function values only
+
+          Solution of                                              C05PBF
+          system
+          of nonlinear equations using 1st derivatives
+
+          2nd order Sturm-Liouville problem, regular/singular      D02KEF
+          system
+          , finite/infinite range, eigenvalue and eigenfunction,
+
+          System                                                   F06PJF
+          of equations, real triangular matrix (DTRSV)
+
+          System                                                   F06PKF
+          of equations, real triangular band matrix (DTBSV)
+
+          System                                                   F06PLF
+          of equations, real triangular packed matrix (DTPSV)
+
+          System                                                   F06SJF
+          of equations, complex triangular matrix (ZTRSV)
+
+          System                                                   F06SKF
+          of equations, complex triangular band matrix (ZTBSV)
+
+          System                                                   F06SLF
+          of equations, complex triangular packed matrix (ZTPSV)
+
+          Solves a                                                 F06YJF
+          system
+          of equations with multiple right-hand sides, real ...
+
+          Solves                                                   F06ZJF
+          system
+          of equations with multiple right-hand sides, complex ..
+
+          Solution of real                                         F07AEF
+          system
+          of linear equations, multiple right-hand sides, matrix
+
+          Solution of real symmetric positive-definite             F07FEF
+          system
+          of linear equations, multiple right-hand sides, matrix
+
+          Computes probabilities for Student's                     G01EBF
+          t-distribution
+
+          Computes deviates for Student's                          G01FBF
+          t-distribution
+
+          table
+
+          Frequency                                                G01AEF
+          table
+          from raw data
+
+          Two-way contingency                                      G01AFF
+          table
+                              2
+          analysis, with (chi) /Fisher's exact test
+
+          Computes upper and lower                                 G01EEF
+          tail
+          and probability density function probabilities for the
+
+                                        2
+          test
+
+          Sign                                                     G08AAF
+          test
+          on two paired samples
+
+          Median                                                   G08ACF
+          test
+          on two samples of unequal size
+
+          test
+
+          Performs the Mann-Whitney U                              G08AHF
+          test
+          on two independent samples
+
+                            2
+          Performs the (chi)  goodness of fit                      G08CGF
+          test
+          , for standard continuous distributions
+
+          Goodness of fit                                          G08
+          tests
+
+          Location                                                 G08
+          tests
+
+          Non-parametric                                           G08
+          tests
+
+          ties
+          in pooled sample
+
+          ties
+          in pooled sample
+
+          Generates a realisation of a multivariate                G05HDF
+          time
+          series from a VARMA model
+
+          Univariate                                               G13AAF
+          time
+          series, seasonal and non-seasonal differencing
+
+          Univariate                                               G13ABF
+          time
+          series, sample autocorrelation function
+
+          Univariate                                               G13ACF
+          time
+          series, partial autocorrelations from autocorrelations
+
+          Univariate                                               G13ADF
+          time
+          series, preliminary estimation, seasonal ARIMA model
+
+          Univariate                                               G13AFF
+          time
+          series, estimation, seasonal ARIMA model
+
+          Univariate                                               G13AGF
+          time
+          series, update state set for forecasting
+
+          Univariate                                               G13AHF
+          time
+          series, forecasting from state set
+
+          Univariate                                               G13AJF
+          time
+          series, state set and forecasts, from fully specified .
+
+          Univariate                                               G13ASF
+          time
+          series, diagnostic checking of residuals, following
+          G13AFF
+
+          Multivariate                                             G13BAF
+          time
+          series, filtering (pre-whitening) by an ARIMA model
+
+          Multivariate                                             G13BCF
+          time
+          series, cross-correlations
+
+          Multivariate                                             G13BDF
+          time
+          series, preliminary estimation of transfer function
+          model
+
+          Multivariate                                             G13BEF
+          time
+          series, estimation of multi-input model
+
+          Multivariate                                             G13BJF
+          time
+          series, state set and forecasts from fully specified ..
+
+          Univariate                                               G13CBF
+          time
+          series, smoothed sample spectrum using spectral ...
+
+          Multivariate                                             G13CDF
+          time
+          series, smoothed sample cross spectrum using spectral .
+
+          Return date and                                          X05AAF
+          time
+          as an array of integers
+
+          Convert array of integers representing date and          X05ABF
+          time
+          to character string
+
+          Compare two character strings representing date and      X05ACF
+          time
+
+          Return the CPU                                           X05BAF
+          time
+
+          Multivariate time series, preliminary estimation of      G13BDF
+          transfer
+          function model
+
+          Single 1-D real discrete Fourier                         C06EAF
+          transform
+          , no extra workspace
+
+          Single 1-D Hermitian discrete Fourier                    C06EBF
+          transform
+          , no extra workspace
+
+          Single 1-D complex discrete Fourier                      C06ECF
+          transform
+          , no extra workspace
+
+          Multiple 1-D real discrete Fourier                       C06FPF
+          transforms
+
+          Multiple 1-D Hermitian discrete Fourier                  C06FQF
+          transforms
+
+          Multiple 1-D complex discrete Fourier                    C06FRF
+          transforms
+
+          2-D complex discrete Fourier                             C06FUF
+          transform
+
+          transform)
+
+          trapezium
+          frequency (Daniell) window
+          trapezium
+          frequency (Daniell) window
+
+          Matrix-vector product, real                              F06PFF
+          triangular
+          matrix (DTRMV)
+
+          Matrix-vector product, real                              F06PGF
+          triangular
+          band matrix (DTBMV)
+
+          Matrix-vector product, real                              F06PHF
+          triangular
+          packed matrix (DTPMV)
+
+          System of equations, real                                F06PJF
+          triangular
+          matrix (DTRSV)
+
+          System of equations, real                                F06PKF
+          triangular
+          band matrix (DTBSV)
+
+          System of equations, real                                F06PLF
+          triangular
+          packed matrix (DTPSV)
+
+          Matrix-vector product, complex                           F06SFF
+          triangular
+          matrix (ZTRMV)
+
+          Matrix-vector product, complex                           F06SGF
+          triangular
+          band matrix (ZTBMV)
+
+          Matrix-vector product, complex                           F06SHF
+          triangular
+          packed matrix (ZTPMV)
+
+          System of equations, complex                             F06SJF
+          triangular
+          matrix (ZTRSV)
+
+          System of equations, complex                             F06SKF
+          triangular
+          band matrix (ZTBSV)
+
+          System of equations, complex                             F06SLF
+          triangular
+          packed matrix (ZTPSV)
+
+          Matrix-matrix product, one real                          F06YFF
+          triangular
+          matrix, one real rectangular matrix (DTRMM)
+
+          triangular
+          coefficient matrix (DTRSM)
+
+          Matrix-matrix product, one complex                       F06ZFF
+          triangular
+          matrix, one complex rectangular matrix (ZTRMM)
+
+          triangular
+          coefficient matrix (ZTRSM)
+
+          Solution of real symmetric positive-definite             F04FAF
+          tridiagonal
+          simultaneous linear equations, one right-hand side
+
+          Two-way                                                  G01AFF
+                                                2
+          contingency table analysis, with (chi)  ...
+
+          Sign test on                                             G08AAF
+          two
+          paired samples
+
+          Median test on                                           G08ACF
+          two
+          samples of unequal size
+
+          Friedman                                                 G08AEF
+          two-way
+          analysis of variance on k matched samples
+
+          Performs the Mann-Whitney U test on                      G08AHF
+          two
+          independent samples
+
+          Compare                                                  X05ACF
+          two
+          character strings representing date and time
+
+          Dot product of two complex vectors,                      F06GAF
+          unconjugated
+          (ZDOTU)
+
+          Rank-1 update, complex rectangular matrix,               F06SMF
+          unconjugated
+          vector (ZGERU)
+
+          Unconstrained                                            E04DGF
+          minimum, pre-conditioned conjugate gradient ...
+
+          Unconstrained                                            E04FDF
+          minimum of a sum of squares, combined ...
+
+          Unconstrained                                            E04GCF
+          minimum of a sum of squares, combined ...
+
+          Switch for taking precautions to avoid                   X02DAF
+          underflow
+
+          Pseudo-random real numbers,                              G05CAF
+          uniform
+          distribution over (0,1)
+
+          Pseudo-random integer from                               G05DYF
+          uniform
+          distribution
+
+          Generates a vector of random numbers from a              G05FAF
+          uniform
+          distribution
+
+          Operations with                                          F01RDF
+          unitary
+                                   H
+          matrices, compute QB or Q B after ...
+
+          Operations with                                          F01REF
+          unitary
+          matrices, form columns of Q after factorization by ...
+
+          Univariate                                               G13AAF
+          time series, seasonal and non-seasonal differencing
+
+          Univariate                                               G13ABF
+          time series, sample autocorrelation function
+
+          Univariate                                               G13ACF
+          time series, partial autocorrelations from ...
+
+          Univariate                                               G13ADF
+          time series, preliminary estimation, seasonal ...
+
+          Univariate                                               G13AFF
+          time series, estimation, seasonal ARIMA model
+
+          Univariate                                               G13AGF
+          time series, update state set for forecasting
+
+          Univariate                                               G13AHF
+          time series, forecasting from state set
+
+          Univariate                                               G13AJF
+          time series, state set and forecasts, from fully ...
+
+          Univariate                                               G13ASF
+          time series, diagnostic checking of residuals, ...
+
+          Univariate                                               G13CBF
+          time series, smoothed sample spectrum using ...
+
+          Rank-1                                                   F06PMF
+          update
+          , real rectangular matrix (DGER)
+
+          Rank-1                                                   F06PPF
+          update
+          , real symmetric matrix (DSYR)
+
+          Rank-1                                                   F06PQF
+          update
+          , real symmetric packed matrix (DSPR)
+
+          Rank-2                                                   F06PRF
+          update
+          , real symmetric matrix (DSYR2)
+
+          Rank-2                                                   F06PSF
+          update
+          , real symmetric packed matrix (DSPR2)
+
+          Rank-1                                                   F06SMF
+          update
+          , complex rectangular matrix, unconjugated vector
+          (ZGERU)
+
+          Rank-1                                                   F06SNF
+          update
+          , complex rectangular matrix, conjugated vector (ZGERC)
+
+          Rank-1                                                   F06SPF
+          update
+          , complex Hermitian matrix (ZHER)
+
+          Rank-1                                                   F06SQF
+          update
+          , complex Hermitian packed matrix (ZHPR)
+
+          Rank-2                                                   F06SRF
+          update
+          , complex Hermitian matrix (ZHER2)
+
+          Rank-2                                                   F06SSF
+          update
+          , complex Hermitian packed matrix (ZHPR2)
+          Rank-k                                                   F06YPF
+          update
+          of a real symmetric matrix (DSYRK)
+
+          Rank-2k                                                  F06YRF
+          update
+          of a real symmetric matrix (DSYR2K)
+
+          Rank-k                                                   F06ZPF
+          update
+          of a complex Hermitian matrix (ZHERK)
+
+          Rank-2k                                                  F06ZRF
+          update
+          of a complex Hermitian matrix (ZHER2K)
+
+          Rank-k                                                   F06ZUF
+          update
+          of a complex symmetric matrix (ZSYRK)
+
+          Rank-2k                                                  F06ZWF
+          update
+          of a complex symmetric matrix (ZHER2K)
+
+          Univariate time series,                                  G13AGF
+          update
+          state set for forecasting
+
+          Computes                                                 G01EEF
+          upper
+          and lower tail and probability density function ...
+
+          Input/output                                             X04
+          utilities
+
+          Mean,                                                    G01AAF
+          variance
+          , skewness, kurtosis etc, one variable, from raw data
+
+          Mean,                                                    G01ADF
+          variance
+          , skewness, kurtosis etc, one variable, from ...
+
+          Friedman two-way analysis of                             G08AEF
+          variance
+          on k matched samples
+
+          Kruskal-Wallis one-way analysis of                       G08AFF
+          variance
+          on k samples of unequal size
+
+          VARMA
+          model
+
+          Circular convolution or correlation of two real          C06EKF
+          vectors
+          , no extra workspace
+
+          Evaluation of a fitted bicubic spline at a               E02DEF
+          vector
+          of points
+
+          Dot product of two real                                  F06EAF
+          vectors
+          (DDOT)
+
+          Add scalar times real                                    F06ECF
+          vector
+          to real vector (DAXPY)
+
+          Add scalar times real vector to real                     F06ECF
+          vector
+          (DAXPY)
+
+          Multiply real                                            F06EDF
+          vector
+          by scalar (DSCAL)
+
+          Copy real                                                F06EFF
+          vector
+          (DCOPY)
+
+          Swap two real                                            F06EGF
+          vectors
+          (DSWAP)
+
+          Compute Euclidean norm of real                           F06EJF
+          vector
+          (DNRM2)
+
+          Sum the absolute values of real                          F06EKF
+          vector
+          elements (DASUM)
+
+          Dot product of two complex                               F06GAF
+          vectors
+          , unconjugated (ZDOTU)
+
+          Dot product of two complex                               F06GBF
+          vectors
+          , conjugated (ZDOTC)
+
+          Add scalar times complex                                 F06GCF
+          vector
+          to complex vector (ZAXPY)
+
+          Add scalar times complex vector to complex               F06GCF
+          vector
+          (ZAXPY)
+
+          Multiply complex                                         F06GDF
+          vector
+          by complex scalar (ZSCAL)
+
+          Copy complex                                             F06GFF
+          vector
+          (ZCOPY)
+
+          Swap two complex                                         F06GGF
+          vectors
+          (ZSWAP)
+
+          Multiply complex                                         F06JDF
+          vector
+          by real scalar (ZDSCAL)
+
+          Compute Euclidean norm of complex                        F06JJF
+          vector
+          (DZNRM2)
+
+          Sum the absolute values of complex                       F06JKF
+          vector
+          elements (DZASUM)
+
+          Index, real                                              F06JLF
+          vector
+          element with largest absolute value (IDAMAX)
+
+          Index, complex                                           F06JMF
+          vector
+          element with largest absolute value (IZAMAX)
+
+          Matrix-                                                  F06PAF
+          vector
+          product, real rectangular matrix (DGEMV)
+
+          Matrix-                                                  F06PBF
+          vector
+          product, real rectangular band matrix (DGBMV)
+
+          Matrix-                                                  F06PCF
+          vector
+          product, real symmetric matrix (DSYMV)
+
+          Matrix-                                                  F06PDF
+          vector
+          product, real symmetric band matrix (DSBMV)
+
+          Matrix-                                                  F06PEF
+          vector
+          product, real symmetric packed matrix (DSPMV)
+
+          Matrix-                                                  F06PFF
+          vector
+          product, real triangular matrix (DTRMV)
+
+          Matrix-                                                  F06PGF
+          vector
+          product, real triangular band matrix (DTBMV)
+
+          Matrix-                                                  F06PHF
+          vector
+          product, real triangular packed matrix (DTPMV)
+
+          Matrix-                                                  F06SAF
+          vector
+          product, complex rectangular matrix (ZGEMV)
+
+          Matrix-                                                  F06SBF
+          vector
+          product, complex rectangular band matrix (ZGBMV)
+
+          Matrix-                                                  F06SCF
+          vector
+          product, complex Hermitian matrix (ZHEMV)
+
+          Matrix-                                                  F06SDF
+          vector
+          product, complex Hermitian band matrix (ZHBMV)
+
+          Matrix-                                                  F06SEF
+          vector
+          product, complex Hermitian packed matrix (ZHPMV)
+
+          Matrix-                                                  F06SFF
+          vector
+          product, complex triangular matrix (ZTRMV)
+
+          Matrix-                                                  F06SGF
+          vector
+          product, complex triangular band matrix (ZTBMV)
+
+          Matrix-                                                  F06SHF
+          vector
+          product, complex triangular packed matrix (ZTPMV)
+
+          vector
+          (ZGERU)
+          Rank-1 update, complex rectangular matrix, conjugated    F06SNF
+          vector
+          (ZGERC)
+
+          Set up reference                                         G05EAF
+          vector
+          for multivariate Normal distribution
+
+          Set up reference                                         G05ECF
+          vector
+          for generating pseudo-random integers, Poisson ...
+
+          Set up reference                                         G05EDF
+          vector
+          for generating pseudo-random integers, binomial ...
+
+          Pseudo-random permutation of an integer                  G05EHF
+          vector
+
+          Pseudo-random sample from an integer                     G05EJF
+          vector
+
+          Set up reference                                         G05EXF
+          vector
+          from supplied cumulative distribution function or ...
+
+          Pseudo-random integer from reference                     G05EYF
+          vector
+
+          Pseudo-random multivariate Normal                        G05EZF
+          vector
+          from reference vector
+
+          vector
+
+          Generates a                                              G05FAF
+          vector
+          of random numbers from a uniform distribution
+
+          Generates a                                              G05FBF
+          vector
+          of random numbers from an (negative) exponential ...
+
+          Generates a                                              G05FDF
+          vector
+          of random numbers from a Normal distribution
+
+          Generates a                                              G05FEF
+          vector
+          of pseudo-random numbers from a beta distribution
+
+          Generates a                                              G05FFF
+          vector
+          of pseudo-random numbers from a gamma distribution
+
+          Sort a                                                   M01CAF
+          vector
+          , real numbers
+
+          Rank a                                                   M01DAF
+          vector
+          , real numbers
+
+          Rearrange a                                              M01EAF
+          vector
+          according to given ranks, real numbers
+
+          Kruskal-                                                 G08AFF
+          Wallis
+          one-way analysis of variance on k samples of unequal ..
+
+          Pseudo-random real numbers,                              G05DPF
+          Weibull
+          distribution
+
+          1-D quadrature, adaptive, finite interval,               D01ANF
+          weight
+          function cos((omega)x) or sin((omega)x)
+
+          1-D quadrature, adaptive, finite interval,               D01APF
+          weight
+          function with end-point singularities of ...
+
+          1-D quadrature, adaptive, finite interval,               D01AQF
+          weight
+          function 1/(x-c), Cauchy principal value ...
+
+          1-D quadrature, adaptive, semi-infinite interval,        D01ASF
+          weight
+          function cos((omega)x) or sin((omega)x)
+
+          Pre-computed                                             D01BBF
+          weights
+          and abscissae for Gaussian quadrature rules, ...
+
+          Computes (optionally                                     G02BXF
+          weighted)
+          correlation and covariance matrices
+
+          Multivariate time series, filtering (pre-                G13BAF
+          whitening)
+          by an ARIMA model
+
+          Performs the Mann-                                       G08AHF
+          Whitney
+          U test on two independent samples
+
+          Computes the exact probabilities for the Mann-           G08AJF
+          Whitney
+          U statistic, no ties in pooled sample
+
+          Computes the exact probabilities for the Mann-           G08AKF
+          Whitney
+          U statistic, ties in pooled sample
+
+          Performs the                                             G08AGF
+          Wilcoxon
+          one-sample (matched pairs) signed rank test
+
+          window
+
+          window
+
+          Two-way contingency table analysis, with                 G01AFF
+               2
+          (chi)
+          /Fisher's exact test
+
+          Computes probabilities for                               G01ECF
+               2
+          (chi)
+          distribution
+
+          Computes deviates for the                                G01FCF
+               2
+          (chi)
+          distribution
+
+          Performs the                                             G08CGF
+               2
+          (chi)
+          goodness of fit test, for standard continuous ...
+
+          All                                                      C02AFF
+          zeros
+          of complex polynomial, modified Laguerre method
+
+          All                                                      C02AGF
+          zeros
+          of real polynomial, modified Laguerre method
+
+          Zero                                                     C05ADF
+          of continuous function in given interval, Bus and
+          Dekker ...
+
+          zero
+          (simple driver)
+
+          zero
+          , intermediate output (simple driver)
+
+          zero
+          , intermediate output (simple driver)
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\subsection{NAG Documentation: conversion}
+\label{manpageXXconvert}
+\index{pages!manpageXXconvert!nagaux.ht}
+\index{nagaux.ht!pages!manpageXXconvert}
+\index{manpageXXconvert!nagaux.ht!pages}
+<<nagaux.ht>>=
+\begin{page}{manpageXXconvert}{NAG Documentation: conversion}
+\beginscroll
+\begin{verbatim}
+
+
+
+     CONVERSION(3NAG)  Foundation Library (12/10/92)  CONVERSION(3NAG)
+
+
+
+          Introduction              Converting from the Workstation Library
+          Converting from the Workstation Library
+
+          The NAG Foundation Library is a successor product to an earlier,
+          smaller subset of the full NAG Fortran Library which was called
+          the NAG Workstation Library. The Foundation Library has been
+          designed to be upwards compatible, in terms of functionality,
+          with the Workstation Library. However some routines that were
+          present in the Workstation Library have been replaced by more up-
+          to-date routines from the NAG Fortran Library, which provide
+          improved algorithms or software design.
+
+          The list below gives the names of those routines which were
+          available in the Workstation Library, but are not included in the
+          Foundation Library. For each such routine, it also gives the name
+          of the routine in the Foundation Library which best covers the
+          same functionality.
+
+              Workstation    Foundation
+              Library        Library
+
+              C02AEF         C02AGF
+
+              D02CBF         D02CJF
+
+              D02CHF         D02CJF
+
+              D02EBF         D02EJF
+
+              D02EHF         D02EJF
+
+              D02HAF         D02GAF
+
+              D02HBF         D02RAF
+
+              D02SAF         D02RAF
+
+              E02DBF         E02DEF
+
+              E04VDF         E04UCF
+
+              E04ZCF         E04UCF (see Note 1)
+
+              F01BTF         F07ADF
+
+              F01BXF         F07FDF
+
+              F02WAF         F02WEF
+
+              F04AYF         F07AEF
+
+              F04AZF         F07FEF
+
+              F04YAF         G02DAF
+
+              G01ABF         G02BXF (with M = 2)
+
+              G01BAF         G01EBF
+
+              G01BBF         G01EDF
+
+              G01BCF         G01ECF
+
+              G01BDF         G01EEF
+
+              G01CAF         G01FBF
+
+              G01CBF         G01FDF
+
+              G01CCF         G01FCF
+
+              G01CDF         G01FEF
+
+              G01CEF         G01FAF
+
+              G02BAF         G02BXF
+
+              G02BGF         G02BXF
+
+              G02CEF         G02DAF (see Note 2)
+
+              G02CGF         G02DAF
+
+              G02CJF         G02DAF
+
+              G05DBF         G05FBF
+
+              G05DCF         G05CAF (see Note 3)
+
+              G05DEF         G05FFF
+
+              G05DHF         G05FFF (see Note 4)
+
+              G05EGF         G05HDF
+
+              G05EWF         G05HDF
+
+              G08ABF         G08AGF
+
+              G08ADF         G08AHF
+
+              M01AKF         M01DAF
+
+              M01APF         M01CAF
+
+              S15ABF         G01EAF
+
+              S15ACF         G01EAF
+
+              X02AAF         X02AJF
+
+              X02ACF         X02ALF
+
+          Notes:
+
+          1.    E04ZCF checks user-supplied routines for evaluating the
+                first derivatives of the objective function and constraint
+                functions supplied to E04VDF. This functionality is now
+                provided by E04UCF, using the optional parameters Verify
+                Objective Gradients and Verify Constraint Gradients.
+
+          2.    G02CEF selects variables to be included in a linear
+                regression performed by G02CGF. This functionality is now
+                provided by the parameter ISX of G02DAF.
+
+          3.    A call to G05DCF can be replaced by a simple transformation
+                of the result of a call to G05CAF. The statement
+                     X = G05DCF(A,B)
+                can be replaced by the statements
+
+                     X = G05CAF(X)
+                     X = A + B*LOG(X/(1.0D0-X))
+
+                                                            2
+          4.    G05DHF generates random numbers from a (chi)  distribution
+                with N degrees of freedom. This can be achieved by calling
+                G05FFF with the values DBLE(N)/2.0D0 and 2.0D0 for the
+                parameters A and B respectively.
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\section{nagc.ht}
+\subsection{ Zeros of Polynomials}
+\label{manpageXXc02}
+\index{pages!manpageXXc02!nagc.ht}
+\index{nagc.ht!pages!manpageXXc02}
+\index{manpageXXc02!nagc.ht!pages}
+<<nagc.ht>>=
+\begin{page}{manpageXXc02}{NAG Documentation: c02}
+\beginscroll
+\begin{verbatim}
+
+
+
+     C02(3NAG)         Foundation Library (12/10/92)         C02(3NAG)
+
+
+
+          C02 -- Zeros of Polynomials                   Introduction -- C02
+                                    Chapter C02
+                               Zeros of Polynomials
+
+          1. Scope of the Chapter
+
+          This chapter is concerned with computing the zeros of a
+          polynomial with real or complex coefficients.
+
+          2. Background to the Problems
+
+          Let f(z) be a polynomial of degree n with complex coefficients
+          a :
+           i
+
+                            n    n-1    n-2
+                   f(z)==a z +a z   +a z   +...+a   z+a ,  a /=0.
+                          0    1      2          n-1   n    0
+
+          A complex number z  is called a zero of f(z) (or equivalently a
+                            1
+          root of the equation f(z)=0), if:
+
+                                      f(z )=0.
+                                         1
+
+          If z  is a zero, then f(z) can be divided by a factor (z-z ):
+              1                                                     1
+
+                                f(z)=(z-z )f (z)                        (1)
+                                         1  1
+
+          where f (z) is a polynomial of degree n-1. By the Fundamental
+                 1
+          Theorem of Algebra, a polynomial f(z) always has a zero, and so
+          the process of dividing out factors (z-z ) can be continued until
+                                                  i
+          we have a complete factorization of f(z)
+
+                           f(z)==a (z-z )(z-z )...(z-z ).
+                                  0    1     2        n
+
+          Here the complex numbers z ,z ,...,z  are the zeros of f(z); they
+                                    1  2      n
+          may not all be distinct, so it is sometimes more convenient to
+          write:
+
+                                   m       m          m
+                                    1       2          k
+                     f(z)==a (z-z )  (z-z )  ...(z-z )  ,  k<=n,
+                            0    1       2          k
+
+          with distinct zeros z ,z ,...,z  and multiplicities m >=1. If
+                               1  2      k                     i
+          m =1, z  is called a single zero, if m >1, z  is called a
+           i     i                              i     i
+          multiple or repeated zero; a multiple zero is also a zero of the
+          derivative of f(z).
+
+          If the coefficients of f(z) are all real, then the zeros of f(z)
+          are either real or else occur as pairs of conjugate complex
+          numbers x+iy and x-iy. A pair of complex conjugate zeros are the
+                                                 2
+          zeros of a quadratic factor of f(z), (z +rz+s), with real
+          coefficients r and s.
+
+          Mathematicians are accustomed to thinking of polynomials as
+          pleasantly simple functions to work with. However the problem of
+          numerically computing the zeros of an arbitrary polynomial is far
+          from simple. A great variety of algorithms have been proposed, of
+          which a number have been widely used in practice; for a fairly
+          comprehensive survey, see Householder [1]. All general algorithms
+          are iterative. Most converge to one zero at a time; the
+          corresponding factor can then be divided out as in equation (1)
+          above - this process is called deflation or, loosely, dividing
+          out the zero - and the algorithm can be applied again to the
+          polynomial f (z). A pair of complex conjugate zeros can be
+                      1
+          divided out together - this corresponds to dividing f(z) by a
+          quadratic factor.
+
+          Whatever the theoretical basis of the algorithm, a number of
+          practical problems arise: for a thorough discussion of some of
+          them see Peters and Wilkinson [2] and Wilkinson [3]. The most
+          elementary point is that, even if z  is mathematically an exact
+                                             1
+          zero of f(z), because of the fundamental limitations of computer
+          arithmetic the computed value of f(z ) will not necessarily be
+                                              1
+          exactly 0.0. In practice there is usually a small region of
+          values of z about the exact zero at which the computed value of
+          f(z) becomes swamped by rounding errors. Moreover in many
+          algorithms this inaccuracy in the computed value of f(z) results
+          in a similar inaccuracy in the computed step from one iterate to
+          the next. This limits the precision with which any zero can be
+          computed. Deflation is another potential cause of trouble, since,
+          in the notation of equation (1), the computed coefficients of
+          f (z) will not be completely accurate, especially if z  is not an
+           1                                                    1
+          exact zero of f(z); so the zeros of the computed f (z) will
+                                                            1
+          deviate from the zeros of f(z).
+
+          A zero is called ill-conditioned if it is sensitive to small
+          changes in the coefficients of the polynomial. An ill-conditioned
+          zero is likewise sensitive to the computational inaccuracies just
+          mentioned. Conversely a zero is called well-conditioned if it is
+          comparatively insensitive to such perturbations. Roughly speaking
+          a zero which is well separated from other zeros is well-
+          conditioned, while zeros which are close together are ill-
+          conditioned, but in talking about 'closeness' the decisive factor
+          is not the absolute distance between neighbouring zeros but their
+          ratio: if the ratio is close to 1 the zeros are ill-conditioned.
+          In particular, multiple zeros are ill-conditioned. A multiple
+          zero is usually split into a cluster of zeros by perturbations in
+          the polynomial or computational inaccuracies.
+
+          2.1. References
+
+          [1]   Householder A S (1970) The Numerical Treatment of a Single
+                Nonlinear Equation. McGraw-Hill.
+
+          [2]   Peters G and Wilkinson J H (1971) Practical Problems Arising
+                in the Solution of Polynomial Equations. J. Inst. Maths
+                Applics. 8 16--35.
+
+          [3]   Wilkinson J H (1963) Rounding Errors in Algebraic Processes,
+                Chapter 2. HMSO.
+
+          3. Recommendations on Choice and Use of Routines
+
+          3.1. Discussion
+
+          Two routines are available: C02AFF for polynomials with complex
+          coefficients and C02AGF for polynomials with real coefficients.
+
+          C02AFF and C02AGF both use a variant of Laguerre's Method due to
+          BT Smith to calculate each zero until the degree of the deflated
+          polynomial is less than 3, whereupon the remaining zeros are
+          obtained using the 'standard' closed formulae for a quadratic or
+          linear equation.
+
+          The accuracy of the roots will depend on how ill-conditioned they
+          are. Peters and Wilkinson [2] describe techniques for estimating
+          the errors in the zeros after they have been computed.
+
+          3.2. Index
+
+           Zeros of a complex polynomial                             C02AFF
+           Zeros of a real polynomial                                C02AGF
+
+
+          C02 -- Zeros of Polynomials                       Contents -- C02
+          Chapter C02
+
+          Zeros of Polynomials
+
+          C02AFF  All zeros of complex polynomial, modified Laguerre method
+
+          C02AGF  All zeros of real polynomial, modified Laguerre method
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\subsection{ Roots of a complex polynomial equation}
+\label{manpageXXc02aff}
+\index{pages!manpageXXc02aff!nagc.ht}
+\index{nagc.ht!pages!manpageXXc02aff}
+\index{manpageXXc02aff!nagc.ht!pages}
+<<nagc.ht>>=
+\begin{page}{manpageXXc02aff}{NAG Documentation: c02aff}
+\beginscroll
+\begin{verbatim}
+
+
+
+     C02AFF(3NAG)      Foundation Library (12/10/92)      C02AFF(3NAG)
+
+
+
+          C02 -- Zeros of Polynomials                                C02AFF
+                  C02AFF -- NAG Foundation Library Routine Document
+
+          Note: Before using this routine, please read the Users' Note for
+          your implementation to check implementation-dependent details.
+          The symbol (*) after a NAG routine name denotes a routine that is
+          not included in the Foundation Library.
+
+          1. Purpose
+
+          C02AFF finds all the roots of a complex polynomial equation,
+          using a variant of Laguerre's Method.
+
+          2. Specification
+
+                 SUBROUTINE C02AFF (A, N, SCALE, Z, W, IFAIL)
+                 INTEGER          N, IFAIL
+                 DOUBLE PRECISION A(2,N+1), Z(2,N), W(4*(N+1))
+                 LOGICAL          SCALE
+
+          3. Description
+
+          The routine attempts to find all the roots of the nth degree
+          complex polynomial equation
+
+                               n    n-1    n-2
+                       P(z)=a z +a z   +a z   +...+a   z+a =0.
+                             0    1      2          n-1   n
+
+          The roots are located using a modified form of Laguerre's Method,
+          originally proposed by Smith [2].
+
+          The method of Laguerre [3] can be described by the iterative
+          scheme
+
+                                             -n*P(z )
+                                                   k
+                          L(z )=z   -z = ----------------,
+                             k   k+1  k             
+                                         P'(z )+-  /H(z )
+                                             k   \/    k
+
+                                           2
+          where H(z )=(n-1)*[(n-1)*(P'(z )) -n*P(z )P''(z )], and z  is
+                   k                    k         k      k         0
+          specified.
+
+          The sign in the denominator is chosen so that the modulus of the
+          Laguerre step at z , viz. |L(z )|, is as small as possible. The
+                            k           k
+          method can be shown to be cubically convergent for isolated roots
+          (real or complex) and linearly convergent for multiple roots.
+          The routine generates a sequence of iterates z , z , z ,..., such
+                                                        1   2   3
+          that |P(z   )|<|P(z )| and ensures that z   +L(z   ) 'roughly'
+                   k+1       k                     k+1    k+1
+          lies inside a circular region of radius |F| about z  known to
+                                                             k
+          contain a zero of P(z); that is, |L(z   )|<=|F|, where F denotes
+                                               k+1
+          the Fejer bound (see Marden [1]) at the point z . Following Smith
+                                                         k
+          [2], F is taken to be min(B,1.445*n*R), where B is an upper bound
+          for the magnitude of the smallest zero given by
+
+                                                         1/n
+                      B=1.0001*min(\/n*L(z ),|r |,|a /a |   ),
+                                          k    1    n  0
+
+          r  is the zero X of smaller magnitude of the quadratic equation
+           1
+
+                                           2
+                    2(P''(z )/(2*n*(n-1)))X +2(P'(z )/n)X+P(z )=0
+                           k                       k         k
+
+          and the Cauchy lower bound R for the smallest zero is computed
+          (using Newton's Method) as the positive root of the polynomial
+          equation
+
+                         n      n-1      n-2
+                    |a |z +|a |z   +|a |z   +...+|a   |z-|a |=0.
+                      0      1        2            n-1     n
+
+          Starting from the origin, successive iterates are generated
+          according to the rule z   =z +L(z ) for k = 1,2,3,... and L(z )
+                                 k+1  k    k                           k
+          is 'adjusted' so that |P(z   )|<|P(z )| and |L(z   )|<=|F|. The
+                                    k+1       k           k+1
+          iterative procedure terminates if P(z   ) is smaller in absolute
+                                               k+1
+          value than the bound on the rounding error in P(z   ) and the
+                                                           k+1
+          current iterate z =z    is taken to be a zero of P(z). The
+                           p  k+1
+                              ~
+          deflated polynomial P(z)=P(z)/(z-z ) of degree n-1 is then
+                                            p
+          formed, and the above procedure is repeated on the deflated
+          polynomial until n<3, whereupon the remaining roots are obtained
+          via the 'standard' closed formulae for a linear (n = 1) or
+          quadratic (n = 2) equation.
+
+          To obtain the roots of a quadratic polynomial, C02AHF(*) can be
+          used.
+
+          4. References
+
+          [1]   Marden M (1966) Geometry of Polynomials. Mathematical
+                Surveys. 3 Am. Math. Soc., Providence, RI.
+
+          [2]   Smith B T (1967) ZERPOL: A Zero Finding Algorithm for
+                Polynomials Using Laguerre's Method. Technical Report.
+                Department of Computer Science, University of Toronto,
+                Canada.
+
+          [3]   Wilkinson J H (1965) The Algebraic Eigenvalue Problem.
+                Clarendon Press.
+
+          5. Parameters
+
+           1:  A(2,N+1) -- DOUBLE PRECISION array                     Input
+               On entry: if A is declared with bounds (2,0:N), then A(1,i)
+               and A(2,i) must contain the real and imaginary parts of a
+                                                                        i
+                                          n-i
+               (i.e., the coefficient of z   ), for i=0,1,...,n.
+               Constraint: A(1,0) /= 0.0 or A(2,0) /= 0.0.
+
+           2:  N -- INTEGER                                           Input
+               On entry: the degree of the polynomial, n. Constraint: N >=
+               1.
+
+           3:  SCALE -- LOGICAL                                       Input
+               On entry: indicates whether or not the polynomial is to be
+               scaled. See Section 8 for advice on when it may be
+               preferable to set SCALE = .FALSE. and for a description of
+               the scaling strategy. Suggested value: SCALE = .TRUE..
+
+           4:  Z(2,N) -- DOUBLE PRECISION array                      Output
+               On exit: the real and imaginary parts of the roots are
+               stored in Z(1,i) and Z(2,i) respectively, for i=1,2,...,n.
+
+           5:  W(4*(N+1)) -- DOUBLE PRECISION array               Workspace
+
+           6:  IFAIL -- INTEGER                                Input/Output
+               On entry: IFAIL must be set to 0, -1 or 1. For users not
+               familiar with this parameter (described in the Essential
+               Introduction) the recommended value is 0.
+
+               On exit: IFAIL = 0 unless the routine detects an error (see
+               Section 6).
+
+          6. Error Indicators and Warnings
+
+          Errors detected by the routine:
+
+          If on entry IFAIL = 0 or -1, explanatory error messages are
+          output on the current error message unit (as defined by X04AAF).
+
+          IFAIL= 1
+               On entry A(1,0) = 0.0 and A(2,0) = 0.0,
+
+               or       N < 1.
+
+          IFAIL= 2
+               The iterative procedure has failed to converge. This error
+               is very unlikely to occur. If it does, please contact NAG
+               immediately, as some basic assumption for the arithmetic has
+               been violated. See also Section 8.
+
+          IFAIL= 3
+               Either overflow or underflow prevents the evaluation of P(z)
+               near some of its zeros. This error is very unlikely to
+               occur. If it does, please contact NAG immediately. See also
+               Section 8.
+
+          7. Accuracy
+
+          All roots are evaluated as accurately as possible, but because of
+          the inherent nature of the problem complete accuracy cannot be
+          guaranteed.
+
+          8. Further Comments
+
+          If SCALE = .TRUE., then a scaling factor for the coefficients is
+          chosen as a power of the base B of the machine so that the
+                                                                EMAX-P
+          largest coefficient in magnitude approaches THRESH = B      .
+          Users should note that no scaling is performed if the largest
+          coefficient in magnitude exceeds THRESH, even if SCALE = .TRUE..
+          (For definition of B, EMAX and P see the Chapter Introduction
+          X02.)
+
+          However, with SCALE = .TRUE., overflow may be encountered when
+          the input coefficients a ,a ,a ,...,a  vary widely in magnitude,
+                                  0  1  2      n
+                                                    (4*P)
+          particularly on those machines for which B      overflows. In
+          such cases, SCALE should be set to .FALSE. and the coefficients
+          scaled so that the largest coefficient in magnitude does not
+                  (EMAX-2*P)
+          exceed B          .
+
+          Even so, the scaling strategy used in C02AFF is sometimes
+          insufficient to avoid overflow and/or underflow conditions. In
+          such cases, the user is recommended to scale the independent
+          variable (z) so that the disparity between the largest and
+          smallest coefficient in magnitude is reduced. That is, use the
+          routine to locate the zeros of the polynomial d*P(cz) for some
+          suitable values of c and d. For example, if the original
+                               -100   100 20                   -10
+          polynomial was P(z)=2    i+2   z  , then choosing c=2    and
+             100                                                     20
+          d=2   , for instance, would yield the scaled polynomial i+z  ,
+          which is well-behaved relative to overflow and underflow and has
+                           10
+          zeros which are 2   times those of P(z).
+
+          If the routine fails with IFAIL = 2 or 3, then the real and
+          imaginary parts of any roots obtained before the failure occurred
+          are stored in Z in the reverse order in which they were found.
+          Let n  denote the number of roots found before the failure
+               R
+          occurred. Then Z(1,n) and Z(2,n) contain the real and imaginary
+          parts of the 1st root found, Z(1,n-1) and Z(2,n-1) contain the
+          real and imaginary parts of the 2nd root found, ..., Z(1,n ) and
+                                                                    R
+          Z(2,n ) contain the real and imaginary parts of the n th root
+               R                                               R
+          found. After the failure has occurred, the remaining 2*(n-n )
+                                                                     R
+          elements of Z contain a large negative number (equal to
+                         
+
+          -1/(X02AMF().\/2)).
+
+          9. Example
+
+                                                 5    4    3    2
+          To find the roots of the polynomial a z +a z +a z +a z +a z+a =0,
+                                               0    1    2    3    4   5
+          where a =(5.0+6.0i), a =(30.0+20.0i), a =-(0.2+6.0i),
+                 0              1                2
+          a =(50.0+100000.0i), a =-(2.0-40.0i) and a =(10.0+1.0i).
+           3                    4                   5
+
+          The example program is not reproduced here. The source code for
+          all example programs is distributed with the NAG Foundation
+          Library software and should be available on-line.
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\subsection{ Roots of a real polynomial equation}
+\label{manpageXXc02agf}
+\index{pages!manpageXXc02agf!nagc.ht}
+\index{nagc.ht!pages!manpageXXc02agf}
+\index{manpageXXc02agf!nagc.ht!pages}
+<<nagc.ht>>=
+\begin{page}{manpageXXc02agf}{NAG Documentation: c02agf}
+\beginscroll
+\begin{verbatim}
+
+
+
+     C02AGF(3NAG)      Foundation Library (12/10/92)      C02AGF(3NAG)
+
+
+
+          C02 -- Zeros of Polynomials                                C02AGF
+                  C02AGF -- NAG Foundation Library Routine Document
+
+          Note: Before using this routine, please read the Users' Note for
+          your implementation to check implementation-dependent details.
+          The symbol (*) after a NAG routine name denotes a routine that is
+          not included in the Foundation Library.
+
+          1. Purpose
+
+          C02AGF finds all the roots of a real polynomial equation, using a
+          variant of Laguerre's Method.
+
+          2. Specification
+
+                 SUBROUTINE C02AGF (A, N, SCALE, Z, W, IFAIL)
+                 INTEGER          N, IFAIL
+                 DOUBLE PRECISION A(N+1), Z(2,N), W(2*(N+1))
+                 LOGICAL          SCALE
+
+          3. Description
+
+          The routine attempts to find all the roots of the nth degree real
+          polynomial equation
+
+                               n    n-1    n-2
+                       P(z)=a z +a z   +a z   +...+a   z+a =0.
+                             0    1      2          n-1   n
+
+          The roots are located using a modified form of Laguerre's Method,
+          originally proposed by Smith [2].
+
+          The method of Laguerre [3] can be described by the iterative
+          scheme
+
+                                             -n*P(z )
+                                                   k
+                          L(z )=z   -z = ----------------,
+                             k   k+1  k             
+                                         P'(z )+-  /H(z )
+                                             k   \/    k
+
+                                           2
+          where H(z )=(n-1)*[(n-1)*(P'(z )) -n*P(z )P''(z )], and z  is
+                   k                    k         k      k         0
+          specified.
+
+          The sign in the denominator is chosen so that the modulus of the
+          Laguerre step at z , viz. |L(z )|, is as small as possible. The
+                            k           k
+          method can be shown to be cubically convergent for isolated roots
+          (real or complex) and linearly convergent for multiple roots.
+          The routine generates a sequence of iterates z , z , z ,..., such
+                                                        1   2   3
+          that |P(z +1)|<|P(z )| and ensures that z   +L(z   ) 'roughly'
+                   k         k                     k+1    k+1
+          lies inside a circular region of radius |F| about z  known to
+                                                             k
+          contain a zero of P(z); that is, |L(z   )|<=|F|, where F denotes
+                                               k+1
+          the Fejer bound (see Marden [1]) at the point z . Following Smith
+                                                         k
+          [2], F is taken to be min(B,1.445*n*R), where B is an upper bound
+          for the magnitude of the smallest zero given by
+
+                                                         1/n
+                      B=1.0001*min(\/n*L(z ),|r |,|a /a |   ),
+                                          k    1    n  0
+
+          r  is the zero X of smaller magnitude of the quadratic equation
+           1
+
+                                           2
+                    2(P''(z )/(2*n*(n-1)))X +2(P'(z )/n)X+P(z )=0
+                           k                       k         k
+
+          and the Cauchy lower bound R for the smallest zero is computed
+          (using Newton's Method) as the positive root of the polynomial
+          equation
+
+                         n      n-1      n-2
+                    |a |z +|a |z   +|a |z   +...+|a   |z-|a |=0.
+                      0      1        2            n-1     n
+
+          Starting from the origin, successive iterates are generated
+          according to the rule z   =z +L(z ) for k=1,2,3,... and L(z ) is
+                                 k+1  k    k                         k
+                                 k+1       k           k+1
+          iterative procedure terminates if P(z   ) is smaller in absolute
+                                               k+1
+          value than the bound on the rounding error in P(z   ) and the
+                                                           k+1
+          current iterate z =z    is taken to be a zero of P(z) (as is its
+                           p  k-1
+                    
+
+          conjugate z  if z  is complex). The deflated polynomial
+                     p     p
+          ~
+          P(z)=P(z)/(z-z ) of degree n-1 if z  is real
+                        p                    p
+           ~                   
+          (P(z)=P(z)/((z-z )(z-z )) of degree n-2 if z  is complex) is then
+                          p     p                     p
+          formed, and the above procedure is repeated on the deflated
+          polynomial until n<3, whereupon the remaining roots are obtained
+          via the 'standard' closed formulae for a linear (n = 1) or
+          quadratic (n = 2) equation.
+
+          To obtain the roots of a quadratic polynomial, C02AJF(*) can be
+          used.
+
+          4. References
+
+          [1]   Marden M (1966) Geometry of Polynomials. Mathematical
+                Surveys. 3 Am. Math. Soc., Providence, RI.
+
+          [2]   Smith B T (1967) ZERPOL: A Zero Finding Algorithm for
+                Polynomials Using Laguerre's Method. Technical Report.
+                Department of Computer Science, University of Toronto,
+                Canada.
+
+          [3]   Wilkinson J H (1965) The Algebraic Eigenvalue Problem.
+                Clarendon Press.
+
+          5. Parameters
+
+           1:  A(N+1) -- DOUBLE PRECISION array                       Input
+               On entry: if A is declared with bounds (0:N), then A(i)
+                                                          n-i
+               must contain a  (i.e., the coefficient of z   ), for
+                             i
+               i=0,1,...,n. Constraint: A(0) /= 0.0.
+
+           2:  N -- INTEGER                                           Input
+               On entry: the degree of the polynomial, n. Constraint: N >=
+               1.
+
+           3:  SCALE -- LOGICAL                                       Input
+               On entry: indicates whether or not the polynomial is to be
+               scaled. See Section 8 for advice on when it may be
+               preferable to set SCALE = .FALSE. and for a description of
+               the scaling strategy. Suggested value: SCALE = .TRUE..
+
+           4:  Z(2,N) -- DOUBLE PRECISION array                      Output
+               On exit: the real and imaginary parts of the roots are
+               stored in Z(1,i) and Z(2,i) respectively, for i=1,2,...,n.
+               Complex conjugate pairs of roots are stored in consecutive
+               pairs of elements of Z; that is, Z(1,i+1) = Z(1,i) and
+               Z(2,i+1)=-Z(2,i).
+
+           5:  W(2*(N+1)) -- DOUBLE PRECISION array               Workspace
+
+           6:  IFAIL -- INTEGER                                Input/Output
+               On entry: IFAIL must be set to 0, -1 or 1. For users not
+               familiar with this parameter (described in the Essential
+               Introduction) the recommended value is 0.
+               On exit: IFAIL = 0 unless the routine detects an error (see
+               Section 6).
+
+          6. Error Indicators and Warnings
+
+          Errors detected by the routine:
+
+          If on entry IFAIL = 0 or -1, explanatory error messages are
+          output on the current error message unit (as defined by X04AAF).
+
+          IFAIL= 1
+               On entry A(0) = 0.0,
+
+               or       N < 1.
+
+          IFAIL= 2
+               The iterative procedure has failed to converge. This error
+               is very unlikely to occur. If it does, please contact NAG
+               immediately, as some basic assumption for the arithmetic has
+               been violated. See also Section 8.
+
+          IFAIL= 3
+               Either overflow or underflow prevents the evaluation of P(z)
+               near some of its zeros. This error is very unlikely to
+               occur. If it does, please contact NAG immediately. See also
+               Section 8.
+
+          7. Accuracy
+
+          All roots are evaluated as accurately as possible, but because of
+          the inherent nature of the problem complete accuracy cannot be
+          guaranteed.
+
+          8. Further Comments
+
+          If SCALE = .TRUE., then a scaling factor for the coefficients is
+          chosen as a power of the base B of the machine so that the
+                                                                EMAX-P
+          largest coefficient in magnitude approaches THRESH = B      .
+          Users should note that no scaling is performed if the largest
+          coefficient in magnitude exceeds THRESH, even if SCALE = .TRUE..
+          (For definition of B, EMAX and P see the Chapter Introduction
+          X02.)
+
+          However, with SCALE = .TRUE., overflow may be encountered when
+          the input coefficients a ,a ,a ,...,a  vary widely in magnitude,
+                                  0  1  2      n
+                                                    (4*P)
+          particularly on those machines for which B      overflows. In
+          such cases, SCALE should be set to .FALSE. and the coefficients
+          scaled so that the largest coefficient in magnitude does not
+                  (EMAX-2*P)
+          exceed B          .
+
+          Even so, the scaling strategy used in C02AGF is sometimes
+          insufficient to avoid overflow and/or underflow conditions. In
+          such cases, the user is recommended to scale the independent
+          variable (z) so that the disparity between the largest and
+          smallest coefficient in magnitude is reduced. That is, use the
+          routine to locate the zeros of the polynomial d*P(cz) for some
+          suitable values of c and d. For example, if the original
+                               -100  100 20                   -10
+          polynomial was P(z)=2    +2   z  , then choosing c=2    and
+             100                                                     20
+          d=2   , for instance, would yield the scaled polynomial 1+z  ,
+          which is well-behaved relative to overflow and underflow and has
+                           10
+          zeros which are 2   times those of P(z).
+
+          If the routine fails with IFAIL = 2 or 3, then the real and
+          imaginary parts of any roots obtained before the failure occurred
+          are stored in Z in the reverse order in which they were found.
+          Let n  denote the number of roots found before the failure
+               R
+          occurred. Then Z(1,n) and Z(2,n) contain the real and imaginary
+          parts of the 1st root found, Z(1,n-1) and Z(2,n-1) contain the
+          real and imaginary parts of the 2nd root found, ..., Z(1,n ) and
+                                                                    R
+          Z(2,n ) contain the real and imaginary parts of the n th root
+               R                                               R
+          found. After the failure has occurred, the remaining 2*(n-n )
+                                                                     R
+          elements of Z contain a large negative number (equal to
+                         
+
+          -1/(X02AMF().\/2)).
+
+          9. Example
+
+          To find the roots of the 5th degree polynomial
+           5   4   3   2
+          z +2z +3z +4z +5z+6=0.
+
+          The example program is not reproduced here. The source code for
+          all example programs is distributed with the NAG Foundation
+          Library software and should be available on-line.
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\subsection{ Roots of One or More Transcendental Equations}
+\label{manpageXXc05}
+\index{pages!manpageXXc05!nagc.ht}
+\index{nagc.ht!pages!manpageXXc05}
+\index{manpageXXc05!nagc.ht!pages}
+<<nagc.ht>>=
+\begin{page}{manpageXXc05}{NAG Documentation: c05}
+\beginscroll
+\begin{verbatim}
+
+
+
+     C05(3NAG)         Foundation Library (12/10/92)         C05(3NAG)
+
+
+
+          C05 -- Roots of One or More Transcendental Equations
+                                                         Introduction -- C05
+                                    Chapter C05
+                   Roots of One or More Transcendental Equations
+
+          1. Scope of the Chapter
+
+          This chapter is concerned with the calculation of real zeros of
+          continuous real functions of one or more variables. (Complex
+          equations must be expressed in terms of the equivalent larger
+          system of real equations.)
+
+          2. Background to the Problems
+
+          The chapter divides naturally into two parts.
+
+          2.1. A Single Equation
+
+          The first deals with the real zeros of a real function of a
+          single variable f(x).
+
+          At present, there is only one routine with a simple calling
+          sequence. This routine assumes that the user can determine an
+          initial interval [a,b] within which the desired zero lies, that
+          is f(a)*f(b)<0, and outside which all other zeros lie. The
+          routine then systematically subdivides the interval to produce a
+          final interval containing the zero. This final interval has a
+          length bounded by the user's specified error requirements; the
+          end of the interval where the function has smallest magnitude is
+          returned as the zero. This routine is guaranteed to converge to a
+          simple zero of the function. (Here we define a simple zero as a
+          zero corresponding to a sign-change of the function.) The
+          algorithm used is due to Bus and Dekker.
+
+          2.2. Systems of Equations
+
+          The routines in the second part of this chapter are designed to
+          solve a set of nonlinear equations in n unknowns
+
+
+                                                           T
+                   f (x)=0,  i=1,2,...,n,  x=(x ,x ,...,x )             (1)
+                    i                          1  2      n
+
+          where T stands for transpose.
+
+          It is assumed that the functions are continuous and
+          differentiable so that the matrix of first partial derivatives of
+          the functions, the Jacobian matrix J  (x)=ddf /ddx  evaluated at
+                                              ij       i    j
+          the point x, exists, though it may not be possible to calculate
+          it directly.
+
+          The functions f  must be independent, otherwise there will be an
+                         i
+          infinity of solutions and the methods will fail. However, even
+          when the functions are independent the solutions may not be
+          unique. Since the methods are iterative, an initial guess at the
+          solution has to be supplied, and the solution located will
+          usually be the one closest to this initial guess.
+
+          2.3. References
+
+          [1]   Gill P E and Murray W (1976) Algorithms for the Solution of
+                the Nonlinear Least-squares Problem. NAC 71 National
+                Physical Laboratory.
+
+          [2]   More J J, Garbow B S and Hillstrom K E (1974) User Guide for
+                Minpack-1. ANL-80-74 Argonne National Laboratory.
+
+          [3]   Ortega J M and Rheinboldt W C (1970) Iterative Solution of
+                Nonlinear Equations in Several Variables. Academic Press.
+
+          [4]   Rabinowitz P (1970) Numerical Methods for Nonlinear
+                Algebraic Equations. Gordon and Breach.
+
+          3. Recommendations on Choice and Use of Routines
+
+          3.1. Zeros of Functions of One Variable
+
+          There is only one routine (C05ADF) for solving a single nonlinear
+          equation. This routine is designed for solving problems where the
+          function f(x) whose zero is to be calculated, can be coded as a
+          user-supplied routine.
+
+          C05ADF may only be used when the user can supply an interval
+          [a,b] containing the zero, that is f(a)*f(b)<0.
+
+          3.2. Solution of Sets of Nonlinear Equations
+
+          The solution of a set of nonlinear equations
+
+                        f (x ,x ,...,x )=0,  i=1,2,...,n                (2)
+                         i  1  2      n
+
+          can be regarded as a special case of the problem of finding a
+          minimum of a sum of squares
+
+                           m
+                           /                    2
+                     s(x)= |  [f (x ,x ,...,x )]   (m>=n).              (3)
+                           /    i  1  2      n
+                           i=1
+
+          So the routines in Chapter E04 of the Library are relevant as
+          well as the special nonlinear equations routines.
+
+          There are two routines (C05NBF and C05PBF) for solving a set of
+          nonlinear equations. These routines require the f  (and possibly
+                                                           i
+          their derivatives) to be calculated in user-supplied routines.
+          These should be set up carefully so the Library routines can work
+          as efficiently as possible.
+
+          The main decision which has to be made by the user is whether to
+                                  ddf
+                                     i
+          supply the derivatives  ----. It is advisable to do so if
+                                  ddx
+                                     j
+          possible, since the results obtained by algorithms which use
+          derivatives are generally more reliable than those obtained by
+          algorithms which do not use derivatives.
+
+          C05PBF requires the user to provide the derivatives, whilst
+          C05NBF does not. C05NBF and C05PBF are easy-to-use routines. A
+          routine, C05ZAF, is provided for use in conjunction with C05PBF
+          to check the user-provided derivatives for consistency with the
+          functions themselves. The user is strongly advised to make use of
+          this routine whenever C05PBF is used.
+
+          Firstly, the calculation of the functions and their derivatives
+          should be ordered so that cancellation errors are avoided. This
+          is particularly important in a routine that uses these quantities
+          to build up estimates of higher derivatives.
+
+          Secondly, scaling of the variables has a considerable effect on
+          the efficiency of a routine. The problem should be designed so
+          that the elements of x are of similar magnitude. The same comment
+          applies to the functions, all the f  should be of comparable
+                                             i
+          size.
+
+          The accuracy is usually determined by the accuracy parameters of
+          the routines, but the following points may be useful:
+
+          (i)   Greater accuracy in the solution may be requested by
+                choosing smaller input values for the accuracy parameters.
+                However, if unreasonable accuracy is demanded, rounding
+                errors may become important and cause a failure.
+
+          (ii)  Some idea of the accuracies of the x  may be obtained by
+                                                    i
+                monitoring the progress of the routine to see how many
+                figures remain unchanged during the last few iterations.
+
+          (iii) An approximation to the error in the solution x, given by e
+                where e is the solution to the set of linear equations
+
+                J(x)e=-f(x)
+
+                                                  T
+                where f(x)=(f (x),f (x),...,f (x))  (see Chapter F04).
+                             1     2         n
+
+          (iv)  If the functions f (x) are changed by small amounts
+                                  i
+                (epsilon) , for i=1,2,...,n, then the corresponding change
+                         i
+                in the solution x is given approximately by (sigma), where
+                (sigma) is the solution of the set of linear equations
+
+                J(x)(sigma)=-(epsilon), (see Chapter F04).
+
+                Thus one can estimate the sensitivity of x to any
+                uncertainties in the specification of f (x), for
+                                                       i
+                i=1,2,...,n.
+
+          3.3. Index
+
+          Zeros of functions of one variable:
+               Bus and Dekker algorithm                              C05ADF
+          Zeros of functions of several variables:
+               easy-to-use                                           C05NBF
+               easy-to-use, derivatives required                     C05PBF
+          Checking Routine:
+               Checks user-supplied Jacobian                         C05ZAF
+
+
+          C05 -- Roots of One or More Transcendental Equations
+                                                             Contents -- C05
+          Chapter C05
+
+          Roots of One or More Transcendental Equations
+
+          C05ADF  Zero of continuous function in given interval, Bus and
+                  Dekker algorithm
+
+          C05NBF  Solution of system of nonlinear equations using function
+                  values only
+
+          C05PBF  Solution of system of nonlinear equations using 1st
+                  derivatives
+
+          C05ZAF  Check user's routine for calculating 1st derivatives
+
+\end{verbatim}
+\endscroll
+\end{page}
+
+@
+\subsection{ Zero of a continuous function in a given interval}
+\label{manpageXXc05adf}
+\index{pages!manpageXXc05adf!nagc.ht}
+\index{nagc.ht!pages!manpageXXc05adf}
+\index{manpageXXc05adf!nagc.ht!pages}
+<<nagc.ht>>=
+\begin{page}{manpageXXc05adf}{NAG Documentation: c05adf}
+\beginscroll
+\begin{verbatim}
+
+
+
+     C05ADF(3NAG)      Foundation Library (12/10/92)      C05ADF(3NAG)
+
+
+
+          C05 -- Roots of One or More Transcendental Equations       C05ADF
+                  C05ADF -- NAG Foundation Library Routine Document
+
+          Note: Before using this routine, please read the Users' Note for
+          your implementation to check implementation-dependent details.
+          The symbol (*) after a NAG routine name denotes a routine that is
+          not included in the Foundation Library.
+
+          1. Purpose
+
+          C05ADF locates a zero of a continuous function in a given
+          interval by a combination of the methods of linear interpolation,
+          extrapolation and bisection.
+
+          2. Specification
+
+                 SUBROUTINE C05ADF (A, B, EPS, ETA, F, X, IFAIL)
+                 INTEGER          IFAIL
+                 DOUBLE PRECISION A, B, EPS, ETA, F, X
+                 EXTERNAL         F
+
+          3. Description
+
+          The routine attempts to obtain an approximation to a simple zero
+          of the function f(x) given an initial interval [a,b] such that
+          f(a)*f(b)<=0. The zero is found by calls to C05AZF(*) whose
+          specification should be consulted for details of the method used.
+
+          The approximation x to the zero (alpha) is determined so that one
+          or both of the following criteria are satisfied:
+
+               (i) |x-(alpha)|<EPS,