From 9550d7bc686e227f217834207ef8f6b42b44bb02 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 24 Jan 2019 22:19:50 +0000 Subject: amstex (24jan19) git-svn-id: svn://tug.org/texlive/trunk@49810 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/amstex/base/README | 292 +- Master/texmf-dist/doc/amstex/base/amsguide.pdf | Bin 267547 -> 265147 bytes Master/texmf-dist/doc/amstex/base/amsppt.txt | 1447 +++++++++ Master/texmf-dist/doc/amstex/base/amstex.txt | 3468 ++++++++++++++++++++++ Master/texmf-dist/doc/amstex/base/amstinst.pdf | Bin 0 -> 54708 bytes Master/texmf-dist/doc/amstex/base/amstinst.ps.gz | Bin 182908 -> 0 bytes Master/texmf-dist/doc/amstex/base/joyerr.tex | 512 ---- 7 files changed, 4952 insertions(+), 767 deletions(-) create mode 100644 Master/texmf-dist/doc/amstex/base/amsppt.txt create mode 100644 Master/texmf-dist/doc/amstex/base/amstex.txt create mode 100644 Master/texmf-dist/doc/amstex/base/amstinst.pdf delete mode 100644 Master/texmf-dist/doc/amstex/base/amstinst.ps.gz delete mode 100644 Master/texmf-dist/doc/amstex/base/joyerr.tex (limited to 'Master/texmf-dist') diff --git a/Master/texmf-dist/doc/amstex/base/README b/Master/texmf-dist/doc/amstex/base/README index d5ff970dd43..269f5e26de2 100644 --- a/Master/texmf-dist/doc/amstex/base/README +++ b/Master/texmf-dist/doc/amstex/base/README @@ -1,270 +1,52 @@ -READ.ME for AMS-TeX version 2.2 2001/08/29 - -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.] - -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. - -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 - - -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. +README for AMS-TeX version 2.2 2019/01/18 + +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. + +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 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. 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. - - -INSTALLING AMS-TeX 2.2 ON YOUR SYSTEM -- A BRIEF OVERVIEW - -Backup any existing AMS-TeX files before installing a new release. - -Read the instructions in amstinst; they are more complete than these notes. - -If you have retrieved a bundled distribution and unbundled it with the -appropriate tool, the files will be placed into the following subdirectories: - - TEXMF/doc/ams/amstex - TEXMF/source/amstex - TEXMF/tex/amstex/base - TEXMF/tex/plain/amsfonts - -If you have retrieved individual files, you will need to place them into -subdirectories as described in amstinst.ps. - -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. - -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. - -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. +amstinst.tex - Installation instructions, comprising Appendices B and C +amstinst.pdf of amsguide, provided as both TeX source and ready-to-print + PDF. ----\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. +amsguide.tex - The AMS-TeX User's Guide, a brief guide to AMS-TeX 2.2, +amsguide.pdf supplementing "The Joy of TeX". ----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. +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. ----Multiple \thanks commands in the top matter will now produce -multiple acknowledgment footnotes instead of discarding all but the -last one. +The following documentation files will be useful in understanding the +development and evolution of the code: ----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.) +amstex.bug - Official record of bugs and changes made to AMS-TeX. ----\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. +CHANGELOG - Summary of changes made between versions 2.0 and 2.1 + and between 2.1 and 2.2. ----\widestnumber\item now works as claimed in the User's Guide. +amstex.txt - Technical documentation accompanying amstex.tex. ----The missing \par in the internal command \penaltyandskip@ was added. +amsppt.doc - Technical documentation for amsppt.sty, including an update + history. ----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@missing (and as the name suggests, it now tries to -recover by adding the missing \end... command). +amsppt.txt - Additional technical notes on amsppt.sty. ----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.) +amsppt.faq - Frequently asked questions and answers regarding AMS-TeX + and amsppt.sty. ======================================================================== - -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@ams.org diff --git a/Master/texmf-dist/doc/amstex/base/amsguide.pdf b/Master/texmf-dist/doc/amstex/base/amsguide.pdf index 3ba1747149f..e6f7307711d 100644 Binary files a/Master/texmf-dist/doc/amstex/base/amsguide.pdf and b/Master/texmf-dist/doc/amstex/base/amsguide.pdf differ diff --git a/Master/texmf-dist/doc/amstex/base/amsppt.txt b/Master/texmf-dist/doc/amstex/base/amsppt.txt new file mode 100644 index 00000000000..87023e00e74 --- /dev/null +++ b/Master/texmf-dist/doc/amstex/base/amsppt.txt @@ -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@-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@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@. 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@. + \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@.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@th + \left#1\vcenter to1.428\ht\strutbox{}\right.\n@space$}}} +\def\Big#1{{\hbox{$\m@th + \left#1\vcenter to2.142\ht\strutbox{}\right.\n@space$}}} +\def\bigg#1{{\hbox{$\m@th + \left#1\vcenter to2.857\ht\strutbox{}\right.\n@space$}}} +\def\Bigg#1{{\hbox{$\m@th + \left#1\vcenter to3.571\ht\strutbox{}\right.\n@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@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@. + +\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@. + \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@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@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@true\gdef\date@{\tenpoint\ignorespaces#1\unskip}} + +\newif\ifthanks@ + +\def\thanks#1{\global\thanks@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@. + +\newif\ifnofrills@ +\def\nofrills@#1#2{\DN@{\ifx\next\nofrills\nofrills@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@. + \else\nofrills@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@. 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@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@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@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@false %% Before doing any of this we still change + %% \everypar, if necessary, which is normally done elsewhere, and set + %% \firstitem@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@true}% %% And set \firstitem@true for use with \item. + \futurelet\next\next@} + +%% Rember that \rosteritem@ is called by \futurelet\next\rosteritem@. + +\def\rosteritem@{\iffirstitem@\firstitem@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@false\let\item\plainitem@ %% Otherwise, set + %% \nextRunin@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@. + +\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@. + \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@. + %% 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@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@. + \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@false %% Set \firstitem@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@true\ignorespaces}% %% Here's where we set \nextRunin@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@ne sp}% + %% The next two lines are the substitute for \nofrills@. + \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@. + +\newdimen\maxbysamerule@ +\maxbysamerule@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@false \global\key@false \global\by@false + \global\bysame@false \global\paper@false \global\paperinfo@false + \global\jour@false \global\vol@false \global\issue@false + \global\yr@false \global\toappear@false \global\pages@false \global\page@false + \global\book@false \global\inbook@false + \global\bookinfo@false \global\publ@false \global\publaddr@false + \global\finalinfo@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@true + \lastref@false\def\moreref{\egroup\endref@\global\firstref@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@true, \key@true and boxes \nobox@, +%% \keybox@, etc. So we have to use plenty of \csname's to define \refdef@. +%% 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@true\endcsname + \expandafter\setbox + \csname\expandafter\eat@\string#1box@\endcsname\hbox\bgroup#2}} + +%% \no and \key are defined immediately by \refdef@. + +\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@true isn't made \global, since it is needed only by +%% the current \ref, but the \manyby@true is needed by the succeeding \ref's, +%% so it must be \global. + +\def\manyby{\egroup\global\manyby@true\by@true\setbox\bybox@\hbox\bgroup} + +%% Similarly, in \by, the \bysame@false is needed by the current \ref, while +%% the \global \manyby@false is needed by the succeeding \ref's. + +\def\by{\egroup\by@true\bysame@false\global\manyby@false + \setbox\bybox@\hbox\bgroup} + +%% All \bysame has to do is set \bysame@true for the current \ref. + +\def\bysame{\egroup\bysame@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@true +%% (this is used for \moreref, for a succeeding paper in the same journal). + +\def\jour{\egroup\jour@true\prevjour@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@true. + +\def\toappear{\egroup\toappear@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@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@true\previnbook@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@false}} %% And reset \ifafterbook@. + +%% Now all \endref has to do is add the final \egroup, globally set +%% \lastref@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@true\endref@ \global\prevjour@false + \global\previnbook@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@. + \fi %% This \fi matches \ifby@. + \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@false %% Begin by assuming there is + %% additional journal information to be set (\nojourinfo@false). + \ifvol@\else\ifissue@\else\ifyr@\else\nojourinfo@true\fi\fi\fi + %% If \vol, \issue or \yr was specified in this \moreref, nothing + %% changes (hence \nojourinfo@false). But if none were specified, there + %% is no additional journal information to be set (\nojourinfo@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@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@true, so we'll know that we've just typeset a book title. + \ifinbook@\prepunct@\unskip\ in ``\unhbox\bookbox@\unskip\afterbook@true + \setpunct@\global\book@true\fi + %% If \inbook, (which will initially have \ifbook@false), set the book + %% title preceded by in ``; also set \book@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@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@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@.\ifafterbook@''\fi\afterbook@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@.\ifafterbook@''\fi\afterbook@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@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@false} +\logo@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. %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Master/texmf-dist/doc/amstex/base/amstex.txt b/Master/texmf-dist/doc/amstex/base/amstex.txt new file mode 100644 index 00000000000..243b77ee3a9 --- /dev/null +++ b/Master/texmf-dist/doc/amstex/base/amstex.txt @@ -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@. 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@h, \wdz@, + \boxz@, \setbox@ne, \wd@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@. + + +********************************************************************** +\def\space@ +----------- +We frequently need a token that is \let equal a space. The % after +`\space@. ' insures that the space isn't deleted. +********************************************************************** + + +\athelp@ +-------- +Now comes the mechanism by which @ 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@@ will be the control sequence `\@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@ creates the control sequence `\@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@. 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@. + + +\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@- +-------- +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@-{\leavevmode\futurelet\next\hyphen@} +\def\hyphen@{\relaxnext@\ifx\next-\def\next@-{\futurelet\next + \hyphen@@}% + \else\def\next@{\leavevmode\hbox{-}}\fi\next@} +\def\hyphen@@{\ifx\next-\def\next@-{\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@. ' or `\next@.' 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@. + + +\refskip@ plays no role now; but after \Refs, in AMSPPT.STY, there +will be reasons to have \refskip@ in \nolinebreak. + + +\nolinebreak also uses \saveskip@. + + +\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@. + + +\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@. 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@m@s ... +--------------- +\pr@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. + + +@. 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{}, should make a +fraction made with \above \ex@. 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@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@. 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@. 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@. + +%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@. + +%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@. \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@. + +\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@. 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@th from plain to shut off any \mathsurround. \m@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@. + +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@... +------------------ +\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 = . + +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\for + +but it's quite conceivable that someone will type + + \spacehdots{}\for... + +even though the braces are unnecessary; in such a case TeX will +actually consider the first argument to be {}. 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@3 ' or possibly +`\strip@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={} 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@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@. +%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@true, \TagsOnRight sets \tagsleft@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@. \TagsAsMath sets \mathtags@true, while +\TagsAsText sets \mathtags@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@. +%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@. + + +\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@. 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@. 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@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@. + +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@. + +%1 Initialize widths and \and@ to 0pt. +%2 We just set a box, which we will not use. +%3 We set \tag@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@. + +%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@. + + +********************************************************************** +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@y@ is just like plain's \displ@y, except that it also sets +\and@ to 0 and \tag@false at each \cr (we need the \tag@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@. + +%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@. Our display will be centered within a +region of width \displaywidth, + + + <---------------------------\displaywidth------------------------> + | xxxxxxxxxxxxxx = yyyyyyyyy | + | xxxxxx = yyyyyyyyyyyyyyyyy | + | xxxxxxxxx = yyyyy<------------L------------>| + | + <------------\totwidth@----------> + + <--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@-(\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@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@. + +%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@. 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@. + +%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@...} (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@. + + +\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@. +%4 Then we are actually typesetting. +%5 We make a new preamble with \attag@. +%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@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@. + +%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@. + +%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@. + + +\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@. + + +\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@. + + +\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@. + + +\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@. 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@. + + +\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} + + \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@. + +%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@. + + +\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@. + + +\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@. + + +\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@. + + +\multline@ first does the \tagin@ test and then calls either +\multline@l or \multline@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@. 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@false and \onecr@true. Then after the first \\ in + the \multline, we always have \onecr@false (and also + \zerocr@false). So \onecr@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@. 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@. + + +\multline@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@. + +%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@. 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@. + + +\multline@r works just like \multline@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@. + + +\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@. + +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 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@___\math@ to test ___ and set \ifmath@ true if the first five +symbols are \ m a t and h, storing what remains in \meaning@. 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@___\mathch@, setting \ifmathch@ true if it passes, and +then storing the " and what comes after in a new \meaning@. + + +\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@. + + +\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@...\DOTS@. 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@. + +%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@. + +%6 If +, =, etc., comes next we use \dotsb@. + +%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@. + +%9 Otherwise we see if we have a macro. We test on \meaning@@, + since the previous test has already changed \meaning@. + +%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@. + +%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@. + +%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@. + +%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@. + +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@. In this case, we don't want to use a \futurelet, but +simply want to apply \extra@ with \next being \delayed@. + +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@...}\FN@\next@}, and +then we call \nextii@. + + +\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@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@. + + +\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@. + + +\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@...\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@. + +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@. + +%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@. + +%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@. 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@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@...\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@. 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@box, which we create with +\csname...\endcsname. + + +\def\sqrt ... +------------- +\radical, \underline and \overline are like ^ and _ : they operate on +the next 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@. + +\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@. 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@. + +\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@. 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@. + +%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). + + +@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@. 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@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. + +********************************************************************** diff --git a/Master/texmf-dist/doc/amstex/base/amstinst.pdf b/Master/texmf-dist/doc/amstex/base/amstinst.pdf new file mode 100644 index 00000000000..dc333ff9985 Binary files /dev/null and b/Master/texmf-dist/doc/amstex/base/amstinst.pdf differ diff --git a/Master/texmf-dist/doc/amstex/base/amstinst.ps.gz b/Master/texmf-dist/doc/amstex/base/amstinst.ps.gz deleted file mode 100644 index 0b1475b7f8b..00000000000 Binary files a/Master/texmf-dist/doc/amstex/base/amstinst.ps.gz and /dev/null differ diff --git a/Master/texmf-dist/doc/amstex/base/joyerr.tex b/Master/texmf-dist/doc/amstex/base/joyerr.tex deleted file mode 100644 index 4a8771aafe5..00000000000 --- a/Master/texmf-dist/doc/amstex/base/joyerr.tex +++ /dev/null @@ -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@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 -- cgit v1.2.3