texlive[49810] Master: amstex (24jan19)

commits+karl at tug.org commits+karl at tug.org
Thu Jan 24 23:19:50 CET 2019


Revision: 49810
          http://tug.org/svn/texlive?view=revision&revision=49810
Author:   karl
Date:     2019-01-24 23:19:50 +0100 (Thu, 24 Jan 2019)
Log Message:
-----------
amstex (24jan19)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/amstex/base/README
    trunk/Master/texmf-dist/doc/amstex/base/amsguide.pdf
    trunk/Master/tlpkg/bin/tlpkginfo
    trunk/Master/tlpkg/libexec/ctan2tds

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/amstex/base/amsppt.txt
    trunk/Master/texmf-dist/doc/amstex/base/amstex.txt
    trunk/Master/texmf-dist/doc/amstex/base/amstinst.pdf

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/amstex/base/amstinst.ps.gz
    trunk/Master/texmf-dist/doc/amstex/base/joyerr.tex

Modified: trunk/Master/texmf-dist/doc/amstex/base/README
===================================================================
--- trunk/Master/texmf-dist/doc/amstex/base/README	2019-01-24 22:12:49 UTC (rev 49809)
+++ trunk/Master/texmf-dist/doc/amstex/base/README	2019-01-24 22:19:50 UTC (rev 49810)
@@ -1,270 +1,52 @@
-READ.ME for AMS-TeX version 2.2                             2001/08/29
+README for AMS-TeX version 2.2                             2019/01/18
 
