 The amsart, amsproc, and amsbook document

classes

American Mathematical Society Michael Downes, Julie Hawks

Version 1.2b, 1995/02/23

1 Introduction

This file (amsclass.dtx) is the master file for three L^{A}TEX document classes, amsart, amsproc, and amsbook, which are intended for articles and books containing mathematical research. They produce output that follows the style conventions of American Mathematical Society publications.

2 Implementation

The usual name, date, and version information. (Note: the reason each \ProvidesClass command is placed on a line by itself, with separate begin and end guards for docstripping, is to make automatic update of file date and version slightly easier and more robust.)

If this documentclass is not loaded by a parent class, then we will define \@parentclass here for use in class error and warning messages.

  \NeedsTeXFormat{LaTeX2e}

⟨∗amsart⟩

  \ProvidesClass{amsart}[1995/02/23 v1.2b]

⟨/amsart⟩

⟨∗amsproc⟩

  \ProvidesClass{amsproc}[1995/02/23 v1.2b]

⟨/amsproc⟩

⟨∗amsbook⟩

  \ProvidesClass{amsbook}[1995/02/23 v1.2b]

⟨/amsbook⟩

If there is a parent documentclass that is loading this class, then we want to use the name of the parent class. Otherwise the name of the current class file.

  \def\@tempa#1#2\@nil{\edef\@classname{#1}}
  \expandafter\@tempa\@currnamestack{}{}{}\@nil
  \ifx\@classname\@empty \edef\@classname{\@currname}\fi
  % \section{Options}
  % \subsection{Notes}
  %    Note: Options will be processed in the order they are declared;
  %    cf \cs{ProcessOptions}.

2 THE AMSART, AMSPROC, AND AMSBOOK DOCUMENT CLASSES

%
% \subsection{Paper size}
%    The option \opt{letterpaper} (default) sets the target paper width
%    and height to U.S. letter size, 8.5 in x 11 in. An option
%    \opt{a4paper} is also supported, but we don't include some of the
%    more unusual paper options (\opt{legalpaper}, \opt{a5paper},
%    \opt{executivepaper}) of the generic \cls{article} class. For A4
%    paper we not only change the paper size but also add 4pc to the
%    normal textheight of 50.5pc (the difference between 297mm and 11in
%    is 50pt).
%    \begin{macrocode}
\DeclareOption{a4paper}{\paperheight 297mm\paperwidth 210mm
  \textheight 54.5pc }
\DeclareOption{letterpaper}{\paperheight 11in\paperwidth 8.5in }

The options landscape and portrait swap paper height and width.

\DeclareOption{landscape}{\@tempdima\paperheight
  \paperheight\paperwidth \paperwidth\@tempdima}
\DeclareOption{portrait}{}

2.1 Two-side or one-side printing For two-sided printing we set the switch \if@twoside which will cause the margins to be adjusted so that the type blocks of back-to-back pages will line up. The \if@mparswitch makes margin paragraphs print in the outside margin.

\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse}
\DeclareOption{twoside}{\@twosidetrue  \@mparswitchtrue}

2.2 Draft or final version The draft option causes overfull lines to be marked with a black slug in the right margin.

\DeclareOption{draft}{\overfullrule5\p@ }
\DeclareOption{final}{\overfullrule\z@ }

2.3 Title page The title and related information can optionally be printed on a separate page.

\newif\if@titlepage
\DeclareOption{titlepage}{\@titlepagetrue}
\DeclareOption{notitlepage}{\@titlepagefalse}

2.4 Two-column printing Two-column layout is handled through a predefined internal switch.

\DeclareOption{onecolumn}{\@twocolumnfalse}
\DeclareOption{twocolumn}{\@twocolumntrue}

2.5 The nomath option The ‘nomath’ option causes most of the extra math features to be omitted. In that case we need to make sure a couple of utility functions are defined.

\DeclareOption{nomath}{%
  \def\numberwithin##1##2{\@ifundefined{c@##1}{\@nocounterr{##1}}{%
    \@ifundefined{c@##2}{\@nocounterr{##2}}{%

      \@addtoreset{##1}{##2}%
      \toks@\@xp\@xp\@xp{\csname the##1\endcsname}%
      \@xp\xdef\csname the##1\endcsname
        {\@xp\@nx\csname the##2\endcsname
         .\the\toks@}}}}
  }

2.6 Some font options The ‘noamsfonts’ option means to avoid declaring math alphabets or symbol fonts for the extra math fonts in the AMSFonts set. If these fonts are declared, it means that the corresponding .tfm files are required even for documents that do not use any symbols from those fonts. So we allow optionally to not declare them, for convenience of users who don’t have those fonts on their system and don’t want the hassle of getting them.

  \def\mathfrak{needed}
  \DeclareOption{noamsfonts}{\let\mathfrak\relax}

The ‘psamsfonts’ option, passed on the amsfonts package, means that alternative .fd files should be used that do not refer to .tfm files for sizes 6,8,9 (which are not present in the PostScript AMS fonts set from Y&Y/Blue Sky Research). This should also trigger the cmex10 option of amsmath, to avoid trying to load sizes 7–9 of cmex.

  \DeclareOption{psamsfonts}{%
    \PassOptionsToPackage{psamsfonts}{amsfonts}%
    \PassOptionsToPackage{cmex10}{amsmath}}

2.7 Equation numbering on the left or right The option leqno—equation numbers on the left—is the default in AMS styles. Therefore we provide also a reqno option.

  \newif\iftagsleft@
  \DeclareOption{leqno}{%
    \tagsleft@true \PassOptionsToPackage{leqno}{amsmath}}
  \DeclareOption{reqno}{%
    \tagsleft@false \PassOptionsToPackage{reqno}{amsmath}}

2.8 Vertical centering of equation numbers For multiline equations the equation number is by default centered vertically on the total height of the equation. To make the equation number print on the first line (for left-hand numbers) or the last line (right-hand numbers), there is a tbtags option ‘top/bottom tags’.

  \newif\ifctagsplit@
  \DeclareOption{centertags}{%
    \ctagsplit@true \PassOptionsToPackage{centertags}{amsmath}}
  \DeclareOption{tbtags}{%
    \ctagsplit@false \PassOptionsToPackage{tbtags}{amsmath}}

2.9 Flush left displays The option fleqn causes displayed equations to print aligned on the left instead of centered, with an indentation of \mathindent from the prevailing left margin.

If the amsmath package is loaded, most of this code will be overridden, but it seems we need it anyway because of the possibility of the ‘nomath’ class option.

\DeclareOption{fleqn}{%
\def\[{\relax
\ifmmode\@badmath
\else
  \begin{trivlist}%
  \@beginparpenalty\predisplaypenalty
  \@endparpenalty\postdisplaypenalty
  \item[]\leavevmode
  \hbox to\linewidth\bgroup$\displaystyle

Note that the \m@th should go at the end in \] just in case an embedded small math formula inside \text occurs in the display.

Why the extra bgroup here? I think it’s not needed. [mjd,3-Feb-1994]

  \hskip\mathindent\bgroup
\fi}%
\def\]{\relax
\ifmmode
  \egroup \m@th$\hfil \egroup
  \end{trivlist}%
\else \@badmath
\fi}%
\renewenvironment{equation}{%
\@beginparpenalty\predisplaypenalty
\@endparpenalty\postdisplaypenalty
\refstepcounter{equation}%
\@topsep\abovedisplayskip \trivlist
\item[]\leavevmode
\hbox to\linewidth\bgroup\hskip\mathindent$\displaystyle
}{%
\m@th$\hfil \displaywidth\linewidth \hbox{\@eqnnum}\egroup
\endtrivlist
}%
\renewenvironment{eqnarray}{%
\stepcounter{equation}\let\@currentlabel\theequation
\global\@eqnswtrue \global\@eqcnt\z@ \tabskip\mathindent
\let\\=\@eqncr \abovedisplayskip\topsep
\ifvmode \advance\abovedisplayskip\partopsep \fi
\belowdisplayskip\abovedisplayskip
\belowdisplayshortskip\abovedisplayskip
\abovedisplayshortskip\abovedisplayskip
$$\everycr{}\halign to\linewidth\bgroup
  \hskip\@centering
  $\displaystyle\tabskip\z@skip####\m@th$&%
  \@eqnsel \global\@eqcnt\@ne
  \hfil${}####{}\m@th$\hfil&%
  \global\@eqcnt\tw@
  $\displaystyle ####\m@th$\hfil\tabskip\@centering&%
  \global\@eqcnt\thr@@

        \hbox to \z@\bgroup\hss####\egroup\tabskip\z@skip\cr
      }{%
        \@@eqncr \egroup \global\advance\c@equation\m@ne$$%
        \global\@ignoretrue
      }%
    \newdimen\mathindent \mathindent\leftmargini
  }

2.10 Dealing with font sizes

\@mainsize \@ptsize Instead of the miserly \@ptsize variable from L^{A}TEX’s ancient history that only contained the last digit of the main typesize, we set up a proper variable \@mainsize that contains all the digits of the main typesize. Just in case it is needed for someone using an old package, we will keep \@ptsize also.

  \newcommand{\@mainsize}{10}
  \newcommand{\@ptsize}{0}

\larger \smaller This function is an easy byproduct of the work done to fold typesize-specific code into the main class file. The range of font sizes is \normalsize, \small,

\Small, \SMALL, \tiny, \Tiny, \large, \Large, \LARGE, \huge, \Huge. Spaces

