From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/amstex/doc/amsppt.txt | 1447 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1447 insertions(+) create mode 100644 macros/amstex/doc/amsppt.txt (limited to 'macros/amstex/doc/amsppt.txt') diff --git a/macros/amstex/doc/amsppt.txt b/macros/amstex/doc/amsppt.txt new file mode 100644 index 0000000000..87023e00e7 --- /dev/null +++ b/macros/amstex/doc/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. %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- cgit v1.2.3