-AMS-TeX is a macro package that works with the TeX typesetting program.
-A working TeX system is a prerequisite for using any of the components
-of AMS-TeX.  [TeX is not an AMS product; see the AMS TeX Resources page
-(http://www.ams.org/tex/tex-resources.html) for information if you
-do not already have TeX.]
+This is the final archival distribution of AMS-TeX.  AMS-TeX is no
+longer supported by the AMS, nor is it used by the AMS publishing
+program.  The AMS does not recommend creating any new documents using
+AMS-TeX; this distribution will be left on CTAN to facilitate
+processing of legacy documents and as a historical record of a
+pioneering TeX macro collection that played a key role in popularizing
+TeX and revolutionizing mathematics publishing.
 
-Obtain a printed copy of the full installation instructions:
- - Process amstinst.tex with Plain TeX, or
- - Print the amstinst.ps file provided.
-Read the instructions; they are much more complete than the summary
-provided here.
+In addition to the "User's Guide to AMS-TeX" (doc/amsguide.pdf), the
+AMS is also making the full text of the most recent reprint of the
+second edition of "The Joy of TeX" by Michael Spivak available for the
+first time, as a pdf file.  "Joy" can be found on CTAN:
+    http://mirrors.ctan.org/info/amstex-joy/joyt2.pdf
 
-The instructions assume that your TeX system is arranged according to
-the recommended TeX Directory Structure (TDS).  Check the documentation
-for your TeX system to find out if it uses the TDS.  A copy of the TDS
-report can be found at CTAN either as an online document
-    .../tds/standard/tds
-or as a printable pdf file
-    .../tds/standard/tds/tds.pdf
-Items on CTAN can usually be found through the CTAN Catalogue:
-    http://www.ctan.org/search
+The best way to install AMS-TeX is via the package manager for your
+TeX distribution.  If that is not an option, instructions for manual
+installation are provided.
 
-
-FILES IN THE AMS-TeX DISTRIBUTION
-
-A complete list of the files contained in the distribution is included
-in the installation instructions (amstinst).
-
-There are two basic methods of obtaining the files needed for AMS-TeX:
- - Retrieve one of the AMS-TeX bundles from the AMS FTP server
-    ftp://ftp.ams.org/pub/tex/
-   or the AMS web site
-    http://www.ams.org/tex/amstex.html
- - Retrieve the individual files from one of the AMS servers or from CTAN
-    .../macros/amstex/
-Install these files as described in the installation instructions
-(amstinst); a summary appears below, under INSTALLING AMS-TeX.
-
-Also, AMS-TeX will call for AMSFonts.  Check the tfm-files subdirectory
-    TEXMF/fonts/tfm/ams/
-to see whether it is already populated (most TeX distributions now
-include the AMSFonts).  If not, retrieve the .tfm files for AMSFonts 2.2
-and install them into your system tfm-files subdirectory.
-
-These .tfm files can be retrieved in several ways:
- - as a bundle from the AMSFonts page on the AMS web site at
-    http://www.ams.org/tex/amsfonts.html
- - as a tfm.tar file in the /pub/tex directory at the AMS FTP site,
-    ftp://ftp.ams.org
- - as individual .tfm files from the /pub/tex/amsfonts/tfm subdirectory
-   at the AMS FTP site or from CTAN in .../fonts/amsfonts/tfm
-(Note: set the file type to binary in FTP when transferring .tfm files.)
-Even if you do not use any symbols from the AMSFonts, you will need at
-least the .tfm files to use amsppt.sty and to TeX the accompanying
-documentation for AMS-TeX.
-
 The following documentation files will be useful in installing and using
 AMS-TeX.
 
-amstinst.tex -  Installation instructions, comprising Appendices B and C
-amstinst.ps     of amsguide, provided as both TeX source and ready-to-print
-                PostScript.
-amsguide.tex -  The AMS-TeX User's Guide, provided as both TeX source and
-amsguide.ps     a ready-to-print PostScript file.  When you have completed
-                the installation of AMS-TeX 2.2, process the .tex file using
-                AMS-TeX 2.2 and print the resulting .dvi file.  The output
-                will be a brief guide to using AMS-TeX 2.2, supplementing
-                The Joy of TeX.
-joyerr.tex   -  The TeX input file for a document listing errata to
-                The Joy of TeX prior to AMS-TeX 2.0. It also should be
-                run through TeX using AMS-TeX 2.2.
-joyerr2.tex  -  The TeX input file for a document listing errata to the
-                second edition of The Joy of TeX, for AMS-TeX 2.1 and up.
-                Process with AMS-TeX 2.2 as for the other .tex files.
-amsppt.doc   -  Technical documentation for amsppt.sty, including an update
-                history.
-amsppt.faq   -  Frequently asked questions and answers regarding AMS-TeX
-                and amsppt.sty.
+amstinst.tex - Installation instructions, comprising Appendices B and C
+amstinst.pdf   of amsguide, provided as both TeX source and ready-to-print
+               PDF.
 
+amsguide.tex - The AMS-TeX User's Guide, a brief guide to AMS-TeX 2.2,
+amsguide.pdf   supplementing "The Joy of TeX".
 
-INSTALLING AMS-TeX 2.2 ON YOUR SYSTEM -- A BRIEF OVERVIEW
+joyerr2.tex  - The AMS-TeX input file for a document listing errata to the
+               second edition of The Joy of TeX, for AMS-TeX 2.1 and up.
 
-Backup any existing AMS-TeX files before installing a new release.
+The following documentation files will be useful in understanding the
+development and evolution of the code:
 
-Read the instructions in amstinst; they are more complete than these notes.
+amstex.bug   - Official record of bugs and changes made to AMS-TeX.
 
-If you have retrieved a bundled distribution and unbundled it with the
-appropriate tool, the files will be placed into the following subdirectories:
+CHANGELOG    - Summary of changes made between versions 2.0 and 2.1
+               and between 2.1 and 2.2.
 
-    TEXMF/doc/ams/amstex
-    TEXMF/source/amstex
-    TEXMF/tex/amstex/base
-    TEXMF/tex/plain/amsfonts
+amstex.txt   - Technical documentation accompanying amstex.tex.
 
-If you have retrieved individual files, you will need to place them into
-subdirectories as described in amstinst.ps.
+amsppt.doc   - Technical documentation for amsppt.sty, including an update
+               history.
 
-AMS-TeX will call for the AMSFonts 2.2 .tfm files.  Check for their
-presence on your system and, if necessary, retrieve them and place them
-in the proper location as described above.
+amsppt.txt   - Additional technical notes on amsppt.sty.
 
-Remember that most TDS sytems operate using a filename list or database,
-which must be updated when new files are added; consult your TeX system
-documentation for update instructions.
+amsppt.faq   - Frequently asked questions and answers regarding AMS-TeX
+               and amsppt.sty.
 
-Run amstex.ini through INITEX (the version of TeX which has no format
-preloaded, distributed with your implementation of TeX). It will produce
-a format file which will function as a preloaded version of AMS-TeX.
-Place this format file in the directory where your implementation of
-TeX looks for format files (see your system documentation), refresh the
-filename database, and you are ready to use AMS-TeX 2.2.
-
-If you habitually use the AMSPPT documentstyle, you may prefer to
-include it in the format file you create. This can be done by editing
-the file amstex.ini, using any text editor, and uncommenting the line
-that reads "\documentstyle{amsppt}".  Before creating the format file,
-read Appendix C from the installation instructions.
-
-We recommend that, as a first test of your installation, you run the
-file amsguide.tex through TeX, and print out the output. This will
-provide further information about using AMS-TeX.
-
 ========================================================================
-Highlights of the differences between versions 2.1 and 2.2:
-
-AMSTEX.TEX
-----------
-
----Removed copyright notice and restriction from message printed on
-   terminal and in log for every run.
-
-AMSPPT.STY
-----------
-(See the user's guide (amsguide.tex) and amsppt.doc, section 20, for
-full details.)
-
----\subjclass was updated to use \subjclassyear as the date for the
-Mathematics Subject Classification scheme. (NOTE: THIS CHANGE IS NOT
-BACKWARD COMPATIBLE.  EXISTING DOCUMENT FILES NEED NOT BE MODIFIED BUT
-THE OUTPUT WILL BE DIFFERENT IF CLASSIFICATION WAS OLDER THAN 1991.)
-
-========================================================================
-Highlights of the differences between versions 2.0 and 2.1:
-
-AMSTEX.TEX
-----------
----Improvements to the mechanisms for loading various fonts in
-the AMSFonts package. For example, \loadeusm now defines a
-\eusm command that can be used like \roman or \bold.
-
----Revamped \printoptions command.
-
----Some internal cleanup to reduce memory usage in some of TeX's
-memory categories (notably hash size).
-
----Informational messages appear on screen identifying the
-modules within amstex.tex during the creation of a format file.
-
-AMSPPT.STY
-----------
-(See the user's guide (amsguide.tex) and amsppt.doc, sections 18 and 19,
-for full details.)
-
----\curraddr was added, for giving the current address of an author,
-if different from the address given in \address.
-
----\rom was added, for preventing unwanted italicization of certain
-things, such as parentheses or numbers, in theorems and other italic
-passages.  \rom automatically inserts italic corrections.
-
----The implementation of \nofrills was completely changed, to provide
-better error messages for a missing or misspelled \endkeywords or
-similar end command when reading a delimited argument.
-
----Multiple \thanks commands in the top matter will now produce
-multiple acknowledgment footnotes instead of discarding all but the
-last one.
-
----A period is no longer added automatically at the end of a
-\thanks. (NOTE: THIS CHANGE IS NOT BACKWARD COMPATIBLE---DOCUMENT
-FILES WILL HAVE TO BE MODIFIED.)
-
----\subjclassyear was added to specify the year of the Mathematics
-Subject Classification scheme.  Only 1991 and 2000 are recognized,
-defaulting to 1991 to maintain some backward compatibility.
-
----\widestnumber\item now works as claimed in the User's Guide.
-
----The missing \par in the internal command \penaltyandskip@ was added.
-
----Additional checks were added for runaway \proclaim, \definition,
-\ref, \roster, etc.  The internal macro \runaway@ was changed to make
-its usage more consistent and robust; in the process its name was
-changed to \add at missing (and as the name suggests, it now tries to
-recover by adding the missing \end... command).
-
----As with amstex.tex, informational messages were added identifying the
-modules within amsppt.sty.
-
----The bibliography macros were substantially modified to correct
-another longstanding bug: line breaks after explicit hyphens,
-mathbins, and mathrels were inhibited. This also involved changing the
-\ref-specific version of \nofrills.  BACKWARD COMPATIBILITY (WITH
-VERSION 2.0) IS NOT COMPLETE WITH RESPECT TO \nofrills IN THE
-BIBLIOGRAPHY MACROS.  \nofrills NOW SHOULD ALWAYS FOLLOW IMMEDIATELY
-AFTER THE NAME OF THE FIELD TO WHICH IT APPLIES, E.G., \transl\nofrills,
-OR \paper\nofrills. This is more consistent with the usage of \nofrills
-outside of the references section. \nofrills will cause all the "frills",
-such as the parentheses around years in journal article citations, or
-words like "eds." or "vol." that are supplied automatically, to be
-omitted for the given field.  In addition, it will suppress the
-automatic punctuation at the end of the field, if any.
-
----A \refstyle command was added to allow users to specify one of the
-three different reference styles most commonly used in AMS publications:
-letter labels in square brackets; unnumbered; and numbered (denoted A,
-B, and C, respectively). The syntax is "\refstyle{A}" (immediately after
-the \documentstyle command). Style C, numbered with arabic numerals, is
-the default selected by amsppt.sty.  The \refstyle command ensures 
-proper correspondence between the formatting of cites in the main text 
-and the formatting of the references section. Also, \key can now be used
-for all reference labels, and the \no command is redundant (though still
-supported, for backward compatibility).
-
----\miscnote was added, and used in the implementation of \toappear,
-so that \toappear and \finalinfo would not be mutually exclusive.
-\miscnote might also be used for things like "preprint" or
-"submitted".  Unlike \finalinfo, \miscnote automatically adds
-parentheses.
-
----\procinfo was added, to give place and date where the meeting
-took place, for a proceedings volume reference.
-
----\eds or \ed information will now be used in place of an author's
-name, if \by is absent.  This would be for collections or proceedings
-volumes that are cited as a whole, instead of citing a single paper
-within the volume.
-
-AMSTEX.INI
-----------
-File to make format file creation more convenient. See the
-user's guide and/or installation notes above.
-
-AMSPPT1.TEX
------------
-Compatibility file to allow processing of AMS-TeX 1.1 and earlier
-documents under AMS-TeX 2.0+. See the user's guide.
-
-
-(NOTE:  Author packages for use with AMS-TeX are available from the AMS
-web site at http://www.ams.org/tex/author-info.html, or by FTP from
-ftp://ftp.ams.org/pub/author-info/packages.  All packages are compatible
-with AMS-TeX 2.2.  If you have previously received an AMS-TeX author
-package for use with an earlier version of AMS-TeX, for best results you
-should retrieve an upgraded copy from the AMS server.)
-
-========================================================================
-
-Questions or comments can be directed to:
-
-Technical Support
-American Mathematical Society
-201 Charles Street
-P.O. Box 6248
-Providence, RI 02940   USA
-     (800) 321-4AMS (321-4267) ext. 4080 (U.S. and Canada)
-     (401) 455-4080
-Email:  tech-support at ams.org

Modified: trunk/Master/texmf-dist/doc/amstex/base/amsguide.pdf
===================================================================
(Binary files differ)

Added: trunk/Master/texmf-dist/doc/amstex/base/amsppt.txt
===================================================================
--- trunk/Master/texmf-dist/doc/amstex/base/amsppt.txt	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/amstex/base/amsppt.txt	2019-01-24 22:19:50 UTC (rev 49810)
@@ -0,0 +1,1447 @@
+% AMSPPT.STY VERSION 2.0
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%                                                                          %%
+%% This is the documentation for AMSPPT.STY, the AmS-TeX `preprint style'.  %%
+%% It contains all the code for AMSPPT.STY, with additional comments.  All  %%
+%% such comments begin with %%, making it easy to recognize single % signs  %%
+%% that sometimes appear in AMSPPT.STY.                                     %%
+%%                                                                          %%
+%% Some explanations given earlier in the file will be required at later    %%
+%% points. Boxes like this are sometimes used for such explanations.        %%
+%%                                                                          %%
+%% Material from AMSTEX.DOC, the documentation file for AMSTEX.TEX may also %%
+%% be used.                                                                 %%
+%%                                                                          %%
+%% As in AMSTEX.DOC, TB refers to The Texbook.                              %%
+%%                                                                          %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\catcode`\@=11
+
+%% We record the style name in \styname and the version in \styversion,
+!!!%% and then report them to the screen and log file.
+
+\def\styname{amsppt}
+\def\styversion{2.0}
+{\W@{}\W@{AMSPPT.STY - Version \styversion}\W@{}}
+
+%% It probably isn't necessary to prevent reading in amsppt.sty twice, but
+%% we do it anyway, just to save time if it happens to be called twice.
+ 
+\ifx\amspptloaded@\relax\catcode`\@=\active
+ \endinput\else\let\amspptloaded@\relax\fi
+
+%% First we set up some basic parameters, which are different than in
+%% plain.  The values are common to several AMS journals, including the
+%% Journal of the AMS.
+
+\parindent1pc \hsize30pc \vsize47.5pc \normallineskiplimit\p@
+
+%% As mentioned in AMSTEX.DOC, \captionwidth@ has to be reset for the new
+%% \hsize. 
+
+\def\setcaptionwidth@{\captionwidth@\hsize \advance\captionwidth at -6pc}
+\setcaptionwidth@
+
+!!%% Provide a way to change the page height and width; changing the page
+!!%% width automatically adjusts the caption width as well.  (\pagewidth
+!!%% in AMSTEX.TEX resets the caption width to a different value than is
+!!%% used in AMS journals.)
+!!
+!!\def\changepageheight#1{\vsize=#1}
+!!\def\changepagewidth#1{\hsize=#1\setcaptionwidth@}
+
+%% We need the cmcsc10 font.  Although \tensmc appears in AMSTEX.TEX, it
+%% never actually got declared.  Supply the cmcsc8 font too; it will be
+%% included in the AMSFonts collection.  We use \font@, not simply \font,
+%% as already explained in AMSTEX.DOC.
+
+\font@\tensmc=cmcsc10
+\font@\eightsmc=cmcsc8
+
+%% We have to load a lot of other fonts for the eight-point footnotes.  Note
+%% that cmti and cmsl in sizes 5, 6, 7 don't get loaded, since they may not
+%% exist (cmti7 is one of the standard 75 Computer Modern fonts, but cmti5
+!!%% and cmti6 aren't, nor are any of cmsl5, cmsl6, cmsl7).  Instructions for
+!!%% loading nine-point fonts are present, but commented out, as they are not
+!!%% required in the preprint style; however, if a user wishes to use nine-point
+!!%% fonts, the comment characters can be removed and \ninepoint defined on the
+!!%% model of \tenpoint and \eightpoint below.
+
+%\font@\ninerm=cmr9
+\font@\eightrm=cmr8
+\font@\sixrm=cmr6
+%\font@\ninei=cmmi9    \skewchar\ninei='177
+\font@\eighti=cmmi8   \skewchar\eighti='177
+\font@\sixi=cmmi6     \skewchar\sixi='177
+%\font@\ninesy=cmsy9   \skewchar\ninesy='60
+\font@\eightsy=cmsy8  \skewchar\eightsy='60
+\font@\sixsy=cmsy6    \skewchar\sixsy='60
+%\font@\ninebf=cmbx9
+\font@\eightbf=cmbx8
+\font@\sixbf=cmbx6
+%\font@\nineit=cmti9
+\font@\eightit=cmti8
+%\font@\ninesl=cmsl9
+\font@\eightsl=cmsl8
+
+%% We will load the basic sizes of the msam, msbm and eufm fonts as well
+%% as the names of all the symbols.  If these are really not needed, or
+%% space is a problem, a user can comment out these lines without making
+%% any other changes.
+
+\loadmsam
+\loadmsbm
+\loadeufm
+\UseAMSsymbols
+
+%% We will only load the additional point sizes for the msam, msbm, and
+%% eufm families if the flags \ifmsamloaded@, etc., are true (since
+%% presumably this was done by a user who has the proper families).
+%% As above, instructions for nine-point fonts are present but commented out.
+
+\ifmsamloaded@
+% \font@\ninemsa=msam9
+ \font@\eightmsa=msam8
+ \font@\sixmsa=msam6
+\fi
+ \ifmsbmloaded@
+% \font@\ninemsb=msbm9
+ \font@\eightmsb=msbm8
+ \font@\sixmsb=msbm6
+\fi
+
+\ifeufmloaded@
+% \font@\nineeufm=eufm9
+ \font@\eighteufm=eufm8
+ \font@\sixeufm=eufm6
+\fi
+
+%% In order to be able to load additional sizes of the Euler fonts that
+%% are not included automatically, we need to be able to test whether the
+%% basic sizes have been loaded, and if they haven't, create a new switch.
+%% Since this will be performed inside another macro, we need a \newif that
+%% isn't outer.  We repeat the definition of \@if from plain, for completeness.
+
+% from plain.tex; we need a \newif that isn't outer.
+\def\@newif#1{\count@\escapechar \escapechar\m at ne
+  \expandafter\expandafter\expandafter
+   \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
+  \expandafter\expandafter\expandafter
+   \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
+  \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+
+%% We define a test that will determine whether or not a \cs is defined
+%% (TB, p. 308).
+
+\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax }
+
+%% We define a routine to create a new \if... if a tested \if... name
+%% is not already defined, and apply it to all the Euler fonts that are
+%% not loaded automatically.
+
+\def\makeflag#1{\expandafter\@newif\csname if#1\endcsname
+  \csname #1false\endcsname}
+\ifundefined{ifeufbloaded@}\makeflag{eufbloaded@}\fi
+\ifundefined{ifeusmloaded@}\makeflag{eusmloaded@}\fi
+\ifundefined{ifeusbloaded@}\makeflag{eusbloaded@}\fi
+\ifundefined{ifeurmloaded@}\makeflag{eurmloaded@}\fi
+\ifundefined{ifeurbloaded@}\makeflag{eurbloaded@}\fi
+
+%% Now we define \tenpoint and \eightpoint for regular text and footnotes,
+%% similarly to TB, p. 414. We keep track of the point size in a control
+%% sequence \pointsize@, because a couple of constructions need to know the
+%% point size we are in (and other constructions added later, or in other
+%% styles, might need this).  We not only change the \baselineskip, but also
+%% change the glue above and below displayed formulas, in case the footnotes
+%% happen to have them.  We also need to set not only \strutbox, but also
+%% \strutbox at . And we will set \ex@ in each case (for \tenpoint it is
+%% supposed to be equivalent to 1pt, while for \eightpoint it will then
+%% presumably be equivalent to .8pt).
+
+%% When \ifsyntax@ is true, so that we are checking syntax, then we won't
+%% bother specifying fonts (since we would only change them all to \dummyft@
+%% anyway), and we simply let \big gobble up things with the proper syntax,
+%% instead of worrying about getting the right sizes.  In general, \big is
+%% \tenbig or \eightbig, which are defined immediately afterwards. 
+
+\def\tenpoint{\def\pointsize@{10}%
+ \normalbaselineskip12\p@
+ \abovedisplayskip12\p@ plus3\p@ minus9\p@
+ \belowdisplayskip12\p@ plus3\p@ minus9\p@
+ \abovedisplayshortskip\z@ plus3\p@
+ \belowdisplayshortskip7\p@ plus3\p@ minus4\p@
+ \textonlyfont@\rm\tenrm
+ \textonlyfont@\it\tenit
+ \textonlyfont@\sl\tensl
+ \textonlyfont@\bf\tenbf
+ \textonlyfont@\smc\tensmc
+ \ifsyntax@\def\big##1{{\hbox{$\left##1\right.$}}}\else
+  \let\big\tenbig@
+  \textfont\z@=\tenrm  \scriptfont\z@=\sevenrm  \scriptscriptfont\z@=\fiverm
+  \textfont\@ne=\teni  \scriptfont\@ne=\seveni  \scriptscriptfont\@ne=\fivei
+  \textfont\tw@=\tensy \scriptfont\tw@=\sevensy \scriptscriptfont\tw@=\fivesy
+  \textfont\thr@@=\tenex \scriptfont\thr@@=\tenex
+   \scriptscriptfont\thr@@=\tenex
+  \textfont\itfam=\tenit  %% \scriptfont and \scriptscriptfont for \itfam
+  %% are already set by AMSTEX.TEX, and there's no point trying to make
+  %% changes, since we probably don't have the right sizes.
+  \textfont\slfam=\tensl  %% Similarly for \slfam.
+  \textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
+   \scriptscriptfont\bffam=\fivebf
+  \ifmsamloaded@
+   \textfont\msafam=\tenmsa \scriptfont\msafam=\sevenmsa
+    \scriptscriptfont\msafam=\fivemsa
+  \fi
+  \ifmsbmloaded@
+   \textfont\msbfam=\tenmsb \scriptfont\msbfam=\sevenmsb
+    \scriptscriptfont\msbfam=\fivemsb
+  \fi
+  \ifeufmloaded@
+   \textfont\eufmfam=\teneufm \scriptfont\eufmfam=\seveneufm
+    \scriptscriptfont\eufmfam=\fiveeufm
+  \fi
+  \ifeufbloaded@
+   \textfont\eufbfam=\teneufb \scriptfont\eufbfam=\seveneufb
+    \scriptscriptfont\eufbfam=\fiveeufb
+  \fi
+  \ifeusmloaded@
+   \textfont\eusmfam=\teneusm \scriptfont\eusmfam=\seveneusm
+    \scriptscriptfont\eusmfam=\fiveeusm
+  \fi
+  \ifeusbloaded@
+   \textfont\eusbfam=\teneusb \scriptfont\eusbfam=\seveneusb
+    \scriptscriptfont\eusbfam=\fiveeusb
+  \fi
+  \ifeurmloaded@
+   \textfont\eurmfam=\teneurm \scriptfont\eurmfam=\seveneurm
+    \scriptscriptfont\eurmfam=\fiveeurm
+  \fi
+  \ifeurbloaded@
+   \textfont\eurbfam=\teneurb \scriptfont\eurbfam=\seveneurb
+    \scriptscriptfont\eurbfam=\fiveeurb
+  \fi
+  \ifcmmibloaded@
+   \textfont\cmmibfam=\tencmmib \scriptfont\cmmibfam=\sevencmmib
+    \scriptscriptfont\cmmibfam=\fivecmmib
+  \fi
+  \ifcmbsyloaded@
+   \textfont\cmbsyfam=\tencmbsy \scriptfont\cmbsyfam=\sevencmbsy
+    \scriptscriptfont\cmbsyfam=\fivecmbsy
+  \fi
+ \fi %% Matches \ifsyntax at .
+ \setbox\strutbox\hbox{\vrule height8.5\p@ depth3.5\p@ width\z@}%
+ \setbox\strutbox@\hbox{\vrule height8\p@ depth3\p@ width\z@}%
+ \normalbaselines\tenrm\ex@=.2326ex}
+
+%% For \eightpoint we don't change the assignments of \scriptscriptstyle,
+%% since these don't change from \tenpoint (and we call \tenpoint near the
+%% end). \textfont3 also doesn't change (an \eightex font will be included
+%% in the AMSFonts collection, and can be added by the user).
+
+\def\eightpoint{\def\pointsize@{8}%
+ \normalbaselineskip10\p@
+ \abovedisplayskip10\p@ plus2.4\p@ minus7.2\p@
+ \belowdisplayskip10\p@ plus2.4\p@ minus7.2\p@
+ \abovedisplayshortskip\z@ plus2.4\p@
+ \belowdisplayshortskip5.6\p@ plus2.4\p@ minus3.2\p@
+ \textonlyfont@\rm\eightrm
+ \textonlyfont@\it\eightit
+ \textonlyfont@\sl\eightsl
+ \textonlyfont@\bf\eightbf
+ \textonlyfont@\smc\eightsmc
+ \ifsyntax@\def\big##1{{\hbox{$\left##1\right.$}}}\else
+  \let\big\eightbig@
+  \textfont\z@=\eightrm \scriptfont\z@=\sixrm
+  \textfont\@ne=\eighti \scriptfont\@ne=\sixi
+  \textfont\tw@=\eightsy \scriptfont\tw@=\sixsy
+  %% Although we don't have smaller fonts for \itfam or \slfam, we reset
+  %% the \scriptfont and \scriptscriptfonts to the text size so that they
+  %% won't appear in ten-point if they are used.
+  \textfont\itfam=\eightit \scriptfont\itfam=\eightit
+   \scriptscriptfont\itfam=\eightit
+  \textfont\slfam=\eightsl \scriptfont\slfam=\eightsl
+   \scriptscriptfont\slfam=\eightsl
+  \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
+  \ifmsamloaded@
+   \textfont\msafam=\eightmsa \scriptfont\msafam=\sixmsa
+  \fi
+  \ifmsbmloaded@
+   \textfont\msbfam=\eightmsb \scriptfont\msbfam=\sixmsb
+  \fi
+  \ifeufmloaded@
+   \textfont\eufmfam=\eighteufm \scriptfont\eufmfam=\sixeufm
+  \fi
+ \fi
+ \setbox\strutbox\hbox{\vrule height7\p@ depth3\p@ width\z@}%
+ \setbox\strutbox@\hbox{\vrule height6.5\p@ depth2.5\p@ width\z@}%
+ \normalbaselines\eightrm\ex at .2326ex}
+
+%% Fix Plain's \bigl, \Bigl, etc. macros so that they try to scale with
+%% size changes.  This uses the fact that \tenpoint and \eightpoint
+%% set \ht\strutbox to be 70% of the normal unstretched baselineskip.
+%% from John Hobby
+
+\def\big#1{{\hbox{$\m at th
+  \left#1\vcenter to1.428\ht\strutbox{}\right.\n at space$}}}
+\def\Big#1{{\hbox{$\m at th
+  \left#1\vcenter to2.142\ht\strutbox{}\right.\n at space$}}}
+\def\bigg#1{{\hbox{$\m at th
+  \left#1\vcenter to2.857\ht\strutbox{}\right.\n at space$}}}
+\def\Bigg#1{{\hbox{$\m at th
+  \left#1\vcenter to3.571\ht\strutbox{}\right.\n at space$}}}
+
+%% Although the counter \footmarkcount@ is declared in AMSTEX.TEX, the rest
+%% of \footnote has to be done here.  \footmarkform@ tells how to treat a
+%% general type of footnote marker.  And \thefootnotemark is for the user,
+%% analogous to \thetag in AMSTEX.TEX.
+
+\def\footmarkform@#1{$\m at th^{#1}$}
+\let\thefootnotemark\footmarkform@
+
+%% \makefootnote@ takes care of the general problem of creating a footnote
+%% whose marker is #1 and whose text is #2, so that we can concentrate
+%% separately on the problem of how the marker is determined.  It is
+%% essentially \vfootnote from TB, p. 363, except that we don't do fancy
+%% things to worry about category code changes; our footnotes will begin
+%% unindented, and instead of adding a \strut at the end, we will just add
+%% the lower part of the strut. (And, of course, we will be in eight point 
+%% type.)
+
+\def\makefootnote@#1#2{\insert\footins
+ {\interlinepenalty\interfootnotelinepenalty
+ \eightpoint\splittopskip\ht\strutbox\splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM\leftskip\z@\rightskip\z@\spaceskip\z@\xspaceskip\z@
+ \noindent{#1}\footstrut\ignorespaces#2\unskip\lower\dp\strutbox
+ \vbox to\dp\strutbox{}}}
+
+%% We need a counter for footnotes; initialize it.
+
+\newcount\footmarkcount@
+\footmarkcount@\z@
+
+%% \footnotemark basically just advances \footmarkcount@ by 1 and then uses
+%% \footmarkform@{\number\footmarkcount@}---we still have to worry about the
+%% space factor as in the definition of \footnote in TB, p. 363.  However, we
+%% are allowing both an `optional' argument [#1], where we instead use
+%% \footmarkform@{#1}, and a `literal' argument "#1", where we instead use #1
+%% exactly as typed, so we need to use a \futurelet to look at the next
+%% symbol. Compressed format is used.
+
+\def\footnotemark{\let\@sf\empty\relaxnext@
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ \DN@{\ifx[\next\let\next@\nextii@\else
+  \ifx"\next\let\next@\nextiii@\else
+  \let\next@\nextiv@\fi\fi\next@}%
+ \DNii@[##1]{\footmarkform@{##1}\@sf}%
+ \def\nextiii@"##1"{{##1}\@sf}%
+ \def\nextiv@{\global\advance\footmarkcount@\@ne
+  \footmarkform@{\number\footmarkcount@}\@sf}%
+ \FN@\next@}
+
+%% \footnotetext essentially applies \makefootnote@ to the next group, using
+%% \footmarkcount@ for the marker that goes before the footnote text.
+%% However, we once again allow optional and literal arguments.  Compressed
+%% format is used.
+
+\def\footnotetext{\relaxnext@
+ \DN@{\ifx[\next\let\next@\nextii@\else
+  \ifx"\next\let\next@\nextiii@\else
+  \let\next@\nextiv@\fi\fi\next@}%
+ \DNii@[##1]##2{\makefootnote@{\footmarkform@{##1}}{##2}}%
+ \def\nextiii@"##1"##2{\makefootnote@{##1}{##2}}%
+ \def\nextiv@##1{\makefootnote@{\footmarkform@{\number\footmarkcount@}}{##1}}%
+ \FN@\next@}
+
+%% Finally, \footnote is basically \footnotemark\footnote, but we can't write
+%% it directly that way because it, too, can take optional and literal
+%% arguments.  Compressed format again.
+
+\def\footnote{\let\@sf\empty\relaxnext@
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ \DN@{\ifx[\next\let\next@\nextii@\else
+  \ifx"\next\let\next@\nextiii@\else
+  \let\next@\nextiv@\fi\fi\next@}%
+ \DNii@[##1]##2{\footnotemark[##1]\footnotetext[##1]{##2}}%
+ \def\nextiii@"##1"##2{\footnotemark"##1"\footnotetext"##1"{##2}}%
+ \def\nextiv@##1{\footnotemark\footnotetext{##1}}%
+ \FN@\next@}
+
+%% \adjustfootnotemark just allows the user to change \footmarkcount at .
+
+\def\adjustfootnotemark#1{\advance\footmarkcount@#1\relax}
+
+%% The \topmatter ... \endtopmatter syntax was created to go along with
+%% LaTeX, but \topmatter actually has no function.
+
+\let\topmatter\relax
+
+!!!!!!!!!!
+
+%% The constructions \title, \author, \affil and \heading use `\z@\filhss@'
+%% instead of \hfil or \hss glue explicitly, so that if they are followed by
+%% \overlong they can let \filhss@ be `plus1000pt minus1000pt' (so that a
+%% line longer than \hsize will just be centered outside the margins), but
+%% otherwise they let \filhss@ simply be `plus1000pt' (so that a line longer
+%% than \hsize will actually be reported as Overfull).  Like \vspace, etc.,
+%% in AMSTEX.TEX, this should give an error message when used incorrectly,
+%% and we abbreviate the proper definition. The definition involves \next@
+%% and \nextii@, because \overlong@ is always used in constructions with
+%% compressed format that end \futurelet\next\next@, use \overlong to define
+%% \next@, and then define \nextii@ appropriately.
+
+
+\Invalid@\overlong
+\def\overlong@{\DN@{\ifx\next\overlong
+  \def\filhss@{plus\@m\p@ minus\@m\p@}\DN@\overlong{\nextii@}%  
+   %% When \overlong appears [the new value of] \next@ must 
+   %% kill \overlong and then call \nextii at .
+ \else\def\filhss@{plus\@m\p@\relax}\let\next@\nextii@\fi
+ \next@}}
+
+%% We need a box to store the title.  We make it empty if no title appears,
+%% so that at least some space appears for the title (presumably the author
+%% simply hasn't decided on the title yet).
+
+\newbox\titlebox@
+\setbox\titlebox@\vbox{}
+
+%% Although we use the syntax \author ... \endauthor, we simply use
+%% \endauthor as a delimiter for the argument, as with \align, rather than
+%% doing \bgroup and \egroup tricks, as with \aligned. And we simply say
+%% \let\\=\cr, since we shouldn't have to worry about any of the problems
+%% that make \Let@ necessary.  But there is a particular reason, beyond
+%% convenience, for writing things this way.  If one wanted to have a \TITLE
+%% construction, that applied \uppercase to everything, then \TITLE would
+%% have to be written this way.  [\TITLE is a nice idea, because then the
+%% title can appear in upper- and lowercase in the input file (for automatic
+%% indexing, for example), but all uppercase in the paper.  However, there
+%% would actually be some horrible problems involved in writing TITLE
+%% correctly.  For example, math formulas might appear in a title, and we'd
+%% have to arrange not to uppercase them. Moreover, footnotes might appear,
+%% since some styles use footnotes on authors for the affiliation, etc., and
+%% then the footnotes mustn't be uppercased either!  Any one who wants this
+%% can do it Eirself.]
+
+\def\title{\relaxnext@
+ \DNii@##1\endtitle{{\let\\=\cr
+  \global\setbox\titlebox@\vbox{\tabskip\z@\filhss@
+  \halign to\hsize{\tenpoint\bf\hfil\ignorespaces####\unskip\hfil\cr##1\cr}}}}%
+ \overlong@
+ \futurelet\next\next@}
+
+%% \author@ is almost exactly the same, except that instead of having
+%% \authorbox@ empty when no \author appears, we have a flag to tell if it
+%% appears. 
+
+\newif\ifauthor@
+\newbox\authorbox@
+\def\author{\relaxnext@
+ \DNii@##1\endauthor{{\let\\=\cr
+  \global\setbox\authorbox@\vbox{\tabskip\z@\filhss@
+  \halign to\hsize{\tenpoint\smc\hfil\ignorespaces####\unskip\hfil\cr##1\cr
+ }}}}\overlong@\global\author at true
+ \futurelet\next\next@}
+
+%% \affil, on the other hand, is written in the \bgroup ... \egroup style,
+%% since one presumably wouldn't ever want to uppercase everything here.
+
+\newif\ifaffil@
+\newbox\affilbox@
+\def\affil{\relaxnext@
+ \DNii@{\bgroup\let\\=\cr
+  \global\setbox\affilbox@\vbox\bgroup\tabskip\z@\filhss@
+  \halign to\hsize\bgroup\tenpoint\hfil\ignorespaces####\unskip\hfil\cr}%
+ \overlong@
+ \global\affil at true
+ \futurelet\next\next@}
+
+\def\endaffil{\cr\egroup\egroup\egroup}
+
+%% Since \address can be used any number of times, we have to store the
+%% different addresses in control sequences that we manufacture as needed. We
+%% use \addresscount@ to store the number of times \address is used.
+
+\newcount\addresscount@
+\addresscount@\z@
+
+\def\address#1{\global\advance\addresscount@\@ne
+ \expandafter\gdef\csname address\number\addresscount@\endcsname
+  %% The first address is `\address1', the next is `\address2', etc.
+  {\noindent\eightpoint\ignorespaces#1\par}}
+
+%% We use flags to tell if \date and \thanks have been used, in which case
+%% \date@ and \thanks@, respectively, have been defined.
+
+\newif\ifdate@
+
+\def\date#1{\global\date at true\gdef\date@{\tenpoint\ignorespaces#1\unskip}}
+
+\newif\ifthanks@
+
+\def\thanks#1{\global\thanks at true
+ \gdef\thanks@{\eightpoint\ignorespaces#1\unskip}}
+
+%% \nofrills and \usualspace are subsidiary features that some constructions
+%% can have, but which should give error message if used otherwise.
+
+\Invalid@\nofrills
+\Invalid@\usualspace
+
+%% \nofrills@ is the control sequence that does the work of making \nofrills
+%% work correctly.  \nofrills@ will take two arguments; the first represents
+%% the text that should be typeset `without frills', while the second is just
+%% a convenient control sequence name, which we put at the beginning of the
+%% construction in question.  This control sequence will be defined to be the
+%% first argument of \nofrills@ if \nofrills follows the construction, but
+%% simply \relax otherwise. (We choose different control sequences for each
+%% construction in case one occurs within another.)
+
+%% Like \overlong, \nofrills@ is defined in terms of \next@ and \nextii@
+%% because it is used in constructions that end \futurelet\next\next@, use
+%% \nofrills@ to define \next@, and then define \nextii@ appropriately.
+%% \nofrills@ also sets a flag \ifnofrills@, for use with \usualspace at .
+
+\newif\ifnofrills@
+\def\nofrills@#1#2{\DN@{\ifx\next\nofrills\nofrills at true\let#2\relax
+  \DN@\nofrills{\nextii@}%
+ %% When \nofrills appears, the control sequence #2 is just relax, and
+ %% \next@ must kill off \nofrills before calling \nextii at .
+ \else\nofrills at false
+  \def#2{#1}%
+ %% When \nofrills doesn't appear, the control sequence #2 is #1.
+  \let\next@\nextii@\fi\next@}}
+
+%% \usualspace@ simply defines \usualspace when no frills have been specified
+%% (and otherwise does nothing).
+
+\def\usualspace@#1{\ifnofrills@\def\usualspace{#1}\fi}
+
+%% As an example of all this, consider \keywords, which creates
+%% \thekeywords at .  Normally \keywords makes \thekeywords@ begin with {\it
+%% Keywords.\enspace}.  But \keywords\nofrills{...} makes it begin with ...
+%% instead. Moreover, \usualspace will then be defined as {\it\enspace}.
+
+\def\thekeywords@{}
+\def\keywords{\relaxnext@
+ \nofrills@{{\it Keywords.\enspace}}\keywords@
+ \DNii@##1{\def\thekeywords@{\usualspace@{{\it\enspace}}\noindent
+ \eightpoint\keywords@\ignorespaces##1\par}}%
+ \futurelet\next\next@}
+
+%% \subjclass is exactly analogous.
+
+\def\thesubjclass@{}
+\def\subjclass{\relaxnext@
+ \nofrills@{{\rm1980 {\it Mathematics subject 
+   classifications\/}: }}\subjclass@
+ \DNii@##1{\def\thesubjclass@{\usualspace@
+  {{\rm\spacefactor2000 \space}}\noindent\eightpoint
+  \subjclass@\ignorespaces##1\par}}%
+ \futurelet\next\next@}
+
+%% \proclaim and \endproclaim have a special problem: We want them to be
+%% allowed within \abstract{...} but we want them to be \outer afterwards. So
+%% we will actually define \innerproclaim@ and \innerendproclaim@ (later) and
+%% temporarily use these for \proclaim and \endproclaim, until \endtopmatter
+%% (which naturally should appear after any \abstract), which will make them
+%% outer again.
+
+\def\proclaim{\innerproclaim@}
+\def\endproclaim{\innerendproclaim@}
+
+%% \abstract is similar to the constructions above, but we need a \long\def
+%% since an abstract can be more than one paragraph. 
+
+\newif\ifabstract@
+\def\abstract{\relaxnext@
+ \nofrills@{{Abstract.\enspace}}\abstract@
+ \long\DNii@##1{\long\gdef\theabstract@{\usualspace@
+  {{\eightpoint\enspace}}\eightpoint\abstract@\ignorespaces##1\par}}%
+ \global\abstract at true
+ \futurelet\next\next@}
+
+%% We create empty entries \pretitle, ..., \prepaper among the other parts of
+%% the \topmatter so that users can insert things between them if necessary.
+
+\let\pretitle\relax
+\let\preauthor\relax
+\let\preaffil\relax
+\let\predate\relax
+\let\preabstract\relax
+\let\prepaper\relax
+
+%% \endtopmatter now puts all of these things together on the page.
+
+\def\endtopmatter{\hrule height\z@\vskip-\topskip  %% Go to very top of page.
+ \pretitle   
+ \vskip24\p@ plus12\p@ minus12\p@
+ \unvbox\titlebox@ %% Title (or empty box).
+ \preauthor
+ \ifauthor@\vskip12\p@ plus6\p@ minus3\p@\unvbox\authorbox@\fi
+  %% Put in \author, and spacing, if specified.
+ \preaffil
+ \ifaffil@\vskip10\p@ plus5\p@ minus2\p@\unvbox\affilbox@\fi
+  %% Put in \affil, and spacing, if specified.
+ \predate
+ \ifdate@\vskip6\p@ plus2\p@ minus\p@\hbox to\hsize{\hfil\date@\hfil}\fi
+  %% Put in \date, and spacing, if specified.
+ \preabstract
+ \ifthanks@\makefootnote@{}{\thanks@}\fi
+  %% If \thanks given, treat it as a footnote text (with no footnote mark).
+ \ifabstract@\vskip15\p@ plus12\p@ minus12\p@
+  %% If \abstract given, put in spacing and then print \theabstract@ with
+  %% 24pt margins at each side.  In order for \tag's to come out at the
+  %% new margins, we have to have \displaywidth decreased by 48pt and
+  %% \displayindent set to 24pt (see the rules in TB, pp. 188--189). Since
+  %% \displaywidth and \displayindent are normally set at each $$, we
+  %% have to use \everydisplay to get the desired values.
+  {\leftskip24\p@\rightskip24\p@
+   \everydisplay{\advance\displaywidth-48\p@\displayindent20\p@}
+   \noindent\theabstract@}\fi
+ \prepaper
+  %% Now make \proclaim and \endproclaim \outer.
+ \outer\def\proclaim{\innerproclaim@}%
+ \outer\def\endproclaim{\innerendproclaim@}%
+ \vskip18\p@ plus12\p@ minus6\p@\tenpoint}
+
+%% The \address's get printed at the end of the paper, so we take care of this
+%% with \enddocument.  
+
+\outer\def\enddocument{\nobreak  %% No break between the References and 
+  %% the final matter.
+ \sfcode`\.=3000  %% Return space factor code of period (changed by \Refs).
+ \vskip12\p@ minus6\p@
+ \thekeywords@\thesubjclass@  %% Keywords and subject classifications, 
+  %% if they exist.
+ \nobreak\vskip12\p@ minus6\p@
+ \count@\z@
+ \loop\ifnum\count@<\addresscount@\advance\count@\@ne
+ \csname address\number\count@\endcsname\repeat
+  %% Print all the \address's.
+ \vfill\supereject\end}
+
+%% \heading ... \endheading is similar to \affil .. \endaffil, except that
+%% \bigbreak is added at the beginning, and \endheading actually prints the
+%% \headingbox@, followed by \nobreak\medskip.  We \unvbox the \headingbox@,
+%% so that a footnote within it will migrate properly.
+
+\newbox\headingbox@
+
+\outer\def\heading{\relaxnext@
+ \DNii@{\bigbreak\bgroup\let\\=\cr
+ \global\setbox\headingbox@\vbox\bgroup\tabskip\z@\filhss@
+ \halign to\hsize\bgroup\tenpoint\smc\hfil\ignorespaces####\unskip\hfil\cr}%
+ \overlong@
+ \futurelet\next\next@}
+
+\def\endheading{\cr\egroup\egroup\egroup\unvbox\headingbox@
+ \nobreak\medskip}
+
+%% \subheading is simpler, though it allows \nofrills.
+
+\def\subheading{\relaxnext@
+ \nofrills@{.\enspace}\subheading@
+ \DNii@##1{\medbreak\noindent{\usualspace@{{\bf\enspace}}%
+ \tenpoint\bf\ignorespaces##1\unskip\subheading@}\ignorespaces}%
+ \futurelet\next\next@}
+
+%% \innerproclaim@ (the guy behind \proclaim), sets a flag so that we can
+%% give an error message if a previous \proclaim has occurred without an
+%% \endproclaim (surely an error, since the \endproclaim would be needed to
+%% turn off the \sl font). If we are in eight point type (probably because we
+%% are in the abstract, rather than in a footnote), we replace the \smc font
+%% by \uppercase{\rm...} as the nearest substitute.  Instead of writing the
+%% test as \ifnum\pointsize@=8 we use a construction that will work even if
+%% \pointsize@ has other values (say, for fractional point sizes) in other
+%% formats.
+
+%% Note that in the error message we say \string\\proclaim instead of
+%% \string\proclaim.  That is because \proclaim will usually be \outer, so
+%% can't appear in \Err@, while \\ always can. We then have to \eat@ the
+%% first \ of the \\, requiring an \expandafter\eat@\string\\ construction.
+
+\newif\ifproclaim@
+
+\def\innerproclaim@{\relaxnext@
+ \nofrills@{.\enspace}\proclaim@
+ \DNii@##1{\medbreak\noindent
+  \DN@{8}\ifx\pointsize@\next@  %% If \pointsize@ is 8, 
+   \uppercase{\usualspace@{{\rm\enspace}}\rm\ignorespaces##1\unskip\proclaim@}%
+ %% use an \uppercase construction.
+  \else
+   \usualspace@{{\smc\enspace}}\smc\ignorespaces##1\unskip\proclaim@\fi
+ %% After printing the name of the theorem, switch to \sl.
+  \sl
+  \ifproclaim@\Err@{Previous \expandafter\eat@\string\\proclaim
+   has no matching \expandafter\eat@\string\\endproclaim}\else
+   \proclaim at true\fi\ignorespaces}%
+ \futurelet\next\next@}
+
+%% \innerendproclaim@ (the guy behind \endproclaim) resets the \ifproclaim@
+%% flag, ends the paragraph, switches back to \rm and adds spacing. (This
+%% means that if, for some strange reason, a whole section of text happens to
+%% be in italics, then the user must type \it again after each \endproclaim,
+%% but that hardly seems a problem worth worrying about.)
+
+\def\innerendproclaim@{\proclaim at false\par\rm
+ \ifdim\lastskip<\medskipamount\removelastskip\penalty55 \medskip\fi}
+
+%% \demo, like \innerproclaim@, replaces the \smc font by \uppercase{\rm...}
+%% (I didn't expect any one to use \demo in eight point type, but some one
+%% has already claimed that he did).  We also take the opportunity again to
+%% issue an error message if a previous \proclaim has no matching
+%% \endproclaim.
+
+\def\demo{\relaxnext@
+ \nofrills@{:\enspace}\demo@
+ \DNii@##1{\par\ifdim\lastskip<\smallskipamount\removelastskip
+  \smallskip\fi\noindent
+  \DN@{8}\ifx\pointsize@\next@
+   \uppercase{\usualspace@{{\rm\enspace}}\rm\ignorespaces##1\unskip\demo@}%
+  \else
+   \usualspace@{{\smc\enspace}}\smc\ignorespaces##1\unskip\demo@\fi
+  \rm
+  \ifproclaim@\Err@{Previous \expandafter\eat@\string\\proclaim
+   had no matching \expandafter\eat@\string\\endproclaim}\fi
+  \ignorespaces}%
+ \futurelet\next\next@}
+
+%% \enddemo is easy.
+
+\def\enddemo{\par\smallskip}
+
+%% \qed adjusts the spacing for use within a displayed formula (the proper
+%% usage when the displayed formula ends the \demo).  However, it looks as if
+%% the proper spacing won't be made when we use \qed as the last line of an
+%% \align, so something should probably be done about this.
+
+\def\qed{\ifhmode\unskip\nobreak\fi\ifmmode\ifinner\else\hskip5\p@\fi\fi
+ \hbox{\hskip5\p@\vrule width4\p@ height6\p@ depth1.5\p@\hskip\p@}}
+
+%% \cite has to see if a comma appears. 
+
+\def\cite#1{\DNii@##1,##2\end@{{\rm[{\bf##1}, ##2]}}%
+ \in@,{#1}\ifin@\DN@{\nextii@#1\end@}\else
+  \DN@{{\rm[{\bf#1}]}}\fi\next@}
+
+%% \roster uses \rostercount@ to store the \item number. The first item is
+%% treated specially, because of the extra space before it, so we need a flag
+%% \iffirstitem@ to identify it.
+
+\newcount\rostercount@
+\newif\iffirstitem@
+
+%% Since \item in \roster differs from in \plain, we store plain's \item in
+%% \plainitem@, so that we can restore the definition after the \roster is
+%% over.
+
+\let\plainitem@\item
+
+%% In order for our \roster's to work, we will also have to be sure that
+%% \everypar is {}.  Just in case \everypar already has a value, as it might
+%% in some format, we store those values in the token list \everypartoks@, so
+%% that we can restore them at the end.  \par@ does this storing, and sets
+%% \everypar{}.
+
+\newtoks\everypartoks@
+\def\par@{\everypartoks@=\expandafter{\the\everypar}\everypar{}}
+
+%% Compressed format is used for \roster, and even for one of the \def's made
+%% within the \def of \roster !
+
+\def\roster{\edef\leftskip@{\leftskip\the\leftskip}%
+  %% We also have to store the \leftskip, since it will be changed.
+ \relaxnext@
+ \rostercount@\z@  %% Initialize \rostercount@ to 0.
+ \def\item{\futurelet\next\rosteritem@}%  %% \item, now redefined,
+   %% has to look ahead for [ and ", since we allow optional and literal 
+   %% arguments. \rosteritem@ itself is defined below.
+   %% The following \next@ is the one called at the very end of this \def.
+ \DN@{\ifx\next\runinitem\let\next@\nextii@\else
+  \let\next@\nextiii@\fi\next@}%
+  %% First we look to see whether \roster is followed by \runinitem,
+  %% since this requires different processing.
+ \DNii@\runinitem  %% If \runinitem occurs, \nextii@ must kill it off.
+  {\unskip   %% This unskips any space before the original \roster. 
+    %% Our definition of \nextii@\runinitem itself uses compressed format
+    %% and a \futurelet\next\next@, because we still have to allow 
+    %% [ or " to come next.
+   \DN@{\ifx\next[\let\next@\nextii@\else
+    \ifx\next"\let\next@\nextiii@\else\let\next@\nextiv@\fi\fi\next@}%
+    %% The following \nextii@ is the one created by \nextii@\runinitem;
+    %% there is no conflict of names, since the first calls the second.
+   \DNii@[####1]{\rostercount@####1\relax
+    \enspace{\rm(\number\rostercount@)}~\ignorespaces}%
+    %% If [...] comes next, we use (...) but we explicitly do this by
+    %% setting \rostercount@ equal to ... so that succeeding \item's
+    %% will have the right numbers (use of something other than a
+    %% number will give an error message).
+   \def\nextiii@"####1"{\enspace{\rm####1}~\ignorespaces}%
+    %% If "..." comes next, we use ... exactly as typed.
+   \def\nextiv@{\enspace{\rm(1)}\rostercount@\@ne~}%
+    %% Otherwise just use (1).   
+   \par@\firstitem at false  %% Before doing any of this we still change
+     %% \everypar, if necessary, which is normally done elsewhere, and set
+     %% \firstitem at false, since this \runinitem counts as the first.
+   \futurelet\next\next@}%  %% End of definition of \nextii@\runinitem.
+   %% The following \nextiii@ will be used if we didn't have \runinitem.
+ \def\nextiii@{\par\par@  %% End the present paragraph, change \everypar
+    %% if necessary, prohibit a break, add a small skip, but add something
+    %% to offset any \parskip, if there is any, which would be contributed
+    %% when the next paragraph is begun by the next \item.
+  \penalty\@m\smallskip\vskip-\parskip
+  \firstitem at true}%  %% And set \firstitem at true for use with \item.
+ \futurelet\next\next@}
+
+%% Rember that \rosteritem@ is called by \futurelet\next\rosteritem at .
+
+\def\rosteritem@{\iffirstitem@\firstitem at false\else\par\vskip-\parskip\fi
+   %% Except at the first \item, we end the paragraph (consisting of the
+   %% previous \item), and subtract any space that might be added by the
+   %% next \item.
+ \leftskip3\parindent\noindent  %% Set the indentation.
+ \DNii@[##1]{\rostercount@##1\relax
+  \llap{\hbox to2.5\parindent{\hss\rm(\number\rostercount@)}%
+   \hskip.5\parindent}\ignorespaces}%
+   %% If [...] follows \item, we use ... as the number, again by setting
+   %% \rostercount@, so that succeeding \items will have the right number.
+ \def\nextiii@"##1"{%
+  \llap{\hbox to2.5\parindent{\hss\rm##1}\hskip.5\parindent}\ignorespaces}%
+   %% If "..." follows  \item, we use ... exactly as typed.
+ \def\nextiv@{\advance\rostercount@\@ne
+  \llap{\hbox to2.5\parindent{\hss\rm(\number\rostercount@)}%
+   \hskip.5\parindent}}%
+   %% Otherwise we print the \rostercount@ in parentheses.
+ \ifx\next[\let\next@\nextii@\else\ifx\next"\let\next@\nextiii@\else
+  \let\next@\nextiv@\fi\fi\next@}
+
+%% \therosteritem is just a convenience for the user.
+
+\def\therosteritem#1{{\rm(\ignorespaces#1\unskip)}}
+
+%% We want to save \Runinitem for last, but it is relevant even to the
+%% definition of \endroster, since we have to worry whether \endroster is
+%% followed by another \Runinitem.  We will use a flag \ifnextRunin@ to tell
+%% us.
+
+\newif\ifnextRunin@
+
+\def\endroster{\relaxnext@
+ \par\leftskip@  %% End the paragraph, and restore the \leftskip.
+ \penalty-50 \vskip-\parskip\smallskip  %% Add a good break and
+   %% subtract any space that will be started by next paragraph, 
+   %% but add a \smallskip.
+ \DN@{\ifx\next\Runinitem\let\next@\relax
+    %% Don't do anything else if \Runinitem comes next.
+  \else\nextRunin at false\let\item\plainitem@  %% Otherwise, set 
+    %% \nextRunin at false, and restore \item to its definition in plain;
+   \ifx\next\par %% moreover, if the \endroster is followed by a new paragraph,
+    \DN@\par{\everypar=\expandafter{\the\everypartoks@}}%
+   %% delete that instruction (since we've already put in a \par), and
+   %% restore \everypar,
+   \else  %% but if the \endroster isn't followed by a new paragraph,
+    \DN@{\noindent\everypar=\expandafter{\the\everypartoks@}}%
+   %% start the next paragraph unindented, and restore \everypar.
+  \fi\fi\next@}%
+ \futurelet\next\next@}
+
+%% Finally, for \Runinitem ... \roster\runinitem we have the usual junk for
+%% worrying about [ or " coming next, and then more interesting things:  We
+%% have to find out how many lines of text we had before the \roster; we
+%% will store this in \rosterhangafter at .
+
+\newcount\rosterhangafter@
+
+\def\Runinitem#1\roster\runinitem{\relaxnext@
+ \rostercount@\z@ %% Initialize \rostercount@ to 0.
+ \def\item{\futurelet\next\rosteritem@}%  %% Define \item as before.
+ \def\runinitem@{#1}%  %% Store everything up to the roster in \runinitem at .
+ \DN@{\ifx\next[\let\next\nextii@\else\ifx\next"\let\next\nextiii@
+  \else\let\next\nextiv@\fi\fi\next}%
+ \DNii@[##1]{\rostercount@##1\relax
+  \def\item@{{\rm(\number\rostercount@)}}\nextv@}%
+   %% If [...] follows \runinitem, we proceed as before, except we call
+   %% this first instance \item@, and we let \nextv@, defined below, take
+   %% care of everything.
+ \def\nextiii@"##1"{\def\item@{{\rm##1}}\nextv@}%
+   %% If "..." follows \runinitem, we define \item@ to use it.
+ \def\nextiv@{\advance\rostercount@\@ne
+  \def\item@{{\rm(\number\rostercount@)}}\nextv@}%
+   %% Otherwise, we use the proper \rostercount at .
+   %% Now comes \nextv@, which has to properly typeset things.
+ \def\nextv@{\setbox\z@\vbox  %% First store things in \box0 .
+  {\ifnextRunin@\noindent\fi  %% Start unindented if we have
+    %% \ifnextRunin at true.  This will happen only if we had 
+    %% \Runinitem...\endroster right before.
+  \runinitem@\unskip\enspace\item@~\par  %% Add the stored things in
+    %% \runinitem@, and then \item at .
+  \global\rosterhangafter@\prevgraf}% %% This sets \rosterhangafter@ 
+    %% to the number of lines in \box0 , i.e., of the material so far; see
+    %% TB, p. 103. We need to say \global since this is set within \box0 .   
+    %% Now we're done with \box0 !
+  \firstitem at false  %% Set \firstitem at false for future \item's.
+  \ifnextRunin@\else\par\fi  %% End previous paragraph unless
+    %% we had \Runinitem ...\endroster right before.
+    %%
+    %% Now comes the good part: we \hangindent3\parindent, as before,
+    %% but we do it for \rosterhangafter@ lines, the number that already
+    %% appeared in the material we set in \box0 .
+  \hangafter\rosterhangafter@\hangindent3\parindent
+  \ifnextRunin@\noindent\fi  %% Start unindented if we had a
+     %% \Runinitem ... \endroster right before.
+  \runinitem@\unskip\enspace %% Put in all the stored stuff \Runinitem@
+  \item@~\ifnextRunin@\else\par@\fi  %% and the \item@, and
+    %% end the paragraph, unless we had a \Runinitem ... \endroster before.
+  \nextRunin at true\ignorespaces}%  %% Here's where we set \nextRunin at true.
+ \futurelet\next\next@}
+
+%% \Refs is supposed to allow \nofrills to allow a different heading to be
+%% printed.  We use the same general scheme as before, but can't use
+%% \nofrills@ directly, since now we want one thing to appear when \nofrills
+%% isn't used, and something else when it is.
+ 
+%% Beyond that, \Refs will change to eight point type, in which all the
+%% references will be set, and change the space factor code of a period to
+%% 1000, so that normal interword spaces occur after periods.  In addition,
+%% \refskip@ will be defined as \hskip 1sp \hskip-1sp.  Recall that \refskip@
+%% appears in the definition of \nolinebreak in AMSTEX.TEX, although it
+%% simply has the value \relax there.  The exact reasons for redefining
+%% \refskip@ will appear later, but the main point is that it is easy to
+%% recognize, since presumably no user would actually use an \hskip-1sp.
+%% The change to eight point type is preceded by a \bgroup, which will be
+%% closed by an \egroup in \endRefs.
+
+\outer\def\Refs{\relaxnext@\def\refskip@{\hskip\@ne sp\hskip\m at ne sp}%
+ %% The next two lines are the substitute for \nofrills at .
+ \DN@{\ifx\next\nofrills\DN@\nofrills{\nextii@}\else
+  \DN@{\nextii@{References}}\fi\next@}%
+ \DNii@##1{\bigbreak\hbox to\hsize{\hfil\tenpoint
+  \smc\ignorespaces##1\unskip\hfil}\nobreak
+  \bigskip\bgroup\eightpoint\sfcode`.=\@m}%
+ \futurelet\next\next@}
+
+%% The following macros to set the references are perhaps more of a tour de
+%% force than anything else. Various people dislike them for various reasons,
+%% and some one will always be able find some special kind of reference
+%% formatting that isn't included here. However, one can always simply type
+%% out a reference as one wants it to appear as a last resort.  The value of
+%% these macros is that they at least do allow the various parts of the
+%% reference to be specified without having to worry about the particular way
+%% the style file will format them, and thus they can easily be modified for
+%% other style files.
+
+%% The real TeXnical finesse was to allow the various parts of the reference
+%% to be specified in an arbitrary order.
+
+%% We begin by allocating boxes to hold the various possible bits of
+%% information. A few of these can be used by different constructions:
+%% \bybox@ holds the author, whether called by \by or by \manyby; \bookbox@
+%% holds the book title, whether called by \book, or by \inbook; \pagesbox@
+%% holds the pages, whether called by \pages or by \page.
+
+\newbox\nobox@
+\newbox\keybox@
+\newbox\bybox@
+\newbox\paperbox@
+\newbox\paperinfobox@
+\newbox\jourbox@
+\newbox\volbox@
+\newbox\issuebox@
+\newbox\yrbox@
+\newbox\pagesbox@
+\newbox\bookbox@
+\newbox\bookinfobox@
+\newbox\publbox@
+\newbox\publaddrbox@
+\newbox\finalinfobox@
+
+%% We also need a box to store the author's name for later use when
+%% it has been called by \bymany.
+
+\newbox\bysamebox@
+
+%% Next we define flags to tell if various bits of information have been
+%% specified.
+
+\newif\ifno@
+\newif\ifkey@
+\newif\ifby@
+\newif\ifmanyby@
+\newif\ifbysame@
+\newif\ifpaper@
+\newif\ifpaperinfo@
+\newif\ifjour@
+\newif\ifvol@
+\newif\ifissue@
+\newif\ifyr@
+\newif\iftoappear@
+\newif\ifpages@
+\newif\ifpage@
+\newif\ifbook@
+\newif\ifinbook@
+\newif\ifbookinfo@
+\newif\ifpubl@
+\newif\ifpubladdr@
+\newif\iffinalinfo@
+
+%% In addition, certain other flags will be needed to get the processing
+%% right.
+
+%% \ifafterbook@ is needed to tell if we've just finished typesetting a book
+%% title, so that right double quotes '' should go after it; we can't put in
+%% the '' immediately, because we will need either a period or comma,
+%% depending on whether any other information follows.  (Of course, things
+%% would be much easier if we used `logical' punctuation and typed things
+%% like:
+%%             ``Title of Book'', pg. 367. Publisher.  
+%% But most journals prefer having the punctuation inside the right quotes,
+%% and since this is the harder case we might as well do it, to show how it's
+%% done.
+
+\newif\ifafterbook@
+
+%% Other flags are needed because of the \moreref construction, which
+%% requires subsequent parts of the \ref to be treated somewhat differently.
+
+\newif\iffirstref@
+\newif\iflastref@
+\newif\ifprevjour@
+\newif\ifprevbook@
+\newif\ifprevinbook@
+\newif\ifnojourinfo@
+
+%% When \bysame is used, the author's name will be replaced by a rule having
+%% the same width as the author's name that was specified by the previous
+%% \manyby.  However, we want to put a maximum limit on this size, which we 
+%% store in \maxbysamerule at .
+
+\newdimen\maxbysamerule@
+\maxbysamerule at 1in
+
+%% Each \ref has to initialize various things; we abbreviate all these by
+%% \ref@, which will also add a \bgroup, whose role we will see later.
+
+\def\ref@{\global\no at false \global\key at false \global\by at false
+ \global\bysame at false \global\paper at false \global\paperinfo at false
+ \global\jour at false \global\vol at false \global\issue at false
+ \global\yr at false \global\toappear at false \global\pages at false \global\page at false
+ \global\book at false \global\inbook at false
+ \global\bookinfo at false \global\publ at false \global\publaddr at false
+ \global\finalinfo at false
+ \bgroup\ignorespaces}
+
+%% \moreref should have a meaning only if used properly within a \ref.
+
+\Invalid@\moreref
+
+%% Each \ref will be \outer.  We start with \begingroup, just to be on the
+%% safe side, and make things easy; begin a nonindented paragraph; initialize
+%% \iffirstref@ and \iflastref@, which are special, and aren't handled by
+%% \ref@, but specially by \moreref and \endref; and then do the
+%% initializations of \ref@ --- remember that this adds \bgroup\ignorespaces.
+
+\outer\def\ref{\begingroup
+ \noindent\hangindent20\p@\hangafter\@ne\firstref at true
+ \lastref at false\def\moreref{\egroup\endref@\global\firstref at false\ref@}\ref@}
+
+%% Note that \moreref is practically the same as \endref, defined below,
+%% followed by \ref again, except that certain flags are set differently, and
+%% we don't start another group or a new noindented paragraph.
+
+%% The basic idea behind all the following constructions is the following.
+%% If we type \no 3 \anothercontrolsequence, then this must somehow set
+%% \ifno@ true and set \nobox@ to be \hbox{3}.  (The \endref will then take
+%% all these various boxes, and unbox them, in the proper order.)  To get the
+%% box set, we let \no end with \setbox\nobox@\bgroup, and let
+%% \anothercontrolsequence contribute the closing \egroup. (The important
+%% point here is that a construction like \hbox\bgroup ... \egroup is allowed
+%% [even though something like \toks0=\bgroup ... \egroup isn't]. That is
+%% because \hbox\bgroup causes tokens to be expanded, since the material
+%% actually has to be typeset, so the \egroup can be noticed when it occurs.)
+%% Of course, \no itself must therefore begin by contributing an \egroup.
+%% That is why \ref@ starts with \bgroup\ignorespaces, so that the first of
+%% the control sequences called simply creates an empty group.
+
+%% Instead of typing lots of definitions that all look almost exactly alike,
+%% we have a general construction \refdef@ which can be applied to most. The
+%% first argument of \refdef@ will be a control sequence, like \no, \key,
+%% etc., and it will have to set \no at true, \key at true and boxes \nobox@,
+%% \keybox@, etc. So we have to use plenty of \csname's to define \refdef at .
+%% The second argument of \refdef@ will be either \relax or a font change,
+%% like \it, for those cases where this new font is to be used for the
+%% element in question.
+
+\def\refdef@#1#2{\def#1{\egroup
+ \csname\expandafter\eat@\string#1 at true\endcsname
+ \expandafter\setbox
+ \csname\expandafter\eat@\string#1box@\endcsname\hbox\bgroup#2}}
+
+%% \no and \key are defined immediately by \refdef at .
+
+\refdef@\no\relax
+\refdef@\key\relax
+
+%% \by, \manyby and \bysame are all a little different.  In order to get them
+%% to work together, they each have to set certain other flags. 
+
+%% In \manyby, the \by at true isn't made \global, since it is needed only by
+%% the current \ref, but the \manyby at true is needed by the succeeding \ref's,
+%% so it must be \global.
+
+\def\manyby{\egroup\global\manyby at true\by at true\setbox\bybox@\hbox\bgroup}
+
+%% Similarly, in \by, the \bysame at false is needed by the current \ref, while
+%% the \global \manyby at false is needed by the succeeding \ref's.
+
+\def\by{\egroup\by at true\bysame at false\global\manyby at false
+ \setbox\bybox@\hbox\bgroup}
+
+%% All \bysame has to do is set \bysame at true for the current \ref.
+
+\def\bysame{\egroup\bysame at true\bgroup}
+
+%% \paper and \paperinfo are straightforward \refdef@'s.
+
+\refdef@\paper\it
+\refdef@\paperinfo\relax
+
+%% \jour is a little more complicated because it has to set \prevjour at true
+%% (this is used for \moreref, for a succeeding paper in the same journal).
+
+\def\jour{\egroup\jour at true\prevjour at true\setbox
+ \jourbox@\hbox\bgroup}
+
+%% \vol, \issue, \yr are straightforward.
+
+\refdef@\vol\bf
+\refdef@\issue\relax
+\refdef@\yr\relax
+
+%% \toappear doesn't set a box, but only sets \toappear at true.
+
+\def\toappear{\egroup\toappear at true\bgroup}
+
+%% \pages is straightforward.
+
+\refdef@\pages\relax
+
+%% \page, for just a single-page reference, uses the same box \pagesbox@, as
+%% \pages, but sets a different flag.
+
+\def\page{\egroup\page at true\setbox\pagesbox@\hbox\bgroup}
+
+%% \book is straightforward.
+
+\refdef@\book\relax
+
+%% \inbook uses the same box, \bookbox@, but has to set an extra flag.
+
+\def\inbook{\egroup\inbook at true\previnbook at true\setbox
+ \bookbox@\hbox\bgroup}
+
+%% \bookinfo, \publ, \publaddr, \finalinfo are all straightforward.
+
+\refdef@\bookinfo\relax
+\refdef@\publ\relax
+\refdef@\publaddr\relax
+\refdef@\finalinfo\relax
+
+%% The worst problems are caused by the commas that come after various bits
+%% of information, since the comma mustn't be supplied if something happens to
+%% be the last element. We elect instead to supply the commas that come
+%% BEFORE things.  To do this, instead of simply \unbox'ing the relevant
+%% \box's (and then \unskip'ing, in case extra spaces crept in), we will
+%% usually `\ppunbox@' them (prepunctuate and then \unbox and \unskip).
+
+\def\ppunbox@#1{\prepunct@\unhbox#1\unskip}
+
+%% Here \prepunct@ will be \relax when we have just typeset elements that
+%% shouldn't have commas after them, and will then be changed when we get to
+%% other elements. The construction that changes them will be called
+%% \setpunct@, which is defined below.
+
+%% There are two special problems in having \setpunct@ define \prepunct@
+%% correctly. The first involves the penalties \linebreak and \nolinebreak,
+%% which the user might want to type at certain points.  These \penalty's
+%% will of course generally be absorbed into various boxes, but since these
+%% boxes get unboxed, they will appear again in the proper places. However,
+%% if a line break is specified after an element that gets a comma after it,
+%% we'd better be sure that the comma gets put in before the penalty!  The
+%% second problem involves book titles, as previously mentioned.
+
+\def\setpunct@{\def\prepunct@{\ifnum\lastpenalty<\z@
+  %% If \linebreak, and hence a negative penalty appears,
+  \edef\penalty@{\penalty\the\lastpenalty}%
+  %% first save the penalty in \penalty@,
+  \unpenalty,%  %% then delete the penalty and add the comma.
+  \ifafterbook@''\fi  %% If we've just finished a book title, add the quotes.
+  \penalty@\relax\space  %% Finally, put back the penalty, and then a space;
+   %% \relax added after \penalty@ since \the\lastpenalty is just a number.
+  \else  %% If a negative penalty doesn't appear, we still want to check
+    %% for \nolinebreak. If it was typed, it has contributed 
+    %% \penalty10000 \hskip1sp\hskip-1sp. However, the \hskip-1sp has
+    %% been removed by the previous \unskip (in \ppunbox@ or \unbox\unskip),
+    %% so \lastskip is 1sp.
+   \ifdim\lastskip=\@ne sp\unskip\unskip
+    %% In this case, \unskip the \hskip-1sp also, and then any previous space.
+    \edef\penalty@{\penalty\the\lastpenalty}\unpenalty,\ifafterbook@''\fi
+    \penalty@\relax\space
+    %% Then proceed as before.
+    \else,\ifafterbook@''\fi\space  %% Otherwise just add the comma 
+    %% (and quotes) and a space.
+   \fi\fi\afterbook at false}} %% And reset \ifafterbook at .
+
+%% Now all \endref has to do is add the final \egroup, globally set
+%% \lastref at true again, for succeeding \ref's, call \endref@, to put things
+%% together, reset certain flags used by \moreref, end the paragraph, and
+%% then the group.
+
+\def\endref{\egroup\global\lastref at true\endref@ \global\prevjour at false
+ \global\previnbook at false\par\endgroup}
+
+%% Here is how \endref@ puts things together.
+
+\def\endref@{\let\prepunct@\relax  %% No commas added to begin with.
+ \iffirstref@  %% (I) First assume we're not doing a \moreref.
+  \ifno@\hbox to20\p@{\hss\unhbox\nobox@\unskip. }\else\hbox to10\p@{}\fi
+   %% A \no gets put into a box of width 20pt. Otherwise add 10pts of space.
+  \ifkey@\unhbox\keybox@\unskip\ \fi
+   %% Add the key, if any, followed by a space.
+  \ifmanyby@ %% (1) Suppose this is one of the papers governed by \manyby.
+   \ifby@  %% (1a) Suppose we're at the first one.
+    \hbox{\unhcopy\bybox@\unskip}%
+   %% Then we add a box with the author's name (we keep the author's name 
+   %% in a box so that the glue can't stretch or shrink, so that the 
+   %% subsequent rules will be exactly the right length),
+    \global\setbox\bysamebox@\hbox{\unhcopy\bybox@\unskip}%
+   %% and we set \bysamebox@ to this box,
+    \setpunct@  %% and we \setpunct@, since commas will subsequently be needed.
+    \else  %% This \else goes with \ifby@, giving the alternative for (1a).
+        %%  Suppose instead we're at a subsequent instance of a \bymany.
+    \ifbysame@  %% (1ai) If we still have \bysame,
+     \ifdim\wd\bysamebox@>\maxbysamerule@
+      \hbox to\maxbysamerule@{\leaders\hrule\hfill}\else
+      \hbox to \wd\bysamebox@{\leaders\hrule\hfill}\fi
+   %% we add a rule the length of \bysamebox@, unless this is too long,
+   %% in which case we use \maxbysamerule@ as the length.
+     \setpunct@ %% and we \setpunct@
+    \fi %% This \fi matches \ifbysame@, finishing (1ai).
+   \fi %% This \fi matches the \ifby@, finishing (1a).
+  \else %% This \else goes with \ifmanyby@, giving the alternative for (1).
+        %% Suppose instead this paper isn't governed by \manyby.
+   \ifby@  %% Suppose, however, that there is a \by.
+    \unhcopy\bybox@\unskip\setpunct@  %% Then just use \bybox@ and \setpunct at .
+   \fi %% This \fi matches \ifby at .
+  \fi  %% This \fi matches  \ifmanyby@, finishing (1).
+ \fi   %% This \fi [which could also be written \else\fi] 
+       %% matches \iffirstref@, and finishes (I).
+       %% [None of this is done for \moreref's.]
+ %% Having done the first stuff, involving the author, we can now get to
+ %% the paper.
+ \ifpaper@\ppunbox@\paperbox@\setpunct@\fi
+  %% If there's a \paper, put it in, with proper punctuation before it, and 
+  %% get set up for commas on next element.
+ \ifpaperinfo@\ppunbox@\paperinfobox@\setpunct@\fi
+  %% Similarly for \paperinfo.
+ %% The journal is a little more complicated.
+ \ifjour@   %% (2) Suppose there's a \jour.
+   \ppunbox@\jourbox@\setpunct@  %% Put in journal name.
+   \ifvol@\ \unhbox\volbox@\unskip\setpunct@\fi  %% Then volume, if given.
+   \ifissue@\ \unhbox\issuebox@\unskip\setpunct@\fi %% Then issue, if given.
+   \ifyr@\ (\unhbox\yrbox@\unskip)\setpunct@\fi %% Then year, if given, but
+     %% don't put comma before it.
+   \iftoappear@\ (to appear)\setpunct@\fi  %% If \toappear was given instead,
+     %% typeset `(to appear)'.
+   \ifpages@\ppunbox@\pagesbox@\setpunct@\fi  %% Then \pages, if given.
+   \ifpage@\prepunct@ p.~\unhbox\pagesbox@\unskip\setpunct@\fi
+    %% If \page given instead, type p.~ before it.
+ \else  %% This \else goes with \ifjour@, giving the alternative to (2).
+        %%  Suppose instead there's no \jour.
+  \ifprevjour@  %% (2a) But suppose there's a \prevjour@ (because
+   %% this part comes from \moreref).
+   \unskip\nojourinfo at false  %% Begin by assuming there is
+    %% additional journal information to be set (\nojourinfo at false).
+   \ifvol@\else\ifissue@\else\ifyr@\else\nojourinfo at true\fi\fi\fi
+    %% If \vol, \issue or \yr was specified in this \moreref, nothing 
+    %% changes (hence \nojourinfo at false). But if none were specified, there
+    %% is no additional journal information to be set (\nojourinfo at true).
+   \ifnojourinfo@\else,\fi
+    %% If there is additional journal information to be set, first put
+    %% in the comma.
+    %% Then put in volume, issue, etc., as before.
+   \ifvol@\ \unhbox\volbox@\unskip\setpunct@\fi
+   \ifissue@\ \unhbox\issuebox@\unskip\setpunct@\fi
+   \ifyr@\ (\unhbox\yrbox@\unskip)\setpunct@\fi
+   \iftoappear@\ (to appear)\setpunct@\fi
+   \ifpages@\ppunbox@\pagesbox@\setpunct@\fi
+   \ifpage@\prepunct@ p.~\unhbox\pagesbox@\unskip\setpunct@\fi
+  \fi  %% This \fi [which could also be written \else\fi]
+       %% matches \ifprevjour@, and finishes (2a).
+ \fi  %% This \fi mathces \ifjour@, and finishes (2).
+  %% Having finished worrying about journals, we tackle books.
+ \ifbook@\prepunct@``\unhbox\bookbox@\unskip\afterbook at true\setpunct@\fi
+  %% If there was a \book, set it with `` at the beginning, 
+  %% and preceded by punctuation and penalties as already determined; also
+  %% set \afterbook at true, so we'll know that we've just typeset a book title.
+  \ifinbook@\prepunct@\unskip\ in ``\unhbox\bookbox@\unskip\afterbook at true
+  \setpunct@\global\book at true\fi
+  %% If \inbook, (which will initially have \ifbook at false), set the book
+  %% title preceded by  in ``; also set \book at true so that subsequent 
+  %% information will be printed.  (It's \global, since it might be needed 
+  %% later for a \moreref.)
+ \ifbookinfo@\ppunbox@\bookinfobox@\setpunct@\fi
+  %% Put in any \bookinfo.
+ \ifpubl@\ppunbox@\publbox@\setpunct@\fi
+  %% Put in \publ.
+ \ifpubladdr@\ppunbox@\publaddrbox@\setpunct@\fi
+  %% Put in \publaddr.
+ \ifbook@ %% (3) Moreover, if there was a book, we also add other things.
+  \ifyr@\prepunct@\unhbox\yrbox@\unskip\setpunct@\fi
+   %% Add the \yr, if any.
+  \iftoappear@\ifafterbook@''\fi\ (to appear)\afterbook at false
+   \setpunct@\fi
+   %% If \toappear appears, and we haven't typeset anything after the
+   %% title, so that \ifafterbook@ is still true, add the '' and then 
+   %% `(to appear)'.
+  \ifpages@\prepunct@ pp.~\unhbox\pagesbox@\unskip\setpunct@\fi
+   %% If there is \pages, add pp.~and the pages.
+  \ifpage@\prepunct@ p.~\unhbox\pagesbox@\unskip\setpunct@\fi
+   %% If there is \page, add only p.~ before it.
+ \else  %% This \else goes with \ifbook@, giving the alternative to (3).
+        %% Even if there wasn't a \book, we might want to add things.
+  \ifprevinbook@  %% (3a) Suppose we have \previnbook at true.
+   \unskip  %% Then we still have to add all this information.
+   \ifyr@\prepunct@\unhbox\yrbox@\unskip\setpunct@\fi
+   \iftoappear@\ (to appear)\setpunct@\fi
+   \ifpages@\prepunct@ pp.~\unhbox\pagesbox@\unskip\setpunct@\fi
+   \ifpage@\prepunct@ p.~\unhbox\pagesbox@\unskip\setpunct@\fi
+  \fi %% This \fi matches \ifprevinbook, and finishes (3a).
+ \fi  %% This \fi matches \ifbook@ and finishes (3).
+ %% Now we add the finishing touches.
+ \iffinalinfo at .\ifafterbook@''\fi\afterbook at false
+  \spacefactor3000\relax\space\unhbox\finalinfobox@
+  %% (4) If there is \finalinfo, add a period, and quotes if still setting 
+  %% the title, and then add a space and the final info, first setting 
+  %% \spacefactor to 3000, so that the space before the final info will be 
+  %% an intersentence space. (However, if the final info has more than one
+  %% sentence, it will still be necessary to use @. instead of . at ends
+  %% of sentences for proper spacing.)
+ \else  %%  This \else goes with \iffinalinfo@, giving alternative to (4).
+  \iflastref at .\ifafterbook@''\fi\afterbook at false
+   %% (4a) If we're at the last ref (i.e., there isn't a \moreref), 
+   %% add a period, and quotes if still setting the title.
+  \else;\ifafterbook@''\fi\afterbook at false\space
+   %% but if we're not at the last ref (i.e., there's a \moreref), 
+   %% add a semicolon, and quotes if necessary, and a space.
+  \fi %% This \fi matches \iflastref@ and finishes (4a)
+ \fi} %% This \fi matches \iffinalinfo@ and finishes (4).
+
+%% The Refs are ended with an \egroup, in case some ordinary text follows them.
+
+\def\endRefs{\egroup}
+
+%% We use \iflogo@ as a flag to tell if the user has typed \nolog.
+
+\newif\iflogo@
+\def\nologo{\logo at false}
+\logo at true
+
+%% Finally, we are ready for the \output routine. It is hardly different from
+%% the \plainoutput routine, except that the first page normally has the
+%% `Typeset by AmS-TeX' logo attached.
+
+\output={\output@}
+
+\def\output@{%
+ \ifnum\pageno=\@ne\shipout\vbox{\makeheadline\vbox to\vsize
+  {\boxmaxdepth\maxdepth\pagecontents}\baselineskip2pc
+  \iflogo@\hbox to\hsize{\hfil\eightpoint Typeset by \AmSTeX}\fi
+  \makefootline}%
+ \else
+  \shipout\vbox{\makeheadline\pagebody\makefootline}%
+ \fi
+ \advancepageno
+ \ifnum\outputpenalty>-\@MM\else\dosupereject\fi}
+
+%% We begin with ten point type.
+
+\tenpoint
+
+%% Now we make @ active once again.
+
+\catcode`\@=\active
+
+%% And that's it.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%                                                                          %%
+%% HERE IS A SUMMARY OF ALL PLACES WHERE SPECIFIC VALUES USED IN THIS FILE  %%
+%%   MIGHT NEED TO BE REPLACED, BECAUSE OF DIFFERENT FONTS, STYLES, ETC.    %%
+%%                                                                          %%
+%% \parindent                                                               %%
+%% \hsize                                                                   %%
+%% \vsize                                                                   %%
+%% \normalbaselineskip, \normallineskip, \normallineskiplimit               %%
+%% \abovedisplayskip, \belowdisplayskip, \abovedisplayshortskip ,           %%
+%%   \belowdisplayshortskip (for different point sizes)                     %%
+%% \big (for different point sizes)                                         %%
+%% \strutbox, \strutbox@ (for different point sizes)                        %%
+%% \ex@ (for different point sizes)                                         %%
+%% \footmarkfrom@                                                           %%
+%% \makefootnote format                                                     %%
+%% \title, \author, \affil, \address, \date, \thanks,                       %%
+%% \keywords, \subjclass, \innerproclaim@, \innerendproclaim@, \abstract    %%
+%%   (including the \nofrills and \usualspace for these)                    %%
+%% spacing, and order, in \endtopmatter                                     %%
+%% \leftskip, \rightskip  (and then the \everydisplay) for \abstract        %%
+%% spacing, and order, in \enddocument                                      %%
+%% \heading (including the \nofrills and \usualspace)                       %%
+%% \subheading                                                              %%
+%% \demo (including the \nofrills and \usualspace)                          %%
+%% \enddemo                                                                 %%
+%% \qed                                                                     %%
+%% \cite                                                                    %%
+%% spacing and formatting of the \items in \roster                          %%
+%% \Refs (including the default heading)                                    %%
+%% order and formatting of elements in each \ref                            %%
+%% \logo (probably eliminated)                                              %%
+%% \output routine                                                          %%
+%%                                                                          %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%                                                                          %%
+%% Finally, style files meant for journals, etc., rather than for           %%
+%% preprints, probably ought to disable some of the constructions from      %%
+%% AMSTEX.TEX that allow style changes.  For example, one might             %%
+%%                                                                          %%
+%%   \def\taboo@#1{\errmessage                                              %%
+%%    {Sorry, \string#1 can't be used in this style}}                       %%
+%%   \def\default@#1{\immediate\write\sixt@@n                               %%
+%%    {\string#1\space is unnecessary; it is the default for this style.}}  %%
+%%                                                                          %%
+%% and then type things like                                                %%
+%%                                                                          %%
+%%   \taboo@\pageheight                                                     %%
+%%   \taboo@\TagsOnRight                                                    %%
+%%   \default@\TagsOnLeft                                                   %%
+%%                                                                          %%
+%% The constructions in question are                                        %%
+%%                                                                          %%
+%%   \pageheight, \pagewidth                                                %%
+%%   \hcorrection, \vcorrection                                             %%
+%%   \LimitsOnSums, \NoLimitsOnSums                                         %%
+%%   \LimitsOnInts, \NoLimitsOnInts                                         %%
+%%   \LimitsOnNames, \NoLimitsOnNames                                       %%
+%%   \ChangeBuffer, \ResetBuffer                                            %%
+%%   \TagsOnLeft, \TagsOnRight                                              %%
+%%   \CenteredTagsOnSplits, \TopOrBottomTagsOnSplits                        %%
+%%   \MultlineGap                                                           %%
+%%                                                                          %%
+%%   \TagAsMath and \TagsAsText probably should be allowed, because they    %%
+%%   don't change the style, only the input.                                %%
+%%                                                                          %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


Property changes on: trunk/Master/texmf-dist/doc/amstex/base/amsppt.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/amstex/base/amstex.txt
===================================================================
--- trunk/Master/texmf-dist/doc/amstex/base/amstex.txt	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/amstex/base/amstex.txt	2019-01-24 22:19:50 UTC (rev 49810)
@@ -0,0 +1,3468 @@
+AMSTEX.DOC (FOR AMSTEX.TEX VERSION 2.0)
+COPYRIGHT (C) 1989 BY MICHAEL SPIVAK
+
+THIS COPYRIGHTED MATERIAL MAY BE REPRODUCED, EITHER IN PRINTED FORM,
+OR AS A COMPUTER FILE, WHICH MAY THEN BE PLACED ON ANY COMPUTER OR
+COMPUTER NETWORK, PROVIDED THAT THE FIRST TWO LINES OF THIS FILE, AS
+WELL AS THIS PARAGRAPH, ARE ALSO REPRODUCED. IT MAY NOT BE SOLD,
+EXCEPT FOR A NOMINAL FEE NOT TO EXCEED $5.00 PER COPY; CHARGES FOR
+SHIPPING MAY BE ADDED, BUT ADDITIONAL CHARGES FOR PACKAGING,
+HANDLING, ETC., ARE EXPRESSLY FORBIDDEN.
+
+
+This is the documentation for AmS-TeX, specifically the file
+AMSTEX.TEX.
+
+
+**********************************************************************
+Comments of the form %1, %2, etc., accompany the %1, etc., that occur
+within the file AMSTEX.TEX in the definition of the construction in
+question.
+**********************************************************************
+
+
+**********************************************************************
+Some explanations given earlier in the file will be required at later
+points. Such material is often set off by lines of *'s, like this.
+TB refers to The TeXbook.
+**********************************************************************
+
+
+\def\fmtname ...
+----------------
+We record the format name in \fmtname, overriding the definition that
+comes from plain.  But we store the format version for plain in
+\plainfmtversion, in case someone needs to look at that, and record
+the version of AmS-TeX in \fmtversion.
+
+
+**********************************************************************
+\catcode`\@=11
+--------------
+We make @ a letter, so that we can make private control sequences,
+which we won't have to worry about users wanting to define
+themselves.  The private control sequences from plain, like \p@,
+\@ne, etc., are also used extensively.  Most of the time optional =
+signs are omitted. (Note, however, that in a test like \ifnum< >=< >
+the = is NOT optional.)
+**********************************************************************
+
+
+\ifx\amstexloaded@
+------------------
+We have to prevent AMSTEX.TEX from being read in twice; see TB,
+p. 382 (and the definition of \/). The code didn't fit on one line;
+it was imperative that the \endinput...\fi was all on one line,
+however.
+
+
+\W@, \CR@
+---------
+\W@ writes to screen and log file.
+
+\CR@, the copyright notice, is defined as a sequence of \W@'s.  We
+use \fmtversion so that the first line doesn't have to be changed.
+
+
+\CR@
+----
+Then we print the copyright notice.
+
+
+\everyjob{\CR@}
+---------------
+Then we make sure it's printed even if a format file is made.
+
+
+**********************************************************************
+\toksdef\toks@@
+---------------
+We will need a second scratch token, in addition to \toks@ (TB,
+p. 346); \toks@@ is set to \toks2, rather than \toks1, in accordance
+with rule (3) on that page.
+**********************************************************************
+
+
+\rightappend@ is \rightappend from TB, p. 378.
+
+
+\def\alloclist@
+----------------
+We modify the allocation routines from TB, Appendix B, so that
+nothing is written to the log file.  But we collect all information
+that might go there, so that it can be written later if
+\showallocations appears in the input file. \alloclist@ will be the
+list of things that previously went to the log file, in the form of
+TB, p. 378.
+
+
+\showallocations writes each thing in \alloclist@, and sets a flag
+\ifalloc@ for any later things to be written.
+
+
+\alloc@ is redefined from TB, p. 347. Near the end, it will be redefined
+once again. We \edef\next@ to be the token list that we want added to
+\alloclist@ by \rightappend@, so that \the\allocationnumber will be
+expanded out to the actual number.
+
+
+**********************************************************************
+We will be using the scratch tokens \next, \next@, \nextii@,
+\nextiii@, etc.  In order to keep the number down, many definitions
+will, for example, define \nextiv@ back in terms of \next@, \nextii@,
+etc.  There is only one problem that we have to guard against:
+Sometimes our definitions have clauses like \def\next@{ ... \next
+...}.  The definitions of \next@ won't be made until these
+definitions are invoked, and at that time \next might be \outer (!!)
+because some previous \futurelet may have \let\next be something that
+is \outer; this error will only be encountered at that time, not when
+the definitions are read by AmS-TeX, because \next isn't outer when
+AmS-TeX is making the definition!  So we could end up with a pretty
+incomprehensible error message at some point when AmS-TeX is being
+used.  Similarly, an outer \next might cause a problem if it is used
+in some \if... construction, since outer control sequences aren't
+allowed while TeX is skipping conditional text.  To guard against
+this, we will, first of all, always reserve \next for \futurelet
+constructions. That is why \next@ is used instead of \next in our
+redefinition of \alloc at .  Later we will mention the other thing we
+have to do to guard against the problem.
+**********************************************************************
+
+
+\newcount\count@@, \newcount\count@@@
+-------------------------------------
+We will need two more counters. Since \count@, \count@@, and
+\count@@@ will all be used only for local assignments, we don't
+bother with rule (3) of TB, p. 346.
+
+
+\FN@, \DN@, \DNii@, \RIfM@, \RIfMIfI@, \setboxz at h, \wdz@,
+   \boxz@, \setbox at ne, \wd at ne
+---------------------------------------------------------
+These definitions abbreviate combinations that occur sufficiently
+often to make it worthwhile using up control sequence names.
+
+
+\iterate, from plain, is redefined using the method of Kabelschacht,
+see TUGboat, Volume 8, No. 2, p. 184.
+
+
+**********************************************************************
+It is assumed that the user of this documentation already understands
+why it is often necessary to use constructions like
+
+     \if...\def\next{\csa}\else\def\next{\csb}\fi\next
+
+instead of simply \if...\csa\else\csb\fi.
+
+Kabelschacht's method also replaces this by the construction
+
+     \if...\expandafter\csa\else\expandafter\csb\fi.
+
+We will call this the ``K-method''.  The K-method will often be used
+without explicit mention; however, it is not always valid or
+practicable, as we will mention later.
+**********************************************************************
+
+
+^^J is made the \newlinechar for help messages, and also for use in
+the definition of \comment later on.
+
+
+\err@ is the standard form for AmS-TeX error messages.
+
+
+\newhelp\defaulthelp@
+---------------------
+We make a standard default help, equivalent to the usual second level
+help message you get with TeX (so that there won't be an error
+message from TeX saying that it doesn't know how to give help).
+
+
+\Err@ is the standard form for AmS-TeX error messages with default
+help.
+
+
+\eat@ is used to gobble tokens.
+
+
+\in@ tests whether string #2 contains token #1; see TB, p. 379,
+setting a flag \ifin at .
+
+
+**********************************************************************
+\def\space@
+-----------
+We frequently need a token that is \let equal a space. The % after
+`\space at . ' insures that the space isn't deleted.
+**********************************************************************
+
+
+\athelp@
+--------
+Now comes the mechanism by which @<token> will be defined, when @ is
+made active, at the end.  \athelp@ is a help message.
+
+
+{\catcode`\@=\active
+--------------------
+Now we have to define how @ will work when it will be active. This
+whole mechanism occurs within a group in which @ is active, so most
+\defs are \gdefs.
+
+
+\lccode`\Z=`\@, \lccode`\I=`\I
+------------------------------
+We want any auxiliary control sequences that are mentioned in this
+process to have the letter @ as part of their name, even though
+@ is now active, so we have to use the \lowercase trick: we set
+the \lccode of Z to be @, name such control sequences as
+\csname...Z\endcsname, and then \lowercase the whole thing.  This
+often requires \expandafter.  For example, we have to say
+
+          \expandafter\gdef\csname ...\endcsname,
+not
+          \gdef\csname...\endcsname.
+
+Finally, we also set the \lccode of I to I, since I appears in some
+error messages that we will be defining in this process, and we don't
+want this I changed to lowercase!
+
+Things are so complicated here, that we won't even contemplate using
+the K-method!
+
+%1 The very first thing we want to do is make @ mean
+   \futurelet\next\at@ (and then we will define \at@ in terms of
+   \next).  Trying to say all that with \csname seems a hopeless
+   muddle, so we first create \futureletnextat@ to stand for that.
+
+%2 \at@ will call \at@@ if the next token is a letter or number, but
+   \at@@@ if it is a control sequence (we allow @\Vert, for example)
+   and \at@@@@, which will be an error message, otherwise.
+
+%3 \at@@ <token> will be the control sequence `\<token>@at' (created
+   by \atdef@) if this control sequence has actually been created,
+   otherwise an error message with the \athelp@ help message.
+
+%4 \at@@@\cs will be the control sequence `\\cs@@at' (created by
+   \atdef@@) or an error message.
+
+%5 \at@@@@ is an error message, which also swallows up the next
+   input.
+
+%6 The last right brace in this line matches the left brace in
+   `{\catcode`\@=\active'.  The previous right brace closes the
+   `\lowercase{'.
+
+
+\atdef@<token> creates the control sequence `\<token>@at'; we don't
+test for whether this already exists, since \atdef@ isn't for the
+user.
+
+
+\atdef@@\cs creates the control sequence `\\cs@@at'. \atdef@@ can
+also be used with active characters.
+
+
+\newhelp\defahelp@, \newhelpf\defbhelp@
+---------------------------------------
+Next comes the mechanism for \define. \defahelp@ is the help message
+when the wrong syntax is used; \defbhelp@ is the help message when an
+already defined control sequence appears after the \define.
+
+
+\define gives an error message if it isn't followed by a control
+sequence, and we add the tokens \def\nextii@@ so that what follows
+gets swallowed up into the definition of \nextii at .  We are using the
+K-method here, hence \expandafter\define@@ in line %1 and
+\expandafter\def\expandafter\nextii@ in line %2.  Note that this
+method clearly becomes impractical when many tokens are present in
+one of the cases.
+
+
+\def\undefined@@@@@@@@@@, \def\preloaded@@@@@@@@@@, \def\next@@@@@@@@@@
+-----------------------------------------------------------------------
+We want \define@@#1 to detect whether #1 has already been \def'd.
+The idea is to use \csname\expandafter\eat@\string#1\endcsname to
+reproduce #1; since \csname...\endcsname is given the value \relax if
+it produces an undefined control sequence, using an \ifx test between
+\relax and this new control sequence tells us whether it already
+exists.  But that won't work for \relax, nor for the control
+sequences \undefined and \preloaded, which we want to remain
+undefined.  Moreover, we don't want the user to be able to
+\define\next, since this scratch token is often redefined by various
+macros.  So first we test for \relax, and then for \undefined,
+\preloaded, or \next. For the latter, we first define
+\undefined@@@@@@@@@@, \preloaded@@@@@@@@@@, and \next@@@@@@@@@@ as {};
+these are the only control sequences with 10 @'s (in fact, there are
+none with even 5 @'s, but we might as well be on the safe side). Then
+we use \csname to construct a new control sequence `#1@@@@@@@@@@' and
+test this with \ifx against \preloaded@@@@@@@@@@; we will get true
+only for \preloaded, \undefined, and \next.
+
+One of the nice features of all this is that a control sequence \cs
+becomes undefined, and thus available to be \define'd, simply by saying
+\let\cs\undefined.
+
+There is one additional subtle point. The final test recreates #1 with
+\csname...\endcsname, and causes \def#1 to be invoked if this is \relax.
+But when \csname...\endcsname creates a new control sequence and gives it
+the value \relax, it does this GLOBALLY; more precisely, it makes it equal
+to an internal control sequence that always has the value of \relax, see
+TeX, The Program, pp. 156 and 93. If \define is being used within a group,
+we want #1 to be undefined once this group is over, so we add
+\global\let#1\undefined before we invoke the \def#1.
+
+We don't use the K-method here, since things are already so complicated.
+
+%1 Give error message if #1 is relax.
+%2 Give error message if #1 is \undefined, \preloaded, or \next.
+%3 Do \def#1 if #1 is previously undefined, otherwise give error message.
+
+
+\redefine, \predefine, should be obvious.  Note that
+\predefine\cs{...} works, since the braces get removed by TeX.
+
+
+\undefine was added recently. It seems even better than \redefine: to
+redefine an already defined control sequence \cs, you just have to
+say \undefine\cs to first make it undefined.
+
+
+\captionwidth@ is used to store the default width for captions.
+It is made 1.5 inches less than \hsize.  If a style file resets
+\hsize, it should use \pagewidth, to automatically reset
+\captionwidth at .
+
+
+\pagewidth,...,\vcorrection
+---------------------------
+\pagewidth resets \captionwidth@ automatically. \relax added for safety.
+
+
+\tie is a synonym for ~ but is defined slightly differently, because
+spaces are automatically ignored after \tie, but not after ~ , which
+is defined a little later on.
+
+
+\graveaccent, ..., \underscore are substitute names for some control
+symbols.
+
+\B, \D are AmS-TeX substitutes for \= and \. (\. will be redefined
+later and \= will later be made undefined).
+
+
+\let\ic@\/, \def\/
+------------------
+We want \/ to ignore spaces before it.  It is this definition that
+makes it necessary to prevent AMSTEX.TEX from being read in twice.
+
+
+\textfonti, and later \textfontii, are introduced not for purposes of
+abbreviation, but because their values will sometimes be reset by
+\text.
+
+
+\t is redefined using \textfonti.  It is also made a control sequence
+with two arguments for consistency (now a space is allowed before the
+second letter).
+
+
+~ differs from in plain; spaces are allowed on either side.
+
+
+\. gives a non-end-of-sentence period by specifically setting
+\spacefactor.
+
+
+\atdef@ is used to make @; and @: and @? have desired values. (But @, and
+@! are defined later, since they differ in math mode.)  Just in case
+these are ever used at the beginning of a paragraph (unlikely, of
+course!), we put \leavevmode at the beginning.
+
+If some macro package makes ! active [for French punctuation,
+say], then \atdef@@! would have to be used instead of \atdef@!.
+
+
+\@ is defined directly as \char64 , since we will have @ active at
+the end (64 takes fewer tokens than '100).
+
+
+**********************************************************************
+\def\relaxnext@
+---------------
+The construction \let\next\relax, abbreviated \relaxnext@, is needed
+whenever we have a definition, like the ones to follow, where we have
+a \futurelet\next, or \ifx\next, or anything else involving \next,
+within a \def that is itself within a \def.  As discussed before,
+this could lead to havoc if \next happened to be \outer, so we add
+\relaxnext@ at the beginning to protect ourselves.
+**********************************************************************
+
+
+\atdef at -
+--------
+We want @-, @-- and @--- to create \hbox{-} or \hbox{--} or
+\hbox{---}, respectively, using as many \futurelet's as needed to
+find out how many -'s there are (TeX won't hyphenate around boxes).
+
+**********************************************************************
+It would be more transparent to write the succeeding definitions as:
+
+\atdef at -{\leavevmode\futurelet\next\hyphen@}
+\def\hyphen@{\relaxnext@\ifx\next-\def\next at -{\futurelet\next
+  \hyphen@@}%
+  \else\def\next@{\leavevmode\hbox{-}}\fi\next@}
+\def\hyphen@@{\ifx\next-\def\next at -{\leavevmode\hbox{---}}\else
+              \def\next@{\leavevmode\hbox{--}}\fi\next@}
+
+But this uses up two new control sequences, \hyphen@ and \hyphen@@,
+and such constructions appear frequently, so we save control sequence
+names by using a `compressed format': the same names \next@,
+\nextii@, etc., are used within different constructions, and
+redefined within each construction.  This makes things go a little
+slower, since \next@, etc., have to be redefined all the time, but
+seems worth it, especially since most such constructions are major
+formatting ones that introduce a lot of space anyway.  Notice that
+the `first' clause \futurelet\next\next@ has to be made last, after
+all the subsidiary definitions have been made.
+
+In this situation, where the symbol - is made part of the syntax for
+one of \next@'s (to swallow up this -), the K-method would not work.
+**********************************************************************
+
+
+\srdr@ ...
+----------
+The kerns to put between single right-double right quotes, etc., are
+recorded in control sequences, so that they can easily be changed for
+different fonts.
+
+These values are used in defining @", which has to look ahead to see
+if it is followed by ' or '' or ` or `` .  Also \lq or \rq might be
+used instead of ` or '.  Finally, we also have to skip over any space
+that follows @".
+
+**********************************************************************
+AmS-TeX always does this by using a \futurelet to find out if the
+next token is a space (testing with \ifx\next\space@), and calling
+either `\next at . ' or `\next at .'  The . after the \next@ makes the
+space `visible' to TeX.
+**********************************************************************
+
+Compressed format is used in \atdef@". The K-method would be
+hopelessly complicated.
+
+
+\flushpar doesn't confuse the user by having no effect if it doesn't
+happen to be used after a paragraph has ended.
+
+
+\textfontii has been mentioned previously, with \textfonti.
+
+
+\lbrace@, \rbrace@ are defined directly as delimiters, so that we can
+have \{ and \} work in math mode or outside it.
+
+
+\{, \} outside of math mode specify the actual font the character
+comes from (but as \textfontii, so it can be changed by \text), and
+we also let the \spacefactor work correctly with them.  The \@sf
+construction is taken from TB, p. 363. The \relax after \@sf is
+needed (a digit might follow \}).
+
+
+\lbrace, \rbrace are made synonyms for the new \} and \{.
+
+
+\AmSTeX is now defined using \textfontii instead of math mode.
+
+
+\vmodeerr@, \mathmodeerr@ are two error messages that we will use
+frequently, with various arguments. For example, \vmodeerr@\linebreak
+gives an error message about not using \linebreak between paragraphs.
+
+
+\linebreak gives error messages unless in horizontal mode; we add an
+\unkern in case a \kern appeared at the end of previous text (for
+example, an \enspace at the end of a \proclaim).
+
+
+\slash differs from in plain; a space before it is ignored.
+
+
+**********************************************************************
+\saveskip@ is used to record previous space, given by \lastskip,
+before we \unskip to get rid of it (and then put it back with
+\saveskip@).  We only \hskip\saveskip@ if \saveskip@ is non-zero,
+because a zero skip does change things---it allows breaks.  Notice
+that \saveskip@\lastskip is an abbreviation for \saveskip@=\lastskip.
+Abbreviations of this sort are always used, and should be borne in
+mind.
+**********************************************************************
+
+
+\allowlinebreak uses \saveskip at .
+
+
+\refskip@ plays no role now; but after \Refs, in AMSPPT.STY, there
+will be reasons to have \refskip@ in \nolinebreak.
+
+
+\nolinebreak also uses \saveskip at .
+
+
+\newline allows \newline\par not to give an Underfull \hbox message,
+but it probably wasn't worth it to do this, since you can still
+manage to get the message if you do something weird enough, like
+\newline\newline\par.  The \null keeps the \hfill from disappearing
+at the break. Compressed format is used. Within the definition of
+\next@, the K-method is used (for a conditional within a
+conditional).  Although this works, the K-method doesn't work in
+general in the multi-case situation.
+
+
+\dmatherr@, ..., \nonmatherr@ are error messages that are used
+frequently.
+
+
+\mathbreak, ..., \allowmathbreak are for breaks in math mode, which
+have been arranged to require different commands than for breaks
+outside it.  The main reason for this arrangement was that LaTeX-like
+features, like [...]  to indicate desirability of a break, might
+later be implemented for breaks outside of math. But AmS-TeX
+definitely shies away from such use of brackets in math mode, since
+brackets are so frequently used as text in math mode, so one
+would want different commands (and different additional syntax to
+indicate desirability) for math breaks.
+
+
+\pagebreak means \removelastskip\break between paragraphs,
+\vadjust{\break} within paragraphs (to break after current line), and
+\postdisplaypenalty-10000 in display math (see TB, p. 189).  The
+\removelastskip is needed in case there is already a \vskip, say from
+an \endproclaim.
+
+
+\nopagebreak is similar.
+
+
+\vnonvmodeerr@ is another useful error message.
+
+
+\vnonvmode@#1#2 does #1 if in vertical mode, otherwise #2, except
+that we are considered to be in vertical mode if a \par comes next.
+This is because users will naturally consider certain constructions
+to be `between' paragraphs if they stick them at the end of the
+paragraph, just as they count as between paragraphs if they go at the
+beginning.  Compressed format is used in the definition.
+
+
+\newpage, ..., \bigpagebreak all use \vnonvmode at .
+
+
+\NoBlackBoxes, \BlackBoxes use capitals, to tell user they are global.
+
+
+
+**********************************************************************
+\Invalid@, \Invalid@@
+---------------------
+Many control sequences in AmS-TeX, like \caption and \captionwidth,
+don't have real meanings themselves, but are only indicators for
+other control sequences to take appropriate action.  \Invalid@ is
+used to make their meaning an error message when they are encountered
+at unexpected times.  This is more than a mere convenience for the
+user, however. If \caption, for example, were actually undefined,
+the \ifx test involving \caption could fail for unexpected reasons,
+including the misspelling of \caption in the input file.
+
+Although things like \Invalid@\caption take up little room in the
+input file, they would expand to a lot if the error message was
+always spelled out, so we abbreviate most of the error message with
+\Invalid@@.
+**********************************************************************
+
+
+\smallcaptionwidth@ is the caption width that will actually be used.
+(It may be smaller than \captionwidth@ if the caption is not that wide.)
+
+
+\topspace and \midspace are defined together, like \topinsert and
+\midinsert of plain, using a flag \ifmid at .  The definition is made in
+terms of \ins@, which is similar to plain's \@ins.
+
+
+\captionfont@ is the font used for captions; it is inserted here so
+that style files that want a different font for captions can simply
+redefine \captionfont@, instead of redefining \ins@, which follows.
+
+
+\ins@ saves its argument as \thespace@, and looks ahead (skipping
+spaces) for \caption, with its argument saved as \thecaption@, and
+then for \captionwidth, with its argument saved as
+\smallcaptionwidth@ (initially set to \captionwidth@).  An additional
+complication occurs because we have to skip over spaces after the }
+at the end of \caption{...} or \captionwidth{...}.  The caption is
+set in a box, and centered within \smallcaptionwidth@ if smaller than
+this amount, otherwise reset into a paragraph of this \hsize.  The
+\allowbreak is specifically introduced because we have no reason not
+to allow a break before the insert, and this \allowbreak may help TeX
+to find the best placement.  [Cf. TB, p. 116: ``There is a slight
+.... processing text ahead of the current page. You may want to say
+`\goodbreak' just before \midinsert.''  The point is that \allowbreak
+in the definition is much better, because it causes TeX to see if a
+page break is feasible, so a break will definitely be taken if it has
+already processed too much for the current page.] Compressed format is
+used.
+
+
+\def\newcodes@ ...
+------------------
+Next comes the mechanism for \comment ... \endcomment.  There are
+probably some unnecessary things here, left over from the old TeX,
+since we now use \futurelet, rather than a macro argument, to see
+what's coming, but it works, so why fool with it.
+
+
+Now we start on math constructions.
+
+
+\def\pr at m@s ...
+---------------
+\pr at m@s is changed from plain (TB, p. 357), because we don't want the
+'^ mechanism to work (since you can't get ^' to work similarly).  We
+also surround the prime character with empty boxes to make sure there
+is no extra kerning around it---this character does kern with
+characters on the symbol font, because it is the \skewchar for its
+font and the kern contains information for the math accents (TB, pp.
+351 and 443). The whole construction is put inside another group, so
+that ^\prime will still work.
+
+
+\let\dsize ...
+--------------
+Now we set up AmS-TeX alternate names, and also allow \, and \! and
+\; to be used both in math mode and in text.  There is an important
+reason for doing this, besides mere convenience: \, or \; might be
+used within a \format...\\ line for a \matrix (see below) to specify
+spacing.  Although the user would naturally think that this spacing
+is in math mode, it actually isn't!  We also make plain's \thinspace
+and \negthinspace the same as \, and \! respectively, for maximum
+consistency.  Since plain's \> is almost never used we make it
+undefined (at the end), and provide \medspace instead.  So we also
+add \negmedspace and \thickspace and \negthickspace.
+
+
+@, and @! will be 1/10 of \, and \! in math mode.
+
+
+ at . is special in math mode, because it leaves a blank space where a
+horizontal arrow should go in commutative diagrams (see \CD below).
+
+
+\and, \implies, \impliedby are similar to plain's \iff; the \DOTSB
+are added so that \dots will know they are binary operators (see
+\dots, later).
+
+
+\frac, ..., \tfrac should be obvious.
+
+
+\ex@ is a dimension that is essentially 1 point, but that will change
+properly with changes of fonts. For cmr10, .2326ex is 1pt.
+
+
+\thickness is one of the syntax pieces \thickfrac looks for.
+
+
+\thickfrac, if followed by \thickness{<number>}, should make a
+fraction made with \above <number>\ex at .  Otherwise, we want to use
+\above 1\ex@ (i.e., 1 point) for the thickness.
+
+
+\fracwithdelims, \thickfracwithdelims are strictly analogous.
+
+
+\binom, ..., \tbinom should be obvious.
+
+
+\: is for constructions like f:A --> B. Spacing was specified by AMS.
+The symbol before the \: could be a \mathbin or \mathrel (e.g.,
++\:R\times R\to R or <\:R\times R\to\{T,F\}), or even a \mathop
+(e.g., \sum\:2^R\to R).  In all cases, it should be replaced by a
+\mathord, so far as the spacing in this formula is concerned.  There
+is naturally no way that we can get back to the symbol preceding \:
+so we first put in a \mathpunct{}.  The spacing between a \mathop or
+\mathrel and a \mathpunct is 0, and when a \mathbin precedes a
+\mathpunct, it is changed to a \mathord, so the spacing is again 0.
+Then, since the spacing between the \mathpunct{} and the \mathord {:}
+that we want to add is \nonscript\mskip\thinmuskip, we want to
+subtract this space before the {:}.
+
+
+\snug deletes the \mathsurround space, so that $n$\snug- won't have
+space between the n and the - even if \mathsurround is non-zero.
+
+
+\topsmash and \botsmash are needed in addition to just \smash from
+plain.  We use a procedure similar to that used in plain for
+\phantom, which has the variants \hphantom and \vphantom (TB, p.
+360); we use much of the plain mechanism for \smash (TB, p. 360),
+using flags \iftop@, \ifbot@, mainly changing \finsm at sh.  We also
+add \leavevmode before the \box\z@, in case this comes at the
+beginning of a paragraph.
+
+
+\def\LimitsOnSums ...
+---------------------
+Now we come to the modifications for the big operators like \sum.  In
+each case we introduce a subsidiary name for the operator, and then
+the definition has this name followed by \slimits@, which will be
+equivalent to either \displaylimits or \nolimits, depending on the
+style. We also introduce \LimitsOnSums and \NoLimitsOnSums to allow
+the user to set the value of \slimits at . The default is \LimitsOnSums.
+The \DOTSB are added for the sake of \dots, as explained later.
+
+
+\def\LimitsOnInts ...
+---------------------
+\int and \oint are treated similarly, using \ilimits@, except that
+\intop and \ointop are already available from plain, to have
+\ilimits@ after them.  We introduce \LimitsOnInts and \NoLimitsOnInts
+to allow the user to set the value of \ilimits at .  The default is
+\NoLimitsOnInts.  We also use \DOTSI, which is explained later.
+
+
+\def\intic@ ...
+---------------
+Next come multiple integrals. The main problem here is the proper
+positioning of a limit when limits are set above and below. For
+example, with \iint (double integral sign), the lower limit should be
+centered between the bottoms of the two integral signs, not centered
+in the whole region they make up. In such cases we basically need
+
+     \hskip-.5em\mathop{\hskip.5em\intop\intop}\limits
+
+---the \hskip.5em on the left of the two integral signs places the
+center of this symbol in the right place, and the \hskip-.5em
+corrects for it.  (For a different font than cmex10, .5em might have
+to be changed.)
+
+A different correction is needed when we are not in \displaystyle, so
+\intic@, the proper correction, is defined as a \mathchoice.  The
+negative amounts are stored in \negintic@, another \mathchoice, since
+it seems nearly impossible to get out the negatives of dimensions
+stored in a \mathchoice.
+
+We also need to move the integral signs closer together, by an amount
+stored in \intkern@, also a \mathchoice.
+
+Finally, the dots to be used in \idotsint (two integral signs
+separated by dots) are defined in \intdots@, again a \mathchoice.
+This uses \plaincdots@, defined later, which is basically \cdots as
+in plain (\cdots itself will be redefined later also).
+
+
+\newcount\intno@ ...
+--------------------
+To define all multiple integrals together, we store the number of
+integral signs in \intno@ (with \intno@ arbitrarily set to 0 for
+\idotsint), and then use \ints@ after a \futurelet construction,
+which is needed to see if \limits or \nolimits happened to have been
+typed after the control sequence.
+
+
+\def\ints@
+----------
+\ints@ first calls \findlimits@, which uses \iflimits@ to record
+whether or not limits should be used.  Limits are used if the next
+token is \limits, or if \ilimits@ is set to \displaylimits and we are
+in displaystyle and the next token is not \nolimits.  We also use
+\iflimtoken@ to record whether or not the next token was either
+\limits or \nolimits---we need this information, since we will have
+to \eat@ the \limits or \nolimits token if it occurs.
+
+
+\multint@ and \multintlimits@ produce the basic symbol---the proper
+number of integral signs, dots and spacing---based on \intno at .
+
+%1 If we are making \intdotsint, put in the dots.
+%2 Otherwise, put in kern before next integral sign.
+%3 If \intno@ >= 3, add second kern and int.
+%4 If \intno@ =4, add third kern and int.
+%5 Then add final int sign.
+
+\multintlimits@ uses \intop, because the result will be put inside a
+\mathop later.
+
+
+\ints@@, finally, uses \multint@ or a construction involving
+\multinlimits@ for the final result, which also depends on the value
+of \iflimtoken at .
+
+%1 If there was a \limits or \nolimits afterwards:
+%2 when we are using limits, use a special construction,
+%3 but when we're not, use the simple construction;
+%4 and then discard the \limits or \nolimits token.
+%5 Otherwise, do the same thing, but don't discard the next token.
+
+
+\def\LimitsOnNames ...
+----------------------
+We also have \nlimits@ to tell whether limits should be used on
+operator names, like \max and \min. We introduce \LimitsOnNames and
+\NoLimitsOnNames. The default is \LimitsOnNames.
+
+
+\def\nolimits@
+--------------
+Certain operator names, like \sin, should NEVER have limits, even if
+\limits has been typed afterwards, so instead of \nolimits we use
+\nolimits@, which replaces a \limits token that follows with
+\nolimits. Compressed format is used in that definition.
+
+
+\def\newmcodes@
+---------------
+When we make a new operator, with \operatorname or
+\operatornamewithlimits, we want ' and * and - and / to be treated as
+ordinary text, not as math symbols.  The same is true for . and :
+except that we would like a little space after them, so we have
+\newmcodes@ to temporarily change the \mathcode's of these symbols.
+
+
+\operatorname and \operatornamewithlimits both make \mathop's, using
+the new \mathocode's from \newmcodes at .  \operatorname has \nolimits@
+at the end, to defeat any \limits typed after it, while
+\operatornamewithlimits simply has \nlimits@, which will be set
+either to \displaylimits or \nolimits@, depending on the style. The
+\kern 0pt is added because the argument might be just one symbol, and
+TeX's rules (TB, p. 443) imply that this symbol would be centered
+vertically around the axis.
+
+In all cases we use \fam\z@ instead of plain's \rm, since we will
+later change the meaning of \rm.
+
+
+\qopname@ and \qopnamewl@ are quick constructions, used to redefine
+\sin, \cos, etc., to have either \nlimits@ or \nolimits@ after them.
+
+
+\def\arccos, ..., \def\tanh redefine things using \qopname@ and
+\qopnamewl at .
+
+\inflim and \projlim are new; they are not in plain.
+
+
+\varinjlim, ..., \varlimsup are more complicated.  Adjustments for
+\varinjlim, \varprojlim and \varliminf were made by eye. We don't
+bother about making these change size in subscripts, since they
+should never be used that way---the symbols would be too cramped to
+see. Notice that the \rm before the lim is NOT being used in math mode,
+so it is OK.
+
+
+\newdimen\buffer@ ...
+---------------------
+\ChangeBuffer allows the user to change \fontdimen13 \tenex. Since
+changes to \fontdimen's are global, the only way to allow the user to
+restore the original value, with \ResetBuffer, is to keep it in an
+inaccessible place, \buffer at . We also want \buffer as a place to
+store the current value of \fontdimen13 \tenex, since it is used in
+\shave and its relatives; the user is also supposed to be able to
+access \buffer, so it has no @.
+
+
+\def\shave ...
+--------------
+To shave the buffer space off the top and bottom of a symbol like
+\sum_{i=1}^n, we reset it with \fontdimen13 \tenex = 0pt, make a
+\mathop of this new symbol, and then reset \fontdimen13 to current
+value, stored in \buffer.  To shave off the top buffer space only, we
+\topsmash the symbol, which leaves the bottom buffer space alone, add
+\vphantom{\shave{#1}} to get the right height, and make a \mathop of
+the whole thing.
+
+%1 We need \m at th from plain to shut off any \mathsurround. \m at th is
+   used similarly in many places, without further comment.
+
+\Invalid@\\
+-----------
+The \Sp...\endSp and \Sb...\endSb constructions, for multiline
+limits, is the first of many constructions based on \halign where we
+want to use \\ for line breaks, instead of the usual TeX primitive
+\cr.
+
+**********************************************************************
+\def\Let@
+---------
+This involves a TeXnical trick.  In such constructions, we want to
+say \let\\=\cr. [Note that we want a \let here, and not simply
+\def\\{\cr}, because there is a big difference between a control
+sequence defined to be \cr, and \cr itself or something \let=\cr: a
+\cr (or & or \span) is immediately intercepted by TeX's scanner even
+when it is not expanding macros (TB, p. 248), while something defined
+as \cr will not indicate the end of a row until macros are expanded
+out.  We will mention later one of the problems this can cause.]
+
+But if we happen to use \let\\=\cr within another such construction,
+as we certainly will want to do, then \\ will already be equivalent
+to \cr, and because of the way TeX parses things in an \halign, this
+\\ will immediately be used to stop the scanning of the element,
+leaving \let all by itself somewhere, and horrible error messages.
+As explained in TB, p. 386, the construction
+
+   \iffalse{\fi\let\\=\cr\iffalse}\fi
+
+circumvents this difficulty, because the { } hide the \let\\=\cr from
+the \halign, yet doesn't actually put it inside a group. Of course we
+need \relax first, in case this occurs at the beginning of an \halign
+(TB, p. 240).  Since this is used so often, we have a special
+abbreviation for it.
+**********************************************************************
+
+
+\Invalid@\vspace, \def\vspace@
+------------------------------
+We want \vspace to be used only within certain constructions (all
+based on \halign).  So we make it invalid in general, and let these
+constructions give the proper definition of \vspace.  Since this
+happens so often, we abbreviate the definition of \vspace. We add
+\crcr before the \noalign in case the user forgets the \\.
+
+
+\def\multilimits@, ..., \def\endSp
+----------------------------------
+\Sb...\endSb and \Sp...\endSp will translate to ^{...} and _{...} for
+the very same construction {...}, which we call \multilimits at .
+
+This \multilimits@ construction is similar to many other
+constructions, like those for \matrix, \align, etc. We begin with
+\bgroup, which is almost like {, except that the matching \egroup,
+which is almost like }, needn't be in the same definition, but can
+actually be contributed by the \endSb or \endSp; then we define
+\vspace for use within this construction, and then we properly make
+\\ the same as \cr.
+
+Then comes something special.  We want to get the same result from
+\Sb i\\ j\endSb as we would get with _{\scriptstyle i\atop
+\scriptstyle j}.  The rules for making an \atop are somewhat
+complicated.  They are stated in TB, p. 444, rule 15.  For \atop, we
+have the parameters u=\fontdimen10 of the relevant math italic font,
+\scriptfont2; v=\fontdimen12 \scriptfont2; and phi=3\fontdimen8 of
+the corresponding symbol font, \scriptfont3. \atop is normally set
+with the numerator moved up by u and the denominator moved down by v,
+i.e., with \baselineskip=u+v.  But if this makes them less than phi
+apart, they are set phi apart.  This will be obtained by making
+\lineskiplimit and \lineskip equal to phi.
+
+
+\def\spreadlines
+----------------
+\Sp and \Sb are special sorts of alignments, but now we start the
+main ones.  First of all, we want \spreadlines to be like \openup,
+except for consistency we want it to work as a macro taking an
+argument, rather than using the TeX assignment syntax.  Also we want
+it to be used only in display mathematics; this means, in particular,
+that its effect will always be local to the display in which it
+appears.
+
+
+\def\Mathstrut at ...
+------------------
+\Mathstrut@ is like \mathstrut, but only for \textstyle, the style we
+will be using it for in all our alignments.  Whenever you trace
+through macros that involve \mathstrut, you get screens full of
+uninteresting stuff; it got so depressing that I decided to make
+\Mathstrut@ instead. We first make \Mathstrutbox@ an empty box, but
+with height and depth set to that of a ( in math mode.
+
+
+\newdimen\spreadmlines@ ...
+---------------------------
+In plain TeX, \matrix uses \normalbaselines to overrule any \openup's
+that have been used.  We want to have a more general way of adjusting
+the spacing in a \matrix also.  So we use \spreadmlines@ to store the
+desired amount to \openup in a \matrix.  Like \spreadlines,
+\spreadmatrixlines should be used only in displayed mathematics; thus
+it will be local to the display in which it appears.
+
+
+\matrix is very much like \multilimits@, used before.  However, now
+there are two \bgroups, corresponding to the {'s for \vcenter{ and
+\halign{; and \endmatrix contributes two \egroups. The combination
+\normalbaselines\openup\spreadmlines@ means that the \baselineskip is
+the normal one, unless \spreadmlines has been used (within the
+display the \matrix appears in) to change things. The effect of
+\Mathstrut@\crcr\noalign{\kern-\baselineskip} in \matrix is to insure
+that the first row is as tall as \Mathstrut@, and the one in
+\endmatrix makes the last row as deep. The purpose of this is to make
+sure that the height or depth of a matrix won't depend, for example,
+on whether the first row has tall letters, like A, or only short
+ones, like x --- so two similar matrices will usually line up right
+in formulas like <matrix1> = <matrix2>.
+
+There are two other new features. First, we put \, around the
+\vcenter; this looks better, especially with delimiters.  The second
+feature is the \null before the first \,  This is because of the rule
+regarding numbered formulas on TB, p. 189---if a very wide \matrix is
+used in a formula with a \tag, we don't want TeX to assume that we
+put glue before the \matrix in order to control its positioning with
+respect to that tag!
+
+
+\format...\\ is the construction that is used to allow a different
+preamble to be used in the \matrix.  In all other AmS-TeX
+constructions, where such optional syntax is used, we use a
+\futurelet to see if this syntax is present.  But it would be fatal
+to
+
+    \def\matrix{\futurelet\next\matrix@}
+
+because the \matrix might be used within another \matrix, and a \let
+within an \halign can cause havoc. This is hinted at in the
+next-to-last paragraph of TB, p. 248, although the viewpoint is
+different.  The real problem arises when you have a \matrix
+containing another \matrix that happens to begin with & (because the
+first entry is blank).  Just what does happen is complicated and
+interesting, but there's no point going into it here, since we are
+not going to be using a \futurelet. What we do instead is simply let
+\format end the \matrix (giving an empty matrix), and then start a
+new \matrix, with the appropriate preamble.
+
+**********************************************************************
+However, at this point we have to pull another TeXnical trick,
+somewhat like the one for \Let@, but different (see TB, p. 385). The
+construction
+
+     \iffalse{\fi\ifnum`}=0 \fi
+
+has balanced braces, so can appear within a \def. The same is true of
+
+      \ifnum`{=0 \fi\iffalse}\fi.
+
+As far as \halign is concerned, however, the first begins a group and
+the second ends one, so \format ... \\ looks to \halign like
+
+      \crcr\egroup [begin a new group] \format@ ...\\
+
+and thus as
+
+      \crcr\egroup [begin a new group]
+           make definitions [end the group] ...
+
+This is important, since otherwise the \\ will be interpreted as \cr
+if the \matrix is inside another \matrix, leading to havoc.
+**********************************************************************
+
+
+\newtoks\hashtoks@, ..., \def\format@
+-------------------------------------
+Having circumvented this difficulty, the idea is that \l&\r\\, for
+example, should be interpreted as $#$\hfil&\hfil$#$. Since #'s can
+usually appear only in special constructions, we want them to pop up
+as tokens, so we make a new token \hashtoks@ whose value is #.  Then,
+if we define \preamble@ to be \l&\r, and define \l as
+{$\the\hashtoks@$\hfil}, etc., we can \edef\Preamble@{\preamble@} and
+\Preamble@ will have the desired result.
+
+Once the desired preamble is stored in \Preamble@, we still have to
+say \span\Preamble@ to have it be expanded (TB, p. 238, last two
+paragraphs).  Notice that the \span\Preamble@ construction works when
+it is being used within a \def, even though we have single #'s
+instead of ##'s (normally an \halign within a \def needs ##'s instead
+of #'s).  By the way, \show\hashtoks@ will actually give the result
+`##', but this is due to TeX's convention for printing token lists,
+see TB, p. 205, Exercise 20.7.
+
+
+\smallmatrix is a lot simpler, since we don't allow \spreadmlines,
+but essentially use \baselineskip=9pt (suitably adjusted using \ex@),
+don't worry about correcting the height of the first line or the
+depth of the last (since \smallmatrix'es aren't meant to be used
+together in formulas), and don't allow \format.
+
+
+\pmatrix, etc., are trivial.
+
+
+\hdots, for use within a \matrix, is plain's \ldots (which we change
+later).
+
+
+\newmuskip\dotsspace@
+---------------------
+The spacing in the \spacehdots...\for... macro will be a new mu-unit
+\dotsspace@, which we set to 1.5mu.
+
+
+\def\strip@, ..., \def\hdotsfor
+-------------------------------
+\spacehdots#1\for#2 macro should normally be used as
+
+     \spacehdots<number1>\for<number2>
+
+but it's quite conceivable that someone will type
+
+     \spacehdots{<number>}\for...
+
+even though the braces are unnecessary; in such a case TeX will
+actually consider the first argument to be {<number>}.  So we don't
+want to specify the spacing simply as \mkern#1\dotsspace@, since this
+will be a syntactical error if #1 has braces around it.  The macro
+\strip@ solves this problem.  When argument #1 of \spacehdots is
+passed to \strip@, the braces are removed, but the space that
+delimits the argument is explicitly added.  So if #1 is `3' or `{3}'
+or `{3 }' then we end up with `\strip at 3 ' or possibly
+`\strip at 3|_||_|' so we finally get `3\dotsspace@' or `3 \dotsspace@'.
+
+
+\multispan@ is just like \multispan from plain (TB, p. 243), except
+that we have an \unskip so that & \spaceinnerhdots ...  will ignore
+the space after the &.
+
+
+\spaceinnerhdots needs the \strip@ trick for #2 also, since braces in
+\mscount={<number>} would be an error.
+
+
+\cases is easy since it is just made up of a \matrix, with a particular
+\format; we also want to \spreadmlines@\jot, and we put this inside a
+group, so that it will effect only the \cases, not another \matrix in the
+display.
+
+
+\newif\ifinany@
+---------------
+The line spacing in \aligned, \alignedat, \gathered, and \split is
+different from that in \matrix, because we want to \openup\jot. The
+problem, however, is that any of these might occur within one of the
+constructions \align, \alignat, \xalignat, \xxalignat, \gather,
+\multline, which already \openup\jot.  So we need a flag, \ifinany@, to
+tell whether the construction is in any of these.
+
+
+\newif\ifinalign@
+-----------------
+For the purpose of deciding whether to \openup\jot, we also need a
+flag, \ifinalign@, to tell \split whether or not it is in an \align.
+
+
+\newif\ifingather@
+------------------
+Finally, because we allow a very special construction where \align
+appears in \gather (but within curly braces), we also need a flag,
+\ifingather@, to tell \align whether or not it is in a \gather.
+
+
+\strut@ is used as a quicker alternative for \strut, just as
+\Mathstrut@ was introduced as a shorter alternative to \mathstrut.
+We use \copy\strutbox@ rather than \unhcopy\strutbox@, because we
+will be using \strut@ in situations where we don't have to worry
+about entering horizontal mode.  The dimensions of \strutbox@
+are determined by taking the baselineskip (we assume 12pt)
+and subtracting the lineskiplimit (1pt, set in AMSPPT.STY).
+
+
+\topaligned, \botaligned, and \aligned are practically the same, the
+first being a \vtop, the second a \vbox, and the third a \vcenter.
+
+
+\aligned@ is similar to \matrix, except we \openup\jot if we are not
+in a construction that sets \inany at true.  Note that we put \strut@ in
+every line, since this is actually easier than putting it in only the
+first and last lines, and won't make any difference because of the
+\openup\jot.  The main purpose of the \strut@'s in all the following
+constructions is so that when some of them are placed vertically
+above others (as they will be by certain other constructions) the
+spacing will still be correct.  (Actually, the spacing won't always
+be exactly correct, if some lines contain extra tall or deep
+characters, but the discrepancies will be small, and in these cases
+one often has to add some extra spacing by hand anyway.)
+
+
+\alignedat is similar to \aligned, except that the preamble depends
+on the argument; we use \doat@ to produce this preamble, as
+\preamble@@, which we then reproduce, using \span\preamble@@.
+
+
+\newcount\atcount@, \def\doat@
+------------------------------
+\doat@, with argument n, first makes the token list \toks@ be
+
+   \hfil\strut@$\displaystyle{\the\hashtoks@}$&
+     $\displaystyle{{}\the\hashtoks@}$\hfil
+
+and then adds another n-1 copies of
+
+   &\hfil$\displaystyle{\the\hashtoks@}$&
+     $\displaystyle{{}\the\hashtoks@}$\hfil
+
+(the \strut@ isn't needed for these copies, only for the first one),
+using the method of TB, p. 373. This involves a \loop, and we use
+the counter \atcount@ to keep track of the number of iterations.  If
+we then \xdef\preamble@{\the\toks@}, the resulting \preamble@ isn't
+yet the desired result, since we have \the\hashtoks@ appearing
+everywhere that # should appear, so we \xdef\preamble@@{\preamble@}
+to get the right result in \preamble@@.
+
+%1 Initialize \toks at .
+%2 Set \atcount@ to 1 less than #1.
+%3 Add \atcount@ copies of the other tokens.
+
+
+\gathered is much easier.
+
+
+This completes the aligned constructions that are treated as
+individual symbols, but leaves things like \align, in which each
+formula can have a \tag.  So first we have to deal with \tag itself.
+
+
+\newif\iftagsleft@ ...
+----------------------
+Basically, \tag is supposed to mean \leqno or \eqno, depending on
+whether the flag \iftagsleft@ has been set.  \TagsOnLeft sets
+\tagsleft at true, \TagsOnRight sets \tagsleft at false. The default is
+\TagsOnLeft.  It seems reasonable to make these global, so their
+names have capitals in them.
+
+
+\newif\ifmathtags@ ...
+----------------------
+\tag has another slight problem, because \eqno and \leqno treat their
+arguments as math formulas, which isn't convenient when - is used as
+a hyphen; normally, it is better to have the argument treated as
+text.  We will allow the argument to be treated both ways, depending
+on the flag \ifmathtags at .  \TagsAsMath sets \mathtags at true, while
+\TagsAsText sets \mathtags at false, with the default being
+\TagsAsText.  Again it seems reasonable to make these global, so
+their names have capitals in them.
+
+
+\tagform@ describes the formatting of tags desired by the style (more
+precisely the formatting desired when tags are treated as text). The
+default is to put tags in parentheses.
+
+[NOTE: TeX puts an \eqno or \leqno on a separate line unless the space
+between the tag and the formula is at least as wide as the tag
+itself, i.e., the formula plus a box twice the width of the tag
+should fit on the line.  By diddling with \tagform@, this rule could
+be changed.  For example, if the rule is that the space between the
+tag and the formula should be at least 1em (seems to be used by
+Cambridge University Press) we could
+
+  \def\tagform@#1{\setbox0\hbox{\rm(\ignorespaces#1\unskip)}%
+    \dimen0=\wd0 \advance\dimen0 1em \divide\dimen0 by 2
+    \wd0=\dimen0 \box0 }
+
+Then twice the width of \tagform@{#1} would be the `real' width of
+the tag plus 1em.]
+
+
+\thetag allows a fastidious user who wants to refer to `equation (3)',
+without being sure whether the style will use this particular format,
+to do so by typing `equation \thetag3'; the definition of \thetag has
+\leavevmode at the beginning, since \tagform@ is often an \hbox, and
+might begin a paragraph.
+
+
+\def\tag, \def\maketag@, ...
+----------------------------
+Finally, given a displayed formula $$ .... \tag ...$$, \tag has to be
+replaced by \leqno or \eqno, and ... has to be replaced by the proper
+formatting for this expression.  The argument ... is everything from
+\tag to $$.
+
+\maketag@#1\maketag@ is basically just \tagform@{#1} (if tags are
+treated as text), but we also provide a mechanism for overriding the
+default formatting, by typing \tag "..." to get ... as the tag,
+exactly as typed.  (This fits in with the scheme used in AMSPPT.STY
+for `literal' arguments to \footnote and \item in \roster's.)
+Compressed format isn't used since \tag's are used so often.
+
+%1 Let \tag be \leqno or \eqno.
+%2 Replace #1 by \maketag@#1\maketag at .
+%3 Finish off the displayed formula.
+
+%1 Here #2 is a possible space after the second " symbol; this
+   possible space is the reason for using the syntax where the
+   argument is delimited by a second \maketag at .
+
+
+\interdisplaylinepenalty from plain is used as a counter to store
+penalties for page breaks in alignments, but is initially set to
+10000, thus completely inhibiting such breaks.
+
+
+\allowdisplaybreaks should be used only within a displayed formula to
+set \interdisplaylinepenalty to 0 (perhaps a value like plain's 100
+would be better).
+
+
+\Invalid@\allowdisplaybreak, ..., \def\displaybreak@
+----------------------------------------------------
+We also want to use \allowdisplaybreak and \displaybreak to allow or
+force a break after a particular line of an alignment, but we want
+these control symbols to make sense only within these alignments, so
+we handle them like \vspace, etc.
+
+
+\Invalid@\intertext, \def\intertext@
+------------------------------------
+We want \intertext to produce \noalign'ed text, and again want this
+to make sense only with these alignments. The problem here is that
+when more than one line of text is produced, the height of the \vbox
+will be so large that only \lineskip glue would be used, not the
+proper amount to make the baseline of the first line of the \vbox the
+proper distance from the previous line.  So instead of
+\vbox{\noindent##1} we use
+
+     \vbox{\null\noindent##1}
+
+Within this \vbox, the glue between the \null and the \noindent'ed
+paragraph will be just enough to make the space between the \null and
+the top line of the \vbox be \baselineskip.  So we just have to put
+the \vbox on the list preceded by \nointerlineskip, to suppress any
+extra space.
+
+
+\centering@ is like plain's \centering, except that no shrinking of
+glue will be allowed, because we will regard such cases as overfull
+boxes that will either give error messages or be treated specially.
+
+
+\def\align
+----------
+$$\align...  will essentially be an
+
+     $$\halign to\displaywidth{...
+
+unlike $$\aligned... which is essentially
+
+     $$\vcenter{\halign{ ... .
+
+Since the construction \halign to\displaywidth...  without $$ at the
+beginning is actually allowed in TeX, but is quite different, we want
+to guard against errors by having \align give an error message if it
+is not being used within a displayed formula.  However, we do allow
+the special construction {\align...\endalign} within a \gather.  So
+we have \align give one construction in a \gather, but \align@ in
+display math mode, and an error message otherwise.
+
+**********************************************************************
+There is a special problem with \align, which has \endalign as part
+of its syntax, and so will all similar constructions.  Basically,
+\align@ is supposed to call one control sequence, originally called
+\lalign@, if tags are on the left, another control sequence,
+originally called \ralign@, if tags are on the right, and yet a third
+control sequence, originally called \galign@, when it is in a
+\gather.  Moreover, orginally these choices were made by setting
+\let\next@\lalign@, etc., and calling \next at .  But if the user typed
+$$\align ... $$ without the \endalign, then at the end of the
+paragraph there would be an error message
+
+    ! Paragraph ended before \next@ was complete.
+
+which is totally incomprehensible (and the same for all such
+constructions).  So, first of all, in such cases we use \def\next@
+instead of \let\next at .  Moreover, we want the control sequence
+appearing in the error message to be known to the user. We will use
+
+    \csname align \endcsname
+
+as a substitute for \lalign@, which shows up on the screen as \align
+with only one extra space, and
+
+    \csname align \space\endcsname
+
+as a substitute for \ralign@, which shows up with two extra spaces.
+For the special case of \align with \gather, we use
+
+    \csname align (in \expandafter\eat@\string\\gather)\endcsname
+
+which just shows up as
+
+    \align (in \gather)
+
+(This happens to bomb in the special case
+
+    $$\gather {\align }\endgather$$
+
+with nothing on either side of the {\align}, but seems to work in
+most reasonable cases.)
+**********************************************************************
+
+In the definition of \align we \let\next@\align@, since \align@ will
+then call the other control sequences.
+
+
+\newhelp\andhelp@, ..., \def\align@
+-----------------------------------
+\align@ will set the flags \ifinalign@ and \ifinany@, and properly
+define \vspace, \allowdisplaybreak, \displaybreak, and \intertext.
+It will reduce to \align|_| when tags are on the left, otherwise
+\align|_||_|.  These latter will essentially be \halign's, with two
+&'s per line; a line `lhs & =rhs \tag 3' will really be `lhs & =rhs &
+3'.
+
+In the special case of `lhs \tag 3', however, this line must become
+`lhs && 3'.  So we will use a counter \and@ to record the number of
+&'s in the current line, and define \tag in terms of this number
+(\everycr will be used to set \and@ back to 0 at the beginning of
+each line).
+
+Moreover, if the user types `lhs &= rhs &= rhs', with or without a
+following \tag, then we want a more informative error message than
+`Misplaced alignment tab'.  So we will let \tag set a flag \iftag@
+(with \everycr setting \tag at false), and have the tag part of the
+preamble give an error message if the flag hasn't been set.  An extra
+& in a row will usually lead to chaos, and there's no point relying
+on TeX's decision to change the & to \cr; so we make the message
+strong, and add a help message, reiterating this.
+
+It is important to note that because we are \def'ing \tag to be
+something, and not simply \let'ing \tag=&, TeX's scanning mechanism
+would generally not properly intercept these hidden &'s as needed.
+Fortunately, that isn't a problem in this case, because the first two
+parts of the preambles for \measure@ and \align|_| and \align|_||_|
+do not involve # as an argument to a macro; so TeX isn't swallowing
+tokens blindly as it reads in the first two elements of each row of
+the \halign.
+
+
+\def\Tag@, ..., \def\measure@
+-----------------------------
+A whole new level of complication for \align is introduced by the
+fact that we want a tag automatically to be set on a separate line if
+it needs to be.  There is no way to figure this out on a line-by-line
+basis, because the position of a line is influenced by all the other
+lines.  So we will first `\measure@' our \align, to obtain three
+quantities: \maxlwidth@, the maximum length of the left hand side of
+all lines; \maxrwidth@, the maximum length of the right hand side of
+all lines; and \totwidth@ = \maxlwidth@ + \maxrwidth at .
+
+As we proceed through the lines, \lwidth@ and \rwidth@ will be used
+for the left hand length and right hand length of the current line.
+We apply \measure@ to everything up to the \endalign.
+
+Since \measure@ is used before anything else, we must catch the error
+of an extra & at that point.  For convenience later on (in defining
+\alignat and \xalignat), we abbreviate the construction that
+supplies the error message, as \Tag at .
+
+%1  Initialize widths and \and@ to 0pt.
+%2  We just set a box, which we will not use.
+%3  We set \tag at false and reset \and@ to 0 at each \\ (which is
+    \let=\cr); \global needed since \noalign material is in
+    restricted vertical mode.
+
+%4  Each left hand side is just set in \displaystyle. \@lign is required
+    to make sure that if any such formula involves an \halign, the current
+    \everycr won't affect it.
+
+%5  Store width of entry in \lwidth@; \global needed since each entry
+    is essentially in its own group.
+
+%6  \maxlwidth@ is always largest of the \lwidth@'s found so far.
+
+%7  \and@ will be 1 at next entry.
+
+%8  \@lign needed here, as in %4.
+
+%9  Treat the right hand side similarly, getting maximum in
+    \maxrwidth at .
+
+%10 \and@ will be 2 at next entry.
+
+%11 The second &, if it is supplied by \tag, will simply throw away
+    the tag.  But if it wasn't supplied by \tag, it will give an
+    error message.
+
+%11 Finally, make \totwidth@ = \maxlwidth@ + \maxrwidth at .
+
+
+**********************************************************************
+WARNING: Because \align processes its argument twice, you have to be
+careful if you are using an ad hoc construction in the form of a \box
+that just been set.  This box must be used as \copy, rather than as
+\box, or it will be emptied out by the time \measure@ has gotten
+through with it!
+**********************************************************************
+
+
+\displ at y@ is just like plain's \displ at y, except that it also sets
+\and@ to 0 and \tag at false at each \cr (we need the \tag at false for
+certain later constructions, even though \align no longer needs it).
+
+
+\def\black@
+-----------
+Alignments do not show an overfull black box on any of their overfull
+rows (TB, p. 303).  Since \align is just an \halign, this means that
+no black boxes would be shown when a row is overfull.  To alleviate
+this problem, we at least arrange for a black box to show up at the
+last line of the alignment, by adding \black@\totwidth@ at the end.
+\black@#1, with any argument #1, simply backs up a line, and then
+adds some extra non-aligned empty material, which is specified as
+
+    \vbox{\noindent\hbox to#1{\strut@\hfill}}.
+
+This makes a \vbox that contains a paragraph starting (and containing
+only) a box of width #1 and height and depth of \strut@; if #1 >
+\hsize, then this paragraph has an overfull box in it, which will
+produce the desired black line, of height and depth of \strut@
+(unless \NoBlackBoxes has been specified).  However, we will add this
+box only if #1 > \displaywidth (which could conceivably be larger
+than \hsize).
+
+%1 Save \prevdepth in \dimen@, and then inhibit interline glue with
+   \nointerlineskip (which just sets \prevdepth=-1000pt).
+
+%2 Back up enough to put in line with height of \strut at .
+
+%3 Put in the overfull \vbox.
+
+%4 Restore \prevdepth.
+
+
+\expandafter\def\csname align \space ...
+----------------------------------------
+Since \align|_||_| is created with \csname ... \endcsname, we have to
+use an \expandafter\def construction.  \align|_||_| produces the
+\align when tags are on the right.  We first \measure@ to find
+\maxrwidth@ and \totwidth at .  Our display will be centered within a
+region of width \displaywidth,
+
+
+ <---------------------------\displaywidth------------------------>
+ |               xxxxxxxxxxxxxx = yyyyyyyyy                       |
+ |                       xxxxxx = yyyyyyyyyyyyyyyyy               |
+ |                    xxxxxxxxx = yyyyy<------------L------------>|
+ |
+                 <------------\totwidth at ---------->
+
+ <--left margin->                                   <-right margin->
+
+
+so the left and right margins will each be
+
+     1/2(\displaywidth-\totwidth@).
+
+The tag for a line (say line 3 in the above picture) can go on that
+line if the length L is at least twice as big as the tag's length.
+We have
+
+     L = (right margin) + \maxrwidth@ - (\rwidth@ for this line).
+
+So we need
+
+    1/2(\displaywidth-\totwidth@)+\maxrwidth at -(\rwidth@ for the line)
+           >= (twice tag length).
+
+When the tag has to be put on a separate line, we basically just
+replace the tag by a two-line box with an empty first line and the
+tag on the second line.
+
+[NOTE: Diddling with \tagform@ (and hence with \maketag@) will
+change the rules for the tags here just as with \tag itself.]
+
+[NOTE: Since \align computes \lwidth@ and \rwidth@ at each line, it
+is easy to add commands that use knowledge of these widths.  For
+example, suppose that one wants formulas like
+
+     a = xxxxxxxxxxxxxxxxxxxxxxxxxxxx
+                    + yyyyyyyyyyyyyyy
+
+where the y...y is set flush right with the x...x instead of being
+indented some fixed amount.  To type this as
+
+     \align a & = xxxxxxxxxxxxxxxxxxxxxxxxxxxx \\
+          & \flushright {+yyyyyyyyyyyyyyy} \\
+
+we could introduce a new dimension \prevrwidth@ to store the \rwidth@
+of the previous line and let \flushright#1 mean
+
+     \hbox to\prevrwidth@{\hfil#1}}
+
+(To get this to work correctly, we would probably need to add
+
+     \global\prevrwidth@\rwidth@
+
+to the \everycr{\noalign{...}} clause.)]
+
+%1  \measure@, set \and@=0.
+
+%2  Use \displ at y@, except if in a \gather just set \and@=0 at each
+    \cr.
+
+%3  Left hand formulas in the \halign to\displaywidth will have
+    \tabskip\centering@ glue before them to push them to the right.
+
+%4  \@lign required so that an \halign in a left hand formula will
+    not have the \tabskip\centering@ affect it.
+
+%5  As we go through the lines once again, we set \lwidth@ to the
+    length of the current left hand side, as before, except now we
+    also print this left hand side (\box0 ).
+
+%6  Tabskip glue is zero between the two sides.
+
+%7  \@lign needed here, as in %4.
+
+%8  We set \rwidth@ to the length of the current right hand side,
+    but now also print right hand side.
+
+%9  Right hand formulas have \tabskip\centering@ glue after them to
+    push them to the left.
+
+%10 First we store the \tag in \box0. \@lign required in case the tag
+    involves an \halign!
+
+%11 Let dimen0 = 1/2(\displaywidth-\totwidth@)+\maxrwidth@ - \rwidth at .
+
+%12 If not enough space for tag on this line, we \llap a two-line box
+    with first line empty, and tag on the second line.
+
+%13 If there is enough space we just \llap the tag.
+
+%14 \tabskip glue is 0 after the tag.
+
+%15 Now do all the lines.
+
+%16 Finally, add black box if \totwidth@ > \displaywidth.
+
+
+\newdimen\lineht@, \expandafter\def\csname align \endcsname ...
+---------------------------------------------------------------
+\align|_| is similar, except that our calculations for whether the
+tag fits will involve \maxlwidth@ and \lwidth at .  Moreover, when the
+tag has to be set on a separate line, we need to replace it by a
+two-line box with the tag on the first line and an empty second line.
+This empty second line has to have the same height as the line to
+which the tag applies, so we need a dimension \lineht@ to store this
+height in.
+
+%1 \displaywidth@ is max of \totwidth@ and \displaywidth.
+
+%2 Record height of left hand side in \lineht at .
+
+%3 Update \lineht@ to height of right hand side, if it's bigger.
+
+%4 The \kern-\displaywidth@ moves the tag back over to the left (to
+   the left margin of the page, unless \totwidth@ is greater than
+   \displaywidth@ [so that our display is actually overfull], in
+   which case it is moved to the left margin of the display).
+
+
+\expandafter\def\csname align (in ...
+-------------------------------------
+In the case where \align was in a \gather, it reduced to a control
+sequence called
+
+            \align (in \gather)
+
+We simply make this a \vcenter{\align at ...} (where \align@ will reduce
+to\align|_| or \align|_||_|).
+
+
+\Invalid@\endalign
+------------------
+Notice that \endalign is quite different from \endaligned, because
+the latter actually ends a group, whereas \endalign is just used as
+the delimiter for the argument of \align.  This could cause great
+difficulties if we needed \align ... \endalign within a group that
+has other \\ constructions.  Fortunately, the only such case is
+\align ... \endalign within a \gather, and we simply insist that
+braces are used around the \align ... \endalign in this case.  But we
+ought to do something more than just leaving \endalign undefined.
+
+
+\newif\ifxat@
+-------------
+\alignat and \xalignat have much in common, so we will write their
+definitions similarly, using \ifxat@ as a flag to do things
+differently for the \xalignat.
+
+
+\alignat first checks to make sure we are in display math mode, and
+then calls \alignat|_| (created by \csname...\endcsname), which uses
+\endalignat as part of its syntax.  In the case of \alignat, the test
+for tags on the left or right is made afterwards, so we don't need
+separate names for the two possibilities.
+
+
+\newif\ifmeasuring@, \newbox\savealignat@
+-----------------------------------------
+In `\alignat|_| n' the argument n determines how many &'s are allowed
+per line, namely 2n (2n - 1, plus 1 for the \tag).  This in turn
+determines how many &'s have to be added when a \tag appears in a
+line with fewer &'s, and when an error message should be given: if
+\tag appears in a column where \and@ has value k, then we need to add
+2n-k &'s; if we have k > 2n, then the \tag part of the preamble
+should give an error message.
+
+We won't try to set tags on separate lines automatically, but we do
+want to produce a black box if lines are too long, so we still need
+to measure things. Instead of separately calling a \measure@ type of
+argument, we will use a flag \ifmeasuring@ to determine if we are
+measuring or actually typesetting the alignment; the appropriate
+preamble will be made by \attag@, which will depend on \ifmeasuring@
+(and on \ifxat@).  When measuring, we will save the result in the box
+\savealignat at .
+
+
+\expandafter\def\csname alignat \endcsname ...
+----------------------------------------------
+
+%1 #1 is the number after \alignat, #2 is everything else.
+%2 First we are just measuring.
+%3 We make the proper preamble with \attag at .
+%4 Then we are actually typesetting.
+%5 We make a new preamble with \attag at .
+%6 Then we typeset all the lines.
+%7 Finally we add a black box if necessary.
+
+
+\endalignat, like \endalign, has no definition of its own.
+
+
+\xalignat, like \alignat, first checks to see that we are in display
+math mode, and then calls \xalignat|_|, since it has \endxalignat as
+part of its syntax.
+
+
+\xalignat|_| is exactly the same as that for \alignat|_|, except that
+we have \xat at true (which will influence \attag@, when building the
+preambles).
+
+
+\attag@ finally builds the preamble.  Although the process is similar
+to that used for building the preamble for \alignedat, it is
+complicated by the fact that we have to include \maketag@ and \Tag@
+among the tokens and make sure that they aren't expanded out when we
+do our \xdef's.
+
+%1 Store \maketag@ in \Maketag@ and \Tag@ in \TAG at .
+
+%2 Insure that \maketag@ and \Tag@ won't be expanded.
+
+%3 The preamble will be written in terms of \llap@ and \rlap@, which
+   are simply \llap and \rlap when we are typesetting, but when we
+   are measuring will be a box twice the width of the tag.
+
+%4 \toks@ will be the first part of the \preamble; it acts slightly
+   different for \xalignat|_| and \alignat|_|.
+
+%5 \toks@@ will be the final part of the \preamble; it differs
+   significantly for \xalignat|_| and \alignat|_|.
+
+%6 We use a \loop to add on pieces of the preamble to \toks at .
+
+%7 Then we add on the last part.
+
+%8 Then we do one more \xdef, as with \alignedat.
+
+%9 Finally, we restore the meaning of \maketag@ and \Tag at .
+
+
+\endxalignat also has no definition.
+
+
+\xxalignat is simpler, because we don't have to worry about tags at
+all.  First we make \xxalignat call \xxalignat|_|, since it uses
+\endxxalignat as part of its syntax, in display math, but gives an
+error message otherwise.
+
+
+\xxalignat|_| is similar to \alignat|_| and \xalignat|_|, except we
+don't bother about measuring things, since we don't have to worry
+about tags.
+
+
+\xxattag@ is used to make the preamble, rather than \attag at .
+
+
+\endxxalignat also has no definition.
+
+
+\newdimen\gwidth@, \newdimen\gmaxwidth@
+---------------------------------------
+\gather is naturally easier than \align, but we still have the
+problem of putting the \tag on a separate line, so we still have to
+measure things.  But we need only the one quantity \gmaxwidth@, the
+maximum width of all the formulas; \gwidth@ is the width of each line
+as it is measured.
+
+
+\gmeasure@ is analogous to \measure@ for \align at .
+
+
+\gather gives an error message if we are not in display math mode,
+and otherwise calls either \gather|_| or \gather|_||_|, since both
+use \endgather as part of their syntax.
+
+
+\gather|_||_| is analogous to \align|_||_|.
+
+
+\gather|_| is analogous to \align|_|, using the \glineht@ instead of
+\lineht at .
+
+
+\newif\ifctagsplit@ ...
+-----------------------
+It seems more elegant if a \split ... \endsplit formula has its tag
+either at the left of the top line or the right of the bottom line,
+but we will allow the tag to be centered, depending on the flag
+\ifctagsplit at . We provided \CenteredTagsOnSplits and
+\TopOrBottomTagsOnSplits to allow the user to set the flag. The
+default is \TopOrBottomTagsOnSplits.
+
+
+\split will be \outsplit@ if it is not in some other alignment, but
+if it is in some other alignment it will be \insplit@, which is the
+interesting thing. We don't need to worry about the
+\csname...\endcsname trick here because \split doesn't actually use
+\endsplit as part of its syntax. The K-method wouldn't work in this
+multi-case situation.
+
+
+\insplit@ just starts setting \box0 as \vbox{\halign{... with the
+proper format.
+
+
+\endpslit then finishes \box0 and calls either \lendsplit@ or
+\rendsplit at .
+
+
+\def\rendsplit@
+---------------
+For tags on the right, we need to get out the last line of the
+\insplit@, which is a \vbox made up of the various lines of the split
+formula, with glue between them. If TG represents various tabskip
+glues (which all happen to be 0pt) and HF represents various glues
+added by the \hfil's in the preambles, this box looks like
+
+                      ....
+                      ....
+       \hbox{TG\hbox{HF lhs}TG\hbox{rhs HF}TG}
+                <interline glue>
+       \hbox{TG\hbox{HF lhs}TG\hbox{rhs HF}TG}
+
+
+%1 \box9 now has everything in \box0 except the last line, which is
+   now \box8, and the interline glue that preceded the last box,
+   which is removed by \unskip. \box8 is now of the form
+
+     \box8 = \hbox{\TG\hbox{HF lhs}TG\hbox{rhs HF}TG}.
+
+#2 In \box1 we \unhcopy8. \unskip removes the last TG.  Then \box2
+   becomes \hbox{rhs HF} (\box 2 is saved by \global).  The next
+   \unskip removes the middle TG. Then \box3 (also saved by \global)
+   becomes \hbox{TG{HF lhs}}.  Notice that the width of \box3 is the
+   same as the width of the whole left part of the split (the TG is
+   0, but the HF fills out all lines to the same width, [even though
+   lhs is actually usually empty in a split]).
+
+%3 Finally, \box7 is now the right side of the last line, set to its
+   natural width (the HF glue at the end having been removed by
+   \unskip).
+
+Now we will define \split@ to be the proper repositioning of
+elements.
+
+%4 Suppose our \split is within an \align, and we want tags centered
+   on the \split.
+
+%5 Then we make \split@ be one more line of the form LHS & RHS, where
+   RHS is a \vcenter of the whole split (\box0 ) except moved left by
+   width of \box3, which is the width of the whole left hand side.
+   This means that the symbols that the \split were aligned along
+   will now align with all the other symbols in the \align. We also
+   make LHS an empty box with the same width as the whole left hand
+   side, so that \split will still have the proper width.
+
+%6 Otherwise, we want the tag on the last line, so we have \split@
+   add two lines: one having \box 9 (everything in the \split except
+   the last line and interline glue) on the right, except moved over
+   to the left the right amount, the width of \box3; and another
+   having \box3 on the left and on the right \box7, which is the
+   proper right side (cut down to its natural width). The proper
+   interline glue will then be added back between these two lines.
+
+%7 If we're not in an \align, so don't need to worry about lining up
+   with other things, we do similar, but simpler, things, without
+   worrying about moving things over.
+
+%8 And finally, having defined \split@ correctly, we insert it.
+
+
+\def\lendsplit@
+---------------
+For tags on the left we have to proceed somewhat differently. We
+can't conveniently obtain the first line, but we can begin by making
+a \vtop out of our \vbox:
+
+%1 \box9 is just like \box0, except baseline is that of first line.
+
+%2 Now \box8 is last line.
+
+%3 Now \box3 is as before (but \box2 hasn't been saved, because we
+   don't need to find the natural width of the last right side).
+   \box1 is just a scratch box, so can be used twice like this.
+
+Now we define \split at .
+
+%4 Suppose our \split is within an \align, and we want tags centered
+   on the \split.
+
+%5 Then we make \split@ be one more line of the form LHS & RHS, where
+   RHS is a \vcenter of the whole split, except with a new baseline
+   (\box9 ) and moved left the right amount, and LHS an empty box as
+   before.
+
+%6 Otherwise, we want the tag on the first line, as before.
+
+
+\outsplit@ is just reduced to \insplit at .
+
+
+\newdimen\multlinegap@
+----------------------
+Finally, we come to \multline.  We store the gap between the margins
+and the left and right sides of the \multline in a dimension
+\multlinegap at .
+
+
+\newdimen\multlinetaggap@
+-------------------------
+For \multline we use the rule that there must be at least
+\multlinetaggap@ space between the formula and the tag. (This seems
+more reasonable than the usual rule, since the formula doesn't have
+to be centered.)
+
+
+\MultlineGap globally changes \multlinegap at .
+
+
+\multlinegap can only be used in a displayed formula, and then
+affects only this formula.
+
+
+\nomultlinegap is an abbreviation for \multlinegap{0pt}.
+
+
+\multline first checks to see that we are in display math mode, and
+calls \multline@ if we are. There is no point using the
+\csname...\endcsname trick here, because eventually we use the syntax
+\endmultline$$, so if the \endmultline is missing, at the end of the
+paragraph we just get an error message about a missing $ sign.
+
+
+\newif\iftagin@, \def\tagin@
+----------------------------
+\multline@ has to be processed differently depending on whether or
+not the displayed formula it appears in has a \tag.  We use a flag
+\iftagin@ to tell us, and test with \tagin at .
+
+
+\multline@ first does the \tagin@ test and then calls either
+\multline at l or \multline at r.
+
+
+\newdimen\mwidth@, \def\rmmeasure@
+----------------------------------
+When tags go on the right, we will need to measure the last line of
+the \multline, and store its width in \mwidth at .  This is easily done
+with \rmmeasure@; we set \mwidth@ to the width of each line, so that
+its final value is just the width of the last line.
+
+%1 Don't worry about what \shoveleft and \shoveright really are,
+   since we only care about the result of the last line, which
+   shouldn't have either.
+
+
+\newdimen\mlineht@, ..., \def\lmmeasure@
+----------------------------------------
+When tags go on the left, however, we will need to measure the FIRST
+line of the \multline, again storing its width in \mwidth@ (we will
+also need to store its height, in \mlineht@).  This is more
+complicated, and we actually need two new flags, \ifzerocr@ and
+\ifonecr@, to keep things under control.
+
+%1 After the first \cr, which is the one that follows the preamble,
+   we have \zerocr at false and \onecr at true. Then after the first \\ in
+   the \multline, we always have \onecr at false (and also
+   \zerocr at false).  So \onecr at true holds only for the first line of
+   the \multline.
+
+
+\newbox\mtagbox@, ..., \newdimen\rtwidth@
+-----------------------------------------
+We will need to store the tag in a box \mtagbox at .  And \ltwidth@ and
+\rtwidth@ are dimensions where we will store the widths of this box,
+for use with \shoveleft and \shoveright; however, \ltwidth@ will be
+made 0pt when a tag on the left can't go on the same line as the
+formula (since in this case we want \shoveleft to shove all the way
+to the left), and similarly for \rtwidth at .
+
+
+\multline at l calls \lmultline@@ if there is a \tag, and \lmultline@@@
+otherwise. In the latter case, it first sets \mtagbox@ to \null, and
+makes \ltwidth@ and \rtwidth@ be 0pt.
+
+
+\lmultline@@ sets other values for \mtagbox@, \ltwidth@, and
+\rtwidth@ when there's a \tag, and then simply calls \lmultline@@@.
+
+%1 \mtagbox@ is a box with the tag in it.
+
+%2 \dimen@ is
+
+     (width of first line) + (width of tag) + \multlinetaggap at .
+
+%3 \ltwidth@ is just the width of the tag, unless the tag won't fit
+   on the line (determined by \dimen@>\displaywidth), in which case
+   it is 0pt (because the tag won't really be there!).
+
+
+\lmultline@@@ mainly has to define \shoveright and \shoveleft.
+\shoveright is simple: the \hfilneg cancels the \hfil normally on the
+right, but we add \hskip\multlinegap@, so that the line will come out
+the same distance from the right margin as the last line.  \shoveleft
+is more complicated.  First of all, we put \hfilneg at the beginning,
+to cancel the \hfil.  Then, if \ltwidth@ isn't 0pt (so that the tag
+is actually on the line), we \hskip the width of this tag plus the
+\multlinetaggap@ (the total space from the margin to the beginning of
+the first line); but if \ltwidth@ is 0pt, so that the tag is on a
+separate line, we just \hskip the \multlinegap at .  Unfortunately, this
+doesn't quite do it, because the formula that we are applying
+\shoveleft to might begin + A + B + ...  for example.  Our preamble
+for the \multline involves $\displaystyle{}#$, so that the initial +
+sign will have a medium space between it and the A.  But there is
+also a medium space BEFORE the + sign, so the + sign will not really
+line up correctly on the left.  To get around this, we set our
+formula with {} before it in \box0 and without the {} before it in
+\box1.  When a symbol like + begins the formula, the difference
+between the width of \box0 and the width of \box1 will be two of
+these thick spaces, so we exactly cancel out any extra space with
+\hskip.5\wd1 \hskip-.5\wd0.
+
+%1 First define \shoveright and \shoveleft.
+
+%2 We begin the \multline with a separate line starting with
+   \hfilneg, to cancel the \hfil.
+
+%3 Suppose first that there is a tag.
+
+%4 Moreover, suppose it will fit on the first line.
+
+%5 Then we put in the tag, and skip the proper gap.
+
+%6 But if it won't fit on the first line, we manufacture a box
+   containing the tag on top and an empty box the height of the first
+   line on the bottom.
+
+%7 If there isn't a tag, we just skip the \multlinegap at .
+
+
+\multline at r works just like \multline at l.
+
+
+\rmultline@@ works just like \lmultline@@.
+
+
+\rmultline@@@ works like \lmultline@@@, except that now we don't
+have to worry about the tag yet, which will be taken care of by the
+\endmultline.  However, now the definition of \shoveright is a little
+more complicated to take into account whether or not the tag goes on
+the same line as the last line; the definition of \shoveleft is
+simpler, but we still have to do the same trick to take care of
+formulas like + A + ... .
+
+
+\endmultline works slightly differently for tags on the left and tags
+on the right, so we have it call either \lendmultline@ or
+\rendmultline at .
+
+
+\lendmultline@ is trivial.
+
+
+\rendmultline@ has to put in the tag.
+
+%1 Suppose there is a tag.
+
+%2 Suppose, moreover, that it will fit on the last line.
+
+%3 Then we skip the proper gap before the tag, and put in the tag.
+
+%4 But if it won't fit on the last line, we manufacture a box
+   containing an empty box on the first line, and the tag on the
+   bottom line.
+
+%5 If there isn't a tag, we just skip the \multlinegap@, before
+   adding the \hfilneg.
+
+
+\bmod, ..., \mod are easier. \bmod is exactly as in plain, but with
+\fam\z@ instead of \rm.  And \pmod is also based on plain, except
+that more space seems to look better in displays.  \pod is the same
+as \pmod, but without the word `mod', and \mod is similar, except
+without the parentheses, and slightly different spacing.
+
+
+\newcount\cfraccount@, ..., \def\rcfrac
+-----------------------------------------
+Next come continued fractions. TeX's \over construction
+
+     {...\over\displaystyle ... +
+        {\strut ... \over\displaystyle ... ...}}...}
+
+is admirably suited for a recursive definition, since each new level
+contributes one left brace, with all the right braces occurring at
+the end; we just have to keep track, in a counter \cfraccount@, of
+how many levels we have entered. However, it doesn't look good if TeX
+puts the usual \nulldelimiterspace around each of the subfractions,
+so we will actually have one more level around each subfraction, with
+\nulldelimiterspace subtracted inside it. Thus, each \cfrac will
+contribute two \bgroup's.
+
+We also have to make \\ mean \over\displaystyle inside the \cfrac. In
+case the \cfrac appears in some other construction where \\ has been
+\let=\cr, we use the usual \iffalse{\fi...\iffalse}\fi trick to
+enclose this definition. \lcfrac is just like \cfrac, except that the
+next \\ will put \hfill before the \over (hence at the end of the
+next numerator); and \rcfrac puts in the \hfill before the numerator.
+
+
+\def\gloop@, \def\endcfrac
+--------------------------
+Finally, \endcfrac puts in pairs of }'s, with
+\hskip-\nulldelimiterspace between them. A \loop...\repeat type of
+construction is meant to be used here, in which we decrease
+\cfraccount@ by 1 at each step.  But there is a complication, because
+\loop uses \def\body to keep track of things, and after each
+iteration we are two levels up, so that \body is no longer defined
+(it might even be some old definition of \body!).  So we have to use
+\gloop@, which is just like \loop, except that it uses \gdef\body.
+
+
+\def\binrel@
+------------
+For \overset and \underset, we want a way to check whether a symbol S
+is either a binary operator or a binary relation, since \overset and
+\underset are supposed to preserve this. The idea is to compare the
+formula $S$ (with \mathsurround=0pt) and the formula ${}S{}$.  To
+make the comparison both independent of the present values of
+\thinmuskip, etc., and easy, we set the formulas with
+\thinmuskip=0pt, \medmuskip=1mu, \thickmuskip=-1mu.
+
+The spacing between the \mathord {} and a binary operator is
+\medmuskip, between {} and a binary relation is \thickmuskip and
+between {} and anything else is either 0 or a \thinmuskip. So, S must
+be a binary operator if the formula gets wider, and a binary relation
+if the formula gets narrower.  Instead of saving the results of the
+test in control sequences, we just make \box2 have the width of {}S{}
+minus the width of S, and check on the width of \box2, since this
+test will always be done right at the beginning of any construction.
+
+
+\overset and \underset are essentially as in plain, except we make
+the result a binary operator or relation if it started as one; we
+also add the \kern\z@ as in \operatorname, in case only a single
+letter is involved.
+
+
+\oversetbrace and \undersetbrace are simply convenient abbreviations.
+
+
+\def\sideset
+------------
+In a construction like \sideset ^+ \and ^* \to \sum, the final symbol
+will look like {\vphantom{\sum}}^+ {\sum}^* --- with the \vphantom
+used to get the prescript ^+ at the right height.  To get the limits
+in the right place, we need a construction like that used for
+multiple integrals: \hskip-<...>\mathop{\hskip<...>{\vphantom } }
+where the correction <...> is the width of {\sum}^* which we set in
+\box2, minus the width of \sum with the prescript, which we set in
+\box1.
+
+
+\rightarrowfill@, ..., \def\leftrightarrowfill@ depend on the math
+style, to modify \overrightarrow and \overleftarrow from plain so
+that they work in all styles, using \mathpalette. The \smash- is
+used because the height of the minus sign happens to be the height of
+the plus sign (thus, larger than you'd like).
+
+
+\overrightarrow, ..., \underleftrightarrow are now defined, using
+\overrightarrow@, ..., \underleftrightarrow@ for use with
+\mathpalette.
+
+
+Now we come to \dots, which is probably the most complicated thing in
+all of AmS-TeX!
+
+We would like \dots to know what to do on the basis of the next
+token, which we can get with a \futurelet. (It turns out that we
+don't happen to encounter any problems if we have \dots & within a
+\matrix, etc. This can be explained only by serendipity.) If that
+next token is a comma, then we will use \dotsc.  If it is the token
+\not, then the \not presumably cancels a binary operator, so we will
+use \dotsb@ [\dotsb@ is essentially \dotsb, except that \dotsb will
+look ahead to see if extra space should be left because the next
+symbol might be a right delimiter]. If the next token is +, =, <, >,
+-, * or : then we again want to use \dotsb at .
+
+Otherwise, however, it's not clear what to do with the token. For
+example, we can't simply make a formula containing only that token,
+since it might be something like \matrix that doesn't make any sense
+by itself (we don't have this problem with \underset and \overset,
+since they are actually applied to arguments, which must be
+meaningful formulas).
+
+The only hope at this point is actually to look at the next token in
+detail, using \meaning!!
+
+When we look at \meaning<token> we might get
+
+   \mathchar"...    or      macro...->...
+
+(Remember, however, that all the characters here will have type 12.)
+
+If we get \mathchar"... the number ... is of the form xnnn, where x
+gives the ``class'', with 2 for a binary operator and 3 for a binary
+relation.  So if we set a counter to the number and divide by 4096,
+the value will be 2 and 3 for binary operators and relations,
+respectively.
+
+If we get macro...->... then we don't want to go berserk and actually
+try to figure the macro out, but if the definition begins with \not
+we should use \dotsb (remember that \ne, for example, is a macro that
+expands to \not=). Moreover, we ought to use \dotsb if the definition
+begins with \mathbin or \mathrel.
+
+In addition, if we test to see whether the definition begins with
+\DOTSB we can use \DOTSB as a signal that we are using a binary
+operator (and the user can add this to a definition also).  Later we
+will add \DOTSB to certain of plain's definitions, since this will be
+the only reasonable way to see that they represent binary operators
+or relations.  For example, \longrightarrow begins with \relbar, and
+\Longrightarrow with \Relbar.  We have simply added \DOTSB in front
+of both.  \DOTSB has also been added previously to the various big
+operators, so that \dotsb will be used before them.
+
+Similarly, \DOTSI will indicate that \dotsi should be used, for dots
+before an integral sign.
+
+Once \dots has figured out whether to use centered or low dots, it
+will still try to figure out whether some extra space should be left,
+because the next symbol is a right delimiter.  Here we will find
+\DOTSX useful, to be put into a macro definition to indicate that it
+represents a right delimiter.
+
+
+\let\DOTSI\relax, ..., \let\DOTSX\relax
+---------------------------------------
+Initially, these are all simply \relax.
+
+
+\newif\ifmath@, {\uccode ...
+----------------------------
+First we make a flag to tell that \meaning begins with \math, where
+\ m a t h are all of type 12.  To do this we have to use the \uccode
+trick, temporarily setting the \uccode of various numbers and of !
+(all of which are type 12) to \ m a t and h, so that when we
+\uppercase them we will get type 12 \ m a t and h.  We will use
+\math at ___\math@ to test ___ and set \ifmath@ true if the first five
+symbols are \ m a t and h, storing what remains in \meaning at . We are
+going to be applying constructions like \math@, which takes at least
+5 arguments, to the unknown ___ and then sometimes yet another
+construction taking at least 5 arguments, so, as will appear later,
+we will always add ten periods (any other symbol would do as well) to
+___ before we begin the whole testing process.
+
+(This construction assumes that ! is of type 12.  If some macro
+pacakge changes this [for French punctuation, say], then the ! should
+be replaced by some other symbol that is guaranteed to be of type
+12.)
+
+
+\newif\ifmathch@, {\uccode ...
+------------------------------
+When something begins with `\math', we will further test to see if it
+is followed by ch??" (we don't bother testing the ? characters, since
+no other result of \meaning could be like this).  The test is of the
+form \mathch at ___\mathch@, setting \ifmathch@ true if it passes, and
+then storing the " and what comes after in a new \meaning at .
+
+
+\newcount\classnum@, \def\getmathch@
+------------------------------------
+Next we define a control sequence to test whether the "____
+combination we've picked up begins with 2 or 3, by computations with
+the hex number `"____' Since we've added periods, we must be careful
+to pick up only the number before the first period. At this point we
+no longer store the result, but directly define \thedots@ [the main
+thing that \dots is trying to produce] to be \dotsb@ if we do have 2
+or 3.
+
+
+\newif\ifmathbin@, {\uccode ...
+-------------------------------
+When we test whether a macro meaning begins with \mathbin or
+\mathchar we will first use the above \math@ test to see if it begins
+with \math.  Then we will have to test if it is followed by `bin'.
+But we actually have to test whether it is followed by `bin|_|'
+(since someone might have defined a new control sequence beginning
+\mathbin...). Spaces created by \meaning still have their usual type
+10, so we will use \space@ for this part of the test, picking up the
+token after `bin' with a \futurelet.  Compressed format is used here.
+The final result of the test is flagged by \ifmathbin at .
+
+
+\newif\ifmathrel@, {\uccode ...
+-------------------------------
+Similarly, we test for \mathrel.
+
+
+\newif\ifmacro@, {\uccode  ..., \def\macro@@
+--------------------------------------------
+To test whether \meaning begins with `macro', we just test for the
+`mac', since no other possible result of \meaning could begin like
+this.  The test sets \ifmacro@ and stores the result in (a new)
+\meaning@, which uses \macro@@ to isolate the part after the ->,
+i.e., the actual macro definition.
+
+
+\newif\ifDOTS@, \newcount\DOTSCASE@, {\uccode ...
+-------------------------------------------------
+To test whether a macro definition begins with \DOTSB or \DOTSI or
+\DOTSX we first test for the \DOTS, with \DOTS at ...\DOTS at .  If it
+doesn't we just set \ifDOTS@ false, otherwise we further test for the
+`B|_|' or `I|_|' or `X|_|', setting \ifDOTS@ true if the test is
+passed, and setting a counter \DOTSCASE@ equal to 0, 1 or 2 in these
+cases.
+
+
+\newif\ifnot@, {\uccode ...
+---------------------------
+This is the test for whether something starts with \not.
+
+
+\newif\ifkeybin@, \def\keybin@
+------------------------------
+We abbreviate the process of checking for all the possible binary
+operators and relations that can be entered from the keyboard.
+
+
+\def\dots
+---------
+Finally, we're ready to define \dots ! which is different in text and
+math.
+
+
+\def\tdots@
+-----------
+In text, we want to ignore spaces before \dots, and we want to leave
+an extra thin space if the next token, which we get with a
+\futurelet, is a , or . or ; or : or ? or !  Otherwise (another letter
+or symbol comes next) we want to leave an ordinary space.
+
+
+\def\mdots@, \def\mdots@@
+-------------------------
+Finally, in math mode we want \mdots@, which uses \futurelet to get
+the next token.  Compressed format isn't used here, because things
+are confusing enough already.
+
+The main aim of \mdots@@ is to define \thedots@, which will be used
+at the very end.  We begin by defining \thedots@ to be \dotso@ (the
+dots before ordinary symbols), and then modifying it under the stress
+of various tests.  The order has been chosen so that the more
+complicated tests come near the end.
+
+Notice that the \xdef\meaning@{\meaning\next..........} is allowed,
+even if \next happens to be outer.
+
+%1  By default, we use \dotso at .
+
+%2  If \boldkey (explained below) happens to come next, then we simply
+    want to swallow up the \boldkey and use \boldkeydots@ instead.
+
+%3  Similarly, if \boldsymbol happens to come next, then we simply want
+    to swallop up the \boldsymbol and use \boldsymboldots@ instead.
+
+%4  Otherwise, if , comes next we use \dotsc.
+
+%5  If \not comes next we use \dotsb at .
+
+%6  If +, =,  etc.,  comes next we use \dotsb at .
+
+%7  Otherwise we want to look at \meaning applied to the next token;
+    we get this by \xdef\meaning@{\meaning\next..........} where the
+    extra periods are added for reasons explained above.  We also
+    make another copy, \meaning@@, for later use.
+
+%8  If \meaning@ begins `\math', we further test for ch??"; if this
+    test is passed we use \getmathch@ to define \thedots at .
+
+%9  Otherwise we see if we have a macro.  We test on \meaning@@,
+    since the previous test has already changed \meaning at .
+
+%10 Suppose we do have a macro (so that \meaning@ is now the part
+    after ->).
+
+%11 We see if the macro begins with \not. If it does, \thedots@
+    is \dotsb at .
+
+%12 Otherwise, we see if the macro begins with `\DOTSB' or `\DOTSI'
+    or `\DOTSX', and if so, we set \thedots@ to \dotsb@ for \DOTSB
+    and \dotsi for \DOTSI.
+
+%13 Otherwise we still have to see if the macro definition begins
+    with \mathbin or \mathrel. Once again, we see if it starts with
+    \math, storing the remainder in the new value of \meaning at .
+
+%14 If it does we see if it really begins \mathbin and choose \dotsb@
+    if it does (the test doesn't change the value of \meaning@).
+
+%15 Otherwise we also see if it really begins \mathrel, and choose
+    \dotsb@ if it does.
+
+
+Now that we've gotten to \thedots@, which is either \dotsc or \dotsi
+or \dotso@ or \dotsb@ or \boldkeydots@ or \boldsymboldots@, we have
+to define these.
+
+
+\plainldots@, \plaincdots@ are used to store away plain's definitions
+of \ldots and \cdots.
+
+
+\dotsi and \dotsb@ are simple.
+
+
+\newif\ifextra@, ..., \def\rightdelim@
+--------------------------------------
+But \dotso@ is supposed to leave extra space if followed by a right
+delimiter, so it is more complicated.
+
+We use \ifextra@ to say if extra space should be left, after results
+of a test on \next, which a \futurelet will let equal the next token.
+For simplicity, first we simply test if the next token is an obvious
+right delimiter, storing the result in \ifrightdelim@, and then we
+make the real test.
+
+%1 \rightdelim@ is true if
+%2 \next is ) ] \rbrack ...
+%3 or \Biggr, but false otherwise.
+
+
+\extra@ is the real test to set \ifextra at .
+
+%1 \ifextra@ is true if the \rightdelim@ test is passed.
+
+%2 It is also true if a $ sign comes next.
+
+%3 Otherwise we look at \meaning again.
+
+%4 Suppose we have a macro.
+
+%5 Then if it starts with \DOTSX, \ifextra@ is again true.
+
+
+\newif\ifbold@, \dotso@
+-----------------------
+\dotso@, the most common result of \mdots@, has to act specially
+if it was called by \boldkeydots@ or \boldsymboldots@, which
+will be signalled by the flag \ifbold at .
+
+In the standard case, where \ifbold@ is false, we just want to
+use a \futurelet to get the next symbol, use \extra@ to test
+this symbol for a right delimiter, and then use \plainldots@,
+followed by \, if the next symbol is a right delimiter.  If this
+were the only case to consider, we could use the definition
+
+         \def\dotso@{%
+          \DN@{\extra@\plainldots@\ifextra@\,\fi}%
+          \FN@\next@}
+
+But when \ifbold@ is true, the next symbol will already have been
+scanned by \boldkeydots@ or \boldsymboldots@, and stored in
+\delayed at .  In this case, we don't want to use a \futurelet, but
+simply want to apply \extra@ with \next being \delayed at .
+
+So when \ifbold@ is true we \let\next\delayed@ and then define
+\nextii@ to be this combination, but if \ifbold@ is false we define
+\nextii@ to be the whole combination \DN@{\extra at ...}\FN@\next@}, and
+then we call \nextii at .
+
+
+\def\extrap@
+------------
+
+We still haven't defined \dotsc, which will actually be the last kind
+of dots we define, and there's also \dotsb and \dotso (as opposed to
+\dotsb@ and \dotso@) and similarly \ldots and \cdots.
+
+\dotsb, \dotso, \ldots, and \cdots are slightly different from
+\dotso@ and \dotsb@, because they might be used before , or . or :
+especially at the end of a displayed formula that ends with
+punctuation, since that punctuation would have to appear before the
+$$ signs. So we want extra space here also.
+
+We use \extrap@, which takes as argument another (dot producing)
+macro.  It is used as an abbreviation for a construction that puts an
+extra thin space before a , or . or ; as well as something that
+passes the \extra@ test.
+
+
+\ldots and \cdots use \extrap@, and of course must have low and
+centered dots, respectively.
+
+
+\dotso is just \ldots, and \dotsb is just \cdots, although other
+styles could change that.  Similarly, \dotsm is \dotsb in this style.
+
+
+\dotsc, however, is a little special because we DON'T want extra space
+if it's followed by a comma---someone might have typed \dotsc,
+instead of simply \dots---so we have to explicitly check for only
+a ; or .
+
+
+\cdot should be treated as an ordinary symbol by \dots. We can
+arrange for this by using the fact that \dots doesn't check a macro
+definition for \mathchar!
+
+
+\longrightarrow, ..., \iff need to have \DOTSB added to their plain
+definitions.
+
+
+\dddot, ..., \spvec have nothing special.  A lot of adjustment was
+done by eye.
+
+
+\textonlyfont@ is just a control sequence to allow us conveniently to
+redefine \rm, \it, \sl, \bf, \smc, etc.
+
+
+\oldnos will be used instead of \oldstyle, which doesn't fit in this
+scheme; in fact, \cal and \oldstyle and \mit will be made
+\undefined at the end.  \oldnos is just a control sequence with an
+argument; as a convenience, it doesn't leave extra spaces around
+commas that might occur in the number.
+
+
+\text in text is basically just an \hbox, but allowed to begin a
+paragraph; in math it will be \text@, which is much more complicated.
+Actually, \text should also reset \mathsurround if this has a non-zero
+value, just in case \text is used within a math formula that appears in
+some construction where \m at th has been used.
+
+
+\def\mathhexbox@, ..., \def\P
+-----------------------------
+Once \text@ is defined, it will be possible to create symbols that
+can be used in either math mode or in text mode without $ signs,
+because \text{$...$} will always change sizes right.  With this in
+mind, we redefine \dag, etc., from plain so that they change sizes
+automatically.  \mathhexbox@ is the obvious modification of plain's
+\mathhexbox. An extra set of braces is inserted, so that ^\dag, etc.,
+will work.
+
+
+\newif\iffirstchoice@, ..., \def\text@
+---------------------------------
+\text@ will be a \mathchoice; in each case we will simply set an
+\hbox, but we will specify the style that we want for our math
+formulas and also which fonts we want for \rm, etc.  This involves a
+few details, but there is also a detail of another sort that needs to
+be attended to.
+
+Conceivably, someone could use \footnotemark (which is actually
+defined in AMSPPT.STY, rather than in AMSTEX.TEX) within \text (so
+that, together with \footnotetext, a footnote could be set on some
+text within a displayed formula).  \footnotemark increases the
+counter \footmarkcount@, and since a \mathchoice is set four times,
+\footmarkcount@ would be increased by 4, instead of by 1.  To get
+around this, we let the flag \iffirstchoice@ normally be true but set
+it to be false in all but the first part of the \mathchoice for
+\text@, and in AMSPPT.STY we only advance the counter \footmarkcount@
+when \iffirstchoice@ is true.
+
+Aside from this, we will use \everymath to set the style at each
+size, and the control sequence \textdef@@ will be used to select the
+proper text fonts; depending on its argument, T, S or s, it will
+choose the \textfont or \scriptfont or \scriptscriptfont for each
+family of fonts.  We also redefine \textfonti and \textfontii to be
+the proper size of families 1 and 2, for any text macros that use
+these. (At present that includes \{ and \} in text, which are fairly
+important, as well as \t and \AmSTeX.)
+
+
+\textdef@@ simply uses \textdef@ for each of the families, \rm, \bf,
+\sl, \it we need.  If another family is added that should work
+properly in \text, the appropriate clause should be added here.
+
+
+\def\rmfam{0}, \def\textdef@
+----------------------------
+\textdef@ works under the assumption that \bf has a corresponding
+\bffam, \sl a corresponding \slfam, etc., all with names obtained by
+adding `fam' to the font change name. We therefore have to define
+\rmfam to be 0.  If a new font, say \bfit, is introduced,
+\newfam\bfitfam should be used to create a new family with the
+corresponding name.
+
+To get the name of the family, e.g., \bffam, from the name \bf of the
+font, \textdef@ uses
+
+   \csname\expandafter\eat@\string\bf fam\endcsname.
+
+Then it redefines the font name \bf to be the \textfont for \bffam if
+the first argument is T, or the \scriptfont for \bffam if it is S,
+etc.  The \relax is needed because \bffam is just a number, after the
+\edef.
+
+
+\scriptfont\itfam ...
+---------------------
+Any family that will be used with \text@ should have some assignment
+for its \scriptfont and \scriptscriptfont; otherwise there will be
+error messages even if only text or display size is being used,
+because a \mathchoice actually sets all four possibilities.
+\sevenit, etc., are not defined in plain.  If \sevenit, etc., are
+available, then they can be used here, or in amsppt.sty.
+
+
+\foldedtext, \topfoldedtext, and \botfoldedtext, like \smash and
+\phantom, use one basic definition, with flags \iftopfolded@ and
+\ifbotfolded at .
+
+
+\foldedwidth is syntax that has to be looked for.  We don't store the
+\foldedwidth, which is .3\hsize by default, anywhere special, but use
+it as soon as we get it.
+
+
+\def\bold ...
+-------------
+Next come the control sequences for changing fonts in math mode.  The
+reason for defining \bold@ in terms of \bold@@, instead of directly,
+is that later on we will sometimes want to change the definition to
+eliminate the extra set of braces, and this is easily done by saying
+\let\bold@=\bold@@. \relax is added after \fam\bffam, etc., because
+these families are just numbers.
+
+
+\Cal@@ has \noaccents@ for reasons that will appear later.
+
+
+
+\mathchardef\Gamma ...
+----------------------
+We make the upper case Greek letters ordinary symbols instead of
+variables, because we don't change them with font change
+instructions.
+
+
+\mathchardef\varGamma ...
+-------------------------
+The variant upper case Greek letters are exactly the same, except "00
+is replaced by "01, since they are on the math italic font, which is
+family 1.
+
+
+
+\newif\ifmsamloaded@ ...
+------------------------
+Originally, \loadmsam, \loadmsbm, and \loadeufm were created because
+the msam, msbm and eufm fonts are not available to everyone, so
+instead of loading them directly, we defined control sequences to
+load them; we also needed to set flags so that AMSPPT.STY will know
+whether to load in the corresponding fonts for the eightpoint size.
+
+Now, \loadmsam, \loadmsbm, and \loadeufm are considered part of
+AmS-TeX, but we keep the same structure, since other font families
+are treated this way.
+
+We will later have a list, \fontlist@, in the form of TB, p. 378,
+that is supposed to list all the fonts used.  To make sure that any
+fonts loaded are added to this list, instead of \font we use \font@,
+which is defined later.  When we load in fonts for a family we also
+want to use \newfam to create the family name, but \newfam is \outer,
+so we would need an inner version, or the code itself.  But there is
+another problem here; we want the allocations we make to use the
+present definition of \alloc@, for proper use of \showallocations. So
+we use \alloc@@ for the present meaning, and then write the code for
+\newfam in terms of \alloc@@.
+
+
+\def\hexnumber@ ...
+-------------------
+We will need to use various family numbers in \mathchar and
+\mathchardef's.  But we need the hexadecimal values if any family is
+greater than 9, so we use \hexnumber@ to get it. An \ifcase is most
+efficient here.
+
+In addition to the family number of new families that we will load,
+we will also need to use the family number of the family \bffam, so
+we use \bffam@ to stand for its hexadecimal number.  We \edef\bffam@,
+rather than \def'ing it, so that if someone is loading in AMSTEX.TEX,
+instead of using a format file, succeeding definitions will take less
+time.
+
+\loadmsam and \loadmsbm set flags to say they are loaded, declare the
+necessary fonts, create the corresponding new families, assign the
+fonts to these families, and create \msam@ and \msbm@ for the
+hexadecimal numbers of these families.
+
+In addition, once the msam fonts are loaded we will let
+\dashrightarrow, ..., \dasharrow (which use \dabar@), and \ulcorner,
+..., \maltese be defined, because they are defined specially. All
+other symbols can be handled by \newsymbol, explained below.
+
+Similarly, we will redefine plain's \widehat and \widetilde to take
+advantage of wider symbols in the msbm fonts, but these will not be
+used unless the msbm fonts are loaded.
+
+
+\newsymbol
+----------
+We don't want \loadmsam or \loadmsbm to introduce names for all the
+symbols, since this will use up too many control sequence names
+needlessly. Instead we let \newsymbol be used in the form
+
+         \newsymbol\nleqslant 230A
+
+or, more generally,
+
+         \newsymbol\cs 230A
+
+where \cs is the user's choice of a control sequence, and the
+4-character ``ID'' 230A should be listed along with the ``standard''
+name \nleqslant in the list of symbols. The first character of this
+ID will be 1 for symbols on the msam fonts, and 2 for symbols on the
+msbm fonts.
+
+For \newsymbol we first \define the control sequence to be empty, to
+get an error message if it is already defined.  Then we let \next@ be
+\relax, but change \next@ to \msamfam@ if #2 is 1 and the msam fonts
+are loaded or to \msbmfam@ if #2 is 2 and the msbm fonts are loaded.
+Then, if \next@ is still \relax we give error messages; otherwise we
+do a \mathchardef, using the values of \next at .
+
+
+\UseAMSsymbols
+--------------
+For people who want to use the AMS's names, \UseAMSSymbols will
+\input the file amssym.tex.
+
+This file begins with \catcode`\@=11 (so that it can use the tests
+\ifmsamloaded@, \ifmsbmloaded@).  If these families are loaded, it
+uses \newsymbol with the standard names for all the symbols on the
+fonts.  However, it does this within a group where \globaldefs=1 so
+that these names will be globally made, even if \UseAMSsymbols is,
+for some reason, used within a group. We must \undefine
+\rightleftharpoons, \angle, and \hbar before using them with
+\newsymbol, since they are already defined.
+
+At the end, the file makes @ \active again.
+
+If the families aren't loaded we give error messages, and we also
+first add \catcode`\@\active, so that @ will be certain to be active.
+
+
+If the \msbfam is loaded, we can use \Bbb, just like the other font
+change instructions; like \Cal, it has \noaccents@, which will be
+explained later.
+
+
+Though defined here, \loadmsam, \loadmsbm and \loadeufm must actually
+appear later, after \font@ has been defined.
+
+
+\frak has been added for changing to the \eufmfam in math mode.
+Similarly, any other added families of fonts should be treated like
+this, if their characters are basically just specified by typing
+letters.
+
+\goth is just a convenient alternative for \frak.
+
+
+\ifcmmibloaded@ ...
+-------------------
+Next comes the mechanism for loading the two families of bold fonts,
+cmmib and cmbsy.  We will have a single control sequence \loadbold
+for loading both, but separate flags for telling when each family is
+loaded (so that users who know what they are doing and who decide to
+load only one family [or only certain sizes of a family] can still
+use subsequent control sequences).
+
+\mathchari@, \mathcharii@ simply give \mathchar's if the first,
+respectively second, family of bold symbols is loaded, otherwise
+error messages.
+
+
+\boldkey
+--------
+\boldkey basically has to test all the various possiblities for
+``keys'' that come after it.
+
+We can test for a letter by using \ifcat\noexpand#1A; in this case we
+just use #1 in \fam\cmmibfam if it is loaded, and give an error
+message otherwise.
+
+Otherwise, we first test individually for !  ( ) + : ; = ?  [ ] and
+use the appropriate symbol on the \bf fonts.
+
+After this test, we test individually for , - .  / < > * | and use
+the appropriate symbol on the appropriate bold fonts, specifying them
+with \mathchari@ or \mathcharii@, to get error messages if the fonts
+aren't loaded.
+
+Finally, we test for the digits 0, ..., 9, and simply replace them
+with \bold0, ..., \bold9, already defined (\boldkey isn't supposed to
+be used with digits, but if it is we might as well revert to \bold).
+
+
+\def\boldsymbol ...
+-------------------
+\boldsymbol is much more complicated, since we will have to look at
+\meaning.
+
+We begin by defining \next@ to be an error message; it will be
+changed to \relax whenever we reach a case where \boldsymbol can be
+used. (Eventually, alternate error messages may be defined.)
+
+Again, we first test for letters, and use \fam\cmmibfam in this case,
+unless this family isn't loaded, in which case we just give a special
+error message (and let \next@ be \relax, so that the original error
+message isn't given).
+
+Then we do some of the same manipulations with \meaning#1 as in
+\dots. If we had a \mathchar, we will use \boldsymbol@@ on the value
+of \meaning@ (instead of the \getmathch at ...\getmathch@ from \dots).
+
+Some of the things we want to use with \boldsymbol are defined as
+delimiters, so if we don't have a \mathchar, we have to use \macro@
+from \dots, together with a new construction \delim@, defined below,
+to see if this is the case, and if so, we will use \delim@@ with
+\meaning at .
+
+Finally, if none of these tests are passed, we will still use a final
+test, \boldsymbol@, for certain exceptional symbols.
+
+
+\mathhexboxii@ is just \mathhexbox@ for the cmbsy family, but an
+error message if this family isn't loaded.
+
+\boldsymbol@, the final check, just examines individual possiblities,
+and defines the result in terms of \mathcharii@ or \mathhexboxii@ or
+\bffam@, in the case of \lbrack and \rbrack (if they are used instead
+of [ and ], which would be used with \boldkey.)
+
+
+\boldsymbol@@#1.#2\boldsymbol@@ is going to be applied
+where #2 are the remaining .'s from \meaning@, and #1 is
+the hexadecimal number after the \mathchar.
+
+%1.  We set both \classnum@ and \count@@@ to #1.
+
+%2.  We divide \classnum@ by 4096 to get the first hexadecimal
+     digit (first from the left), and set \count@ to this value.
+
+%3.  Then we multiply \count@ by 4096, and subtract from the
+     original value, \count@@@, so that \count@@@ now has the
+     value of last three hexadecimal digits.  We also set
+     \count@@ to this value.
+
+%4.  Then we divide the new \count@@@ by 256 to get the second
+     hexadecimal digit, which we store in \count at .
+
+%5.  Then we multiply the second hexadecimal digit, \count@@@,
+     by 256 and subtract from \count@@, which still has the
+     value of the last three hexadecimal digits, so that
+     \count@@ now has the value of the last two hexadecimal
+     digits.
+
+%6.  Then we divide \count@@@ by 256 again, so that it has the
+     value of the second hexadecimal digit.
+
+%7.  Finally, we multiply \classnum@, the first hexadecimal
+     digit, by 4096 again and add \count@@, the last two
+     hexadecimal digits to it.  So if the hexadecimal digit was
+     "abcd, \classnum@ is now "a0cd, and \count@@@ = b.
+
+%8.  Now, if \count@@@ = 0, so that our symbol came from family
+     0 (i.e., the roman fonts, which should mean that our symbol
+     was one of \Gamma, ..., \Omega), we want to use the
+     corresponding symbol in the \bf family, which means that it
+     is \mathchar"axcd, where x is the number for \bffam, so we
+     get this by adding 256 times the hexadecimal number \bffam@
+     to \classnum@, and then using \mathchar\number\classnum at .
+
+%9.  On the other hand, if \count@@@ = 1, so that our symbol
+     came from family 1 (i.e., the math italic fonts), then we
+     want to use the corresponding symbol in the cmmib family,
+     so we add 256 times the hexadecimal number \cmmibfam@ to
+     \classnum@ and use \mathchar\number\classnum@, except that
+     we give an error message if these fonts aren't loaded.
+
+%10. Similarly if \count@@@=2 (in which case our symbol came
+     from family 2 (i.e., the math symbol fonts).
+
+
+\newif\ifdelim@ ...
+-------------------
+\delim@#1\delim@ sees if #1 starts with \ d e l; if so, it makes
+\ifdelim@ true and sets \meaning@ to be the rest.
+
+When \delim@@#1"#2#3#4#5#6\delim@@ is used, #2 will be the type of
+delimiter, #3 will be the font family the symbol occurs on, "#4#5
+will be the location of the symbol on the font, and #6 will be
+everything else (i.e., the large variant, if there is one).  If #3
+isn't the second family, we stick with the original error message
+that \boldsymbol can't be used with this symbol; otherwise we let
+\next@ be \relax, so that we won't get this error message, and then
+either produce the symbol, with \mathcharii@#2#4#5, or else give an
+error message if the family isn't loaded.
+
+
+\vert, \Vert (and \|) and \backslash have to be redefined so that the
+initial hexadecimal digit 0 is specifically added, in order for the
+definition of \delim@@ to work (plain simply leaves out the 0).
+
+
+\boldkeydots@#1 and \boldsymboldots@#1 are called if \dots is
+followed by \boldkey or \boldysmbol.
+
+In both cases, we first make \ifbold@ true, and then set \next to be
+#1.  The value of \next will be used by \mdots@@ to decide whether to
+use \dotso@, etc.  If \dotso@ is used, then we need to reset \next to
+#1, for use by \ifextra@, so we first store #1 in \delayed@, and
+include \let\next\delayed@ in the definition of \dotso at .  After the
+dots are put in by \mdots@@, we then put in the right symbol with
+\boldkey#1 or \boldysmbol#1, and finally set \ifbold@ to be false
+again.
+
+On subtle point: in \boldkeydots@, the = after \let\next and
+\let\delayed@ are required, because #1 might be = , in which case it
+would disappear, so that \next would be set to \let, or \delayed@ to
+\mdots@@, etc., resulting in no end of mischief.
+
+
+\newif\ifeufbloaded@ ... \newif\ifeurbloaded@ ...
+-------------------------------------------------
+The next five sets of definitions make it easy to load the rest of
+the Euler fonts, one at a time, when needed.  The user should take
+care not to try to load too many at once, as TeX's limit of 16
+families cannot be changed.
+
+
+\def\accentclass@, ..., \makeacc@\bar
+-----------------------------------
+We change the definition of \hat, etc., so that constructions like
+\bold{\hat A} will use the bold \hat symbol. But we want \Cal{\hat A}
+and \Bbb{\hat A} to use the usual \hat symbol, since these fonts
+don't have accent characters.  That is why we added \noaccents@ to
+the definitions.  The strategy is to change \hat from
+\mathaccent"705E to \mathaccent"\accentclass at 05E, where \accentclass@ is
+usually 7, but is redefined as 0 when \noaccents@ is in force. To
+save space we use \makeacc@ to produce these definitions.
+
+
+\vec is different, as the accent itself is on only one font
+(\textfont1).
+
+
+\newcount\skewcharcount@, ..., \def\theskewchar@
+------------------------------------------------
+Now come definitions of \Hat, etc., which will get double accents
+correctly positioned.  After \dots, these are the most complicated
+things in AmS-TeX.
+
+TeX properly places single accents over letters in math mode by using
+the kern, s, between the letter, L, and the \skewchar for its font
+(TB, p. 443); we have to emulate this procedure.  The results of the
+instructions in Rule 12 on p. 443 can be obtained by replacing L by
+{L\hskip 2s}, putting (i.e., centering) the accent over this box, and
+then adding \hskip-2s.
+
+This means, first of all, that we have to find the \skewchar of the
+font.  The \skewchar is -1 or '177 for the fonts in plain, but might
+be anything; however, we assume that the \skewchar for all the fonts
+in any particular family are the same.  Moreover, we assume that the
+kerns are proportional in different size fonts within a family, so
+that the kern in the \textfont for the family is all we need to know.
+(This seems to give quite adequate results for the Computer Modern
+fonts.)
+
+The control sequence \theskewchar@ globally sets \skewcharcount@ to
+the \skewchar for the family if it is between 0 and 127, and to -1
+otherwise.  We use \global because \theskewchar@ will be used within
+an \hbox.  If the \skewchar is between 0 and 127, \theskewchar@ will
+also produce the \skewchar character for the font. This character can
+be obtained as \mathchar....  where .... is (the \skewchar for the
+family) + (256 times the family number) + (4096 times the class),
+where we should take the class to be 7 (variable), so that \mathchar
+will select whatever family we are in.
+
+TeX always sets \fam to -1 at the beginning of a formula.  This means
+that we should assume that our character is in family 1 (where the
+ordinary letters lie), unless \fam has a different value between 0
+and 15.
+
+%1 First assume that \fam=-1, so that our letter is in family 1, and
+   set \familycount@ to 1, and set \skewcharcount@ to the \skewchar
+   for family 1.
+
+%2 But if \fam has a legal value, between 0 and 15, so that our
+   letter is in this \fam, set \familycount@ to this value, and
+   \skewcharcount@ to the \skewchar for this \fam.
+
+%3 If \skewcharcount isn't between 0 and 127, just set
+   \skewcharcount@ to -1.  Otherwise add 256 times \familycount@ to
+   the \skewchar, and then add 28672 (= 7 x 4096), and produce this
+   \mathchar.
+
+
+\newcount\pointcount@, \def\getpoints@
+--------------------------------------
+The construction \getpoints at ...\getpoints@ will be applied to things
+like \the\dimen0.  If \the\dimen0 is 23.456pt, \pointcount@ will be
+set to 23, the integer number of points in \dimen0.  The use of . in
+the syntax for \getpoints@ is OK, since constructions like
+\the\dimen0 always produce the decimal point.
+
+
+\newdimen\accentdimen@, ..., \def\dimentomu@
+--------------------------------------------
+Eventually, we will use \theskewchar@ to store the kern between our
+letter and the \skewchar in a dimension register \accentdimen at .  We
+will use the control sequence \dimentomu@ to convert this to mu's and
+store the number of mu's in a counter \accentmu@, so that we can use
+\accentmu@ mu to get a kern that varies appropriately with the style
+of the formula.
+
+Essentially, we want to multiply the number of points by 1.8, since
+there are 18 mu in 10 points.  Since we are going to deal in whole
+numbers, we will actually multiply by 1800 and divide by 1000.  In
+the definition below, multiplying \accentdimen@ by 100 first lets
+\getpoints return a good value.
+
+
+\def\Makeacc@
+-------------
+Finally, we are ready to produce \Hat, etc., with \mathaccent@, the main
+thing left for us to define.  As with ordinary accents, we use a
+control sequence to abbreviate the constructions, and incorporate
+\accentclass@ to take care of the case where letters come from a font
+that doesn't have accent characters.
+
+
+\unbracefonts@ temporarily changes the meanings of \rom, \bold, etc.,
+so that the extra pair of braces isn't included.
+
+
+\def\mathaccent@
+----------------
+
+%1 First we store the current family in \thefam@; as usual, it is set
+   to 1 if it is -1, i.e., if \fam hasn't been changed yet.
+
+%2 We initialize \accentdimen@ to 0pt; it may have been changed by a
+   previous \Hat, etc.
+
+%3 Now we set the formula #2 in the current family (and in
+   \textstyle).  \unbracefonts@ isn't really important here, but we
+   put it in for consistency, since it will be needed in a
+   corresponding box later on.
+
+   Although we initialized \accentdimen@ to 0pt, it may have changed,
+   because #2 might already involve a \Hat, etc. In fact, we will
+   later arrange explicitly for this to happen in such a case.
+
+%4 If \accentdimen@ hasn't changed, the accent is simple.
+
+%5 But we will globally make \accentdimen@ different from 0pt, so
+   that a \Hat applied to this new accented character will be treated
+   differently, via the clause after the final \else in this
+   definition.  Moreover, we will globally set \accentmu@ to the
+   number that we want to be used for this new accented character:
+
+   %5a \box1 is the formula #2 followed by the \skewchar for the font
+       (or by nothing, if the \skewchar isn't between 0 and 127).
+       Here \unbracefonts@ is needed if #2 is something like \bold X:
+       we don't want the extra braces around the \fam\bffam X,
+       because we want \fam to be \bffam when \theskewchar@ does its
+       thing.
+
+   %5b \box2 is the \skewchar alone (or nothing). It is in the right
+       family, because \skewcharcount@ was most recently globally set
+       in box 1.
+
+   %5c \accentdimen@ is now the kern between #2 and the \skewchar.
+
+   %5d We double it, change to mu's, and add 1 for good measure.
+
+%6 If we're in the case where \accentdimen@ was changed, we use the
+   value of \accentmu@ that was created to properly position the
+   accent.  We make the whole result an ordinary symbol, and add an
+   empty group so that things like \Hat{\Hat A}^2 will work OK.
+
+
+\Makeacc@ ...
+-------------
+Now we make all these accents.
+
+
+\Vec is special, as with \vec.
+
+
+\def\newbox@, \def\accentedsymbol
+---------------------------------
+We want \accentedsymbol to create a \newbox to store the symbol.
+Since \newbox is \outer, we need an inner version (we can't simply
+use the code, because we are going to be using it after
+\expandafter).
+
+The \newbox created by \accentedsymbol\Ahathat{\Hat{\Hat A}} will
+just be called \Ahathat at box, which we create with
+\csname...\endcsname.
+
+
+\def\sqrt ...
+-------------
+\radical, \underline and \overline are like ^ and _ : they operate on
+the next <math field> rather than on the next macro argument (TB, p.
+291).  So, for example, \underline\noteq becomes \underline\not=
+which underlines only the \not, and \underline\notin gives mysterious
+error messages.  To avoid this, we redefine \sqrt, \underline and
+\overline as control sequences with arguments.
+
+
+\Invalid@\leftroot, .., \def\plainroot@
+---------------------------------------
+\root will have both \leftroot and \uproot as possible parts of its
+syntax.  The definition is messy because we allow them to occur in
+either order. We also have to worry about skipping over spaces after
+a right brace after \leftroot{...} or \rightroot{...}.  The net
+result of all the mess is simply to assign values to the counters
+\uproot@ and \leftroot at .
+
+\root actually begins working with the code on the last line: it
+starts a group (to keep the values of \uproot@ and \leftroot@ local,
+for \root's within \root's), initially sets \uproot@ and \leftroot@
+to 0, and after \uproot@ and \leftroot@ have been properly assigned,
+it calls \plainroot@, which is almost exactly the same as plain's
+\root, except the \mathchoice involving \r@@t has to be written out,
+rather than using \mathpalette, in order to get the final \egroup in
+the right place.
+
+And \r@@t is like plain's \r@@t, except that we add corrections for
+the values of \uproot@ and \leftroot at .  For \leftroot@ we simply
+change the \mkern-10mu between the root and the main quantity by
+\mkern-10mu\mkern\leftroot@ (i.e., we leave more room between them,
+since \leftroot@ is the amount to move the root to the left); we have
+to correct for this extra shift with \mkern-\leftroot@ mu at the
+beginning.
+
+\uproot@ is handled a little differently, since mu is a unit for
+horizontal distances, not vertical ones. We set a box of width
+w=\mskip\uproot@ mu, and increase \dimen@, the amount involved in
+raising the root, by 10/6 w. (Then, since we raise by .6\dimen@, the
+extra amount we are raising is w.)
+
+
+\boxed makes a box with rules of width .4\ex@ (so .4pt at 10 points),
+and we want its baseline to be the baseline of the original formula.
+The \vbox on lines 3--5 of the definition surrounds \box0, the
+original formula in \displaystyle, with three points of space and the
+rules on all sides. It is now too high by 3pts + .4\ex@ + depth of
+\box0 (since the construction \vbox{\vskip3\ex@\box\z@\vskip3\ex@}
+produced a box of depth 0).  So we lower by that total amount.
+
+
+\let\amspersand@\relax
+----------------------
+Now come commutative diagrams.  The diagrams themselves aren't much
+of a problem, and the interesting things are the arrows within them.
+It is pleasant that one can avoid using & in commutative diagrams, by
+having the arrows put the &'s in themselves; the only problem is that
+the same construction used for horizontal arrows in commutative
+diagrams is also supposed to work for individual arrows in math mode.
+The way to do this is to have the macros contain \ampersand@ in the
+right places, where \ampersand@ is usually \relax, but can be changed
+to & within a commutative diagram.
+
+
+\newdimen\minaw@ ...
+--------------------
+We also want the arrow constructions to give different lengths for
+arrows within commutative diagrams and for individual arrows in math
+mode (except that in either case the arrows will get longer, if
+necessary, when they have formulas above and/or below them).  We
+store the minimum length for individual arrows in math mode in
+\minaw@, and the minimum length for arrows in a commutative diagram
+in \minCDaw at .
+
+\minaw@ is made 11.11128\ex@ (i.e., 11.11128pt). I can't remember
+where I got this from! Probably the dimension of some symbol.
+\minCDaw is made 2.5pc.
+
+
+\minCDarrowwidth allows user to change the minimum length, provided
+we are in a displayed formula.
+
+
+\CD and \endCD are similar to \matrix and \endmatrix. Of course,
+there are no category code changes, nor any extra space (and so no
+\null), and we make the baselineskip bigger. But we also want to
+\let\ampersand@=&, so that the arrow macros will produce the &'s.  As
+with \Let@, we have to hide this within \iffalse{\fi...\iffalse}\fi.
+We also set a flag, \ifCD@, to tell the arrow macros they are in a
+\CD (and hence should have longer length).
+
+
+\endCD just supplies the necessary \cr and }'s.
+
+
+\newdimen\bigaw@
+----------------
+Now we are ready for the arrows themselves.  We store the actual
+length that an arrow will be in \bigaw at .  Since the arrows are of the
+form @>>>, etc., we use \atdef@ to define them.
+
+
+@>#1>#2>#3>
+-----------
+
+%1  Arrow starts with & in a \CD.
+
+%2  \box0 has formula above the arrow, with suitable spacing around
+    it (\;\; at end to clear arrow head).
+
+%3  \box1 has formula below the arrow, with suitable spacing.
+
+%4  \box2 is just the part below, because we will do things
+    differently if there is no formula below.
+
+%5  If we are in a \CD, \bigaw@ is initially \minCDaw@, otherwise
+    \minaw at .
+
+%6  If formula above or below the arrow is bigger than \bigaw@,
+    change \bigaw@ to the maximum of these widths.
+
+%7  Extra space goes before the arrow in a \CD.
+
+%8  If there is something to go below the arrow, make an arrow of the
+    right length, with \rightarrowfill, make it a \mathop, so we can
+    use \limits to put the formulas above and below (the positioning
+    this provides isn't ideal, so it would probably be better to use
+    a more explicit construction here), and then make the resulting
+    arrow a \mathrel.
+
+%9  If nothing goes below, don't bother with the lower limit (so that
+    unnecessary space below isn't produced).
+
+%10 Extra space goes after the arrow in a \CD.
+
+%11 Arrow ends with & in a \CD.
+
+
+@<#1<#2<#3< is exactly analogous.
+
+
+@)#1)#2)#3), @(#1(#2(#3( are for foreign keyboards that don't have
+< and > available (because they are used for { and }, which are
+instead \AA and \aa).
+
+
+ at A#1A#2A, @V#1V#2V
+------------------
+Vertical arrows don't need to bother with \ampersand@, since they are
+only used in \CD's.  Notice that the space after \atdef@ is necessary,
+although space after @ in @A... and @V... won't be necessary later!
+
+
+@= is special, and used only in a \CD.
+
+
+@| is also used only in a \CD.
+
+
+\atdef@@\vert
+-------------
+We have to allow @\vert as a synonym, but this needs \atdef@@ instead.
+
+
+\pretend...\haswidth... is just a lot of syntax for a simple
+construction.
+
+
+\pmb is basically as in TB, p. 386, except that in math mode we use
+\mathpalette\pmb@, so that the symbol will change size.  In addition,
+we want \pmb to keep binary relations and operators of the same type.
+We already have \binrel@, to start testing if something is of one of
+these two types, and we define \binrel@@ to complete things by making
+a \mathbin or \mathrel of the result.
+
+The final detail involves the amount to move the three copies that we
+are going to superimpose on each other.  We want to use mu's rather
+than points or ems.  Since 1em=18mu, we have .025em= .45mu, so we use
+-.45mu instead of .025em, and -.9mu instead of .05em.  And since
+.0544em =.7794mu, we set a box with this width, and raise by that
+width (we store the width in the dimen register \pmbraise@ to be sure
+that \box4 doesn't happen to get used somewhere in between).
+
+We use \box3 in the definition of \pmb@ because \binrel@, used later,
+involves \box0 and \box1.
+
+
+\documentstyle is similar to LaTeX.
+
+
+\font\dummyft@ ...
+------------------
+For syntax checking, we need the dummy font (TB, p. 401). Since the
+dummy.tfm's available don't seem to have all the \fontdimen's they
+need, we explicitly set them right.
+
+
+\def\fontlist@
+--------------
+We need a list of all the fonts that are used, in the form of TB,
+p. 378, so that we can set them all to \dummyft at .  First we list all
+the fonts already used.
+
+
+\font@ is to be used instead of \font, so that when new fonts are
+loaded in they will be added to the list.
+
+
+At this point we can add
+
+         \loadmsam
+         \loadmsbm
+         \loadeufm
+
+
+\dodummy@ sets all fonts to \dummyft@
+
+
+\def\nopages@
+-------------
+We will want to say \newtoks\output (TB, p. 401) within this control
+sequence.  Since \newtoks is \outer, we will simply use the code
+instead.
+
+
+\ifsyntax@ is used to record the fact that \syntax was used. This
+might be needed by AMSPPT.STY.
+
+
+\newcount\countxviii@, \def\syntax
+----------------------------------
+To get syntax checking we also have to set \textfont0=\dummyft@, etc.
+We have to do this for all families, and the number of families is
+stored in \count18.  The counter \countxviii@ is used to start with
+this value, and decrease in a \loop.
+
+%1 For syntax checking, we set \syntax at true, for use by AMSPPT.STY,
+   set all fonts to \dummyft@, with \dodummy@, set all \textfont's,
+   etc., to \dummyft@, using the \loop construction, and then do
+   everything else.
+
+
+\S@, \G@ and \P@ are used to check if S, G or P (or lowercase
+versions) were typed at the keyboard.
+
+
+\printoptions is a \loop that keeps insisting on an answer until S or
+s or G or g or P or p was typed at the keyboard.  S chooses \syntax,
+G chooses \galleys, P just processes things as usual.
+
+%1 This converts the answer to uppercase (TB, p. 331).
+
+
+\def\alloc@
+-----------
+We now change \alloc@, since there are no further allocations in the
+file (or in AMSPPT.STY) that might have to be kept out of the log
+file.  The new definition will write things in the log file only if
+\showallocations is used, so that \ifalloc@ is true.
+
+
+\document doesn't really do much in AmS-TeX---it was just put in to
+correspond to LaTeX.  But at this point we might as well clear out
+\alloclist@ and \fontlist@, since anything in them will have been
+acted on by now.
+
+
+\enddocument, similarly, is just \bye, though AMSPPT.STY will make it
+considerably more complicated.
+
+
+\plainproclaim, \plainfootnote store plain's \proclaim and \footnote,
+which have different syntax from \proclaim and \footnote in
+AMSPPT.STY.
+
+
+\proclaim and \footnote themselves are made undefined, until a style
+file, like AMSPPT.STY, defines them.
+
+
+\= is also made undefined, since \B has been provided, and goes
+better with \b [to correspond to \D and \d, where \d had to be added
+since \. was redefined].
+
+
+\cal, \mit and \oldstyle are made undefined also, since this method
+of changing fonts is not used in AmS-TeX.
+
+
+The last thing is to make @ active.
+
+
+**********************************************************************
+
+HERE IS A SUMMARY OF ALL PLACES WHERE SPECIFIC VALUES USED IN THIS FILE
+  MIGHT NEED TO BE REPLACED, BECAUSE OF DIFFERENT FONTS, STYLES, ETC.
+
+ \sdrd@, \drsr@, \sldl@, \dlsl@
+ \captionwidth@
+ \ex@
+ spacing for \:
+ \initic@, \negintic@, and possibly \intkern@
+ spacing for \varinjlim, \varprojlim, \varliminf
+ \baselineskip and \lineskip for \smallmatrix
+ possibly \dotsspace@
+ format for \cases
+ \strutbox@
+ \tagform@
+ value of \interdisplaylinepenalty set by \allowdisplaybreaks
+ \multlinegap@
+ \multlinetaggap@ (and perhaps rule for setting tag separately on a
+   \multline)
+ spacing for \bmod, \pmod, \pod, \mod
+ \kern's for \overrightarrow, etc.
+ \dotso, \dotsb, \dotsm, \dotsc
+ spacing in \dddot, etc.
+ \mathsurround within the definition of \text@@ (\text outside of math),
+   in case it is set to a non-zero value in general.
+ \textdef@@
+ \scriptfont\itfam, etc.
+ \minaw@ and \minCDaw@
+ \baselineskip, \lineskip, and \lineskiplimit in \CD
+ the positioning of labels above and below arrows
+ the size of the symbols given by @= and @|
+ activation of \loadmsam, etc.
+
+**********************************************************************


Property changes on: trunk/Master/texmf-dist/doc/amstex/base/amstex.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/amstex/base/amstinst.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/amstex/base/amstinst.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/amstex/base/amstinst.pdf	2019-01-24 22:12:49 UTC (rev 49809)
+++ trunk/Master/texmf-dist/doc/amstex/base/amstinst.pdf	2019-01-24 22:19:50 UTC (rev 49810)

Property changes on: trunk/Master/texmf-dist/doc/amstex/base/amstinst.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/doc/amstex/base/amstinst.ps.gz
===================================================================
(Binary files differ)

Deleted: trunk/Master/texmf-dist/doc/amstex/base/joyerr.tex
===================================================================
--- trunk/Master/texmf-dist/doc/amstex/base/joyerr.tex	2019-01-24 22:12:49 UTC (rev 49809)
+++ trunk/Master/texmf-dist/doc/amstex/base/joyerr.tex	2019-01-24 22:19:50 UTC (rev 49810)
@@ -1,512 +0,0 @@
-%% @texfile{
-%%     filename="joyerr.tex",
-%%     version="2.1",
-%%     date="8-MAY-1991",
-%%     filetype="AMS-TeX: user documentation",
-%%     copyright="Copyright (C) American Mathematical Society,
-%%            all rights reserved.  Copying of this file is
-%%            authorized only if either:
-%%            (1) you make absolutely no changes to your copy
-%%                including name; OR
-%%            (2) if you do make changes, you first rename it to some
-%%                other name.",
-%%     author="American Mathematical Society",
-%%     address="American Mathematical Society,
-%%            Technical Support Department,
-%%            P. O. Box 6248,
-%%            Providence, RI 02940,
-%%            USA",
-%%     telephone="401-455-4080 or (in the USA) 800-321-4AMS",
-%%     email="Internet: Tech-Support at Math.AMS.org",
-%%     codetable="ISO/ASCII",
-%%     checksumtype="line count",
-%%     checksum="512",
-%%     keywords="amstex, ams-tex, tex",
-%%     abstract="This file contains errata to The Joy of TeX, 
-%%            1986 edition. It must be run with AMSTEX and AMSPPT
-%%            2.0+; it is incompatible with previous versions.
-%%            It also requires the file AMSSYM.TEX and the fonts
-%%            MSAM10 and MSBM10."
-%%     }
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\input amstex
-\documentstyle{amsppt}
-
-\define\lastupdate{15 October 89}
-
-\pagewidth{29pc}
-\raggedbottom
-\tenpoint
-
-\def\JoT{{\sl The Joy of \TeX}}
-
-%  Support verbatim listing of TeX source, as defined in TeXbook, p. 421;
-%  lifted from MANMAC.TEX, and modified slightly for narrower columns.
-\catcode`\@=11
-
-\chardef\other=12
-\def\ttverbatim{\begingroup \catcode`\\=\other
-  \catcode`\{=\other \catcode`\}=\other \catcode`\$=\other
-  \catcode`\&=\other \catcode`\#=\other \catcode`\%=\other
-  \catcode`\~=\other \catcode`\_=\other \catcode`\^=\other
-  \catcode`\"=\other
-  \obeyspaces \obeylines \hyphenpenalty=10000 \tt}
-
-\newskip\ttglue
-{\tenpoint\tt \global\ttglue=.5em plus .25em minus .15em}
-% this should be installed in each font
-
-%  From David Eppstein's ``Trees'' paper (TUGboat 6#1), preserve initial
-%  spaces.
-{\obeyspaces\gdef {\ifvmode\indent\fi\space}}
-
-%  Permissible overhang beyond right margin.
-\newdimen\ttrightskip
-\ttrightskip=5pc
-   
-%  Although | is ordinarily an escape character within verbatim mode,
-%  provide a method for letting it instead be the character itself
-%  within a display verbatim listing, as needed; this is based on
-%  a technique developed by Michael Ferguson.  Note that within one
-%  \begintt...\endtt block, | can be only one of:
-%       the printing | character, or
-%       active (the escape character)
-%  It cannot perform both functions at the same time.
-\newif\ifttVertChar     \ttVertCharfalse
-{\catcode`\|=\active \gdef\VertChar{\def|{\char"7C }}}
-
-%  Other non-tt elements that may be embedded within \begintt...\endtt .
-\def\MTH{$}
-\def\sb{_}
-\def\sp{^}
-\def\SP{{\tt\char"20 }}         % "visible" space
-\chardef\bs=`\\
-\def\vrt{{\tt\char`\|}}
-
-\catcode`\|=\active
-{\obeylines \gdef\activatettbar{\global\catcode`\|=\active %
-  \gdef|{\ttverbatim \spaceskip\ttglue \xspaceskip\ttglue %
-         \let^^M=\  \let|=\endgroup}}}
-\activatettbar
-
-\catcode`\@=13
-
-\def\ttindent{\noindent\kern3\parindent\hangindent3\parindent}
-
-%  This definition is stolen from the file of TeXbook errata.
-\def\bugonpage#1(#2) \par{\bigbreak\tenpoint
-  \hrule width\hsize
-  \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize
-  \nobreak\medskip}
-
-%  Some definitions for setting particular Joy notation.
-\def\CR{$\langle$carriage-return$\rangle$}
-\def\tab{{\smc tab}}
-
-\NoBlackBoxes
-
-\topmatter
-\title Errata to \JoT{} prior to \AmSTeX{} 2.0\endtitle
-\endtopmatter
-
-\document
-
-\noindent
-This list of corrections to \JoT, 1986 edition, includes all known
-corrections that preceded the release of \AmSTeX{} Version 2.0.
-Reprints with corrections may already incorporate some or all of
-these changes.
-
-The printing date of each copy of \JoT\ is identified on the reverse
-of the title page.  The list below will permit you to determine
-which corrections have not already been incorporated in your copy of \JoT.
-
-\smallskip
-\halign{\kern 30pt #\hfil\qquad&#\hfil\cr
-First printing, 1986 & all changes\cr
-Second printing with corrections, 1986 & changes after 11/25/86\cr
-Third printing with corrections, 1987 & changes after 5/12/87\cr}
-\smallskip
-
-For differences between earlier versions of \AmSTeX{} and Version 2.0,
-see the {\bf User's Guide to \AmSTeX{} 2.0}.
-The second edition of \JoT{}, 1990, contains all changes in this list
-as well as new material for \AmSTeX{} 2.0.
-
-(This errata list was last updated \lastupdate.)
-
-
-\bugonpage 12, line 12 (11/11/86)
-
-\noindent
-What output is produced by |\$\|\SP|\|\SP|1.00| and by |\$|\SP|\|\SP|1.00|?
-
-\bugonpage 22, line 28 (11/24/86)
-
-\line{will be some surprises in it---so you should go pick it up
-as soon as possible.\hfil}
-
-\bugonpage 26, line 9 (10/15/89)
-
-\line{uptight when you encounter an error message, because
-\TeX\ can always be coaxed}
-
-\bugonpage 39, line 4 (10/15/89)
-
-\line{words as evenly as possible.  But everyone knows that such
-bland perfection isn't}
-
-\bugonpage 39, line $-4$ (12/12/89)
-
-\line{allowed here also, to accommodate threesomes, foursomes, and
-even more perverse}
-
-\bugonpage 44, line $-10$ (12/12/89)
-
-\line{their own papers might prefer to leave these details to someone
-else, and even}
-
-\bugonpage 81, line 13 (10/25/89)
-
-\line{But don't use |\,| before an expression like $\dsize \frac{dy}{dx}$
-or before the $dx$ in $dy/dx$.}
-
-\bugonpage 88, line $-5$ (5/11/87)
-
-\centerline{\indent We derive the quadratic formula by
-``completing the square'':}
-
-\bugonpage 90, line $-4$ (10/15/89)
-
-\line{to the old style that they may be discomforted by the
-``improvements''.\hfil}
-
-\bugonpage 99, lines 15--16 (8/6/86)
-
-{\baselineskip 18pt
-\ttindent
-|$\varinjlim$                           |$\varinjlim$\newline
-|$\varprojlim$                          |$\varprojlim$\endgraf
-}%      end extra \baselineskip
-
-\bugonpage 108, line 11 (11/11/86)
-
-\ttindent
-|  &=(a+b)(a+b)^n=(a+b)|
-
-\bugonpage 109, line 6 (12/12/89)
-
-\line{when tags are set on the right.  What input do you think you
-should use?\hfill}
-
-\bugonpage 109, line $-14$ (10/15/89)
-
-\line{so that the |=\bigl[| is aligned with the invisible |\qquad|.
-Notice, again, that such}
-
-\bugonpage 113, line 1 (4/10/86)
-
-\line{And there's |\bmatrix...\endbmatrix| to get brackets
-  |\left[...\right]| around}
-
-\bugonpage 127, line 11 (7/13/87)
-
-\line{\indent If you're an experienced mathematical typist you've
-probably already begun to}
-
-\bugonpage 129, lines 14--15 (10/15/89)
-
-\def\vector#1#2{(#1_1,\dots,#1_{#2})}
-\begingroup
-\hyphenpenalty=10000
-\noindent
-with things like $\vector xm$,
-$\vector y{n+1}$ as well.  Explain how to define |\vector| so that we can
-type these as |$\vector xm$| and |$\vector y{n+1}$|.
-
-\endgroup
-
-\bugonpage 129, last 3 lines (10/15/89)
-
-\noindent
-In Exercise 19.20 we defined |\vector| so that
-|$\vector xn$| produces $\vector xn$, etc.  But perhaps you don't like this, 
-perhaps you'd prefer to type |$\vector nx$|, with the `|n|'
-first, and the `|x|' second.  How can you arrange this?
-
-\bugonpage 131, lines 10--11 (10/15/89)
-
-\begingroup
-\noindent
-How would you |\define| the control sequence |\vector| so that
-you type |$\vector x,n.$| to get $\vector xn$, and |$\vector y,m+1.$| to get
-$\vector y{m+1}$, etc.
-
-\endgroup
-
-\bugonpage 144, line 16 (10/15/89)
-
-\line{\indent This command is ``global''---it affects everything
-that follows, even if it is in-}
-
-\bugonpage 162, line $-6$ (5/11/87)
-
-\line{if you typed |\footnote""{...}| then you  would get no marker
-at all, just a note}
-
-\bugonpage 171, line $-7$ (10/15/89)
-
-\line{too much, and only |\linebreak| will force \TeX\ to overcome
-its reluctance.\hfil}
-
-\bugonpage 176, line 4 (12/12/89)
-
-\line{about it, and an |&| is tolerated only in special situations.
-So you should remember}
-
-%  This feature has been reinstated in AMS-TeX 2.0.
-%\bugonpage 178, PAGE NUMBERS (11/14/86)
-%
-%Warning: |\nopagenumbers| does not at present work as advertised
-%with the |amsppt| style.  Consequently, this paragraph has been
-%deleted.
-
-%\bugonpage 178, between lines $-5$ and $-6$ (10/15/89)
-%
-%\line{\bf PAGE NUMBERS\hfil}
-%\vskip 2pt
-%\noindent If you are using the |amsppt| style and you type
-%|\nopagenumbers| at the beginning of the document (after the
-%|\documentstyle| line), the page numbers at the bottom of the page
-%will disappear.  Other styles probably will ignore |\nopagenumbers|.
-
-\bugonpage 179, line 4 (10/15/89)
-
-\line{change its position on the 8$\frac12$ by 11 sheet of paper.
-Typing\hfil}
-
-\bugonpage 180, lines 5--6 (10/15/89)
-
-\ttindent
-|   &=f'(x) = \frac1{2\sqrt x}\qquad|\newline
-|    \foldedtext\foldedwidth{2in}{for some $x$ in $(k, k+1)$,|
-
-\bugonpage 181, line $-$4 (10/15/89)
-
-\line{should be included at the end of that displayed formula.\hfil}
-
-\bugonpage 182, line $-2$ (12/12/89)
-
-\line{argument'' feature of |\roster| (again compare with
-{\bf footnote}).  If you type}
-
-\bugonpage 186, line 13 (10/15/89)
-
-\line{commands are ``global''---they affect everything
-that follows even if used in a group}
-
-\bugonpage 189, line 21 (12/12/89)
-
-\line{will first be divided into lines of a certain length
-(3 inches less than the width}
-
-\bugonpage 195, lines 4, 11 (7/13/87)
-
-Change\qquad ``In addition to''\qquad to\qquad ``First we have''.
-
-\bugonpage 195, line $-1$ (12/12/89)
-
-\ttindent
-|... in a bibliography''.|
-
-\bugonpage 202, line $-6$ (12/12/89)
-
-\line{If `|etc.|' were typed instead of `|etc\.|' there would be a
-larger space after the}
-
-\bugonpage 208, line 12 (12/12/89)
-
-\line{it does in ordinary text.\hfil}
-
-\bugonpage 210, line 4 (12/12/89)
-
-\line{you'll get the two equations $a+b=c$ and $A+B=C$ displayed
-separately.}
-
-\bugonpage 212, line 6 (12/12/89)
-
-\line{If you press \CR, \TeX\ will continue merrily, and you will get
-$a^b{}^c$}
-
-\bugonpage 218, line $-6$ (7/13/87)
-
-\line{Of course, you weren't supposed to anticipate such after-the-fact
-corrections.\hfil}
-
-\bugonpage 222, answer to {\bf 14.11}, line 1 (10/15/89)
-
-\ttindent
-|We derive the quadratic formula by|
-
-\bugonpage 229, answer to {\bf 15.19}, lines 2--3 (10/15/89)
-
-\ttindent
-|$\operatorname{\text{\sl SO}}(n)$       |%
-        $\operatorname{\text{\sl SO}}(n)$\newline
-|$\operatorname{\text{\bf SO}}(n)$       |%
-        $\operatorname{\text{\bf SO}}(n)$
-
-\bugonpage 230, answer to {\bf 16.3}, lines 6--9 (10/25/89)
-
-\noindent
-to suppress any extra space that \TeX\ might put in.  (Actually,
-|...\tag{$**$}$$| happens to work correctly, but |...\tag{$***$}$$|
-would give the tag ($***$); rather than worrying about why this
-happens, just type |...\tag{${*}{*}$}$$|\linebreak
-and |...\tag{${*}{*}{*}$}$$| to be on the safe side.)
-
-\bugonpage 230, answer to {\bf 16.4}, line 3 (7/13/87)
-
-\ttindent
-|Q^l&=Q_1\biggl\{\sum_k(-1)^k(PQ_1-I)^k\biggr\}|
-
-\bugonpage 230, answer to {\bf 16.4}, line 6 (10/25/89)
-
-\ttindent
-|    Q_1\tag 1{${}_r$}|
-
-\bugonpage 231, answer to {\bf 16.6} (10/25/89)
-
-\noindent Line 2:
-
-\ttindent
-|\align \alpha_4&=\sqrt{\dfrac12}\\|
-
-\noindent Line 6:
-
-\ttindent
-|\text{etc.}|
-
-\bugonpage 233, answer to {\bf 17.4}, line 6 (5/13/86)
-
-\ttindent
-|        \dots, $b_{3k}$.}\endmultline|
-
-\bugonpage 234, answer to {\bf 18.4} (5/13/86)
-
-\noindent Line 6:
-
-\ttindent
-|\pmatrix \format\r&\quad\r\\|
-
-\noindent Line 10:
-
-\ttindent
-|=\pmatrix \format\r&\quad\r\\|
-
-\bugonpage 239, answer to {\bf 19.13} (10/15/89)
-
-\gdef\vector#1{(#1_1,\dots,#1_n)}%
-\ttindent
-|\define\vector#1{(#1_1,\dots,#1_n)}|
-\medskip
-\noindent
-and then use |$\vector x| to get $\vector x$ and |$\vector y$| to get
-$\vector y$, etc.
-
-\bugonpage 240, answer to {\bf 19.14} (10/15/89)
-
-\ttindent
-|$\vector\alpha$| and |$\vector{x'}$|.
-
-\bugonpage 240, answer to {\bf 19.15} (10/15/89)
-
-\noindent{\bf 19.15.}
-You can get $\vector{{x'}}$ by typing |$\vector{{x'}}$|; now the argument is
-|{x'}| and |{x'}_1| gives ${x'}_1$, etc.  On the other hand,
- you can't get the formula $(x_1{}',\dots,x_n{}')$ using |\vector|---you'd
-just have to type it out in full.
-
-\bugonpage 240, answer to {\bf 19.20} (10/15/89)
-
-\ttindent
-|\define\vector#1#2{(#1_1,\dots,#1_{#2})}|
-
-\bugonpage 242, answer to {\bf 19.23} (10/15/89)
-
-\ttindent
-|\define\vector#1#2{(#2_1,\dots,#2_{#1})}|
-\medskip
-\noindent
-Although |#1| and |#2| must appear in that order after the 
-|\define\vector|, they can appear in any order within
-the definition itself.
-
-\bugonpage 242, answer to {\bf 19.24} (10/15/89)
-
-\ttindent
-|\define\vector#1,#2.{(#1_1,\dots,#1_{#2})}|
-
-\bugonpage 242, answer to {\bf 19.27}, line 1 (7/13/87) % Francis O. McGuinness
-
-\line{{\bf 19.27.} This is a perfectly acceptable |\define|, but you are
-{\sl not\/} defining a new}
-
-\bugonpage 251, line 1 (10/25/89)
-
-\line{is supplied as a synonym for |\thickspace|. In |plain|, the thick
-space |\;| can}
-
-\bugonpage 252, line 6 (11/11/86)
-
-\ttindent
-|$f''^2$|
-
-\bugonpage 261, after line 12 (6/22/87)
-
-Add\qquad $\eqsim$\quad|\eqsim|
-
-\bugonpage 261, line 15 (6/22/87)
-
-Change\qquad $\ncong$\quad|\napprox|\qquad to\qquad $\ncong$\quad|\ncong|
-
-\bugonpage 262, line 15 (11/14/86)
-
-Change\qquad $\eth$\quad|\thorn|\qquad to\qquad $\eth$\quad|\eth|
-
-\bugonpage 264, line 1 (11/11/86)
-
-\centerline{\bf Appendix G: $\{$\TeX\ Users$\}$}
-
-\bugonpage 265, line 6 (11/11/86)
-
-\line{you might want to look back at Appendix G\null.
-  Perhaps someone in TUG has}
-
-\bugonpage 275, column 1 (11/14/86)
-
-Add entry\newline
-|\eth| ($\eth$),\quad 262
-
-\bugonpage 279, column 1 (12/12/89)
-
-\noindent
-|\lesssim| ($\lesssim$),\quad 260
-
-\bugonpage 281, column 1 (6/22/86)
-
-Remove entry for\quad |\napprox|
-
-Add entry\newline
-|\ncong| ($\ncong$),\quad 261
-
-\bugonpage 284, column 1 (12/12/89)
-
-\noindent
-|\Psi| ($\Psi$),\quad 255
-
-\bugonpage 288, column 2 (11/14/86)
-
-Delete entry for\quad |\thorn|
-
-\enddocument

Modified: trunk/Master/tlpkg/bin/tlpkginfo
===================================================================
--- trunk/Master/tlpkg/bin/tlpkginfo	2019-01-24 22:12:49 UTC (rev 49809)
+++ trunk/Master/tlpkg/bin/tlpkginfo	2019-01-24 22:19:50 UTC (rev 49810)
@@ -70,7 +70,7 @@
   
   # erroneous or problematic tds files (when new, tell CTAN and author)
   $erroneous_tds = join ("|",
-    qw(alertmessage countriesofeurope dad ebproof engpron gost
+    qw(alertmessage amstex countriesofeurope dad ebproof engpron gost
        hacm imtekda mathdesign tufte-latex xassoccnt),
     );
   

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2019-01-24 22:12:49 UTC (rev 49809)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2019-01-24 22:19:50 UTC (rev 49810)
@@ -5591,7 +5591,7 @@
 
 sub POSTamstex {
   print "POST$package - cleanup, base subdir\n";
-  die "not done -- doc format, man page, goodbye"; # but pretty close
+  #die "not done -- doc format, man page, goodbye"; # but pretty close
   #
   &SYSTEM ("$RM amssym.tex amssym.def"); # in amsfonts
   #
@@ -5603,6 +5603,7 @@
   for my $dir ("doc", "tex") {
     &SYSTEM ("$MV $dir/$package/$package $dir/$package/base");
   }
+  &preserve_man_pages ($package);
 }
 
 sub POSTapalike {



More information about the tex-live-commits mailing list