are left at either end of the case statement to accommodate adding \TINY and \HUGE in the future but it’s not clear that they’re really needed.

  \newcommand{\larger}[1][1]{%
    \count@\@currsizeindex \advance\count@#1\relax
    \ifnum\count@<\z@ \count@\z@ \else\ifnum\count@>12 \count@12 \fi\fi

The various size-changing commands \normalsize, etc. will take care of up-

dating \@currsizeindex.
    \ifcase\count@
      \Tiny\or\Tiny\or\tiny\or\SMALL\or\Small\or\small
      \or\normalsize
      \or\large\or\Large\or\LARGE\or\huge\or\Huge\else\Huge
    \fi
  }
  \newcommand{\smaller}[1][1]{\larger[-#1]}

The \@adjustvertspacing function adapts some vertical spacing amounts to the current type size. We don’t expect large sections of vertical text to occur in the extraordinarily small or large type sizes, so the \@adjustvertspacing function is only called in the range between ‘footnote’ size and ‘Large’ size. Notice that no shrinkability is used.

  \def\@adjustvertspacing{%

\big/med/smallskipamount are generic space values that will be used by the commands \bigskip, \medskip, \smallskip. We also link the spacing around displayed equations to these amounts.

    \bigskipamount.7\baselineskip plus.7\baselineskip
    \medskipamount\bigskipamount \divide\medskipamount\tw@
    \smallskipamount\medskipamount \divide\smallskipamount\tw@
    \abovedisplayskip\medskipamount
    \belowdisplayskip \abovedisplayskip

The above-display short space is zero but with the same stretchability as the above-display normal space. And the below-display short space is similar, but has a base value equal to \smallskipamount. Use of the multiplier 1 is an arcane TEX trick that coerces the skip value to a dimen value, i.e. gives us the base value of the skip register without the stretch or shrink values.

    \abovedisplayshortskip\abovedisplayskip
    \advance\abovedisplayshortskip-1\abovedisplayskip
    \belowdisplayshortskip\abovedisplayshortskip
    \advance\belowdisplayshortskip 1\smallskipamount

The traditional value for \jot is 3pt, which we generalize to \baselineskip/4. This is used to adjust interline spacing in multiline displayed equations.

    \jot\baselineskip \divide\jot 4 \relax
  }

We fill out the range of typesize changing commands to a full eleven: five large/huge commands and five small/tiny commands. (The capitalization of the command names suggests that there should actually be thirteen—add \TINY and \HUGE—but let’s be conservative and leave those out until a real need for them is known to exist.) An unavoidable side effect is that \tiny now selects 6pt instead of 5pt by default.

   In version 1.1 of amsart and amsbook\small was the same as \footnotesize

(amsproc didn’t exist in v. 1.1).

The only size-changing command that is predefined by L^{A}TEX is \normalsize; that’s why it’s the only one for which we use \renewcommand below.

  \renewcommand\normalsize{\@xsetfontsize\normalsize 6%
    \@adjustvertspacing \let\@listi\@listI}
  %\newcommand\TINY{\@xsetfontsize\TINY 0}
  \newcommand\Tiny{\@xsetfontsize\Tiny 1}
  \newcommand\tiny{\@xsetfontsize\tiny 2}
  \newcommand\SMALL{\@xsetfontsize\SMALL 3}
  \newcommand\Small{\@xsetfontsize\Small 4%
    \@adjustvertspacing
    \def\@listi{\topsep\smallskipamount \parsep\z@skip \itemsep\z@skip}}
  \newcommand\small{\@xsetfontsize\small 5\@adjustvertspacing}

For backward compatibility we had better define \footnotesize and \scriptsize. Also there is the small discrepancy with \tiny to worry about.

  \def\footnotesize{\Small}
  \def\scriptsize{\SMALL}

The sizes above 10pt use magstep values, stored in the functions \@xipt,

\@xiipt, etc.
  \newcommand\large{\@xsetfontsize\large 7\@adjustvertspacing}
  \newcommand\Large{\@xsetfontsize\Large 8\@adjustvertspacing}
  \newcommand\LARGE{\@xsetfontsize\LARGE 9}
  \newcommand\huge{\@xsetfontsize\huge{10}}
  \newcommand\Huge{\@xsetfontsize\Huge{11}}
  %\newcommand\HUGE{\@xsetfontsize\HUGE{12}}

So now we had better define the \@xsetfontsize function. The sizechanging commands use \@setfontsize instead of \fontsize to (a) give an error message if used in math mode and (b) set the \@currsize variable.

  \def\@xsetfontsize#1#2{%
    \chardef\@currsizeindex#2\relax
    \edef\@tempa{\@nx\@setfontsize\@nx#1%
      \@xp\ifcase\@xp\@currsizeindex\@typesizes

Add nonsense values 99/99 at the end just in case some extreme error turns up.

        \else{99}{99}\fi}%
    \@tempa
  }

For the record let’s initialize \@currsizeindex.

  \chardef\@currsizeindex=6

Set page-breaking penalties to prevent all widows, orphans, and hyphens at the end of a page.

  \widowpenalty=10000
  \clubpenalty=10000
  \brokenpenalty=10000

Set some default linespacing values. The variable \linespacing is usually the normal interline space in the main text. It is used to specify vertical space for elements such as section heads and theorems in proportion to the normal interline space.

  \newdimen\linespacing
  \lineskip=1pt \lineskiplimit=1pt
  \normallineskip=1pt \normallineskiplimit=1pt
  \let\baselinestretch=\@empty

Settings for \textheight and \textwidth. We start with the value 50.5pc specified in AMS journal specifications as the total height of the type block and then subtract the running head height and adjust for \topskip to get the proper value for the text block.

  \headheight=5pt \headsep=14pt
  ⟨amsbook⟩\footskip=18pt

⟨amsart | amsproc⟩\footskip=12pt

  \textheight=50.5pc \topskip=10pt
  \textwidth=30pc
  \columnsep=10pt \columnseprule=0pt

Some settings for marginpars.

  \marginparwidth=90pt
  \marginparsep=11pt
  \marginparpush=5pt

To avoid setting text before begin-document, we postpone the setting of

\footnotesep using \AtBeginDocument.
  \AtBeginDocument{\settoheight{\footnotesep}{\footnotesize M$^1$}}

  \skip\footins=7pt plus11pt
  \skip\@mpfootins=\skip\footins
  \fboxsep=3pt \fboxrule=.4pt
  \arrayrulewidth=.4pt    \doublerulesep=2pt
  \labelsep=5pt           \arraycolsep=\labelsep
  \tabcolsep=\labelsep    \tabbingsep=\labelsep
  \floatsep=15pt plus 12pt    \dblfloatsep=15pt plus 12pt
  \textfloatsep=\floatsep  \dbltextfloatsep=15pt plus 12pt
  \intextsep=\floatsep
  \@fptop=0pt plus1fil     \@dblfptop=0pt plus1fil
  \@fpbot=0pt plus1fil     \@dblfpbot=0pt plus1fil
  \@fpsep=8pt plus2fil     \@dblfpsep=8pt plus2fil\relax

Note that \parskip gets no stretch; this is at variance with the generic L^{A}TEX classes.

  \parskip=0pt \relax
   \@parboxrestore, used by \@footnotetext, sets \parindent to 0pt; since

this is not what we want, we make a new dimen \normalparindent and after

calling \@parboxrestore, \@footnotetext resets \parindent back to normal.
  \newdimen\normalparindent
  ⟨amsart⟩\normalparindent=12pt
  ⟨amsproc | amsbook⟩\normalparindent=18pt
  \parindent=\normalparindent
  \partopsep=0pt \relax \parsep=0pt \relax \itemsep=0pt \relax
  \@lowpenalty=51         \@medpenalty=151        \@highpenalty=301
  \@beginparpenalty=-\@lowpenalty
  \@endparpenalty=-\@lowpenalty
  \@itempenalty=-\@lowpenalty

2.11 Typesize-specific code The class option 12pt sets the main typesize to 12 pt and makes various adaptations, primarily sliding the size-changing commands up the scale of magsteps. This makes it more likely that someone with bitmapped fonts will have all the fonts and sizes that they need. The 8pt option is for those who like to conserve paper.

By parameterizing some aspects it is possible to make a great deal of the typesize-specific code automatically adapt to the selected size. Then there is so little typesize-specific code remaining that it no longer makes sense to put the code in separate .clo files. So instead of analogs for the generic size10,11,12.clo files we have the code for those options entirely contained in the .cls file in the form of declared options.

Some miscellaneous remarks.

2. IMPLEMENTATION 9

—If PostScript fonts are used, it may seem a little strange to use fonts following the magstep’d point sizes 10.95, 14.4, 17.28, 20.74, 24.88 instead of simply 11, 14, 17, 21, 25. But it is not easy for us to make that distinction here in the documentclass definitions of the fontsize changing commands. So we don’t try.

\DeclareOption{10pt}{\def\@mainsize{10}\def\@ptsize{0}%
\def\@typesizes{%

There should be 11 typesize/baselineskip pairs: five below \normalsize and five above.

\or{5}{6}\or{6}{7}\or{7}{8}\or{8}{10}\or{9}{11}%
\or{10}{12}% normalsize
\or{\@xipt}{13}\or{\@xiipt}{14}\or{\@xivpt}{17}%
\or{\@xviipt}{20}\or{\@xxpt}{24}}%
\normalsize \linespacing=\baselineskip
}
%
\DeclareOption{11pt}{\def\@mainsize{11}\def\@ptsize{1}%
\def\@typesizes{%
\or{6}{7}\or{7}{8}\or{8}{10}\or{9}{11}\or{10}{12}%
\or{\@xipt}{13}% normalsize
\or{\@xiipt}{14}\or{\@xivpt}{17}\or{\@xviipt}{20}%
\or{\@xxpt}{24}\or{\@xxvpt}{30}}%
\normalsize \linespacing=\baselineskip
}
%
\DeclareOption{12pt}{\def\@mainsize{12}\def\@ptsize{2}%
\def\@typesizes{%
\or{7}{8}\or{8}{10}\or{9}{11}\or{10}{12}\or{\@xipt}{13}%
\or{\@xiipt}{14}% normalsize
\or{\@xivpt}{17}\or{\@xviipt}{20}\or{\@xxpt}{24}%
\or{\@xxvpt}{30}\or{\@xxvpt}{30}}%
\normalsize \linespacing=\baselineskip
}
%
\DeclareOption{8pt}{\def\@mainsize{8}\def\@ptsize{8}%
\def\@typesizes{%
\or{5}{6}\or{5}{6}\or{5}{6}\or{6}{7}\or{7}{8}%
\or{8}{10}% normalsize
\or{9}{11}\or{10}{12}\or{\@xipt}{13}%
\or{\@xiipt}{14}\or{\@xivpt}{17}}%
\normalsize \linespacing=\baselineskip
}
%
\DeclareOption{9pt}{\def\@mainsize{9}\def\@ptsize{9}%
\def\@typesizes{%
\or{5}{6}\or{5}{6}\or{6}{7}\or{7}{8}\or{8}{10}%
\or{9}{11}% normalsize
\or{10}{12}\or{\@xipt}{13}\or{\@xiipt}{14}%
\or{\@xivpt}{17}\or{\@xviipt}{20}}%
\normalsize \linespacing=\baselineskip
}

2.12 Running heads The normal application of pagestyle functions \ps@xxx is to determine the contents of running heads and feet. The function \@mkboth is used internally by commands \chapter, \section, and the like to set the running heads.

  \def\ps@empty{\let\@mkboth\@gobbletwo
    \let\@oddhead\@empty \let\@evenhead\@empty
    \let\@oddfoot\@empty \let\@evenfoot\@empty

The current implementation in amsart/amsproc/amsbook of the vertical space at the top of an opening page uses \topskip, which means that we need to do some resetting here.

    \global\topskip\normaltopskip}

Pagestyle ‘plain’ has the page numbers in the running feet.

  \def\ps@plain{\ps@empty
    \def\@oddfoot{\normalfont\scriptsize \hfil\thepage\hfil}%
    \let\@evenfoot\@oddfoot}

Pagestyle ‘headings’ uses text from sectioning commands for running heads. Empty running feet.

  \def\ps@headings{\ps@empty
    \def\@evenhead{\normalfont\scriptsize
        \rlap{\thepage}\hfil \leftmark{}{}\hfil}%
    \def\@oddhead{\normalfont\scriptsize \hfil
        \rightmark{}{}\hfil \llap{\thepage}}%
    \let\@mkboth\markboth

⟨∗amsbook⟩

    \def\partmark{\@secmark\markboth\partrunhead\partname}%
    \def\chaptermark{%
      \@secmark\markboth\chapterrunhead{}}%
    \def\sectionmark{%
      \@secmark\markright\sectionrunhead\sectionname}%

⟨/amsbook⟩

  }
\sectionname \subsectionname \subsubsectionname Init.
  \let\sectionname\@empty
  \let\subsectionname\@empty
  \let\subsubsectionname\@empty

The default definitions of \leftmark, \rightmark are not what we want: the section title (or whatever) reported in the right-hand running head should report the section that is current at the bottom of the right-hand page. And the left-hand running head should report the status at the top of the page. Cf.

amsppt.sty.
  \def\leftmark{\expandafter\@firstoftwo\topmark{}{}}
  \def\rightmark{\expandafter\@secondoftwo\botmark{}{}}

Journal and Proceedings articles require an indication of the first page so the logo and copyright line can appear.

⟨∗amsart | amsproc⟩

  \def\ps@firstpage{\ps@plain
    \def\@oddfoot{\normalfont\scriptsize \hfil\thepage\hfil

Stick in the reset of topskip here so it only gets executed after the first page is completed.

       \global\topskip\normaltopskip}%
    \let\@evenfoot\@oddfoot
    \def\@oddhead{\serieslogo@\hss}%
    \let\@evenhead\@oddhead}% in case an article starts on a left-hand page

⟨/amsart | amsproc⟩

\@nilgobble Something that apparently doesn’t exist in the kernel?

  \long\def\@nilgobble#1\@nil{}

A general section-marking function. Arg 1 is either \markright or \markboth indicating which kind of marking action is desired (this gives us some string pool/hash table savings by allowing the \@secmark function to serve for both cases). Arg 2 is the function that should be called in the running head to process the remaining three args. Arg 3 is normally \xxxname (but could be empty). Arg 4 is the section-title text. Assumption: whenever \@secmark is called, the section-number variable \@secnumber has been set to the value of the current section number (possibly empty, in the case of a * section for example).

⟨∗amsbook⟩

  \def\@secmark#1#2#3#4{%

We want to apply expansion to xxxname and thexxx but not to the other elements.

    \begingroup \let\protect\@unexpandable@protect
    \edef\@tempa{\endgroup \toks@{\@nx#2{#3}{\@secnumber}}}%
    \@tempa
    \toks@\@xp{\the\toks@{#4}}%

If a \markright operation is called for, use the current left-mark via \@temptokena.

    \afterassignment\@nilgobble\@temptokena\@themark{}\@nil
    \edef\@tempa{\@nx\@mkboth{%
      \ifx\markright#1\the\@temptokena\else\the\toks@\fi}{\the\toks@}}%
    \@tempa}
Init \@secnumber.
  \let\@secnumber\@empty

⟨/amsbook⟩

Fix \markboth so that \@secmark can work without too much thrashing.

  \def\markboth#1#2{%
    \begingroup
      \@temptokena{{#1}{#2}}\xdef\@themark{\the\@temptokena}%
      \mark{\the\@temptokena}%
    \endgroup
    \if@nobreak\ifvmode\nobreak\fi\fi}

With the myheadings pagestyle, no automatic running heads will be provided by the documentclass; only running heads specified by the user through explicit \markboth or \markright commands will be used.

  \def\ps@myheadings{\ps@headings \let\@mkboth\@gobbletwo}

Save normal topskip value in a skip register.

  \newskip\normaltopskip
  \normaltopskip=10pt \relax

We also want to turn off all section marks. First-level section heads will be defined in ps@headings.

  \let\sectionmark\@gobble
  \let\subsectionmark\@gobble
  \let\subsubsectionmark\@gobble
  \let\paragraphmark\@gobble

2.13 Unrecognized options The makeidx option is redundant; everything that it does in the generic L^{A}TEX classes is already done anyway in this class.

  \DeclareOption{makeidx}{}

2.14 Process options Install the default options. First, however, we’d better install the amsgen function set.

  \input{amsgen.sty}
  \ExecuteOptions{leqno,centertags,letterpaper,portrait,%
    10pt,twoside,onecolumn,final}

Options will be processed in the order of the associated \DeclareOption commands.

  \ProcessOptions\relax

In compatibility mode, we want to load the frozen version of amstex.sty instead of the amsmath package. This is rather a horrible kluge but I can’t see anything better at the moment. [mjd,1995/01/27]

  \if@compatibility
    \def\@tempa#1{\let\mathfrak\relax
      \RequirePackage{amstex}\relax}\expandafter\@tempa
  \else
    \expandafter\@iden
  \fi
  {% if native mode

If the nomath option was specified, then \numberwithin will be defined. If not, we will call the amsmath package.

  \@ifundefined{numberwithin}{\let\@tempa\relax}{\let\@tempa\@gobbletwo}
  \@tempa
  \RequirePackage{amsmath}\relax

If the noamsfonts option was requested, then \mathfrak is now \relax: so kill the amsfonts package load. Otherwise set \mathfrak = \relax to avoid error

message from \DeclareMathAlphabet.
  \ifx\relax\mathfrak \@xp\@gobbletwo \else \let\mathfrak\relax \fi
  \RequirePackage{amsfonts}\relax
  }% end native mode branch

Now a utility macro to do \uppercase but sidestep any math, to prevent uppercasing math variables. In order to be handled properly the $...$ or \(...\) must be on the outer level (not enclosed in braces). We did not try to handle the possibility \begin{math} ... \end{math} in a title at the present time (too complicated). Also we increase inter-word space in the uppercase text.

One other little problem: uppercasing of a few special characters like the German ß (\ss) and the undotted i and j (\i and \j), used sometimes with accents. We redefine to be upper case equivalents. (Undotted \i and \j in math would be typed as \imath and \jmath.)

Spaceskip is changed in accordance with recommendations for increased interword spacing in all-caps text by e.g. ‘Words into Type’.

  \newcommand{\uppercasenonmath}[1]{\toks@\@emptytoks
  %    Insert an extra \@empty to avoid removing braces around arg #1.
    \@xp\@skipmath\@xp\@empty#1$$%
    \edef#1{\@nx\@upprep\the\toks@}%
  }

\@upprep Preparations for printing all-cap text.

  \newcommand{\@upprep}{%
    \spaceskip1.3\fontdimen2\font plus1.3\fontdimen3\font
    \upchars@}

In all-caps text, eszet should print as SS, dotless i should print as normal cap I, Mc should print with a small-caps (not lowercase) c, and so forth.

  \newcommand{\upchars@}{%
    \def\ss{SS}\def\i{I}\def\j{J}\def\ae{\AE}\def\oe{\OE}%
    \def\o{\O}\def\aa{\AA}\def\l{\L}\def\Mc{M{\scshape c}}}
\@skipmath \@xskipmath  \@skipmath searches for $...$ in order to keep from applying \uppercase to

the contents. Then it calls \@xskipmath to search for \(...\).

  \newcommand{\@skipmath}{}
  \long\def\@skipmath#1$#2${%
    \@xskipmath#1\(\)%
    \@ifnotempty{#2}{\toks@\@xp{\the\toks@$#2$}\@skipmath\@empty}}%
  %
  \newcommand{\@xskipmath}{}
  \long\def\@xskipmath#1\(#2\){%
  %    Expand away the added \@empty
    \uppercase{\toks@\@xp\@xp\@xp{\@xp\the\@xp\toks@#1}}%
    \@ifnotempty{#2}{\toks@\@xp{\the\toks@\(#2\)}\@xskipmath\@empty}}%

\today The command \today produces today’s date in the form most commonly used in the U.S.

\newcommand{\today}{%
  \relax\ifcase\month\or
  January\or February\or March\or April\or May\or June\or
  July\or August\or September\or October\or November\or December\fi
  \space\number\day, \number\year}

2.15 Old text font commands The \em command is not redefined here (let’s say, to give an ‘obsolete’ warning and recommend instead \emph) because there is no alternative internal com-

mand \emshape.
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}

2.16 Top matter For the \title command, we support an optional argument to give a shortened version of the title for running heads.

\renewcommand{\title}[2][]{\gdef\shorttitle{#1}\gdef\@title{#2}}

The default value for the optional argument is ‘same as the mandatory arg’ but there doesn’t seem to be an easy way to get that effect with \[re]newcommand. Here is how to use \@dblarg in conjunction with the preceding \newcommand:

\edef\title{\@nx\@dblarg
  \@xp\@nx\csname\string\title\endcsname}

The \author command accepts an optional argument similar to that of the \title command.

\renewcommand{\author}[2][]{%
  \ifx\@empty\authors
    \gdef\shortauthors{#1}\gdef\authors{#2}%
  \else
    \g@addto@macro\shortauthors{\and#1}%
    \g@addto@macro\authors{\and#2}%
  \fi
  \g@addto@macro\addresses{\author{}}%
}
\edef\author{\@nx\@dblarg
  \@xp\@nx\csname\string\author\endcsname}

Initialize some variables.

\let\shortauthors\@empty   \let\authors\@empty
\let\addresses\@empty      \let\thankses\@empty

The optional arguments of \address, \curraddr, \email are to indicate which author the address applies to, if a document has multiple authors and there is not a normal one-to-one correspondence between authors and addresses.

\newcommand{\address}[2][]{\g@addto@macro\addresses{\address{#1}{#2}}}
\newcommand{\curraddr}[2][]{\g@addto@macro\addresses{\curraddr{#1}{#2}}}
\newcommand{\email}[2][]{\g@addto@macro\addresses{\email{#1}{#2}}}
\renewcommand{\thanks}[1]{\g@addto@macro\thankses{\thanks{#1}}}

The following example of addresses for three authors of a tri-author paper illustrates the kind of complications that need to be handled.

\author{Roland Campbell}
\address{Department of Mathematics\\
  Pennsylvania State University\\
  Pittsburgh, Pennsylvania 13593}
\email[R.~Campbell]{campr@@galois.psu.edu}
\author{Mark M. Dane}
% Same address as R. Campbell
\curraddr[M.~Dane]{Atmospheric Research Station\\
  Pala Lundi, Fiji}
\email[M.~Dane]{DaneMark@@ffr.choice}
\author{Jeremiah Jones}
\address[J.~Jones]{Department of Philosophy\\
Freedman College\\
Periwinkle, Colorado 84320}
\email[J.~Jones]{id739e@@oseoi44 (Bitnet)}

In an article, typesetting of the address information is done at the end of the document, by calling \@setaddresses. This is done through a parent function \enddoc@text, because some AMS journals also print the abstract there instead of at the beginning, and it’s easier to redefine \enddoc@text than to try undoing material already added to the \AtEndDocument hook.

⟨∗amsart | amsproc⟩

\def\enddoc@text{\ifx\@empty\@translators \else\@settranslators\fi
  \ifx\@empty\addresses \else\@setaddresses\fi}
\AtEndDocument{\enddoc@text}

⟨/amsart | amsproc⟩

%
\def\@setaddresses{\par
  \nobreak \begingroup

⟨amsart | amsproc⟩\footnotesize

  \def\author##1{\nobreak\addvspace\bigskipamount}%

Address is supposed to go all on one line, so we redefine \\ to just insert a comma instead of doing a line break.

  \def\\{\unskip, \ignorespaces}%

No page breaks in the address section is accomplished by \interlinepenalty\@M and by the \nobreak before the \bigskip.

  \interlinepenalty\@M
  \def\address##1##2{\begingroup

If there are two addresses for the same author, add a between them.

    \par\addvspace\bigskipamount\indent

If the name of the author to whom this address applies was given, typeset it

    \@ifnotempty{##1}{(\ignorespaces##1\unskip) }%

Now the main part of the address:

    {\scshape\ignorespaces##2}\par\endgroup}%

Current address:

  \def\curraddr##1##2{\begingroup
    \@ifnotempty{##2}{\nobreak\indent{\itshape Current address}%
      \@ifnotempty{##1}{, \ignorespaces##1\unskip}\/:\space
      ##2\par\endgroup}}%

And then email. In versions 1.0 and 1.1 @@ was required to print a single @ character; for bulletproofing we convert doubled @ characters if found.

  \def\email##1##2{\begingroup
    \@ifnotempty{##2}{\nobreak\indent{\itshape E-mail address}%
      \@ifnotempty{##1}{, \ignorespaces##1\unskip}\/:\space
      \ttfamily##2\par\endgroup}}%
  \addresses
  \endgroup
}

Some other administrative info. For e can just use the default definition provided by LaTeX. Except that we initialize the date to empty instead of to March 27, 1996.

\let\@date\@empty
\def\dedicatory#1{\def\@dedicatory{#1}}
\let\@dedicatory=\@empty
\def\keywords#1{\def\@keywords{#1}}
\let\@keywords=\@empty
\def\subjclass#1{\def\@subjclass{#1}}
\let\@subjclass=\@empty
⟨amsart⟩\def\commby#1{\def\@commby{(Communicated by #1)}}
⟨amsart⟩\let\@commby=\@empty

We handle translator names like author names, just in case there is more than one translator. [mjd,1994/10/19]

\def\translator#1{\g@addto@macro\@translators{\and#1}}
\let\@translators=\@empty

⟨∗amsart | amsproc⟩

\def\@settranslators{\par\begingroup
  \addvspace{6\p@\@plus9\p@}%

\hbox to\columnwidth{\hss\normalfont\normalsize
  Translated by %
  \andify\@translators \uppercasenonmath\@translators
  \@translators}
\endgroup
}

⟨/amsart | amsproc⟩

The general function to convert a list of items in the form

A\and B\and C\and D

to the form ‘A, B, C, and D’ is \xandlist:

\xandlist{, }{ and }{, and }{A\and B\and C\and D}

This is a completely expandable macro, with the return value being the converted list. There is also a ‘no-execute’ version whose fourth argument should be a macro; the text to be converted will be taken from that macro and after conversion will be put back as the macro’s new replacement text.

  \nxandlist{, }{ and }{, and }\result

I don’t think I want to explain this except by recommending that you watch it in operation with \tracingmacros if you’re interested. [mjd,1994/10/19]

\newcommand{\xandlist}[4]{\@andlista{{#1}{#2}{#3}}#4\and\and}
\def\@andlista#1#2\and#3\and{\@andlistc{#2}\@ifnotempty{#3}{%
\@andlistb#1{#3}}}
\def\@andlistb#1#2#3#4#5\and{%
\@ifempty{#5}{%
  \@andlistc{#2#4}%
}{%
  \@andlistc{#1#4}\@andlistb{#1}{#3}{#3}{#5}%
}}
\let\@andlistc\@iden
\newcommand{\nxandlist}[4]{%
\def\@andlistc##1{\toks@\@xp{\the\toks@##1}}%
\toks@{\toks@\@emptytoks \@andlista{{#1}{#2}{#3}}}%
\the\@xp\toks@#4\and\and
\edef#4{\the\toks@}%
\let\@andlistc\@iden}

The \andify function is provided as a convenient abbreviation for the most common case.

\newcommand{\andify}{%
\nxandlist{\unskip, }{\unskip{} and~}{\unskip, and~}}

Override the funny default definition of \and from L^{A}TEX. This is not actually used by AMS classes, however.

\def\and{\unskip{ }and \ignorespaces}

\def\maketitle{\par
\@topnum\z@ % this prevents figures from falling at the top of page 1

For articles, we must add the copyright info footnote.

⟨∗amsart | amsproc⟩

\@setcopyright

⟨/amsart | amsproc⟩

For articles, we do some setup for the running heads here. If there are no author names, we set the left-hand running head to the value of the right-hand running head.

⟨∗amsart | amsproc⟩

\uppercasenonmath\shorttitle
\ifx\@empty\shortauthors \let\shortauthors\shorttitle
\else \andify\shortauthors \uppercasenonmath\shortauthors \fi

⟨/amsart | amsproc⟩

\begingroup
\@maketitle

⟨∗amsart | amsproc⟩

\toks@\@xp{\shortauthors}\@temptokena\@xp{\shorttitle}%
\edef\@tempa{\@nx\markboth{\the\toks@}{\the\@temptokena}}\@tempa

⟨/amsart | amsproc⟩

\endgroup
⟨amsart | amsproc⟩\thispagestyle{firstpage}% this sets first page specifications
\c@footnote\z@
\def\do##1{\let##1\relax}%
\do\maketitle \do\@maketitle \do\title \do\@xtitle \do\@title
\do\author \do\@xauthor \do\address \do\@xaddress
\do\email \do\@xemail \do\curraddr \do\@xcurraddr
⟨amsart⟩\do\commby \do\@commby
\do\dedicatory \do\@dedicatory \do\thanks \do\thankses
\do\keywords \do\@keywords \do\subjclass \do\@subjclass
}

Set up the style of an article opening page.

⟨∗amsart | amsproc⟩

\def\@maketitle{%

Set font to normal, just in case.

\normalfont\normalsize

Special footnotes are put here to ensure that they come first at the bottom of the page.

\let\@makefnmark\relax  \let\@thefnmark\relax
⟨amsart⟩ \ifx\@empty\@date\else \@footnotetext{\@setdate}\fi
\ifx\@empty\@subjclass\else \@footnotetext{\@setsubjclass}\fi
\ifx\@empty\@keywords\else \@footnotetext{\@setkeywords}\fi
\ifx\@empty\thankses\else \@footnotetext{%

In order to make multiple thanks footnotes work inside a single \@footnotetext argument we need to make the first \par be ignored. Cf \@setthanks.

  \def\par{\let\par\@par}\@setthanks}\fi

If was specified, mkboth will be a no-op.

  \@mkboth{\@nx\shortauthors}{\@nx\shorttitle}%
⟨amsproc⟩ \global\topskip8pc\relax % 10pc to base of first title line
⟨amsart⟩ \global\topskip42\p@\relax % 5.5pc   "   "   "     "     "
  \@settitle
  \ifx\@empty\authors \else \@setauthors \fi
Likewise with \@dedicatory and \@date.
  \ifx\@empty\@dedicatory
  \else
⟨amsproc⟩  \baselineskip26\p@
⟨amsart⟩  \baselineskip18\p@
    \vtop{\centering{\footnotesize\itshape\@dedicatory\@@par}%
      \global\dimen@i\prevdepth}\prevdepth\dimen@i
  \fi
  \@setabstract

Space before the main text should be 32 + 14 base-to-base; we accomplish this by doing a vskip of that amount with \baselineskip subtracted.

  \normalsize
  \if@titlepage
    \newpage
  \else
    \dimen@34\p@ \advance\dimen@-\baselineskip
    \vskip\dimen@\relax
  \fi
} % end \@maketitle

⟨/amsart | amsproc⟩

Series logo set up for articles. This will be a no-op unless defined by a publication-specific documentclass after amsart or amsproc is loaded.

⟨amsart | amsproc⟩\let\serieslogo@\@empty

Here is a typical definition of \serieslogo@:

\def\serieslogo@{\vtop to 0pt{%
 \parindent\z@ \fontsize{6}{7\p@}\selectfont
BULLETIN (New Series) OF THE\newline
AMERICAN MATHEMATICAL SOCIETY\newline
Volume {\tiny\bfseries\currentvolume}, Number \currentissue,
\currentmonth\ \currentyear\endgraf\vss}}

Default values for information such as volume, year, and so on are provided as follows.

⟨∗amsart | amsproc⟩

\def\copyrightyear{0000}
\def\copyrightyearmodC{00}
\def\ISSN{0000-0000}
\def\copyrightprice{\$1.00\;+\;\$.25 per page}
\def\currentvolume{00}

  \def\currentyear{19xx}

⟨/amsart | amsproc⟩

  ⟨amsart⟩\def\currentissue{00}
  ⟨amsart⟩\def\currentmonth{Xxxx}

Doing the copyright info on the first page is a little tricky. We want it to come at the bottom, after any footnotes and floating inserts, but before the page number. If we simply put it into \@oddfoot (in \ps@plain) its height will not be subtracted from the height of the text and then the page number will be lower than we want. So we do it as an insert.

⟨∗amsart | amsproc⟩

  \newinsert\copyins

We set the skip register associated with this insert to the base-to-base distance from the bottom of the page contents to the base of the first line in the copyright info. See the definition of \@setcopyright.

  \skip\copyins=1.5pc
  \count\copyins=1000 % magnification factor, 1000 = 100%
  \dimen\copyins=.5\textheight % maximum allowed per page

Put the contents into a TEX insert. This information is omitted unless \serieslogo@ is non-null. In other words it will normally not print except when an AMS publication-specific document class such as tran-l is used.

  \def\@setcopyright{%
    \ifx\@empty\serieslogo@
    \else
      \insert\copyins{\hsize\textwidth
        \parfillskip\z@ \leftskip\z@\@plus.9\textwidth
        \fontsize{6}{7\p@}\normalfont\upshape

The spacing between the preceding text and the copyright info is done with a

strut of height \skip\copyins. (Note that \lineskip and \baselineskip are

0 in the L^{A}TEX output routine.) The negative vskip gives an effective distance of 0 from the top of the box to the base of the first line (assuming \skip\copyins is greater than the height of that line). Then the apparent total height of the box will work well with TEX’s calculations involving \skip\copyins for how much room to leave for this object.

        \everypar{}%
        \vskip-\skip\copyins \nointerlineskip
        \noindent\vrule\@width\z@\@height\skip\copyins
        \copyright\copyrightyear\ American Mathematical Society\break
        \ISSN/\copyrightyearmodC\ \copyrightprice\par

This kern of 0pt forces the depth of the last line (if any) to be added to the height of the box.

        \kern\z@}%
    \fi
  }

When \@combinefloats is called, the box \@outputbox already contains the main text of the page and any footnotes. Then L^{A}TEX adds top and bottom figures. We want to add our copyright info at the very bottom, but still inside of the vbox.

\def\@combinefloats{%
  \ifx \@toplist\@empty \else \@cflt \fi
  \ifx \@botlist\@empty \else \@cflb \fi
  \ifvoid\copyins \else \@cflci \fi
}

In the twocolumn,firstcolumn case, postpone adding the copyright note. Actually for the twocolumn case more work is necessary:

\def\@cflci{%
  \if\if@twocolumn \if@firstcolumn F\else T\fi\else T\fi T%
      \setbox\@outputbox\vbox{%
        \unvbox\@outputbox
        \vskip\skip\copyins
        \hbox to\columnwidth{%
          \hss\vbox to\z@{\vss\unvbox\copyins}}}%
  \fi
}

⟨/amsart | amsproc⟩

Some name setup.

\newcommand{\abstractname}{Abstract}
\newcommand{\keywordsname}{Key words and phrases}
\newcommand{\subjclassname}{\textup{1991} Mathematics Subject
     Classification}

For the date we have a special little problem: We only want to add the ‘Received by the editors’ text for publication-specific documentclasses such as tran-l.

⟨amsbook⟩\def\@tempb{amsbook}
⟨amsproc⟩\def\@tempb{amsproc}
⟨amsart⟩\def\@tempb{amsart}
\ifx\@classname\@tempb
  \newcommand{\datename}{\textit{Date}:}
\else
  \newcommand{\datename}{Received by the editors}
\fi

⟨∗amsart | amsproc⟩

\def\@settitle{\begin{center}

⟨/amsart | amsproc⟩

⟨amsart⟩ \baselineskip14\p@\relax

⟨amsproc⟩ \Large ⟨∗amsart | amsproc⟩

    \bfseries
⟨amsart⟩\uppercasenonmath\@title
  \@title
  \end{center}%
}

⟨/amsart | amsproc⟩

For multiple authors we need to combine the author names into a list of the form Author One, Author Two, ..., and Author Last.

⟨∗amsart | amsproc⟩

  \def\@setauthors{%
    \begingroup
    \trivlist

⟨/amsart | amsproc⟩

  ⟨amsart⟩ \centering\footnotesize \@topsep30\p@\relax
  ⟨amsart⟩ \advance\@topsep by -\baselineskip
  ⟨amsproc⟩ \centering \fontsize{11}{13\p@}\selectfont\@topsep13\p@\relax

⟨∗amsart | amsproc⟩

    \item\relax

Here \uppercasenonmath instead of just \uppercase is a bit of overkill but it gives us the uppercase special chars and handles potential exotic cases without further work.

    \andify\authors
  ⟨amsart⟩\uppercasenonmath\authors
    \authors
    \endtrivlist
    \endgroup
  }

⟨/amsart | amsproc⟩

The following definitions suffice for both the amsart and amsbook classes.

  \def\@setdate{\datename\ \@date\@addpunct.}
  \def\@setsubjclass{%
    {\itshape\subjclassname.}\enspace\@subjclass\@addpunct.}
  \def\@setkeywords{%
    {\itshape \keywordsname.}\enspace \@keywords\@addpunct.}
  \def\@setthanks{\def\thanks##1{\par##1\@addpunct.}\thankses}

‘Abstract’ can be changed to say ‘Résumé’ (French) by redefining \abstractname. This and other control sequence names (\refname, \contentsname, \appendixname, and so on) are compatible with the babel package (the AMS sometimes publishes articles in languages other than English.)

In AMS documentclasses, the abstract should be placed before \maketitle (otherwise the desired ordering of frontmatter elements cannot be ensured in all cases).

  \newbox\abstractbox
  %
  \newenvironment{abstract}{%

We start by checking whether \maketitle has already been used (in which case it was reset to \relax); if so, we give a warning that the abstract should be placed before \maketitle.

    \ifx\maketitle\relax
      \ClassWarning{\@classname}{Abstract should precede
        \protect\maketitle\space in AMS documentclasses; reported}%
    \fi

  \global\setbox\abstractbox=\vtop \bgroup
⟨amsart | amsproc⟩ \normalfont\footnotesize
⟨amsart | amsproc⟩ \advance \hsize -6pc
⟨amsbook⟩ \normalsize
  \trivlist \labelsep.5em\item[\hskip\labelsep
    {\scshape\abstractname}.]\ignorespaces
}{%
  \endtrivlist
  \egroup

If the abstract was supposed to be typeset earlier, then \@setabstract is now equal to \relax, and we had better drop the contents of the abstract box onto the page immediately, to salvage the situation as best we can.

  \ifx\@setabstract\relax \@setabstracta \fi
}

Because the abstract might be postponed until the end of an article, we cannot simply use the fact of a preceding \maketitle to tell whether \endabstract should immediately put the abstract box contents on the page. So we use an auxiliary function that will be reset to no-op once we have passed the point where the abstract should normally be typeset.

\def\@setabstract{\@setabstracta \global\let\@setabstract\relax}
\def\@setabstracta{%
  \ifvoid\abstractbox
  \else
    \skip@20\p@ \advance\skip@-\lastskip
    \advance\skip@-\baselineskip \vskip\skip@
⟨amsart⟩ \moveright 3pc
⟨amsproc⟩ \moveright 3.5pc
    \box\abstractbox
  \fi
}

Title page environment does nothing much; information and formatting to be provided by the user.

\def\titlepage{%
⟨amsbook⟩ \cleardoublepage

⟨amsart | amsproc⟩ \clearpage

  \thispagestyle{empty}\setcounter{page}{0}}
\def\endtitlepage{\newpage}

2.17 Macros for list labels

\def\labelenumi{\theenumi.}
\def\theenumi{\@arabic\c@enumi}
\def\labelenumii{(\theenumii)}
\def\theenumii{\@alph\c@enumii}
\def\p@enumii{\theenumi}
\def\labelenumiii{(\theenumiii)}
\def\theenumiii{\@roman\c@enumiii}
\def\p@enumiii{\theenumi(\theenumii)}
\def\labelenumiv{(\theenumiv)}

\def\theenumiv{\@Alph\c@enumiv}
\def\p@enumiv{\p@enumiii\theenumiii}
%
\def\labelitemi{$\m@th\bullet$}
\def\labelitemii{\bfseries --}% \upshape already done by \itemize
\def\labelitemiii{$\m@th\ast$}
\def\labelitemiv{$\m@th\cdot$}

2.18 Verse and quotation environments

\def\verse{\let\\\@centercr
  \list{}{\itemsep\z@ \itemindent -1.5em\listparindent\itemindent
  \rightmargin\leftmargin \advance\leftmargin 1.5em}\item[]}
\let\endverse=\endlist

The left/right margins of the quotation environment are supposed to be the same as for the abstract environment.

\def\quotation{\list{}{%
    \leftmargin3pc \listparindent\normalparindent
    \itemindent\z@
    \rightmargin\leftmargin \parsep\z@ \@plus\p@}%
  \item[]}
\let\endquotation=\endlist
\def\quote{\list{}{\rightmargin\leftmargin}\item[]}
\let\endquote=\endlist

2.19 List environments Changed definition of \trivlist, \enumerate, and \itemize in order to have

\makelabel apply \upshape.
\def\trivlist{\parsep\parskip\@nmbrlistfalse
  \@trivlist \labelwidth\z@ \leftmargin\z@
  \itemindent\z@
  \let\@itemlabel\@empty
  \def\makelabel##1{\upshape##1}}
\def\enumerate{\ifnum \@enumdepth >3 \@toodeep\else
      \advance\@enumdepth \@ne
      \edef\@enumctr{enum\romannumeral\the\@enumdepth}\list
      {\csname label\@enumctr\endcsname}{\usecounter
        {\@enumctr}\def\makelabel##1{\hss\llap{\upshape##1}}}\fi}
\def\itemize{%
  \ifnum\@itemdepth>3 \@toodeep
  \else \advance\@itemdepth\@ne
    \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
    \list{\csname\@itemitem\endcsname}%
      {\def\makelabel##1{\hss\llap{\upshape##1}}}%
  \fi}
%
\newcommand{\descriptionlabel}[1]{\hspace\labelsep \upshape\bfseries #1:}
\newcommand{\description}{\list{}{%

Adjust the indent of the first line to the desired value:

\advance\leftmargini6\p@ \itemindent-12\p@
\labelwidth\z@ \let\makelabel\descriptionlabel}}
\let\enddescription=\endlist

\upn The command \upn can be used to force upright font for punctuation or digits in italic text. For example

... as numbered by \upn{``A''} or \upn{``1''} hereafter\upn{)}

\let\upn=\textup

Since these margin settings are dependent on the fonts used, we postpone them until begin-document. (This means that we cannot use the values directly for calculations before begin-document.)

\AtBeginDocument{%
\settowidth\leftmargini{\labelenumi\hskip\labelsep}%
\advance\leftmargini by \normalparindent
\settowidth\leftmarginii{\labelenumii\hskip\labelsep}%
⟨amsbook | amsproc⟩ \advance\leftmarginii by 15pt
⟨amsart⟩ \advance\leftmarginii by 6pt
\settowidth\leftmarginiii{\labelenumiii\hskip\labelsep}%
⟨amsbook | amsproc⟩ \advance\leftmarginiii by 12pt
⟨amsart⟩ \advance\leftmarginiii by 6pt
\settowidth\leftmarginiv{\labelenumiv\hskip\labelsep}%
\advance\leftmarginiv by 10pt
\leftmarginv=10pt
\leftmarginvi=10pt
\leftmargin=\leftmargini
\labelsep=5pt
\labelwidth=\leftmargini \advance\labelwidth-\labelsep
\@listi}

In some contexts the space above/below lists needs to be suppressed. So we put it into a variable \listisep.

\newskip\listisep
\listisep\smallskipamount
\def\@listI{\leftmargin\leftmargini \parsep\z@skip
\topsep\listisep \itemsep\z@skip
\listparindent\normalparindent}
\let\@listi\@listI

Is it necessary to reset \parsep, \partopsep, \itemsep to their default values (0) in each of the subordinate list setup functions? I don’t believe so, but I leave the settings in the listii function just in case some unusual nesting of environments might cause trouble. [mjd,1994/09/22]

\def\@listii{\leftmargin\leftmarginii
\labelwidth\leftmarginii \advance\labelwidth-\labelsep
\topsep\z@skip \parsep\z@skip \partopsep\z@skip \itemsep\z@skip}

\def\@listiii{\leftmargin\leftmarginiii
  \labelwidth\leftmarginiii \advance\labelwidth-\labelsep}
\def\@listiv{\leftmargin\leftmarginiv
  \labelwidth\leftmarginiv \advance\labelwidth-\labelsep}
\def\@listv{\leftmargin\leftmarginv
  \labelwidth\leftmarginv \advance\labelwidth-\labelsep}
\def\@listvi{\leftmargin\leftmarginvi
  \labelwidth\leftmarginvi \advance\labelwidth-\labelsep}

2.20 Redefined internal sectioning commands In amsart.sty \@startsection, \@sect, and a couple of other things are redefined to fix a few hard-coded things that would interfere with the desired style. The most noteworthy difference is that all section headings will go into the table of contents (governed by secnumdepth as usual), EVEN WHEN THE * FORM IS USED. The only section heading not listed in the table of contents is the heading for the toc itself.

\def\@startsection#1#2#3#4#5#6{%

Section titles, if they are run-in with the following text, are stored in a box instead of being typeset right away. They will be typeset by \everypar, but if one section heading follows right after another, this won’t happen. So by doing \leavevmode we force this to happen. (\if@noskipsec is true if the previous section title has not yet been typeset.)

 \if@noskipsec \leavevmode \fi
 \par \@tempskipa #4\relax
 \@afterindenttrue
 \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse\fi
 \if@nobreak \everypar{}\else
     \addpenalty\@secpenalty\addvspace\@tempskipa\fi
%    Don't call \@ssect in the ifstar case:
 \@ifstar{\@dblarg{\@sect{#1}{\@m}{#3}{#4}{#5}{#6}}}%
         {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}%
}

For reference, here is the argument list for \@sect.

% #1    #2     #3      #4          #5         #6     #7      #8
{NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}[SHORTT]{TITLE}

\def\@sect#1#2#3#4#5#6[#7]#8{%
Define \@toclevel for for \@tocwrite (to \@tochangmeasure).
  \edef\@toclevel{\ifnum#2=\@m 0\else\number#2\fi}%
  \ifnum #2>\c@secnumdepth \let\@secnumber\@empty
  \else \@xp\let\@xp\@secnumber\csname the#1\endcsname\fi

\@svsec will be the section number plus some formatting if the star form was not used and if the depth of numbering extends to the current level. The user can change secnumdepth to control how many levels of sectioning will be numbered.

 \ifnum #2>\c@secnumdepth

     \let\@svsec\@empty
   \else
      \refstepcounter{#1}%

If the *-form was not used (#2 less than 1000), we add \sectionname or whatever as a prefix, separated by a space. We need the ifundefined test in order to know whether the space should be added or not. There must be a better way to do this but I haven’t thought of it yet.

      \edef\@svsec{\ifnum#2<\@m
         \@ifundefined{#1name}{}{%
           \ignorespaces\csname #1name\endcsname\space}\fi

We add \textup here in order to make section numbers always roman, even if the rest of the section head is italic.

         \@nx\textup{%
  ⟨amsart⟩  \@nx\mdseries
           \csname the#1\endcsname.}\enspace
      }%
    \fi
    \@tempskipa #5\relax
    \ifdim \@tempskipa>\z@ % then this is not a run-in section heading
      \begingroup #6\relax
      \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty\@M #8\par}%
      \endgroup

Section headings don’t set marks for the running heads in the article style, only in the amsbook style. Assumption: \sectionmark is defined to call \@secnumber as its penultimate argument.

⟨∗amsbook⟩

    \csname #1mark\endcsname{#7}%

⟨/amsbook⟩

If #2 (level) is greater than 1000 then we don’t do a table of contents entry. This happens only for the section heading above the table of contents itself.

      \ifnum#2>\@m \else \@tocwrite{#1}{#8}\fi
    \else

Otherwise we’re doing a run-in heading; it is stored as \@svsechd, which will be typeset by \everypar as soon as some text is encountered.

    \def\@svsechd{#6\hskip #3\@svsec

To allow for the possibility that the user wants an empty section title, leaving just the section number, we check whether #8 is nonempty before adding the period.

      \@ifnotempty{#8}{\ignorespaces#8\unskip

The following test is to prevent a period being added if the section title ended in a question mark or other punctuation.

         \@addpunct.}%
      \ifnum#2>\@m \else \@tocwrite{#1}{#8}\fi
    }%
    \fi

In a previous version of amsart nobreaktrue was added to xsect for some reason. Let’s keep that just in case it was done to prevent a certain kind of bug. [mjd,17-Aug-1994]

  \global\@nobreaktrue

\@xsect does some more stuff based on whether this is a run-in heading or not.

  \@xsect{#5}}

Undefine \@ssect to save memory; it’s not needed in amsart.

\let\@ssect\relax

Allocate counters for sectioning commands. Paragraph counter is allocated but normally not used. Subparagraph counter is not allocated.

\newcounter{part}
⟨amsbook⟩\newcounter{chapter}
⟨amsproc | amsart⟩\newcounter{section}
⟨amsbook⟩\newcounter{section}[chapter]
⟨amsbook⟩\def\thesection{\arabic{section}}
\newcounter{subsection}[section]
\newcounter{subsubsection}[subsection]
\newcounter{paragraph}[subsubsection]

Set numbering style for sectioning commands. In a couple of cases resetting is unnecessary but we include the full list here for completeness.

\renewcommand\thepart          {\arabic{part}}
⟨amsbook⟩\renewcommand\thechapter       {\arabic{chapter}}
\renewcommand\thesection       {\arabic{section}}
\renewcommand\thesubsection    {\thesection.\arabic{subsection}}
\renewcommand\thesubsubsection {\thesubsection .\arabic{subsubsection}}
\renewcommand\theparagraph     {\thesubsubsection.\arabic{paragraph}}

Depth of section numbering; if secnumdepth were 2 instead of 3, \subsubsection would not be numbered.

\setcounter{secnumdepth}{3}

The arguments of \@startsection are given for reference:

% #1    #2     #3      #4          #5         #6
{NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}
\def\partname{Part}

⟨∗amsart | amsproc⟩

\def\part{\@startsection{part}{0}%
  \z@{\linespacing\@plus\linespacing}{.5\linespacing}%
  {\normalfont\bfseries\raggedright}}

⟨/amsart | amsproc⟩

Specialsection correlates to our inhouse Z-head.

\def\specialsection{\@startsection{section}{1}%
⟨amsart⟩ \z@{\linespacing\@plus\linespacing}{.5\linespacing}%
⟨amsproc | amsbook⟩ \z@{2\linespacing\@plus\linespacing}{.5\linespacing}%
⟨amsart⟩ {\normalfont\centering}}
⟨amsproc | amsbook⟩ {\large\scshape\centering}}

In the book class \part puts the part title on a separate page.

⟨∗amsbook⟩

\def\part{\cleardoublepage \thispagestyle{empty}%
  \null\vfil  \markboth{}{}\secdef\@part\@spart}
%
\def\@part[#1]#2{%
  \ifnum \c@secnumdepth >-2\relax \refstepcounter{part}%
    \addcontentsline{toc}{part}{\partname\ \thepart.
        \protect\enspace\protect\noindent#1}%
  \else
    \addcontentsline{toc}{part}{#1}\fi
  \begingroup\centering
  \ifnum \c@secnumdepth >-2\relax
       {\fontsize{\@xviipt}{22}\bfseries
         \partname\ \thepart} \vskip 20\p@ \fi
  \fontsize{\@xxpt}{25}\bfseries
      #1\vfil\vfil\endgroup \newpage\thispagestyle{empty}}
\def\@spart#1{\addcontentsline{toc}{part}{\protect\noindent#1}%
  \begingroup\centering
  \fontsize{\@xxpt}{25}\bfseries
     #1\vfil\vfil\endgroup \newpage\thispagestyle{empty}}

⟨/amsbook⟩

The arguments of \partrunhead are \partname, \thepart, and the text of the part title. The first two were fully expanded during the marking process. Use of a mere interword space between the first two args makes it possible to apply \ignorespaces and \unskip as shown here to produce the desired results if one or the other is empty.

⟨∗amsbook⟩

\def\partrunhead#1#2#3{%
  \@ifnotempty{#2}{\uppercase{#1 #2}\@ifnotempty{#3}{. }}%
  \def\@tempa{#3}%
  \ifx\@empty\@tempa\else\uppercasenonmath\@tempa\@tempa\fi}
\let\chapterrunhead\partrunhead
\let\sectionrunhead\partrunhead

⟨/amsbook⟩

Section headings in the amsbook style differ from the amsart style in a couple of ways: The ones that aren’t centered are indented on the left, instead of flush left; and the first level, \section, is not small caps but bold. Cf. the definition

of \appendix.
\def\section{\@startsection{section}{1}%
  \z@{.7\linespacing\@plus\linespacing}{.5\linespacing}%
⟨amsart⟩ {\normalfont\scshape\centering}}
⟨amsbook | amsproc⟩ {\normalfont\bfseries\centering}}

Negative value for #5 is a signal to make a run-in heading instead of doing a vskip after the heading.

\def\subsection{\@startsection{subsection}{2}%

⟨amsart⟩ \z@{.5\linespacing\@plus.7\linespacing}{-.5em}%
⟨amsbook | amsproc⟩ \normalparindent{.5\linespacing\@plus.7\linespacing}{-.5em}%
  {\normalfont\bfseries}}
\def\subsubsection{\@startsection{subsubsection}{3}%
⟨amsart⟩ \z@{.5\linespacing\@plus.7\linespacing}{-.5em}%
⟨amsbook | amsproc⟩ \normalparindent\z@{-.5em}%
  {\normalfont\itshape}}

Fontdimen 2 of the current font is the ideal interword space of the font. Thus the following spec says that the space after the paragraph heading should be a normal interword space (but nonstretching and nonshrinking).

\def\paragraph{\@startsection{paragraph}{4}%
⟨amsart⟩ \z@\z@{-\fontdimen2\font}%
⟨amsbook | amsproc⟩ \normalparindent\z@{-\fontdimen2\font}%
  \normalfont}
\def\subparagraph{\@startsection{subparagraph}{5}%
  \z@\z@{-\fontdimen2\font}%
  \normalfont}

⟨∗amsart | amsproc⟩

\def\appendix{\par\c@section\z@ \c@subsection\z@
   \let\sectionname\appendixname
   \def\thesection{\@Alph\c@section}}

⟨/amsart | amsproc⟩

\def\appendixname{Appendix}

A slower, but fully expandable definition of \@Roman to avoid the nonexpandable \uppercase which is undesirable in certain circumstances.

\def\@Roman#1{\@xp\@slowromancap
  \romannumeral#1@}%
%
\def\@slowromancap#1{\ifx @#1% then terminate
  \else

Note: \if is required here, not \ifx, because \romannumeral returns category 12 letters!

    \if i#1I\else\if v#1V\else\if x#1X\else\if l#1L\else\if
    c#1C\else\if m#1M\else#1\fi\fi\fi\fi\fi\fi
    \@xp\@slowromancap
  \fi
}

2.21 Book features Books (monographs) comprise three distinct sections, \frontmatter, \mainmatter, and \backmatter. The \frontmatter would consist of the title page, copyright page, table of contents, preface, etc. The \mainmatter would be the body of the book. The \backmatter would include the appendix, bibliography, glossary, and index.

⟨∗amsbook⟩

\def\frontmatter{\cleardoublepage\pagenumbering{roman}}
\def\mainmatter{\cleardoublepage\pagenumbering{arabic}}
\def\backmatter{\cleardoublepage}

⟨/amsbook⟩

Book proceedings and monographs allow a signature to print at the end of a preface. ¡*!amsart¿ ¡/!amsart¿

Monographs can have a special exercise environment.

⟨∗amsbook⟩

% exercise environment
\def\xcb{%
  \settowidth{\leftmargini}{0.\hskip\labelsep}%
  \settowidth{\leftmarginii}{(d.)\hskip\labelsep}%
\@startsection{section}% counter name; ignored because of the
                                % * below
{1}% sectioning level
{\z@}% indent to the left of the section title
{18\p@\@plus2\p@}% vertical space above *** added 12 more points space!!
{1sp}% Space below of 13pt base-to-base, so none needs to be added
    % here; but \z@ would cause the following text to be run-in, so we
    % use 1sp instead.
{\bfseries}% The font of the subsection title
*% always unnumbered
}%
\def\endxcb{\par}

⟨/amsbook⟩

2.22 Book chapters The \chapter command is provided only in the amsbook class, not in the amsart class.

⟨∗amsbook⟩

\def\chapter{\cleardoublepage \thispagestyle{plain}\global\@topnum\z@
  \@afterindentfalse \secdef\@chapter\@schapter}

\@chapter for numbered chapters.

\def\@chapter[#1]#2{\refstepcounter{chapter}%
  \ifnum\c@secnumdepth<\z@ \let\@secnumber\@empty
  \else \let\@secnumber\thechapter \fi
  \typeout{\chaptername\space\@secnumber}%
  \def\@toclevel{0}%
  \ifx\chaptername\appendixname \@tocwriteb\tocappendix{chapter}{#2}%
  \else \@tocwriteb\tocchapter{chapter}{#2}\fi
  \chaptermark{#1}%
  \addtocontents{lof}{\protect\addvspace{10\p@}}%
  \addtocontents{lot}{\protect\addvspace{10\p@}}%
  \@makechapterhead{#2}\@afterheading}

\@schapter for unnumbered chapters.

\def\@schapter#1{\typeout{#1}%
  \let\@secnumber\@empty
  \def\@toclevel{0}%

\ifx\chaptername\appendixname \@tocwriteb\tocappendix{chapter}{#1}%
\else \@tocwriteb\tocchapter{chapter}{#1}\fi
\chaptermark{#1}%
\addtocontents{lof}{\protect\addvspace{10\p@}}%
\addtocontents{lot}{\protect\addvspace{10\p@}}%
\@makeschapterhead{#1}\@afterheading}
\def\chaptername{Chapter}
\def\thechapter{\@arabic\c@chapter}
\def\appendixname{Appendix}
\def\@makechapterhead#1{\global\topskip 7.5pc\relax
\begingroup
\fontsize{\@xivpt}{18}\bfseries\centering

In order to keep the chapter number “CHAPTER III” from getting in the way of the \topskip we put it inside the paragraph containing the main title. Then we have to do some laborious \rlaping and \hskiping to position it correctly.

  \ifnum\c@secnumdepth>\m@ne
    \leavevmode \hskip-\leftskip
    \rlap{\vbox to\z@{\vss
        \centerline{\normalsize\mdseries
            \uppercase\@xp{\chaptername}\enspace\thechapter}
        \vskip 3pc}}\hskip\leftskip\fi
   #1\par \endgroup
\skip@34\p@ \advance\skip@-\normalbaselineskip
\vskip\skip@ }
\def\@makeschapterhead#1{\global\topskip 8.5pc\relax
\begingroup
\fontsize{\@xivpt}{18}\bfseries\centering
#1\par \endgroup
\skip@34\p@ \advance\skip@-\normalbaselineskip
\vskip\skip@ }

⟨/amsbook⟩

The \appendix command, following the LaTeX book, marks the start of a division after \mainmatter and before \backmatter that consists of appendixes.

⟨∗amsbook⟩

\def\appendix{\par
\c@chapter\z@ \c@section\z@
\let\chaptername\appendixname
\def\thechapter{\@Alph\c@chapter}}

⟨/amsbook⟩

2.23 Table of contents macros

\tableofcontents is like \chapter or \section except for no number and no

table of contents entry.

\@pnumwidth is the maximum width for page numbers in a table of contents. 1.6em allows enough room for three digits.

\newcommand{\@pnumwidth}{1.6em}

\@tocrmarg is \@pnumwidth plus the desired minimum space (1em) between page numbers and the preceding text.

  \newcommand{\@tocrmarg}{2.6em}
  ⟨amsart⟩\setcounter{tocdepth}{2}
  ⟨amsbook | amsproc⟩\setcounter{tocdepth}{1}

Since table of contents, list of figures and list of figures are identical in design as far as the chapter heading and other preliminaries go, we redefine \@starttoc to do the necessary work, rather than defining a new macro (which would use up another control sequence name).

We define first the article form of \@starttoc, then the book form.

⟨∗amsart | amsproc⟩

  \def\@starttoc#1#2{\begingroup

Remove the skip after the abstract so that we can substitute another.

    \par\removelastskip\vskip\z@skip

The first two arguments of \@startsection here are special values that cause different internal branches to be taken.

    Arguments: {} = name = empty
    \@M = no number should be used and no table of contents entry
    \z@ = indent amount
    12pt + 12pt = vskip before
    6pt = vskip after
    \centering\scshape = format

    \@startsection{}\@M\z@{\linespacing\@plus\linespacing}%
      {.5\linespacing}{\centering\scshape}{#2}%

If we have a list of figures or list of tables we want to put them in the main table of contents, but we don’t want to put an entry there for the main table of contents itself. So we check to see if argument 2 is \contentsname and if it is then we refrain from doing \addcontentsline.

    \ifx\contentsname#2%
    \else \addcontentsline{toc}{section}{#2}\fi
    \makeatletter
    \@input{\jobname.#1}%
    \if@filesw
      \@xp\newwrite\csname tf@#1\endcsname
      \immediate\@xp\openout\csname tf@#1\endcsname \jobname.#1\relax
    \fi
    \global\@nobreakfalse \endgroup
    \addvspace{32\p@\@plus14\p@}%
    \let\tableofcontents\relax
  }

⟨/amsart | amsproc⟩

And here is the book form of \@starttoc.

⟨∗amsbook⟩

  \def\@starttoc#1#2{%
    \begingroup

Inside this group we change \secdef so that we can call \chapter and only get the preliminary part of its definition that we need.

    \let\secdef\@gobbletwo \chapter

If we have a list of figures or list of tables we want to put them in the main table of contents, but we don’t want to put an entry there for the main table of contents itself. So we check to see if argument 2 is \contentsname and if it is then we refrain from doing \addcontentsline.

    \let\@secnumber\@empty % for \@tocwrite and \chaptermark
    \ifx\contentsname#2%
    \else \@tocwrite{chapter}{#2}\fi

Now we do the equivalent of \@schapter. Expand #2 so that it will be easy to apply uppercasing to it. (For \@starttoc we assume that #2 is always a control

such as \contentsname.)
    \typeout{#2}\@xp\chaptermark\@xp{#2}%
    \@makeschapterhead{#2}\@afterheading

And finally we read in the .toc (or whatever) file.

    \makeatletter
    \@input{\jobname.#1}%
    \if@filesw
      \@xp\newwrite\csname tf@#1\endcsname
      \immediate\@xp\openout\csname tf@#1\endcsname \jobname.#1\relax
    \fi
    \global\@nobreakfalse \endgroup
    \newpage
  }

⟨/amsbook⟩

Now it is easy to define \tableofcontents and its relatives.

  \def\contentsname{Contents}
  \def\listfigurename{List of Figures}
  \def\listtablename{List of Tables}
  \def\tableofcontents{\@starttoc{toc}\contentsname}
  \def\listoffigures{\@starttoc{lof}\listfigurename}
  \def\listoftables{\@starttoc{lot}\listtablename}

In order to automatically leave enough space for the ‘number’ part of toc entries, we compute the maximum width of the ‘number’ part for each sectioning level and pass that information to \@tocline through the .aux file.

Init the tocindents if they are not yet set (first run).

  \AtBeginDocument{%
    \@for\@tempa:=-1,0,1,2,3\do{%
      \@ifundefined{r@tocindent\@tempa}{%
        \@xp\gdef\csname r@tocindent\@tempa\endcsname{0pt}}{}%
    }%
  }

\@writetocindents This function writes out the max toc indents to the aux file.

\def\@writetocindents{%
\begingroup
\@for\@tempa:=-1,0,1,2,3\do{%
\immediate\write\@auxout{%
  \string\newlabel{tocindent\@tempa}{%
    \csname r@tocindent\@tempa\endcsname}}%
}%
\endgroup}
%
\AtEndDocument{\@writetocindents}

\indentlabel This function is a no-op except in \@tocwrite where it is a pointer to

\@tochangmeasure.
\let\indentlabel\@empty

\@tochangmeasure This function measures the hangindent part of a toc entry and updates the current max for the given sectioning level, if necessary. The max’s at the end of the document will be written in the form of a pseudo-label to the .aux file by

\@writetocindents.

We can assume that \@tochangmeasure is already inside a group when called.

\def\@tochangmeasure#1{\sbox\z@{#1}%
\ifdim\wd\z@>\csname r@tocindent\@toclevel\endcsname\relax
\@xp\xdef\csname r@tocindent\@toclevel\endcsname{\the\wd\z@}%
\fi
}

Since we don’t have leader dots, we have \@tocline instead of \@dottedtocline.

\def\@tocline#1#2#3#4#5#6#7{\relax
\ifnum #1>\c@tocdepth % then omit
\else
\par \addpenalty\@secpenalty\addvspace{#2}%
\begingroup \hyphenpenalty\@M
\@ifempty{#4}{%
  \@tempdima\csname r@tocindent\number#1\endcsname\relax
}{%
  \@tempdima#4\relax
}%
\parindent\z@ \leftskip#3\relax \advance\leftskip\@tempdima\relax
\rightskip\@pnumwidth plus1em \parfillskip-\@pnumwidth
#5\leavevmode\hskip-\@tempdima #6\relax
\hfil\hbox to\@pnumwidth{\@tocpagenum{#7}}\par
\nobreak
\endgroup
\fi}
\def\@tocpagenum#1{\hss{\mdseries #1}}

The function \@tocwrite writes the information of a section heading to the .toc file in a standard form. It allows different functions to be substituted for \numberline, to get greater control of toc formatting.

 \def\@tocwrite#1{\@xp\@tocwriteb\csname toc#1\endcsname{#1}}

The \chapter command uses \@tocwriteb directly because of the need to write slightly different things to the toc file depending on the current value

of \chaptername.
 \def\@tocwriteb#1#2#3{%
   \begingroup
     \def\@tocline##1##2##3##4##5##6{%
       \ifnum##1>\c@tocdepth
       \else \sbox\z@{##5\let\indentlabel\@tochangmeasure##6}\fi}%
     \csname l@#2\endcsname{#1{\csname#2name\endcsname}{\@secnumber}{}}%
   \endgroup
   \addcontentsline{toc}{#2}%
     {\protect#1{\csname#2name\endcsname}{\@secnumber}{#3}}}

Specs for monograph toc are as follows (tocdepth is 1, i.e. subsections and lower are not listed in toc).

Part: Space above 12pt plus2pt, indent 0pt, "Part" + wordspace +
number + "." + 1em + title (raggedright, no hangindent) + 1em +
page number in column 1.6em wide.
Chapter: Space above 8pt, hangindent on ("Chapter 0" + "." + 1em),
+ title (raggedright) + 1em + page number in column 1.6em wide.
Appendix: Same as Chapter except for epithet "Appendix M"
Section: Space above 0pt, hangindent on (1pc + "0.0" + "." + 1em),
+ title (raggedright) + 1em + page number in column 1.6em wide.

Specs for article toc are as follows (tocdepth 2):

Section: Same as for monograph.
Subsection: Space above 0pt, hangindent 6pc (number + "." + 1em),
+ title (raggedright) + 1em + page number in column 1.6em wide.
Subsubsection: Same as subsection but hangindent 8pc

Typical invocation of \l@chapter:

\contentsline{chapter}{%
  \tocchapter{Chapter}{3}{Some title stuff}}{103}
-->\l@chapter-->
          #1 #2   #3   #4 #5
\@tocline{0}{8pt}{0pt}{} {\bfseries}
   #6           6a       6b 6c                 #7

   {\tocchapter{Chapter}{3}{Some title stuff}}{103}

The \tocchapter is a slightly more useful form than \numberline that allows control for optionally omitting strings like ‘Chapter’ or changing fonts for subcomponents of the toc entry. Note that it is allowed to have appendix and chapter at the same toc level, with \tocappendix instead of \tocchapter written in the .toc file.

The arguments of \@tocline are as follows:

 \@tocline{LEVEL}{VSPACE}{INDENT}{NUMBERWIDTH}{EXTRA}%
   {TEXT}{PAGENUM}

where ‘numberwidth’ is the width of the box allotted to contain the section number, including any preceding word like ‘Chapter’ or ‘Part’. If this width arg is empty then an automatically computed width (max over TOC of the numberwidths for this level) is used. The ‘extra’ argument is formatting such as font changes. The ‘text’ argument contains a section-command specific function like \tocsection or \tocchapter which takes in turn three arguments: epithet, number, topic.

  \def\l@section{\@tocline{1}{0pt}{1pc}{}{}}

The use of \ignorespaces in \tocsection and its relatives means that if #1 is empty, the following space will be also removed.

  \newcommand{\tocsection}[3]{%
    \indentlabel{\@ifnotempty{#2}{\ignorespaces#1 #2.\quad}}#3}
  \def\l@subsection{\@tocline{2}{0pt}{1pc}{5pc}{}}
  \let\tocsubsection\tocsection
  \def\l@subsubsection{\@tocline{3}{0pt}{1pc}{7pc}{}}
  \let\tocsubsubsection\tocsection
  %
  \def\l@part{\@tocline{-1}{12pt plus2pt}{0pt}{}{\bfseries}}
  \let\tocpart\tocsection
  \def\l@chapter{\@tocline{0}{8pt plus1pt}{0pt}{}{}}
  \let\tocchapter\tocsection
  \let\tocappendix\tocchapter
  \def\l@figure{\@tocline{0}{3pt plus2pt}{0pt}{}{}}
  \let\l@table=\l@figure

2.24 Bibliography section or chapter Following the babel package, we use \refname in articles and \bibname in books.

  \def\refname{References}
  \def\bibname{Bibliography}
  %
  \def\bibliographystyle#1{%
     \if@filesw\immediate\write\@auxout
      {\string\bibstyle{#1}}\fi

        \def\@tempa{#1}%
        \def\@tempb{amsplain}%
        \def\@tempc{}%
        \ifx\@tempa\@tempb
                \def\@biblabel##1{##1.}%
                \def\bibsetup{}%
        \else
                \def\bibsetup{\labelsep6\p@}%
        \ifx\@tempa\@tempc
                \def\@biblabel##1{}%
                \def\bibsetup{\labelwidth\z@ \leftmargin24\p@
                \itemindent-24\p@
                          \labelsep\z@ }%
        \fi
\fi}
\newenvironment{thebibliography}[1]{%
⟨amsart | amsproc⟩ \@xp\section\@xp*\@xp{\refname}%
⟨amsbook⟩ \@xp\chapter\@xp*\@xp{\bibname}%
  \normalfont\footnotesize\labelsep .5em\relax
  \renewcommand\theenumiv{\arabic{enumiv}}\let\p@enumiv\@empty
  \list{\@biblabel{\theenumiv}}{\settowidth\labelwidth{\@biblabel{#1}}%
    \leftmargin\labelwidth \advance\leftmargin\labelsep
    \usecounter{enumiv}}%
  \sloppy \clubpenalty\@M \widowpenalty\clubpenalty
  \sfcode`\.=\@m
}{%

Change error for empty list (no items) to warning, to allow authors to leave their bibliography temporarily empty during writing:

  \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}%
  \endlist
}

The \bysame command prints a horizontal dash indicating repetition of the author’s name in consecutive bibliography entries.

\def\bysame{\leavevmode\hbox to3em{\hrulefill}\thinspace}

We define \newblock even though it’s not needed for AMS publication style, just to avoid error messages when a non-AMS .bst file is used. This is a convenience for users; use of \newblock is not recommended for submissions to the AMS.

\def\newblock{}

2.25 Index section or chapter Chapter or section heading for an index. Index is set up to be two columns.

\newif\if@restonecol

⟨∗amsbook⟩

\def\indexchap{\@startsection{chapter}{1}{\z@}{92pt}{10pc}%
  {\centering\fontsize{\@xivpt}{18}\bfseries}}%

⟨/amsbook⟩

\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
  \columnseprule\z@ \columnsep 35\p@

⟨∗amsbook⟩

  \twocolumn[\@xp\indexchap\@xp*\@xp{\indexname}]%

Preexpand \indexname to make it more easily uppercasable.

  \@xp\chaptermark\@xp{\indexname}%

⟨/amsbook⟩

⟨amsart | amsproc⟩ \twocolumn[\@xp\section\@xp*\@xp{\indexname}]%
  \thispagestyle{plain}%
  \let\item\@idxitem
  \parindent\z@  \parskip\z@\@plus.3\p@\relax
  \footnotesize}
\def\indexname{Index}
\def\@idxitem{\par\hangindent 2em}
\def\subitem{\par\hangindent 2em\hspace*{1em}}
\def\subsubitem{\par\hangindent 3em\hspace*{2em}}
\def\endtheindex{\if@restonecol\onecolumn\else\clearpage\fi}
\def\indexspace{\par\bigskip}

2.26 Footnotes In books the footnote counter should reset to 0 at the beginning of each chapter:

⟨amsbook⟩\@addtoreset{footnote}{chapter}

Rule above footnotes is 5 picas wide.

\def\footnoterule{\kern-.4\p@
        \hrule\@width 5pc\kern11\p@\kern-\footnotesep}
%
\def\@makefnmark{\hbox{$\m@th^{\@thefnmark}$}}
%
\def\@makefntext{\indent\@makefnmark}

Add \normalfont before \footnotesize so that fonts will come out properly using the new font selection scheme.

\long\def\@footnotetext#1{\insert\footins{%
  \normalfont\footnotesize
  \interlinepenalty\interfootnotelinepenalty
  \splittopskip\footnotesep \splitmaxdepth \dp\strutbox
  \floatingpenalty\@MM \hsize\columnwidth

Mostly \@parboxrestore does what we want; but not with respect to \parindent

and \tolerance.
  \@parboxrestore \parindent\normalparindent \sloppy
  \edef\@currentlabel{\p@footnote\@thefnmark}%
  \@makefntext{\rule\z@\footnotesep\ignorespaces#1\unskip\strut\par}}}

We change \sloppy to keep it from overriding our normal value of 1pt for \hfuzz and \vfuzz with a LESS sloppy value (.5pt).

\hfuzz=1pt \vfuzz=\hfuzz
\def\sloppy{\tolerance9999 \emergencystretch 3em\relax}

3 Float placement parameters

These control the placing of floating objects like tables and figures. We use much more tolerant values than the LaTeX defaults; the LaTeX defaults are geared to fussier page breaks, at a price of requiring more manual intervention to deal with difficult page breaking problems.

When using LaTeX’s twocolumn option, ‘page’ really means ‘column’, for the parameters that don’t have a dbl prefix: that is, topnumber is then the maximum number of top figures allowed in each column, and so forth.

topnumber maximum number of top figures allowed per page

bottomnumber maximum number of bottom figures allowed per page

totalnumber maximum number of figures (top and bottom) allowed per page

dbltopnumber same as topnumber, but for two-column wide figures, when double-column format is used

  \setcounter{topnumber}{4}
  \setcounter{bottomnumber}{4}
  \setcounter{totalnumber}{4}
  \setcounter{dbltopnumber}{4}

Float fraction parameters.

\topfraction maximum part of the page allowed for top figures, expressed as a decimal fraction. The value of .97 means roughly ‘accept pages that have only two lines of text, and the rest figures’.

\bottomfraction same as .97, but for bottom figures

\textfraction minimum part of the page that must be occupied by text, if the page is to have any text at all. If this value cannot be achieved, L^{A}TEX will turn the current figure or figures into a “float page”, i.e., a page of figures without any text.

\floatpagefraction minimum amount (that is, total combined height) of figures needed before LaTeX will make a float page. This is expressed as a fraction of the normal page height.

\dbltopfraction like .97, but applies only to figures that are two columns wide, when double-column format is used.

\dblfloatpagefraction minimum amount of double-column figure material needed before LaTeX will make a two-column wide “float page”

  \renewcommand{\topfraction}{.97}
  \renewcommand{\bottomfraction}{.97}
  \renewcommand{\textfraction}{.03}
  \renewcommand{\floatpagefraction}{.9}
  \renewcommand{\dbltopfraction}{.97}
  \renewcommand{\dblfloatpagefraction}{.9}

We also modify the default values for spacing around floating figures: (A) so that figures on a float page will not be vertically centered on the total page height but will be flush at the top of the page, and (B) so that there will be slightly more stretchability around figures, to help find better page breaks in difficult situations.

\floatsep Space between consecutive figures

\textfloatsep Space between text and top or bottom figures

\intextsep Space above and below a figure in the middle of the text (i.e., placed with the [h] option)

\dblfloatsep Space between consecutive figures that are two columns wide (when two-column format is used)

\dbltextfloatsep Space between double-column figures and text

\@fptop Space above the first figure on a float page

\@fpsep Space between figures on a float page

\@fpbot Space below the last figure on a float page

\@dblfptop Space above the first double-column figure on a two-column wide float page

\@dblfptop Space between double-column figures on a two-column wide float page

\@dblfptop Space below the last double-column figure on a two-column wide float page

  \setlength{\floatsep}{12pt plus 6pt minus 4pt}
  \setlength{\textfloatsep}{15pt plus 8pt minus 5pt}
  \setlength{\intextsep}{12pt plus 6pt minus 4pt}
  \setlength{\dblfloatsep}{12pt plus 6pt minus 4pt}
  \setlength{\dbltextfloatsep}{15pt plus 8pt minus 5pt}
  \setlength{\@fptop}{0pt}% removed ``plus 1fil''
  \setlength{\@fpsep}{8pt}% removed ``plus 2fil''
  \setlength{\@fpbot}{0pt plus 1fil}
  \setlength{\@dblfptop}{0pt}% removed ``plus 1fil''
  \setlength{\@dblfpsep}{8pt}% removed ``plus 2fil''
  \setlength{\@dblfpbot}{0pt plus 1fil}
   \fps@figure, \fps@table: placement specifications for figure and table

environments. ‘tbp’ means that a figure will be placed at the top or bottom of a page, or on a separate page with no text. This might be changed to ‘tp’, for example, if you never want figures to appear at the bottom of a page.

  \newcommand{\fps@figure}{tbp}
  \newcommand{\fps@table}{tbp}

Some more setup for figures.

  ⟨amsart | amsproc⟩\newcounter{figure}
  ⟨amsbook⟩\newcounter{figure}[chapter]
  \def\captionheadfont@{\scshape}
  \def\captionfont@{\normalfont}
  \def\ftype@figure{1}
  \def\ext@figure{lof}
  \def\fnum@figure{\figurename\ \thefigure}
  \def\figurename{Figure}
  \def\figure{\@float{figure}}
  \let\endfigure=\end@float

And similar for tables.

  ⟨amsart | amsproc⟩\newcounter{table}
  ⟨amsbook⟩\newcounter{table}[chapter]
  \def\ftype@table{2}
  \def\ext@table{lot}
  \def\fnum@table{\tablename\ \thetable}
  \def\tablename{Table}
  \def\table{\@float{table}}
  \let\endtable=\end@float

This is what we want \@makecaption to do: If the total width is greater than normal columnwidth we want to break the caption into lines using a line width of W = (columnwidth - 6pc), and center the resulting block between the margins. Otherwise we want to set the caption as a single line, centered between the margins.

To do this we set the caption as a vbox with line width W, except that we allow the last line (which may be the only line) to have width up to full columnwidth by adding a kern of -6pc. If the result is a single hbox (i.e., a single line) we need to unpack the hbox, remove rightskip, parfillskip, and the -6pc kern, and center the remaining material. If the caption is more than one line, then box 1 contains the last line, which we need to unpack in the same way, and run through the paragraphing process again (because this last line may be up to 6 picas wider than the desired width).

Finally, if the caption is for a figure, it will be set below the figure, so the separating space goes above the caption; otherwise the separating space goes below the caption.

  \long\def\@makecaption#1#2{%

Measure the contents of the caption. If #2 is not empty, then we must add a period and an en-space before typesetting it. The \@caption macro adds an extra \ignorespaces at the beginning of #2, so in order to find out if the user-typed portion is empty we use \@cdr to pull off the \ignorespaces.

  %    Use color-safe commands
    \setbox\@tempboxa\vbox{\color@setgroup
      \advance\hsize-6pc\noindent
      \captionfont@\captionheadfont@#1\@xp\@ifnotempty\@xp
          {\@cdr#2\@nil}{.\captionfont@\upshape\enspace#2}%

\unskip\kern-6pc\par
\global\setbox\@ne\lastbox\color@endgroup}%
\ifhbox\@ne % the normal case
\setbox\@ne\hbox{\unhbox\@ne\unskip\unskip\unpenalty\unkern}%
\fi

If \@tempboxa is not empty at this point then the caption was more than one line long or there was extra vertical mode material, maybe a \write (from \index or something). Interestingly, we can’t use \ifvoid to see if \@tempboxa is empty, because empty is not the same thing as void (as far as the \ifvoid test is concerned). So instead we measure the width of \@tempboxa to see if it’s zero; this should suffice for non-bizarre cases.

\ifdim\wd\@tempboxa=\z@ % this means caption will fit on one line
\setbox\@ne\hbox to\columnwidth{\hss\kern-6pc\box\@ne\hss}%
\else % tempboxa contained more than one line
\setbox\@ne\vbox{\unvbox\@tempboxa\parskip\z@skip
    \noindent\unhbox\@ne\advance\hsize-6pc\par}%
\fi
\ifnum\@tempcnta<64 % if the float IS a figure...
\addvspace\abovecaptionskip
\moveright 3pc\box\@ne
\else % if the float IS NOT a figure...
\moveright 3pc\box\@ne
\nobreak
\vskip\belowcaptionskip
\fi
\relax
}

Allocate the skip registers for above and below caption space.

\newskip\abovecaptionskip \abovecaptionskip=12pt \relax
\newskip\belowcaptionskip \belowcaptionskip=12pt \relax

3.1 Theorems and related structures The handling of theorem environments is broken out into a separate package so that it can be used independently of the amsart/amsbook document classes.

\RequirePackage{amsthm}

We need to make a couple of small modifications in theorem style: the default style provided by the amsthm package is tailored a little bit to the generic article and book document classes.

Use a wider space after the number if it is swapped to the left.

\def\@swapped#1#2{#2%
\@ifnotempty{#1}{\@addpunct{.}\quad#1\unskip}}

Some theorem style parameters that vary from the defaults of the amsthm package are set here.

\def\th@plain{%
⟨amsbook | amsproc⟩ \let\theoremindent\indent
⟨amsbook | amsproc⟩ \theoremheadfont{\scshape}% heading font small caps

  \theoremnotefont{\mdseries\upshape}%
  \theorempreskipamount.5\baselineskip\@plus.2\baselineskip
                                    \@minus.2\baselineskip
  \theorempostskipamount\theorempreskipamount
  \itshape
}
\def\th@definition{%
⟨amsbook | amsproc⟩ \let\theoremindent\indent
⟨amsbook | amsproc⟩ \theoremheadfont{\scshape}% heading font small caps
  \theoremnotefont{\mdseries\upshape}%
  \theorempreskipamount.5\baselineskip\@plus.2\baselineskip
                                    \@minus.2\baselineskip
  \theorempostskipamount\theorempreskipamount
  \upshape
}
\def\th@remark{%
⟨amsbook | amsproc⟩ \let\theoremindent\indent
⟨amsbook | amsproc⟩ \theoremheadfont{\scshape}% heading font small caps
⟨amsart⟩ \theoremheadfont{\itshape}% heading font bold
  \theoremnotefont{\mdseries\upshape}%
  \theorempreskipamount.5\baselineskip\@plus.2\baselineskip
                                    \@minus.2\baselineskip
  \theorempostskipamount\theorempreskipamount
  \upshape
}

In the book style the proof environment uses paragraph indent, and small caps instead of italic for the word “Proof”.

⟨∗amsbook | amsproc⟩

\renewenvironment{proof}[1][\proofname]{\par \normalfont
  \topsep6\p@\@plus6\p@ \trivlist \itemindent\normalparindent
  \item[\hskip\labelsep\scshape
    #1\@addpunct{.}]\ignorespaces
}{%
  \qed\endtrivlist
}

⟨/amsbook | amsproc⟩

For backward compatibility with version 1.1 of amsart, we define pf, pf* environments. And undefine \proof just in case an existing document contains a \newenvironment or \newcommand for it, as that would now cause an error.

\if@compatibility
\let\@newpf\proof \let\proof\relax \let\endproof\relax
\newenvironment{pf}{\@newpf[\proofname]}{\qed\endtrivlist}
\newenvironment{pf*}[1]{\@newpf[#1]}{\qed\endtrivlist}
\fi

3.2 Miscellaneous

\nonbreakingspace Change ~ to be more forgiving of accidental adjacent spaces. Note that this means multiple ~~~... cannot be used to get multiple spaces in the output.

\def\nonbreakingspace{\unskip\nobreak\ \ignorespaces}
\def~{\protect\nonbreakingspace}

Redefine @biblabel to do nothing if the argument is empty. We don’t really care what the previous definition was so we don’t check it.

\def\@biblabel#1{\@ifnotempty{#1}{[#1]}}

Changed \@cite to always use roman/upright, nonbold font, even in italic or bold text (following AMS style).

\def\@cite#1#2{{%

Turn off mathsurround just in case there are subscripts in the cite numbers.

⟨amsart⟩ \m@th\upshape\mdseries[{#1\if@tempswa, #2\fi}]}}
⟨amsbook | amsproc⟩ \m@th\upshape\mdseries[{\bfseries #1}{\if@tempswa, #2\fi}]}}

Make \cite robust if it isn’t already. Too many unsuspecting users get problems from this in a figure or table caption.

\@ifundefined{cite }{%
  \expandafter\let\csname cite \endcsname\cite
  \edef\cite{\@nx\protect\@xp\@nx\csname cite \endcsname}%
}{}

\fullwidthdisplay The function \fullwidthdisplay makes a displayed equation take up the full

column width even if the current context is an indented list.

\def\fullwidthdisplay{\displayindent\z@ \displaywidth\columnwidth}

And we insert the \fullwidthdisplay function at the beginning of \everydisplay just in case any later code in \everydisplay needs to use the values of

\displayindent or \displaywidth.
\edef\@tempa{\noexpand\fullwidthdisplay\the\everydisplay}
\everydisplay\expandafter{\@tempa}

A few odds and ends for indexes:

\newcommand\seename{see also}%
\newcommand\see[2]{{\em \seename\/} #1}%
\newcommand\printindex{\@input{\jobname.ind}}%

3.3 Book style variations Here is the layout for a \maketitle in the amsbook class.

⟨∗amsbook⟩

\def\@maketitle{\cleardoublepage \thispagestyle{empty}%
  \begingroup \topskip\z@skip
  \null\vfil
  \begingroup
  \LARGE\bfseries \centering
  \openup\medskipamount
  \@title\par\vspace{24pt}%
  \def\and{\par\medskip}\centering
  \mdseries\authors\par\bigskip
  \endgroup

  \vfil
  \ifx\@empty\addresses\else
  Author address:
  \@setaddresses\fi
  \vfill
  \newpage\thispagestyle{empty}
  \begin{center}
    \ifx\@empty\@subjclass\else\@setsubjclass\fi
    \ifx\@empty\@translators\else\vfil\@settranslators\fi
    \ifx\@empty\thankses\else\vfil\@setthanks\fi
  \end{center}
  \vfil
  \@setabstract
  \endgroup}

⟨/amsbook⟩

Define the desired form for translator names.

⟨∗amsbook⟩

\def\@settranslators{\par
  \begingroup
  Translated by: \andify\@translators \uppercasenonmath\@translators
  \@translators \@@par
  \endgroup}

⟨/amsbook⟩

4 Hyphenation exceptions

Some common hyphenation exceptions, based on the listing in TUGboat vol 10, no 3, November 1989, pp. 336–341. Many words from the TUGboat list that seemed less likely to occur in mathematical text have been omitted because hyphenation exceptions use up memory (most versions of TeX currently have a limit of 307 on hyphenation exceptions; each added hyphenation exception uses up something like 2 extra words of main memory as well). The list of hyphenations for proper names could be expanded forever if room permitted; we restrict ourselves to a rather short, extremely arbitrary list. Note that the hyphenation rules of British English differ in some particulars from the US rules, so some of the hyphenations given below may need to be overridden for proper UK hyphenation.

\hyphenation{acad-e-my acad-e-mies af-ter-thought anom-aly anom-alies
an-ti-deriv-a-tive an-tin-o-my an-tin-o-mies apoth-e-o-ses
apoth-e-o-sis ap-pen-dix ar-che-typ-al as-sign-a-ble as-sist-ant-ship
as-ymp-tot-ic asyn-chro-nous at-trib-uted at-trib-ut-able bank-rupt
bank-rupt-cy bi-dif-fer-en-tial blue-print busier busiest
cat-a-stroph-ic cat-a-stroph-i-cally con-gress cross-hatched data-base
de-fin-i-tive de-riv-a-tive dis-trib-ute dri-ver dri-vers eco-nom-ics
econ-o-mist elit-ist equi-vari-ant ex-quis-ite ex-tra-or-di-nary
flow-chart for-mi-da-ble forth-right friv-o-lous ge-o-des-ic
ge-o-det-ic geo-met-ric griev-ance griev-ous griev-ous-ly
hexa-dec-i-mal ho-lo-no-my ho-mo-thetic ideals idio-syn-crasy
in-fin-ite-ly in-fin-i-tes-i-mal ir-rev-o-ca-ble key-stroke

lam-en-ta-ble light-weight mal-a-prop-ism man-u-script mar-gin-al
meta-bol-ic me-tab-o-lism meta-lan-guage me-trop-o-lis
met-ro-pol-i-tan mi-nut-est mol-e-cule mono-chrome mono-pole
mo-nop-oly mono-spline mo-not-o-nous mul-ti-fac-eted mul-ti-plic-able
non-euclid-ean non-iso-mor-phic non-smooth par-a-digm par-a-bol-ic
pa-rab-o-loid pa-ram-e-trize para-mount pen-ta-gon phe-nom-e-non
post-script pre-am-ble pro-ce-dur-al pro-hib-i-tive pro-hib-i-tive-ly
pseu-do-dif-fer-en-tial pseu-do-fi-nite pseu-do-nym qua-drat-ic
quad-ra-ture qua-si-smooth qua-si-sta-tion-ary qua-si-tri-an-gu-lar
quin-tes-sence quin-tes-sen-tial re-arrange-ment rec-tan-gle
ret-ri-bu-tion retro-fit retro-fit-ted right-eous right-eous-ness
ro-bot ro-bot-ics sched-ul-ing se-mes-ter semi-def-i-nite
semi-ho-mo-thet-ic set-up se-vere-ly side-step sov-er-eign spe-cious
spher-oid spher-oid-al star-tling star-tling-ly sta-tis-tics
sto-chas-tic straight-est strange-ness strat-a-gem strong-hold
sum-ma-ble symp-to-matic syn-chro-nous topo-graph-i-cal tra-vers-a-ble
tra-ver-sal tra-ver-sals treach-ery turn-around un-at-tached
un-err-ing-ly white-space wide-spread wing-spread wretch-ed
wretch-ed-ly Eng-lish Euler-ian Feb-ru-ary Gauss-ian
Hamil-ton-ian Her-mit-ian Jan-u-ary Japan-ese Kor-te-weg
Le-gendre Mar-kov-ian Noe-ther-ian No-vem-ber Rie-mann-ian Sep-tem-ber}

4.1 Initialization We define a function to do the normal calculations that we want for \textheight

and \textwidth

\calclayout Subtract the height of the running heads:

\def\calclayout{\advance\textheight -\headheight
  \advance\textheight -\headsep

We set \oddsidemargin and \evensidemargin to center the text on the page.

  \oddsidemargin\paperwidth
  \advance\oddsidemargin -\textwidth
  \divide\oddsidemargin\tw@

Now we subtract the default margin provided by standard DVI drivers. But first we make sure that the final margin will be at least .5 inch.

  \ifdim\oddsidemargin<.5truein \oddsidemargin.5truein \fi
  \advance\oddsidemargin -1truein
  \evensidemargin\oddsidemargin

And we set \topmargin to get vertical centering as well.

  \topmargin\paperheight \advance\topmargin -\textheight
  \advance\topmargin -\headheight \advance\topmargin -\headsep

Height of running foot ignored: not present.

  \divide\topmargin\tw@

We provide a minimum of .5in (after compensating for the default margin—see next step).

  \ifdim\topmargin<.5truein \topmargin.5truein \fi

Now subtract the default margin provided by standard DVI drivers.

    \advance\topmargin -1truein\relax
  }

Init the page numbering, etc.

  \calclayout % initialize
  \pagenumbering{arabic}
  \pagestyle{headings}
  \thispagestyle{plain}

Some back-compatibility definitions.

If we are in compatibility mode, add some backward compatibility stuff below. Otherwise quit here.

  \if@compatibility \else\endinput\fi

Compensate for changed meaning of \tiny:

  \def\tiny{\Tiny}

The macro \defaultfont was provided in version 1.1 of amsart; retained for compatibility as a synonym of \normalfont. Resets everything except for size.

  \def\defaultfont{\normalfont}

Macro for making non-slanted numbers and punctuation in italic or slanted text. This is to avoid visual inconsistencies between numbers or parentheses in math and adjacent numbers or parentheses in text.

  \def\rom{\textup}

The usual \endinput to ensure that random garbage at the end of the file doesn’t get copied by docstrip.

  \endinput