From a988ecb92d25909d84ced244bafe0e03c374c7e6 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 11 Jan 2006 23:50:53 +0000 Subject: trunk/Master/texmf-dist/source/latex/amslatex git-svn-id: svn://tug.org/texlive/trunk@140 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/source/latex/amslatex/ams-c1.ins | 80 + Master/texmf-dist/source/latex/amslatex/ams-m1.ins | 69 + Master/texmf-dist/source/latex/amslatex/ams-r1.ins | 43 + Master/texmf-dist/source/latex/amslatex/amsbsy.dtx | 251 + Master/texmf-dist/source/latex/amslatex/amscd.dtx | 333 + .../texmf-dist/source/latex/amslatex/amsclass.dtx | 5204 +++++++++++++ Master/texmf-dist/source/latex/amslatex/amsdtx.dtx | 1192 +++ Master/texmf-dist/source/latex/amslatex/amsgen.dtx | 396 + .../texmf-dist/source/latex/amslatex/amsmath.dtx | 5829 ++++++++++++++ .../texmf-dist/source/latex/amslatex/amsmidx.dtx | 241 + Master/texmf-dist/source/latex/amslatex/amsopn.dtx | 254 + .../texmf-dist/source/latex/amslatex/amsrefs.dtx | 8030 ++++++++++++++++++++ .../texmf-dist/source/latex/amslatex/amstext.dtx | 314 + .../texmf-dist/source/latex/amslatex/amsxport.dtx | 1822 +++++ .../texmf-dist/source/latex/amslatex/amsxtra.dtx | 136 + .../texmf-dist/source/latex/amslatex/ifoption.dtx | 170 + .../source/latex/amslatex/mathscinet.dtx | 595 ++ .../texmf-dist/source/latex/amslatex/pcatcode.dtx | 359 + .../texmf-dist/source/latex/amslatex/rkeyval.dtx | 1116 +++ .../texmf-dist/source/latex/amslatex/textcmds.dtx | 283 + Master/texmf-dist/source/latex/amslatex/upref.dtx | 151 + 21 files changed, 26868 insertions(+) create mode 100644 Master/texmf-dist/source/latex/amslatex/ams-c1.ins create mode 100644 Master/texmf-dist/source/latex/amslatex/ams-m1.ins create mode 100644 Master/texmf-dist/source/latex/amslatex/ams-r1.ins create mode 100644 Master/texmf-dist/source/latex/amslatex/amsbsy.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amscd.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsclass.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsdtx.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsgen.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsmath.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsmidx.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsopn.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsrefs.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amstext.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsxport.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/amsxtra.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/ifoption.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/mathscinet.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/pcatcode.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/rkeyval.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/textcmds.dtx create mode 100644 Master/texmf-dist/source/latex/amslatex/upref.dtx (limited to 'Master') diff --git a/Master/texmf-dist/source/latex/amslatex/ams-c1.ins b/Master/texmf-dist/source/latex/amslatex/ams-c1.ins new file mode 100644 index 00000000000..3145608a278 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/ams-c1.ins @@ -0,0 +1,80 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "ams-c1.ins", +%%% version = "2.20", +%%% date = "2004/08/03", +%%% time = "14:18:09 EDT", +%%% checksum = "43968 80 304 2992", +%%% author = "American Mathematical Society", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% copyright = "Copyright 1999 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% email = "tech-support@math.ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, amsart, amsbook, amsproc, amsthm, install", +%%% supported = "yes", +%%% abstract = "This is an installation file that will generate +%%% loadable package and class files when run +%%% through \LaTeX{}.", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +\def\batchfile{ams-c1.ins} +\input docstrip.tex +\preamble +\endpreamble + +\keepsilent + +\csname newtoks\endcsname\filesmsg +\def\dofile#1#2#3{\generateFile{#1}{f}{\from{#2}{#3}}% + \filesmsg\expandafter{\the\filesmsg + \Msg{* \space\space#1}}} + +% Packages +\dofile{amsthm.sty}{amsclass.dtx}{amsthm} +\dofile{upref.sty}{upref.dtx}{} +\dofile{amsmidx.sty}{amsmidx.dtx}{} + +% Document class amsart: +\dofile{amsart.cls}{amsclass.dtx}{amsart,classes} +% Document class amsbook: +\dofile{amsbook.cls}{amsclass.dtx}{amsbook,classes} +% Document class amsproc: +\dofile{amsproc.cls}{amsclass.dtx}{amsproc,classes} + +% Document class for printing AMS documentation files: +\dofile{amsdtx.cls}{amsdtx.dtx}{amsdtx} + +\ifToplevel{ +\Msg{******************************************************************} +\Msg{*} +\Msg{* To get documentation for the amsart, amsbook, and amsproc} +\Msg{* documentclasses, run LaTeX on instr-l.tex.} +\Msg{*} +\Msg{* To get documentation for the amsthm package, run LaTeX on} +\Msg{* amsthdoc.tex; see also thmtest.tex.} +\Msg{*} +\Msg{******************************************************************} +} + +\endinput +} diff --git a/Master/texmf-dist/source/latex/amslatex/ams-m1.ins b/Master/texmf-dist/source/latex/amslatex/ams-m1.ins new file mode 100644 index 00000000000..a03642e51a7 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/ams-m1.ins @@ -0,0 +1,69 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "ams-m1.ins", +%%% version = "1.05", +%%% date = "2000/05/25", +%%% time = "16:28:35 EDT", +%%% checksum = "13352 69 258 2600", +%%% author = "American Mathematical Society", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@math.ams.org (Internet)", +%%% supported = "yes", +%%% copyright = "Copyright 1999 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% keywords = "latex, amsmath, ams-latex, installation", +%%% abstract = "This is an installation file that will generate +%%% loadable package and class files when run +%%% through \LaTeX{}.", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +\def\batchfile{ams-m1.ins} +\input docstrip.tex +\preamble +\endpreamble + +\keepsilent + +\csname newtoks\endcsname\filesmsg +\def\dofile#1#2#3{\generateFile{#1}{f}{\from{#2}{#3}}% + \filesmsg\expandafter{\the\filesmsg + \Msg{* \space\space#1}}} + +% Math packages +\dofile{amsmath.sty}{amsmath.dtx}{} +\dofile{amsgen.sty}{amsgen.dtx}{} +\dofile{amstext.sty}{amstext.dtx}{} +\dofile{amsopn.sty}{amsopn.dtx}{} +\dofile{amsbsy.sty}{amsbsy.dtx}{} +\dofile{amscd.sty}{amscd.dtx}{} +\dofile{amsxtra.sty}{amsxtra.dtx}{} + +\ifToplevel{ +\Msg{******************************************************************} +\Msg{*} +\Msg{* To produce the User's Guide for amsmath, run amsldoc.tex through} +\Msg{* LaTeX.} +\Msg{*} +\Msg{******************************************************************} +} + +\endinput diff --git a/Master/texmf-dist/source/latex/amslatex/ams-r1.ins b/Master/texmf-dist/source/latex/amslatex/ams-r1.ins new file mode 100644 index 00000000000..c4a552ebcba --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/ams-r1.ins @@ -0,0 +1,43 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "ams-r1.ins", +%%% version = "1.04", +%%% date = "2001/12/24", +%%% time = "12:50:14 EST", +%%% author = "Michael J Downes", +%%% address = "American Mathematical Society, +%%% Publications Technical Group, +%%% PO Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% email = "tech-support@ams.org", +%%% URL = "http://www.ams.org/", +%%% abstract = "A docstrip batch file for the amsrefs package", +%%% checksum = "21160 39 121 1555", +%%% docstring = "The checksum field, produced by Robert Solovay's +%%% checksum utility, gives CRC-16 checksum, lines, +%%% words, and characters.", +%%% } +%%% ==================================================================== +\def\batchfile{ams-r1.ins} +\input docstrip.tex +\preamble +\endpreamble +\keepsilent +\generateFile{pcatcode.sty}{f}{\from{pcatcode.dtx}{}} +\generateFile{ifoption.sty}{f}{\from{ifoption.dtx}{}} +\generateFile{rkeyval.sty}{f}{\from{rkeyval.dtx}{}} +\generateFile{amsrefs.sty}{f}{\from{amsrefs.dtx}{pkg}} +\generateFile{textcmds.sty}{f}{\from{textcmds.dtx}{pkg}} +\generateFile{mathscinet.sty}{f}{\from{mathscinet.dtx}{}} +%\generateFile{amsjpa.sty}{f}{\from{amsjpa.dtx}{}} +% Remove \endinput from postamble +\postamble +\endpostamble +\generateFile{amsrn.bst}{f}{\from{amsxport.dtx}{bst,sort,plain}} +\generateFile{amsru.bst}{f}{\from{amsxport.dtx}{bst,plain}} +\generateFile{amsra.bst}{f}{\from{amsxport.dtx}{bst,sort,alpha}} +\generateFile{amsry.bst}{f}{\from{amsxport.dtx}{bst,sort,alpha,y2k}} +\generateFile{amsrs.bst}{f}{\from{amsxport.dtx}{bst,sort,short}} +%\generateFile{amsj.bib}{f}{\from{amsxport.dtx}{abbrevs}} +\endinput diff --git a/Master/texmf-dist/source/latex/amslatex/amsbsy.dtx b/Master/texmf-dist/source/latex/amslatex/amsbsy.dtx new file mode 100644 index 00000000000..30c4dee1bbf --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsbsy.dtx @@ -0,0 +1,251 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsbsy.dtx", +%%% version = "1.2d", +%%% date = "1999/11/29", +%%% time = "14:26:42 EST", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% checksum = "08988 251 1238 9625", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, bold symbol, pmb", +%%% supported = "yes", +%%% abstract = "This is a \LaTeX{} package that provides a command +%%% for producing bold math symbols when appropriate +%%% fonts exist, and a `poor man's bold' command that +%%% can be applied when no appropriate bold font +%%% is available.", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +%\iffalse +%<*driver> +\documentclass{amsdtx} +\usepackage{amsbsy} +\begin{document} +\title{The \pkg{amsbsy} package} +\author{Frank Mittelbach\and Rainer Sch\"opf\and Michael Downes} +\date{Version \fileversion, \filedate} +\hDocInput{amsbsy.dtx} +\end{document} +% +%\fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% +% The package \texttt{amsbsy}, first written in 1989, implements a +% few commands for producing \textbf{bold} characters in the `normal' +% \emph{math version}. +% \begin{quote}\em +% Note: It is recommended nowadays to use the \pkg{bm} package, which +% became available in 1997. +% \end{quote} +% +% If we have bold fonts which contain the character in question then +% we will use these fonts to produce the wanted character. But +% sometimes math fonts are only available in a certain weight +% (e.g.\ the AMS symbol fonts). +% \DescribeMacro\pmb +% For these cases we provide a command which is called \verb+\pmb+ (an +% acronym for \textbf{p}oor \textbf{m}an's \textbf{b}old) with one argument. +% The bolder weight is achieved by copying the argument three times in +% slightly different positions which is better than nothing but no +% match for a real bold font. +% +% \DescribeMacro\boldsymbol +% There also exists the \verb+\boldsymbol+ command which is better in +% all cases where bold fonts exists. This command will internally +% switch to the corresponding `bold' \emph{math version} typeset its +% argument in this version. +% +% Both commands will preserve the nature of their arguments, i.e.\ if +% they get a relational atom their result will again be a relation as +% far as \tex/'s mathspacing is concerned. +% +% Since it is good policy to make at least a small test we try to +% typeset the infinity sign ($\infty$) first with \verb+\pmb+ and then +% with \verb+\boldsymbol+. +% \[ +% \pmb{\infty} = \boldsymbol{\infty} \quad ? +% \] +% \StopEventually{} +% +% Standard package info. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1994/12/01]% LaTeX date must December 1994 or later +\ProvidesPackage{amsbsy}[1999/11/29 v1.2d] +% \end{macrocode} +% +% \section{The implementation} +% +% We need some functions from the \pkg{amsgen} package. +% \begin{macrocode} +\RequirePackage{amsgen} +% \end{macrocode} +% +%\begin{macro}{\boldsymbol} +% In implementing boldsymbol, we must take into account \tex/'s +% limitation of only 16 mathgroups (math families, in Knuth's +% terminology). If we wanted to maintain mathgroups for both the bold +% and non-bold version of each math font, it would not take long to +% run out of mathgroups. Therefore what we do instead for a bold +% symbol is embed it in an \verb|\hbox|; inside that \verb|\hbox|, +% when we start another math formula, we can change all the +% mathgroups to their bold equivalents. +% +% However, to get the correct math style inside the hbox (display, +% text, script or scriptscript) we have to use \verb|\mathchoice|. +% Since \verb|\mathversion{bold}| has a lot of overhead, and +% \verb|\mathchoice| typesets the argument text four times, we would +% rather not put the \verb|\mathversion| command inside each +% \verb|\hbox| in the \verb|\mathchoice|; on the other hand, +% \verb|\mathversion| gives an error message if it's used in math +% mode. Therefore if we want to execute \verb|\mathversion{bold}| +% before starting the \verb|\mathchoice| we have to temporarily +% disable the \verb|\@nomath| error. (The error message is intended +% to keep people from accidentally emboldening a preceding part of a +% math formula, since only the mathgroups defined at the end of a +% math formula will determine the fonts used in that formula; but we +% are going to typeset our bold symbol not in the current formula but +% in an embedded formula, so that this danger doesn't apply here.) +% \begin{macrocode} +\DeclareRobustCommand{\boldsymbol}[1]{% +% \end{macrocode} +% Start a group to localize the change of \verb|\@nomath|: +% \begin{macrocode} + \begingroup +% \end{macrocode} +% Disable \verb|\@nomath| so that we don't have to leave math +% mode before executing \verb|\mathversion|: +% \begin{macrocode} + \let\@nomath\@gobble \mathversion{bold}% +% \end{macrocode} +% \cs{math@atom} is a test macro which looks at its argument and +% produces a math atom of the proper class. +% \begin{macrocode} + \math@atom{#1}{% +% \end{macrocode} +% Although it is tempting to use \verb|\text| here, to save some +% main memory, that caused a bug in the past due to some internal +% interactions with \verb|\mathversion|. +% \begin{macrocode} + \mathchoice% + {\hbox{$\m@th\displaystyle#1$}}% + {\hbox{$\m@th\textstyle#1$}}% + {\hbox{$\m@th\scriptstyle#1$}}% + {\hbox{$\m@th\scriptscriptstyle#1$}}}% +% \end{macrocode} +% End the group we started earlier. +% \begin{macrocode} + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\math@atom} +% The macro \verb+\math@atom+ looks at its argument and produce a +% correct math atom, i.e.\ a primitive like \verb+\mathopen+. +% Until the day we have a real implementation for all cases we use +% the \verb+\binrel@+ command from \amstex/ which can distinguish +% between binary, relation and ord atoms. +% \begin{macrocode} +\def\math@atom#1#2{% + \binrel@{#1}\binrel@@{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pmb} +% Poor man's bold command, works by typesetting multiple copies of +% the given argument with small offsets. +% \begin{macrocode} +\DeclareRobustCommand{\pmb}{% + \ifmmode\else \expandafter\pmb@@\fi\mathpalette\pmb@} +% \end{macrocode} +% +% \cs{pmb@@} is called by \cn{pmb} in the non-math-mode case. +% Discard the first two arguments which are for the math-mode case. +% \begin{macrocode} +\def\pmb@@#1#2#3{\leavevmode\setboxz@h{#3}% + \dimen@-\wdz@ + \kern-.5\ex@\copy\z@ + \kern\dimen@\kern.25\ex@\raise.4\ex@\copy\z@ + \kern\dimen@\kern.25\ex@\box\z@ +} +% \end{macrocode} +% +% \begin{macrocode} +\newdimen\pmbraise@ +% \end{macrocode} +% Note: because of the use of \cs{mathpalette}, if \cs{pmb@} is applied to a +% single math italic character (or a single character from some other +% slanted math font), the italic correction will be added. This will +% cause subscripts to fall too far away from the character in some +% cases, e.g., $\pmb{T}_1$ or $\pmb{\mathcal{T}}_1$. +% \begin{macrocode} +\def\pmb@#1#2{\setbox8\hbox{$\m@th#1{#2}$}% + \setboxz@h{$\m@th#1\mkern.5mu$}\pmbraise@\wdz@ + \binrel@{#2}% + \dimen@-\wd8 % + \binrel@@{% + \mkern-.8mu\copy8 % + \kern\dimen@\mkern.4mu\raise\pmbraise@\copy8 % + \kern\dimen@\mkern.4mu\box8 }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\def\binrel@#1{\begingroup + \setboxz@h{\thinmuskip0mu + \medmuskip\m@ne mu\thickmuskip\@ne mu + \setbox\tw@\hbox{$#1\m@th$}\kern-\wd\tw@ + ${}#1{}\m@th$}% +% \end{macrocode} +% The \cn{noexpand} here should be unnecessary, but just in case +% \ldots +% \begin{macrocode} + \edef\@tempa{\endgroup\let\noexpand\binrel@@ + \ifdim\wdz@<\z@ \mathbin + \else\ifdim\wdz@>\z@ \mathrel + \else \relax\fi\fi}% + \@tempa +} +% \end{macrocode} +% For completeness, assign a default value for \cs{binrel@@}. +% \begin{macrocode} +\let\binrel@@\relax +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{131} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amscd.dtx b/Master/texmf-dist/source/latex/amslatex/amscd.dtx new file mode 100644 index 00000000000..7dd765109d1 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amscd.dtx @@ -0,0 +1,333 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amscd.dtx", +%%% version = "2.0", +%%% date = "1999/11/29", +%%% time = "14:30:07 EST", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995, 1999 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% checksum = "07428 333 1152 12117", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, commutative diagram", +%%% supported = "yes", +%%% abstract = "This is a \LaTeX{} package that adapts the +%%% commutative diagram macros of AMS-\TeX{} for +%%% use in \LaTeX{}", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +%\iffalse +%<*driver> +\documentclass{amsdtx} +\usepackage{amscd} +% Dummy citation to avoid error in an example. +\bibcite{fre:cichon}{C} +\begin{document} +\title{The \pkg{amscd} package} +\author{Frank Mittelbach\and Rainer Sch\"opf\and Michael Downes} +\date{Version \fileversion, \filedate} +\hDocInput{amscd.dtx} +\end{document} +% +%\fi +% +% \maketitle +% +% \MakeShortVerb\| +% \newcommand{\operatorname}[1]{\mathop{\mathrm{#1}}} +% \newcommand{\per}{\operatorname{per}} +% \newcommand{\cov}{\operatorname{cov}} +% \newcommand{\non}{\operatorname{non}} +% \newcommand{\cf}{\operatorname{cf}} +% \newcommand{\add}{\operatorname{add}} +% \newcommand{\End}{\operatorname{End}} +% +% \section{Introduction} +% +% The \pkg{amscd} package provides a \env{CD} environment that +% emulates the commutative diagram capabilities of \amstex/ version +% 2.x. This means that only simple rectangular diagrams are +% supported, with no diagonal arrows or more exotic features. Many +% users will be better served by one of the more powerful diagram +% packages such as \pkg{diagram}, \pkg{xypic}, or \pkg{kuvio}. +% +% Example: +% \begin{equation}\begin{CD} +% S^{{\mathcal{W}}_\Lambda}\otimes T @>j>> T\\ +% @VVV @VV{\End P}V\\ +% (S\otimes T)/I @= (Z\otimes T)/J +% \end{CD}\end{equation} +% \begin{verbatim} +% \begin{equation}\begin{CD} +% S^{{\mathcal{W}}_\Lambda}\otimes T @>j>> T\\ +% @VVV @VV{\End P}V\\ +% (S\otimes T)/I @= (Z\otimes T)/J +% \end{CD}\end{equation} +% \end{verbatim} +% (assuming \cn{End} is defined as an `operator name'. +% +% Another example: +% +% We will make liberal use of Cichon's Diagram \cite{fre:cichon}: +% \begin{equation} +% \begin{CD} +% \cov(\mathcal{L}) @>>> \non(\mathcal{K}) @>>> \cf(\mathcal{K}) @>>> +% \cf(\mathcal{L})\\ +% @VVV @AAA @AAA @VVV\\ +% \add(\mathcal{L}) @>>> \add(\mathcal{K}) @>>> \cov(\mathcal{K}) @>>> +% \non(\mathcal{L}) +% \end{CD}\end{equation} +% \begin{verbatim} +% \begin{equation}\begin{CD} +% \cov(\mathcal{L}) @>>> \non(\mathcal{K}) @>>> \cf(\mathcal{K}) @>>> +% \cf(\mathcal{L})\\ +% @VVV @AAA @AAA @VVV\\ +% \add(\mathcal{L}) @>>> \add(\mathcal{K}) @>>> \cov(\mathcal{K}) @>>> +% \non(\mathcal{L}) +% \end{CD}\end{equation} +% \end{verbatim} +% +% \StopEventually{} +% +% Standard package info. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1994/12/01]% LaTeX date must December 1994 or later +\ProvidesPackage{amscd}[1999/11/29 v2.0] +% \end{macrocode} +% \begin{macrocode} +\RequirePackage{amsgen} +% \end{macrocode} +% Better not to redefine \verb|\math@cr| if it is already defined, +% because for CD use only we want to omit the part of the code +% related to \verb|\dspbrk@lvl| (see \fn{amsmath.sty}). +% +% [mjd,1999/11/04] These definitions have gone somewhat obsolete; but +% we had probably better leave them as they are for backward +% compatibility. +% \begin{macrocode} +\@ifundefined{math@cr}{% + \def\math@cr{{\ifnum0=`}\fi + \@ifstar{\global\@eqpen\@M\math@cr@}% + {\global\@eqpen\interdisplaylinepenalty \math@cr@}} +% \end{macrocode} +% The following section merely duplicates some code from the +% \pkg{amsmath} package, in case the \pkg{amscd} package is used by +% itself. For documentation of the code refer to \fn{amsmath.dtx}. +% \begin{macrocode} + \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} + \def\math@cr@@[#1]{\ifnum0=`{\fi}\math@cr@@@ + \noalign{\vskip#1\relax}} + \def\restore@math@cr{\def\math@cr@@@{\cr}} +}{} +\restore@math@cr +% \end{macrocode} +% [mjd,1999/11/04] These definitions too are somewhat obsolete; +% but we had probably better leave them as they are for backward +% compatibility. +% \begin{macrocode} +\@ifundefined{rightarrowfill@}{ + \def\rightarrowfill@#1{\m@th\setboxz@h{$#1-$}\ht\z@\z@ + $#1\copy\z@\mkern-6mu\cleaders + \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill + \mkern-6mu\mathord\rightarrow$} + \def\leftarrowfill@#1{\m@th\setboxz@h{$#1-$}\ht\z@\z@ + $#1\mathord\leftarrow\mkern-6mu\cleaders + \hbox{$#1\mkern-2mu\copy\z@\mkern-2mu$}\hfill + \mkern-6mu\box\z@$} + \def\leftrightarrowfill@#1{\m@th\setboxz@h{$#1-$}\ht\z@\z@ + $#1\mathord\leftarrow\mkern-6mu\cleaders + \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill + \mkern-6mu\mathord\rightarrow$} +}{} +% \end{macrocode} +% +% \begin{macrocode} +\def\atdef@#1{\expandafter\def\csname\space @\string#1\endcsname} +\@ifundefined{Iat}{% + \DeclareRobustCommand{\Iat}{\FN@\at@} +}{} +\begingroup \catcode`\@=\active +% \end{macrocode} +% Define math \qc{\@} to replicate its mathcode-dictated behavior. +% This is in case \qc{\@} occurs outside of \env{CD}. +% \begin{macrocode} +\csname if\string @compatibility\endcsname +\else \fam=\mathcode`\@ + \xdef @{\mathchar\number\fam\space } +\fi +\gdef\CDat{\let @=\Iat} +\endgroup +\mathcode`\@="8000 % make @ pseudo-active in math +\def\at@{\let\next@\at@@ + \ifcat\noexpand\next a\else + \ifcat\noexpand\next0\else + \ifcat\noexpand\next\relax\else + \let\next@\at@@@\fi\fi\fi\next@} +\def\at@@#1{\expandafter + \ifx\csname\space @\string#1\endcsname\relax + \DN@{\at@@@#1}% + \else + \DN@{\csname\space @\string#1\endcsname}% + \fi\next@}% +% \end{macrocode} +% The following items should be defined only if they are not +% already defined, either to leave the package name untouched (in +% the case of \cs{PackageError}) or to avoid redundant allocation +% of token or dimen registers. +% \begin{macrocode} +\@ifundefined{default@tag}{% + \def\default@tag{% + \def\tag{\PackageError{amscd}{\protect\tag\space not allowed + here}\@eha}}% +}{}% +\@ifundefined{at@@@}{% + \def\at@@@{\PackageError{amscd}{\Invalid@@ @}{\the\athelp@}\char64\relax} +}{} +\@ifundefined{athelp@}{\csname newhelp\endcsname\athelp@ +{Only certain combinations beginning with @ make sense to me.^^J% +I'll assume you wanted @@ for a printed @.}}{} +\@ifundefined{minaw@}{\newdimen\minaw@}{} +\@ifundefined{bigaw@}{\newdimen\bigaw@}{} +% \end{macrocode} +% +% Assignment of a couple of dimensions, and initialization of +% \verb=\ampersand@=. We check to see if we need to define +% \verb=\minaw@= and \verb=\bigaw@=. +% \begin{macrocode} +\minaw@11.111pt +\newdimen\minCDarrowwidth +\minCDarrowwidth2.5pc +\newif\ifCD@ +\let\ampersand@\relax +% \end{macrocode} +% +% Added \verb|\restore@math@cr\default@tag| to fix line numbering +% problems, 7-JUN-1991. Suggested by I.~Zakharevich. +% \begin{macrocode} +\newenvironment{CD}{% + \CDat + \bgroup\relax\iffalse{\fi\let\ampersand@&\iffalse}\fi + \CD@true\vcenter\bgroup\let\\\math@cr\restore@math@cr\default@tag + \tabskip\z@skip\baselineskip20\ex@ + \lineskip3\ex@\lineskiplimit3\ex@\halign\bgroup + &\hfill$\m@th##$\hfill\crcr +}{% + \crcr\egroup\egroup\egroup +} +% \end{macrocode} +% +% \begin{macro}{\CD@check} +% This check is used by all macros that must not appear outside the +% \env{CD} environment. The first argument is the symbol to be used +% after \verb+@+, the second one the action to be performed. +% +% Once again we use the trick of defining a temporary control +% sequence \verb+\next@+ and calling it after the final \verb+\fi+. +% This is not absolutely necessary, but it ensures that the +% conditional text is processed in one and the same column +% of the enclosing alignment. +% \begin{macrocode} +\def\CD@check#1#2{\ifCD@\DN@{#2}\else + \DN@{\PackageError{amscd}{@\protect#1 not + allowed outside of the CD environment}\@eha}% + \fi\next@} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\atdef@>#1>#2>{\ampersand@ + \ifCD@ \global\bigaw@\minCDarrowwidth \else \global\bigaw@\minaw@ \fi + \setboxz@h{$\m@th\scriptstyle\;{#1}\;\;$}% + \ifdim\wdz@>\bigaw@\global\bigaw@\wdz@\fi +% \end{macrocode} +% If \verb|#2| is empty we can save some work. +% \begin{macrocode} + \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;{#2}\;\;$}% + \ifdim\wd\@ne>\bigaw@\global\bigaw@\wd\@ne\fi}% + \ifCD@\enskip\fi + \mathrel{\mathop{\hbox to\bigaw@{\rightarrowfill@\displaystyle}}% + \limits^{#1}\@ifnotempty{#2}{_{#2}}}% + \ifCD@\enskip\fi \ampersand@} +% +\atdef@<#1<#2<{\ampersand@ + \ifCD@ \global\bigaw@\minCDarrowwidth \else \global\bigaw@\minaw@ \fi + \setboxz@h{$\m@th\scriptstyle\;\;{#1}\;$}% + \ifdim\wdz@>\bigaw@ \global\bigaw@\wdz@ \fi + \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;\;{#2}\;$}% + \ifdim\wd\@ne>\bigaw@ \global\bigaw@\wd\@ne \fi}% + \ifCD@\enskip\fi + \mathrel{\mathop{\hbox to\bigaw@{\leftarrowfill@\displaystyle}}% + \limits^{#1}\@ifnotempty{#2}{_{#2}}}% + \ifCD@\enskip\fi \ampersand@} +% \end{macrocode} +% +% Variants of the above two arrows, using \verb|(| and \verb|)| +% characters instead of \verb|<| and \verb|>| characters, are +% provided for those whose keyboards don't have the latter. +% \begin{macrocode} +\begingroup \catcode`\~=\active \lccode`\~=`\@ +\lowercase{% + \global\atdef@)#1)#2){~>#1>#2>} + \global\atdef@(#1(#2({~<#1<#2<} +}% end lowercase +\endgroup +% \end{macrocode} +% +% \begin{macrocode} +\atdef@ A#1A#2A{\CD@check{A..A..A}{\llap{$\m@th\vcenter{\hbox + {$\scriptstyle#1$}}$}\Big\uparrow + \rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}} +% +\atdef@ V#1V#2V{\CD@check{V..V..V}{\llap{$\m@th\vcenter{\hbox + {$\scriptstyle#1$}}$}\Big\downarrow + \rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}} +% +\atdef@={\CD@check={&\enskip\mathrel + {\vbox{\hrule\@width\minCDarrowwidth\vskip2\ex@\hrule\@width + \minCDarrowwidth}}\enskip&}} +% +\atdef@|{\CD@check|{\Big\Vert&&}} +% +\atdef@\vert{\CD@check\vert{\Big\Vert&&}} +% +\atdef@.{\CD@check.{&&}} +% \end{macrocode} +% +% The \cn{pretend} command has weird syntax that doesn't fit well +% with standard \latex/ syntax so we leave it undone, at least for +% now. [mjd,1994/10/27] +% \begin{macrocode} +%\def\pretend#1\haswidth#2{\setboxz@h{$\m@th\scriptstyle{#2}$}\hbox +% to\wdz@{\hfill$\m@th\scriptstyle{#1}$\hfill}} +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{459} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsclass.dtx b/Master/texmf-dist/source/latex/amslatex/amsclass.dtx new file mode 100644 index 00000000000..956b379d23a --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsclass.dtx @@ -0,0 +1,5204 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsclass.dtx", +%%% version = "2.20", +%%% date = "2004/08/06", +%%% time = "13:03:53 EDT", +%%% checksum = "53558 5204 20497 185872", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995, 1999, 2004 +%%% American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Publications Technical Group, +%%% 201 Charles Street, +%%% Providence, RI 02904, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, AMS, documentclass, theorem", +%%% supported = "yes", +%%% abstract = "This is the source for the amsthm package and three +%%% AMS document classes: amsart, amsproc, and amsbook. +%%% They are designed for use with LaTeX.", +%%% docstring = "The checksum field above contains a CRC-16 checksum +%%% as the first value, followed by the equivalent of +%%% the standard UNIX wc (word count) utility output of +%%% lines, words, and characters. This is produced by +%%% Robert Solovay's checksum utility.", +%%% } +%%% ==================================================================== +% +% \iffalse +%<*driver> +\documentclass{amsdtx} + +\CodelineIndex + +\begin{document} +\title{% + The \cls{amsart}, \cls{amsproc}, and \cls{amsbook} document~classes} +\author{American Mathematical Society\\Michael Downes\\ + updated by Barbara Beeton} +\date{Version \fileversion, \filedate} +\hDocInput{amsclass.dtx} +\end{document} +% +% \fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% This file (\fn{amsclass.dtx}) is the master file for three \latex/ +% document classes, \cls{amsart}, \cls{amsproc}, and \cls{amsbook}, +% which are intended for articles and books containing mathematical +% research. They produce output that follows the style conventions of +% American Mathematical Society publications. The theorem setup +% features of these document classes are also available in a separate +% package, \pkg{amsthm}. +% +% \StopEventually{} +% +% \section{Implementation} +% +% Three document class files and one package file (\fn{amsthm.sty}) +% are produced from this source. Most of the code of the \fn{amsthm} +% package is used in all four derived files. Most of the remaining +% code is used in all three document class files. Fine tuning is done +% with additional docstrip guards. +% +% The usual name, date, and version information. (Note: the reason +% each \cs{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.) +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1995/06/01]% LaTeX date must be June 1995 or later +%<*amsart> +\ProvidesClass{amsart}[2004/08/06 v2.20] +% +%<*amsproc> +\ProvidesClass{amsproc}[2004/08/06 v2.20] +% +%<*amsbook> +\ProvidesClass{amsbook}[2004/08/06 v2.20] +% +% \end{macrocode} +% For \pkg{amsthm} we need to guard against redundant loading via +%\begin{verbatim} +% \documentclass{amsart} +% \usepackage{amsthm} +%\end{verbatim} +% because in that case the usual \cs{RequirePackage} mechanism for +% avoiding redundant loading will not apply. We need to simulate the +% loading of the \pkg{amsthm} package. +% \begin{macrocode} +%<*classes> +\global\expandafter\let\csname ver@amsthm.sty\expandafter\endcsname + \csname ver@\@currname.\@currext\endcsname +% +%<*amsthm> +\ProvidesPackage{amsthm}[2004/08/06 v2.20] +% +% \end{macrocode} +% +% The following code is shared by the classes and the \pkg{amsthm} +% package. Cf.~\fn{amsgen.sty}. +% \begin{macrocode} +\let\@xp=\expandafter +\let\@nx=\noexpand +\def\@oparg#1[#2]{\@ifnextchar[{#1}{#1[#2]}} +\long\def\@ifempty#1{\@xifempty#1@@..\@nil} +\long\def\@xifempty#1#2@#3#4#5\@nil{% + \ifx#3#4\@xp\@firstoftwo\else\@xp\@secondoftwo\fi} +\long\def\@ifnotempty#1{\@ifempty{#1}{}} +\def\setboxz@h{\setbox\z@\hbox} +\def\@addpunct#1{% + \relax\ifhmode + \ifnum\spacefactor>\@m \else#1\fi + \fi} +% \end{macrocode} +% \cn{nopunct} should have a value for \cn{spacefactor} that is +% not used for \cn{frenchspacing}. +% \begin{macrocode} +\def\nopunct{\spacefactor 1007 } +\def\frenchspacing{\sfcode`\.1006\sfcode`\?1005\sfcode`\!1004% + \sfcode`\:1003\sfcode`\;1002\sfcode`\,1001 } +% \end{macrocode} +% +% If this class is loaded by a parent document class, then we want +% to use the name of the parent class. Otherwise the name of the +% current class file. +% \begin{macrocode} +%<*classes> +\def\@tempa#1#2\@nil{\edef\@classname{#1}} +\expandafter\@tempa\@currnamestack{}{}{}\@nil +\ifx\@classname\@empty \edef\@classname{\@currname}\fi +% \end{macrocode} +% +% \subsection{Support for conditional text} +% +% [This needs to be documented in the users' guide, including the +% idea of using \verb'\for{5ed}{\linebreak}' to mark edition-specific +% line and page breaks. [mjd,1999/12/27]] +% +% We would sometimes like to be able to mark fragments of text to be +% conditionally discarded or typeset. For example in the title of a +% section if we want to add a linebreak but prevent this linebreak +% from also taking effect in the table of contents. +% +% Certain kinds of switches need to be built into the low-level +% structure of our document class in order to be useful. For example, +% inside the toc we need to arrange for an \qq{in-toc?} test to yield +% true. +% +% \begin{macrocode} +\def\@True{00} +\def\@False{01} +\newcommand\newswitch[2][False]{% + \expandafter\@ifdefinable\csname ?@#2\endcsname{% + \global\expandafter\let\csname ?@#2\expandafter\endcsname + \csname @#1\endcsname + }% +} +\newcommand{\setFalse}[1]{% + \expandafter\let\csname ?@#1\endcsname\@False +} +\newcommand{\setTrue}[1]{% + \expandafter\let\csname ?@#1\endcsname\@True +} +% \end{macrocode} +% The empty switch is by default false; i.e., if you write +%\begin{verbatim} +% \for{}{...} +%\end{verbatim} +% the material will be discarded. +% \begin{macrocode} +\newswitch{} +% \end{macrocode} +% +% To get a line break in a section title but not in the table of +% contents line for that section, use +% \verb'\except{toc}{\linebreak}'. (Presumably you are already giving +% a shortened running head version separately, if applicable.) +% \begin{macrocode} +\DeclareRobustCommand{\except}[1]{% + \if\csname ?@#1\endcsname \expandafter\@gobble + \else \expandafter\@firstofone + \fi +} +\DeclareRobustCommand{\for}[1]{% + \if\csname ?@#1\endcsname \expandafter\@firstofone + \else \expandafter\@gobble + \fi +} +% \end{macrocode} +% +% The \cn{forany} command needs to run through a comma-separated list +% of switch names and print its second argument if any of the +% switches are true. +% \begin{macrocode} +\DeclareRobustCommand{\forany}[1]{% + \csname for@any@01\endcsname#1,?,\@nil +} +\@namedef{for@any@\@False}#1,{% + \csname for@any@% + \csname ?@\zap@space#1 \@empty\endcsname + \endcsname +} +\@namedef{?@?}{x} +\@namedef{for@any@\@True}#1\@nil#2{#2} +\def\for@any@x{\@car\@gobble} +% \end{macrocode} +% +% \subsection{Options} +% \subsubsection{Notes} +% Options will be processed in the order they are declared; +% cf.~\cs{ProcessOptions}. +% +% \subsubsection{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 } +% \end{macrocode} +% +% The options \opt{landscape} and \opt{portrait} swap paper height +% and width. +% \begin{macrocode} +\DeclareOption{landscape}{\@tempdima\paperheight + \paperheight\paperwidth \paperwidth\@tempdima} +\DeclareOption{portrait}{} +% \end{macrocode} +% +% \subsubsection{Two-sided or one-sided printing} +% +% For two-sided printing we set the switch \cs{if@twoside} which +% will cause the margins to be adjusted so that the type blocks of +% back-to-back pages will line up. The \cs{if@mparswitch} makes margin +% paragraphs print in the outside margin. +% \begin{macrocode} +\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +% \end{macrocode} +% +% \subsubsection{Draft or final version} +% +% The \opt{draft} option causes overfull lines to be marked with +% a black slug in the right margin. +% \begin{macrocode} +\DeclareOption{draft}{\overfullrule5\p@ + \ClassWarningNoLine{\@classname}{% + When the draft option is used, the + \protect\includegraphics\MessageBreak + command will print blank placeholder boxes\MessageBreak + for the graphics}% +} +\DeclareOption{final}{\overfullrule\z@ } +% \end{macrocode} +% +% \subsubsection{Posting date} +% +% The date when an article is officially posted to the WWW is recorded +% in a variable \cs{@dateposted} with the \cn{dateposted} command. +% +% \begin{macrocode} +\def\dateposted#1{\def\@dateposted{#1}}% +\let\@dateposted\@empty +% \end{macrocode} +% +% \begin{macrocode} +%<*amsart> +\def\@setdateposted{% + \newline Article electronically published on \@dateposted} +% +% \end{macrocode} +% +% \subsubsection{Logos} +% +% The following logo is used for regular journal articles. The one +% for proceedings articles and the one for e-only journals are given +% separately. +% \begin{macrocode} +%<*amsart> +\def\article@logo{% + \set@logo{% + \publname +% \end{macrocode} +% Current volume might be empty when an article is first posted to +% the WWW. In that case leave out the issue-specific info. +% \begin{macrocode} + \ifx\@empty\currentvolume + \else \newline\volinfo, \pageinfo + \fi + \newline \@PII + \ifx\@empty\@dateposted \else \@setdateposted\fi + }% +} +\def\eonly@logo{% + \set@logo{% + \publname + \newline\volinfo, \pageinfo + \ifx\@empty\@dateposted \else \@setdateposted\fi + \newline \@PII + }% +} +% +% \end{macrocode} +% +% \begin{macrocode} +%<*amsart|amsproc> +\def\@logofont{\fontsize{6}{7\p@}\selectfont} +\long\def\set@logo#1{% + \vbox to\headheight{% + \@parboxrestore \@logofont + \noindent#1\par\vss + }% +} +% +% \end{macrocode} +% +% \begin{macrocode} +%<*amsproc> +\def\procart@logo{% + \set@logo{\publname + \ifx\@empty\volinfo \else\newline\volinfo\fi}% +} +% +% \end{macrocode} +% +% \subsubsection{E-only journal} +% +% Electronic-only journals (for \cls{amsart} only) have different +% information in the series logo than paper-only or dual journals. +% Only the volume number is reported (no issue or year), and the +% posting date is added following the page numbers. [bnb, 1996/10/31] +% +% This option will be invoked only from publication-specific \fn{.cls} +% files. +% \begin{macrocode} +%<*amsart> +\DeclareOption{e-only}{% + \def\volinfo{Volume \currentvolume}% + \dateposted{Xxxx XX, XXXX}% + \def\@setdateposted{\ (\@dateposted)}% + \let\article@logo\eonly@logo +} +% +% \end{macrocode} +% +% \subsubsection{Title page} +% +% The title and related information can optionally be printed on a +% separate page. +% \begin{macrocode} +\newif\if@titlepage +\DeclareOption{titlepage}{\@titlepagetrue} +\DeclareOption{notitlepage}{\@titlepagefalse} +% \end{macrocode} +% +% \subsubsection{Start on right- or left-hand page} +% +% For some book series, it's permissible to start chapters on a +% left-hand page. Default to `openright', the usual AMS book style. +% \begin{macrocode} +%<*amsbook> +\newif\if@openright +\DeclareOption{openright}{\@openrighttrue} +\DeclareOption{openany}{\@openrightfalse} +\@openrighttrue +% +% \end{macrocode} +% +% \subsubsection{Two-column printing} +% +% Two-column layout is handled through a predefined internal switch. +% \begin{macrocode} +\DeclareOption{onecolumn}{\@twocolumnfalse} +\DeclareOption{twocolumn}{\@twocolumntrue} +% \end{macrocode} +% +% \subsubsection{The nomath option} +% +% The \opt{nomath} option causes most of the extra math features to +% be omitted. Some utility functions will be defined below if this +% option is specified. +% \begin{macrocode} +\DeclareOption{nomath}{} +% \end{macrocode} +% +% \subsubsection{Some font options} +% +% The \opt{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 \fn{.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. +% \begin{macrocode} +\DeclareOption{noamsfonts}{} +% \end{macrocode} +% The \opt{psamsfonts} option, passed on to the \pkg{amsfonts} package, +% means that alternative \fn{.fd} files should be used that do not +% refer to \fn{.tfm} files for sizes 6,8,9 (which are not present in +% the PostScript (Type 1) AMS fonts set from Y\&Y/Blue Sky Research). +% This should also trigger the \opt{cmex10} option of \pkg{amsmath}, +% to avoid trying to load sizes 7--9 of \fn{cmex}. +% \begin{macrocode} +\DeclareOption{psamsfonts}{% + \PassOptionsToPackage{psamsfonts}{amsfonts}% + \PassOptionsToPackage{cmex10}{amsmath}} +% \end{macrocode} +% +% \subsubsection{Equation numbering on the left or right} +% +% The option \opt{leqno}---equation numbers on the left---is the +% default in AMS styles. Therefore we provide also a \opt{reqno} +% option. +% \begin{macrocode} +\newif\iftagsleft@ +\DeclareOption{leqno}{% + \tagsleft@true \PassOptionsToPackage{leqno}{amsmath}} +\DeclareOption{reqno}{% + \tagsleft@false \PassOptionsToPackage{reqno}{amsmath}} +% \end{macrocode} +% +% \subsubsection{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 +% \opt{tbtags} option `top/bottom tags'. +% \begin{macrocode} +\newif\ifctagsplit@ +\DeclareOption{centertags}{% + \ctagsplit@true \PassOptionsToPackage{centertags}{amsmath}} +\DeclareOption{tbtags}{% + \ctagsplit@false \PassOptionsToPackage{tbtags}{amsmath}} +% \end{macrocode} +% +% \subsubsection{Flush left displays} +% +% The option \opt{fleqn} causes displayed equations to print +% aligned on the left instead of centered, with an indentation +% of \cs{mathindent} from the prevailing left margin. If the +% \pkg{amsmath} package is loaded, most of this code will be +% overridden, but it seems we need it anyway because of the +% possibility of the \opt{nomath} class option. +% +% \begin{macrocode} +\DeclareOption{fleqn}{}% +% \end{macrocode} +% +% \subsubsection{Dealing with font sizes} +% +% \begin{macro}{\@mainsize} +% \begin{macro}{\@ptsize} +% Instead of the miserly \cs{@ptsize} variable from \latex/'s +% ancient history that contains only the last digit of the main +% typesize, we set up a proper variable \cs{@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 +% \cs{@ptsize} also. +% \begin{macrocode} +\newcommand{\@mainsize}{10} +\newcommand{\@ptsize}{0} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\larger} +% \begin{macro}{\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 \cn{normalsize}, \cn{small}, \cn{Small}, \cn{SMALL}, +% \cn{tiny}, \cn{Tiny}, \cn{large}, \cn{Large}, \cn{LARGE}, +% \cn{huge}, \cn{Huge}. Spaces are left at either end of the case +% statement to accommodate adding \cn{TINY} and \cn{HUGE} in the +% future but it's not clear that they're really needed. +% \begin{macrocode} +\newcommand{\larger}[1][1]{% + \count@\@currsizeindex \advance\count@#1\relax + \ifnum\count@<\z@ \count@\z@ \else\ifnum\count@>12 \count@12 \fi\fi +% \end{macrocode} +% The various size-changing commands \cn{normalsize}, etc., will take +% care of updating \cs{@currsizeindex}. +% \begin{macrocode} + \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]} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% The \cs{@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 \cs{@adjustvertspacing} function is only called in +% the range between `footnote' size and `Large' size. Notice that no +% shrinkability is used. +% \begin{macrocode} +\def\@adjustvertspacing{% +% \end{macrocode} +% \cs{big/med/smallskipamount} are generic space values that will be +% used by the commands \cn{bigskip}, \cn{medskip}, \cn{smallskip}. We +% also link the spacing around displayed equations to these amounts. +% \begin{macrocode} + \bigskipamount.7\baselineskip plus.7\baselineskip + \medskipamount\bigskipamount \divide\medskipamount\tw@ + \smallskipamount\medskipamount \divide\smallskipamount\tw@ + \abovedisplayskip\medskipamount + \belowdisplayskip \abovedisplayskip +% \end{macrocode} +% 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 +% \cs{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. +% \begin{macrocode} + \abovedisplayshortskip\abovedisplayskip + \advance\abovedisplayshortskip-1\abovedisplayskip + \belowdisplayshortskip\abovedisplayshortskip + \advance\belowdisplayshortskip 1\smallskipamount +% \end{macrocode} +% The traditional value for \cs{jot} is 3pt, which we generalize +% to \cs{baselineskip}/4. This is used to adjust interline spacing in +% multiline displayed equations. +% \begin{macrocode} + \jot\baselineskip \divide\jot 4 \relax +} +% \end{macrocode}% +% +% 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 \cn{TINY} and \cn{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 \cn{tiny} now +% selects 6pt instead of 5pt by default. +% +% In version 1.1 of \cls{amsart} and \cls{amsbook} \cn{small} was +% the same as \cn{footnotesize} (\cls{amsproc} didn't exist in v. 1.1). +% +% The only size-changing command that is predefined by \latex/ is +% \cn{normalsize}; that's why it's the only one for which we use +% \cn{renewcommand} below. +% \begin{macrocode} +\renewcommand\normalsize{\@xsetfontsize\normalsize 6% + \@adjustvertspacing \let\@listi\@listI} +\DeclareRobustCommand{\Tiny}{\@xsetfontsize\Tiny 1} +\DeclareRobustCommand{\tiny}{\@xsetfontsize\tiny 2} +\DeclareRobustCommand{\SMALL}{\@xsetfontsize\SMALL 3} +\DeclareRobustCommand{\Small}{\@xsetfontsize\Small 4% + \@adjustvertspacing + \def\@listi{\topsep\smallskipamount \parsep\z@skip \itemsep\z@skip + \leftmargin=\leftmargini + \labelwidth=\leftmargini \advance\labelwidth-\labelsep + }% +} +\DeclareRobustCommand{\small}{\@xsetfontsize\small 5\@adjustvertspacing} +% \end{macrocode} +% For backward compatibility we had better define \cn{footnotesize} +% and \cn{scriptsize}. Also there is the small discrepancy with +% \cn{tiny} to worry about. +% \begin{macrocode} +\def\footnotesize{\Small} +\def\scriptsize{\SMALL} +% \end{macrocode} +% +% The sizes above 10pt use magstep values, stored in the functions +% \cs{@xipt}, \cs{@xiipt}, etc. +% \begin{macrocode} +\DeclareRobustCommand{\large}{\@xsetfontsize\large 7\@adjustvertspacing} +\DeclareRobustCommand{\Large}{\@xsetfontsize\Large 8\@adjustvertspacing} +\DeclareRobustCommand{\LARGE}{\@xsetfontsize\LARGE 9} +\DeclareRobustCommand{\huge}{\@xsetfontsize\huge{10}} +\DeclareRobustCommand{\Huge}{\@xsetfontsize\Huge{11}} +%\DeclareRobustCommand\HUGE{\@xsetfontsize\HUGE{12}} +% \end{macrocode} +% +% So now we had better define the \cs{@xsetfontsize} function. +% The size-changing commands use \cs{@setfontsize} instead of +% \cn{fontsize} to (a)~give an error message if used in math mode and +% (b)~set the \cs{@currsize} variable. +% \begin{macrocode} +\def\@xsetfontsize#1#2{% + \chardef\@currsizeindex#2\relax + \edef\@tempa{\@nx\@setfontsize\@nx#1% + \@xp\ifcase\@xp\@currsizeindex\@typesizes +% \end{macrocode} +% Add nonsense values 99/99 at the end just in case some extreme +% error turns up. +% \begin{macrocode} + \else{99}{99}\fi}% + \@tempa +} +% \end{macrocode} +% For the record let's initialize \cs{@currsizeindex}. +% \begin{macrocode} +\chardef\@currsizeindex=6 +% \end{macrocode} +% +% Set page-breaking penalties to prevent all widows, orphans, and +% hyphens at the end of a page. +% \begin{macrocode} +\widowpenalty=10000 +\clubpenalty=10000 +\brokenpenalty=10000 +% \end{macrocode} +% +% Set some default linespacing values. The variable \cs{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. +% \begin{macrocode} +\newdimen\linespacing +\lineskip=1pt \lineskiplimit=1pt +\normallineskip=1pt \normallineskiplimit=1pt +\let\baselinestretch=\@empty +% \end{macrocode} +% +% Settings for \cn{textheight} and \cn{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 \cs{topskip} to get the proper value for the text +% block. +% \begin{macrocode} +\headheight=8pt \headsep=14pt +%\footskip=18pt +%\footskip=12pt +\textheight=50.5pc \topskip=10pt +\textwidth=30pc +\columnsep=10pt \columnseprule=0pt +% \end{macrocode} +% Some settings for marginpars. +% \begin{macrocode} +\marginparwidth=90pt +\marginparsep=11pt +\marginparpush=5pt +% \end{macrocode} +% To avoid setting text before begin-document, we postpone the +% setting of \cs{footnotesep} using \cs{AtBeginDocument}. +% \begin{macrocode} +\AtBeginDocument{\settoheight{\footnotesep}{\footnotesize M$^1$}} +% \end{macrocode} +% +% \begin{macrocode} +\skip\footins=7pt plus11pt +\skip\@mpfootins=\skip\footins +% \end{macrocode} +% +% \begin{macrocode} +\fboxsep=3pt \fboxrule=.4pt +% \end{macrocode} +% +% \begin{macrocode} +\arrayrulewidth=.4pt \doublerulesep=2pt +\labelsep=5pt \arraycolsep=\labelsep +\tabcolsep=\labelsep \tabbingsep=\labelsep +% \end{macrocode} +% +% \begin{macrocode} +\floatsep=15pt plus 12pt \dblfloatsep=15pt plus 12pt +\textfloatsep=\floatsep \dbltextfloatsep=15pt plus 12pt +\intextsep=\floatsep +% \end{macrocode} +% +% \begin{macrocode} +\@fptop=0pt plus1fil \@dblfptop=0pt plus1fil +\@fpbot=0pt plus1fil \@dblfpbot=0pt plus1fil +\@fpsep=8pt plus2fil \@dblfpsep=8pt plus2fil\relax +% \end{macrocode} +% Note that \cs{parskip} gets no stretch; this is at variance with +% the generic \latex/ classes. +% \begin{macrocode} +\parskip=0pt \relax +% \end{macrocode} +% +% \cs{@parboxrestore}, used by \cs{@footnotetext}, sets +% \cs{parindent} to |0pt|; since this is not what we want, we +% make a new dimen \cs{normalparindent} and after calling +% \cs{@parboxrestore}, \cs{@footnotetext} resets +% \cs{parindent} back to normal. +% \begin{macrocode} +\newdimen\normalparindent +%\normalparindent=12pt +%\normalparindent=18pt +\parindent=\normalparindent +% \end{macrocode} +% +% \begin{macrocode} +\partopsep=0pt \relax \parsep=0pt \relax \itemsep=0pt \relax +% \end{macrocode} +% +% \begin{macrocode} +\@lowpenalty=51 \@medpenalty=151 \@highpenalty=301 +\@beginparpenalty=-\@lowpenalty +\@endparpenalty=-\@lowpenalty +\@itempenalty=-\@lowpenalty +% \end{macrocode} +% +% \subsubsection{Typesize-specific code} +% +% The class option \opt{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 \opt{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 \fn{.clo} +% files. So instead of analogs for the generic \fn{size10,11,12.clo} +% files we have the code for those options entirely contained in the +% \fn{.cls} file in the form of declared options. +% +% Some miscellaneous remarks. +% +% ---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 document class +% definitions of the fontsize changing commands. So we don't try. +% +% \begin{macrocode} +\DeclareOption{10pt}{\def\@mainsize{10}\def\@ptsize{0}% + \def\@typesizes{% +% \end{macrocode} +% There should be 11 typesize/baselineskip pairs: five below +% \cn{normalsize} and five above. +% \begin{macrocode} + \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 +} +% \end{macrocode} +% +% \subsubsection{Running heads} +% The normal application of pagestyle functions \cs{ps@xxx} is to +% determine the contents of running heads and feet. The function +% \cs{@mkboth} is used internally by commands \cn{chapter}, +% \cn{section}, and the like to set the running heads. +% \begin{macrocode} +\def\ps@empty{\let\@mkboth\@gobbletwo + \let\@oddhead\@empty \let\@evenhead\@empty + \let\@oddfoot\@empty \let\@evenfoot\@empty +% \end{macrocode} +% The current implementation in \cls{amsart}/\cls{amsproc}/\cls{amsbook} +% of the vertical space at the top of an opening page uses \cs{topskip}, +% which means that we need to do some resetting here. +% \begin{macrocode} + \global\topskip\normaltopskip} +% \end{macrocode} +% Pagestyle `plain' has the page numbers in the running feet. +% \begin{macrocode} +\def\ps@plain{\ps@empty + \def\@oddfoot{\normalfont\scriptsize \hfil\thepage\hfil}% + \let\@evenfoot\@oddfoot} +% \end{macrocode} +% +% Pagestyle `headings' uses text from sectioning commands for +% running heads. Empty running feet. +% \begin{macrocode} +\newswitch{runhead} +% \end{macrocode} +% +% \begin{macrocode} +\def\ps@headings{\ps@empty + \def\@evenhead{% + \setTrue{runhead}% + \normalfont\scriptsize + \rlap{\thepage}\hfil + \def\thanks{\protect\thanks@warning}% + \leftmark{}{}\hfil}% + \def\@oddhead{% + \setTrue{runhead}% + \normalfont\scriptsize \hfil + \def\thanks{\protect\thanks@warning}% + \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}% +% +} +% \end{macrocode} +% +% \begin{macro}{\sectionname} +% \begin{macro}{\subsectionname} +% \begin{macro}{\subsubsectionname} +% \begin{macro}{\paragraphname} +% \begin{macro}{\subparagraphname} +% Initialize section headings. +% \begin{macrocode} +\let\sectionname\@empty +\let\subsectionname\@empty +\let\subsubsectionname\@empty +\let\paragraphname\@empty +\let\subparagraphname\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% The default definitions of \cs{leftmark}, \cs{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.~\fn{amsppt.sty}. +% \begin{macrocode} +\def\leftmark{\expandafter\@firstoftwo\topmark{}{}} +\def\rightmark{\expandafter\@secondoftwo\botmark{}{}} +% \end{macrocode} +% +% Journal and Proceedings articles require an indication of the first +% page so the logo and copyright line can appear. +% \begin{macrocode} +%<*amsart|amsproc> +\def\ps@firstpage{\ps@plain + \def\@oddfoot{\normalfont\scriptsize \hfil\thepage\hfil +% \end{macrocode} +% Stick in the reset of \cs{topskip} here so it only gets executed +% after the first page is completed. +% \begin{macrocode} + \global\topskip\normaltopskip}% + \let\@evenfoot\@oddfoot + \def\@oddhead{\@serieslogo\hss}% + \let\@evenhead\@oddhead % in case an article starts on a left-hand page +} +% +% \end{macrocode} +% +% \begin{macro}{\@nilgobble} +% Something that apparently doesn't exist in the kernel? +% \begin{macrocode} +\long\def\@nilgobble#1\@nil{} +% \end{macrocode} +% \end{macro} +% +% A general section-marking function. Arg 1 is either \cn{markright} +% or \cn{markboth} indicating which kind of marking action is desired +% (this gives us some string pool/hash table savings by allowing the +% \cs{@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 \cs{xxxname} (but could be +% empty). Arg 4 is the section-title text. Assumption: whenever +% \cs{@secmark} is called, the section-number variable +% \cs{@secnumber} has been set to the value of the current section +% number (possibly empty, in the case of a |*| section for example). +% \begin{macrocode} +%<*amsbook> +\def\@secmark#1#2#3#4{% +% \end{macrocode} +% We want to apply expansion to \cs{xxxname} and \cs{thexxx} but not +% to the other elements. +% \begin{macrocode} + \begingroup \let\protect\@unexpandable@protect + \edef\@tempa{\endgroup \toks@{\protect#2{#3}{\@secnumber}}}% + \@tempa + \toks@\@xp{\the\toks@{#4}}% +% \end{macrocode} +% If a \cn{markright} operation is called for, use the current +% left-mark via \cs{@temptokena}. +% \begin{macrocode} + \afterassignment\@nilgobble\@temptokena\@themark{}\@nil + \edef\@tempa{\@nx\@mkboth{% + \ifx\markright#1\the\@temptokena\else\the\toks@\fi}{\the\toks@}}% + \@tempa} +% \end{macrocode} +% Init \cs{@secnumber}. +% \begin{macrocode} +\let\@secnumber\@empty +% +% \end{macrocode} +% +% Fix \cn{markboth} so that \cs{@secmark} can work without too much +% thrashing. +% \begin{macrocode} +\def\markboth#1#2{% + \begingroup + \@temptokena{{#1}{#2}}\xdef\@themark{\the\@temptokena}% + \mark{\the\@temptokena}% + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi} +% \end{macrocode} +% +% With the myheadings pagestyle, no automatic running heads will be +% provided by the document class; only running heads specified by +% the user through explicit \cn{markboth} or \cn{markright} +% commands will be used. +% \begin{macrocode} +\def\ps@myheadings{\ps@headings \let\@mkboth\@gobbletwo} +% \end{macrocode} +% +% Save normal topskip value in a skip register. +% \begin{macrocode} +\newskip\normaltopskip +\normaltopskip=10pt \relax +% \end{macrocode} +% +% We also want to turn off all section marks. First-level section +% heads will be defined in \cs{ps@headings}. +% \begin{macrocode} +\let\sectionmark\@gobble +\let\subsectionmark\@gobble +\let\subsubsectionmark\@gobble +\let\paragraphmark\@gobble +% \end{macrocode} + +% \subsubsection{Unrecognized options} +% +% The \opt{makeidx} option is redundant; everything that it does in +% the generic \latex/ classes is already done anyway in this class. +% \begin{macrocode} +\DeclareOption{makeidx}{} +% +% \end{macrocode} +% +% Unrecognized options for \pkg{amsthm} are treated as references +% to auxiliary theorem setup (\fn{.thm}) files. This allows a user +% to create theorem styles using internal commands (with |@| signs) +% without having to be concerned about category coding. +% +% Here is an example from the file \fn{thmtest.tex} which is part +% of this collection. See that file for further information. +%\begin{verbatim} +% \begin{filecontents}{exercise.thm} +% \def\th@exercise{% +% \normalfont % body font +% \thm@headpunct{:}% +% } +% \end{filecontents} +%\end{verbatim} +% +% This facility is available only when \pkg{amsthm} is used as an +% independent package, not as part of an AMS document class. +% \begin{macrocode} +%<*amsthm> +\DeclareOption*{\input{\CurrentOption .thm}} +\ProcessOptions +% +% \end{macrocode} +% +% \subsection{Process options} +% +% Black boxes for overfull lines are turned off by default (the +% \opt{final} option). This can be overridden with the \opt{draft} +% option. +% \begin{macrocode} +%<*classes> +\ExecuteOptions{leqno,centertags,letterpaper,portrait,% + 10pt,twoside,onecolumn,final} +% \end{macrocode} +% Options will be processed in the order of the associated +% \cs{DeclareOption} commands. +% \begin{macrocode} +\ProcessOptions\relax +% \end{macrocode} +% +% In compatibility mode, we want to load the frozen version of +% \fn{amstex.sty} instead of the \pkg{amsmath} package. This is +% rather a horrible kluge but I can't see anything better at the +% moment. [mjd,1995/01/27] +% \begin{macrocode} +\if@compatibility + \def\@tempa{\RequirePackage{amstex}\relax}% +\else + \@ifclasswith{\@classname}{nomath}{% + \let\@tempa\relax + }{% + \def\@tempa{\RequirePackage{amsmath}\relax}% + }% +\fi +\@tempa % load amstex.sty or amsmath.sty +% \end{macrocode} +% If the \opt{nomath} option was specified, then \cn{numberwithin} +% and \cs{@emptytoks} remain to be defined. +% \begin{macrocode} +\@ifundefined{numberwithin}{% + \newcommand{\numberwithin}[3][\arabic]{% + \@ifundefined{c@#2}{\@nocounterr{#2}}{% + \@ifundefined{c@#3}{\@nocnterr{#3}}{% + \@addtoreset{#2}{#3}% + \@xp\xdef\csname the#2\endcsname{% + \@xp\@nx\csname the#3\endcsname .\@nx#1{#2}}}}% + } + \csname newtoks\endcsname\@emptytoks +}{} +% \end{macrocode} +% +% If the \opt{noamsfonts} option was called for, skip the +% \pkg{amsfonts} package load. +% \begin{macrocode} +\if@compatibility +\else + \@ifclasswith{\@classname}{noamsfonts}{% + % amsfonts package is not wanted + }{% + % amsfonts package IS wanted; test whether a recent enough version + % seems to be installed + \begingroup \fontencoding{U}\fontfamily{msa}\try@load@fontshape\endgroup + \global\@xp\let\csname U+msa\endcsname\relax % reset + \@ifundefined{U/msa/m/n}{% + \ClassError{\@classname}{% + Package `amsfonts' not installed, or version too old?\MessageBreak + Unable to get font info for the `msam' fonts in the expected form% + }{% + The amsfonts package will not be loaded, to avoid probable\MessageBreak + incompatibility problems. You can (a) use the `noamsfonts' + documentclass\MessageBreak + option next time, or (b) check that the amsfonts package is + installed\MessageBreak + correctly, and is not too old to be compatible.% + }% + }{% + \RequirePackage{amsfonts}[1995/01/01]\relax + }% + } +\fi % end yesamsfonts branch +% \end{macrocode} +% +% \subsection{Basic AMS style features} +% +% AMS style requires that blank pages between chapters be \emph{really} +% blank: no running heads, no page numbers. To accomplish this, +% redefine \cn{cleardoublepage} to do the right thing. [bnb, 1999/07/17] +% \begin{macrocode} +\let\cleardouble@page\cleardoublepage +% \end{macrocode} +% Postpone the redefinition of \cs{cleardoublepage} to begin-document +% to work around difficulties with old versions of \fn{gsm-l.cls}. +% \begin{macrocode} +\AtBeginDocument{% + \ifx\cleardouble@page\cleardoublepage + \def\cleardoublepage{\clearpage{\pagestyle{empty}\cleardouble@page}} + \fi +} +% \end{macrocode} +% +% Now a utility macro to do \cn{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} (\cn{ss}) and the undotted i and j (\cn{i} +% and \cn{j}), used sometimes with accents. We redefine them to be +% uppercase equivalents. (Undotted \cn{i} and \cn{j} in math would be +% typed as \cn{imath} and \cn{jmath}.) +% +% Spaceskip is changed in accordance with recommendations for +% increased interword spacing in all-caps text by e.g.\ `Words into +% Type'. +% \begin{macrocode} +\newcommand{\uppercasenonmath}[1]{\toks@\@emptytoks +% Insert an extra \@empty to avoid removing braces around arg \arg{1}. + \@xp\@skipmath\@xp\@empty#1$$% +% \end{macrocode} +% The \cs{protect} here is in case the shorttitle gets used for +% shortauthors and we get redundant application of \cn{MakeUppercase}. +% Double braces limit the scope so that later elements in title block +% aren't uppercased, e.g., \cn{i} in an address. [bnb, 2004/04/01] +% \begin{macrocode} + \edef#1{{\@nx\protect\@nx\@upprep\the\toks@}}% +} +% \end{macrocode} +% +% \begin{macro}{\@upprep} +% Preparations for printing all-caps text. +% \begin{macrocode} +\newcommand{\@upprep}{% + \spaceskip1.3\fontdimen2\font plus1.3\fontdimen3\font + \upchars@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\upchars@} +% In all-caps text, esszet 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. +% \begin{macrocode} +\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}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Mc} +% The use of \cn{Mc} makes it possible for `Mc' to get special +% treatment when uppercasing is applied. +% \begin{macrocode} +\providecommand{\Mc}{Mc} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@skipmath} +% \begin{macro}{\@xskipmath} +% \cs{@skipmath} searches for |$...$| in order to keep from applying +% \cn{uppercase} to the contents. Then it calls \cs{@xskipmath} to +% search for |\(...\)|. +% \begin{macrocode} +\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}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\altucnm} +% \begin{macrocode} +\def\altucnm#1{% + \MakeTextUppercase{\toks@{#1}}% + \edef#1{\the\toks@}% +} +\AtBeginDocument{% + \@ifundefined{MakeTextUppercase}{}{\let\uppercasenonmath\altucnm}% +} +% \end{macrocode} +% \end{macro} +% +% For older versions of \latex/ this might be needed too: +% \begin{macrocode} +\@ifundefined{MakeUppercase}{\let\MakeUppercase\uppercase}{}% +% \end{macrocode} +% +% \begin{macro}{\today} +% The command \cn{today} produces today's date in the form most +% commonly used in the U.S. +% \begin{macrocode} +\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} +% \end{macrocode} +% \end{macro} +% +% \subsection{Old font commands} +% The \cn{em} command is not redefined here (let's say, to give an +% `obsolete' warning and recommend instead \cn{emph}) because there +% is no alternative internal command \cs{emshape}. +% \begin{macrocode} +\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} +% \end{macrocode} +% +% This warning might have been a good idea back in 1995 but I don't +% think we can add it now [mjd,2000/03/10]. +%\begin{verbatim} +%%\if@compatibility +%%\else +%% \def\@obsolete@fontswitch#1#2#3{% +%% \@latex@warning@no@line{% +%% Command {\string#1...}\on@line\space is obsolete;\MessageBreak +%% the LaTeX2e equivalent is \string#3{...}}% +%% \gdef#1{\@fontswitch\relax#3}% +%% } +%% \DeclareRobustCommand*\cal{% +%% \@xp\@obsolete@fontswitch\csname cal \endcsname\relax\mathcal} +%% \DeclareRobustCommand*\mit{% +%% \@xp\@obsolete@fontswitch\csname mit \endcsname\relax\mathnormal} +%%\fi +%\end{verbatim} +% There's too great a chance that some people out there have +% documents that begin with +%\begin{verbatim} +%\documentclass{amsart} +%... +%\newcommand{\cal}{\mathcal} +%\end{verbatim} +% and such documents would now get error messages. +% +% Since \cs{cal} is not documented as a valid command for \LaTeXe/, I +% think it is OK to leave the status as is for AMS document classes. +% If you use \cs{documentstyle}, \cs{cal} will work. If you use +% \cs{documentclass}, well, it's a good idea to update to +% \cs{mathcal} instead of leaving old instances of \cs{cal}. +% +% \subsection{Top matter} +% For the \cn{title} command, we support an optional argument to give +% a shortened version of the title for running heads. +% \begin{macrocode} +\renewcommand*{\title}[2][]{\gdef\shorttitle{#1}\gdef\@title{#2}} +% \end{macrocode} +% 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 \ncn{[re]newcommand}. Here is how to use \cs{@dblarg} +% in conjunction with the preceding \cn{newcommand}: +% \begin{macrocode} +\edef\title{\@nx\@dblarg + \@xp\@nx\csname\string\title\endcsname} +% \end{macrocode} +% The \cn{author} command accepts an optional argument similar to +% that of the \cn{title} command. +% Moved update of \cn{addresses} within scope of \cs{else} to avoid +% adding anything if no authors, and thus avoiding output of ``Author +% address'' on monograph titlepage. [bnb, 1996/11/03] +% \begin{macrocode} +\renewcommand{\author}[2][]{% + \ifx\@empty\authors + \gdef\authors{#2}% + \else + \g@addto@macro\authors{\and#2}% + \g@addto@macro\addresses{\author{}}% + \fi + \@ifnotempty{#1}{% + \ifx\@empty\shortauthors + \gdef\shortauthors{#1}% + \else + \g@addto@macro\shortauthors{\and#1}% + \fi + }% +} +\edef\author{\@nx\@dblarg + \@xp\@nx\csname\string\author\endcsname} +% \end{macrocode} +% Initialize some variables. +% \begin{macrocode} +\let\shortauthors\@empty \let\authors\@empty +% \end{macrocode} +% +% \begin{macro}{\contrib} +% +% Contributors are similar to authors except that they are responsible +% for only part of a work, e.g., an appendix. The optional argument +% for the first contributor of a group identifies what has been +% contributed. There can be more than one group of contributors; +% each group is treated separately, using the same ``and'' conventions +% within the group as for authors. Contributor groups are strung +% together separated by a comma; if the word ``and'' is desired before +% the final group of contributors, it must be included in the optional +% argument for that group. +% \begin{macrocode} +%<*amsart|amsproc> +\newif\ifresetcontrib \resetcontribfalse +\newcommand\contrib[2][]{% + \def\@tempa{#1}% + \ifx\@empty\@tempa + \else + \ifresetcontrib \@xcontribs + \else \global\resetcontribtrue + \fi + \fi + \ifx\@empty\contribs + \gdef\contribs{#1 #2}% + \else + \g@addto@macro\contribs{\and#1 #2}% + \fi +% \end{macrocode} +% Accumulate contribs separately for the table of contents. Here, +% this is just a dummy; it is fully defined for in-house processing. +% \begin{macrocode} + \@wraptoccontribs{#1}{#2}% +} +\def\wraptoccontribs#1#2{} +\def\@xcontribs{% + \author@andify\contribs + \ifx\@empty\xcontribs + \xdef\xcontribs{\contribs}% + \else + \xdef\xcontribs{\xcontribs, \contribs}% + \fi + \let\contribs\@empty +} +% \end{macrocode} +% \end{macro} +% +% Initialize some more variables. +% \begin{macrocode} +\let\contribs\@empty \let\xcontribs\@empty \let\toccontribs\@empty +% +\let\addresses\@empty \let\thankses\@empty +% \end{macrocode} +% +% The optional arguments of \cn{address}, \cn{curraddr}, \cn{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. +% \begin{macrocode} +\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}}} +\newcommand{\urladdr}[2][]{\g@addto@macro\addresses{\urladdr{#1}{#2}}} +% \end{macrocode} +% +% Someone who does not look closely at the \cls{amsart} documentation +% is likely to put the \cn{thanks} command inside that argument of +% \cn{author}. +% \begin{macrocode} +\long\def\thanks@warning#1{% + \ClassError{\@classname}{% + \protect\thanks\space should be given separately, not inside author name.% + }\@ehb +} +% \end{macrocode} +% +% \begin{macrocode} +\renewcommand{\thanks}[1]{% + \@ifnotempty{#1}{\g@addto@macro\thankses{\thanks{#1}}}% +} +% \end{macrocode} +% +% The following example of addresses for three authors of a +% tri-author paper illustrates the kind of complications that need to +% be handled. +%\begin{verbatim} +% \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)} +%\end{verbatim} +% In an article, typesetting of the address information is done at +% the end of the document, by calling \cs{@setaddresses}. This is done +% through a parent function \cs{enddoc@text}, because some AMS journals +% also print the abstract there instead of at the beginning, and it's +% easier to redefine \cs{enddoc@text} than to try undoing material +% already added to the \cs{AtEndDocument} hook. +% \begin{macrocode} +%<*amsart|amsproc> +\def\enddoc@text{\ifx\@empty\@translators \else\@settranslators\fi + \ifx\@empty\addresses \else\@setaddresses\fi} +\AtEndDocument{\enddoc@text} +% +% \end{macrocode} +% +% \begin{macrocode} +\def\curraddrname{{\itshape Current address}} +\def\emailaddrname{{\itshape E-mail address}} +\def\urladdrname{{\itshape URL}} +\def\@setaddresses{\par + \nobreak \begingroup +%\footnotesize + \def\author##1{\nobreak\addvspace\bigskipamount}% +% \end{macrocode} +% Address is supposed to go all on one line, so we redefine |\\| +% to just insert a comma instead of doing a line break. +% \begin{macrocode} + \def\\{\unskip, \ignorespaces}% +% \end{macrocode} +% No page breaks in the address section is accomplished by +% |\interlinepenalty\@M| and by the \cn{nobreak} before the \cn{bigskip}. +% \begin{macrocode} + \interlinepenalty\@M + \def\address##1##2{\begingroup +% \end{macrocode} +% If there are two addresses for the same author, add a \cn{bigskip} +% between them. +% \begin{macrocode} + \par\addvspace\bigskipamount\indent +% \end{macrocode} +% If the name of the author to whom this address applies +% was given, typeset it. +% \begin{macrocode} + \@ifnotempty{##1}{(\ignorespaces##1\unskip) }% +% \end{macrocode} +% Now the main part of the address: +% \begin{macrocode} + {\scshape\ignorespaces##2}\par\endgroup}% +% \end{macrocode} +% Current address: +% \begin{macrocode} + \def\curraddr##1##2{\begingroup + \@ifnotempty{##2}{\nobreak\indent\curraddrname + \@ifnotempty{##1}{, \ignorespaces##1\unskip}\/:\space + ##2\par}\endgroup}% +% \end{macrocode} +% And then email. In versions 1.0 and 1.1 |@@| was required to print +% a single \qc{\@} character; for bulletproofing we convert doubled +% \qc{\@} characters if found. +% \begin{macrocode} + \def\email##1##2{\begingroup + \@ifnotempty{##2}{\nobreak\indent\emailaddrname + \@ifnotempty{##1}{, \ignorespaces##1\unskip}\/:\space + \ttfamily##2\par}\endgroup}% +% \end{macrocode} +% URLaddr is simply a replica of the email address, with the +% addition of a feature to enable |~| to print. +% \begin{macrocode} + \def\urladdr##1##2{\begingroup + \def~{\char`\~}% + \@ifnotempty{##2}{\nobreak\indent\urladdrname + \@ifnotempty{##1}{, \ignorespaces##1\unskip}\/:\space + \ttfamily##2\par}\endgroup}% + \addresses + \endgroup +} +% \end{macrocode} +% +% Some other administrative info. For \cn{date} we can just use the +% default definition provided by \latex/, except that we initialize +% the date to empty instead of to \cn{today}. +% \begin{macrocode} +\let\@date\@empty +\def\dedicatory#1{\def\@dedicatory{#1}} +\let\@dedicatory=\@empty +\def\keywords#1{\def\@keywords{#1}} +\let\@keywords=\@empty +% \end{macrocode} +% +% To allow various versions of the subject classification, accept an +% optional value to identify the version, provide text for the two +% currently in use, and give a warning if the version specified is +% unknown. Default to 1991 version. [bnb, 1999/04/30] +% \begin{macrocode} +\newcommand*\subjclass[2][1991]{% + \def\@subjclass{#2}% + \@ifundefined{subjclassname@#1}{% + \ClassWarning{\@classname}{Unknown edition (#1) of Mathematics + Subject Classification; using '1991'.}% + }{% + \@xp\let\@xp\subjclassname\csname subjclassname@#1\endcsname + }% +} +\let\@subjclass=\@empty +%\def\commby#1{\def\@commby{(Communicated by #1)}} +%\let\@commby=\@empty +% \end{macrocode} +% +% We handle translator names like author names, just in case there is +% more than one translator. [mjd,1994/10/19] +% \begin{macrocode} +\def\translname{Translated by} +\def\translator#1{% + \ifx\@empty\@translators \def\@translators{#1}% + \else\g@addto@macro\@translators{\and#1}\fi} +\let\@translators=\@empty +% \end{macrocode} +% +% \begin{macrocode} +%<*amsart|amsproc> +\def\@settranslators{\par\begingroup + \addvspace{6\p@\@plus9\p@}% + \hbox to\columnwidth{\hss\normalfont\normalsize + \translname{ }% + \andify\@translators \uppercasenonmath\@translators + \@translators} + \endgroup +} +% +% \end{macrocode} +% +% The general function to convert a list of items in the form +%\begin{verbatim} +% A\and B\and C\and D +%\end{verbatim} +% to the form `A, B, C, and D' is \cs{xandlist}: +%\begin{verbatim} +% \xandlist{, }{ and }{, and }{A\and B\and C\and D} +%\end{verbatim} +% 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. +%\begin{verbatim} +% \nxandlist{, }{ and }{, and }\result +%\end{verbatim} +% I don't think I want to explain this except by recommending that +% you watch it in operation with \cs{tracingmacros} if you're +% interested. [mjd,1994/10/19] +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \begin{macro}{andify} +% +% The \cs{andify} function is provided as a convenient abbreviation +% for the most common case. See also \cs{author@andify} (for +% \cls{amsart} and \cls{amsproc} only), which gives better results +% in cases with a large number of authors. Provide a substitutable +% text string to simplify language-specific modifications. +% \begin{macrocode} +\def\@@and{and} +\newcommand{\andify}{% + \nxandlist{\unskip, }{\unskip{} \@@and~}{\unskip, \@@and~}} +% \end{macrocode} +% Override the funny default definition of \cn{and} from \latex/. +% This is not actually used by AMS classes, however. +% \begin{macrocode} +\def\and{\unskip{ }\@@and{ }\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{maketitle} +% +% Set up the style of an article opening page. For books, see below. +% For articles, we must add the copyright info footnote. +% \begin{macrocode} +%<*amsart|amsproc> +\def\maketitle{\par + \@topnum\z@ % this prevents figures from falling at the top of page 1 + \@setcopyright + \thispagestyle{firstpage}% this sets first page specifications +% \end{macrocode} +% 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. +% \begin{macrocode} + \uppercasenonmath\shorttitle + \ifx\@empty\shortauthors \let\shortauthors\shorttitle + \else \andify\shortauthors + \fi +% \end{macrocode} +% The following hook is used to activate the writing of author and +% title information to an `issue table of contents' when multiple +% articles are being processed for a journal issue or a proceedings +% volume. +% \begin{macrocode} + \@maketitle@hook + \begingroup + \@maketitle + \toks@\@xp{\shortauthors}\@temptokena\@xp{\shorttitle}% + \toks4{\def\\{ \ignorespaces}}% defend against questionable usage + \edef\@tempa{% + \@nx\markboth{\the\toks4 + \@nx\MakeUppercase{\the\toks@}}{\the\@temptokena}}% + \@tempa + \endgroup + \c@footnote\z@ + \@cleartopmattertags +} +\def\@cleartopmattertags{% + \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\contrib \do\contribs \do\xcontribs \do\toccontribs + \do\email \do\@xemail \do\curraddr \do\@xcurraddr +% \do\commby \do\@commby + \do\dedicatory \do\@dedicatory \do\thanks \do\thankses + \do\keywords \do\@keywords \do\subjclass \do\@subjclass +} +% +% \end{macrocode} +% \end{macro} +% +% The hook \cs{@maketitle@hook} is placed into \cn{maketitle} rather +% than \cs{@maketitle} because the latter tends to get redefined by +% derived classes using this one as a base. The initial motivation +% for this hook is to extract title and author information to an +% external file, so we can't do it with \cs{AtBeginDocument}: +% \cn{title} and \cn{author} commands might occur between +% \verb'\begin{document}' and \cn{maketitle}. +% +% \begin{macrocode} +%<*amsart|amsproc> +\def\@maketitle@hook{\global\let\@maketitle@hook\@empty} +% +% \end{macrocode} +% +% Set up the style of an article opening page. +% \begin{macrocode} +%<*amsart|amsproc> +\def\@maketitle{% +% \end{macrocode} +% Set font to normal, just in case. +% \begin{macrocode} + \normalfont\normalsize +% \end{macrocode} +% Special footnotes are put here to ensure that they come first at +% the bottom of the page. +% \begin{macrocode} + \@adminfootnotes +% \end{macrocode} +% If |\pagestyle{myheadings}| was specified, \cs{@mkboth} will be a no-op. +% \begin{macrocode} + \@mkboth{\@nx\shortauthors}{\@nx\shorttitle}% +% \global\topskip8pc\relax % 10pc to base of first title line +% \global\topskip42\p@\relax % 5.5pc " " " " " + \@settitle + \ifx\@empty\authors \else \@setauthors \fi +% \end{macrocode} +% Likewise with \cs{@dedicatory} and \cs{@date}. +% \begin{macrocode} + \ifx\@empty\@dedicatory + \else +% \baselineskip26\p@ +% \baselineskip18\p@ + \vtop{\centering{\footnotesize\itshape\@dedicatory\@@par}% + \global\dimen@i\prevdepth}\prevdepth\dimen@i + \fi + \@setabstract +% \end{macrocode} +% Space before the main text should be 32 + 14 base-to-base; we +% accomplish this by doing a vskip of that amount with \cs{baselineskip} +% subtracted. +% \begin{macrocode} + \normalsize + \if@titlepage + \newpage + \else + \dimen@34\p@ \advance\dimen@-\baselineskip + \vskip\dimen@\relax + \fi +} % end \@maketitle +% \end{macrocode} +% +% Segregate the definitions of administrative footnotes to permit +% easier customization, especially for translation journals. +% \begin{macrocode} +\def\@adminfootnotes{% + \let\@makefnmark\relax \let\@thefnmark\relax +% \ifx\@empty\@date\else \@footnotetext{\@setdate}\fi + \ifx\@empty\@subjclass\else \@footnotetext{\@setsubjclass}\fi + \ifx\@empty\@keywords\else \@footnotetext{\@setkeywords}\fi +% \end{macrocode} +% In order to make multiple thanks footnotes work inside a single +% \cs{@footnotetext} argument we need to make the first \cn{par} be +% ignored. Cf.~\cs{@setthanks}. +% \begin{macrocode} + \ifx\@empty\thankses\else \@footnotetext{% + \def\par{\let\par\@par}\@setthanks}% + \fi +} +% +% \end{macrocode} +% +% \subsection{Journal/series logo for articles} +% +% \cs{publname} either will be defined by a parent class that is calling +% \cls{amsart} or \cls{amsproc} as a base class, or will be absent, in +% which case this can be used as a signal to omit the \cs{@serieslogo}. +% A typical value for \cs{publname} would be +%\begin{verbatim} +% \def\publname{JOURNAL OF THE\newline +% AMERICAN MATHEMATICAL SOCIETY} +%\end{verbatim} +% +% Initialize \cs{publname} and \cs{@serieslogo} to no-op if +% \cs{publname} is not already defined. +% \begin{macrocode} +%<*amsart|amsproc> +\AtBeginDocument{% + \@ifundefined{publname}{% + \let\publname\@empty + \let\@serieslogo\@empty + }{% +% \def\@serieslogo{\article@logo}% +% \def\@serieslogo{\procart@logo}% + }% +} +% +% \end{macrocode} +% +% The \cs{number} prefix on current issue is to work around +% inconsistencies in the form of issue numbers as passed in from +% system level. Sometimes they will get passed in with a leading +% zero, which we don't want to print if it happens to occur. +% The |0| prevents an error if \cs{currentissue} happens to be empty. +% \begin{macrocode} +%<*amsart> +\AtBeginDocument{% + \@ifundefined{volinfo}{% + \def\volinfo{% + Volume \currentvolume, Number \number0\currentissue +% \end{macrocode} +% Month/year is not included initially when a journal article is +% posted on the WWW prior to print publication. +% \begin{macrocode} + \if\@printyear , \currentmonth\ \currentyear\fi + }% + }{}% +} +\def\@printyear{TF}% boolean false +% +% \end{macrocode} +% +% \begin{macrocode} +%<*amsproc> +\AtBeginDocument{% + \@ifundefined{volinfo}{\let\volinfo\@empty}{} +} +% +% \end{macrocode} +% +% Default values for information such as volume, year, and so on are +% provided as follows. +% \begin{macrocode} +%<*amsart|amsproc> +\def\issueinfo#1#2#3#4{\def\currentvolume{#1}\def\currentissue{#2}% + \def\currentmonth{#3}\def\currentyear{#4}} +\issueinfo{00}% volume number + {0}% % issue number + {Xxxx}% % month + {XXXX}% % year +% +% \end{macrocode} +% +% Copyright year may be different from issue year. Allow it to be +% specified separately. It is probably more natural anyway, from the +% user's perspective, to give the copyright year in the same command +% when giving the name of the copyright holder. +% \begin{macrocode} +\newcommand{\copyrightinfo}[2]{% + \def\copyrightyear{#1}% + \@ifnotempty{#2}{\def\copyrightholder{#2}}% +} +\copyrightinfo{0000}{(copyright holder)} +% \end{macrocode} +% +% Provide page span information. If negative number is given, convert +% to roman numeral form. +% \begin{macrocode} +%<*amsart|amsproc> +\def\pagespan#1#2{\setcounter{page}{#1}% + \ifnum\c@page<\z@ \pagenumbering{roman}\setcounter{page}{-#1}\fi + \def\start@page{#1}\def\end@page{#2}} +\pagespan{000}{000} +% +% \end{macrocode} +% +% Formatting for journal page numbers. [bnb, 1996/09/11] +% \begin{macrocode} +%<*amsart> +\AtBeginDocument{% + \@ifundefined{pageinfo}{% + \def\pageinfo{% + \ifnum\start@page=\z@ + Pages 000--000 + \else + \ifx\start@page\end@page + Page \start@page + \else + Pages \start@page--\end@page + \fi + \fi}% + }{}% +} +% +% \end{macrocode} +% +% Publisher Item Identifier (we started using them in journal logos +% as of January 1997). +% \begin{macrocode} +%\@ifundefined{ISSN}{\def\ISSN{0000-0000}}{} +%\newcommand\PII[1]{\def\@PII{#1}} +%\PII{S \ISSN(XX)0000-0} +% \end{macrocode} +% +% \subsection{Copyright block} +% +% 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 +% \cs{@oddfoot} (in \cs{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. +% +% Through version 1.2, this code was included only for \pkg{amsart} +% and \pkg{amsproc}; the formatting of some book series requires an +% insert at the bottom of the text block, so this code has been +% extended to all AMS document classes. [bnb, 1999/07/14] +% \begin{macrocode} +\newinsert\copyins +% \end{macrocode} +% We set the skip register associated with this insert to the +% \emph{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 \cs{@setcopyright}. +% \begin{macrocode} +\skip\copyins=1.5pc +\count\copyins=1000 % magnification factor, 1000 = 100% +\dimen\copyins=.5\textheight % maximum allowed per page +% \end{macrocode} +% \cn{copyins} is ignored if a float is input on the first page; +% adding it to \cs{@reinserts} will make the output routine behave. +% [bnb; 2004/06/09; B-365] +% \begin{macrocode} +\g@addto@macro\@reinserts{% + \ifvoid\copyins\else\insert\copyins{\unvbox\copyins}\fi +} +% \end{macrocode} +% Put the contents into a \tex/ insert. This information is omitted +% unless \cs{@serieslogo} is non-null. In other words it will +% normally not print except when an AMS publication-specific document +% class such as \cls{tran-l} is used. +% And even if the series logo is printed, omit the copyright line +% if requested by |\coprightinfo{}{}|. [bnb, 1996/10/17] +% \begin{macrocode} +\def\@copyinsfontsize{\fontsize{6}{7\p@}\normalfont\upshape} +\newif\if@extracrline \@extracrlinefalse +\let\@extracrline\@empty +\relax +\def\@setcopyright{% + \ifx\@empty\@serieslogo + \else\ifx\@empty\copyrightyear + \else + \insert\copyins{\hsize\textwidth + \parfillskip\z@\relax + \leftskip\z@\@plus.9\textwidth\relax \rightskip\z@\relax + \@copyinsfontsize +% \end{macrocode} +% The spacing between the preceding text and the copyright info is +% done with a strut of height |\skip\copyins|. (Note that +% \cs{lineskip} and \cs{baselineskip} are 0 in the \latex/ 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. An extra 6pt is allowed when an additional line +% is present; this adjustment was found adequate in some borderline +% cases where tight pages reset with the additional line had text +% lines moved to the next page, causing the paper length to expand +% by a page. [bnb, 2004/05/07-06/24] +% \begin{macrocode} + \everypar{}% + \vskip-\skip\copyins + \if@extracrline + \vskip-6pt + \fi + \nointerlineskip + \leavevmode\hfill\vrule\@width\z@\@height\skip\copyins + \copyright\copyrightyear\ \copyrightholder\ignorespaces + \if@extracrline \@extracrline \fi + \par +% \end{macrocode} +% This kern of 0pt forces the depth of the last line (if any) to be +% added to the height of the box. +% \begin{macrocode} + \kern\z@}% + \fi\fi +} +% \end{macrocode} +% +% When \cs{@combinefloats} is called, the box \cs{@outputbox} already +% contains the main text of the page and any footnotes. Then \latex/ +% adds top and bottom figures. We want to add our copyright info at +% the very bottom, but still inside of the vbox. +% \begin{macrocode} +\def\@combinefloats{% + \ifx \@toplist\@empty \else \@cflt \fi + \ifx \@botlist\@empty \else \@cflb \fi + \ifvoid\copyins \else \@cflci \fi +} +% \end{macrocode} +% \subsubsection{combine-floats-copyright-insert} +% +% In the twocolumn/firstcolumn case, postpone adding the drop folio. +% Put an empty box of the same height at the bottom of the left-hand +% column to make the columns balance. Allow a smidge of stretch in +% case the first page of a chapter has no internal stretch, so that +% the drop folio will be flush to the bottom of the text block; +% don't do this for a twocolumn page, to avoid an uneven bottom. +% \begin{macrocode} +\def\@cflci{% + \setbox\@outputbox\vbox{% + \unvbox\@outputbox + \vskip\skip\copyins + \if@twocolumn \else \vskip\z@ plus\p@ \fi + \hbox to\columnwidth{% + \hss\vbox to\z@{\vss +% \end{macrocode} +% In two-column layout, put an empty box in the first column +% instead of the drop folio. +% \begin{macrocode} + \if@twocolumn + \if@firstcolumn \else \unvbox\copyins \fi + \else + \unvbox\copyins + \fi + }}}% +% \end{macrocode} +% Now redo the insert to make sure we get the right amount of space +% reserved for it in the second column. +% \begin{macrocode} + \if@twocolumn \if@firstcolumn + \insert\copyins{\unvbox\copyins}% + \fi\fi +% \end{macrocode} +% Reset the \cs{copyins} flag so that a subsequent insert +% (e.g.\ \cs{@dropfolio} in some book series) will work. +% \begin{macrocode} + \global\count\copyins=999 \relax +} +% \end{macrocode} +% [End of code to support inserts at end of text block.] +% +% For journals only, provide a switch that indicates the author has +% agreed to revert copyright to the public domain; this results in +% an addition to the copyright block on the article. +% \begin{macrocode} +%<*amsart> +\newif\if@revertcopyright \@revertcopyrightfalse +\newcommand{\revertcopyright}{% + \global\@revertcopyrighttrue + \global\@extracrlinetrue} +% \end{macrocode} +% Add notation regarding reversion of copyright to public domain if +% author has agreed to it. Permit this to be set in a different +% size than the copyright line (required for some author packages). +% \begin{macrocode} +\def\@revertcrfontsize{\fontsize{6}{7\p@}\normalfont\upshape} +\def\@extracrline{% + \if@revertcopyright + \unskip\\ + \@revertcrfontsize + Reverts to public domain 28 years from publication + \fi +} +% +% \end{macrocode} +% +% \subsection{Other top matter info} +% +% Some name setup. +% \begin{macrocode} +\newcommand{\abstractname}{Abstract} +\newcommand{\keywordsname}{Key words and phrases} +% \end{macrocode} +% For now, support just the two most recent versions; earlier versions +% were: +% \begin{itemize} +% \item \textup{1980} Mathematics Subject Classification +% \item \textup{1980} Mathematics Subject Classification +% \textup{(1985} Revision\textup{)} +% \end{itemize} +% Default to the 1991 edition, as that's what is in production at the +% time this change is made. [bnb, 1999/04/30] +% \begin{macrocode} +\newcommand{\subjclassname}{% + \textup{1991} Mathematics Subject Classification} +\@xp\let\csname subjclassname@1991\endcsname \subjclassname +\@namedef{subjclassname@2000}{% + \textup{2000} Mathematics Subject Classification} +% \end{macrocode} +% For the date we have a special little problem: We only want to add +% the `Received by the editors' text for publication-specific +% document classes such as \cls{tran-l}. +% \begin{macrocode} +%\def\@tempb{amsbook} +%\def\@tempb{amsproc} +%\def\@tempb{amsart} +\ifx\@classname\@tempb + \newcommand{\datename}{\textit{Date}:} +\else + \newcommand{\datename}{Received by the editors} +\fi +% \end{macrocode} +% +% \begin{macrocode} +%<*amsart|amsproc> +\def\@settitle{\begin{center}% +% \baselineskip14\p@\relax +% \Large + \bfseries +%\uppercasenonmath\@title + \@title + \end{center}% +} +% +% \end{macrocode} +% +% For multiple authors we need to combine the author names into a +% list of the form Author One, Author Two, \dots, and Author Last. +% Change line breaking penalties to avoid a line break in the middle of +% an author name if there are a lot of authors. This should probably +% better be done by changing spaces within author names to +% |\nolinebreak[3]\space|, but that would take more work. +% [mjd,2000/12/27] +% \begin{macrocode} +%<*amsart|amsproc> +\def\author@andify{% + \nxandlist {\unskip ,\penalty-1 \space\ignorespaces}% + {\unskip {} \@@and~}% + {\unskip ,\penalty-2 \space \@@and~}% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\@setauthors{% + \begingroup + \def\thanks{\protect\thanks@warning}% + \trivlist +% \centering\footnotesize \@topsep30\p@\relax +% \advance\@topsep by -\baselineskip +% \centering \fontsize{11}{13\p@}\selectfont\@topsep13\p@\relax + \item\relax + \author@andify\authors +% \end{macrocode} +% Make dbl-backslash robust to prevent problems if/when +% \cs{MakeTextUppercase} expansion is applied. +% \begin{macrocode} + \def\\{\protect\linebreak}% +% \MakeUppercase{\authors}% +% \authors + \ifx\@empty\contribs + \else + ,\penalty-3 \space \@setcontribs + \@closetoccontribs + \fi + \endtrivlist + \endgroup +} +\def\@closetoccontribs{} +\def\@setcontribs{% + \@xcontribs +% \MakeUppercase{\xcontribs}% +% \xcontribs +} +\def\@setdate{\datename\ \@date\@addpunct.} +\def\@setsubjclass{% + {\itshape\subjclassname.}\enspace\@subjclass\@addpunct.} +\def\@setkeywords{% + {\itshape \keywordsname.}\enspace \@keywords\@addpunct.} +% +% \end{macrocode} +% +% The following definitions suffice for all the AMS document classes. +% \begin{macrocode} +\def\@setthanks{\def\thanks##1{\par##1\@addpunct.}\thankses} +% \end{macrocode} +% +% `Abstract' can be changed to, say, `R\'esum\'e' (French) by +% redefining \cn{abstractname}. This and other control sequence names +% (\cn{refname}, \cn{contentsname}, \cn{appendixname}, and so on) are +% compatible with the \pkg{babel} package (the AMS sometimes +% publishes articles in languages other than English.) +% +% In AMS document classes, the abstract should be placed before +% \cn{maketitle} (otherwise the desired ordering of frontmatter +% elements cannot be ensured in all cases). +% \begin{macrocode} +\newbox\abstractbox +% \end{macrocode} +% We start by checking whether \cn{maketitle} has already been used +% (in which case it was reset to \cs{relax}); if so, we give a +% warning that the abstract should be placed before \cn{maketitle}. +% \begin{macrocode} +\newenvironment{abstract}{% + \ifx\maketitle\relax + \ClassWarning{\@classname}{Abstract should precede + \protect\maketitle\space in AMS document classes; reported}% + \fi + \global\setbox\abstractbox=\vtop \bgroup + \normalfont\Small + \list{}{\labelwidth\z@ + \leftmargin3pc \rightmargin\leftmargin + \listparindent\normalparindent \itemindent\z@ + \parsep\z@ \@plus\p@ +% \end{macrocode} +% In order to get equation numbers indented with the rest of the +% abstract, we have to do this: +% \begin{macrocode} + \let\fullwidthdisplay\relax + }% + \item[\hskip\labelsep\scshape\abstractname.]% +}{% + \endlist\egroup +% \end{macrocode} +% If the abstract was supposed to be typeset earlier, then +% \cs{@setabstract} is now equal to \cs{relax}, and we had better +% drop the contents of the abstract box onto the page immediately, to +% salvage the situation as best we can. +% \begin{macrocode} + \ifx\@setabstract\relax \@setabstracta \fi +} +% \end{macrocode} +% +% Because the abstract might be postponed until the end of an +% article, we cannot simply use the fact of a preceding +% \cn{maketitle} to tell whether \cs{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. +% \begin{macrocode} +\def\@setabstract{\@setabstracta \global\let\@setabstract\relax} +\def\@setabstracta{% + \ifvoid\abstractbox + \else + \skip@20\p@ \advance\skip@-\lastskip + \advance\skip@-\baselineskip \vskip\skip@ + \box\abstractbox + \prevdepth\z@ % because \abstractbox is a vtop + \fi +} +% \end{macrocode} +% +% Title page environment does nothing much; information and +% formatting to be provided by the user. +% \begin{macrocode} +\def\titlepage{% +% \cleardoublepage +% \clearpage + \thispagestyle{empty}\setcounter{page}{0}} +\def\endtitlepage{\newpage} +% \end{macrocode} +% +% \subsection{Macros for list labels} +% +% Through version 1.2, first-level enumerated item labels were formatted +% with a following period, which is not AMS style. Effective with +% version 2.0 these labels are formatted with parentheses. Anyone +% requiring the period style will have to redefine \cs{labelenumi}. +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \begin{macrocode} +\def\labelitemi{$\m@th\bullet$} +\def\labelitemii{\bfseries --}% \upshape already done by \itemize +\def\labelitemiii{$\m@th\ast$} +\def\labelitemiv{$\m@th\cdot$} +% \end{macrocode} +% +% \subsection{Verse and quotation environments} +% \begin{macrocode} +\newenvironment{verse}{\let\\\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em\listparindent\itemindent + \rightmargin\leftmargin \advance\leftmargin 1.5em}\item[]% +}{% + \endlist +} +\let\endverse=\endlist % for efficiency +% \end{macrocode} +% The left/right margins of the quotation environment are supposed to +% be the same as for the abstract environment. +% \begin{macrocode} +\newenvironment{quotation}{\list{}{% + \leftmargin3pc \listparindent\normalparindent + \itemindent\z@ + \rightmargin\leftmargin \parsep\z@ \@plus\p@}% + \item[]% +}{% + \endlist +} +\let\endquotation=\endlist % for efficiency +\newenvironment{quote}{% + \list{}{\rightmargin\leftmargin}\item[]% +}{% + \endlist +} +\let\endquote=\endlist % for efficiency +% \end{macrocode} +% +% \subsection{List environments} +% Changed definition of \cs{trivlist}, \env{enumerate}, and +% \env{itemize} in order to have \cn{makelabel} apply \cn{upshape}. +% \begin{macrocode} +\def\trivlist{\parsep\parskip\@nmbrlistfalse + \@trivlist \labelwidth\z@ \leftmargin\z@ + \itemindent\z@ + \let\@itemlabel\@empty + \def\makelabel##1{\upshape##1}} +% \end{macrocode} +% +% \begin{macrocode} +\renewenvironment{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 +}{% + \endlist +} +\let\endenumerate=\endlist % for efficiency +% \end{macrocode} +% +% \begin{macrocode} +\renewenvironment{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 +}{% + \endlist +} +\let\enditemize=\endlist % for efficiency +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\descriptionlabel}[1]{\hspace\labelsep \upshape\bfseries #1:} +\newenvironment{description}{\list{}{% +% \end{macrocode} +% Adjust the indent of the first line to the desired value: +% \begin{macrocode} + \advance\leftmargini6\p@ \itemindent-12\p@ + \labelwidth\z@ \let\makelabel\descriptionlabel}% +}{ + \endlist +} +\let\enddescription=\endlist % for efficiency +% \end{macrocode} +% +% \begin{macro}{\upn} +% The command \cn{upn} can be used to force upright font for +% punctuation or digits in italic text. For example +%\begin{verbatim} +% ... as numbered by \upn{``A''} or \upn{``1''} hereafter\upn{)} +%\end{verbatim} +% \begin{macrocode} +\let\upn=\textup +% \end{macrocode} +% \end{macro} +% +% 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.) Allow +% for a reasonable maximum value; 13 = xiii = m should be adequate. +% \begin{macrocode} +\AtBeginDocument{% + \labelsep=5pt\relax + \setcounter{enumi}{13}\setcounter{enumii}{13}% + \setcounter{enumiii}{13}\setcounter{enumiv}{13}% + \settowidth\leftmargini{\labelenumi\hskip\labelsep}% + \advance\leftmargini by \normalparindent + \settowidth\leftmarginii{\labelenumii\hskip\labelsep}% + \settowidth\leftmarginiii{\labelenumiii\hskip\labelsep}% + \settowidth\leftmarginiv{\labelenumiv\hskip\labelsep}% + \setcounter{enumi}{0}\setcounter{enumii}{0}% + \setcounter{enumiii}{0}\setcounter{enumiv}{0}% + \leftmarginv=10pt \leftmarginvi=\leftmarginv + \leftmargin=\leftmargini + \labelwidth=\leftmargini \advance\labelwidth-\labelsep + \@listi} +% \end{macrocode} +% +% In some contexts the space above/below lists needs to be +% suppressed. So we put it into a variable \cs{listisep}. +% \begin{macrocode} +\newskip\listisep +\listisep\smallskipamount +\def\@listI{\leftmargin\leftmargini \parsep\z@skip + \topsep\listisep \itemsep\z@skip + \listparindent\normalparindent} +\let\@listi\@listI +% \end{macrocode} +% +% Is it necessary to reset \cs{parsep}, \cs{partopsep}, \cs{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] +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \subsection{Fleqn option} +% +% \begin{macrocode} +\@ifclasswith{\@classname}{fleqn}{% + \let\@tempa\@iden + \AtBeginDocument{\mathindent\leftmargini}% +}{\let\@tempa\@gobble}% +\@ifpackageloaded{amsmath}{\let\@tempa\@gobble}{% + \@ifpackageloaded{amstex}{\let\@tempa\@gobble}{}% +} +\@tempa{% + \def\[{\relax + \ifmmode\@badmath + \else + \begin{trivlist}% + \@beginparpenalty\predisplaypenalty + \@endparpenalty\postdisplaypenalty + \item[]\leavevmode + \hbox to\linewidth\bgroup$\displaystyle +% \end{macrocode} +% Note that the \cs{m@th} should go at the end in \cn{]} just in +% case an embedded small math formula inside \cn{text} occurs in +% the display. +% +% Why the extra bgroup here? I think it's not needed. +% [mjd,3-Feb-1994] +% \begin{macrocode} + \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 +} +% \end{macrocode} +% +% \subsection{Redefined internal sectioning commands} +% +% In amsart.sty \cs{@startsection}, \cs{@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. +% +% A second major departure from standard \latex/ is that when a +% short form of a section title is given, it is used only for the +% running heads; the table of contents still gets the full version of +% the title. This is correct for AMS editorial practice. However if +% one wants to get a line break into the table of contents it means +% that the standard \latex/ method cannot be used. See the +% \cn{except} and \cn{for} commands. +% \begin{macrocode} +\def\@startsection#1#2#3#4#5#6{% +% \end{macrocode} +% 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 \cs{everypar}, but if one section heading follows +% right after another, this won't happen. So by doing +% \cs{leavevmode} we force this to happen. (\cs{if@noskipsec} +% is true if the previous section title has not yet been typeset.) +% \begin{macrocode} + \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}}}% +} +% \end{macrocode} +% +% We add \cn{textup} here in order to make section +% numbers always roman, even if the rest of the section head is +% italic. +% \begin{macrocode} +\def\@seccntformat#1{% + \protect\textup{\protect\@secnumfont + \csname the#1\endcsname + \protect\@secnumpunct + }% +} +% \end{macrocode} +% +% Some journals require a different font for section numbers. (As +% coded here, this option permits only a change of weight, to +% \cn{bfseries}.) The \cls{amsart} font is checked again later, +% when processing \cn{section}, and if there is no section title, +% it is made bold. +% \begin{macrocode} +%\let\@secnumfont\@empty +%\def\@secnumfont{\mdseries} +% \end{macrocode} +% +% For reference, here is the argument list for \cs{@sect}. +%\begin{verbatim} +% % #1 #2 #3 #4 #5 #6 #7 #8 +% {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}[SHORTT]{TITLE} +%\end{verbatim} +% \begin{macrocode} +\def\@sect#1#2#3#4#5#6[#7]#8{% +% \end{macrocode} +% Define \cs{@toclevel} for for \cs{@tocwrite} (to +% \cs{@tochangmeasure}). +% \begin{macrocode} + \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 +% \end{macrocode} +% If the value of afterskip $>0$, then this is not a run-in section +% heading, and we want to suppress final punctuation. +% \begin{macrocode} + \@tempskipa #5\relax +% \end{macrocode} +% \cs{@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. +% \begin{macrocode} + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% +% \end{macrocode} +% If the section heading is not run-in and there is no title, omit +% final punctuation and space. If it is run-in, omit extra space. +% \begin{macrocode} + \edef\@secnumpunct{% + \ifdim\@tempskipa>\z@ % not a run-in section heading + \@ifnotempty{#8}{.\@nx\enspace}% + \else + \@ifempty{#8}{.}{.\@nx\enspace}% + \fi + }% +% \end{macrocode} +% For \cls{amsart}, if a subsection has no title, make the section +% number bold; otherwise leave it alone. +% [bnb; 2004/06/08; per vwa, B-442] +% \begin{macrocode} +% \@ifempty{#8}{% +% \ifnum #2=\tw@ \def\@secnumfont{\bfseries}\fi}{}% +% \end{macrocode} +% If the |*|-form was not used (\arg{2} less than 1000), we add +% \cn{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. +% \begin{macrocode} + \protected@edef\@svsec{% + \ifnum#2<\@m + \@ifundefined{#1name}{}{% + \ignorespaces\csname #1name\endcsname\space + }% + \fi + \@seccntformat{#1}% + }% + \fi + \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 +% \end{macrocode} +% +% Section headings don't set marks for the running heads in the article +% style, only in the amsbook style. Assumption: \cs{sectionmark} is +% defined to call \cs{@secnumber} as its penultimate argument. +% \begin{macrocode} +% \csname #1mark\endcsname{#7}% +% \end{macrocode} +% If \arg{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. +% \begin{macrocode} + \ifnum#2>\@m \else \@tocwrite{#1}{#8}\fi + \else +% \end{macrocode} +% Otherwise we're doing a run-in heading; it is stored as \cs{@svsechd}, +% which will be typeset by \cs{everypar} as soon as some text is +% encountered. +% \begin{macrocode} + \def\@svsechd{#6\hskip #3\@svsec +% \end{macrocode} +% To allow for the possibility that the user wants an empty section +% title, leaving just the section number, we check whether \arg{8} +% is nonempty before adding the period. +% \begin{macrocode} + \@ifnotempty{#8}{\ignorespaces#8\unskip +% \end{macrocode} +% The following test is to prevent a period being added if the +% section title ended in a question mark or other punctuation. +% \begin{macrocode} + \@addpunct.}% + \ifnum#2>\@m \else \@tocwrite{#1}{#8}\fi + }% + \fi +% \end{macrocode} +% In a previous version of \cls{amsart} \cs{@nobreaktrue} was added to +% \cs{@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] +% \begin{macrocode} + \global\@nobreaktrue +% \end{macrocode} +% \cs{@xsect} does some more stuff based on whether this is a run-in +% heading or not. +% \begin{macrocode} + \@xsect{#5}} +% \end{macrocode} +% +% Undefine \cs{@ssect} to save memory; it's not needed in \cls{amsart}. +% \begin{macrocode} +\let\@ssect\relax +% \end{macrocode} +% +% \subsection{Chapters and sections} +% Allocate counters for sectioning commands. Paragraph and subparagraph +% counters are allocated but normally not used. +% \begin{macrocode} +\newcounter{part} +%\newcounter{chapter} +%\newcounter{section} +%\newcounter{section}[chapter] +%\def\thesection{\arabic{section}} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] +\newcounter{subparagraph}[paragraph] +% \end{macrocode} +% Set numbering style for sectioning commands. In a couple of cases +% resetting is unnecessary but we include the full list here for +% completeness. +% \begin{macrocode} +\renewcommand\thepart {\arabic{part}} +%\renewcommand\thechapter {\arabic{chapter}} +\renewcommand\thesection {\arabic{section}} +\renewcommand\thesubsection {\thesection.\arabic{subsection}} +\renewcommand\thesubsubsection {\thesubsection .\arabic{subsubsection}} +\renewcommand\theparagraph {\thesubsubsection.\arabic{paragraph}} +\renewcommand\thesubparagraph {\theparagraph.\arabic{subparagraph}} +% \end{macrocode} +% Depth of section numbering; if \fn{secnumdepth} were 2 instead of +% 3, \cn{subsubsection} would not be numbered. +% \begin{macrocode} +\setcounter{secnumdepth}{3} +% \end{macrocode} +% +% The arguments of \cs{@startsection} are given for reference: +%\begin{verbatim} +% % #1 #2 #3 #4 #5 #6 +% {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE} +%\end{verbatim} +% +% \begin{macrocode} +\def\partname{Part} +%<*amsart|amsproc> +\def\part{\@startsection{part}{0}% + \z@{\linespacing\@plus\linespacing}{.5\linespacing}% + {\normalfont\bfseries\raggedright}} +% +% \end{macrocode} +% +% Specialsection correlates to our inhouse Z-head. +% \begin{macrocode} +\def\specialsection{\@startsection{section}{1}% +% \z@{\linespacing\@plus\linespacing}{.5\linespacing}% +% \z@{2\linespacing\@plus\linespacing}{.5\linespacing}% +% {\normalfont\centering}} +% {\large\scshape\centering}} +% \end{macrocode} +% +% In the book class \cn{part} puts the part title on a separate +% page. +% \begin{macrocode} +%<*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}} +% +% \end{macrocode} +% +% The arguments of \cs{partrunhead} are \cs{partname}, +% \cs{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 \cn{ignorespaces} and \cn{unskip} as shown here +% to produce the desired results if one or the other is empty. +% \begin{macrocode} +%<*amsbook> +\def\partrunhead#1#2#3{% + \@ifnotempty{#2}{\uppercase{\ignorespaces#1 #2\unskip}\@ifnotempty{#3}{. }}% + \def\@tempa{#3}% + \ifx\@empty\@tempa\else + \begingroup \def\\{ \ignorespaces}% defend against questionable usage + \uppercasenonmath\@tempa\@tempa + \endgroup + \fi +} +\let\chapterrunhead\partrunhead +\let\sectionrunhead\partrunhead +% +% \end{macrocode} +% +% 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, \cn{section}, is not small caps but bold. +% Cf.~the definition of \cn{appendix}. +% \begin{macrocode} +\def\section{\@startsection{section}{1}% + \z@{.7\linespacing\@plus\linespacing}{.5\linespacing}% +% {\normalfont\scshape\centering}} +% {\normalfont\bfseries\centering}} +% \end{macrocode} +% +% Negative value for \arg{5} is a signal to make a run-in heading instead +% of doing a vskip after the heading. +% \begin{macrocode} +\def\subsection{\@startsection{subsection}{2}% +% \z@{.5\linespacing\@plus.7\linespacing}{-.5em}% +% \normalparindent{.5\linespacing\@plus.7\linespacing}{-.5em}% + {\normalfont\bfseries}} +% \end{macrocode} +% +% \begin{macrocode} +\def\subsubsection{\@startsection{subsubsection}{3}% +% \z@{.5\linespacing\@plus.7\linespacing}{-.5em}% +% \normalparindent\z@{-.5em}% + {\normalfont\itshape}} +% \end{macrocode} +% +% 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). +% \begin{macrocode} +\def\paragraph{\@startsection{paragraph}{4}% +% \z@\z@{-\fontdimen2\font}% +% \normalparindent\z@{-\fontdimen2\font}% + \normalfont} +% \end{macrocode} +% +% \begin{macrocode} +\def\subparagraph{\@startsection{subparagraph}{5}% + \z@\z@{-\fontdimen2\font}% + \normalfont} +% \end{macrocode} +% +% \begin{macrocode} +%<*amsart|amsproc> +\def\appendix{\par\c@section\z@ \c@subsection\z@ + \let\sectionname\appendixname + \def\thesection{\@Alph\c@section}} +\def\appendixname{Appendix} +% +% \end{macrocode} +% +% A slower, but fully expandable definition of \cs{@Roman} to avoid +% the nonexpandable \cn{uppercase} which is undesirable in certain +% circumstances. +% \begin{macrocode} +\def\@Roman#1{\@xp\@slowromancap + \romannumeral#1@}% +% +\def\@slowromancap#1{\ifx @#1% then terminate + \else +% \end{macrocode} +% Note: \cs{if} is required here, not \cs{ifx}, because +% \cs{romannumeral} returns category 12 letters! +% \begin{macrocode} + \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 +} +% \end{macrocode} +% +% \subsection{Book features} +% Books (monographs) comprise three distinct sections, +% \cn{frontmatter}, \cn{mainmatter}, and \cn{backmatter}. The +% \cn{frontmatter} would consist of the title page, copyright page, +% table of contents, preface, etc. The \cn{mainmatter} would +% be the body of the book. The \cn{backmatter} would include the +% appendix, bibliography, glossary, and index. +% \begin{macrocode} +%<*amsbook> +\def\frontmatter{\cleardoublepage\pagenumbering{roman}} +\def\mainmatter{\cleardoublepage\pagenumbering{arabic}} +\def\backmatter{% + \if@openright\cleardoublepage\else\clearpage\fi + \let\chaptername\relax} +% +% \end{macrocode} +% +% Book proceedings and monographs allow a signature to print at the +% end of a preface. +% \begin{macrocode} +%<*!amsart> +\def\aufm#1{\par\vspace*{12pt}{\flushright #1\par}} +% +% \end{macrocode} +% +% Monographs can have a special exercise environment. +% +% \begin{macrocode} +%<*amsbook> +\newenvironment{xcb}{% + \setcounter{enumi}{0}% + \settowidth{\leftmargini}{\labelenumi\hskip\labelsep}% + \setcounter{enumii}{4}% letter d + \settowidth{\leftmarginii}{\labelenumii\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 + {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 +}{% + \par +} +% +% \end{macrocode} +% +% \subsection{Book chapters} +% The \cn{chapter} command is provided only in the \cls{amsbook} class, +% not in \cls{amsart} or \cls{amsproc}. +% \begin{macrocode} +%<*amsbook> +\def\chapter{% + \if@openright\cleardoublepage\else\clearpage\fi + \thispagestyle{plain}\global\@topnum\z@ + \@afterindenttrue \secdef\@chapter\@schapter} +% \end{macrocode} +% \cs{@chapter} for numbered chapters. +% \begin{macrocode} +\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} +% \end{macrocode} +% \cs{@schapter} for unnumbered chapters. +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand\chaptername{Chapter} +\newcommand\appendixname{Appendix} +% \end{macrocode} +% +% \begin{macrocode} +\def\@makechapterhead#1{\global\topskip 7.5pc\relax + \begingroup + \fontsize{\@xivpt}{18}\bfseries\centering +% \end{macrocode} +% In order to keep the chapter number ``CHAPTER III'' from +% getting in the way of the \cs{topskip} we put it inside +% the paragraph containing the main title. Then we have to +% do some laborious \cs{rlap}ing and \cs{hskip}ing to +% position it correctly. +% \begin{macrocode} + \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@ } +% \end{macrocode} +% +% \begin{macrocode} +\def\@makeschapterhead#1{\global\topskip 7.5pc\relax + \begingroup + \fontsize{\@xivpt}{18}\bfseries\centering + #1\par \endgroup + \skip@34\p@ \advance\skip@-\normalbaselineskip + \vskip\skip@ } +% +% \end{macrocode} +% The \cn{appendix} command, following the \latex/ book, marks the +% start of a division after \cn{mainmatter} and before +% \cn{backmatter} that consists of appendixes. +% \begin{macrocode} +%<*amsbook> +\def\appendix{\par + \c@chapter\z@ \c@section\z@ + \let\chaptername\appendixname + \def\thechapter{\@Alph\c@chapter}} +% +% \end{macrocode} +% +% \subsection{Table of contents macros} +% +% \cn{tableofcontents} is like \cn{chapter} or \cn{section} except +% for no number and no table of contents entry. +% +% \cs{@pnumwidth} is the maximum width for page numbers in a table of +% contents. |1.6em| allows enough room for three digits. +% \begin{macrocode} +\newcommand{\@pnumwidth}{1.6em} +% \end{macrocode} +% \cs{@tocrmarg} is \cs{@pnumwidth} plus the desired minimum +% space (|1em|) between page numbers and the preceding text. +% \begin{macrocode} +\newcommand{\@tocrmarg}{2.6em} +%\setcounter{tocdepth}{2} +%\setcounter{tocdepth}{1} +% \end{macrocode} +% +% \begin{macrocode} +\newswitch{toc} +\newswitch{lof} +\newswitch{lot} +% \end{macrocode} +% +% 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 \cs{@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 \cs{@starttoc}, then the book +% form. +% +% Owing to confusion about what font to use for \cn{contentsname}, a +% symbolic name has been assigned to provide flexibility. +% \begin{macrocode} +%<*amsart|amsproc> +\newcommand\contentsnamefont{\scshape} +% \end{macrocode} +% +% \begin{macrocode} +\def\@starttoc#1#2{\begingroup + \setTrue{#1}% +% \end{macrocode} +% Remove the skip after the abstract so that we can substitute another. +% \begin{macrocode} + \par\removelastskip\vskip\z@skip +% \end{macrocode} +% The first two arguments of \cs{@startsection} here are special values +% that cause different internal branches to be taken. +%\begin{verbatim} +% 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\contentsnamefont = format +%\end{verbatim} +% \begin{macrocode} + \@startsection{}\@M\z@{\linespacing\@plus\linespacing}% + {.5\linespacing}{\centering\contentsnamefont}{#2}% +% \end{macrocode} +% 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 \cn{contentsname} and if it is then +% we refrain from doing \cn{addcontentsline}. +% \begin{macrocode} + \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 +} +% +% \end{macrocode} +% And here is the book form of \cs{@starttoc}. +% \begin{macrocode} +%<*amsbook> +\def\@starttoc#1#2{% + \begingroup + \setTrue{#1}% +% \end{macrocode} +% Inside this group we change \cs{secdef} so that we can call +% \cn{chapter} and only get the preliminary part of its definition +% that we need. +% \begin{macrocode} + \let\secdef\@gobbletwo \chapter +% \end{macrocode} +% 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 \cn{contentsname} and if it is then +% we refrain from doing \cn{addcontentsline}. +% \begin{macrocode} + \let\@secnumber\@empty % for \@tocwrite and \chaptermark + \ifx\contentsname#2% + \else \@tocwrite{chapter}{#2}\fi +% \end{macrocode} +% Now we do the equivalent of \cs{@schapter}. Expand \arg{2} so that +% it will be easy to apply uppercasing to it. (For \cs{@starttoc} we +% assume that \arg{2} is always a control such as \cn{contentsname}.) +% \begin{macrocode} + \typeout{#2}\@xp\chaptermark\@xp{#2}% + \@makeschapterhead{#2}\@afterheading +% \end{macrocode} +% Protect against document classes that have nonzero \cs{parskip}. +% \begin{macrocode} + \parskip\z@skip +% \end{macrocode} +% And finally we read in the \fn{.toc} (or whatever) file. +% \begin{macrocode} + \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 +} +% +% \end{macrocode} +% +% Now it is easy to define \cn{tableofcontents} and its relatives. +% \begin{macrocode} +\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} +% \end{macrocode} +% +% 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 +% \cs{@tocline} through the \fn{.aux} file. +% +% Init the tocindents if they are not yet set (first run). +% \begin{macrocode} +\AtBeginDocument{% + \@for\@tempa:=-1,0,1,2,3\do{% + \@ifundefined{r@tocindent\@tempa}{% + \@xp\gdef\csname r@tocindent\@tempa\endcsname{0pt}}{}% + }% +} +% \end{macrocode} +% +% \begin{macro}{\@writetocindents} +% This function writes out the max toc indents to the aux file. +% \begin{macrocode} +\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} +% \end{macrocode} +% \end{macro} +% + +% \begin{macro}{\indentlabel} +% This function is a no-op except in \cs{@tocwrite} where it is a +% pointer to \cs{@tochangmeasure}. +% \begin{macrocode} +\let\indentlabel\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@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 \fn{.aux} file by +% \cs{@writetocindents}. +% +% We can assume that \cs{@tochangmeasure} is already inside a group +% when called. +% \begin{macrocode} +\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 +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@toclevel} +% Initialize, for the record. +% \begin{macrocode} +\def\@toclevel{0} +% \end{macrocode} +% \end{macro} +% +% Since we don't have leader dots, we have \cs{@tocline} instead of +% \cs{@dottedtocline}. +% \begin{macrocode} +\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 plus4em \parfillskip-\@pnumwidth + #5\leavevmode\hskip-\@tempdima #6\nobreak\relax + \hfil\hbox to\@pnumwidth{\@tocpagenum{#7}}\par + \nobreak + \endgroup + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\@tocpagenum#1{\hss{\mdseries #1}} +% \end{macrocode} +% +% The function \cs{@tocwrite} writes the information of a section +% heading to the \fn{.toc} file in a standard form. It allows +% different functions to be substituted for \cs{numberline}, to get +% greater control of toc formatting. +% \begin{macrocode} +\def\@tocwrite#1{\@xp\@tocwriteb\csname toc#1\endcsname{#1}} +% \end{macrocode} +% The \cn{chapter} command uses \cs{@tocwriteb} directly because of +% the need to write slightly different things to the toc file +% depending on the current value of \cn{chaptername}. +% \begin{macrocode} +\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}}} +% \end{macrocode} +% +% Specs for monograph toc are as follows (tocdepth is 1, i.e., +% subsections and lower are not listed in toc). +%\begin{verbatim} +% 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. +%\end{verbatim} +% +% Specs for article toc are as follows (tocdepth 2): +%\begin{verbatim} +% 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 +%\end{verbatim} +% +% Typical invocation of \cs{l@chapter}: +%\begin{verbatim} +% \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} +%\end{verbatim}% +% The \cs{tocchapter} is a slightly more useful form than +% \cs{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 \cs{tocappendix} instead of \cs{tocchapter} +% written in the \fn{.toc} file. +% +% The arguments of \cs{@tocline} are as follows: +%\begin{verbatim} +% \@tocline{LEVEL}{VSPACE}{INDENT}{NUMBERWIDTH}{EXTRA}% +% {TEXT}{PAGENUM} +%\end{verbatim}% +% 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 \cs{tocsection} or \cs{tocchapter} which takes in turn three +% arguments: epithet, number, topic. +% \begin{macrocode} +\def\l@section{\@tocline{1}{0pt}{1pc}{}{}} +% \end{macrocode} +% *** The indents do not agree between in-house and distributed ***\\ +% *** versions; no changes; get specs before revising. ***\\ +% The use of \cn{ignorespaces} in \cs{tocsection} and its relatives +% means that if \arg{1} is empty, the following space will be also +% removed. +% \begin{macrocode} +\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 +\let\l@paragraph\l@subsubsection +\let\tocparagraph\tocsection +\let\l@subparagraph\l@subsubsection +\let\tocsubparagraph\tocsection +% +\def\l@part{\@tocline{-1}{12pt plus2pt}{0pt}{}{\bfseries}} +\let\tocpart\tocsection +\def\l@chapter{\@tocline{0}{8pt plus1pt}{0pt}{}{}} +\let\tocchapter\tocsection +% \end{macrocode} +% In this case we are pretty sure the word "Appendix" or similar is +% present, so only check if arg 2 is empty: +% \begin{macrocode} +\newcommand{\tocappendix}[3]{% + \indentlabel{#1\@ifnotempty{#2}{ #2}.\quad}#3} +% \end{macrocode} +% +% \begin{macrocode} +\def\l@figure{\@tocline{0}{3pt plus2pt}{0pt}{1.5pc}{}} +\let\l@table=\l@figure +% \end{macrocode} +% +% \subsection{Bibliography section or chapter} +% +% Following the \pkg{babel} package, we use \cn{refname} in articles +% and \cn{bibname} in books. +% \begin{macrocode} +\def\refname{References} +\def\bibname{Bibliography} +% \end{macrocode} +% +% Restudy the following code; \cs{bibsetup} isn't used anywhere +% although it's defined for the three different bibstyles. +% Because some publications have different default label styles, +% separate that out for easy tailoring of packages. +% \begin{macrocode} +\def\@defaultbiblabelstyle#1{#1.} +\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{\@defaultbiblabelstyle{##1}}% + \def\bibsetup{}% + \else + \def\bibsetup{\labelsep6\p@}% + \ifx\@tempa\@tempc + \def\@biblabel##1{}% + \def\bibsetup{\labelwidth\z@ \leftmargin24\p@ + \itemindent-\leftmargin + \labelsep\z@ }% + \fi + \fi} +% \end{macrocode} +% +% Permit easy change of font size for unusual purpose, e.g., for +% an author's ``life list'' in collected works. [bnb, 2004/04/01] +% \begin{macrocode} +\newcommand{\bibliofont}{\footnotesize} +% \end{macrocode} +% +% \env{thebibliography} differs in some author packages only in the +% shape of the title; make this easy to change. [bnb, 2004/05/22] +% \begin{macrocode} +\newcommand{\@bibtitlestyle}{% +% \@xp\section\@xp*\@xp{\refname}% +% \@xp\chapter\@xp*\@xp{\bibname}% +} +\newenvironment{thebibliography}[1]{% + \@bibtitlestyle + \normalfont\bibliofont\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 +}{% +% \end{macrocode} +% Change error for empty list (no items) to warning, to allow authors +% to leave their bibliography temporarily empty during writing: +% \begin{macrocode} + \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}% + \endlist +} +% \end{macrocode} +% +% The \cn{bysame} command prints a horizontal dash indicating +% repetition of the author's name in consecutive bibliography +% entries. +% \begin{macrocode} +\def\bysame{\leavevmode\hbox to3em{\hrulefill}\thinspace} +% \end{macrocode} +% We define \cn{newblock} even though it's not needed for AMS +% publication style, just to avoid error messages when a non-AMS +% \fn{.bst} file is used. This is a convenience for users; use of +% \cn{newblock} is not recommended for submissions to the AMS. +% \begin{macrocode} +\def\newblock{} +% \end{macrocode} +% +% \begin{macro}{\MR} +% \begin{macro}{\MRhref} +% Provide an MR number for a bibliography item. At the moment +% [mjd,1995/08/07] this only prints the MR number, but later +% we expect to extend it to write an HTML \cs{special} to the +% \fn{.dvi} file. +% +% The presentation of the MR number has been simplified (from using +% a bold volume number) coincident with the change in the MathSciNet +% database to a 7-digit reference number from the volume:number form. +% +% Ensure that an old-style MR number does not break across lines if +% it contains a space; editorial request. [bnb; 2004/04/01] +% Countermanded, to permit break between reference number and an +% old-style number following in parentheses. [bnb; 2004/06/11] +% \begin{macrocode} +\newcommand\MR[1]{\relax\ifhmode\unskip\spacefactor3000 \space\fi + MR~\MRhref{#1}{#1}} +% \end{macrocode} +% +% \begin{macrocode} +\let\MRhref\@gobble +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\URL} +% \begin{macro}{\URLhref} +% \begin{macro}{\@URL} +% Allows sticking in an arbitrary URL in a bibliography. Leading +% ``http'' is not assumed. Call \cn{verb} to ensure that special +% characters in the URL don't cause trouble. +% \begin{macrocode} +\newcommand\URL{\begingroup + \def\@sverb##1{% + \def\@tempa####1##1{\@URL{####1}\egroup\endgroup}% + \@tempa}% + \verb} +% \end{macrocode} +% +% \begin{macrocode} +\let\URLhref\@gobble +\def\@URL#1{\URLhref{#1}#1} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Index section or chapter} +% +% Chapter or section heading for an index. Index is set up to be two +% columns. +% \begin{macrocode} +\newif\if@restonecol +% \end{macrocode} +% +% \begin{macrocode} +%<*amsbook> +\def\indexchap#1{\global\topskip 7.5pc\relax + \twocolumn[{\fontsize{\@xivpt}{18}\bfseries\centering + \vskip\topskip\hbox{}\vskip-\baselineskip% adjust top space + #1\par +% \end{macrocode} +% After \cs{twocolumn} finishes operating, the top material is left in an +% insert register, and topskip will now be applied above the +% following material. So we should set it to the normal +% after-chapter-title space (34pt)---cf.~\cs{@makeschapterhead}. +% \begin{macrocode} + \global\topskip 34\p@\relax + \ifx\@empty\indexintro + \else + \begingroup \normalsize + \skip@\topskip \advance\skip@ -\baselineskip + \vskip\skip@ + \parbox[t]{24pc}{\normalfont\indexintro\par}% + \endgroup + \global\topskip 24\p@\relax + \fi + }]% +} +\newcommand{\indexintro}{} +% +% \end{macrocode} +% +% \env{theindex} differs in some author packages only in the +% shape of the title; make this easy to change. [bnb, 2004/05/22] +% \begin{macrocode} +\newcommand{\@indextitlestyle}{% +%<*amsbook> + \let\@makeschapterhead\indexchap + \@xp\chapter\@xp*\@xp{\indexname}% +% +% \twocolumn[\@xp\section\@xp*\@xp{\indexname}]% +} +\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi + \columnseprule\z@ \columnsep 35\p@ + \@indextitlestyle + \thispagestyle{plain}% + \let\item\@idxitem + \parindent\z@ \parskip\z@\@plus.3\p@\relax + \raggedright + \hyphenpenalty\@M + \footnotesize} +% \end{macrocode} +% +% \begin{macrocode} +\def\indexname{Index} +% \end{macrocode} +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \subsection{Footnotes} +% In books the footnote counter should reset to 0 at the beginning of +% each chapter: +% \begin{macrocode} +%\@addtoreset{footnote}{chapter} +% \end{macrocode} +% +% Rule above footnotes is 5 picas wide. +% \begin{macrocode} +\def\footnoterule{\kern-.4\p@ + \hrule\@width 5pc\kern11\p@\kern-\footnotesep} +% \end{macrocode} +% +% A simple superscript doesn't work here; it fails on a minipage, +% where \cs{itshape} (which is invalid in math mode) is used for the +% footnote numbers. Cf.~ the definition of \cn{textprime}. +% \begin{macrocode} +\def\@makefnmark{% + \leavevmode + \raise.9ex\hbox{\fontsize\sf@size\z@\normalfont\@thefnmark}% +} +% +\def\@makefntext{\indent\@makefnmark} +% \end{macrocode} +% Add \cn{normalfont} before \cn{footnotesize} so that +% fonts will come out properly using the new font selection scheme. +% \begin{macrocode} +\long\def\@footnotetext#1{% + \insert\footins{% + \normalfont\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep \splitmaxdepth \dp\strutbox + \floatingpenalty\@MM \hsize\columnwidth +% \end{macrocode} +% Mostly \cs{@parboxrestore} does what we want; but not with +% respect to \cs{parindent} and \cs{tolerance}. +% \begin{macrocode} + \@parboxrestore \parindent\normalparindent \sloppy + \protected@edef\@currentlabel{% + \csname p@footnote\endcsname\@thefnmark}% + \@makefntext{% + \rule\z@\footnotesep\ignorespaces#1\unskip\strut\par}}} +% \end{macrocode} +% We change \cn{sloppy} to keep it from overriding our normal value of +% 1pt for \cs{hfuzz} and \cs{vfuzz} with a LESS sloppy value (.5pt). +% \begin{macrocode} +\hfuzz=1pt \vfuzz=\hfuzz +\def\sloppy{\tolerance9999 \emergencystretch 3em\relax} +% \end{macrocode} +% +% \subsection{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. +% \begin{description} +% \item[topnumber] maximum number of top figures allowed per page +% \item[bottomnumber] maximum number of bottom figures allowed per page +% \item[totalnumber] maximum number of figures (top and bottom) allowed +% per page +% \item[dbltopnumber] same as topnumber, but for two-column wide +% figures, when double-column format is used +% \end{description} +% \begin{macrocode} +\setcounter{topnumber}{4} +\setcounter{bottomnumber}{4} +\setcounter{totalnumber}{4} +\setcounter{dbltopnumber}{4} +% \end{macrocode} +% Float fraction parameters. +% \begin{description} +% \item[\cs{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'. +% \item[\cs{bottomfraction}] same as \cs{topfraction}, but for bottom +% figures +% \item[\cs{textfraction}] \emph{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, \latex/ will turn the current figure or +% figures into a ``float page'', i.e., a page of figures without any +% text. +% \item[\cs{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. +% \item[\cs{dbltopfraction}] like \cs{topfraction}, but applies only to +% figures that are two columns wide, when double-column format is +% used. +% \item[\cs{dblfloatpagefraction}] minimum amount of double-column +% figure material needed before \latex/ will make a two-column wide +% ``float page'' +% \end{description} +% \begin{macrocode} +\renewcommand{\topfraction}{.97} +\renewcommand{\bottomfraction}{.97} +\renewcommand{\textfraction}{.03} +\renewcommand{\floatpagefraction}{.9} +\renewcommand{\dbltopfraction}{.97} +\renewcommand{\dblfloatpagefraction}{.9} +% \end{macrocode} +% +% 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. +% +% \begin{description} +% \item[\cs{floatsep}] Space between consecutive figures +% \item[\cs{textfloatsep}] Space between text and top or bottom figures +% \item[\cs{intextsep}] Space above and below a figure in the middle of +% the text (i.e., placed with the |[h]| option) +% \item[\cs{dblfloatsep}] Space between consecutive figures that are +% two columns wide (when two-column format is used) +% \item[\cs{dbltextfloatsep}] Space between double-column figures and text +% \item[\cs{@fptop}] Space above the first figure on a float page +% \item[\cs{@fpsep}] Space between figures on a float page +% \item[\cs{@fpbot}] Space below the last figure on a float page +% \item[\cs{@dblfptop}] Space above the first double-column figure on a +% two-column wide float page +% \item[\cs{@dblfptop}] Space between double-column figures on a two-column +% wide float page +% \item[\cs{@dblfptop}] Space below the last double-column figure on a +% two-column wide float page +% \end{description} +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \cs{fps@figure}, \cs{fps@table}: placement specifications for +% \env{figure} and \env{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. +% \begin{macrocode} +\newcommand{\fps@figure}{tbp} +\newcommand{\fps@table}{tbp} +% \end{macrocode} +% +% Some more setup for figures. +% \begin{macrocode} +%\newcounter{figure} +%\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} +\newenvironment{figure}{% + \@float{figure}% +}{% + \end@float +} +\newenvironment{figure*}{% + \@dblfloat{figure}% +}{% + \end@dblfloat +} +% \end{macrocode} +% And similar for tables. +% \begin{macrocode} +%\newcounter{table} +%\newcounter{table}[chapter] +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename\ \thetable} +\def\tablename{Table} +\newenvironment{table}{% + \@float{table}% +}{% + \end@float +} +\newenvironment{table*}{% + \@dblfloat{table}% +}{% + \end@dblfloat +} +% \end{macrocode} +% +% Change \cs{@floatboxreset} to add \cn{centering}. Centering is +% always applied to tables and figures in AMS publications. It should +% not be necessary to throw in |\begin{center}| \ldots |\end{center}| +% in every instance to achieve this. +% \begin{macrocode} +\def\@floatboxreset{\global\@minipagefalse \centering} +% \end{macrocode} +% +% This is what we want \cs{@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). +% +% In practice this procedure tends to fail if there are any potential +% breakpoints near the end of the first line (in the window between +% short-width and full-width). Then \TeX{} tends to choose a break +% (depending on spaceskip, tolerance, etc) at the last acceptable +% breakpoint before short-width is exceeded, \emph{without +% considering any later material}---in particular, the negative kern. +% [This was pointed out by Donald Arseneau, May 2000.] Unfortunately, +% setting parfillskip to a negative value does not work either. I +% guess this is a special case of the existing limitation on +% parshape: you cannot specify a parshape in terms of number of lines +% from the bottom of the paragraph. (We would like to specify a +% parshape where the last line is 6 picas longer than the others.) +% +% 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. +% \begin{macrocode} +\long\def\@makecaption#1#2{% +% \end{macrocode} +% Measure the contents of the caption. If \arg{2} is not +% empty, then we must add a period and an en-space before +% typesetting it. The \cs{@caption} macro adds an extra +% \cn{ignorespaces} at the beginning of \arg{2}, so in order +% to find out if the user-typed portion is empty we use +% \cs{@cdr} to pull off the \cn{ignorespaces}. +% \begin{macrocode} +% Use color-safe commands + \setbox\@tempboxa\vbox{\color@setgroup + \advance\hsize-2\captionindent\noindent + \@captionfont\@captionheadfont#1\@xp\@ifnotempty\@xp + {\@cdr#2\@nil}{.\@captionfont\upshape\enspace#2}% + \unskip\kern-2\captionindent\par + \global\setbox\@ne\lastbox\color@endgroup}% + \ifhbox\@ne % the normal case + \setbox\@ne\hbox{\unhbox\@ne\unskip\unskip\unpenalty\unkern}% + \fi +% \end{macrocode} +% If \cs{@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 \cs{write} (from \cn{index} or something). +% Interestingly, we can't use \cs{ifvoid} to see if +% \cs{@tempboxa} is empty, because empty is not the same thing +% as void (as far as the \cs{ifvoid} test is concerned). So +% instead we measure the width of \cs{@tempboxa} +% to see if it's zero; this should suffice for non-bizarre cases. +% \begin{macrocode} + \ifdim\wd\@tempboxa=\z@ % this means caption will fit on one line + \setbox\@ne\hbox to\columnwidth{\hss\kern-2\captionindent\box\@ne\hss}% + \else % tempboxa contained more than one line + \setbox\@ne\vbox{\unvbox\@tempboxa\parskip\z@skip + \noindent\unhbox\@ne\advance\hsize-2\captionindent\par}% + \fi + \ifnum\@tempcnta<64 % if the float IS a figure... + \addvspace\abovecaptionskip + \hbox to\hsize{\kern\captionindent\box\@ne\hss}% + \else % if the float IS NOT a figure... + \hbox to\hsize{\kern\captionindent\box\@ne\hss}% + \nobreak + \vskip\belowcaptionskip + \fi +\relax +} +% \end{macrocode} +% Allocate the skip registers for above and below caption space. +% \begin{macrocode} +\newskip\abovecaptionskip \abovecaptionskip=12pt \relax +\newskip\belowcaptionskip \belowcaptionskip=12pt \relax +\newdimen\captionindent \captionindent=3pc +% \end{macrocode} +% +% \subsection{Miscellaneous} +% +% \begin{macro}{\nonbreakingspace} +% Change \qc{\~} to be more forgiving of accidental adjacent spaces. +% Note that this means multiple |~~~...| cannot be used to get +% multiple spaces in the output. +% \begin{macrocode} +\def\nonbreakingspace{\unskip\nobreak\ \ignorespaces} +\def~{\protect\nonbreakingspace} +% \end{macrocode} +% \end{macro} +% +% Redefine \cs{@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. +% \begin{macrocode} +\def\@biblabel#1{\@ifnotempty{#1}{[#1]}} +% \end{macrocode} +% Changed \cs{@cite} to always use roman/upright, nonbold font, even +% in italic or bold text (following AMS style). +% Turn off \cs{mathsurround} just in case there are subscripts in the +% cite numbers. +% \begin{macrocode} +\def\@citestyle{\m@th\upshape\mdseries} +%\let\citeform\@firstofone +%\def\citeform#1{{\bfseries#1}} +\def\@cite#1#2{{% + \@citestyle[\citeform{#1}\if@tempswa, #2\fi]}} +% \end{macrocode} +% +% Make \cn{cite} robust if it isn't already. Too many unsuspecting +% users get problems from this in a figure or table caption. +% \begin{macrocode} +\@ifundefined{cite }{% + \expandafter\let\csname cite \endcsname\cite + \edef\cite{\@nx\protect\@xp\@nx\csname cite \endcsname}% +}{} +% \end{macrocode} +% +% \begin{macro}{\fullwidthdisplay} +% The function \cs{fullwidthdisplay} makes a displayed equation take +% up the full column width even if the current context is an indented +% list. +% \begin{macrocode} +\def\fullwidthdisplay{\displayindent\z@ \displaywidth\columnwidth} +% \end{macrocode} +% And we insert the \cs{fullwidthdisplay} function at the beginning of +% \cs{everydisplay} just in case any later code in \cs{everydisplay} +% needs to use the values of \cs{displayindent} or \cs{displaywidth}. +% \begin{macrocode} +\edef\@tempa{\noexpand\fullwidthdisplay\the\everydisplay} +\everydisplay\expandafter{\@tempa} +% \end{macrocode} +% \end{macro} +% +% A few odds and ends for indexes, based on \pkg{makeindex}. The +% definition of \cn{see} as ``see also'' is unfortunate, but of +% long standing, and cannot be changed without destroying backward +% compatibility, so an alternate command, \cn{seeonly}, is provided +% to cover the basic situation. +% \begin{macrocode} +\newcommand*\seeonlyname{see} +\newcommand*\seename{see also} +\newcommand*\alsoname{see also} +\newcommand*\seeonly[2]{\emph{\seeonlyname} #1} +\newcommand*\see[2]{\emph{\seename} #1} +\newcommand*\seealso[2]{\emph{\alsoname} #1} +\newcommand\printindex{\@input{\jobname.ind}} +% \end{macrocode} +% +% \begin{macro}{\textprime} +% A text prime symbol, for applying primes to numbers such as list +% numbers or equation numbers that are not really math. Furthermore +% Cyrillic myagkii znak, or soft sign, is represented by a prime +% symbol in Russian names when they are transliterated into English. +% +% \cn{textprime} uses the prime symbol from math, but because it's +% intended specifically for nonmath use, we avoid going through math +% mode with \verb'$...$'. We must therefore call \cs{check@mathfonts} +% to ensure that \verb'scriptfont2' is actually defined. Otherwise, +% if \cn{textprime} were used in a document before the first math +% formula, there would be no adequate assignment yet for +% \verb'\scriptfont2'. +% +% The raise value of \verb'.8ex' is just a reasonable guess at making +% the bottom of the prime symbol fall near the top of a preceding +% lowercase letter but still not fall too low on an uppercase letter. +% We could look up the \cs{fontdimen} values used in math mode for +% superscripts but I don't think it's worth the bother. +% +% Cf.~also the definition of \cs{@makefnmark}. The prime symbol here +% is not raised quite so high because I think that is desirable for +% the soft-sign usage. +% \begin{macrocode} +\DeclareRobustCommand\textprime{\leavevmode + \raise.8ex\hbox{\check@mathfonts\the\scriptfont2 \char48 }} +% \end{macrocode} +% \end{macro} +% +% \subsection{Book style variations} +% Here is the layout for a \cn{maketitle} in the \cls{amsbook} class. +% \begin{macrocode} +%<*amsbook> +\def\maketitle{\par + \@topnum\z@ % this prevents figures from falling at the top of page 1 + \begingroup + \@maketitle + \endgroup + \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 + \do\dedicatory \do\@dedicatory \do\thanks \do\thankses + \do\keywords \do\@keywords \do\subjclass \do\@subjclass +} +% \end{macrocode} +% +% \begin{macrocode} +\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 \@setaddresses \fi + \vfil + \ifx\@empty\@dedicatory + \else \begingroup + \centering{\footnotesize\itshape\@dedicatory\@@par}% + \endgroup + \fi + \vfill + \newpage\thispagestyle{empty} + \begin{center} + \ifx\@empty\@subjclass\else\@setsubjclass\fi + \ifx\@empty\@keywords\else\@setkeywords\fi + \ifx\@empty\@translators\else\vfil\@settranslators\fi + \ifx\@empty\thankses\else\vfil\@setthanks\fi + \end{center} + \vfil + \@setabstract + \endgroup} +% \end{macrocode} +% +% Define the desired form for translator names. +% \begin{macrocode} +\def\@settranslators{\par + \begingroup + \translname: \andify\@translators \uppercasenonmath\@translators + \@translators \@@par + \endgroup} +\def\@setdate{\par\smallskip\@date\par\smallskip} +\def\@setsubjclass{\par\smallskip + {\itshape\subjclassname.}\enspace\@subjclass\par\smallskip} +\def\@setkeywords{\par\smallskip + {\itshape \keywordsname.}\enspace \@keywords\par\smallskip} +% +% +% \end{macrocode} +% +% \subsection{Setup for theorems, definitions, remarks, proofs} +% \subsubsection{Intended usage} +% +% Here are some examples showing the kinds of theorem environment +% declarations that are possible. +%\begin{verbatim} +% \newtheorem{prop}{Proposition} +% \newtheorem{thm}{Theorem}[section] +% \newtheorem{lem}[thm]{Lemma} +% \newtheorem*{Zorn}{Zorn's Lemma} +% +% \theoremstyle{definition} +% \newtheorem{dfn}{Definition} +% +% \theoremstyle{remark} +% \newtheorem*{rmk}{Remark} +%\end{verbatim} +% +% The first four statements all define environments using the default +% theorem style (`plain'), since there is no prefatory +% \cn{theoremstyle} declaration. The first statement defines an +% automatically numbered \env{prop} environment whose headings will +% look like this: Proposition 1, Proposition 2, and so forth. The +% second statement defines an environment \env{thm} with numbers +% subordinate to section numbers, so the headings will look like +% this: Theorem 1.1, Theorem 1.2, Theorem 1.3, \dots, (in section 2:) +% Theorem 2.1, Theorem 2.2, and so forth. The third statement defines +% a \env{lem} environment whose numbers will interleave in sequence +% with the theorem numbers: Theorem 1.3, Lemma 1.4, Lemma 1.5, +% Theorem 1.6, and so forth. The fourth statement defines a special +% unnumbered lemma named `Zorn's Lemma'. The remaining two +% \cn{newtheorem} statements have no special features except for the +% \cn{theoremstyle} declarations that cause the \env{dfn} and +% \env{rmk} environments to have some differences in appearance. +% +% There are three basic styles provided: The `plain' style produces +% bold headings and italic body text; the `definition' style produces +% bold headings and normal body text; the `remark' style produces +% italic headings and normal body text. +% +% A \cn{swapnumbers} command allows theorem numbers to be swapped to +% the front of the theorem headings. Putting \cn{swapnumbers} in your +% document preamble will cause \emph{all following} \cn{newtheorem} +% statements to produce number-first headings. (To provide maximum +% control, \cn{swapnumbers} is designed so that it can be used more +% than once; each time it is used, theorem numbers will be swapped to +% the opposite side for all following \cn{newtheorem} statements. But +% rarely will it need to be invoked more than once per document.) +% +% \subsubsection{Custom theorem styles} +% There is a \cn{newtheoremstyle} command provided to make the +% creation of custom theoremstyles fairly easy. +% +% Usage: +%\begin{verbatim} +% #1 +% \newtheoremstyle{NAME}% +% #2 #3 #4 +% {ABOVESPACE}{BELOWSPACE}{BODYFONT}% +% #5 #6 #7 #8 +% {INDENT}{HEADFONT}{HEADPUNCT}{HEADSPACE}% +% #9 +% {CUSTOM-HEAD-SPEC} +%\end{verbatim} +% Leaving the `indent' argument empty is equivalent to entering +% |0pt|. The `headpunct' and `headspace' arguments are for the +% punctuation and horizontal space between the theorem head and the +% following text. There are two special values that may be used for +% `headspace': a single space means that a normal interword space +% should be used; ``\cn{newline}'' means that there should be a line +% break after the head instead of horizontal space. The +% `custom-head-spec' argument follows a special convention: it is +% interpreted as the replacement text for an internal three-argument +% function \cn{thmhead}, i.e., as if you were defining +%\begin{verbatim} +% \renewcommand{\thmhead}[3]{...#1...#2...#3...} +%\end{verbatim} +% but omitting the initial |\renewcommand{\thmhead}[3]|. The three +% arguments that will be supplied to \cn{thmhead} are the name, +% number, and optional note components. Within the replacement text +% you can (and normally will want to) use other special functions +% \cn{thmname}, \cn{thmnumber}, and \cn{thmnote}. These will print +% their argument if and only if the corresponding argument of +% \cn{thmhead} is nonempty. For example +%\begin{verbatim} +% {\thmname{#1}\thmnumber{ #2}\thmnote{ (#3)}} +%\end{verbatim} +% This would cause the theorem note \arg{3} to be printed with a +% preceding space and enclosing parentheses, if it is present, and if +% it is absent, the space and parentheses will be omitted because +% they are inside the argument of \cn{thmnote}. +% +% Finally, if you have an extra bit of arbitrary code that you want +% to slip in somewhere, the best place to do it is in the `body font' +% argument. +% +% The \cn{newtheoremstyle} command is designed to provide, through a +% relatively simple interface, control over the style aspects that +% are most commonly changed. More complex requirements must be +% addressed through a separate \latex/ package. +% +% When you set up custom theorem styles with \cn{newtheoremstyle} you +% should not use \cn{swapnumbers}. You have full control of the +% ordering of elements in the theorem head, just place them where you +% want. Or, if you do use \cn{swapnumbers}, you must look at the +% definition of \cs{swappedhead} and change it appropriately. + +% \subsubsection{Implementation} +% The \cn{theoremstyle} command is very simple except for the need to +% warn about an unknown theoremstyle. +% \begin{macrocode} +%<*amsthm|classes> +\newcommand{\theoremstyle}[1]{% + \@ifundefined{th@#1}{% + \PackageWarning{amsthm}{Unknown theoremstyle `#1'}% + \thm@style{plain}% + }{% + \thm@style{#1}% + }% +} +% \end{macrocode} +% +% \begin{macrocode} +\newtoks\thm@style +\thm@style{plain} +% \end{macrocode} +% +% What's really needed is a full-fledged systematic approach for +% specifying the desired order and formatting of the three identified +% parts of a theorem head (name, number, note). +% \begin{macrocode} +\newtoks\thm@bodyfont \thm@bodyfont{\itshape} +\newtoks\thm@headfont \thm@headfont{\bfseries} +\newtoks\thm@notefont \thm@notefont{} +\newtoks\thm@headpunct \thm@headpunct{.} +% \end{macrocode} +% Vertical spacing: initialize to current value of \cs{topsep}. +% If a document class loads the \pkg{amsthm} package it +% should take care to set these variables explicitly, if current +% \cs{topsep} is not the desired value. +% \begin{macrocode} +\newskip\thm@preskip \newskip\thm@postskip +%<*classes> +\def\thm@space@setup{% + \thm@preskip=.5\baselineskip\@plus.2\baselineskip + \@minus.2\baselineskip + \thm@postskip=\thm@preskip +} +% +%<*amsthm> +\def\thm@space@setup{% + \thm@preskip=\topsep \thm@postskip=\thm@preskip +} +% +% \end{macrocode} +% Modify \cn{newtheorem} to add |*| option. If a |*| is found, pass +% it on to \cs{@xnthm} as the first argument. (This information +% enables us to handle two different possibilities in a single +% function \cs{@xnthm} instead of needing two separate functions.) +% \begin{macrocode} +\renewcommand{\newtheorem}{\@ifstar{\@xnthm *}{\@xnthm \relax}} +% \end{macrocode} +% +% Check to see if an optional arg is present after the first +% mandatory arg (which is \arg{2} at the moment since the |*| or +% non-|*| is \arg{1}). +% \begin{macrocode} +\def\@xnthm#1#2{% + \let\@tempa\relax + \@xp\@ifdefinable\csname #2\endcsname{% + \global\@xp\let\csname end#2\endcsname\@endtheorem + \ifx *#1% unnumbered, need to get one more mandatory arg + \edef\@tempa##1{% + \gdef\@xp\@nx\csname#2\endcsname{% + \@nx\@thm{\@xp\@nx\csname th@\the\thm@style\endcsname}% + {}{##1}}}% + \else % numbered theorem, need to check for optional arg + \def\@tempa{\@oparg{\@ynthm{#2}}[]}% + \fi + }% + \@tempa +} +% \end{macrocode} +% +% Environment numbered together with a previously defined +% environment. +% +% Arg1: env name, e.g. `thm'\par +% Arg2: optional sibling counter\par +% Arg3: heading text e.g. `Theorem' +% \begin{macrocode} +\def\@ynthm#1[#2]#3{% +% \end{macrocode} +% If optional arg \arg{2} is empty, call \cs{@xthm} to look for a +% possible optional arg in terminal position. Note that +% the two optional args are mutually exclusive. As \arg{2} is a +% counter name and must be processed by \cs{csname} anyway, +% we can use a simpler test instead of \cs{@ifempty}. +% \begin{macrocode} + \ifx\relax#2\relax + \def\@tempa{\@oparg{\@xthm{#1}{#3}}[]}% + \else + \@ifundefined{c@#2}{% + \def\@tempa{\@nocounterr{#2}}% + }{% + \@xp\xdef\csname the#1\endcsname{\@xp\@nx\csname the#2\endcsname}% + \toks@{#3}% + \@xp\xdef\csname#1\endcsname{% + \@nx\@thm{% + \let\@nx\thm@swap + \if S\thm@swap\@nx\@firstoftwo\else\@nx\@gobble\fi + \@xp\@nx\csname th@\the\thm@style\endcsname}% + {#2}{\the\toks@}}% + \let\@tempa\relax + }% + \fi + \@tempa +} +% \end{macrocode} +% +% Environment numbered relative to the counter given as \arg{3}. This +% function should really be named \cs{@znthm} but we're trying to +% save a bit of hash table and string pool by reusing one of the +% command names rendered obsolete by the \pkg{amsthm} package. +% +% Arg1: env name e.g. `thm'; +% Arg2: heading text e.g. `Theorem'; +% Arg3: parent counter e.g. section. +% \begin{macrocode} +\def\@xthm#1#2[#3]{% +% \end{macrocode} +% Set up the counter \verb'c@#1' and optionally add it to the reset +% list of counter \arg{3}. As \arg{3} is a +% counter name and must be processed by \cs{csname} anyway, +% we can use a simpler test instead of \cs{@ifempty}. +% \begin{macrocode} + \ifx\relax#3\relax + \newcounter{#1}% + \else + \newcounter{#1}[#3]% +% \end{macrocode} +% Define \cn{thexxx} to be \verb'\theyyy.\arabic{xxx}' (assuming +% default values of punctuation and numbering style). The use of +% \cs{xdef} here is inherited from the old \latex/ code, I'm not +% sure it's a good idea in general, but there should not be any +% problems unless someone changes the value of \cs{@thmcountersep} or +% \cs{@thmcounter}. +% \begin{macrocode} + \@xp\xdef\csname the#1\endcsname{\@xp\@nx\csname the#3\endcsname + \@thmcountersep\@thmcounter{#1}}% + \fi + \toks@{#2}% + \@xp\xdef\csname#1\endcsname{% + \@nx\@thm{% + \let\@nx\thm@swap + \if S\thm@swap\@nx\@firstoftwo\else\@nx\@gobble\fi + \@xp\@nx\csname th@\the\thm@style\endcsname}% + {#1}{\the\toks@}}% +} +% \end{macrocode} +% +% [mjd,1999/10/13] The following code doesn't handle the case where +% an equation is immediately followed by a theorem with no +% intervening \cs{par}---then the spacefactor is 1000. +% \begin{macrocode} +% % \def\thm@check@break{% +% % \ifhmode \unskip \unskip +% % \edef\pre@thm@spacefactor{\the\spacefactor}\par +% % \edef\thm@topbreak{% +% % \ifnum\pre@thm@spacefactor<\sfcode`\!\relax +% % % preceding text line did not end with end-of-sentence punctuation +% % \ifnum\prevgraf=\@ne \penalty\widowpenalty +% % \else \penalty9999\relax +% % \fi +% % \else +% % \@nx\addpenalty{\@beginparpenalty}% +% % \fi +% % }% +% % \else +% % \def\thm@topbreak{\addpenalty\@beginparpenalty}% +% % \fi +% % } +% \end{macrocode} +% +% If arg \arg{2} is empty, this is an unnumbered environment; +% otherwise \arg{2} is the name of a counter. \arg{3} is descriptive +% name such as ``Theorem'' or ``Lemma''. Arg \arg{1} is the style +% function, for example \cs{th@plain}. +% \begin{macrocode} +\def\@thm#1#2#3{% + \ifhmode\unskip\unskip\par\fi + \normalfont + \trivlist +% \end{macrocode} +% Explicitly set plain style here, then override parts as necessary +% in the function provided as \arg{1}. +% \begin{macrocode} + \let\thmheadnl\relax + \let\thm@swap\@gobble +% \let\thm@indent\noindent % no indent +% \thm@headfont{\bfseries}% heading font bold +% \let\thm@indent\indent % indent +% \thm@headfont{\scshape}% heading font small caps + \thm@notefont{\fontseries\mddefault\upshape}% + \thm@headpunct{.}% add period after heading + \thm@headsep 5\p@ plus\p@ minus\p@\relax + \thm@space@setup + #1% style overrides + \@topsep \thm@preskip % used by thm head + \@topsepadd \thm@postskip % used by \@endparenv + \def\@tempa{#2}\ifx\@empty\@tempa + \def\@tempa{\@oparg{\@begintheorem{#3}{}}[]}% + \else + \refstepcounter{#2}% + \def\@tempa{\@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]}% + \fi + \@tempa +} +% \end{macrocode} +% +% The internal function \cs{@restorelabelsep} starts out as a no-op. +% I don't think this is needed any more [mjd,2000/10/26]. +% \begin{macrocode} +\def\@restorelabelsep{\relax} +% \end{macrocode} +% +% This variation of the \cs{@thm} command is no longer needed. The +% variation \cs{@xthm} was commandeered for \cn{newtheorem} use. +% \begin{macrocode} +\let\@ythm\relax +% \end{macrocode} +% +% Init \cn{thmname} etc. +% \begin{macrocode} +\let\thmname\@iden \let\thmnote\@iden \let\thmnumber\@iden +% \end{macrocode} +% +% \begin{macro}{\@upn} +% The function \cs{\@upn} is used to force theorem numbers and +% similar elements to be upright even when the current font is +% italic. If a suitable italic font with upright numbers and +% punctuation is available, this function should be redefined to be a +% no-op. +% \begin{macrocode} +\providecommand\@upn{\textup} +% \end{macrocode} +% \end{macro} +% +% Definitions for theorem heads. +% \begin{macrocode} +\def\thmhead@plain#1#2#3{% +% \end{macrocode} +% To allow for the case where the thmname part is empty and the +% heading consists only of a number (don't laugh, we have +% examples from real mathematical manuscripts), we don't add the +% space at the beginning of thmnumber unless \arg{1} is nonempty. +% \begin{macrocode} + \thmname{#1}\thmnumber{\@ifnotempty{#1}{ }\@upn{#2}}% +% \end{macrocode} +% In thmnote we always add a leading space, i.e., assuming that +% at least one of the preceding parts will always be present. +% \begin{macrocode} + \thmnote{ {\the\thm@notefont(#3)}}} +\let\thmhead\thmhead@plain +% \end{macrocode} +% Swappedhead is for the case where the number precedes the +% word "Theorem". When the numbers fall on the left, like section +% numbers, AMS journal style calls for them to be lightface. We get +% this by invoking \cs{@secnumfont}. +% +% In handling the punctuation after the number we have to step +% delicately if we want to successfully handle cases where the +% theorem name is empty (this is very rare, yet it sometimes arises +% in practice). +% \begin{macrocode} +\def\swappedhead#1#2#3{% +% \thmnumber{#2}% +% \thmname{\@ifnotempty{#2}{~}#1}% +% \thmnumber{\@upn{\@secnumfont#2\@ifnotempty{#1}{.~}}}% +% \thmname{#1}% + \thmnote{ {\the\thm@notefont(#3)}}} +% \end{macrocode} +% +% A customized definition of \cs{th@plain} written for version 1.x of +% the \pkg{amsthm} package might refer to \cs{swappedhead@plain}; this +% gives it a definition for backward compatibility. +% \begin{macrocode} +\let\swappedhead@plain=\swappedhead +% \end{macrocode} +% +% In \cs{@begintheorem} \cn{thmheadnl} is called after the theorem +% head: maybe a newline, otherwise a no-op. +% \begin{macrocode} +\let\thmheadnl\relax +\let\thm@indent\noindent +\let\thm@swap\@gobble +% \end{macrocode} +% +% If argument \arg{2} is empty, then this is an unnumbered +% environment. Otherwise \arg{2} is a numbering command such as +% \cn{thexyz}. We use \cs{deferred@thm@head} instead of \cs{item} in +% order to allow line breaking in the optional note argument. +% \begin{macrocode} +\def\@begintheorem#1#2[#3]{% + \deferred@thm@head{\the\thm@headfont \thm@indent +% \end{macrocode} +% Changes to \cs{thmnumber} and \cs{thmnote} are local to the +% containing box. +% \begin{macrocode} + \@ifempty{#1}{\let\thmname\@gobble}{\let\thmname\@iden}% + \@ifempty{#2}{\let\thmnumber\@gobble}{\let\thmnumber\@iden}% + \@ifempty{#3}{\let\thmnote\@gobble}{\let\thmnote\@iden}% +% \end{macrocode} +% The \cs{thm@swap} function selects either \cs{swappedhead} or +% \cs{thmhead}. +% \begin{macrocode} + \thm@swap\swappedhead\thmhead{#1}{#2}{#3}% +% \end{macrocode} +% I can't think of any example where the after-head punctuation +% should be omitted so it seems correct not to use \cs{@addpunct} +% here. +% \begin{macrocode} + \the\thm@headpunct +% \end{macrocode} +% If this \emph{is} a newline (from a \cn{newtheoremstyle}), it +% gets lost if there isn't any text following the heading, since +% \cs{deferred@thm@head} packs the heading into an hbox with +% \cs{sbox}\cs{@labels}. Attempting to move the \cs{thmheadnl} +% outside the scope of \cs{deferred@thm@head} (just outside the +% ending brace below) results in no improvement if no text follows +% the heading, and where there is text, runs it in. Inserting a +% space following such a heading results in an extra blank line. +% [bnb, 2004/06/30] +% \begin{macrocode} + \thmheadnl % possibly a newline. + \hskip\thm@headsep + }% + \ignorespaces} +% \end{macrocode} +% +% \begin{macrocode} +\newskip\thm@headsep +\thm@headsep=5pt plus1pt minus1pt\relax +% \end{macrocode} +% +% \begin{macrocode} +\let\adjust@parskip@nobreak=\@nbitem +% \end{macrocode} +% +% \begin{macrocode} +\newtoks\dth@everypar +\dth@everypar={% + \@minipagefalse \global\@newlistfalse + \@noparitemfalse + \if@inlabel + \global\@inlabelfalse + \begingroup \setbox\z@\lastbox + \ifvoid\z@ \kern-\itemindent \fi + \endgroup + \unhbox\@labels + \fi + \if@nobreak \@nobreakfalse \clubpenalty\@M + \else \clubpenalty\@clubpenalty \everypar{}% + \fi +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\deferred@thm@head#1{% + \if@inlabel \indent \par \fi % eject a section head if one is pending + \if@nobreak +% \end{macrocode} +% This case normally arises when a theorem follows immediately after +% a section head. Then we leave the below-section-head space instead +% of adding above-theorem space; but some adjustment of parskip is +% needed. +% \begin{macrocode} + \adjust@parskip@nobreak + \else + \addpenalty\@beginparpenalty + \addvspace\@topsep + \addvspace{-\parskip}% + \fi + \global\@inlabeltrue + \everypar\dth@everypar + \sbox\@labels{\normalfont#1}% + \ignorespaces +} +% \end{macrocode} +% +% \begin{macro}{\nonslanted} +% The \cn{nonslanted} command changes the current font to +% \cn{upshape} if it is \cn{itshape} or \cn{slshape}. This is used +% for document structure numbers that should be consistently upright +% in all contexts. +% \begin{macrocode} +\def\nonslanted{\relax +% \end{macrocode} +% Can't do a direct \cs{ifx} between \cs{f@shape} and \cs{itdefault} +% because the latter is \cs{long} (grumble grumble). +% \begin{macrocode} + \@xp\let\@xp\@tempa\csname\f@shape shape\endcsname + \ifx\@tempa\itshape\upshape + \else\ifx\@tempa\slshape\upshape\fi\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\swapnumbers} +% The \cn{swapnumbers} command sets a switch \cs{thm@swap} that is +% used by \cn{newtheorem}. To conserve hash table we load +% \cs{thm@swap} with two uses; the first one is needed only in +% \cn{newtheorem} declarations and the second one is needed only in +% typesetting theorem environments. +% \begin{macrocode} +\def\swapnumbers{\edef\thm@swap{\if S\thm@swap N\else S\fi}} +\def\thm@swap{N}% +% \end{macrocode} +% \end{macro} +% +% \cs{@opargbegintheorem} not needed, \cs{@oparg} utility serves +% instead. +% \begin{macrocode} +\let\@opargbegintheorem\relax +% \end{macrocode} +% +% Except for the body font, default values are built into \cs{@thm}. +% \begin{macrocode} +\def\th@plain{% +%% \let\thm@indent\noindent % no indent +%% \thm@headfont{\bfseries}% heading font is bold +%% \thm@notefont{}% same as heading font +%% \thm@headpunct{.}% add period after heading +%% \let\thm@swap\@gobble +%% \thm@preskip\topsep +%% \thm@postskip\theorempreskipamount + \itshape % body font +} +% \end{macrocode} +% +% Theorem style `definition' is the same as `plain' except for the +% body font. +% \begin{macrocode} +\def\th@definition{% + \normalfont % body font +} +% \end{macrocode} +% +% Theorem style `remark' differs from `plain' in head font and body +% font. Also smaller spacing above and below for AMS classes only. +% \begin{macrocode} +\def\th@remark{% +% \thm@headfont{\itshape}% + \normalfont % body font +%<*amsthm> + \thm@preskip\topsep \divide\thm@preskip\tw@ + \thm@postskip\thm@preskip +% +} +% \end{macrocode} +% +% The standard definition of \cs{@endtheorem} is just +% \cs{endtrivlist}, but that doesn't automatically start a new +% paragraph, so we add \cs{@endpefalse} in order to ensure a new +% paragraph. This differs from the basic \latex/ behavior. +% \begin{macrocode} +\def\@endtheorem{\endtrivlist\@endpefalse } +% \end{macrocode} +% +% \begin{macro}{\newtheoremstyle} +% An easy way to make a not too complicated variant theorem style. +% Usage: +%\begin{verbatim} +% #1 +% \newtheoremstyle{NAME}% +% #2 #3 #4 +% {ABOVESPACE}{BELOWSPACE}{BODYFONT}% +% #5 #6 #7 #8 +% {INDENT}{HEADFONT}{HEADPUNCT}{HEADSPACE}% +% #9 +% {CUSTOM-HEAD-SPEC} +%\end{verbatim} +% \begin{macrocode} +\newcommand{\newtheoremstyle}[9]{% +% \end{macrocode} +% Empty or 0pt for \arg{5} is translated to \cs{noindent}. +% \begin{macrocode} + \@ifempty{#5}{\dimen@\z@skip}{\dimen@#5\relax}% + \ifdim\dimen@=\z@ +% \end{macrocode} +% \arg{4} is body font. Extra code could be included there if +% necessary. +% \begin{macrocode} + \toks@{#4\let\thm@indent\noindent}% + \else + \toks@{#4\def\thm@indent{\noindent\hbox to#5{}}}% + \fi +% \end{macrocode} +% Arg \arg{8} is a glue spec for the space after the head. As +% a proper glue spec for `normal interword space' is rather hard to +% write, we recognize an argument of |{ }| as a special case and +% translate internally to the necessary fontdimen equivalent. +% Furthermore, if \arg{8} consists entirely of \cn{newline}, then we +% will perform a line break after the theorem head instead of adding +% horizontal space. At the moment [1995/01/23] this is not perfectly +% well implemented because of complications with the way \latex/'s +% \cn{item} adds a heading to the vertical list; for best results +% there should not be anything (not even a blank line) after the +% |\begin{xxx}| command. +% \begin{macrocode} + \def\@tempa{#8}\ifx\space\@tempa +% \end{macrocode} +% Notice that we disregard stretch and shrink for labelsep = +% interwordspace. +% \begin{macrocode} + \toks@\@xp{\the\toks@ \thm@headsep\fontdimen\tw@\font\relax}% + \else + \def\@tempb{\newline}% + \ifx\@tempb\@tempa + \toks@\@xp{\the\toks@ \thm@headsep\z@skip + \def\thmheadnl{\newline}}% + \else + \toks@\@xp{\the\toks@ \thm@headsep#8\relax}% + \fi + \fi + \begingroup + \thm@space@setup + \@defaultunits\@tempskipa#2\thm@preskip\relax\@nnil + \@defaultunits\@tempskipb#3\thm@postskip\relax\@nnil + \xdef\@gtempa{\thm@preskip\the\@tempskipa + \thm@postskip\the\@tempskipb\relax}% + \endgroup + \@temptokena\@xp{\@gtempa + \thm@headfont{#6}\thm@headpunct{#7}% + }% + \@ifempty{#9}{% + \let\thmhead\thmhead@plain + }{% + \@namedef{thmhead@#1}##1##2##3{#9}% + \@temptokena\@xp{\the\@temptokena + \@xp\let\@xp\thmhead\csname thmhead@#1\endcsname}% + }% + \@xp\xdef\csname th@#1\endcsname{\the\toks@ \the\@temptokena}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\qed} +% Define \cn{qed} for end of proof. This command might +% occur in math mode, in a displayed equation, but it should never +% occur in inner math mode in ordinary paragraph text. +% \begin{macrocode} +\DeclareRobustCommand{\qed}{% + \ifmmode \mathqed + \else + \leavevmode\unskip\penalty9999 \hbox{}\nobreak\hfill +% \end{macrocode} +% The hbox is to prevent a line break within the \cn{qedsymbol} if it +% is defined to be something composite--- e.g., things like +% \verb"(Corollary 1.2) \openbox" as are occasionally done. +% \begin{macrocode} + \quad\hbox{\qedsymbol}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% Setup for QED stack. We use a dedicated iterator macro \cs{qed@elt} +% instead of the generic \cs{@elt} because the \latex/ output routine +% is not safe against changes in \cs{@elt}. Therefore it is not safe +% to use \cs{@elt} for any processing that might trigger the output +% routine. Although this does not seem very likely when adding a QED +% symbol to a horizontal list, we did in fact get a bug report for +% this kind of failure. +% \begin{macrocode} +\let\QED@stack\@empty +\let\qed@elt\relax +% \end{macrocode} +% +% Puts a QED symbol on the stack: +% \begin{macrocode} +\newcommand{\pushQED}[1]{% + \toks@{\qed@elt{#1}}\@temptokena\expandafter{\QED@stack}% + \xdef\QED@stack{\the\toks@\the\@temptokena}% +} +% \end{macrocode} +% +% Pops the QED stack and prints the result. +% \begin{macrocode} +\newcommand{\popQED}{% + \begingroup\let\qed@elt\popQED@elt \QED@stack\relax\relax\endgroup +} +% \end{macrocode} +% +% \begin{macrocode} +\def\popQED@elt#1#2\relax{#1\gdef\QED@stack{#2}} +% \end{macrocode} +% +% Prints the current QED symbol and replaces the top entry on the +% stack with a null entry. +% \begin{macrocode} +\newcommand{\qedhere}{% + \begingroup \let\mathqed\math@qedhere + \let\qed@elt\setQED@elt \QED@stack\relax\relax \endgroup +} +% \end{macrocode} +% +% In case the \pkg{amsmath} or \pkg{amstext} packages are loaded, we +% need the following two tests. (Redundantly declaring them is +% harmless.) +% \begin{macrocode} +\newif\ifmeasuring@ +\newif\iffirstchoice@ \firstchoice@true +% \end{macrocode} +% +% \begin{macrocode} +\def\setQED@elt#1#2\relax{% + \ifmeasuring@ + \else \iffirstchoice@ \gdef\QED@stack{\qed@elt{}#2}\fi + \fi + #1% +} +% \end{macrocode} +% +% \begin{macro}{\mathqed} +% When a QED occurs inside a math formula, well, it is presumably a +% displayed equation. In order to find out where to place the QED +% symbol, we need to check what kind of equation structure we are in. +% +% \begin{macrocode} +\def\qed@warning{% + \PackageWarning{amsthm}{The \@nx\qedhere command may not work + correctly here}% +} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\mathqed}{\quad\hbox{\qedsymbol}} +% \end{macrocode} +% +% The \cs{linebox@qed} function comes into play with the \opt{fleqn} +% option. +% \begin{macrocode} +\def\linebox@qed{\hfil\hbox{\qedsymbol}\hfilneg} +% \end{macrocode} +% \end{macro} +% +% Two large sections of code follow. One for \fn{amsmath} 2.0 and one +% for plain \latex/. +% \begin{macrocode} +\@ifpackageloaded{amsmath}{% +% \end{macrocode} +% +% \begin{macrocode} + \def\math@qedhere{% + \@ifundefined{\@currenvir @qed}{% + \qed@warning\quad\hbox{\qedsymbol}% + }{% + \@xp\aftergroup\csname\@currenvir @qed\endcsname + }% + } +% \end{macrocode} +% +% \begin{macrocode} + \def\displaymath@qed{% + \relax + \ifmmode + \ifinner \aftergroup\linebox@qed + \else + \eqno + \let\eqno\relax \let\leqno\relax \let\veqno\relax + \hbox{\qedsymbol}% + \fi + \else + \aftergroup\linebox@qed + \fi + } +% \end{macrocode} +% +% \begin{macrocode} + \@xp\let\csname equation*@qed\endcsname\displaymath@qed +% \end{macrocode} +% +% If the equation has both an equation number and a qed, we've got +% trouble, but we can provide half-way decent for the simple cases. +% \begin{macrocode} + \def\equation@qed{% + \iftagsleft@ + \hbox{\phantom{\quad\qedsymbol}}% + \gdef\alt@tag{% + \rlap{\hbox to\displaywidth{\hfil\qedsymbol}}% + \global\let\alt@tag\@empty + }% + \else + \gdef\alt@tag{% + \global\let\alt@tag\@empty + \vtop{\ialign{\hfil####\cr + \tagform@\theequation\cr + \qedsymbol\cr}}% + \setbox\z@ + }% + \fi + } +% \end{macrocode} +% +% \begin{macrocode} + \def\qed@tag{% + \global\tag@true \nonumber + &\omit\setboxz@h {\strut@ \qedsymbol}\tagsleft@false + \place@tag@gather + \kern-\tabskip + \ifst@rred \else \global\@eqnswtrue \fi \global\advance\row@\@ne \cr + } +% \end{macrocode} +% +% \begin{macrocode} + \def\split@qed{% + \def\endsplit{\crcr\egroup \egroup \ctagsplit@false \rendsplit@ + \aftergroup\align@qed + }% + } +% \end{macrocode} +% +% \begin{macrocode} + \def\align@qed{% + \ifmeasuring@ \tag*{\qedsymbol}% + \else \let\math@cr@@@\qed@tag + \fi + } + \@xp\let\csname align*@qed\endcsname\align@qed + \@xp\let\csname gather*@qed\endcsname\align@qed +% \end{macrocode} +% +% \begin{macrocode} +%% Needs some patching up for amsmath 1.2 +% \end{macrocode} +% +% \begin{macrocode} +}{% end of amsmath branch, start plain LaTeX branch +% \end{macrocode} +% +% The \cn{qedhere} handling for generic \latex/ classes (\cls{article}, +% \cls{book}) with the \pkg{amsthm} package (without \pkg{amsmath}) is +% fairly sketchy. When a qed symbol and an equation number are both +% applied to a single display, the results may not be entirely +% satisfactory, particularly when the \opt{fleqn} and/or \opt{leqno} +% options are used. [mjd,2000/01/17] +% +% As for \cs{math@qedhere}, it is expected to occur only via +% \cn{qedhere}, where the \cs{aftergroup} makes sense. +% \begin{macrocode} + \def\math@qedhere{% + \@ifundefined{\@currenvir @qed}{% + \qed@warning \aftergroup\displaymath@qed + }{% + \@xp\aftergroup\csname\@currenvir @qed\endcsname + }% + } +% \end{macrocode} +% +% The \cs{ifmmode} \cs{ifinner} case is expected to happen with the +% \opt{fleqn} option, where we have something like: +%\begin{verbatim} +%\hbox to\linewidth{\hbox{$...$}\hfil} +%\end{verbatim} +% In order to counteract the \cs{hfil} we must jump out two grouping +% levels. +% \begin{macrocode} + \def\displaymath@qed{% + \relax + \ifmmode + \ifinner \aftergroup\aftergroup\aftergroup\linebox@qed + \else + \eqno \def\@badmath{$$}% + \let\eqno\relax \let\leqno\relax \let\veqno\relax + \hbox{\qedsymbol}% + \fi + \else + \aftergroup\linebox@qed + \fi + } +% \end{macrocode} +% +% This definition is a fallback definition that places the qed and +% then the equation number, on the right-hand side. For \opt{leqno}, +% not so good; but then +% \begin{macrocode} + \@ifundefined{ver@leqno.clo}{% + \def\equation@qed{\displaymath@qed \quad}% + }{% + \def\equation@qed{\displaymath@qed}% + } +% \end{macrocode} +% +% If \pkg{amsmath} is not loaded, then we need to do some surgery +% on the \cn{[} macro. Normally it looks like this: +%\begin{verbatim} +% \[=macro: +% ->\relax \ifmmode \@badmath \else +% \ifvmode \nointerlineskip \makebox [.6\linewidth ]\fi $$\fi +%\end{verbatim} +% +% If arg 2 is \cs{m@th} when we make this test it indicates that the +% fleqn option is in effect. Perhaps try to do something there. +% \begin{macrocode} + \def\@tempa#1$#2#3\@nil{% + \def\[{#1$#2\def\@currenvir{displaymath}#3}% + }% + \expandafter\@tempa\[\@nil +} +% \end{macrocode} +% +% If an older version of \pkg{amsmath} is in use, we need to fall +% back to a simpler definition of \cs{math@qedhere}. +% \begin{macrocode} +\@ifpackageloaded{amstex}{% + \def\@tempa{TT}% +}{% + \@ifpackageloaded{amsmath}{% + \def\@tempb#1 v#2.#3\@nil{#2}% + \ifnum\@xp\@xp\@xp\@tempb\csname ver@amsmath.sty\endcsname v0.0\@nil + <\tw@ + \def\@tempa{TT}% + \else + \def\@tempa{TF}% + \fi + }{% + \def\@tempa{TF} + }% +} +\if\@tempa + \renewcommand{\math@qedhere}{\quad\hbox{\qedsymbol}}% +\fi +% \end{macrocode} +% +% The reason that we do not simply use the \cn{square} symbol from +% \fn{msam} for the open-box qed symbol is that we want to avoid +% requiring users to have the AMSFonts font package. And the \fn{lasy} +% \cn{Box} is too large. +% \begin{macrocode} +\newcommand{\openbox}{\leavevmode +% \end{macrocode} +% I think I got these numbers from measuring \fn{msam}'s \cn{square} +% but I forgot to make notes at the time. [mjd,1995/01/25] +% \begin{macrocode} + \hbox to.77778em{% + \hfil\vrule + \vbox to.675em{\hrule width.6em\vfil\hrule}% + \vrule\hfil}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareRobustCommand{\textsquare}{% + \begingroup \usefont{U}{msa}{m}{n}\thr@@\endgroup +} +% \end{macrocode} +% +% \begin{macrocode} +%<*classes> +\@ifclasswith{\@classname}{noamsfonts}{% + \providecommand{\qedsymbol}{\openbox}% +}{} +\providecommand{\qedsymbol}{\textsquare} +% +%\providecommand{\qedsymbol}{\openbox} +% \end{macrocode} +% +% The proof environment is never numbered, and has a \cn{qed} at the +% end, which makes it inconvenient to use \cn{newtheorem} for +% defining it. Also authors frequently need to substitute an +% alternative heading text (e.g.\ `Proof of Lemma 4.3') +% instead of the default `Proof'. For all these reasons we define the +% proof environment here instead of leaving it for authors to define. +% Text after the end of a proof, like that after the end of a theorem, +% begins a new paragraph. This differs from basic \latex/ behavior. +% [bnb, 1999/09/27] +% \begin{macrocode} +\newenvironment{proof}[1][\proofname]{\par + \pushQED{\qed}% + \normalfont \topsep6\p@\@plus6\p@\relax + \trivlist +% \itemindent\normalparindent + \item[\hskip\labelsep +% \scshape +% \itshape + #1\@addpunct{.}]\ignorespaces +}{% + \popQED\endtrivlist\@endpefalse +} +% \end{macrocode} +% Default for \cn{proofname}: +% \begin{macrocode} +\providecommand{\proofname}{Proof} +% \end{macrocode} +% +% For reference: +%\begin{verbatim} +% From: tycchow@math.mit.edu (Timothy Y. Chow) +% Subject: Suppressing theorem numbering in LaTeX +% Message-ID: <1994Aug11.234754.22523@galois.mit.edu> +% Date: Thu, 11 Aug 94 23:47:54 GMT +% To: tex-news@SHSU.EDU +% +% A friend of mine wants numbering of theorems, conjectures, and so on +% suppressed if there is only one of them in his article. In other words +% he wants "Conjecture 1" to appear as simply "Conjecture" if there is no +% Conjecture 2. What is the best way to go about doing this? +% ... +%\end{verbatim} +% Maybe something clever can be done to make the desired behavior +% happen automatically. Note that this would seem to be a general +% numbering problem rather than a theorem-specific one, because +% similar behavior would be desirable for appendixes: according to +% standard publishing practice, if there's only one it is titled just +% `Appendix', and if there are more than one they are titled +% `Appendix A', `Appendix B', and so on. +% +% \begin{macrocode} +% +%<*classes> +% \end{macrocode} +% +% \subsection{Utility commands used with AMS author packages} +% +% \begin{macro}{\bb@skip} +% Skip to result in base-to-base distance from previous to next box. +% \begin{macrocode} +\def\bb@skip#1{% + \skip@#1\relax \advance\skip@-\prevdepth \advance\skip@-\baselineskip + \vskip\skip@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\markleft} +% Basic \latex/ has \cn{markright} and \cn{markboth}, but sometimes +% it's necessary to change just the left running head. This macro +% completes the set. From the \pkg{altxext.sty} module of Klaus +% Lagally's \pkg{arabtex}. [bnb, 2004/03/25] +% \begin{macrocode} +\def\markleft#1{{\let\protect\noexpand + \let\label\relax \let\index\relax \let\glossary\relax + \expandafter\@markleft\@themark{#1}% + \mark{\@themark}}% + \if@nobreak\ifvmode\nobreak\fi\fi} +\def\@markleft#1#2#3{\gdef\@themark{{#3}{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DH} +% \begin{macro}{\dh} +% \begin{macro}{\DJ} +% \begin{macro}{\dj} +% The Icelandic thorn and eth and the Croatian barred D are part of +% the T1 font encoding, but aren't available in OT1. However, they +% are needed (rarely) in the author names or bibliographies. Provide +% emulations, using the thorn in \fn{msbm} or D's barred with a macron. +% The lowercase eth requires an \cs{edef} to access \fn{msbm} properly. +% Define it separately to permit checking for small caps. [bnb, 2004/04/05] +% \begin{macrocode} +\def\@tempa{} +\edef\@dh{% + \noexpand\mathhexbox{\hexnumber@\symAMSb}67} +\DeclareTextCommand{\dh}{OT1}{% + \edef\@tempb{\scdefault}% + \ifx\f@shape\@tempb + \leavevmode + \raisebox{-.8ex}{\makebox[\z@][l]{\hskip-.08em\accent"16\hss}}d% + \else + \@dh + \fi +} +\DeclareTextCommand{\DH}{OT1}{% + \leavevmode\raisebox{-.5ex}{\makebox[\z@][l]{\hskip-.07em\accent"16\hss}}D} +\DeclareTextCommand{\DJ}{OT1}{% + \leavevmode\raisebox{-.5ex}{\makebox[\z@][l]{\hskip-.07em\accent"16\hss}}D} +\DeclareTextCommand{\dj}{OT1}{% + \edef\@tempa{\f@shape}\edef\@tempb{\scdefault}% + \ifx\@tempa\@tempb + \leavevmode + \raisebox{-.75ex}{\makebox[\z@][l]{\hskip-.08em\accent"16\hss}}d% + \else + \leavevmode\raisebox{.02ex}{\makebox[\z@][l]{\hskip.1em\accent"16\hss}}d% + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{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. +% +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \subsection{Initialization} +% We define a function to do the normal calculations that we want for +% \cn{textheight} and \cn{textwidth} +% +% \begin{macro}{\calclayout} +% Subtract the height of the running heads: +% \begin{macrocode} +\def\calclayout{\advance\textheight -\headheight + \advance\textheight -\headsep +% \end{macrocode} +% We set \cn{oddsidemargin} and \cn{evensidemargin} to +% center the text on the page. +% \begin{macrocode} + \oddsidemargin\paperwidth + \advance\oddsidemargin -\textwidth + \divide\oddsidemargin\tw@ +% \end{macrocode} +% 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. +% \begin{macrocode} + \ifdim\oddsidemargin<.5truein \oddsidemargin.5truein \fi + \advance\oddsidemargin -1truein + \evensidemargin\oddsidemargin +% \end{macrocode} +% And we set \cn{topmargin} to get vertical centering as well. +% \begin{macrocode} + \topmargin\paperheight \advance\topmargin -\textheight + \advance\topmargin -\headheight \advance\topmargin -\headsep +% \end{macrocode} +% Height of running foot ignored: not present. +% \begin{macrocode} + \divide\topmargin\tw@ +% \end{macrocode} +% We provide a minimum of .5in (after compensating for the default +% margin---see next step). +% \begin{macrocode} + \ifdim\topmargin<.5truein \topmargin.5truein \fi +% \end{macrocode} +% Now subtract the default margin provided by standard DVI +% drivers. +% \begin{macrocode} + \advance\topmargin -1truein\relax +} +% \end{macrocode} +% \end{macro} +% +% Initialize the dimensions, page numbering, etc. For inhouse use, +% administrative stuff is isolated in separate files. +% \begin{macrocode} +%\InputIfFileExists{amsart.cfg}{}{% +%\InputIfFileExists{amsproc.cfg}{}{% +%\InputIfFileExists{amsbook.cfg}{}{% + \calclayout % initialize + \pagenumbering{arabic}% + \pagestyle{headings}% + \thispagestyle{plain}% +} +% \end{macrocode} +% +% If we are in compatibility mode, add some backward compatibility +% stuff below. Otherwise quit here. +% \begin{macrocode} +\if@compatibility \else\endinput\fi +% \end{macrocode} +% +% Compensate for changed meaning of \cn{tiny}: +% \begin{macrocode} +\def\tiny{\Tiny} +% \end{macrocode} +% +% The macro \cn{defaultfont} was provided in version 1.1 of amsart; +% retained for compatibility as a synonym of \cn{normalfont}. Resets +% everything except for size. +% \begin{macrocode} +\def\defaultfont{\normalfont} +% \end{macrocode} +% +% 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. +% \begin{macrocode} +\def\rom{\textup} +% \end{macrocode} +% +% For backward compatibility with version 1.1 of \cls{amsart}, we +% define \env{pf}, \env{pf*} environments. And undefine \cn{proof} +% just in case an existing document contains a \cn{newenvironment} or +% \cn{newcommand} for it, as that would now cause an error. +% \begin{macrocode} +\let\@newpf\proof \let\proof\relax \let\endproof\relax +\newenvironment{pf}{\@newpf[\proofname]}{\popQED\endtrivlist} +\newenvironment{pf*}[1]{\@newpf[#1]}{\popQED\endtrivlist} +% \end{macrocode} +% +% The usual \cn{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% +% \end{macrocode} +% +% \changes{v1.2a}{1995/02/01}{Added global init for @secnumber} +% \changes{v1.2a}{1995/02/01}{Made psamsfonts option pass cmex10 to +% amsmath} +% \changes{v1.2a}{1995/02/01}{Added missing endpar after authors in +% amsbook @maketitle} +% +% \changes{v1.2b}{1995/02/20}{Improve handling of abstract} +% \changes{v1.2b}{1995/02/20}{Allow titlepage option for articles} +% \changes{v1.2b}{1995/02/20}{Suppress logo and copyright info for +% generic AMS classes} +% \changes{v1.2b}{1995/02/20}{Use `Date' instead of `Received by...' in +% the generic AMS classes} +% +% \changes{v2.13}{2002/12/06}{Added a warning for thanks inside author} +% +% \CheckSum{5682} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsdtx.dtx b/Master/texmf-dist/source/latex/amslatex/amsdtx.dtx new file mode 100644 index 00000000000..cd9bb13b2c2 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsdtx.dtx @@ -0,0 +1,1192 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsdtx.dtx", +%%% version = "2.06", +%%% date = "2004/08/06", +%%% time = "12:18:49 EDT", +%%% checksum = "19929 1192 3506 39423", +%%% author = "Michael J. Downes, updated by David M. Jones", +%%% copyright = "Copyright 1996, 1999, 2004 +%%% American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Publications Technical Group, +%%% 201 Charles Street, +%%% Providence, RI 02904, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, amslatex, ams-latex, user documentation", +%%% supported = "yes", +%%% abstract = "This is the source for two document classes, amsdtx +%%% and amsldoc, used to produce AMS user documentation +%%% or technical documentation.", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +% +% \iffalse +% The following section of code makes this file self-printable. +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\documentclass{amsdtx} +\newcommand{\rp}{\let\PBS\\\raggedright\let\\\PBS} + +\makeindex + +\CodelineIndex + +\begin{document} +\title{The \cls{amsldoc} and \cls{amsdtx} document classes} +\author{American Mathematical Society\\Michael Downes\\ + updated by David M. Jones} +\date{Version \fileversion, \filedate} +\hDocInput{amsdtx.dtx} +\PrintIndex +\end{document} +% +% \fi +% +%^^A If this file is printed by itself the \fileversion and \filedate +%^^A information will come from the file header rather than from the +%^^A \ProvidesClass command. See \hDocInput. +% \maketitle +% +% \tableofcontents +% +% \MakeShortVerb\| +% \section{Introduction} +% This file is the source for two documentclasses, \cls{amsldoc} +% (used for the \amslatex/ user's guide) and \cls{amsdtx} (used for +% printing AMS \fn{.dtx} files). The generic \cls{book} class is used +% as a base, but the \cls{amsdtx} class is modified to serve as an +% article-type class. This affects the form of documentation files +% mainly in the use of \cn{maketitle} and \cn{chapter}. +% +% \begin{table} +% \caption{Features of the \cls{amsldoc} and \cls{amsdtx} classes} +% \newcommand{\rpth}{\rp{.75}} +% \centering +% \begin{tabular}{lp{.65\columnwidth}} +% Command Name& Purpose\\ +% \hline +% \cn{cn}& \rp To print a user command name: \verb"\cn{title}"; leading +% backslash can be optionally included for control symbols: +% \verb"\cn{\%}". The \cn{cn} command works properly even in macro +% arguments (compare to, e.g., \cn{verb}\verb"'\newif'"). But beware +% of a fragile control symbol (are there any?) in a moving argument.\\ +% \cn{cs}& \rp `Control sequence': to print an internal command name, +% not intended for the end user\\ +% \cn{env}& \rp To print an environment name: \verb"\env{table}"\\ +% \cn{pkg}& \rp To print a package name: \verb"\pkg{eufrak}"\\ +% \cn{cls}& \rp To print a class name: \verb"\cls{book}"\\ +% \cn{opt}& \rp To print the name of a class or package option: +% \verb"\opt{twocolumn}"\\ +% \cn{bst}& \rp To print the name of a \bibtex/ style +% \verb"\bst{amsalpha}"\\ +% \cn{fn}& \rp To print a file name or font name: \verb"\fn{T1enc.def}", +% \verb"\fn{cmsy10}"\\ +% \cn{fnt}& \rp To print a font name: \verb"\fn{cmsy10}" \\ +% \cn{cnt}& \rp To print a counter name: \verb"\fn{topnumber}" \\ +% \cn{qc}& \rp To quote a single character: \verb"\qc{\%}"; +% this works properly for special characters, even in macro +% arguments, unlike e.g., \verb"\verb'%'"\\ +% \cn{latex/} etc.& \rp Convenient forms of \cn{LaTeX}, \cn{TeX}, +% \cn{BibTeX}, etc. that are easier to type and have a trailing slash +% to eliminate the following-space problem (without needing different +% markup in different contexts) +% \end{tabular} +% \end{table} +% +% \StopEventually{} +% +% Standard starting pieces. (Note: the reason each \cn{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.) +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1995/06/01]% LaTeX date must be June 1995 or later +%<*amsldoc> +\ProvidesClass{amsldoc}[2004/08/06 v2.06] +% +%<*amsdtx> +\ProvidesClass{amsdtx}[2004/08/06 v2.06] +% +% \end{macrocode} +% +% \section{Implementation} +% Start with the generic book class as a base. +% \begin{macrocode} +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}} +\ProcessOptions +\LoadClass{book} +% \end{macrocode} +% +% \begin{macrocode} +\IfFileExists{url.sty}{% + \RequirePackage{url}\relax + \@gobble +}{% + \@firstofone +} +{ + \DeclareRobustCommand{\url}[1]{% + \def\@tempa{#1}% + \texttt{\urlsetup $\expandafter\strip@prefix\meaning\@tempa$}% + }% + \def\urlsetup{% + \check@mathfonts \textfont\@ne\the\font \textfont\z@\the\font + \urlfix +\urlfix\=\urlfix\:\urlfix\-\urlfix\.\urlfix\,\urlfix\;% + \urlbreak\&\urlbreak\/\urlbreak\?% + }% + \def\urlbreak#1{% + \mathcode`#1="8000 + \begingroup \lccode`\~=`#1 \lowercase{\endgroup \edef~}% + {\mathchar\number`#1\penalty\hyphenpenalty}% + }% + \def\urlfix#1{% + \mathcode`#1=`#1\relax + }% +} +% \end{macrocode} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macrocode} +\providecommand{\qq}[1]{\textquotedblleft#1\/\textquotedblright} +\providecommand{\mdash}{\textemdash\penalty\exhyphenpenalty} +\providecommand{\ndash}{\textendash\penalty\exhyphenpenalty} +% \end{macrocode} +% +% \begin{macrocode} +\let\@xp\expandafter +% \end{macrocode} +% \section{Indexing primitives} +% +% Unlike \pkg{amsdtx}, \pkg{amsldoc} doesn't load the \pkg{doc} +% package, so we need to provide the following logical names. The +% values are consistent with \fn{makeindex}'s default conventions. +% \begin{macrocode} +%<*amsldoc> +\def\actualchar{@} +\def\quotechar{"} +\def\levelchar{!} +\def\encapchar{|} +\def\verbatimchar{+} +% \end{macrocode} +% We also need the \cs{ifcodeline@index} switch. +% \begin{macrocode} +\newif\ifcodeline@index +% +% \end{macrocode} +% +% \begin{macro}{\autoindex} +% When generating a codeline index, this encapsulates the page +% number in italics. +% \begin{macrocode} +\newcommand*{\autoindex}[1]{% + \index{#1\ifcodeline@index\encapchar usage\fi}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ntt} +% To avoid font substitution warnings we make the tt font always +% print in the normal weight and shape. +% \begin{macrocode} +\newcommand{\ntt}{\normalfont\ttfamily} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\indexcs} +% Index a control sequence without printing it. Note +% non-long. The \cs{@nobslash} strips off an optional leading +% backslash before passing the control sequence name to +% \cs{@indexcs}. This means that |\indexcs{\cs}| and +% |\indexcs{cs}| produce the same index entry. +% \begin{macrocode} +\newcommand*{\indexcs}[1]{% + \@xp\@xp\@xp\@indexcs\@xp\@nobslash\string#1\@nil +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@indexcs} +% Given |cs| as an argument, this writes something like +% |cs@\verb"*+\cs+| to the \fn{.idx} file (or |cs=\verb!*+\cs+| if +% using \fn{doc.sty}). +% \begin{macrocode} +\def\@indexcs#1\@nil{% + \autoindex{#1\actualchar + \string\verb\quotechar*\verbatimchar + \@xp\@bothoftwo\string\ #1\@empty + \verbatimchar + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@bothoftwo} +% This has the effect of removing spaces before each of the +% arguments. In particular, it removes the space generated by +% \verb*+\string\ + above. +% \begin{macrocode} +\def\@bothoftwo#1#2{#1#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\category@index} +% \begin{macrocode} +\def\category@index#1#2{% + {\ntt#2}% + \@category@index{#1}{#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@category@index} +% \begin{macrocode} +\def\@category@index#1#2{% + \autoindex{% + #2\actualchar\string\texttt{#2}% + \ifx\@nil#1\@nil\else\space#1\fi + }% +} +% \end{macrocode} +% \end{macro} +% +% Some functions to support \cn{cn} etc. For most of these commands +% we don't really want them to be \cs{long}! But in some early +% releases of \LaTeXe\ the \verb'*' form of \cn{newcommand} was not +% yet available. +% +% We use the name \cn{bslchar} instead of \cn{bslash} to avoid +% potential conflict with the \pkg{doc} package \cn{bslash} command. +% Unlike \cn{bslash}, \cn{bslchar} survives unlimited +% writing/expansion because it is a chardef. +% \begin{macrocode} +\chardef\bslchar=`\\ % p. 424, TeXbook +\newcommand{\addbslash}{\expandafter\@addbslash\string} +\def\@addbslash#1{\bslchar\@nobslash#1} +\newcommand{\nobslash}{\expandafter\@nobslash\string} +\def\@nobslash#1{\ifnum`#1=\bslchar\else#1\fi} +% \end{macrocode} +% +% \begin{macro}{\@boxorbreak} +% Start up for a \cn{cs} or \cn{cn} command, adds an \cs{hbox} if in +% math, or an allowbreak penalty if the preceding item is not a space. +% (In case two such commands are used side-by-side.) +% \begin{macrocode} +\def\@boxorbreak{% + \leavevmode + \ifmmode\hbox\else\ifdim\lastskip=\z@\penalty9999 \fi\fi +} +% \end{macrocode} +% \end{macro} +% +% Control sequence. The function \cn{addbslash} makes this command +% also usable for some special control sequences like \cn{\%} \cn{\}} +% \cn{\{}: instead of writing |\cs{%}| which doesn't work, you can +% write |\cs{\%}|. +% \begin{macrocode} +\DeclareRobustCommand{\cs}[1]{% + \@boxorbreak{% + \ntt + \addbslash#1\@empty + \@xp\@xp\@xp\@indexcs\@xp\@nobslash\string#1\@nil + }% +} +% \end{macrocode} +% +% Allow distinguishing non-private `command names' that will be +% visible to the user from internal (mostly private) `control +% sequences'. +% \begin{macrocode} +\let\cn\cs +% \end{macrocode} +% +% The following items should not normally appear in math mode so they +% don't need to call \cs{@boxorbreak}. +% +% \latex/ documentclass name. +% \begin{macrocode} +\DeclareRobustCommand{\cls}{\category@index{class}} +% \end{macrocode} +% +% \latex/ package name. +% \begin{macrocode} +\DeclareRobustCommand{\pkg}{\category@index{package}} +% \end{macrocode} +% +% \latex/ option name. +% \begin{macrocode} +\DeclareRobustCommand{\opt}{\category@index{option}} +% \end{macrocode} +% +% Environment name. +% \begin{macrocode} +%\DeclareRobustCommand{\env}[1]{{\ntt#1}\SpecialEnvIndex{#1}} +%\DeclareRobustCommand{\env}{\category@index{environment}} +% \end{macrocode} +% +% File name. +% \begin{macrocode} +\DeclareRobustCommand{\fn}{\category@index{}} +% \end{macrocode} +% +% \bibtex/ style. +% \begin{macrocode} +\DeclareRobustCommand{\bst}{\category@index{\string\BibTeX{} style}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareRobustCommand{\cnt}{\category@index{counter}} +\DeclareRobustCommand{\fnt}{\category@index{font}} +% \end{macrocode} +% +% With long command names or file names we sometimes prefer to allow +% hyphenation in the tt font (in combination with suitable +% \cn{hyphenation} statements for individual documents). To make this +% work we must turn off the feature of \latex/ that disables the +% hyphenchar of the tt fonts. +% +% The method shown here depends on the assumption that OT1 encoding +% will be used for the tt fonts. An encoding-independent method would +% be more awkward: You'd have to explicitly load the relevant +% fonts, let's say by using \cn{AtBeginDocument}, and undo the +% hyphenchar change individually for each font. +% +% Instead we force loading, or possibly reloading (depending on the +% preload options used locally for creating the \latex/ format file), +% of the \fn{OT1/cmtt} fd file, and then clear the macro +% \cs{OT1+cmtt} which contains code to execute whenever a font of +% this family is first loaded. The default value is to turn off the +% hyphenchar, and that's what we don't want. +% +% This method is not especially palatable but other methods that +% don't involve loading the fd file are significantly less reliable. +% \begin{macrocode} +\def\allowtthyphens{\begingroup + \fontencoding{OT1}\fontfamily{cmtt}% +% \end{macrocode} +% Undefine the csname that \cs{try@load@fontshape} tests to determine +% whether the fd file needs loading. Then call +% \cs{try@load@fontshape}. Then we can remove the `turn off +% hyphenation' code, which as it happens resides in the same csname +% that was tested. +% \begin{macrocode} + \expandafter\let\csname OT1+cmtt\endcsname\relax + \try@load@fontshape + \endgroup + \expandafter\let\csname OT1+cmtt\endcsname\@empty +} +% \end{macrocode} +% +% We allow some slop at the right margin because we have some +% long control sequence names and verbatim text to deal with. Also +% ignore underfull hboxes and vboxes unless they are really bad. +% \begin{macrocode} +\hfuzz2pc +\vbadness9999 \hbadness5000 +% \end{macrocode} +% +% \begin{macrocode} +\def\AmS{{\protect\usefont{OMS}{cmsy}{m}{n}% + A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}} +% \end{macrocode} +% +% \begin{macrocode} +\def\latex/{{\protect\LaTeX}} +\def\amslatex/{{\protect\AmS-\protect\LaTeX}} +\def\tex/{{\protect\TeX}} +\def\amstex/{{\protect\AmS-\protect\TeX}} +\def\bibtex/{{Bib\protect\TeX}} +% \end{macrocode} +% +% \cn{makeindex} command is already used for other purposes. +% \begin{macrocode} +\def\makeindx/{MakeIndex} +% \end{macrocode} +% +% Don't allow a break after the hyphen: +% \begin{macrocode} +\def\xypic/{XY\mbox{-}pic} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\Textures}{\textit{Textures}} +% \end{macrocode} +% +% `Meta' macro. +% \begin{macrocode} +\def\<#1>{\textit{$\langle$#1\/$\rangle$}} +% \end{macrocode} +% +% Reduce itemsep in lists. +% \begin{macrocode} +\def\@listi{% + \leftmargin\leftmargini + \topsep 3\p@ \@plus2\p@ \@minus\p@ + \parsep \p@ \@plus\p@ \itemsep\parsep +} +\let\@listI\@listi +\@listi +\def\@listii{% + \leftmargin\leftmarginii + \labelwidth\leftmarginii \advance\labelwidth-\labelsep + \topsep\p@\@plus\p@ \@minus\p@ + \parsep\z@skip \itemsep\z@skip +} +\def\@listiii{% + \leftmargin\leftmarginiii + \labelwidth\leftmarginiii \advance\labelwidth-\labelsep + \topsep\z@skip \parsep\z@skip \itemsep\z@skip +} +% \end{macrocode} +% +% An environment to encapsulate remarks relevant to old versions but +% not essential for the current version. +% \begin{macrocode} +\newenvironment{histnote}{% + \trivlist\item[\hspace{\labelsep}\bfseries Historical Note:]% +}{% + \endtrivlist +} +% \end{macrocode} +% +% Turn off \cs{autoindex} during \cn{tableofcontents} or similar. +% \begin{macrocode} +\def\@starttoc#1{\begingroup + \let\autoindex\@gobble + \makeatletter + \@input{\jobname.#1}\if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout + \csname tf@#1\endcsname \jobname.#1\relax + \fi \global\@nobreakfalse \endgroup} +% \end{macrocode} +% +% Make glossary commands a no-op for the moment. [mjd,1994/10/03] +% Provide a \cn{secref} command for section references. +% \begin{macrocode} +%<*amsldoc> +\newcommand{\gloss}[1]{} +% +\newcommand*{\secref}[1]{\S\ref{#1}} +% \end{macrocode} +% +% We can write |\qc{\%}| to quote a single +% character in situations where |\verb"%"| would not work, mainly +% when text is read as a macro argument (e.g., footnotes). +% \begin{macrocode} +\newcommand{\qc}[1]{}% check for prior definition +\edef\qc#1{\noexpand\protect\expandafter\noexpand\csname qc \endcsname + \noexpand\protect#1} +% \end{macrocode} +% For this function the first argument is \cn{protect} and just needs +% to be discarded. The method for removing a leading backslash is to +% turn off \cs{escapechar}; this is more forgiving of variations like +% |\qc{$}|. If the argument is `|\ |' we print a cmtt visible-space +% character, \qc{\ }. +% \begin{macrocode} +\@namedef{qc }#1#2{\begingroup\ntt + \ifx\ #2\char`\ \else\escapechar\m@ne\string#2\fi\endgroup} +% \end{macrocode} +% Declare a few character names to avoid e.g., indexing difficulties. +% \begin{macrocode} +\DeclareRobustCommand{\qcat}{\qc\@}% +\DeclareRobustCommand{\qcamp}{\qc\&}% +\DeclareRobustCommand{\qcbang}{\qc\!}% +% \end{macrocode} +% +% \begin{macro}{\arg} +% Change \cn{arg} to print a macro argument number: +% \begin{macrocode} +\DeclareRobustCommand{\arg}[1]{{\ntt\##1}} +% \end{macrocode} +% \end{macro} +% +% We need to emulate the \pkg{amsthm} \cn{qedsymbol} for the +% \amslatex/ user's guide. +% \begin{macrocode} +%<*amsldoc> +\newcommand{\openbox}{\leavevmode + \hbox to.77778em{% + \hfil\vrule + \vbox to.675em{\hrule width.6em\vfil\hrule}% + \vrule\hfil}} +\newcommand{\qedsymbol}{\openbox} +% +% \end{macrocode} +% +% Logical markup for e-mail address: +% \begin{macrocode} +%\def\mail{\texttt} +% \end{macrocode} +% +% Shorthand for indexing: +% \begin{macrocode} +%<*amsldoc> +\def\*#1{\def\@tempa{#1}\def\@tempb{*}% + \ifx\@tempa\@tempb \expandafter\index + \else #1\index{#1}\fi} +% +% \end{macrocode} +% +% Non-indexed \cn{cn} (maybe call this |\cn*|?) +% \begin{macrocode} +\def\ncn#1{{\let\index\@gobble\cn{#1}}} +% \end{macrocode} +% Indexing difficulties with !, @. +% \begin{macrocode} + +\DeclareRobustCommand{\cnbang}{% + \ncn{\!}\index{"!@{\ntt\bslchar\qcbang}}} +\DeclareRobustCommand{\cnat}{% + \ncn{\!}\index{"@@{\ntt\bslchar\qcat}}} +% \end{macrocode} +% +% Shorthand for a discouraged, but not forbidden, line break: +% \begin{macrocode} +\def\5{\penalty500 } +% \end{macrocode} +% +% Environment for error message examples. Use \cs{meaning} to allow +% reading the error message text as an ordinary brace-delimited arg +% but still be able to print embedded braces; and first change the +% backslash catcode to prevent extra spaces after control words. +% \begin{macrocode} +%<*amsldoc> +\newenvironment{error}{% + \begingroup\catcode`\\=12 \expandafter\endgroup\errora +}{% + \endtrivlist +} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\errora}[1]{% + \trivlist + \item[\hskip\labelsep\errorbullet\enspace + \ntt\frenchspacing\def\@tempa{#1}% + \expandafter\strip@prefix\meaning\@tempa]\leavevmode\par +} +% \end{macrocode} +% \cs{errorbullet} is just an attempt at a simple graphic device that +% doesn't require any special fonts. +% \begin{macrocode} +\newcommand{\errorbullet}{\rule[-.5pt]{2.5pt}{7.5pt}% + \rule[-.5pt]{5pt}{2.5pt}\kern-2.5pt% + \rule[4.5pt]{2.5pt}{2.5pt}} +% +% \end{macrocode} +% A couple of subheading commands: +% \begin{macrocode} +\newcommand{\errexa}{\par\noindent\textit{Example}:\ } +\newcommand{\errexpl}{\par\noindent\textit{Explanation}:\ } +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{\cls{amsldoc} style modifications for sectioning commands} +% The following section deals with book commands (part, chapter, +% frontmatter, \dots). +% \begin{macrocode} +%<*amsldoc> +% \end{macrocode} +% +% Modifications of sectioning commands from \fn{book.cls}, mostly +% reducing font sizes and vertical spacing. +% \begin{macrocode} +\renewcommand\frontmatter{\clearpage + \@mainmatterfalse\pagenumbering{roman}} +\renewcommand\mainmatter{\clearpage + \@mainmattertrue\pagenumbering{arabic}} +\renewcommand\backmatter{\clearpage \@mainmatterfalse} +% \end{macrocode} +% +% \begin{macrocode} +\renewcommand\part{\clearpage + \thispagestyle{plain}% + \if@twocolumn + \onecolumn + \@tempswatrue + \else + \@tempswafalse + \fi + \hbox{}\vfil + \secdef\@part\@spart} +% \end{macrocode} +% +% \begin{macrocode} +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\centering + \interlinepenalty \@M + \reset@font + \ifnum \c@secnumdepth >-2\relax + \Large\bfseries \partname~\thepart + \par + \vskip 20\p@ + \fi + \Large \bfseries #2\par}% + \@endpart} +% \end{macrocode} +% +% \begin{macrocode} +\def\@spart#1{% + {\centering + \interlinepenalty \@M + \reset@font + \Large \bfseries #1\par}% + \@endpart} +\def\@endpart{\vfil\newpage + \if@twoside + \hbox{}% + \thispagestyle{empty}% + \newpage + \fi + \if@tempswa + \twocolumn + \fi} +% +% \end{macrocode} +% +% \begin{macrocode} +\renewcommand\chapter{\par \@afterindentfalse + \secdef\@chapter\@schapter} +\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\space\thechapter.}% + \addcontentsline{toc}{chapter}% + {\protect\numberline{\thechapter}#1}% + \else + \addcontentsline{toc}{chapter}{#1}\fi + \else + \addcontentsline{toc}{chapter}{#1} + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + \@afterheading + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\@makechapterhead#1{% + \vspace{1.5\baselineskip}% + {\parindent \z@ \raggedright \reset@font + \ifnum \c@secnumdepth >\m@ne + \large\bfseries \@chapapp\space\thechapter + \par\nobreak + \vskip.5\baselineskip\relax + \fi + #1\par\nobreak + \vskip\baselineskip + }} +\def\@schapter#1{\if@twocolumn + \@topnewpage[\@makeschapterhead{#1}]% + \else + \@makeschapterhead{#1}% + \@afterheading + \fi} +\def\@makeschapterhead#1{% + \vspace*{1.5\baselineskip}% + {\parindent \z@ \raggedright + \reset@font + \large \bfseries #1\par\nobreak + \vskip\baselineskip + }} +% \end{macrocode} +% +% Add Donald Arseneau's \cs{@removefromreset}; used to decouple the +% footnote counter from \cn{chapter}, since chapters here do not +% automatically start on a new page. [bnb, 1999/09/27] +% \begin{verbatim} +% \@removefromreset{FOO}{BAR} : Removes counter FOO from the list of +% counters \cl@BAR to be reset when counter BAR +% is stepped. The opposite of \@addtoreset. +% \end{verbatim} +% \begin{macrocode} +\def\@removefromreset#1#2{\let\@tempb\@elt + \expandafter\let\expandafter\@tempa\csname c@#1\endcsname + \def\@elt##1{\expandafter\ifx\csname c@##1\endcsname\@tempa\else + \noexpand\@elt{##1}\fi}% + \expandafter\edef\csname cl@#2\endcsname{\csname cl@#2\endcsname}% + \let\@elt\@tempb} +\@removefromreset{footnote}{chapter} +% \end{macrocode} +% +% Change running head font to \cn{footnotesize}, nonslanted. +% \begin{macrocode} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\thepage\hfil{\footnotesize\leftmark{}{}}}% + \def\@oddhead{{\footnotesize\rightmark{}{}}\hfil\thepage}% + \let\@mkboth\markboth + \def\chaptermark##1{% + \markboth {\uppercase{\ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \@chapapp\ \thechapter. \ \fi + \fi + ##1}}{}}% + \def\sectionmark##1{% + \markright {\uppercase{\ifnum \c@secnumdepth >\z@ + \thesection. \ \fi + ##1}}}} +% \end{macrocode} +% +% +% \section{\cls{amsdtx} style modifications for sectioning commands} +% These definitions for \cn{maketitle} are from \fn{article.cls}. +% \begin{macrocode} +%<*amsdtx> +\renewcommand\maketitle{\par + \begingroup + \renewcommand\thefootnote{\fnsymbol{footnote}}% + \def\@makefnmark{\hbox to\z@{$\m@th^{\@thefnmark}$\hss}}% + \long\def\@makefntext##1{\parindent 1em\noindent + \hbox to1.8em{\hss$\m@th^{\@thefnmark}$}##1}% + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi + \thispagestyle{plain}\@thanks + \endgroup + \setcounter{footnote}{0}% + \let\thanks\relax + \let\maketitle\relax\let\@maketitle\relax + \gdef\@thanks{}\gdef\@author{}\gdef\@title{}} +% +\def\@maketitle{% + \newpage + \null + \vskip 2em% + \begin{center}% + {\LARGE \@title \par}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large \@date}% + \end{center}% + \par +% \end{macrocode} +% Put the title into both running heads. +% \begin{macrocode} + \uppercase\expandafter{\expandafter\toks@\expandafter{\@title}}% + \edef\@tempa{\noexpand\markboth{\the\toks@}{\the\toks@}}% + \@tempa + \vskip 1.5em} +% +% \end{macrocode} +% +% Edit the table of contents. +% \begin{macrocode} +%<*amsdtx> +\renewcommand\tableofcontents{% + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi + \subsection*{\contentsname}% + \@starttoc{toc}% + \if@restonecol\twocolumn\fi + } +% +% \end{macrocode} +% +% Edit the sectioning commands. +% \begin{macrocode} +\renewcommand\section{\@startsection {section}{1}{\z@}% + {-.6\baselineskip \@plus -3\p@}% + {.4\baselineskip} +% {\reset@font\Large\bfseries}} +% {\reset@font\normalsize\bfseries}} +\renewcommand\subsection{\@startsection{subsection}{2}{\z@}% + {-.3\baselineskip\@plus -2\p@}% + {.2\baselineskip}% +% {\reset@font\large\bfseries}} +% {\reset@font\normalsize\bfseries}} +\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-.2\baselineskip\@plus -2\p@}% + {.2\baselineskip}% + {\reset@font\normalsize\bfseries}} +% \end{macrocode} +% Change index environment to turn off \cn{autoindex}. +% \begin{macrocode} +\renewenvironment{theindex}{% + \if@twocolumn \@restonecolfalse \else \@restonecoltrue \fi + \columnseprule \z@ \columnsep 35\p@ + \let\autoindex\@gobble +% \twocolumn[\section*{\indexname}]% +% \twocolumn[\@makeschapterhead{\indexname}]% + \addcontentsline{toc}{chapter}{\indexname}% + \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem +}{% + \if@restonecol\onecolumn\else\clearpage\fi +} +% \end{macrocode} +% +% Take out \cn{thechapter} from \cn{thesection}. +% \begin{macrocode} +%\renewcommand{\thesection}{\arabic{section}} +% \end{macrocode} +% +% Change the style of captions slightly. Also incorporate some +% caption improvements from Donald Arseneau (\fn{comp.text.tex}, 11 +% Oct 1994). +% \begin{macrocode} +\long\def\@makecaption#1#2{% + \addvspace\abovecaptionskip + \begingroup + \countdef\@parcycles=8 % local count register + \@parcycles\z@ + \@setpar{\advance\@parcycles\@ne \ifnum\@parcycles>999 + \@@par\@parcycles\z@\fi + \ifhmode \unskip\hskip\parfillskip\penalty-\@M\fi}% + \@hangfrom{\textbf{#1.} }\vadjust{\penalty\m@ne}#2% + \endgroup + \ifhmode\unpenalty\fi\par + \ifnum\lastpenalty=\m@ne % only one line in the caption + \unpenalty \setbox\@tempboxa\lastbox + \nointerlineskip + \hbox to\hsize{\hfill\unhbox\@tempboxa\unskip\hfill}% + \fi + \nobreak\vskip\belowcaptionskip +} +% \end{macrocode} +% For table captions, assume top captions and so put space below the +% caption rather than above: +% \begin{macrocode} +\renewenvironment{table}{% + \belowcaptionskip\abovecaptionskip \abovecaptionskip\z@skip + \@float{table}% +}{% + \end@float +} +\renewenvironment{table*}{% + \belowcaptionskip\abovecaptionskip \abovecaptionskip\z@skip + \@dblfloat{table}% +}{% + \end@dblfloat +} +% \end{macrocode} +% +% \section{Float placement parameters} +% These control the placing of floating objects like tables and +% figures. The values here, which are much more tolerant than the +% \latex/ defaults, are more or less copied from \fn{amsclass.dtx}. +% \begin{macrocode} +\setcounter{topnumber}{4}\setcounter{bottomnumber}{4} +\setcounter{totalnumber}{4}\setcounter{dbltopnumber}{4} +\renewcommand{\topfraction}{.97}\renewcommand{\bottomfraction}{.97} +\renewcommand{\textfraction}{.03}\renewcommand{\floatpagefraction}{.9} +\renewcommand{\dbltopfraction}{.97} +\renewcommand{\dblfloatpagefraction}{.9} +\setlength{\floatsep}{8pt plus6pt} +\setlength{\textfloatsep}{10pt plus8pt} +\setlength{\intextsep}{8pt plus6pt} +\setlength{\dblfloatsep}{8pt plus6pt} +\setlength{\dbltextfloatsep}{10pt plus8pt} +\setlength{\@fptop}{0pt}\setlength{\@fpsep}{8pt}% +\setlength{\@fpbot}{0pt plus 1fil} +\setlength{\@dblfptop}{0pt}\setlength{\@dblfpsep}{8pt}% +\setlength{\@dblfpbot}{0pt plus 1fil} +% \end{macrocode} + +% \begin{macrocode} +\pagestyle{headings} +% \end{macrocode} +% +% Make \verb"|...|" shorthand for verbatim fragments. In the case of +% the \cls{amsldoc} class, we avoid requiring an extra package +% (\pkg{doc} or \pkg{shortvrb}), to reduce the possibility of package +% files not being found at run time. +% \begin{macrocode} +%<*amsldoc> +\AtBeginDocument{\catcode`\|=\active } +\def\activevert{\verb|} +\expandafter\gdef\expandafter\dospecials\expandafter + {\dospecials \do\|}% +\expandafter\gdef\expandafter\@sanitize\expandafter + {\@sanitize \@makeother\|} +\begingroup\catcode`\|=\active \gdef|{\protect\activevert{}}\endgroup +% +% \end{macrocode} +% +% \begin{macro}{\arrayargpatch} +% If the column-specs arg of array or tabular contains a vert bar +% character, and we have made vert bars active, it will cause +% trouble. The following command, used in the ctab environment, +% prevents the trouble. +% \begin{macrocode} +\newcommand{\arrayargpatch}{% + \let\@oldarray\@array + \edef\@array[##1]##2{\catcode\number`\|=\number\catcode`\| + \catcode\number`\@=\number\catcode`\@ \relax + \let\noexpand\@array\noexpand\@oldarray + \noexpand\@array[##1]{##2}}% + \catcode`\|=12 \catcode`\@=12 \relax +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{ctab} +% An environment for centered tables. +% \begin{macrocode} +\newenvironment{ctab}{% + \par\topsep\medskipamount + \trivlist\centering + \item[]% + \arrayargpatch + \begin{tabular}% +}{% + \end{tabular}% + \endtrivlist +} +% \end{macrocode} +% \end{environment} +% +% Load \pkg{doc} package, reset \cn{AltMacroFont} to be the same as +% \cn{MacroFont} (when there are large sections of conditional +% code I think it looks better not to have it all slanted). +% \begin{macrocode} +%<*amsdtx> +\RequirePackage{doc} +\def\AltMacroFont{\MacroFont} +% \end{macrocode} +% +% \begin{macro}{\SpecialMainEnvIndex} +% Override \fn{doc.sty}'s main environment indexing to get rid of +% the parens around ``environment'', for compatibility with our +% \cs{env} command. +% \begin{macrocode} +\def\SpecialMainEnvIndex#1{% + \@bsphack + \special@index{% + #1\actualchar\string\texttt{#1} environment\encapchar main% + }% + \special@index{% + environments:\levelchar#1% + \actualchar\string\texttt{#1}% + \encapchar main}% + \@esphack +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SpecialEnvIndex} +% \begin{macrocode} +\def\SpecialEnvIndex#1{% + \@bsphack + \index{#1\actualchar\string\texttt{#1} environment\encapchar usage}% + \index{% + environments:\levelchar#1% + \actualchar\string\texttt{#1}% + \encapchar usage}% + \@esphack +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DescribeOption} +% \begin{macrocode} +\def\DescribeOption{% + \leavevmode + \@bsphack + \begingroup + \MakePrivateLetters + \Describe@Option +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Describe@Option} +% \begin{macrocode} +\def\Describe@Option#1{% + \endgroup + \marginpar{\raggedleft\PrintDescribeOption{#1}}% + \SpecialOptionIndex{#1}% + \@esphack + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintDescribeOption} +% \begin{macrocode} +\def\PrintDescribeOption#1{\strut \MacroFont #1\ } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\option} +% \begin{macrocode} +\def\option{% + \let\SpecialMainEnvIndex\SpecialMainOptionIndex +\begingroup + \catcode`\\12 + \MakePrivateLetters \m@cro@ \iffalse} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SpecialMainOptionIndex} +% \begin{macrocode} +\def\SpecialMainOptionIndex#1{% + \@bsphack + \special@index{#1\actualchar\string\texttt{#1} option\encapchar main}% + \@esphack +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SpecialOptionIndex} +% \begin{macrocode} +\def\SpecialOptionIndex{\@category@index{option}} +% \end{macrocode} +% \end{macro} +% +% Ordinary \cn{DocInput} doesn't handle standardized file headers +% unless you enclose them in \cs{iffalse} \dots\ \cs{fi} which I +% don't care to do. So instead here's an alternate version of +% \cn{DocInput}, called \cn{hDocInput}. +% \begin{macrocode} +\def\hDocInput#1{\MakePercentIgnore + \begingroup +% \end{macrocode} +% Define active \qc{\@} which should be the first non-percent, +% non-equal-sign character when a file header is present. (If a file +% header is not present, \cn{hDocInput} should not be used.) +% \begin{macrocode} + \begingroup \lccode`\~=`\@ + \lowercase{\endgroup\long\def ~}##1##{% + \catcode`\==12 \skipfileheader{##1}}% + \catcode`\@=\active \catcode`\==14 % comment + \def\filename{#1}% + \@@input#1 \MakePercentComment} +% \end{macrocode} +% +% \begin{macrocode} +\def\skipfileheader#1#2 {\endgroup + \hGetFileInfo#2 version = "??" date = "??"\@nil + \begingroup\catcode`\==9 \catcode`\ =9 \futurelet\0\endgroup +} +% \end{macrocode} +% +% \begin{macrocode} +\long\def\hGetFileInfo#1 version = "#2"#3 date = "#4"#5\@nil{% + \def\fileversion{#2}\def\filedate{#4}} +% +% \end{macrocode} +% +% A bunch of stuff we don't want in code indexes: +% \begin{macrocode} +%<*amsdtx> +\DoNotIndex{\@xp,\@nx,\@empty,\newcommand,\renewcommand} +\DoNotIndex{\newenvironment,\renewenvironment,\providecommand} +\DoNotIndex{\if,\fi,\ifnum,\fi,\@let@token,\futurelet,\fsa@n} +\DoNotIndex{\ignorespaces,\@tempcnta,\@tempcntb,\count@} +\DoNotIndex{\toks@,\@ne,\advance} +\DoNotIndex{\!,\/,\?,\@,\^,\_} +\DoNotIndex{\@@par,\@M,\@auxout,\@bsphack,\@esphack,\@depth,\@ehc} +\DoNotIndex{\@for,\@flushglue,\@gobble,\@gobbletwo,\@height,\@idxitem} +\DoNotIndex{\@ifnextchar,\@ifstar,\@ifundefined,\@input,\@latexerr} +\DoNotIndex{\@makeschapterhead,\@namedef,\@nameuse,\@nil} +\DoNotIndex{\@nobreakfalse,\@restonecolfalse,\@restonecoltrue} +\DoNotIndex{\@tempa,\@tempb,\@tempc,\@tempf,\@temptokena,\@themark,\@width} +\DoNotIndex{\active,\aindex,\baselineskip,\begin,\begingroup,\box} +\DoNotIndex{\c@page,\catcode,\chapter,\char,\chardef,\closeout} +\DoNotIndex{\CodelineIndex,\sp,\sb,\label,\leavevmode,\mark} +\DoNotIndex{\mark,\newinsert,\newwrite,\newtoks,\xdef} +\DoNotIndex{\columnsep,\columnseprule,\columnwidth,\csname,\def} +\DoNotIndex{\dimen,\do,\DocInput,\documentstyle,\edef,\em} +\DoNotIndex{\EnableCrossrefs,\end,\endcsname,\endgroup,\endinput} +\DoNotIndex{\everypar,\expandafter,\filedate,\fileversion} +\DoNotIndex{\footnotesize,\gdef,\global,\glossary,\hangindent} +\DoNotIndex{\if@filesw,\else,\fi} +\DoNotIndex{\if@nobreak,\if@twocolumn,\if@twoside,\fi,\fi,\fi} +\DoNotIndex{\hsize,\hskip} +\DoNotIndex{\ifhmode,\ifmmode,\ifodd,\ifvmode,\ifx,\fi,\fi,\fi,\fi,\fi} +\DoNotIndex{\ifcase,\ifdim,\ifeof,\iffalse,\iftrue,\fi,\fi,\fi,\fi,\fi} +\DoNotIndex{\ifcat,\fi} +\DoNotIndex{\immediate,\insert,\item,\jobname,\long} +\DoNotIndex{\let,\lineskip,\marginparsep,\marginparwidth,\maxdimen} +\DoNotIndex{\makeatletter,\noexpand,\openout,\protect,\rlap} +\DoNotIndex{\min,\newpage,\nobreak,\normalbaselineskip} +\DoNotIndex{\normallineskip,\p@,\par,\parfillskip,\parindent,\parskip} +\DoNotIndex{\penalty,\relax,\section,\sin,\sloppy,\space,\string} +\DoNotIndex{\tableofcontents,\the,\thepage,\thispagestyle,\toks,\tt} +\DoNotIndex{\twocolumn,\uppercase,\vbox,\vrule,\vskip,\vss} +\DoNotIndex{\write,\z@,\z@skip} +% +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \changes{v1.2b}{1995/02/15}{Added {}{} after rightmark, leftmark to +% handle no-maketitle case} +% \changes{v1.2b}{1995/02/15}{Added frenchspacing in error env heading} +% +% \changes{v1.2c}{1996/10/28}{Update version number, date for new release} +% +% \changes{v1.2d}{1997/03/13}{Fixed up loading method for OT1cmtt fd file} +% +% \changes{v2.03}{2004/04/06}{Reworked indexing commands for +% compatibility with doc.sty} +% +% \changes{v2.04}{2004/04/07}{Further work on indexing commands for +% compatibility with macro and environment environments in \fn{doc.sty}. +% Also added \env{option} environment, \cs{DescribeOption}, +% \cs{PrintDescribeOption}, \cs{SpecialOptionIndex}, and +% \cs{SpecialMainOptionIndex}.} +% +% \changes{v2.05}{2004/04/27}{Fixed the amsdtx \cs{env} so that it +% prints its argument in addition to putting it in the index. Added +% |\penalty\exhyphenpenalty| to \cs{mdash} and \cs{ndash} as per +% \pkg{textcmds}.} +% +% \CheckSum{1516} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsgen.dtx b/Master/texmf-dist/source/latex/amslatex/amsgen.dtx new file mode 100644 index 00000000000..dddaadd9af8 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsgen.dtx @@ -0,0 +1,396 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsgen.dtx", +%%% version = "2.0", +%%% date = "1999/11/30", +%%% time = "12:33:33 EST", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995, 1999 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% checksum = "07569 396 1613 14368", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, amslatex, ams-latex", +%%% supported = "yes", +%%% abstract = "This is part of the AMS-\LaTeX{} distribution. +%%% It contains some general internal macros shared +%%% by several different files in AMS-\LaTeX{}.", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +% \iffalse +%<*driver> +\documentclass{amsdtx} +\begin{document} +\title{The \pkg{amsgen} package} +\author{American Mathematical Society\\Michael Downes} +\date{Version \fileversion, \filedate} +\hDocInput{amsgen.dtx} +\end{document} +% +% \fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% This is an internal package for storing common functions +% that are shared by more than one package in the \amslatex/ +% distribution. Some of these might eventually make it into the \latex/ +% kernel. +% +% \StopEventually{} +% +% Standard package info. +% Using \cs{ProvidesFile} rather than \cs{ProvidesPackage} because +% the latter, when input by, e.g, \cls{amsbook}, results in +% \texttt{LaTeX warning: You have requested document class `amsbook', +% but the document class provides `amsgen'.} +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1994/12/01]% LaTeX date must December 1994 or later +\ProvidesFile{amsgen.sty}[1999/11/30 v2.0] +% \end{macrocode} +% +% \section{Implementation} +% Some general macros shared by \fn{amsart.dtx}, \fn{amsmath.dtx}, +% \fn{amsfonts.dtx}, \dots +% +% \begin{macro}{\@saveprimitive} +% The \pkg{amsmath} package redefines a number of \tex/ primitives. +% In case some preceding package also decided to redefine one of +% those same primitives, we had better do some checking to make +% sure that we are able to save the primitive meaning for internal +% use. This is handled by the \cs{@saveprimitive} function. We +% follow the example of \cs{@@input} where the primitive meaning is +% stored in an internal control sequence with a |@@| prefix. +% Primitive control sequences can be distinguished by the fact that +% \cs{string} and \cs{meaning} return the same information. +% \begin{macrocode} +\providecommand{\@saveprimitive}[2]{\begingroup\escapechar`\\\relax + \edef\@tempa{\string#1}\edef\@tempb{\meaning#1}% + \ifx\@tempa\@tempb \global\let#2#1% + \else +% \end{macrocode} +% Check to see if \arg{2} was already given the desired primitive +% meaning somewhere else. +% \begin{macrocode} + \edef\@tempb{\meaning#2}% + \ifx\@tempa\@tempb + \else + \@latex@error{Unable to properly define \string#2; primitive + \noexpand#1no longer primitive}\@eha + \fi + \fi + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xp} +% \begin{macro}{\@nx} +% Shorthands for long command names. +% \begin{macrocode} +\let\@xp=\expandafter +\let\@nx=\noexpand +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@emptytoks} +% A token register companion for \cs{@empty}. Saves a little main mem and +% probably makes initializations such as |\toks@{}| run faster too. +% \begin{macrocode} +\newtoks\@emptytoks +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@oparg} +% Use of \cs{@oparg} simplifies some constructions where a macro +% takes an optional argument in square brackets. We can't use +% \cn{newcommand} here because this function might be previously +% defined by the \pkg{amsmath} package in a loading sequence such as +% \begin{verbatim} +% \usepackage{amsmath,amsthm} +% \end{verbatim} +% \begin{macrocode} +\def\@oparg#1[#2]{\@ifnextchar[{#1}{#1[#2]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ifempty} +% \begin{macro}{\@ifnotempty} +% |\@ifnotempty| and |\@ifempty| use category 11 |@| characters to +% test whether the argument is empty or not, since these are highly +% unlikely to occur in the argument. As with \cn{@oparg}, there is a +% possibility that these commands were defined previously in +% \fn{amsmath.sty}. +% \begin{macrocode} +\long\def\@ifempty#1{\@xifempty#1@@..\@nil} +\long\def\@xifempty#1#2@#3#4#5\@nil{% + \ifx#3#4\@xp\@firstoftwo\else\@xp\@secondoftwo\fi} +% \end{macrocode} +% \cs{@ifnotempty} is a shorthand that makes code read better when +% no action is needed in the empty case. At a cost of double +% argument-reading---so for often-executed code, avoiding +% \cs{@ifnotempty} might be wise. +% \begin{macrocode} +\long\def\@ifnotempty#1{\@ifempty{#1}{}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Some abbreviations to conserve token mem. +% \begin{macrocode} +\def\FN@{\futurelet\@let@token} +\def\DN@{\def\next@} +\def\RIfM@{\relax\ifmmode} +\def\setboxz@h{\setbox\z@\hbox} +\def\wdz@{\wd\z@} +\def\boxz@{\box\z@} +\def\relaxnext@{\let\@let@token\relax} +% \end{macrocode} +% +% \begin{macro}{\new@ifnextchar} +% This macro is a new version of \latex/'s \verb+\@ifnextchar+, +% macro that does not skip over spaces. +% \begin{macrocode} +\long\def\new@ifnextchar#1#2#3{% +% \end{macrocode} +% By including the space after the equals sign, we make it possible +% for \cs{new@ifnextchar} to do look-ahead for any token, including a +% space! +% \begin{macrocode} + \let\reserved@d= #1% + \def\reserved@a{#2}\def\reserved@b{#3}% + \futurelet\@let@token\new@ifnch +} +% +\def\new@ifnch{% + \ifx\@let@token\reserved@d \let\reserved@b\reserved@a \fi + \reserved@b +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ifstar} +% There will essentially never be a space before the \qc{\*}, so +% using \cs{@ifnextchar} is unnecessarily slow. +% \begin{macrocode} +\def\@ifstar#1#2{\new@ifnextchar *{\def\reserved@a*{#1}\reserved@a}{#2}} +% \end{macrocode} +% \end{macro} +% +% The hook \cs{every@size} was changed to \cs{every@math@size} in the +% December 1994 release of \latex/ and its calling procedures changed. +% If \cs{every@math@size} is undefined it means the user has an older +% version of \latex/ so we had better define it and patch a couple of +% functions (\cs{glb@settings} and \cs{set@fontsize}). +% \begin{macrocode} +\@ifundefined{every@math@size}{% +% \end{macrocode} +% Reuse the same token register; since it was never used except for +% the purposes that are affected below, this is OK. +% \begin{macrocode} +\let\every@math@size=\every@size +\def\glb@settings{% + \expandafter\ifx\csname S@\f@size\endcsname\relax + \calculate@math@sizes + \fi + \csname S@\f@size\endcsname + \ifmath@fonts +% \ifnum \tracingfonts>\tw@ +% \@font@info{Setting up math fonts for +% \f@size/\f@baselineskip}\fi + \begingroup + \escapechar\m@ne + \csname mv@\math@version \endcsname + \globaldefs\@ne + \let \glb@currsize \f@size + \math@fonts + \endgroup + \the\every@math@size + \else +% \ifnum \tracingfonts>\tw@ +% \@font@info{No math setup for \f@size/\f@baselineskip}% +% \fi + \fi +} +% \end{macrocode} +% Remove |\the\every@size| from \cs{size@update}. +% \begin{macrocode} +\def\set@fontsize#1#2#3{% + \@defaultunits\@tempdimb#2pt\relax\@nnil + \edef\f@size{\strip@pt\@tempdimb}% + \@defaultunits\@tempskipa#3pt\relax\@nnil + \edef\f@baselineskip{\the\@tempskipa}% + \edef\f@linespread{#1}% + \let\baselinestretch\f@linespread + \def\size@update{% + \baselineskip\f@baselineskip\relax + \baselineskip\f@linespread\baselineskip + \normalbaselineskip\baselineskip + \setbox\strutbox\hbox{% + \vrule\@height.7\baselineskip + \@depth.3\baselineskip + \@width\z@}% +%%% \the\every@size + \let\size@update\relax}% + } +}{}% end \@ifundefined test +% \end{macrocode} +% +% \begin{macro}{\ex@} +% The \cs{ex@} variable provides a small unit of space for use in +% math-mode constructions, that varies according to the current type +% size. For example, the \cn{pmb} command uses \cs{ex@} units. +% Since a macro or mu unit solution for the \meta{dimen} \cs{ex@} won't +% work without changing a lot of current code in the \pkg{amsmath} +% package, we set \cs{ex@} through the \cs{every@math@size} hook. +% The value of \cs{ex@} is scaled nonlinearly in a range of roughly +% 0.5pt to 1.5pt, by the function \cs{compute@ex@}. +% \begin{macrocode} +\newdimen\ex@ +\addto@hook\every@math@size{\compute@ex@} +% \end{macrocode} +% \end{macro} +% +% \cs{compute@ex@} computes \cs{ex@} as a nonlinear scaling from 10pt +% to current font size (\cs{f@size}). Using .97 as the multiplier makes 1 +% |ex@| $\approx$ .9pt when the current type size is 8pt and 1 |ex@| +% $\approx$ 1.1pt when the current type size is 12pt. +% +% The formula is essentially +% \begin{displaymath} +% \newcommand{\points}{\mbox{pt}} +% \newcommand{\floor}[1]{\lfloor#1\rfloor} +% 1\points \pm (1\points - (.97)^{\floor{\vert 10 - n\vert}}) +% \end{displaymath} +% where $n$ = current type size, but adjusted to differentiate +% half-point sizes as well as whole point sizes, and there is a +% cutoff for extraordinarily large values of \cs{f@size} ($>$ 20pt) +% so that the value of \cs{ex@} never exceeds 1.5pt. +% +% \begin{macrocode} +\def\compute@ex@{% + \begingroup + \dimen@-\f@size\p@ + \ifdim\dimen@<-20\p@ +% \end{macrocode} +% Never make \cs{ex@} larger than 1.5pt. +% \begin{macrocode} + \global\ex@ 1.5\p@ + \else +% \end{macrocode} +% Adjust by the reference size and multiply by 2 to allow for +% half-point sizes. +% \begin{macrocode} + \advance\dimen@10\p@ \multiply\dimen@\tw@ +% \end{macrocode} +% Save information about the current sign of \cs{dimen@}. +% \begin{macrocode} + \edef\@tempa{\ifdim\dimen@>\z@ -\fi}% +% \end{macrocode} +% Get the absolute value of \cs{dimen@}. +% \begin{macrocode} + \dimen@ \ifdim\dimen@<\z@ -\fi \dimen@ + \advance\dimen@-\@m sp % fudge factor +% \end{macrocode} +% Here we use \cs{vfuzz} merely as a convenient scratch register +% \begin{macrocode} + \vfuzz\p@ +% \end{macrocode} +% Multiply in a loop. +% \begin{macrocode} + \def\do{\ifdim\dimen@>\z@ + \vfuzz=.97\vfuzz + \advance\dimen@ -\p@ +%\message{\vfuzz: \the\vfuzz, \dimen@: \the\dimen@}% + \@xp\do \fi}% + \do + \dimen@\p@ \advance\dimen@-\vfuzz + \global\ex@\p@ + \global\advance\ex@ \@tempa\dimen@ + \fi + \endgroup +%\typeout{\string\f@size: \f@size}\showthe\ex@ +} +% \end{macrocode} +% Tests of the \cs{compute@ex@} function yield the following results: +% +% \begin{center}\begin{tabular}{rlrl} +% \cs{f@size}& \cs{ex@}& \cs{f@size}& \cs{ex@}\\ +% 10& 1.0pt& 9& 0.94089pt\\ +% 11& 1.05911pt& 8.7& 0.91266pt\\ +% 12& 1.11473pt& 8.5& 0.91266pt\\ +% 14.4& 1.23982pt& 8.4& 0.88527pt\\ +% 17.28& 1.36684pt& 8& 0.88527pt\\ +% 20.74& 1.5pt& 7& 0.83293pt\\ +% 19.5& 1.4395pt& 6& 0.78369pt\\ +% && 5& 0.73737pt\\ +% && 1& 0.57785pt +% \end{tabular}\end{center} +% +% \begin{macro}{\@addpunct} +% Use of the \cs{@addpunct} function allows ending punctuation in +% section headings and elsewhere to be intelligently omitted +% when punctuation is already present. +% \begin{macrocode} +\def\@addpunct#1{\ifnum\spacefactor>\@m \else#1\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frenchspacing} +% Change \cn{frenchspacing} to ensure that \cs{@addpunct} will +% continue to work properly even when `french' spacing is in effect. +% \begin{macrocode} +\def\frenchspacing{\sfcode`\.1006\sfcode`\?1005\sfcode`\!1004% + \sfcode`\:1003\sfcode`\;1002\sfcode`\,1001 } +% \end{macrocode} +% \end{macro} +% +% \subsection{Miscellaneous} +% \begin{macrocode} +\def\nomath@env{\@amsmath@err{% + \string\begin{\@currenvir} allowed only in paragraph mode% +}\@ehb% "You've lost some text" +} +% \end{macrocode} +% A trade-off between main memory space and hash size; using +% \verb+\Invalid@@+ saves 14 bytes of main memory for each use of +% \verb+\Invalid@+, at the cost of one control sequence name. +% \verb+\Invalid@+ is currently used about five times and +% \verb+\Invalid@@+ is used by itself in some other instances, +% which means that it saves us more memory than \verb+\FN@+, +% \verb+\RIfM@+, and some of the other abbreviations above. +% \begin{macrocode} +\def\Invalid@@{Invalid use of \string} +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{337} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsmath.dtx b/Master/texmf-dist/source/latex/amslatex/amsmath.dtx new file mode 100644 index 00000000000..9810bc283f0 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsmath.dtx @@ -0,0 +1,5829 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsmath.dtx", +%%% version = "2.13", +%%% date = "2000/07/18", +%%% time = "08:16:41 EDT", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995, 2000 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Publications Technical Group, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% checksum = "38084 5829 21569 202795", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, amslatex, math, amsmath", +%%% supported = "yes", +%%% abstract = "This is a \LaTeX{} package that provides a variety of +%%% extra mathematical features, largely derived from +%%% AMS-\TeX{}.", +%%% docstring = "The checksum field above contains a CRC-16 checksum +%%% as the first value, followed by the equivalent of +%%% the standard UNIX wc (word count) utility output of +%%% lines, words, and characters. This is produced by +%%% Robert Solovay's checksum utility.", +%%% } +%%% ==================================================================== +% +%\iffalse +%<*driver> +\documentclass{amsdtx} +\raggedbottom +\begin{document} +\title{The \pkg{amsmath} package} +\author{Frank Mittelbach\and Rainer Sch\"opf\and Michael Downes\and + David M. Jones} +\date{Version \fileversion, \filedate} +\providecommand{\histnote}{} +\renewenvironment{histnote}{% + \trivlist\item[\hspace{\labelsep}\bfseries Historical Note:]% +}{% + \endtrivlist +} +\hDocInput{amsmath.dtx} +\end{document} +% +%\fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% +% A \latex/ package named \pkg{amstex} was created in 1988--1989 by +% adapting \fn{amstex.tex} for use within \latex/. The \pkg{amsmath} +% package is the successor of the \pkg{amstex} package. It was +% substantially overhauled to integrate it with \latex/2e, which +% arrived on the scene in 1994. It provides more or less the same +% features, but there are quite a few organizational differences as +% well as some new features and bug fixes. For example, the +% \pkg{amstex} package automatically loaded the \pkg{amsfonts} +% package, but the \pkg{amsmath} package does not. At the present +% time (November 1999) user-level documentation of the commands +% provided here is found in the AMSmath Users' Guide, +% \fn{amsldoc.tex}. +% +% \StopEventually{} +% +% Standard file identification. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1994/12/01]% LaTeX date must be December 1994 or later +\ProvidesPackage{amsmath}[2000/07/18 v2.13 AMS math features] +% \end{macrocode} +% +% \section{Catcode defenses} +% +% Some packages change the catcode of characters that are essential +% in low-level \tex/ syntax. Any package that does so does not +% qualify as a PWWO package (\qq{Plays Well With Others}) because it +% can cause other packages to fail if they are loaded later. \LaTeX{} +% is partly to blame for this because it fails to provide adequate +% built-in safeguards in the package loading mechanisms. In the +% absence of such safeguards, we will provide them here. +% \begin{macrocode} +\edef\@temp{\catcode 96=\number\catcode 96 } +\catcode\string `\`=12 +\def\do#1{\catcode\number`#1=\number\catcode`#1} +\edef\@temp{% + \noexpand\AtEndOfPackage{% + \@temp + \do\"\do\'\do\(\do\)\do\*\do\+\do\,\do\-\do\.% + \do\/\do\<\do\=\do\>\do\[\do\]\do\^\do\_\relax + }% +} +\@temp +\def\do#1{\catcode\number`#1=12 } +\do\"\do\'\do\(\do\)\do\*\do\+\do\,\do\-\do\. +\do\/\do\<\do\=\do\>\do\[\do\] +\catcode`\^=7 \catcode`\_=8 +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Declare some options} +% +% Handling of limits on integrals, sums, operatornames. +% \begin{macrocode} +\DeclareOption{intlimits}{\let\ilimits@\displaylimits} +\DeclareOption{nointlimits}{\let\ilimits@\nolimits} +\DeclareOption{sumlimits}{\let\slimits@\displaylimits} +\DeclareOption{nosumlimits}{\let\slimits@\nolimits} +\DeclareOption{namelimits}{\PassOptionsToPackage{namelimits}{amsopn}} +\DeclareOption{nonamelimits}{% + \PassOptionsToPackage{nonamelimits}{amsopn}} +% \end{macrocode} +% +% The following two switches might have been defined already by the +% documentclass, but it doesn't hurt to re-execute the \cs{newif}'s. +% \begin{macrocode} +\newif\ifctagsplit@ +\newif\iftagsleft@ +% \end{macrocode} +% Right or left placement of equation numbers. +% \begin{macrocode} +\DeclareOption{leqno}{\tagsleft@true} +\DeclareOption{reqno}{\tagsleft@false} +\DeclareOption{centertags}{\ctagsplit@true} +\DeclareOption{tbtags}{\ctagsplit@false} +% \end{macrocode} +% +% The \opt{cmex10} option is an escape hatch for people who don't +% happen to have sizes 7--9 of the \fn{cmex} fonts available to them +% yet. (Strictly speaking they are considered part of a minimum +% \latex/ distribution now, i.e., all \LaTeXe{} users should have +% them, without needing to get the AMSFonts distrib.) +% \begin{macrocode} +\DeclareOption{cmex10}{% + \ifnum\cmex@opt=\@ne \def\cmex@opt{0}% + \else \def\cmex@opt{10}\fi +} +% \end{macrocode} +% To help things work out better with various package loading orders +% of \pkg{amsmath} and \pkg{amsfonts}, we establish a variable to +% communicate the status of the cmex font definition. If the +% \pkg{amsfonts} package was loaded first this variable might be +% already defined, in which case we want to preserve its value. +% \begin{macrocode} +\@ifundefined{cmex@opt}{\def\cmex@opt{7}}{} +% \end{macrocode} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Flush-left equations [DMJ]} +% +% The left margin of math enviroments is controlled by +% \cs{@mathmargin}. This can be set to \cs{@centering} to +% implement the default behaviour, i.e., centered equations, and to +% something else to implement the flushleft style. +% +% In theory, all that's needed to activate the flushleft mode +% in the AMS document classes is something like this: +% \begin{verbatim} +% \DeclareOption{fleqn}{% +% \AtBeginDocument{\@mathmargin30pt\relax}% +% } +% \end{verbatim} +% (In fact, unless the document class wants to specify the +% \cs{@mathmargin}, it doesn't need to do anything with the +% \opt{fleqn} option.) +% \begin{macrocode} +\newif\if@fleqn +% +\newskip\@mathmargin +\@mathmargin\@centering +% +\DeclareOption{fleqn}{% + \@fleqntrue + \@mathmargin = -1sp + \let\mathindent=\@mathmargin + \AtBeginDocument{% + \ifdim\@mathmargin= -1sp + \@mathmargin\leftmargini minus\leftmargini + \fi + }% +} +% \end{macrocode} +% +% DMJ: This ensures that \cs{@mathmargin} is given some sort of +% sensible default if the class doesn't specify one, while still +% allowing a user to override the default value in their document +% preamble. (Incidentally, I'm initializing \cs{@mathmargin} to +% \cs{leftmargini} for compatibility with \fn{fleqn.clo}, but I'm +% not at all convinced that's the right thing to do.) +% +% The next question is what happens when amsmath is used with +% one of the standard classes. Unfortunately, \latex/ implements +% \opt{fleqn} somewhat clumsily; instead of paramaterizing the +% definitions of the math structures (as I've attempted to do +% here), \fn{fleqn.clo} declares a dimen \cn{mathindent} that is +% much like my \cs{@mathmargin} and then redefines \cn\[, \cn\], +% \cn{equation}, and \cn{eqnarray}. This means that things could +% get rather messy in 2.09 compatibility mode, since \fn{fleqn.clo} +% might be loaded after \fn{amsmath.sty}, which could cause a real +% mess. +% +% [mjd,1999/07/07]: Let \cs{mathindent} = \cs{@mathmargin} as +% envisioned by DMJ. Compatibility-mode documents will all use the +% \pkg{amstex} package, not \pkg{amsmath}. There is a remote chance +% of a problem if someone makes an assignment to \cs{mathindent} in a +% way that implicitly assumes it is a dimen register (inasmuch as it +% has now become a skip register), and the string ``plus'' follows in +% the input stream, but if someone's document croaks in that way, I +% think they will just have to bite the bullet and fix it. The +% alternative is to penalize a lot of other users with a known +% handicap. +% +% \begin{macrocode} +\DeclareOption{?}{} +% \end{macrocode} +% +% \begin{macrocode} +\ExecuteOptions{nointlimits,sumlimits,namelimits,centertags} +% \end{macrocode} +% The \cs{par} after \cs{ProcessOptions} is to ensure the correct +% line number on screen if an error occurs during option processing; +% otherwise the lookahead for a \qc{\*} option would result in \tex/ +% showing the following line instead. +% \begin{macrocode} +\ProcessOptions\par +% \end{macrocode} +% +% \begin{macrocode} +\@ifpackagewith{amsmath}{?}{% + \typeout{^^J% +Documentation for the amsmath package is found in amsldoc.dvi^^J% +(or .pdf or .tex).^^J% +^^J% +See also http://www.ams.org/tex/amslatex.html.^^J% +^^J% +Note: Using the first edition of The LaTeX Companion (1994) without^^J% +errata as a guide for amsmath use is not recommended.^^J% + }% +}{% + \typeout{% +For additional information on amsmath, use the \lq ?\rq\space option.% + }% +} +% \end{macrocode} +% +% Processing to handle the \opt{cmex10} option is a little tricky +% because of different possible loading orders for \pkg{amsmath} and +% \pkg{amsfonts}. The package \pkg{amsmath} sets the \cs{cmex@opt} +% flag to 7 or 10, and the package \pkg{amsfonts} sets the flag to 1 +% or 0. +% \begin{macrocode} +\ifnum\cmex@opt=7 \relax + \DeclareFontShape{OMX}{cmex}{m}{n}{% + <-8>cmex7<8>cmex8<9>cmex9% + <10><10.95><12><14.4><17.28><20.74><24.88>cmex10% + }{}% + \expandafter\let\csname OMX/cmex/m/n/10\endcsname\relax +\else + \ifnum\cmex@opt=\z@ % need to override cmex7 fontdef from amsfonts +% \end{macrocode} +% Force reloading of the OMX/cmex font definition file. +% \begin{macrocode} + \begingroup + \fontencoding{OMX}\fontfamily{cmex}% + \expandafter\let\csname OMX+cmex\endcsname\relax + \try@load@fontshape + \endgroup +% \end{macrocode} +% The \fn{cmex10} font gets special preload handling in the building +% of the \latex/ format file, need an extra bit here to work around +% that. +% \begin{macrocode} + \expandafter\let\csname OMX/cmex/m/n/10\endcsname\relax + \def\cmex@opt{10}% + \fi +\fi +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Call some other packages} +% +% The \pkg{amstext} package provides the \cn{text} command. The +% \pkg{amsbsy} package provides \cn{boldsymbol} and \cn{pmb}. (Since +% 1997 it is usually better to use the \pkg{bm} package instead; but +% I think we have to keep \pkg{amsbsy} here for backward +% compatibility [mjd,1999/11/19].) The \pkg{amsopn} package provides +% \cn{DeclareMathOperator}. +% \begin{macrocode} +\RequirePackage{amstext}[1995/01/25] +\RequirePackage{amsbsy}[1995/01/20] +\RequirePackage{amsopn}[1995/01/20] +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Miscellaneous} +% +% \begin{macro}{\@amsmath@err} +% Defining this error function saves main mem. +% \begin{macrocode} +\def\@amsmath@err{\PackageError{amsmath}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AmS} +% The \cs{AmS} prefix can be used to construct the combination +% |\AmS-\LaTeX|. +% \begin{macrocode} +\providecommand{\AmS}{{\protect\AmSfont + A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}} +% \end{macrocode} +% In \cn{AmSfont} we call cmsy directly in lieu of trying to access +% it through the math fonts setup (e.g. |\the\textfont2|) because +% math fonts can't be relied on to be properly set up if we are not +% inside a math formula. This means that if this command is used in a +% document where CM fonts are not wanted, then a font substitution +% will need to be declared, e.g.: +% \begin{verbatim} +% \DeclareFontShape{OMS}{cmsy}{m}{n}{ <-> sub * xxx/m/n }{} +% \end{verbatim} +% where |xxx| is some alternate font family. +% Taking the first letter of \cs{f@series} will produce |b| or |m| +% for the most common values (|b,bx,m|). It may produce nonsense for +% more unusual values of \cs{f@series}, so for safety's sake we have +% an additional \cs{if} test. We want to avoid setting the series to +% |bx| because in a standard \latex/ installation the combination +% |cmsy/bx/n| does not have a font definition, and the user +% would get a font substitution warning on screen. +% \begin{macrocode} +\newcommand{\AmSfont}{% + \usefont{OMS}{cmsy}{\if\@xp\@car\f@series\@nil bb\else m\fi}{n}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@mathmeasure} +% The function |\@mathmeasure| takes three arguments; the third arg +% is typeset as a math formula in an hbox, using arg |#2| as the +% mathstyle, and the result is left in the box named by the first +% arg. It is assumed that we are already in math mode, so we can turn +% off |\everymath| (in particular, |\check@mathfonts|). +% \begin{macrocode} +\def\@mathmeasure#1#2#3{\setbox#1\hbox{\frozen@everymath\@emptytoks + \m@th$#2#3$}} +% \end{macrocode} +% \end{macro} +% +% The \cs{inf@bad} constant is for testing overfull boxes. +% \begin{macrocode} +\@ifundefined{inf@bad}{% + \newcount\inf@bad \inf@bad=1000000 \relax +}{} +% \end{macrocode} +% +%\subsection{Math spacing commands} +% +% Here we fill in some gaps in the set of spacing commands, and make them +% all work equally well in or out of math. +% We want all these commands to be robust but declaring them all with +% \cs{DeclareRobustCommand} uses up an control sequence name per +% command; to avoid this, we define a common command \cs{tmspace} +% (text-or-math space) which carries the robustness burden for all of +% them. The standard \cs{relax} before the \cs{ifmmode} is not +% necessary because of the \cs{protect} added by +% \cs{DeclareRobustCommand}. +% \begin{macrocode} +\DeclareRobustCommand{\tmspace}[3]{% + \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} +\renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} +\let\thinspace\, +\renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} +\let\negthinspace\! +\renewcommand{\:}{\tmspace+\medmuskip{.2222em}} +\let\medspace\: +\newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} +\renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} +\let\thickspace\; +\newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} +% \end{macrocode} +% +% \begin{macro}{\mspace} +% And while we're at it, why don't we provide an equivalent of +% \cn{hspace} for math mode use. This allows use of |mu| units in +% (for example) constructing compound math symbols. +% \begin{macrocode} +\newcommand{\mspace}[1]{\mskip#1\relax} +% \end{macrocode} +% \end{macro} +% +% \subsection{Vertical bar symbols} +% Add left/right specific versions of \cn{vert}, \cn{Vert}. Don't +% assume the delimiter codes are the CM defaults. +% \begin{macrocode} +\def\@tempa#1#2\@nil{% + \ifx\delimiter#1\@tempcnta#2\relax\else\@tempcnta\z@\fi +} +\@xp\@tempa\vert\@empty\@nil +\ifnum\@tempcnta>\z@ + \advance\@tempcnta "4000000 + \xdef\lvert{\delimiter\number\@tempcnta\space } + \advance\@tempcnta "1000000 + \xdef\rvert{\delimiter\number\@tempcnta\space } +\else + \ifx\@@undefined\lvert + % Fall back to cmex encoding since we don't know what else to do. + \DeclareMathDelimiter{\lvert} + {\mathopen}{symbols}{"6A}{largesymbols}{"0C} + \DeclareMathDelimiter{\rvert} + {\mathclose}{symbols}{"6A}{largesymbols}{"0C} + \fi +\fi +\@xp\@tempa\Vert\@empty\@nil +\ifnum\@tempcnta>\z@ + \advance\@tempcnta "4000000 + \xdef\lVert{\delimiter\number\@tempcnta\space } + \advance\@tempcnta "1000000 + \xdef\rVert{\delimiter\number\@tempcnta\space } +\else + \ifx\@@undefined\lVert + \DeclareMathDelimiter{\lVert} + {\mathopen}{symbols}{"6B}{largesymbols}{"0D} + \DeclareMathDelimiter{\rVert} + {\mathclose}{symbols}{"6B}{largesymbols}{"0D} + \fi +\fi +% \end{macrocode} +% +% \subsection{Fractions} +% Bury the generalized fraction primitives \cs{over}, \cs{atop}, +% etc., because of their bizarre syntax, which is decidedly out of +% place in a \latex/ document. +% \begin{macrocode} +\@saveprimitive\over\@@over +\@saveprimitive\atop\@@atop +\@saveprimitive\above\@@above +\@saveprimitive\overwithdelims\@@overwithdelims +\@saveprimitive\atopwithdelims\@@atopwithdelims +\@saveprimitive\abovewithdelims\@@abovewithdelims +% \end{macrocode} +% +% If someone insists on using \cs{over}, give a warning the first +% time and then resurrect the old definition. Laissez-faire policy. +% \begin{macrocode} +\DeclareRobustCommand{\primfrac}[1]{% + \PackageWarning{amsmath}{% +Foreign command \@backslashchar#1;\MessageBreak +\protect\frac\space or \protect\genfrac\space should be used instead% +\MessageBreak + } + \global\@xp\let\csname#1\@xp\endcsname\csname @@#1\endcsname + \csname#1\endcsname +} +\renewcommand{\over}{\primfrac{over}} +\renewcommand{\atop}{\primfrac{atop}} +\renewcommand{\above}{\primfrac{above}} +\renewcommand{\overwithdelims}{\primfrac{overwithdelims}} +\renewcommand{\atopwithdelims}{\primfrac{atopwithdelims}} +\renewcommand{\abovewithdelims}{\primfrac{abovewithdelims}} +% \end{macrocode} +% +% \cn{frac} calls \cn{@@over} directly instead of via \cn{genfrac}, for +% better speed because it is so common. \cn{tfrac} and \cn{dfrac} are +% abbreviations for some commonly needed mathstyle overrides. To +% conserve csnames we avoid making \cn{dfrac} and \cn{tfrac} robust +% (\cn{genfrac} is itself robust). +% \begin{macrocode} +\DeclareRobustCommand{\frac}[2]{{\begingroup#1\endgroup\@@over#2}} +\newcommand{\dfrac}{\genfrac{}{}{}0} +\newcommand{\tfrac}{\genfrac{}{}{}1} +% \end{macrocode} +% The \cn{binom} command for binomial notation works like \cn{frac} +% and has similar variants. Note that we do not use \cs{z@} in +% \cn{dbinom} and \cn{tbinom} because they are not top-level robust +% like \cn{binom}, and so the \cs{z@} with the potentially +% problematic \qc{\@} character would become visible when writing one +% of those commands to a \fn{.toc} file. +% \begin{macrocode} +\DeclareRobustCommand{\binom}{\genfrac()\z@{}} +\newcommand{\dbinom}{\genfrac(){0pt}0} +\newcommand{\tbinom}{\genfrac(){0pt}1} +% \end{macrocode} +% +% \begin{macro}{\genfrac} +% This command provides access to \tex/'s generalized fraction +% primitives. Args: \arg{1} left delim, \arg{2} right delim, \arg{3} +% line thickness, \arg{4} mathstyle override, \arg{5} numerator, +% \arg{6} denominator. But we only read the first four args at first, +% in order to give us a moment to select the proper generalized +% fraction primitive. Any of those four args could be empty, and when +% empty the obvious defaults are selected (no delimiters, default +% line thickness (normally .4pt), and no mathstyle override). +% \begin{macrocode} +\DeclareRobustCommand{\genfrac}[4]{% + \def\@tempa{#1#2}% + \edef\@tempb{\@nx\@genfrac\@mathstyle{#4}% + \csname @@\ifx @#3@over\else above\fi + \ifx\@tempa\@empty \else withdelims\fi\endcsname} + \@tempb{#1#2#3}} +% \end{macrocode} +% \cs{@genfrac} takes the preceding arguments and reads the +% numerator and denominator. Note that there's no convenient way to +% make the numerator and denominator \emph{contents} +% displaystyle, through this interface. +% +% Args: \arg{1} mathstyle, \arg{2} fraction primitive, +% \arg{3} delimiters and rule thickness, +% \arg{4} numerator, \arg{5} denominator. +% \begin{macrocode} +\def\@genfrac#1#2#3#4#5{{#1{\begingroup#4\endgroup#2#3\relax#5}}} +% \end{macrocode} +% \end{macro} +% +% Empty mathstyle arg: no change; 0 = displaystyle, 1 = textstyle, 2 +% = scriptstyle, 3 = scriptscriptstyle. +% \begin{macrocode} +\def\@mathstyle#1{% + \ifx\@empty#1\@empty\relax + \else\ifcase#1\displaystyle % case 0 + \or\textstyle\or\scriptstyle\else\scriptscriptstyle\fi\fi} +% \end{macrocode} +% +% \subsection{Sums and Integrals} +% Default value for sum limits is \cs{displaylimits}, see option +% `nosumlimits'. +% +% We redefine all the cumulative operator symbols to use +% \cs{slimits@} so that switching between \cs{displaylimits} and +% \cs{nolimits} can be controlled by package options. Also add +% \cs{DOTSB} for the benefit of the dots lookahead. But we'd better +% make sure \cn{coprod} and the others are simple mathchars; if not, +% the attempted changes will probably fail miserably. +% +% \begin{macrocode} +\begingroup +\edef\@tempa{\string\mathchar"} +\def\@tempb#1"#2\@nil{#1"} +\edef\@tempc{\expandafter\@tempb\meaning\coprod "\@nil} +\ifx\@tempa\@tempc + \global\let\coprod@\coprod + \gdef\coprod{\DOTSB\coprod@\slimits@} + \global\let\bigvee@\bigvee + \gdef\bigvee{\DOTSB\bigvee@\slimits@} + \global\let\bigwedge@\bigwedge + \gdef\bigwedge{\DOTSB\bigwedge@\slimits@} + \global\let\biguplus@\biguplus + \gdef\biguplus{\DOTSB\biguplus@\slimits@} + \global\let\bigcap@\bigcap + \gdef\bigcap{\DOTSB\bigcap@\slimits@} + \global\let\bigcup@\bigcup + \gdef\bigcup{\DOTSB\bigcup@\slimits@} + \global\let\prod@\prod + \gdef\prod{\DOTSB\prod@\slimits@} + \global\let\sum@\sum + \gdef\sum{\DOTSB\sum@\slimits@} + \global\let\bigotimes@\bigotimes + \gdef\bigotimes{\DOTSB\bigotimes@\slimits@} + \global\let\bigoplus@\bigoplus + \gdef\bigoplus{\DOTSB\bigoplus@\slimits@} + \global\let\bigodot@\bigodot + \gdef\bigodot{\DOTSB\bigodot@\slimits@} + \global\let\bigsqcup@\bigsqcup + \gdef\bigsqcup{\DOTSB\bigsqcup@\slimits@} +\fi +\endgroup +% \end{macrocode} +% +% \subsection{Roots and radicals} +% +% This root stuff needs syntax work and implementation work. Surely +% something more compact can be done?? [mjd, 1994/09/05] +% \begin{macrocode} +\newcommand{\leftroot}{\@amsmath@err{\Invalid@@\leftroot}\@eha} +\newcommand{\uproot}{\@amsmath@err{\Invalid@@\uproot}\@eha} +\newcount\uproot@ +\newcount\leftroot@ +\renewcommand{\root}{\relaxnext@ + \DN@{\ifx\@let@token\uproot\let\next@\nextii@\else + \ifx\@let@token\leftroot\let\next@\nextiii@\else + \let\next@\plainroot@\fi\fi\next@}% + \def\nextii@\uproot##1{\uproot@##1\relax\FN@\nextiv@}% + \def\nextiv@{\ifx\@let@token\@sptoken\DN@. {\FN@\nextv@}\else + \DN@.{\FN@\nextv@}\fi\next@.}% + \def\nextv@{\ifx\@let@token\leftroot\let\next@\nextvi@\else + \let\next@\plainroot@\fi\next@}% + \def\nextvi@\leftroot##1{\leftroot@##1\relax\plainroot@}% + \def\nextiii@\leftroot##1{\leftroot@##1\relax\FN@\nextvii@}% + \def\nextvii@{\ifx\@let@token\@sptoken + \DN@. {\FN@\nextviii@}\else + \DN@.{\FN@\nextviii@}\fi\next@.}% + \def\nextviii@{\ifx\@let@token\uproot\let\next@\nextix@\else + \let\next@\plainroot@\fi\next@}% + \def\nextix@\uproot##1{\uproot@##1\relax\plainroot@}% + \bgroup\uproot@\z@\leftroot@\z@\FN@\next@} +\def\plainroot@#1\of#2{\setbox\rootbox\hbox{% + $\m@th\scriptscriptstyle{#1}$}% + \mathchoice{\r@@t\displaystyle{#2}}{\r@@t\textstyle{#2}} + {\r@@t\scriptstyle{#2}}{\r@@t\scriptscriptstyle{#2}}\egroup} +% \end{macrocode} +% +% \changes{v2.0}{1999/06/17}{Normalize @@sqrt to sqrtsign} + +% Name change from \cs{@@sqrt} to \cs{sqrtsign} happened in the +% 1995/12/01 release of \latex/. If we were to assume that +% \cs{sqrtsign} is defined then someone with the 1995/06/01 release +% of \latex/ would have trouble using this package. +% \begin{macrocode} +\@ifundefined{sqrtsign}{\let\sqrtsign\@@sqrt}{} +\def\r@@t#1#2{\setboxz@h{$\m@th#1\sqrtsign{#2}$}% + \dimen@\ht\z@\advance\dimen@-\dp\z@ + \setbox\@ne\hbox{$\m@th#1\mskip\uproot@ mu$}% + \advance\dimen@ by1.667\wd\@ne + \mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@\copy\rootbox + \mkern-10mu\mkern\leftroot@ mu\boxz@} +% \end{macrocode} +% +% \subsection{Et cetera} +% +% \changes{v2.0}{1999/06/18}{Leave Greek cap letters unaltered} +% +% Specific names for the variant italic cap Greek letters are not +% defined by \latex/. If no preceding package defined these, we will +% define them now. +% \begin{macrocode} +\@ifundefined{varGamma}{% + \DeclareMathSymbol{\varGamma}{\mathord}{letters}{"00} + \DeclareMathSymbol{\varDelta}{\mathord}{letters}{"01} + \DeclareMathSymbol{\varTheta}{\mathord}{letters}{"02} + \DeclareMathSymbol{\varLambda}{\mathord}{letters}{"03} + \DeclareMathSymbol{\varXi}{\mathord}{letters}{"04} + \DeclareMathSymbol{\varPi}{\mathord}{letters}{"05} + \DeclareMathSymbol{\varSigma}{\mathord}{letters}{"06} + \DeclareMathSymbol{\varUpsilon}{\mathord}{letters}{"07} + \DeclareMathSymbol{\varPhi}{\mathord}{letters}{"08} + \DeclareMathSymbol{\varPsi}{\mathord}{letters}{"09} + \DeclareMathSymbol{\varOmega}{\mathord}{letters}{"0A} +}{} +% \end{macrocode} +% +% \amstex/ redefines \cn{overline} as shown here, for reasons that +% are probably less important in \latex/: Make it read its argument +% as a macro argument rather than a ``math field'' (\emph{The +% \tex/book}, Chapter 26), to avoid problems when something that is +% apparently a single symbol is actually a non-simple macro (e.g., +% \cn{dag}) \emph{and} is given as a single-token argument without +% enclosing braces. +% \begin{macrocode} +\@saveprimitive\overline\@@overline +\DeclareRobustCommand{\overline}[1]{\@@overline{#1}} +% \end{macrocode} +% +% The \cs{boxed} command is specifically intended to put a box around +% an equation or piece of an equation. (Not including the equation +% number.) This isn't trivial for end-users to do it properly +% with \cs{fbox} so we provide a command for them. +% \begin{macrocode} +\newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\implies}{\DOTSB\;\Longrightarrow\;} +\newcommand{\impliedby}{\DOTSB\;\Longleftarrow\;} +% \end{macrocode} +% +% \begin{macrocode} +\def\And{\DOTSB\;\mathchar"3026 \;} +% \end{macrocode} +% +% The command \cn{nobreakdash} is designed only for use before a +% hyphen or dash (|-|, |--|, or |---|). +% Setting the hyphen in a box and then unboxing it means that the +% normal penalty will not be added after it---and if the penalty is +% not there a break will not be taken (unless an explicit penalty +% or glue follows, thus the final \verb=\nobreak=). +% \begin{macrocode} +\newcommand{\nobreakdash}{\leavevmode + \toks@\@emptytoks \def\@tempa##1{\toks@\@xp{\the\toks@-}\FN@\next@}% + \DN@{\ifx\@let@token-\@xp\@tempa + \else\setboxz@h{\the\toks@\nobreak}\unhbox\z@\fi}% + \FN@\next@ +} +% \end{macrocode} +% +% \cs{colon} is for a colon in math that resembles a text colon: +% small space on the left, larger space on the right. The \qc{\:} +% character by itself is treated as a \cs{mathrel} i.e. large, equal +% spacing on both sides. +% \begin{macrocode} +\renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript + \mkern-\thinmuskip{:}\mskip6muplus1mu\relax} +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Ellipsis dots} +% +% We can't use \cs{newif} for \cs{ifgtest@} because we want +% to include \cs{global} in the definitions of +% \cs{gtest@true} and \cs{gtest@false}. +% \begin{macrocode} +\let\ifgtest@\iffalse % initial value +\def\gtest@true{\global\let\ifgtest@\iftrue} +\def\gtest@false{\global\let\ifgtest@\iffalse} +\let\DOTSI\relax +\let\DOTSB\relax +\let\DOTSX\relax +{\uccode`7=`\\ \uccode`8=`m \uccode`9=`a \uccode`0=`t \uccode`!=`h + \uppercase{% + \gdef\math@#1#2#3#4#5#6\math@{\gtest@false\ifx 7#1\ifx 8#2% + \ifx 9#3\ifx 0#4\ifx !#5\xdef\meaning@{#6}\gtest@true + \fi\fi\fi\fi\fi}}} +{\uccode`7=`c \uccode`8=`h \uccode`9=`\" + \uppercase{\gdef\mathch@#1#2#3#4#5#6\mathch@{\gtest@false + \ifx 7#1\ifx 8#2\ifx 9#5\gtest@true\xdef\meaning@{9#6}\fi\fi\fi}}} +\newcount\classnum@ +\def\getmathch@#1.#2\getmathch@{\classnum@#1 \divide\classnum@4096 + \ifcase\number\classnum@\or\or\gdef\thedots@{\dotsb@}\or + \gdef\thedots@{\dotsb@}\fi} +{\uccode`4=`b \uccode`5=`i \uccode`6=`n + \uppercase{\gdef\mathbin@#1#2#3{\relaxnext@ + \def\nextii@##1\mathbin@{\ifx\@sptoken\@let@token\gtest@true\fi}% + \gtest@false\DN@##1\mathbin@{}% + \ifx 4#1\ifx 5#2\ifx 6#3\DN@{\FN@\nextii@}\fi\fi\fi\next@}}} +{\uccode`4=`r \uccode`5=`e \uccode`6=`l + \uppercase{\gdef\mathrel@#1#2#3{\relaxnext@ + \def\nextii@##1\mathrel@{\ifx\@sptoken\@let@token\gtest@true\fi}% + \gtest@false\DN@##1\mathrel@{}% + \ifx 4#1\ifx 5#2\ifx 6#3\DN@{\FN@\nextii@}\fi\fi\fi\next@}}} +{\uccode`5=`m \uccode`6=`a \uccode`7=`c + \uppercase{\gdef\macro@#1#2#3#4\macro@{\gtest@false + \ifx 5#1\ifx 6#2\ifx 7#3\gtest@true + \xdef\meaning@{\macro@@#4\macro@@}\fi\fi\fi}}} +\def\macro@@#1->#2\macro@@{#2} +\newcount\DOTSCASE@ +{\uccode`6=`\\ \uccode`7=`D \uccode`8=`O \uccode`9=`T \uccode`0=`S + \uppercase{\gdef\DOTS@#1#2#3#4#5{\gtest@false\DN@##1\DOTS@{}% + \ifx 6#1\ifx 7#2\ifx 8#3\ifx 9#4\ifx 0#5\let\next@\DOTS@@ + \fi\fi\fi\fi\fi + \next@}}} +{\uccode`3=`B \uccode`4=`I \uccode`5=`X + \uppercase{\gdef\DOTS@@#1{\relaxnext@ + \def\nextii@##1\DOTS@{\ifx\@sptoken\@let@token\gtest@true\fi}% + \DN@{\FN@\nextii@}% + \ifx 3#1\global\DOTSCASE@\z@\else + \ifx 4#1\global\DOTSCASE@\@ne\else + \ifx 5#1\global\DOTSCASE@\tw@\else\DN@##1\DOTS@{}% + \fi\fi\fi\next@}}} +{\uccode`5=`\\ \uccode`6=`n \uccode`7=`o \uccode`8=`t + \uppercase{\gdef\not@#1#2#3#4{\relaxnext@ + \def\nextii@##1\not@{\ifx\@sptoken\@let@token\gtest@true\fi}% + \gtest@false\DN@##1\not@{}% + \ifx 5#1\ifx 6#2\ifx 7#3\ifx 8#4\DN@{\FN@\nextii@}\fi\fi\fi + \fi\next@}}} +\def\keybin@{\gtest@true + \ifx\@let@token+\else\ifx\@let@token=\else + \ifx\@let@token<\else\ifx\@let@token>\else + \ifx\@let@token-\else\ifx\@let@token*\else\ifx\@let@token:\else + \gtest@false\fi\fi\fi\fi\fi\fi\fi} +% \end{macrocode} +% Patch to ensure \cs{@ldots} is defined. (Name changed to +% \cn{mathellipsis} in Dec 94 release of \latex/.) +% \begin{macrocode} +\@ifundefined{@ldots}{\def\@ldots{\mathellipsis}}{} +% \end{macrocode} +% Reiterate the standard definition of \cs{ldots} to keep it from +% being clobbered by the redefinition of \cs{dots}. +% \begin{macrocode} +\DeclareRobustCommand{\ldots}{% + \ifmmode \mathellipsis \else \textellipsis \fi +} +\DeclareRobustCommand{\dots}{% + \ifmmode \@xp\mdots@\else \@xp\textellipsis \fi +} +\def\tdots@{\leavevmode\unskip\relaxnext@ + \DN@{$\m@th\@ldots\, + \ifx\@let@token,\,$\else\ifx\@let@token.\,$\else + \ifx\@let@token;\,$\else\ifx\@let@token:\,$\else + \ifx\@let@token?\,$\else\ifx\@let@token!\,$\else + $ \fi\fi\fi\fi\fi\fi}% + \ \FN@\next@} +\def\mdots@{\FN@\mdots@@} +\def\mdots@@{\gdef\thedots@{\dotso@}% + \ifx\@let@token\boldsymbol \gdef\thedots@\boldsymbol{\boldsymboldots@}% + \else\ifx,\@let@token \gdef\thedots@{\dotsc}% + \else\ifx\not\@let@token \gdef\thedots@{\dotsb@}% + \else\keybin@ + \ifgtest@\gdef\thedots@{\dotsb@}% + \else\xdef\meaning@{\meaning\@let@token..........}% + \xdef\meaning@@{\meaning@}% + \@xp\math@\meaning@\math@ + \ifgtest@ + \@xp\mathch@\meaning@\mathch@ + \ifgtest@\@xp\getmathch@\meaning@\getmathch@\fi + \else\@xp\macro@\meaning@@\macro@ + \ifgtest@ + \@xp\not@\meaning@\not@\ifgtest@\gdef\thedots@{\dotsb@}% + \else\@xp\DOTS@\meaning@\DOTS@ + \ifgtest@ + \ifcase\number\DOTSCASE@\gdef\thedots@{\dotsb@}% + \or\gdef\thedots@{\dotsi}\else\fi + \else\@xp\math@\meaning@\math@ + \ifgtest@\@xp\mathbin@\meaning@\mathbin@ + \ifgtest@\gdef\thedots@{\dotsb@}% + \else\@xp\mathrel@\meaning@\mathrel@ + \ifgtest@\gdef\thedots@{\dotsb@}% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \thedots@} +% \end{macrocode} +% +% The \qc{\=} character is necessary in the two \cs{let} assignments +% in \cs{boldsymboldots@}, because the symbol we are making +% bold might be an \qc{\=} sign. +% \begin{macrocode} +\def\boldsymboldots@#1{% + \bold@true\let\@let@token=#1\let\delayed@=#1\mdots@@ + \boldsymbol#1\bold@false} +% \end{macrocode} +% +% The definition of \cs{@cdots} is merely the \fn{plain.tex} +% definition of \cs{cdots}. +% \begin{macrocode} +\def\@cdots{\mathinner{\cdotp\cdotp\cdotp}} +\newcommand{\dotsi}{\!\@cdots} +\let\dotsb@\@cdots +% \end{macrocode} +% +% If any new right delimiters are defined, they would need to be +% added to the definition of \cs{rightdelim@} in order for \cn{dots} +% to work properly in all cases. +% \begin{macrocode} +\def\rightdelim@{\gtest@true + \ifx\@let@token)\else + \ifx\@let@token]\else + \ifx\@let@token\rbrack\else + \ifx\@let@token\}\else + \ifx\@let@token\rbrace\else + \ifx\@let@token\rangle\else + \ifx\@let@token\rceil\else + \ifx\@let@token\rfloor\else + \ifx\@let@token\rgroup\else + \ifx\@let@token\rmoustache\else + \ifx\@let@token\right\else + \ifx\@let@token\bigr\else + \ifx\@let@token\biggr\else + \ifx\@let@token\Bigr\else + \ifx\@let@token\Biggr\else\gtest@false + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} +\def\extra@{% + \rightdelim@\ifgtest@ + \else\ifx\@let@token$\gtest@true + \else\xdef\meaning@{\meaning\@let@token..........}% + \@xp\macro@\meaning@\macro@\ifgtest@ + \@xp\DOTS@\meaning@\DOTS@ + \ifgtest@ + \ifnum\DOTSCASE@=\tw@\gtest@true\else\gtest@false + \fi\fi\fi\fi\fi} +\newif\ifbold@ +\def\dotso@{\relaxnext@ + \ifbold@ + \let\@let@token\delayed@ + \def\nextii@{\extra@\@ldots\ifgtest@\,\fi}% + \else + \def\nextii@{\DN@{\extra@\@ldots\ifgtest@\,\fi}\FN@\next@}% + \fi + \nextii@} +% \end{macrocode} +% Why not save some tokens? (space vs. time). +% \begin{macrocode} +\def\extrap@#1{% + \DN@{#1\,}% + \ifx\@let@token,\else + \ifx\@let@token;\else + \ifx\@let@token.\else\extra@ + \ifgtest@\else + \let\next@#1\fi\fi\fi\fi\next@} +% \end{macrocode} +% +% The \cn{cdots} command. +% \begin{macrocode} +\DeclareRobustCommand{\cdots}{\DN@{\extrap@\@cdots}\FN@\next@} +\let\dotsb\cdots +\let\dotsm\cdots +\DeclareRobustCommand{\dotso}{\relax + \ifmmode \DN@{\extrap@\@ldots}% + \else \let\next@\tdots@\fi + \FN@\next@} +\DeclareRobustCommand{\dotsc}{% + \DN@{\ifx\@let@token;\@ldots\,% + \else \ifx\@let@token.\@ldots\,% + \else \extra@\@ldots \ifgtest@\,\fi + \fi\fi}% + \FN@\next@} +\renewcommand{\longrightarrow}{% + \DOTSB\protect\relbar\protect\joinrel\rightarrow} +\renewcommand{\Longrightarrow}{% + \DOTSB\protect\Relbar\protect\joinrel\Rightarrow} +\renewcommand{\longleftarrow}{% + \DOTSB\leftarrow\protect\joinrel\protect\relbar} +\renewcommand{\Longleftarrow}{% + \DOTSB\Leftarrow\protect\joinrel\protect\Relbar} +\renewcommand{\longleftrightarrow}{\DOTSB\leftarrow\joinrel\rightarrow} +\renewcommand{\Longleftrightarrow}{\DOTSB\Leftarrow\joinrel\Rightarrow} +\renewcommand{\mapsto}{\DOTSB\mapstochar\rightarrow} +\renewcommand{\longmapsto}{\DOTSB\mapstochar\longrightarrow} +\renewcommand{\hookrightarrow}{\DOTSB\lhook\joinrel\rightarrow} +\renewcommand{\hookleftarrow}{\DOTSB\leftarrow\joinrel\rhook} +\renewcommand{\iff}{\DOTSB\;\Longleftrightarrow\;} +% \end{macrocode} +% The \cn{doteq} command formerly used \cs{buildrel}; we avoid that +% because it requires `\cn{over}' as part of its syntax. Use 0pt +% instead of \cs{z@} for robustitude. +% \begin{macrocode} +\renewcommand{\doteq}{% + \DOTSB\mathrel{\mathop{\kern0pt =}\limits^{\textstyle.}}} +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Integral signs} +% +% The straightforward \cs{ifinner} test to see if the current math +% context is non-display, fails if, for instance, we are typesetting +% a multiline display within an \cs{halign}, with the pieces going +% into constructions like +% \begin{verbatim} +% $\displaystyle...$ +% \end{verbatim} +% So we need a better test to find out if we are `in a display'. We +% therefore create \cs{if@display}. +% +% \begin{macrocode} +\newif\if@display +\everydisplay\@xp{\the\everydisplay \@displaytrue} +% \end{macrocode} +% +% Default value for integral limits is \cs{nolimits}, see the +% definition of the `nointlimits' option. +% \begin{macrocode} +\renewcommand{\int}{\DOTSI\intop\ilimits@} +\renewcommand{\oint}{\DOTSI\ointop\ilimits@} +\def\intkern@{\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}} +\def\intdots@{\mathchoice{\@cdots}% + {{\cdotp}\mkern1.5mu{\cdotp}\mkern1.5mu{\cdotp}}% + {{\cdotp}\mkern1mu{\cdotp}\mkern1mu{\cdotp}}% + {{\cdotp}\mkern1mu{\cdotp}\mkern1mu{\cdotp}}} +% +\newcommand{\iint}{\DOTSI\protect\MultiIntegral{2}} +\newcommand{\iiint}{\DOTSI\protect\MultiIntegral{3}} +\newcommand{\iiiint}{\DOTSI\protect\MultiIntegral{4}} +\newcommand{\idotsint}{\DOTSI\protect\MultiIntegral{0}} +% \end{macrocode} +% +% If the \cs{limits} option is applied, use \cs{mathop} and fudge +% the left-hand space a bit to make the subscript visually centered. +% +% \verb'#1' is the multiplicity. +% \begin{macrocode} +\newcommand{\MultiIntegral}[1]{% + \edef\ints@c{\noexpand\intop + \ifnum#1=\z@\noexpand\intdots@\else\noexpand\intkern@\fi + \ifnum#1>\tw@\noexpand\intop\noexpand\intkern@\fi + \ifnum#1>\thr@@\noexpand\intop\noexpand\intkern@\fi + \noexpand\intop + \noexpand\ilimits@ + }% + \futurelet\@let@token\ints@a +} +% \end{macrocode} +% +% \begin{macrocode} +\def\ints@a{% + \ifx\limits\@let@token \ints@b + \else \ifx\displaylimits\@let@token \ints@b + \else\ifx\ilimits@\displaylimits \ints@b + \fi\fi\fi + \ints@c +} +% \end{macrocode} +% +% \begin{macrocode} +\def\ints@b{% + \mkern-7mu\mathchoice{\mkern-2mu}{}{}{}% + \mathop\bgroup + \mkern7mu\mathchoice{\mkern2mu}{}{}{}% + \let\ilimits@\egroup +}% +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Size dependent definitions} +% +% We now define all stuff which has to change whenever a new math +% size is to be activated. \latex/ provides a hook called +% |\every@math@size| to support such a need. All assignments in the +% |\every@math@size| hook that need to take outside effect should be +% global. +% +% \subsection{Struts for math} +% +% The various kinds of struts could use some analysis and perhaps +% consolidation. +% +% For example perhaps the \cn{bBigg} delimiters could use +% \begin{verbatim} +% 1.2\ht\strutbox (1.8, 2.4, 3.0) +% \end{verbatim} +% instead of +% \begin{verbatim} +% 1.0\big@size (1.5, 2.0, 2.5) +% \end{verbatim} +% since \cs{strut} is reset with every size change [mjd, 1994/10/07]. +% But this change would introduce the possibility of changed line +% and page breaks in existing documents, so would need to be +% handled with care. +% +% \begin{macro}{\Mathstrut@} +% \begin{macro}{\Mathstrutbox@} +% \begin{macro}{\resetMathstrut@} +% Here comes the code for Spivak's |\Mathstrut@|. +% \begin{macrocode} +\newbox\Mathstrutbox@ +\setbox\Mathstrutbox@=\hbox{} +\def\Mathstrut@{\copy\Mathstrutbox@} +% \end{macrocode} +% The setting of the height and depth of the |\Mathstrutbox@| is done +% in the |\every@math@size| hook since it depends on the height of a +% paren. As \cs{every@math@size} is triggered by |$| after a font +% size change, we want to avoid using another math formula |$...$| to +% measure the math paren height; instead we go through the mathcode +% of the \qc{\(} character. We assume that the mathcode has a leading +% hex digit 4 indicating `open delimiter'; this allows us to make a +% relatively simple function to get the correct font and character +% position. +% \begin{macrocode} +\def\resetMathstrut@{% + \setbox\z@\hbox{% + \mathchardef\@tempa\mathcode`\(\relax + \def\@tempb##1"##2##3{\the\textfont"##3\char"}% + \expandafter\@tempb\meaning\@tempa \relax + }% +% \end{macrocode} +% These height and depth assignments are implicitly global. +% \begin{macrocode} + \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@ +} +\addto@hook\every@math@size{\resetMathstrut@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\strut@} +% \begin{macro}{\strutbox@} +% Next follows a special internal strut which is supposed to match +% the height and the depth of a normal |\strut| minus +% |\normallineskiplimit| according to M. Spivak. +% +% This should really go into the definition of \cs{size@update}, and +% then the box reset could be local; but \cs{size@update} doesn't +% have any hook and is handled in such a way that it cannot even be +% changed except by changing \cs{set@fontsize}. So instead we put +% \cs{reset@strutbox@} into \cs{every@math@size} and make it global. +% Then because of some complications in the way \cs{glb@settings} and +% \cs{check@mathfonts} work, we have to re-invoke it at the beginning +% of every environment that might use \cs{strut@}. Fortunately this +% can be achieved (more or less) through the \cs{spread@equation} +% hook. [mjd,2000/03/10] +% \begin{macrocode} +\newbox\strutbox@ +\def\strut@{\copy\strutbox@} +\def\reset@strutbox@{% + \global\setbox\strutbox@\hbox{% + \lower.5\normallineskiplimit + \vbox{\kern-\normallineskiplimit\copy\strutbox}}} +\addto@hook\every@math@size{\reset@strutbox@} +\AtBeginDocument{\reset@strutbox@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Big delimiters} +% +% We are now going to redefine the plain \tex/ commands \cn{big}, +% \cn{bigl}, etc., to produce different results in different sizes. +% Actually we only have to define \cn{big}, \cn{Big}, etc., since +% they are used to construct the directional versions \cn{bigl}, +% \cn{bigr}, and the rest. +% +% \begin{macro}{\big} +% \begin{macro}{\Big} +% \begin{macro}{\bigg} +% \begin{macro}{\Bigg} +% To save token space we put everything into the common macro +% |\bBigg@|. The macros are now simply a call to |\bBigg@| with a +% factor to determine the correct height of the delimiter as an +% argument. This code should better go into a future version of +% the \latex/ kernel; the macro |\n@space| is then superfluous (since +% it is only used once) and should be removed to avoid wasting hash +% table space unnecessarily. +% \begin{macrocode} +\renewcommand{\big}{\bBigg@\@ne} +\renewcommand{\Big}{\bBigg@{1.5}} +\renewcommand{\bigg}{\bBigg@\tw@} +\renewcommand{\Bigg}{\bBigg@{2.5}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bBigg@} +% Now we tackle the macro which has to do the real work. It +% actually has two arguments, the factor and the wanted delimiter. +% \begin{macrocode} +\def\bBigg@#1#2{% +% \end{macrocode} +% We start with an extra set of braces because we want +% constructions like |\def\bigl{\mathopen\big}| to work without the +% overhead of extra arguments. +% \begin{macrocode} + {\@mathmeasure\z@{\nulldelimiterspace\z@}% + {\left#2\vcenter to#1\big@size{}\right.}% + \box\z@}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\big@size} +% |\big@size| needs to be set to 1.2 times the height of a math +% paren. This height is already recorded in |\Mathstrutbox@|. +% \begin{macrocode} +\addto@hook\every@math@size{% + \global\big@size 1.2\ht\Mathstrutbox@ + \global\advance\big@size 1.2\dp\Mathstrutbox@ } +\newdimen\big@size +% \end{macrocode} +% \end{macro} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Math accents} +% +% We want to change the leading digit of math accents to be +% \cs{accentclass@} so that it can vary according to certain internal +% purposes. +% \begin{macrocode} +\def\accentclass@{7} +\def\noaccents@{\def\accentclass@{0}} +% \end{macrocode} +% +% There are a few \meta{math alphabet}s in the standard fonts where +% we have to change the extra macros because the standard definitions +% don't account for these accent problems. The first is for the +% \cs{mathit} command. +% \begin{macrocode} +\DeclareFontEncoding{OML}{}{\noaccents@} +% \end{macrocode} +% The next one corrects the \cs{cal} alphabet. +% \begin{macrocode} +\DeclareFontEncoding{OMS}{}{\noaccents@} +% \end{macrocode} +% +% Triple and quadruple dot accents. +% \begin{macrocode} +\newcommand{\dddot}[1]{% + {\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@ + \hbox{\normalfont ...}\vss}}}} +\newcommand{\ddddot}[1]{% + {\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@ + \hbox{\normalfont....}\vss}}}} +% \end{macrocode} +% +% The following code deals with support for compound accents. +% By redefining \cs{set@mathaccent} we ensure that +% \cn{DeclareMathAccent} will define accent commands to run our +% \cs{mathaccentV} function instead of the primitive \cs{mathaccent}. +% \begin{macrocode} +\def\set@mathaccent#1#2#3#4{% + \xdef#2{\@nx\protect\@nx\mathaccentV + {\@xp\@gobble\string#2}\hexnumber@#1#4}% +} +% \end{macrocode} +% +% We redefine the standard math accent commands to +% call \cs{mathaccentV}, using the mathgroup/encoding-number +% information embedded in their previous definitions. If the +% definition of an accent command does not have the expected form, we +% leave the accent command alone, but give a warning. For widehat and +% widetilde, we need to avoid clobbering the definitions done by the +% \pkg{amsfonts} package. Arbitrating the contention between +% \pkg{amsmath} and \pkg{amsfonts} to allow doubling a widetilde +% accent looks tricky, so for the time being [mjd,1999/07/19] we just +% leave \cn{widehat} and \cn{widetilde} alone. As a result, if the +% \pkg{amsmath} package is loaded on top of a vanilla \latex/ +% documentclass, everything runs through with no warnings. If a +% Lucida Math or other math fonts package is loaded in addition to +% \pkg{amsmath}, there are greater difficulties, but those are +% addressed elsewhere. +% \begin{macrocode} +\def\@tempa#1{\@xp\@tempb\meaning#1\@nil#1} +\def\@tempb#1>#2#3 #4\@nil#5{% + \@xp\ifx\csname#3\endcsname\mathaccent + \@tempc#4?"7777\@nil#5% + \else + \PackageWarningNoLine{amsmath}{% + Unable to redefine math accent \string#5}% + \fi +} +\def\@tempc#1"#2#3#4#5#6\@nil#7{% + \chardef\@tempd="#3\relax\set@mathaccent\@tempd{#7}{#2}{#4#5}} +\@tempa{\hat} +\@tempa{\check} +\@tempa{\tilde} +\@tempa{\acute} +\@tempa{\grave} +\@tempa{\dot} +\@tempa{\ddot} +\@tempa{\breve} +\@tempa{\bar} +\@tempa{\vec} +\@ifundefined{mathring}{% + \DeclareMathAccent{\mathring}{\mathalpha}{operators}{"17} +}{% + \@tempa{\mathring} +} +%%\@tempa\widetilde +%%\@tempa\widehat +% \end{macrocode} +% +% Regression testing of amsmath 2.0 showed that in some documents +% there occurred fragments of the form +% \begin{verbatim} +% \hat\mathcal{G} +% \end{verbatim} +% This is not at all correct syntax for the argument of a \latex/ +% command but it produced the intended result anyway because of the +% internal syntax of the \cs{mathaccent} primitive. With +% \cs{mathaccentV}, it will yield an error message. We therefore do a +% special check for such syntax problems in order to make the error +% message more informative. +% \begin{macrocode} +\newcommand{\acc@check}{} +\newcommand{\acc@error}{} +\def\acc@check{\@ifnextchar\@empty\relax\acc@error} +% \end{macrocode} +% We put most of the tokens in a separate macro so they do not get +% scanned unless they are actually needed. +% \begin{macrocode} +\def\acc@error{% + \@amsmath@err{% + Improper argument for math accent:\MessageBreak + Extra braces must be added to prevent wrong output% + }\@ehc +} +% \end{macrocode} +% +% For \cs{mathaccentV} part of the processing is dependent on the +% depth of nesting of math accent commands. We introduce a dedicated +% counter for this instead of using chardef because we want to +% increment/decrement it during processing, and incrementing a +% chardef integer is more work. +% \begin{macrocode} +\newcount\macc@depth +% \end{macrocode} +% +% Provide this function in case it is not already available. +% \begin{macrocode} +\long\def\@gobblethree#1#2#3{} +% \end{macrocode} +% +% The \cs{mathaccentV} function first counts the number of nested +% math accents by setting the argument in a throw-away box. (This is +% not as risky as such an operation would normally be because the +% argument is generally either a simple math symbol or a nested math +% accent call with a simple math symbol at the bottom of the +% nesting.) +% +% There are two benefits from counting the nesting levels first +% before doing anything else: (1) we can fall back to a simple +% \cs{mathaccent} call if the nesting depth is 1, and (2) if the +% nesting depth is greater than 1, we would like to be able to tell +% when we have reached the lowest level, because at that point we +% want to save the argument for later use and place an accent on top +% of a phantom copy. +% +% When we have multiple accents, they will be placed on top of the +% invisible box, followed by some suitable kerns, then a visible copy +% of the nucleus. To see why, let us look at what goes wrong with a +% double application of the \cs{mathaccent} primitive. The standard +% definition of \cs{hat} is \verb'\mathaccent"705E', so +% \verb'\hat{\hat{F}}' expands to +%\begin{verbatim} +%\mathaccent"705E{\mathaccent"705E{F}} +%\end{verbatim} +% The result of this operation is +%\begin{verbatim} +%\vbox(12.11111+0.0)x7.81946 +%.\hbox(6.94444+0.0)x0.0, shifted 1.40973 +%..\OT1/cmr/m/n/10 ^ +%.\kern-4.30554 +%.\vbox(9.47221+0.0)x7.81946 +%..\hbox(6.94444+0.0)x0.0, shifted 2.24309 +%...\OT1/cmr/m/n/10 ^ +%..\kern-4.30554 +%..\hbox(6.83331+0.0)x7.81946 +%...\OML/cmm/m/it/10 F +%\end{verbatim} +% \tex/ starts by constructing a vbox with the hat character on top +% of the F. Then it puts another hat character on top of the vbox; +% but without skew information, because that is only applied by +% \cs{mathaccent} when the base object is a simple symbol. So the +% first accent is skewed to the correct position but all later +% accents are not. By the way, the actual width of the F in the above +% example is less than 7.81946; the box in which it is packed was +% automatically lengthened by the width of the F's italic correction +% (without actually putting in a kern for it). +% +% To get the second accent shifted farther to the right we +% artificially increase the width of the innermost box and add +% a compensating kern afterward. Furthermore, to get proper placement +% of a following subscript or superscript, we take the base symbol +% out, leaving a phantom in its place, and print it by itself +% following the kern. We then need to increase the kern amount to +% move the base character backward under the accents again. +% Here is what the results look like: +%\begin{verbatim} +%\vbox(12.11111+0.0)x9.48618 +%.\hbox(6.94444+0.0)x0.0, shifted 2.24309 +%..\OT1/cmr/m/n/10 ^ +%.\kern-4.30554 +%.\vbox(9.47221+0.0)x9.48618 +%..\hbox(6.94444+0.0)x0.0, shifted 2.24309 +%...\OT1/cmr/m/n/10 ^ +%..\kern-4.30554 +%..\hbox(6.83331+0.0)x9.48618 +%...\hbox(6.83331+0.0)x7.81946 +%...\kern 1.66672 +%\kern -9.48618 +%\OML/cmm/m/it/10 F +%\end{verbatim} +% +% Much of this implementation is based on code from the \pkg{accents} +% package of Javier Bezos. I added the test to revert to a simple +% \cs{mathaccent} when accents are not nested, and some other +% refinements to reduce the number of kerns used (to conserve box +% memory) and the number of cycles through \cs{mathchoice} (to make +% things run a little faster). It was all rather difficult and my +% first two attempts had serious bugs but I hope and believe that +% this version will do better. [mjd,2000/03/15] +% +% The \qq{V} in \cs{mathaccentV} is just an indication that it takes +% five arguments. It is important that the name includes +% \texttt{mathaccent}, otherwise \cs{DeclareMathAccent} will balk at +% redefining one of our accent commands, for example when an +% alternative math font package is loaded. +% \begin{macrocode} +\def\mathaccentV#1#2#3#4#5{% + \ifmmode + \gdef\macc@tmp{\macc@depth\@ne}% + \setbox\z@\hbox{% + \let\mathaccentV\macc@test + \let\use@mathgroup\@gobbletwo \let\select@group\@gobblethree + \frozen@everymath{}$#5$% + }% + \macc@tmp + \ifnum\macc@depth=\@ne + \global\let\macc@nucleus\@empty + \mathaccent"\accentclass@ + \else + \@xp\macc@nested + \fi + #2#3#4{#5}% + \macc@nucleus + \else + \@xp\nonmatherr@\csname#1\endcsname + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\def\macc@test#1#2#3#4{\xdef\macc@tmp{\macc@tmp\advance\macc@depth\@ne}} +% \end{macrocode} +% +% \begin{macrocode} +\def\macc@group{-1} +% \end{macrocode} +% +% \begin{macrocode} +\def\macc@nested#1#2#3#4{% + \begingroup + \let\math@bgroup\@empty \let\math@egroup\macc@set@skewchar + \mathsurround\z@ \frozen@everymath{\mathgroup\macc@group\relax}% + \macc@set@skewchar\relax + \let\mathaccentV\macc@nested@a + \macc@nested@a\relax#1#2#3{#4}% + \endgroup +} +% \end{macrocode} +% +% \begin{macrocode} +\let\macc@palette\mathpalette +% \end{macrocode} +% +% \begin{macrocode} +\def\macc@nested@a#1#2#3#4#5{% +% \end{macrocode} +% This test saves some work that would otherwise be always repeated +% fourfold thanks to \cs{mathchoice}. +% \begin{macrocode} + \ifnum\macc@group=\mathgroup + \else \macc@set@skewchar\relax \edef\macc@group{\the\mathgroup}% + \fi + \mathchardef\macc@code "\accentclass@ #2#3#4\relax + \macc@palette\macc@a{#5}% +} +% \end{macrocode} +% +% The reason that \cs{macc@set@skewchar} takes an argument is so that +% it can serve as a direct substitute for \cs{math@egroup}, in +% addition to being used separately. +% +% Setting a skewchar with this method works for symbols of variable +% mathgroup (class 7, letters and numbers) but not necessarily for +% special symbols like \cn{partial} or \cs{xi} whose mathgroup +% doesn't change; fortunately the most commonly used ones come from +% mathgroup one, which is the fall-back mathgroup for skewchar. +% \begin{macrocode} +\def\macc@set@skewchar#1{% + \begingroup + \ifnum\mathgroup=\m@ne \let\@tempa\@ne + \else + \ifnum\skewchar\textfont\mathgroup=\m@ne \let\@tempa\@ne + \else \let\@tempa\mathgroup + \fi + \fi + \count@=\skewchar\textfont\@tempa + \advance\count@"7100 + \edef\@tempa{\endgroup + \mathchardef\noexpand\macc@skewchar=\number\count@\relax}% + \@tempa + #1% +} +% \end{macrocode} +% +% Arg1 is math-style, arg2 is accent base object. We assume that math +% style doesn't change within the nested group of accents; this means +% we can set \cs{macc@style} only once and redefine \cs{macc@palette} +% to use it, in order to run \cs{mathchoice} only once instead of +% multiplying the calls exponentially as the nesting level increases. +% \begin{macrocode} +\def\macc@a#1#2{% + \begingroup + \let\macc@style#1\relax + \def\macc@palette##1{##1\macc@style}% + \advance\macc@depth\m@ne + \ifnum\macc@depth=\z@ + \gdef\macc@nucleus{#2}% +% \end{macrocode} +% Extra \cs{@empty} tokens are to prevent low-level \tex/ errors from +% the potential syntactic error that \cs{acc@check} checks for. +% \begin{macrocode} + \setbox\z@\hbox{$#1#2\@empty{}\macc@skewchar$}% + \setbox\tw@\hbox{$#1#2\@empty\macc@skewchar$}% + \dimen@\tw@\wd\tw@ \advance\dimen@-\tw@\wd\z@ + \xdef\macc@kerna{\the\dimen@\relax}% + \setbox4\hbox{$#1#2\acc@check\@empty$}% + \global\setbox\@ne\hbox to\wd4{}% + \ht\@ne\ht4 \dp\@ne\dp4 + \xdef\macc@kernb{\the\wd4\relax}% + \mathaccent\macc@code{\box\@ne\kern\macc@kerna}% + \else + \mathaccent\macc@code{\let\macc@adjust\@empty #1#2\@empty}% + \macc@adjust + \fi + \endgroup +} +% \end{macrocode} +% +% \begin{macrocode} +\def\macc@adjust{% + \dimen@\macc@kerna\advance\dimen@\macc@kernb + \kern-\dimen@ +} +% \end{macrocode} +% +% The commands \cs{Hat}, \cs{Tilde}, \ldots, are supported as +% synonyms of \cs{hat}, \cs{tilde}, \ldots, for backward +% compatibility. +% \begin{macrocode} +\def\Hat{\hat} +\def\Check{\check} +\def\Tilde{\tilde} +\def\Acute{\acute} +\def\Grave{\grave} +\def\Dot{\dot} +\def\Ddot{\ddot} +\def\Breve{\breve} +\def\Bar{\bar} +\def\Vec{\vec} +% \end{macrocode} +% +% This error message about math mode is used several times so we make +% an abbreviation for it. +% \begin{macrocode} +\def\nonmatherr@#1{\@amsmath@err{\protect + #1 allowed only in math mode}\@ehd} +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Mods, continued fractions, etc.} +% +% The commands \cn{bmod}, \cn{pmod}, \cn{pod}, \cn{mod} aren't +% currently robust. [mjd, 1994/09/05] +% \begin{macrocode} +\renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin + {\operator@font mod}\penalty900 + \mkern5mu\nonscript\mskip-\medmuskip} +\newcommand{\pod}[1]{\allowbreak + \if@display\mkern18mu\else\mkern8mu\fi(#1)} +\renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} +\newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu + \else\mkern12mu\fi{\operator@font mod}\,\,#1} +% \end{macrocode} +% +% Continued fractions. The optional arg l or r controls horizontal +% placement of the numerators. The |\kern-\nulldelimiterspace| +% is needed in the definition if we want the right-hand sides of the +% fraction rules to line up. The \cs{strut} keeps the numerator of +% a subsidiary cfrac from coming too close to the fraction rule above +% it. +% \begin{macrocode} +\newcommand{\cfrac}[3][c]{{\displaystyle\frac{% + \strut\ifx r#1\hfill\fi#2\ifx l#1\hfill\fi}{#3}}% + \kern-\nulldelimiterspace} +% \end{macrocode} +% +% \cn{overset} and \cn{underset} put symbols above, respectively +% below, a symbol that is not a \cs{mathop} and therefore does not +% naturally accept limits. \cs{binrel@@} uses information collected +% by \cs{binrel@} to make the resulting construction be of type +% mathrel or mathbin if the base symbol is either of those types. +% \begin{macrocode} +\newcommand{\overset}[2]{\binrel@{#2}% + \binrel@@{\mathop{\kern\z@#2}\limits^{#1}}} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\underset}[2]{\binrel@{#2}% + \binrel@@{\mathop{\kern\z@#2}\limits_{#1}}} +% \end{macrocode} +% +% \cn{sideset} allows placing `adscript' symbols at the four +% corners of a \cs{mathop}, \emph{in addition to} limits. Left-side +% adscripts go into arg \arg{1}, in the form |_{...}^{...}|, and +% right-side adscripts go into arg \arg{2}. +% +% As currently written [mjd, 1995/01/21] this is pretty haphazard. +% In order to really make it work properly in full generality we'd +% have to read and measure the top and bottom limits and use +% mathchoice to always get the right mathstyle for each piece, +% etc., etc. +% \begin{macrocode} +\newcommand{\sideset}[3]{% + \@mathmeasure\z@\displaystyle{#3}% +% \end{macrocode} +% Use a global box assignment here since the depth override is +% implicitly global. Then move the constructed box to a local box +% register (2) to ensure it won't get destroyed during the next two +% mathmeasure statements. This precaution may be more extreme than +% necessary in practice. +% \begin{macrocode} + \global\setbox\@ne\vbox to\ht\z@{}\dp\@ne\dp\z@ + \setbox\tw@\box\@ne + \@mathmeasure4\displaystyle{\copy\tw@#1}% + \@mathmeasure6\displaystyle{#3\nolimits#2}% + \dimen@-\wd6 \advance\dimen@\wd4 \advance\dimen@\wd\z@ + \hbox to\dimen@{}\mathop{\kern-\dimen@\box4\box6}% +} +% \end{macrocode} +% +% \begin{macro}{\smash} +% We add to the \cn{smash} command an optional argument +% denoting the part of the formula to be smashed. +% \begin{macrocode} +\renewcommand{\smash}[1][tb]{% + \def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% + \edef\finsm@sh{\csname mb@#1\endcsname\z@\z@ \box\z@}% + \ifmmode \@xp\mathpalette\@xp\mathsm@sh + \else \@xp\makesm@sh + \fi +} +% \end{macrocode} +% \end{macro} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Extensible arrows} +% +% The minus sign used in constructing these arrow fills is smashed so +% that superscripts above the arrows won't be too high. This +% primarily affects the \cn{xleftarrow} and \cn{xrightarrow} arrows. +% +% \begin{macrocode} +\mathchardef\std@minus\mathcode`\-\relax +\mathchardef\std@equal\mathcode`\=\relax +% \end{macrocode} +% In case some alternative math fonts are loaded later: +% \begin{macrocode} +\AtBeginDocument{% + \mathchardef\std@minus\mathcode`\-\relax + \mathchardef\std@equal\mathcode`\=\relax +} +% \end{macrocode} +% +% \begin{macrocode} +\def\relbar{\mathrel{\mathpalette\mathsm@sh\std@minus}} +\def\Relbar{\mathrel\std@equal} +% \end{macrocode} +% +% \begin{macrocode} +\def\arrowfill@#1#2#3#4{% + $\m@th\thickmuskip0mu\medmuskip\thickmuskip\thinmuskip\thickmuskip + \relax#4#1\mkern-7mu% + \cleaders\hbox{$#4\mkern-2mu#2\mkern-2mu$}\hfill + \mkern-7mu#3$% +} +\def\leftarrowfill@{\arrowfill@\leftarrow\relbar\relbar} +\def\rightarrowfill@{\arrowfill@\relbar\relbar\rightarrow} +\def\leftrightarrowfill@{\arrowfill@\leftarrow\relbar\rightarrow} +\def\Leftarrowfill@{\arrowfill@\Leftarrow\Relbar\Relbar} +\def\Rightarrowfill@{\arrowfill@\Relbar\Relbar\Rightarrow} +\def\Leftrightarrowfill@{\arrowfill@\Leftarrow\Relbar\Rightarrow} +% \end{macrocode} +% +% \begin{macrocode} +\def\overarrow@#1#2#3{\vbox{\ialign{##\crcr#1#2\crcr + \noalign{\nointerlineskip}$\m@th\hfil#2#3\hfil$\crcr}}} +\renewcommand{\overrightarrow}{% + \mathpalette{\overarrow@\rightarrowfill@}} +\renewcommand{\overleftarrow}{% + \mathpalette{\overarrow@\leftarrowfill@}} +\newcommand{\overleftrightarrow}{% + \mathpalette{\overarrow@\leftrightarrowfill@}} +% \end{macrocode} +% +% \begin{macrocode} +\def\underarrow@#1#2#3{% + \vtop{\ialign{##\crcr$\m@th\hfil#2#3\hfil$\crcr + \noalign{\nointerlineskip\kern1.3\ex@}#1#2\crcr}}} +\newcommand{\underrightarrow}{% + \mathpalette{\underarrow@\rightarrowfill@}} +\newcommand{\underleftarrow}{% + \mathpalette{\underarrow@\leftarrowfill@}} +\newcommand{\underleftrightarrow}{% + \mathpalette{\underarrow@\leftrightarrowfill@}} +% \end{macrocode} +% +% \begin{macrocode} +%\newcommand{\xrightarrow}[2][]{\ext@arrow 0359\rightarrowfill@{#1}{#2}} +\def\ext@arrow#1#2#3#4#5#6#7{% + \mathrel{\mathop{% +% \end{macrocode} +% Measure the superscript and subscript. +% \begin{macrocode} + \setbox\z@\hbox{#5\displaystyle}% + \setbox\tw@\vbox{\m@th + \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}% + \hbox{$\scriptstyle\mkern#3mu{#7}\mkern#4mu$}% + \copy\z@ + }% + \hbox to\wd\tw@{\unhbox\z@}}% +% \end{macrocode} +% We don't want to place an empty subscript since that will produce +% too much blank space below the arrow. +% \begin{macrocode} + \limits + \@ifnotempty{#7}{^{\if0#1\else\mkern#1mu\fi + #7\if0#2\else\mkern#2mu\fi}}% + \@ifnotempty{#6}{_{\if0#1\else\mkern#1mu\fi + #6\if0#2\else\mkern#2mu\fi}}}% +} +% \end{macrocode} +% +% Some extensible arrows to serve as mathrels and taking +% sub/superscripts. These commands are robust because they take an +% optional argument. +% \begin{macrocode} +\newcommand{\xrightarrow}[2][]{\ext@arrow 0359\rightarrowfill@{#1}{#2}} +\newcommand{\xleftarrow}[2][]{\ext@arrow 3095\leftarrowfill@{#1}{#2}} +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Array-related environments} +% \subsection{Remarks} +% +% Because these environments can be nested within the equation +% structures that allow \cn{tag}, there is some cross-influence in +% the internal workings of the \cn{\\} command. +% +% \subsection{The \cn{substack} command} +% +% The \cn{substack} command can be used to set subscripts +% and superscripts that consist of several lines. Usage: +% \begin{verbatim} +% X_{\substack{a=1\\b=2}} +% \end{verbatim} +% +% \changes{v2.0}{1999/06/17}{Removed environment definitions: Sb, Sp} +% +% \begin{environment}{subarray} +% The \env{subarray} environment makes a small-size array suitable +% for use in a subscript or superscript. At the moment the supported +% arguments are not the full possibilities of \env{array} but only +% |c| or |l| for centered or left-aligned. And only one column. +% \begin{macrocode} +\newenvironment{subarray}[1]{% +% \end{macrocode} +% Note: The predecessors of \env{subarray} (\env{Sb} and \env{Sp}, +% inherited from \amstex/) used \cs{vbox} instead of \cs{vcenter}. +% But when a multiline subscript is placed in \cs{limits} position +% \cs{vcenter} is no worse than \cs{vbox}, and when it is placed +% in the \cs{nolimits} position (e.g., for an integral), \cs{vcenter} +% provides clearly better positioning than \cs{vbox}. +% \begin{macrocode} + \vcenter\bgroup +% \end{macrocode} +% Use \cs{Let@} to set the proper meaning of the \cn{\\} and \cn{\\*} +% commands. And restore the meaning of \cs{math@cr@@@} to \cs{cr} +% (see above) in case \env{subarray} is used inside one of the more +% complicated alignment macros where the meaning of \cs{math@cr@@@} +% is different. Similarly, call \cs{default@tag} to ensure that a +% line break here doesn't get an equation number! +% \begin{macrocode} + \Let@ \restore@math@cr \default@tag +% \end{macrocode} +% Set the line spacing to be the same as \cs{atop} (when \cs{atop} +% occurs in \cs{textstyle} or smaller), cf \textit{The \tex/book}, +% Appendix G. +% \begin{macrocode} + \baselineskip\fontdimen10 \scriptfont\tw@ + \advance\baselineskip\fontdimen12 \scriptfont\tw@ + \lineskip\thr@@\fontdimen8 \scriptfont\thr@@ + \lineskiplimit\lineskip +% \end{macrocode} +% Start the \cs{vbox} \cs{halign} structure that encloses the +% contents. Notice that we never get \cs{scriptscriptstyle}. That +% would require a \cs{mathchoice} (ugh). +% \begin{macrocode} + \ialign\bgroup\ifx c#1\hfil\fi + $\m@th\scriptstyle##$\hfil\crcr +}{% + \crcr\egroup\egroup +} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\substack} +% The \cn{substack} command is just an abbreviation for the +% most common use of \env{subarray}. +% \begin{macrocode} +\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} +% \end{macrocode} +% \end{macro} +% +% \subsection{Matrices} +% +% \begin{environment}{smallmatrix} +% \env{smallmatrix} is again an alignment, this time in a centered +% box. The opening incantations are basically the same as those in +% \cs{multilimits@}, followed by the alignment itself. A remark: +% the baselineskip (|9\ex@|) used in \amstex/ is too large for +% use in text with the usual baselineskip of $12$ or $13$ points; we +% change it here to |6\ex@| and also adjust the \cs{lineskip} +% and \cs{lineskiplimit} slightly to compensate. (MJD) +% \begin{macrocode} +\newenvironment{smallmatrix}{\null\,\vcenter\bgroup + \Let@\restore@math@cr\default@tag + \baselineskip6\ex@ \lineskip1.5\ex@ \lineskiplimit\lineskip + \ialign\bgroup\hfil$\m@th\scriptstyle##$\hfil&&\thickspace\hfil + $\m@th\scriptstyle##$\hfil\crcr +}{% + \crcr\egroup\egroup\,% +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{matrix} +% The \env{matrix} environment is just an \env{array} that provides +% up to ten centered columns, so that users don't have to give the +% col-spec argument explicitly---unless they want some of the columns +% noncentered, that is. The maximum number of columns is actually not +% fixed at ten but given by the counter |MatrixCols|, and can +% therefore be increased by changing that counter. +% +% The extra space of \cn{arraycolsep} that \env{array} adds on each +% side is a waste so we remove it here (perhaps we should instead +% remove it from \env{array} in general, but that's a harder task). +% +% TODO: Think about re-implementing \cn{matrix} to get rid of the +% \cs{c@MatrixCols} limit and have hard-wired preamble that doesn't +% have to be rebuilt each time. +% +% We must use \cn{renewenvironment} for \env{matrix} and +% \env{pmatrix} because \latex/ doesn't kill the definitions found in +% \fn{plain.tex}, even though it probably should because of their +% foreign syntax. +% \begin{macrocode} +\renewenvironment{matrix}{% + \matrix@check\matrix\env@matrix +}{% + \endarray \hskip -\arraycolsep +} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\env@matrix} +% +% \begin{macrocode} +\def\env@matrix{\hskip -\arraycolsep + \let\@ifnextchar\new@ifnextchar + \array{*\c@MaxMatrixCols c}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@MaxMatrixCols} +% \begin{macrocode} +\newcount\c@MaxMatrixCols \c@MaxMatrixCols=10 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\matrix@check} +% For various reasons, authors sometimes use the Plain \TeX{} form of +% \cn{matrix} or \cn{pmatrix} in \LaTeX{} documents. If they later +% add an invocation of the \pkg{amsmath} package to their document, +% the Plain \TeX{} syntax would lead to rather unintelligible error +% messages. The \cs{matrix@check} function does some checking to +% forestall that problem. +% \begin{macrocode} +\def\matrix@check#1{% + \@xp\ifx\csname\@currenvir\endcsname#1% + \else\matrix@error#1% +% \end{macrocode} +% This error recovery is not that good but is better than the +% infinite loop that can result from calling \cs{array} without a +% matching \cs{endarray}. (The array setup leaves \cs{par} empty.) +% \begin{macrocode} + \@xp\@gobble + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\matrix@error} +% +% \begin{macrocode} +\def\matrix@error#1{% + \@amsmath@err{% +Old form `\string#1' should be \string\begin{\@xp\@gobble\string#1}% + }{% +`\string#1{...}' is old Plain-TeX syntax whose use is +ill-advised in LaTeX.% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\renewenvironment{pmatrix}{% + \left(% + \matrix@check\pmatrix\env@matrix +}{ + \endmatrix\right)% +} +\newenvironment{bmatrix}{\left[\env@matrix}{\endmatrix\right]} +\newenvironment{Bmatrix}{% + \left\lbrace\env@matrix +}{% + \endmatrix\right\rbrace +} +\newenvironment{vmatrix}{\left\lvert\env@matrix}{\endmatrix\right\rvert} +\newenvironment{Vmatrix}{\left\lVert\env@matrix}{\endmatrix\right\rVert} +% \end{macrocode} +% +% \begin{macrocode} +\let\hdots\@ldots +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\hdotsfor}[1]{% + \ifx[#1\@xp\shdots@for\else\hdots@for\@ne{#1}\fi} +\newmuskip\dotsspace@ +\def\shdots@for#1]{\hdots@for{#1}} +\def\hdots@for#1#2{\multicolumn{#2}c% + {\m@th\dotsspace@1.5mu\mkern-#1\dotsspace@ + \xleaders\hbox{$\m@th\mkern#1\dotsspace@.\mkern#1\dotsspace@$}% + \hfill + \mkern-#1\dotsspace@}% + } +% \end{macrocode} +% +% \begin{environment}{cases} +% The easiest way to produce the \env{cases} environment is to base +% it on the \env{array} environment. We must use +% \cn{renewenvironment} to override the definition of \cn{cases} that +% \latex/ (unwisely) leaves in place from \fn{plain.tex}. +% \begin{macrocode} +\renewenvironment{cases}{% + \matrix@check\cases\env@cases +}{% + \endarray\right.% +} +\def\env@cases{% + \let\@ifnextchar\new@ifnextchar + \left\lbrace + \def\arraystretch{1.2}% + \array{@{}l@{\quad}l@{}}% +} +% \end{macrocode} +% \end{environment} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Equation sub-numbering} +% +% \begin{macrocode} +\newcounter{parentequation}% Counter for ``parent equation''. +% \end{macrocode} +% +% We can't assume \cs{ignorespacesafterend} is defined since it was +% not there in the earliest releases of \latex/ 2e. And we need to +% include the \cs{global} for the same reason. +% \begin{macrocode} +\@ifundefined{ignorespacesafterend}{% + \def\ignorespacesafterend{\global\@ignoretrue}% +}{} +% \end{macrocode} +% +% \begin{macrocode} +\newenvironment{subequations}{% +% \end{macrocode} +% Before sending down the `equation' counter to the subordinate +% level, add 1 using standard \cn{refstepcounter}. +% \begin{macrocode} + \refstepcounter{equation}% +% \end{macrocode} +% Define \cn{theparentequation} equivalent to current +% \cn{theequation}. \cn{edef} is necessary to expand the current +% value of the equation counter. This might in rare cases cause +% something to blow up, in which case the user needs to add +% \cn{protect}. +% \begin{macrocode} + \protected@edef\theparentequation{\theequation}% + \setcounter{parentequation}{\value{equation}}% +% \end{macrocode} +% And set the equation counter to 0, so that the normal incrementing +% processes in the various equation environments will produce the +% desired results. +% \begin{macrocode} + \setcounter{equation}{0}% + \def\theequation{\theparentequation\alph{equation}}% + \ignorespaces +}{% + \setcounter{equation}{\value{parentequation}}% + \ignorespacesafterend +} +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Equation numbering} +% +% In the multiline equation environments provided here, the task +% of equation numbering is linked to the task of line breaking +% in the sense that it is the \cn{\\} command that marks where an +% equation number for the current line will be processed and added to +% the page. +% +% Provide a convenient way to specify that equations should be +% numbered within sections. +% \begin{macrocode} +\newcommand{\numberwithin}[3][\arabic]{% + \@ifundefined{c@#2}{\@nocounterr{#2}}{% + \@ifundefined{c@#3}{\@nocnterr{#3}}{% + \@addtoreset{#2}{#3}% + \@xp\xdef\csname the#2\endcsname{% + \@xp\@nx\csname the#3\endcsname .\@nx#1{#2}}}}% +} +% \end{macrocode} +% +% To make references to equation numbers easier, we provide +% \cn{eqref}. We almost don't need \cn{textup}, except that +% \cs{tagform@} doesn't supply the italic correction. +% \begin{macrocode} +\newcommand{\eqref}[1]{\textup{\tagform@{\ref{#1}}}} +% \end{macrocode} +% +% \subsection{Preliminary macros} +% +% The following macros implement the \latex/ syntax for the +% \cn{\\} command, i.e. the possibility to add an asterisk to +% inhibit a page break, or an optional argument to denote additional +% vertical space. They are modelled more or less after the +% corresponding macros for \latex/'s \env{eqnarray} and \env{array} +% environments. +% +% [We can perhaps use the eqnarray mechanism if we change it so that +% it also uses \cs{openup}.] +% +% \begin{macro}{\dspbrk@lvl} +% We begin by defining the \cs{dspbrk@lvl} counter. This counter +% records the desirability of a break after the current row, as a +% number between $0$ and $4$. Its default value is $-1$ meaning that +% no explicit \cn{displaybreak} command was given, and the default +% \cs{interdisplaylinepenalty} is to be used. +% \begin{macrocode} +\newcount\dspbrk@lvl +\dspbrk@lvl=-1 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\interdisplaylinepenalty} +% We set the \cs{interdisplaylinepenalty} to $10000$. +% \begin{macrocode} +\interdisplaylinepenalty\@M +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\allowdisplaybreaks} +% The \cn{allowdisplaybreaks} command. Since this is intended for use +% outside displayed formulas (typically in the preamble), it does not +% need to use \cs{new@ifnextchar}. +% \begin{macrocode} +\newcommand{\allowdisplaybreaks}[1][4]{% + \interdisplaylinepenalty\getdsp@pen{#1}\relax +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\getdsp@pen} +% Modelled after \latex/'s \cs{@getpen}. We use higher numbers +% than would normally be provided by \cs{@lowpenalty}, +% \cs{@medpenalty}, and \cs{@highpenalty}, since display +% breaks are almost always less desirable. +% \begin{macrocode} +\def\getdsp@pen#1{% + \ifcase #1\@M \or 9999 \or 6999 \or 2999 \or \z@\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\displaybreak} +% \begin{macro}{\dspbrk@} +% \begin{macro}{\dspbrk@context} +% \begin{macro}{\nogood@displaybreak} +% For breaks in a certain row of a alignment. +% \begin{macrocode} +\newcommand{\displaybreak}{\new@ifnextchar[\dspbrk@{\dspbrk@[4]}} +\chardef\dspbrk@context=\sixt@@n +% \end{macrocode} +% +% \begin{macrocode} +\def\dspbrk@[#1]{% + \ifmeasuring@ + \else + \ifcase\dspbrk@context % case 0 --- OK + \global\dspbrk@lvl #1\relax + \or % case 1 --- inside a box + \nogood@displaybreak + \else % other cases --- outside of a display + \@amsmath@err{\Invalid@@\displaybreak}\@eha + \fi + \fi +} +% \end{macrocode} +% +% This is the value of \cn{displaybreak} when it occurs inside some +% structure where it will not work. +% \begin{macrocode} +\def\nogood@displaybreak{% + \@amsmath@err{\protect +\displaybreak\space cannot be applied here}% +{One of the enclosing environments creates an + unbreakable box\MessageBreak +(e.g., split, aligned, gathered, ...).}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\math@cr} +% The macro \cs{math@cr} ends a row inside one of the equation +% environments, i.e., this is the internal name of the \cn{\\} +% commands in these environments. As usual for this kind of macro +% inside of alignments we insert a special brace into \tex/'s input +% stream. The initial \cs{relax} is needed to trigger entry into the +% \textit{u} template of the current column if the author ended the +% current row with an empty column (i.e., the mathcr was immediately +% preceded by an ampersand). +% \begin{macrocode} +\def\math@cr{\relax\iffalse{\fi\ifnum0=`}\fi +% \end{macrocode} +% The first step is now to check whether an asterisk follows. +% \cs{@eqpen} is used to hold the penalty value to be put on +% the vertical list. +% Then we call up \cs{math@cr@} which performs the next step. +% If an asterisk is read page breaking is inhibited. +% \begin{macrocode} + \@ifstar{\global\@eqpen\@M\math@cr@}% +% \end{macrocode} +% Otherwise we have to check the \cs{dspbrk@lvl} value. +% \begin{macrocode} + {\global\@eqpen + \ifnum\dspbrk@lvl <\z@ \interdisplaylinepenalty + \else -\@getpen\dspbrk@lvl \fi + \math@cr@}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\math@cr@} +% The purpose of \cs{math@cr@} is to check whether an optional +% argument follows. If not it provides \cs{z@} as default +% value. +% \begin{macrocode} +\def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\math@cr@@} +% \cs{math@cr@@} closes the special brace opened in +% \cs{math@cr}, and calls \cs{math@cr@@@} which is supposed +% the `real' row ending command. The meaning of this macro depends +% on the environment in which it is used. +% \begin{macrocode} +\def\math@cr@@[#1]{\ifnum0=`{\fi \iffalse}\fi\math@cr@@@ +% \end{macrocode} +% Finally we put the additional space onto the vertical list. +% \begin{macrocode} + \noalign{\vskip#1\relax}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Let@} +% \cs{Let@} is called by all environments where \cn{\\} +% ends a row of an alignment. +% \begin{macrocode} +\def\Let@{\let\\\math@cr} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\restore@math@cr} +% We mentioned already that the exact meaning of \cs{math@cr@@@} +% depends on the current environment. Since it is often a simple +% \cs{cr} we provide \cs{restore@math@cr} to reset it. +% \begin{macrocode} +\def\restore@math@cr{\def\math@cr@@@{\cr}} +% \end{macrocode} +% This is also the default case. +% \begin{macrocode} +\restore@math@cr +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\intertext} +% \begin{macro}{\intertext@} +% The \cn{intertext} command is used for inserting text between the +% rows of an alignment. It might better be done as an environment, +% but the \cs{begingroup} from \cn{begin} would cause the +% \cs{noalign} to fail. +% \begin{macrocode} +\newcommand{\intertext}{\@amsmath@err{\Invalid@@\intertext}\@eha} +% \end{macrocode} +% \cs{intertext@} is called by all environments that allow the use of +% the \cn{intertext} command. +% \begin{macrocode} +\def\intertext@{% + \def\intertext##1{% +% \end{macrocode} +% If current mode is not vmode, the most likely reason is that the +% writer forgot the \cn{\\} that is supposed to precede +% \cn{intertext}. All right, then, let's try adding it our ownself. +% But, to be slightly careful: \cn{\\} does a futurelet, and it's +% slightly dangerous to allow a letted token to barge around loose in +% our internal code when it has been let to a conditional token +% like \cs{fi}. So let's interpose something in front of the \cs{fi} +% for the futurelet to take instead. (And careful again: it has to be +% something evanescent, not (e.g.) \cs{relax} which would cause the +% next halign cell to fire up and keep \cs{noalign} from working.) +% \begin{macrocode} + \ifvmode\else\\\@empty\fi + \noalign{% + \penalty\postdisplaypenalty\vskip\belowdisplayskip + \vbox{\normalbaselines +% \end{macrocode} +% We need to do something extra if the outside environment is a list +% environment. I don't see offhand an elegant way to test ``are we +% inside any list environment'' that is both easy and reliable (for +% example, checking for zero \cs{@totalleftmargin} wouldn't catch the +% case where \cs{@totalleftmargin} is zero but \cs{linewidth} is less +% than \cs{columnwidth}), so it seems to me checking \cs{linewidth} +% is the best practical solution. +% \begin{macrocode} + \ifdim\linewidth=\columnwidth + \else \parshape\@ne \@totalleftmargin \linewidth + \fi + \noindent##1\par}% + \penalty\predisplaypenalty\vskip\abovedisplayskip% + }% +}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Implementing tags and labels} +% +% In this section we describe some of the macros needed to make the +% \cn{tag} command work in various places. We start by defining a +% help text to be used when a \cn{tag} command is used somewhere +% it should not appear. +% +% \begin{macro}{\tag@help} +% This is the default error help text provided when \cn{tag} +% generates an error message. +% Note that \cs{newhelp} generates a control sequence name +% from the string given as its argument so that a leading +% backslash is provided automatically. +% \begin{macrocode} +\newhelp\tag@help + {tag cannot be used at this point.\space + If you don't understand why^^Jyou should consult + the documentation.^^JBut don't worry: just continue, and I'll + forget what happened.} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\gobble@tag} +% This macro is to be used when \cn{tag} should silently +% skip its argument. +% It is made to handle the \qc{\*}-form of \cn{tag} as well. +% \begin{macrocode} +\def\gobble@tag{\@ifstar\@gobble\@gobble} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\invalid@tag} +% \cs{invalid@tag} is a macro that should be used whenever +% \cn{tag} appears in an illegal place. +% It sets up \cs{tag@help} (as defined above) as help message, +% prints its argument as error message, and skips \cn{tag}'s +% argument. +% \begin{macrocode} +\def\invalid@tag#1{\@amsmath@err{#1}{\the\tag@help}\gobble@tag} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dft@tag} +% \begin{macro}{\default@tag} +% \cs{dft@tag} provides a convenient way to disallow the +% use of \cn{tag} at certain points. +% One simply has to write +% \begin{verbatim} +%\let\tag\dft@tag +% \end{verbatim} +% and the \cn{tag} command will produce an error message, +% with a suitable error help text, and discard its argument. +% \begin{macrocode} +\def\dft@tag{\invalid@tag{\string\tag\space not allowed here}} +% \end{macrocode} +% Since this is used several times we provide an abbreviation for +% it. +% \begin{macrocode} +\def\default@tag{\let\tag\dft@tag} +% \end{macrocode} +% Since this is also the default, i.e.\ the \cn{tag} command +% should not be used except in special places, we issue a +% \cs{default@tag} command. +% \begin{macrocode} +\default@tag +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Now that we have taken care of the case that \cn{tag} is not +% allowed we will provide some macros to process tags appropriately. +% As the user documentation states, a \cn{tag} command (without +% the asterisk typesets its argument according to the document +% styles' conventions, whereas a \cn{tag*} command typesets its +% argument exactly as given. We define therefore the following +% interface: +% +% \begin{macro}{\maketag@@} +% \begin{macro}{\maketag@@@} +% \begin{macro}{\tagform@} +% \cn{tag} is supposed to call \cs{maketag@@} which checks +% whether an asterisk follows. If this is the case it calls up +% \cs{maketag@@@} which sets its argument `as is'. Otherwise +% \cs{tagform@} is called to do the job. (This macro is to be +% defined appropriately by the document style.) +% \begin{macrocode} +\def\maketag@@{\@ifstar\maketag@@@\tagform@} +% \end{macrocode} +% We define \cs{maketag@@@} to use the normal font of the document +% text (since this is the usual practice for numbering of document +% elements) and to put a box around the tag. Furthermore we use +% \cs{m@th} for exceptional cases where the tag involves a +% superscript or some such math. (Probably from an explicit use of +% \cs{tag*} rather than from the automatic numbering.) +% \begin{macrocode} +\def\maketag@@@#1{\hbox{\m@th\normalfont#1}} +% \end{macrocode} +% We use the following default definition for \cs{tagform@} +% that puts only parentheses around the tag. +% \begin{macrocode} +\def\tagform@#1{\maketag@@@{(\ignorespaces#1\unskip\@@italiccorr)}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% We need to insinuate \cs{tagform@} into \cs{@eqnnum} in case +% \env{eqnarray} is used (probably in a document that was originally +% written without use of the \pkg{amsmath} package). +% \begin{macrocode} +\iftagsleft@ + \def\@eqnnum{\hbox to1sp{}\rlap{\normalfont\normalcolor + \hskip -\displaywidth\tagform@\theequation}} +\else + \def\@eqnnum{{\normalfont\normalcolor \tagform@\theequation}} +\fi +% \end{macrocode} +% +% \begin{macro}{\thetag} +% Sometimes one needs to set a literal tag according to the rules of +% the document style. To achieve this we provide the \cn{thetag} +% command. It typesets its argument by calling \cs{tagform@} on +% it. +% \begin{macrocode} +\newcommand{\thetag}{\leavevmode\tagform@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\df@tag} +% \begin{macro}{\make@df@tag} +% \begin{macro}{\make@df@tag@@} +% \begin{macro}{\make@df@tag@@@} +% Sometimes it is necessary for a \cn{tag} command to store a tag +% in a safe place and to process it later, e.g., for a tag in a row +% of an alignment where the tag can only be typeset when the +% \cn{\\} at the end of the row was seen. Such a tag is stored in +% the macro \cs{df@tag} (for `deferred tag'). For this purpose we +% provide the \cs{make@df@tag} macro. It is built very similar to +% the \cs{maketag@@} macro above. +% \begin{macrocode} +\let\df@tag\@empty +\def\make@df@tag{\@ifstar\make@df@tag@@\make@df@tag@@@} +% \end{macrocode} +% \cs{make@df@tag} sets \cs{@currentlabel} and defines +% \cs{df@tag} appropriately. +% +% To simplify the task of tracking \cs{tag} and \cs{label} +% commands inside math display environments, we defer \cs{label} +% commands until the tag is typeset, similar to the way that +% \cs{tag}s themselves are deferred. This allows arbitrary +% placement of \cs{label} and \cs{tag} commands and also means we +% only increment the \cs{equation} counter when we really need to, +% thus avoiding the \cs{setb@ck} nonsense that used to be required. +% +% \begin{macrocode} +\def\make@df@tag@@#1{% + \gdef\df@tag{\maketag@@@{#1}\def\@currentlabel{#1}}} +% \end{macrocode} +% Autogenerated number: +% \begin{macrocode} +\def\make@df@tag@@@#1{\gdef\df@tag{\tagform@{#1}% + \toks@\@xp{\p@equation{#1}}\edef\@currentlabel{\the\toks@}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ltx@label} +% \begin{macro}{\label@in@display} +% \begin{macro}{\df@label} +% Next, we store the default definition of \cs{label} in +% \cs{ltx@label} and then define a new version of \cs{label} for use +% in math display environments. \cs{label@in@display} merely issues a +% warning message if there is already a pending label (which will be +% discarded) and then stores the label in \cs{df@label}. +% \begin{macrocode} +\let\ltx@label\label +% +\def\label@in@display{% + \ifx\df@label\@empty\else + \@amsmath@err{Multiple \string\label's: + label '\df@label' will be lost}\@eha + \fi + \gdef\df@label +} +% \end{macrocode} +% In case there is an enumerate inside a minipage inside an equation, +% we need to reset \cn{label} to its normal value: +% \begin{macrocode} +\toks@\@xp{\@arrayparboxrestore \let\label\ltx@label}% +\edef\@arrayboxrestore{\the\toks@} +% \end{macrocode} +% +% \begin{macrocode} +\let\df@label\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\make@display@tag} +% Now we define a macro to process \cs{tag} and \cs{label} commands +% in various display environments. If the |@eqnsw| switch is set, +% then we should supply an equation number; otherwise, if the +% |@tag| switch is set, we should use the tag stored in +% \cs{df@tag}. Finally, we process any pending \cs{label}s. +% +% TODO: Arguably, \cs{make@display@tag} should issue a warning +% message if there is a \cs{label} but neither a tag nor an +% equation number. Also, it would probably be worthwhile to +% explore whether \cs{iftag@} could be done away with and replaced +% by checks to see if \cs{df@tag} is empty or not. +% \begin{macrocode} +\def\make@display@tag{% + \if@eqnsw \incr@eqnum \print@eqnum + \else \iftag@ \df@tag \global\let\df@tag\@empty \fi + \fi +% \end{macrocode} +% Need to check the \cs{ifmeasuring@} flag otherwise the \cs{write} +% node from \cn{label} might be discarded in a temp box and clearing +% \cs{df@label} will keep it from being reiterated on the real +% typesetting pass. +% \begin{macrocode} + \ifmeasuring@ + \else + \ifx\df@label\@empty + \else + \@xp\ltx@label\@xp{\df@label}% + \global\let\df@label\@empty + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% Now we define the special versions of \cn{tag} used within the +% \env{align} environments. +% +% \begin{macro}{\tag@in@align} +% The \cn{tag} command may only appear once in a row of +% an alignment. Therefore we first check the switch |tag@| +% that is set to false at the begin of every row. +% If this switch is true a \cn{tag} was already given in this +% row and we define \cs{next@} to expand to a call to +% \cs{invalid@tag}. +% \begin{macrocode} +\def\tag@in@align{% + \relax + \iftag@ + \DN@{\invalid@tag{Multiple \string\tag}}% + \else +% \end{macrocode} +% Otherwise we set the |tag@| switch. But there is more to +% be done: we must also prevent the automatic generation of a +% tag. Therefore we also reset the |@eqnsw|. +% \begin{macrocode} + \global\tag@true +% \end{macrocode} +% Changed to \cs{nonumber}, since that seems to be all that's +% required.---dmj, 1994/12/21 +% \begin{macrocode} + \nonumber +% \end{macrocode} +% Within a row of an \env{align} environment the \cn{tag} +% command must not typeset the tag immediately since its +% position can be determined only later. +% Therefore we use the \cs{make@df@tag} macro defined +% earlier. +% Finally we call \cs{next@} to process the argument +% that follows. +% \begin{macrocode} + \let\next@\make@df@tag + \fi + \next@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\raisetag} +% Usage: \cn{raisetag} \meta{dimen} +% +% This will modify the vertical placement of the tag of the current +% equation by \meta{dimen}. Note that according to the current uses +% of \cs{raise@tag} in e.g., \cs{place@tag@gather}, no adjustment +% occurs if the tag falls in its normal position; i.e., \cn{raisetag} +% has no effect unless the tag has already been shifted off-line. +% +% \begin{macrocode} +\newcommand{\raisetag}[1]{\skip@#1\relax + \xdef\raise@tag{\vskip\iftagsleft@\else-\fi\the\skip@\relax}% +} +% \end{macrocode} +% \cn{raise@tag} will be reemptied at the beginning of each equation, +% which might occur at a |\begin{xxx}| or \cn{\\}. +% \begin{macrocode} +\let\raise@tag\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\notag} +% For consistency we provide \cn{notag}, equivalent to +% \cn{nonumber}. The alternative would have been to rename +% \cn{tag} as \cn{number} to go along with \cn{nonumber}, +% but of course \cs{number} is a \tex/ primitive that should not +% be redefined. +% \begin{macrocode} +\newcommand{\notag}{\nonumber} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nonumber} +% Need to add some additional code to \cn{nonumber} to deal with some +% complications related to nested environments. +% \begin{macrocode} +\renewcommand{\nonumber}{% + \if@eqnsw + \ifx\incr@eqnum\@empty \addtocounter{equation}\m@ne \fi + \fi + \let\print@eqnum\@empty \let\incr@eqnum\@empty + \global\@eqnswfalse +} +% \end{macrocode} +% +% \begin{macrocode} +\def\print@eqnum{\tagform@\theequation} +\def\incr@eqnum{\refstepcounter{equation}\let\incr@eqnum\@empty} +% \end{macrocode} +% \end{macro} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Multiline equation environments} +% +% \subsection{Remarks} +% +% In late 1994 David M. Jones did a thorough overhaul of these +% environments so that the number placement and a few other aspects +% are substantially improved over the original versions that were +% ported essentially unchanged from \fn{amstex.tex} in 1989. Most of +% the commentary in this section is DMJ's, and comments of any +% significance that I added are marked by my initials and date +% [mjd, 1995/01/11]. +% +% \subsection{Preliminaries} +% +% \begin{macro}{\ifinalign@} +% \begin{macro}{\ifingather@} +% We define two switches that are set to true in certain +% alignments: |inalign@| and |ingather@| inside of +% the \env{align} and \env{gather} environments. +% These switches are needed to control certain actions that +% depend on the surrounding conditions, more specifically: +% on the setting already done by the surrounding environments. +% \begin{macrocode} +\newif\ifinalign@ +\newif\ifingather@ +% \end{macrocode} +% \begin{histnote} +% Removed the \cs{ifinany@} test [mjd,1999/06/28] since it was mainly +% used for the purpose now handled by \cs{spread@equation}. +% \changes{v1.2g}{1999/06/28}{Removed ifinany@} +% \end{histnote} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@arrayparboxrestore} +% Here we must reset a few additional parameters. +% \begin{macrocode} +\@xp\def\@xp\@arrayparboxrestore\@xp{\@arrayparboxrestore + \ingather@false\inalign@false \default@tag + \let\spread@equation\@spread@equation + \let\reset@equation\@empty + \def\print@eqnum{\tagform@\theequation}% + \def\incr@eqnum{\refstepcounter{equation}\let\incr@eqnum\@empty}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\iftag@} +% The switch |tag@| is set to false at the beginning of every +% row and set to true by a \cn{tag} command. +% This allows us to check whether there is more than one tag on +% a row. +% \begin{macrocode} +\newif\iftag@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifst@rred} +% The switch |st@rred| is set to true by all starred +% environments +% and set to false by the unstarred versions. +% \begin{macrocode} +\newif\ifst@rred +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifmeasuring@} +% All display environments get typeset twice---once during a +% ``measuring'' phase and then again during a ``production'' phase; +% \cs{ifmeasuring@} will be used to determine which case we're in, +% so we can take appropriate action. +% +% \begin{macrocode} +\newif\ifmeasuring@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifshifttag@} +% \cs{ifshifttag@} is used by \env{gather} to communicate between +% \cs{calc@shift@gather} and \cs{place@tag@gather} whether an +% equation tag should be shifted to a separate line. It's also +% used by \env{multline}. +% \begin{macrocode} +\newif\ifshifttag@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\row@} +% \begin{macrocode} +\newcount\row@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\column@} +% The counter \cs{column@} is used by the alignment macros to +% keep track of the current column. +% +% \begin{macrocode} +\newcount\column@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\column@plus} +% \cs{\column@plus} is a useful abbreviation. +% \begin{macrocode} +\def\column@plus{% + \global\advance\column@\@ne +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maxfields@} +% \begin{macrocode} +\newcount\maxfields@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\add@amp} +% \begin{macro}{\add@amps} +% \begin{macrocode} +\def\add@amp#1{\if m#1&\@xp\add@amp\fi} +\def\add@amps#1{% + \begingroup + \count@#1\advance\count@-\column@ + \edef\@tempa{\endgroup + \@xp\add@amp\romannumeral\number\count@ 000q}% + \@tempa +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\andhelp@} +% The help text stored in \cs{andhelp@} is used for errors +% generated by too many \qc{\&} characters in a row. +% \begin{macrocode} +\newhelp\andhelp@ +{An extra & here is so disastrous that you should probably exit^^J +and fix things up.} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eqnshift@} +% \cs{eqnshift@} is used by \env{align} and \env{gather} as the +% indentation of the lines of the environment from the left margin. +% \begin{macrocode} +\newdimen\eqnshift@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\alignsep@} +% \begin{macrocode} +\newdimen\alignsep@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tagshift@} +% \begin{macrocode} +\newdimen\tagshift@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mintagsep} +% \cs{mintagsep} is the minimum allowable separation between an +% equation and its tag. We set it to half a quad in +% \cs{textfont}2, which is \tex/'s built-in value. +% \begin{macrocode} +\newcommand{\mintagsep}{.5\fontdimen6\textfont\tw@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\minalignsep} +% This should probably be a skip register [mjd,1999/06/18] +% \begin{macrocode} +\newcommand{\minalignsep}{10pt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tagwidth@} +% \begin{macrocode} +\newdimen\tagwidth@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\totwidth@} +% \begin{macrocode} +\newdimen\totwidth@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lineht@} +% The dimen register \cs{lineht@} is used to keep track of the +% height (or depth, if tags are on the right) of a row in an +% alignment. +% \begin{macrocode} +\newdimen\lineht@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tag@width} +% \begin{macro}{\savetaglength@} +% \begin{macro}{\shift@tag} +% \begin{macro}{\tag@shifts} +% \begin{macrocode} +\def\tag@width#1{% + \ifcase\@xp#1\tag@lengths\fi +} + +\def\savetaglength@{% + \begingroup + \let\or\relax + \xdef\tag@lengths{\tag@lengths\or \the\wdz@}% + \endgroup +} + +\def\shift@tag#1{% + \ifcase\@xp#1\tag@shifts\fi\relax +} + +\let\tag@shifts\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\saveshift@} +% \begin{macrocode} +\def\saveshift@#1{% + \begingroup + \let\or\relax + \xdef\tag@shifts{\or#1\tag@shifts}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\spread@equation} +% This does the line-spacing adjustment that is normally wanted for +% displayed equations. We also call \cs{reset@strutbox@} here because +% otherwise a preceding font size change might leave \cs{strutbox@} +% with wrong contents. This is a less-than-ideal solution but +% probably good enough for now, until the situation can be +% overhauled. +% \begin{macrocode} +\def\spread@equation{\reset@strutbox@ + \openup\jot \let\spread@equation\@empty} +\let\@spread@equation\spread@equation +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\displ@y} +% \begin{macro}{\displ@y@} +% \begin{macro}{\@display@init} +% \cs{displ@y} is from \fn{plain.tex}, with +% \cs{interdisplaylinepenalty} changed to \cs{@eqpen}. Also we +% transplanted most of its internal organs to \cs{@display@init} to +% support \cs{displ@y@} and other possibilities. Don't try to make +% sense of these naming conventions! They are a narrowly calculated +% mishmash of Knuth/Spivak/Lamport/Mittelbach precedents. The reason +% for not cleaning them up and forcing all names to a consistent +% scheme is that then in principle we'd have to do it everywhere else +% too. And we programmers are paranoid about the side effects of name +% changes. +% \begin{macrocode} +\def\displ@y{\@display@init{}} +\def\@display@init#1{% + \global\dt@ptrue \spread@equation + \everycr{% + \noalign{% + #1% + \ifdt@p + \global\dt@pfalse + \vskip-\lineskiplimit + \vskip\normallineskiplimit + \else + \penalty\@eqpen \global\dspbrk@lvl\m@ne + \fi + }% + }% +} +% \end{macrocode} +% \cs{displ@y@} is nearly the same; it additionally sets the |tag@| +% switch and the \cs{column@} and \cs{dspbrk@lvl} counters to their +% default values. The argument is normally a bit of code to empty out +% \cs{raise@tag}, but in \env{multline} we don't want that to happen +% in \cs{everycr}. +% \begin{macrocode} +\def\displ@y@{\@display@init{% + \global\column@\z@ \global\dspbrk@lvl\m@ne + \global\tag@false \global\let\raise@tag\@empty +}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\black@} +% This macro is made to produce an overfull box message and +% possibly (depending on the value of \cs{overfullrule}) +% a rule in the margin if the total width of an alignment +% is larger than the value of \cs{displaywidth}. +% \begin{macrocode} +\def\black@#1{% + \noalign{% + \ifdim#1>\displaywidth + \dimen@\prevdepth + \nointerlineskip + \vskip-\ht\strutbox@ + \vskip-\dp\strutbox@ + \vbox{\noindent\hbox to#1{\strut@\hfill}}% + \prevdepth\dimen@ + \fi + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\savecounters@} +% \begin{macro}{\restorecounters@} +% These are used during the measuring phase of the various display +% math environments to save and restore the values of all \latex/ +% counters. We make these local to a group, so nested environments +% works. +% +% Changed \cn{stepcounter} to |\csname c@...\endcsname| to avoid +% overhead of ifundefined test [mjd, 1995/01/20]. +% \begin{macrocode} +\def\savecounters@{% + \begingroup + \def\@elt##1{% + \global\csname c@##1\endcsname\the\csname c@##1\endcsname}% + \xdef\@gtempa{% + \cl@@ckpt + \let\@nx\restorecounters@\@nx\@empty + }% + \endgroup + \let\restorecounters@\@gtempa +} +% +\let\restorecounters@\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\savealignstate@} +% \begin{macro}{\restorealignstate@} +% These are used to save the values of various parameters that are +% shared by \env{align} and \env{gather} when the former is used +% inside the latter. +% \begin{macrocode} +\def\savealignstate@{% + \begingroup + \let\or\relax + \xdef\@gtempa{% + \global\totwidth@\the\totwidth@ + \global\row@\the\row@ + \gdef\@nx\tag@lengths{\tag@lengths}% + \let\@nx\restorealignstate@\@nx\@empty + }% + \endgroup + \let\restorealignstate@\@gtempa +} + +\let\restorealignstate@\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\savecolumn@} +% \begin{macro}{\restorecolumn@} +% +% \begin{macrocode} +\def\savecolumn@{% + \edef\restorecolumn@{% + \global\column@\number\column@ + \let\@nx\restorecolumn@\@nx\@empty + }% +} +\let\restorecolumn@\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Scanning the environment's body} +% +% Several of the math alignment macros must scan their body twice: +% once to determine how wide the columns are and then to actually +% typeset them. This means that we must collect all text in this body +% before calling the environment macros. +% +% \begin{macro}{\@envbody} +% We start by defining a token register to contain the body. +% \begin{macrocode} +\newtoks\@envbody +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addto@envbody} +% Then we define a macro to add something (i.e.\ its argument) to the +% token register \cs{@envbody}. +% \begin{macrocode} +\def\addto@envbody#1{\global\@envbody\@xp{\the\@envbody#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\collect@body} +% The macro \cs{collect@body} starts the scan for the |\end{...}| +% command of the current environment. It takes a macro name as +% argument. This macro is supposed to take the whole body of the +% environment as its argument. For example, |\begin{align}| would +% call |\collect@body\@align| if |@align#1{...}| is the macro that +% sets the alignment with body \arg{1}. +% +% \begin{macrocode} +\def\collect@body#1{% + \@envbody{\@xp#1\@xp{\the\@envbody}}% + \edef\process@envbody{\the\@envbody\@nx\end{\@currenvir}}% + \@envbody\@emptytoks \def\begin@stack{b}% +% \end{macrocode} +% +% If we simply called \cs{collect@@body} directly, +% the error message for a \cn{par} token (usually from a blank line) +% would be +% \begin{verbatim} +% ! Paragraph ended before \collect@@body was complete. +% \end{verbatim} +% But we use a little finesse to get a more intelligible error +% message: +% \begin{verbatim} +% ! Paragraph ended before \multline* was complete. +% \end{verbatim} +% In order to avoid using up csnames unnecessarily we use the actual +% environment name as the name of the temporary function that is +% \cs{let} to \cs{collect@@body}; but then in order to preserve the +% theoretical possibility of nesting for environments that use +% \cs{collect@body} (not currently required by any \pkg{amsmath} +% environment [mjd,1999/06/23]), we do the \cs{let} inside a group. +% \begin{macrocode} + \begingroup + \@xp\let\csname\@currenvir\endcsname\collect@@body +% \end{macrocode} +% This small twist eliminates the need for \cs{expandafter}'s in +% \cs{collect@@body}. +% \begin{macrocode} + \edef\process@envbody{\@xp\@nx\csname\@currenvir\endcsname}% + \process@envbody +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\push@begins} +% When adding a piece of the current environment's contents to +% \cs{@envbody}, we scan it to check for additional \cn{begin} +% tokens, and add a `b' to the stack for any that we find. +% \begin{macrocode} +\def\push@begins#1\begin#2{% + \ifx\end#2\else b\@xp\push@begins\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\collect@@body} +% \cs{collect@@body} takes two arguments: the first will consist of +% all text up to the next \cn{end} command, the second will be the +% \cn{end} command's argument. If there are any extra \cn{begin} +% commands in the body text, a marker is pushed onto a stack by the +% \cs{push@begins} function. Empty state for this stack means that we +% have reached the \cn{end} that matches our original \cn{begin}. +% Otherwise we need to include the \cn{end} and its argument in the +% material that we are adding to our environment body accumulator. +% +% \begin{histnote} +% In a former implementation, the error messages resulting from a +% typo in the environment name were unsatisfactory, because it was +% matching of the environment name that was used to determine the end +% of our environment body, instead of counting begin-end pairs. +% Thanks to Lars Hellstr\"{o}m for a suggestion that led to this +% improvement. [mjd,1999/06/23] +% \end{histnote} +% \begin{macrocode} +\def\collect@@body#1\end#2{% + \edef\begin@stack{\push@begins#1\begin\end \@xp\@gobble\begin@stack}% + \ifx\@empty\begin@stack + \endgroup + \@checkend{#2}% + \addto@envbody{#1}% + \else + \addto@envbody{#1\end{#2}}% + \fi + \process@envbody % A little tricky! Note the grouping +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Simple aligning environments} +% +% \begin{macro}{\math@cr@@@aligned} +% From tabskip we get an extra space of minalignsep after every +% second column; but when this falls at the right edge of the whole +% aligned structure, we need to cancel that space. +% \begin{macrocode} +\def\math@cr@@@aligned{% + \ifodd\column@ \let\next@\@empty + \else \def\next@{&\kern-\alignsep@}% + \fi + \next@ \cr +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\start@aligned} +% The \env{aligned} and \env{alignedat} environments are identical +% except that the latter takes a mandatory argument to specify the +% number of align structures, while the former allows any number of +% align structures automatically (the use of \env{alignedat} is +% deprecated). So, they will be defined in terms of +% \cs{start@aligned}, which will take two arguments. The first +% argument specifies the placement of the environments; it is +% either |c|, |t|, or |b|. The second is the number of align +% structures; a value of~$-1$ means that an arbitrary number are +% allowed. +% \begin{macrocode} +\newcommand{\start@aligned}[2]{% + \RIfM@\else + \nonmatherr@{\begin{\@currenvir}}% + \fi + \savecolumn@ % Assumption: called inside a group +% \end{macrocode} +% The \cs{null} here is to keep the \cs{,} glue from causing the +% invocation of the clause in \tex/'s built-in tag placement +% algorithm that can cause an equation to be shifted all the way over +% to the margin. +% \begin{macrocode} + \null\,% + \if #1t\vtop \else \if#1b \vbox \else \vcenter \fi \fi \bgroup + \maxfields@#2\relax + \ifnum\maxfields@>\m@ne + \multiply\maxfields@\tw@ +% \end{macrocode} +% Introduced new \cs{math@cr@@@} so we can provide standard error +% message for too many \qc{\&}'s in \env{alignedat}. +% \begin{macrocode} + \let\math@cr@@@\math@cr@@@alignedat + \alignsep@\z@skip + \else + \let\math@cr@@@\math@cr@@@aligned + \alignsep@\minalignsep + \fi +% \end{macrocode} +% Reset the meaning of \cn{\\}. +% \begin{macrocode} + \Let@ \chardef\dspbrk@context\@ne +% \end{macrocode} +% Restore the default definition of \cn{tag} (error message), in +% case \env{aligned} is used inside, e.g., a \env{gather} +% environment that accepts \cn{tag}. +% \begin{macrocode} + \default@tag + \spread@equation % no-op if already called +% \end{macrocode} +% Finally we start the alignment itself. For \env{aligned} we add +% \cs{minalignsep} after every second column to mimic the +% behavior of \env{align}. For \env{alignedat} the user has to +% specify interalign space explicitly. +% \begin{macrocode} + \global\column@\z@ + \ialign\bgroup + &\column@plus + \hfil + \strut@ + $\m@th\displaystyle{##}$% + \tabskip\z@skip + &\column@plus + $\m@th\displaystyle{{}##}$% + \hfil + \tabskip\alignsep@ + \crcr +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\math@cr@@@aligned} +% \cs{math@cr@@@aligned} checks to make sure the user hasn't put in +% too many \qc{\&}s in \env{alignedat}. Since \env{alignedat} +% doesn't use \cs{displ@y@}, we also reset \cs{column@} here. Note +% than in \env{aligned}, \cs{column@} will increase without bound, +% since it never gets reset, but this is harmless. +% \begin{macrocode} +\def\math@cr@@@alignedat{% + \ifnum\column@>\maxfields@ + \begingroup + \measuring@false + \@amsmath@err{Extra & on this line}% + {\the\andhelp@}% "An extra & here is disastrous" + \endgroup + \fi + \global\column@\z@ + \cr +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\alignsafe@testopt} +% Testing for an optional argument can be really, really tricky in +% certain complicated contexts. This we discovered by getting some +% bug reports for uses of \env{aligned}. So here is a safer +% form of \latex/'s \cs{@testopt} function. +% \begin{macrocode} +\def\alignsafe@testopt#1#2{% + \relax\iffalse{\fi\ifnum`}=0\fi + \@ifnextchar[% + {\let\@let@token\relax \ifnum`{=\z@\fi\iffalse}\fi#1}% + {\let\@let@token\relax \ifnum`{=\z@\fi\iffalse}\fi#1[#2]}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{aligned} +% The \env{aligned} environment takes an optional argument that +% indicates its vertical position in relation to surrounding +% material: |t|, |c|, or |b| for top, center, or bottom. +% \begin{macrocode} +\newenvironment{aligned}{% + \let\@testopt\alignsafe@testopt + \aligned@a +}{% + \crcr\egroup + \restorecolumn@ + \egroup +} +\newcommand{\aligned@a}[1][c]{\start@aligned{#1}\m@ne} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{alignedat} +% To get a top or bottom positioned \env{alignedat} structure, you +% would write something like +% \begin{verbatim} +% \begin{alignedat}[t]{3} +% \end{verbatim} +% +% \begin{macrocode} +\newenvironment{alignedat}{% + \let\@testopt\alignsafe@testopt + \alignedat@a +}{% + \endaligned +} +\newcommand{\alignedat@a}[1][c]{\start@aligned{#1}} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{gathered} +% The \env{gathered} environment is for several lines that are +% centered independently. +% \begin{macrocode} +\newenvironment{gathered}[1][c]{% + \RIfM@\else + \nonmatherr@{\begin{gathered}}% + \fi + \null\,% + \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi \bgroup + \Let@ \chardef\dspbrk@context\@ne \restore@math@cr + \spread@equation + \ialign\bgroup + \hfil\strut@$\m@th\displaystyle##$\hfil + \crcr +}{% + \endaligned +} +% \end{macrocode} +% \end{environment} +% +% +% \subsection{The \env{gather} environment} +% +% \begin{macro}{\start@gather} +% \begin{macrocode} +\def\start@gather#1{% + \RIfM@ + \nomath@env + \DN@{\@namedef{end\@currenvir}{}\@gobble}% + \else + $$% + #1% + \ifst@rred \else \global\@eqnswtrue \fi + \let\next@\gather@ + \fi + \collect@body\next@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{gather} +% \begin{environment}{gather*} +% \begin{macrocode} +\newenvironment{gather}{% + \start@gather\st@rredfalse +}{% + \math@cr \black@\totwidth@ \egroup + $$\ignorespacesafterend +} + +\newenvironment{gather*}{% + \start@gather\st@rredtrue +}{% + \endgather +} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \begin{macro}{\gather@} +% \begin{macrocode} +\def\gather@#1{% + \ingather@true \let\split\insplit@ + \let\tag\tag@in@align \let\label\label@in@display + \chardef\dspbrk@context\z@ + \intertext@ \displ@y@ \Let@ + \let\math@cr@@@\math@cr@@@gather + \gmeasure@{#1}% + \global\shifttag@false + \tabskip\z@skip + \global\row@\@ne + \halign to\displaywidth\bgroup + \strut@ + \setboxz@h{$\m@th\displaystyle{##}$}% + \calc@shift@gather + \set@gather@field + \tabskip\@centering + &\setboxz@h{\strut@{##}}% + \place@tag@gather + \tabskip \iftagsleft@ \gdisplaywidth@ \else \z@skip \span\fi + \crcr + #1% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\gmeasure@} +% \begin{macrocode} +\def\gmeasure@#1{% + \begingroup + \measuring@true + \totwidth@\z@ + \global\let\tag@lengths\@empty + \savecounters@ + \setbox\@ne\vbox{% + \everycr{\noalign{\global\tag@false + \global\let\raise@tag\@empty \global\column@\z@}}% + \let\label\@gobble + \halign{% + \setboxz@h{$\m@th\displaystyle{##}$}% + \ifdim\wdz@>\totwidth@ + \global\totwidth@\wdz@ + \fi + &\setboxz@h{\strut@{##}}% + \savetaglength@ + \crcr + #1% + \math@cr@@@ + }% + }% + \restorecounters@ + \if@fleqn + \global\advance\totwidth@\@mathmargin + \fi + \iftagsleft@ + \ifdim\totwidth@>\displaywidth + \global\let\gdisplaywidth@\totwidth@ + \else + \global\let\gdisplaywidth@\displaywidth + \fi + \fi + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\math@cr@@@gather} +% Modified \cs{math@cr@@@gather} so that it always puts in the +% final field, which needs to be done under the new method for +% determining tag placement. This is probably more efficient +% anyway. +% +% \begin{macrocode} +\def\math@cr@@@gather{% + \ifst@rred\nonumber\fi + &\relax + \make@display@tag + \ifst@rred\else\global\@eqnswtrue\fi +% \end{macrocode} +% We advance \cs{row@} here, rather than at the beginning of the +% preamble, because otherwise the \env{split} environment will +% cause \cs{row@} to be advanced twice instead of once. +% \begin{macrocode} + \global\advance\row@\@ne + \cr +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\calc@shift@gather} +% \cs{calc@shift@gather} has must make two decisions: (1) whether the +% equation tag for the current line should be put on a separate +% line and (2) what the distance between the equation and the +% equation tag should be. We implement \tex/'s built-in +% tag-placement as well as possible, with one improvement: the +% minimum separation between tag and equation is now a +% user-settable parameter. +% +% [1995/01/17] Added a check to make sure that the width of the tag +% on the current line is $>0$ before testing to see if tagwidth + +% linewidth + mintagsep $>$ displaywidth. Since an imbedded align +% shows up as line with width \cn{displaywidth}, and even lines +% without a tag get processed as if an empty tag were present, the +% result was that the empty tag assigned to the line containing the +% align was being shifted downwards, creating extra space after the +% align. +% \begin{macrocode} +\def\calc@shift@gather{% + \dimen@\mintagsep\relax + \tagwidth@\tag@width\row@\relax +% \end{macrocode} +% If we're in \opt{fleqn} mode, there is no flexibility about +% placement of the equation, so all we can do is see if there's +% room for the tag in the given margin. +% \begin{macrocode} + \if@fleqn + \global\eqnshift@\@mathmargin + \ifdim\tagwidth@>\z@ + \advance\dimen@\tagwidth@ + \iftagsleft@ + \ifdim\dimen@>\@mathmargin + \global\shifttag@true + \fi + \else + \advance\dimen@\@mathmargin + \advance\dimen@\wdz@ + \ifdim\dimen@>\displaywidth + \global\shifttag@true + \fi + \fi + \fi + \else + \global\eqnshift@\displaywidth + \global\advance\eqnshift@-\wdz@ + \ifdim\tagwidth@>\z@ + \multiply\dimen@\tw@ + \advance\dimen@\wdz@ + \advance\dimen@\tagwidth@ + \ifdim\dimen@>\displaywidth + \global\shifttag@true + \else + \ifdim\eqnshift@<4\tagwidth@ + \global\advance\eqnshift@-\tagwidth@ + \fi + \fi + \fi + \global\divide\eqnshift@\tw@ + \iftagsleft@ + \global\eqnshift@-\eqnshift@ + \global\advance\eqnshift@\displaywidth + \global\advance\eqnshift@-\wdz@ + \fi + \ifdim\eqnshift@<\z@ + \global\eqnshift@\z@ + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\place@tag@gather} +% \begin{macro}{\set@gather@field} +% \begin{macrocode} +\def\place@tag@gather{% + \iftagsleft@ + \kern-\gdisplaywidth@ + \ifshifttag@ + \rlap{\vbox{% + \normalbaselines + \boxz@ + \vbox to\lineht@{}% + \raise@tag + }}% + \global\shifttag@false + \else + \rlap{\boxz@}% + \fi + \else + \ifdim\totwidth@>\displaywidth + \dimen@\totwidth@ + \advance\dimen@-\displaywidth + \kern-\dimen@ + \fi + \ifshifttag@ + \llap{\vtop{% + \raise@tag + \normalbaselines + \setbox\@ne\null + \dp\@ne\lineht@ + \box\@ne + \boxz@ + }}% + \global\shifttag@false + \else + \llap{\boxz@}% + \fi + \fi +} +% +\def\set@gather@field{% + \iftagsleft@ + \global\lineht@\ht\z@ + \else + \global\lineht@\dp\z@ + \fi + \kern\eqnshift@ + \boxz@ + \hfil +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{The \env{align} family of environments} +% +% The \env{align}, \env{flalign}, \env{alignat}, \env{xalignat}, +% and \env{xxalignat} environments are virtually +% identical, and thus will share much code. We'll refer to the +% environments generically as ``\env{align}'' and will +% distinguish between them explicitly +% only when necessary. +% +% \begin{macro}{\ifxxat@} +% \begin{macro}{\ifcheckat@} +% \begin{macro}{\xatlevel@} +% The \cs{xatlevel@} macro will be used, informally speaking, to +% distinguish between the \env{alignat} and \env{xalignat}, and +% \env{xxalignat} environments. +% +% \begin{macrocode} +\newif\ifxxat@ + +\newif\ifcheckat@ + +\let\xatlevel@\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\start@align} +% \cs{start@align} will be called by all of the \env{align}-like +% environments. The first argument will be the \cs{xatlevel@}, +% i.e., 0, 1, or~2; the second argument will be either +% \cs{st@rredtrue} or \cs{st@rredfalse}. The third argument will +% be the number of aligned +% structures in the environment (either as supplied by the user, or +% $-1$ to indicate that checking shouldn't be done). After +% performing the appropriate error detection and initialization, +% \cs{start@align} calls \cs{align@}. +% +% Note that the \cs{equation} counter is no longer stepped at the +% beginning of these environments. +% +% TODO: Implement \cs{shoveleft} and \cs{shoveright} for +% \env{align}. +% \begin{macrocode} +\def\start@align#1#2#3{% + \let\xatlevel@#1% always \z@, \@ne, or \tw@ + \maxfields@#3\relax + \ifnum\maxfields@>\m@ne + \checkat@true + \ifnum\xatlevel@=\tw@ + \xxat@true + \fi + \multiply\maxfields@\tw@ + \else + \checkat@false + \fi + \ifingather@ + \iffalse{\fi\ifnum0=`}\fi + \DN@{\vcenter\bgroup\savealignstate@\align@#2}% + \else + \ifmmode + \if@display + \DN@{\align@recover}% + \else + \nomath@env + \DN@{\@namedef{end\@currenvir}{}\@gobble}% + \fi + \else + $$% + \let\split\insplit@ + \DN@{\align@#2}% + \fi + \fi + \collect@body\next@ +} +% \end{macrocode} +% +% With version 1.2 of \pkg{amsmath}, it was possible to use +% \env{align*} and relatives in certain wrong contexts without +% getting an error, e.g. +% \begin{verbatim} +% \begin{equation*} +% \begin{align*} +% ... +% \end{align*} +% \end{equation*} +% \end{verbatim} +% +% For backward compatibility we therefore give only a warning for +% this condition instead of a full error, and try to recover using +% the \env{aligned} environment. The alignment of the material may be +% adversely affected but it will at least remain readable. +% \begin{macrocode} +\def\align@recover#1#2#3{% + \endgroup + \@amsmath@err{% +Erroneous nesting of equation structures;\MessageBreak +trying to recover with `aligned'% + }\@ehc + \begin{aligned}\relax#1\end{aligned}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{align} +% \begin{environment}{align*} +% \begin{environment}{flalign} +% \begin{environment}{flalign*} +% \begin{environment}{alignat} +% \begin{environment}{alignat*} +% \begin{environment}{xalignat} +% \begin{environment}{xalignat*} +% \begin{environment}{xxalignat} +% The definitions of the various \env{align} environments are quite +% straight-forward. +% +% \begin{macrocode} +\newenvironment{alignat}{% + \start@align\z@\st@rredfalse +}{% + \endalign +} +\newenvironment{alignat*}{% + \start@align\z@\st@rredtrue +}{% + \endalign +} +\newenvironment{xalignat}{% + \start@align\@ne\st@rredfalse +}{% + \endalign +} +\newenvironment{xalignat*}{% + \start@align\@ne\st@rredtrue +}{% + \endalign +} +\newenvironment{xxalignat}{% + \start@align\tw@\st@rredtrue +}{% + \endalign +} +\newenvironment{align}{% + \start@align\@ne\st@rredfalse\m@ne +}{% + \math@cr \black@\totwidth@ + \egroup + \ifingather@ + \restorealignstate@ + \egroup + \nonumber + \ifnum0=`{\fi\iffalse}\fi + \else + $$% + \fi + \ignorespacesafterend +} +\newenvironment{align*}{% + \start@align\@ne\st@rredtrue\m@ne +}{% + \endalign +} +\newenvironment{flalign}{% + \start@align\tw@\st@rredfalse\m@ne +}{% + \endalign +} +\newenvironment{flalign*}{% + \start@align\tw@\st@rredtrue\m@ne +}{% + \endalign +} +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% +% +% \begin{macro}{\align@} +% TODO: Some of these sets of initializations show up in multiple +% places. It might be worth making an abbreviation for them. +% +% \begin{macrocode} +\def\align@#1#2{% + \inalign@true \intertext@ \Let@ \chardef\dspbrk@context\z@ + \ifingather@\else\displ@y@\fi + \let\math@cr@@@\math@cr@@@align + \ifxxat@\else \let\tag\tag@in@align \fi + \let\label\label@in@display + #1% set st@r + \ifst@rred\else \global\@eqnswtrue \fi + \measure@{#2}% + \global\row@\z@ + \tabskip\eqnshift@ + \halign\bgroup + \span\align@preamble\crcr + #2% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\math@cr@@@align} +% \begin{macrocode} +\def\math@cr@@@align{% + \ifst@rred\nonumber\fi + \if@eqnsw \global\tag@true \fi + \global\advance\row@\@ne + \add@amps\maxfields@ + \omit + \kern-\alignsep@ + \iftag@ + \setboxz@h{\@lign\strut@{\make@display@tag}}% + \place@tag + \fi + \ifst@rred\else\global\@eqnswtrue\fi + \global\lineht@\z@ + \cr +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\math@cr@@@align@measure} +% \begin{macrocode} +\def\math@cr@@@align@measure{% + &\omit + \global\advance\row@\@ne + \ifst@rred\nonumber\fi + \if@eqnsw \global\tag@true \fi + \ifnum\column@>\maxfields@ + \ifcheckat@ + \begingroup + \measuring@false + \@amsmath@err{Extra & on this line}% + {\the\andhelp@}% "An extra & here is disastrous" + \endgroup + \else + \global\maxfields@\column@ + \fi + \fi + \setboxz@h{\@lign\strut@{% + \if@eqnsw + \stepcounter{equation}% + \tagform@\theequation + \else + \iftag@\df@tag\fi + \fi + }}% + \savetaglength@ + \ifst@rred\else\global\@eqnswtrue\fi + \cr +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\field@lengths} +% \begin{macro}{\savefieldlength@} +% \begin{macro}{\fieldlengths@} +% \begin{macrocode} +\let\field@lengths\@empty + +\def\savefieldlength@{% + \begingroup + \let\or\relax + \xdef\field@lengths{% + \field@lengths + \ifnum\column@=0 + \or + \else + ,% + \fi + \the\wdz@ + }% + \endgroup +} + +\def\fieldlengths@#1{% + \ifcase\@xp#1\field@lengths\fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\maxcolumn@widths} +% \cs{maxcolumn@widths} will be used to hold the widths of the +% fields of the \env{alignat} environment. The widths will be +% separated by the token \cn{or}, making it easy to extract a given +% width using \cn{ifcase}. +% \begin{macrocode} +\let\maxcolumn@widths\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maxcol@width} +% \cs{maxcol@width} $n$ = maximum width of $n$th column of the current +% \env{alignat} (i.e., the $n$th field of \cs{maxcolumn@widths}.) +% It expands to a \, so it can be used as the right-hand +% side of a \ or \ statement. +% It's argument can be any \, \ or macro +% that expands to one of these. [Check to make sure this is true.] +% +% This is subtler than it looks. +% \begin{macrocode} +\def\maxcol@width#1{% + \ifcase\@xp#1\maxcolumn@widths\fi\relax +} +% \end{macrocode} +% \end{macro} +% +% Now comes the real fun. A typical \env{align} environments looks +% something like this, where the vertical bars mark the edges of +% the fields of the underlying \cs{halign}: +% \[ +% \makeatletter\tabskip\@centering\offinterlineskip +% \halign to\displaywidth{%^^A +% &$\strut$\vrule\hfil$\m@th\displaystyle{\@lign#}$\vrule +% \tabskip1pt&\vrule$\m@th\displaystyle{\@lign#}$\hfil\vrule +% \tabskip\@centering\cr +% \omit\small\hfil 1\hfil &\omit\small\hfil 2 &\omit\small\hfil +% 3\hfil &\omit\small\hfil 4\hfil & \omit\small\hfil 5\hfil +% &\omit\small\hfil 6\hfil\cr +% \noalign{\vskip8pt\relax} +% V_i + q_i v_j & =v_i , & X_i & = x_i - q_i x_j, +% & U_i & = u_i,\qquad +% \hbox{for $i\ne j$;} %&\omit\hfill \llap{(3)} +% \cr +% V_j & = v_j, & X_j & = x_j, +% & U_j & = u_j + \sum_{i\ne j} q_i u_i. %&\omit\hfill \llap{(4)} +% \cr} +% \] +% Note that each align structure consists of two fields, with no +% space between them (a small space has been added here to +% highlight the boundaries). Furthermore, the text inside the +% odd-numbered fields is flushright, while the text inside the +% even-numbered fields is flushleft. The equation tags (shown on +% the right here) can be on either the right or the left. If there +% is not room (in a sense to be defined shortly) for the tag on the +% same line as the equation, the tag will be shifted to a separate +% line. +% +% Each environment also has a certain number of ``flexible +% spaces,'' meaning spaces whose width we are allowed to adjust to +% take up the amount of ``free space'' in the line, meaning the +% space not taken up by the equation tag and the fields of the +% underlying \cs{halign}. +% +% The flexible spaces come in two flavors: interalign spaces and +% margin spaces. If there are $n$ align structures ($n=3$ in the +% illustration above), there are $n-1$ interalign spaces, unless we +% are in an \env{alignat} environment, in which case there are no +% flexible interalign spaces. +% +% The number of margin spaces is a little more complicated: +% Normally, there are two, but if we're in \opt{fleqn} mode, there +% is only one. Furthermore, if we're in an \env{xxalignat} or +% \env{flalign} environment (corresponding to $\cs{xatlevel@} = 2$, +% then there are no flexible margin spaces. +% +% Calculating the interalign and margin spaces is done in two +% stages. +% +% First, the total amount of free space is divided uniformly among +% all the flexible spaces, without regard for the lengths of the tags +% on the various lines. For the non-\opt{fleqn} case, this +% corresponds to centering the align structures between the margins. +% Note that in \opt{fleqn} mode, the right margin is still allowed to +% be larger than \cs{@mathmargin}. This introduces an element of +% asymmetry into the appearance of the environment, but it has the +% advantage of leaving more space for equation tags in the right +% margin. If the right margin were constrained to be equal to the +% left margin in this case, tags would need to be shifted to a +% separate line more often than would be desirable. +% +% Ordinarily, all flexible spaces will be given the same width. +% However, this is not invariably true, since the interalign spaces +% are constrained to be at least \cs{minalignsep} wide, while---in +% the absence of equation tags, at least---the margin spaces are +% allowed to shrink to zero. As we shall see in a minute, if there +% are tags in the environment, then the margins are also bounded +% below by \cs{mintagsep}. +% +% Next, we examine each line of the environment that has a tag to +% see if there is a gap of at least \cs{mintagsep} between the +% equation and its tag. If there isn't, we attempt to center the +% equation between the tag and the opposite margin, leaving a gap +% of at least \cs{mintagsep} on either side, in order to preserve +% some symmetry, i.e., we want the equation to \emph{look} like +% it's centered between the margin and the tag, so we don't want +% the margin space to be less than the gap between the tag and the +% equation. (Arguably, it would be better to allow the margin +% space to shrink to zero in this case in order to avoid shifting +% the tag to a separate line at any cost, but that would require +% all of our calculations to be a little more complicated and hence +% a little slower.) Finally, if no values of the interalign spaces +% and the margins (with the constraints outlined above) will +% produce an acceptable distance between the equation and its tag, +% then the tag will be shifted to a separate line. +% +% \begin{macro}{\measure@} +% \cs{measure@} collects the various bits of information that we'll +% need to perform the calculations outlined above, namely, the +% number of align structures in the environment, the natural +% lengths of the fields on each row, the maximum widths of each +% column, and the widths of the equation tags on each line. It +% also calculates the number of flexible interalign and margin +% spaces and computes the initial values of the parameters +% \cs{eqnshift@} and \cs{alignsep@}, which correspond to the widths +% of the margins and the interalign spaces, respectively. +% \begin{macrocode} +\def\measure@#1{% + \begingroup + \measuring@true + \global\eqnshift@\z@ + \global\alignsep@\z@ + \global\let\tag@lengths\@empty + \global\let\field@lengths\@empty + \savecounters@ + \global\setbox0\vbox{% + \let\math@cr@@@\math@cr@@@align@measure + \everycr{\noalign{\global\tag@false + \global\let\raise@tag\@empty \global\column@\z@}}% + \let\label\@gobble + \global\row@\z@ + \tabskip\z@ + \halign{\span\align@preamble\crcr + #1% + \math@cr@@@ + \global\column@\z@ + \add@amps\maxfields@\cr + }% + }% + \restorecounters@ +% \end{macrocode} +% It's convenient to have \cs{maxfields@} rounded up to the nearest +% even number, so that \cs{maxfields@} is precisely twice the +% number of align structures. +% \begin{macrocode} + \ifodd\maxfields@ + \global\advance\maxfields@\@ne + \fi +% \end{macrocode} +% It doesn't make sense to have a single align structure in either +% \env{flalign} or \env{xxalignat}. So, we check for that case now +% and, if necessary, switch to an \env{align} or \env{alignat}. +% Arguably, we should issue a warning message, but why bother? +% \begin{macrocode} + \ifnum\xatlevel@=\tw@ + \ifnum\maxfields@<\thr@@ + \let\xatlevel@\z@ + \fi + \fi +% \end{macrocode} +% |\box0| now contains the lines of the \cs{halign}. After the +% following maneuver, |\box1| will contain the last line of the +% \cs{halign}, which is what we're interested in. (Incidentally, +% the penalty we're removing is the \cs{@eqpen} inserted by +% \cs{math@cr}. Normally, this is \cs{interdisplaylinepenalty}, +% unless the user has overridden that with a \cs{displaybreak} +% command.) +% \begin{macrocode} + \setbox\z@\vbox{% + \unvbox\z@ \unpenalty \global\setbox\@ne\lastbox + }% +% \end{macrocode} +% |\box1| begins with \cs{tabskip} glue and contains alternating +% \cs{hbox}es (the fields whose widths we're trying to get) and +% \cs{tabskip} glue [need better diagram]: +% \begin{verbatim} +% \hbox{\tabskip\hbox\tabskip...\hbox\tabskip}\end{verbatim} +% In fact, all the \cs{tabskip} glue will be 0pt, because all the +% \cs{tabskip}s in an \env{alignat} environment have a natural +% width of 0pt, and the \cs{halign} has been set in its natural +% width. +% +% One nice result of this is that we can read \cs{totwidth@} off +% immediately, since it is just the width of |\box1|, plus +% \cs{@mathmargin} if we're in \opt{fleqn} mode. (Actually, we +% also have to take \cs{minalignsep} into account, but we'll do +% that later): +% \begin{macrocode} + \global\totwidth@\wd\@ne + \if@fleqn \global\advance\totwidth@\@mathmargin \fi +% \end{macrocode} +% Now we initialize \cs{align@lengths} and start peeling the boxes +% off, one by one, and adding their widths to \cs{align@lengths}. +% We stop when we run out of boxes, i.e., when \cs{lastbox} returns +% a void box. We're going to build a list using \cs{or} as a +% delimiter, so we want to disable it temporarily. +% \begin{macrocode} + \global\let\maxcolumn@widths\@empty + \begingroup + \let\or\relax + \loop + \global\setbox\@ne\hbox{% + \unhbox\@ne \unskip \global\setbox\thr@@\lastbox + }% + \ifhbox\thr@@ + \xdef\maxcolumn@widths{ \or \the\wd\thr@@ \maxcolumn@widths}% + \repeat + \endgroup +% \end{macrocode} +% Now we calculate the number of flexible spaces and the initial +% values of \cs{eqnshift@} and \cs{alignsep@}. +% We start by calculating $\cs{displaywidth}-\cs{totwidth@}$, +% which gives us the total amount of ``free space'' in a row. +% \begin{macrocode} + \dimen@\displaywidth + \advance\dimen@-\totwidth@ +% \end{macrocode} +% Next we calculate the number of columns of flexible spaces in the +% display, which depends on whether we're in \opt{fleqn} mode and +% in which particular environment we are in. +% +% We use \cs{@tempcnta} to store the total number of flexible spaces +% in the align and \cs{@tempcntb} for the number of interalign +% spaces. +% \begin{macrocode} + \ifcase\xatlevel@ +% \end{macrocode} +% In \env{alignat}, the interalign spaces are under user control, +% not ours. So, we set \cs{alignsep@} and \cs{minalignsep} both +% equal to 0pt. Later, when calculating a new value for +% \cs{alignsep@}, we will only save the new value if it is less +% than the current value of \cs{alignsep@} (i.e., \cs{alignsep@} +% will never increase). Since the values we calculate will never +% be negative, this will ensure that \cs{alignsep@} remains zero in +% \env{alignat}. +% \begin{macrocode} + \global\alignsep@\z@ + \let\minalignsep\z@ + \@tempcntb\z@ +% \end{macrocode} +% In \opt{fleqn} mode, the left margin---and hence the right margin +% in this case---is fixed. Otherwise, we divide the free space +% equally between the two margins. +% \begin{macrocode} + \if@fleqn + \@tempcnta\@ne + \global\eqnshift@\@mathmargin + \else + \@tempcnta\tw@ + \global\eqnshift@\dimen@ + \global\divide\eqnshift@\@tempcnta + \fi + \or +% \end{macrocode} +% In an \env{align} or \env{xalignat} environment with $n$ aligned +% structures, there are $n-1$ interalign spaces and either 1 or~2 +% flexible margins, depending on whether we're in \opt{fleqn} mode +% or not. +% \begin{macrocode} + \@tempcntb\maxfields@ + \divide\@tempcntb\tw@ + \@tempcnta\@tempcntb + \advance\@tempcntb\m@ne +% \end{macrocode} +% If we are in \opt{fleqn} mode, we fix the left margin and divide +% the free space equally among the interalign spaces and the right +% margin. +% \begin{macrocode} + \if@fleqn + \global\eqnshift@\@mathmargin + \global\alignsep@\dimen@ + \global\divide\alignsep@\@tempcnta + \else +% \end{macrocode} +% Otherwise, we divide the free space equally among the interalign +% spaces and both margins. +% \begin{macrocode} + \global\advance\@tempcnta\@ne + \global\eqnshift@\dimen@ + \global\divide\eqnshift@\@tempcnta + \global\alignsep@\eqnshift@ + \fi + \or +% \end{macrocode} +% Finally, if we're in an \env{flalign} or \env{xxalignat} +% environment, there are no flexible margins and $n-1$ flexible +% interalign spaces. +% \begin{macrocode} + \@tempcntb\maxfields@ + \divide\@tempcntb\tw@ + \global\advance\@tempcntb\m@ne + \global\@tempcnta\@tempcntb + \global\eqnshift@\z@ + \global\alignsep@\dimen@ +% \end{macrocode} +% If we're in \opt{fleqn} mode, we need to add back the +% \cs{@mathmargin} that was removed when \cs{dimen@} was originally +% calculated above. +% \begin{macrocode} + \if@fleqn + \global\advance\alignsep@\@mathmargin\relax + \fi + \global\divide\alignsep@\@tempcntb + \fi +% \end{macrocode} +% Now we make sure \cs{alignsep@} isn't too small. +% \begin{macrocode} + \ifdim\alignsep@<\minalignsep\relax + \global\alignsep@\minalignsep\relax + \ifdim\eqnshift@>\z@ + \if@fleqn\else + \global\eqnshift@\displaywidth + \global\advance\eqnshift@-\totwidth@ + \global\advance\eqnshift@-\@tempcntb\alignsep@ + \global\divide\eqnshift@\tw@ + \fi + \fi + \fi + \ifdim\eqnshift@<\z@ + \global\eqnshift@\z@ + \fi + \calc@shift@align +% \end{macrocode} +% Next, we calculate the value of \cs{tagshift@}. This is the glue +% that will be inserted in front of the equation tag to make sure +% it lines up flush against the appropriate margin. +% \begin{macrocode} + \global\tagshift@\totwidth@ + \global\advance\tagshift@\@tempcntb\alignsep@ + \if@fleqn + \ifnum\xatlevel@=\tw@ + \global\advance\tagshift@-\@mathmargin\relax + \fi + \else + \global\advance\tagshift@\eqnshift@ + \fi + \iftagsleft@ \else + \global\advance\tagshift@-\displaywidth + \fi +% \end{macrocode} +% Finally, we increase \cs{totwidth@} by an appropriate multiple of +% \cs{minalignsep}. If the result is greater than +% \cs{displaywidth}, it means that at least one line in the +% \env{align} is overfull and we will issue an appropriate warning +% message (via \cs{bl@ck}) at the end of the environment. +% \begin{macrocode} + \dimen@\minalignsep\relax + \global\advance\totwidth@\@tempcntb\dimen@ + \ifdim\totwidth@>\displaywidth + \global\let\displaywidth@\totwidth@ + \else + \global\let\displaywidth@\displaywidth + \fi + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% The code for calculating the appropriate placement of equation +% tags in the \env{align} environments is quite complicated and +% varies wildly depending on the settings of the |tagsleft@| and +% |@fleqn| switches. To minimize memory and hash space usage, we +% only define the variant appropriate for the current setting of +% those switches. +% +% It would be worthwhile to examine this code more closely someday +% and see if it could be optimized any. +% +% \paragraph{Tag placement when \cs{tagsleft@true}, +% \cs{@fleqntrue}.} +% +% We begin with the version of \cs{calc@shift@align} appropriate +% for flush-left equations with tags on the left. +% +% \begin{macro}{\calc@shift@align} +% This is the simplest case. Since the left margin is fixed, in +% general the only thing to do is check whether there is room for +% the tag in the left margin. The only exception is that if +% $\cs{eqnshift@} = 0\,\mathrm{pt}$---meaning that we're in a +% \env{flalign} environment and this is the first line with a tag +% that we've encountered---then we set $\cs{eqnshift@} = +% \cs{@mathmargin}$ and recalculate \cs{alignsep@}. This is done +% by \cs{x@calc@shift@lf}. +% \begin{macrocode} +\iftagsleft@\if@fleqn + \def\calc@shift@align{% + \global\let\tag@shifts\@empty + \begingroup +% \end{macrocode} +% \cs{@tempdima} is initialized to $\cs{@mathmargin} - +% \cs{mintagsep}$, which yields the maximum size of a tag that will +% not be shifted to another line. +% \begin{macrocode} + \@tempdima\@mathmargin\relax + \advance\@tempdima-\mintagsep\relax +% \end{macrocode} +% Now we examine each row in turn. If the width of the tag on the +% line is non-positive---meaning either that there is no tag or +% else that the user has forced it to have zero width---we mark the +% tag to remain unshifted. Otherwise, we call \cs{x@calc@shift@lf} +% to determine whether any adjustments need to be made to +% \cs{eqnshift@} and \cs{alignsep@}. Note the difference in +% treatment of zero-width tags between this code and \tex/'s +% built-in algorithm: here, a width of zero prohibits the tag from +% being shifted, while in \tex/'s built-in algorithm, a width of +% zero forces the tag to be shifted. +% \begin{macrocode} + \loop + \ifnum\row@>0 + \ifdim\tag@width\row@>\z@ + \x@calc@shift@lf + \else + \saveshift@0% + \fi + \advance\row@\m@ne + \repeat + \endgroup + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@calc@shift@lf} +% As mentioned above, \cs{x@calc@shift@lf} first checks to see if +% the current left margin is set to 0 and, if so, resets it to +% \cs{@mathmargin} and recalculates \cs{alignsep@}. Next, it +% checks whether the length of the current tag exceeds the +% previously calculated limit and, if so, marks the tag to be +% shifted to a separate line. +% \begin{macrocode} + \def\x@calc@shift@lf{% + \ifdim\eqnshift@=\z@ + \global\eqnshift@\@mathmargin\relax + \alignsep@\displaywidth + \advance\alignsep@-\totwidth@ + \global\divide\alignsep@\@tempcntb + \ifdim\alignsep@<\minalignsep\relax + \global\alignsep@\minalignsep\relax + \fi + \fi + \ifdim\tag@width\row@>\@tempdima + \saveshift@1% + \else + \saveshift@0% + \fi + } +\fi\fi +% \end{macrocode} +% \end{macro} +% +% \paragraph{Tag placement when \cs{tagsleft@false}, +% \cs{@fleqntrue}.} +% +% Next we consider the case when equations are flush-left, but tags +% are on the right. This case is somewhat more complicated than +% the previous one, since we can adjust the right margin by varying +% the inter-align separatin. Thus, when a tag is found to be too +% close to its equation, we first attempt to decrease +% \cs{alignsep@} enough to move the equation off to an acceptable +% distance. Only if that would require a value of \cs{alignsep@} +% less than \cs{minalignsep} do we move the tag to a separate line. +% +% \begin{macro}{\calc@shift@align} +% This version of \cs{calc@shift@align} differs from the previous +% version only in calling \cs{x@calc@shift@rf} rather than +% \cs{x@calc@shift@lf}. +% \begin{macrocode} +\iftagsleft@\else\if@fleqn + \def\calc@shift@align{% + \global\let\tag@shifts\@empty + \begingroup + \loop + \ifnum\row@>0 + \ifdim\tag@width\row@>\z@ + \x@calc@shift@rf + \else + \saveshift@0% + \fi + \advance\row@\m@ne + \repeat + \endgroup + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@calc@shift@rf} +% To start, we need to know two quantities: the number of align +% structures in the current row and the ``effective length'' of the +% row, defined as the distance from the left margin to the +% right edge of the text assuming that \cs{eqnshift@} and +% \cs{alignsep@} are both~0. To get the number of align +% structures, we first count the number of columns by counting the +% number of entries in the \cs{fieldlengths@} for the current row. +% The effective length is calcuated by \cs{x@rcalc@width} and put +% in the temporary register \cs{@tempdimc}, using \cs{@tempdimb} as +% an auxiliary variable. +% \begin{macrocode} + \def\x@calc@shift@rf{% + \column@\z@ + \@tempdimb\z@ + \@tempdimc\z@ + \edef\@tempb{\fieldlengths@\row@}% + \@for\@tempa:=\@tempb\do{% + \advance\column@\@ne + \x@rcalc@width + }% + \begingroup +% \end{macrocode} +% If there are $n$ columns in the current row, then there are +% $\lfloor (n+1)/2 \rfloor$ align structures and $\lfloor (n-1)/2 +% \rfloor$ interalign spaces. +% \begin{macrocode} + \advance\column@\m@ne + \divide\column@\tw@ +% \end{macrocode} +% If this is smaller than the maximum number of interalign spaces +% in the environment, then we need to reduce \cs{@tempcnta} (the +% total number of flexible spaces in the current line) by +% $\cs{@tempcntb} - \cs{column@}$ and reset \cs{@tempcntb} to +% \cs{column@}. +% \begin{macrocode} + \ifnum\@tempcntb>\column@ + \advance\@tempcnta-\@tempcntb + \advance\@tempcnta\column@ + \@tempcntb\column@ + \fi +% \end{macrocode} +% Next, we add the width of the tag and the (fixed) left margin to +% the effective length calculated above. This can be used to +% calculate how much ``free space'' there is in the current line +% and thus how much leeway we have to increase the amount of space +% between the tag and the equation. +% \begin{macrocode} + \tagwidth@\tag@width\row@\relax + \@tempdima\eqnshift@ + \advance\@tempdima\@tempdimc\relax + \advance\@tempdima\tagwidth@ +% \end{macrocode} +% The first thing to check is whether the tag should be shifted to +% a separate line. To do this, we add the minimum interalign +% separation and the \cs{mintagsep} to the value of \cs{@tempdima} +% just calculated. This yields the minimum acceptable length of +% the current line. If that is greater than \cs{displaywidth}, we +% mark the tag to be calculated. Otherwise, we mark the tag to be +% kept on the same line and then check to see if the \cs{alignsep@} +% needs to be reduced to make room for the tag. +% \begin{macrocode} + \dimen@\minalignsep\relax + \multiply\dimen@\@tempcntb + \advance\dimen@\mintagsep\relax + \advance\dimen@\@tempdima + \ifdim\dimen@>\displaywidth + \saveshift@1% + \else + \saveshift@0% +% \end{macrocode} +% Now we perform essentially the same calculation, but using the +% current value of \cs{alignsep@} instead of \cs{minalignsep}. +% This gives the current length of the line. If this is greater +% than \cs{displaywidth}, we recalculate \cs{alignsep@} to make +% room for the tag. +% \begin{macrocode} + \dimen@\alignsep@\relax + \multiply\dimen@\@tempcntb + \advance\dimen@\@tempdima + \advance\dimen@\tagwidth@ + \ifdim\dimen@>\displaywidth + \dimen@\displaywidth + \advance\dimen@-\@tempdima + \ifnum\xatlevel@=\tw@ + \advance\dimen@-\mintagsep\relax + \fi + \divide\dimen@\@tempcnta + \ifdim\dimen@<\minalignsep\relax + \global\alignsep@\minalignsep\relax + \else + \global\alignsep@\dimen@ + \fi + \fi + \fi + \endgroup + } +\fi\fi +% \end{macrocode} +% \end{macro} +% +% \paragraph{Tag placement when \cs{tagsleft@false}, +% \cs{@fleqnfalse}.} +% +% This is similar to the previous case, except for the added +% complication that both \cs{alignsep@} and \cs{eqnshift@} can +% vary, which makes the computations correspondingly more +% complicated. +% +% \begin{macro}{\calc@shift@align} +% \begin{macrocode} +\iftagsleft@\else\if@fleqn\else + \def\calc@shift@align{% + \global\let\tag@shifts\@empty + \begingroup + \loop + \ifnum\row@>0 + \ifdim\tag@width\row@>\z@ + \x@calc@shift@rc + \else + \saveshift@0% + \fi + \advance\row@\m@ne + \repeat + \endgroup + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@calc@shift@rc} +% \begin{macrocode} + \def\x@calc@shift@rc{% + \column@\z@ + \@tempdimb\z@ + \@tempdimc\z@ + \edef\@tempb{\fieldlengths@\row@}% + \@for\@tempa:=\@tempb\do{% + \advance\column@\@ne + \x@rcalc@width + }% + \begingroup + \advance\column@\m@ne + \divide\column@\tw@ + \ifnum\@tempcntb>\column@ + \advance\@tempcnta-\@tempcntb + \advance\@tempcnta\column@ + \@tempcntb\column@ + \fi + \tagwidth@\tag@width\row@\relax + \@tempdima\@tempdimc + \advance\@tempdima\tagwidth@ + \dimen@\minalignsep\relax + \multiply\dimen@\@tempcntb + \advance\dimen@\mintagsep\relax + \ifnum\xatlevel@=\tw@ \else + \advance\dimen@\mintagsep\relax + \fi + \advance\dimen@\@tempdima + \ifdim\dimen@>\displaywidth + \saveshift@1% + \else + \saveshift@0% + \dimen@\eqnshift@ + \advance\dimen@\@tempdima + \advance\dimen@\@tempcntb\alignsep@ + \advance\dimen@\tagwidth@ + \ifdim\dimen@>\displaywidth + \dimen@\displaywidth + \advance\dimen@-\@tempdima + \ifnum\xatlevel@=\tw@ + \advance\dimen@-\mintagsep\relax + \fi + \divide\dimen@\@tempcnta + \ifdim\dimen@<\minalignsep\relax + \global\alignsep@\minalignsep\relax + \eqnshift@\displaywidth + \advance\eqnshift@-\@tempdima + \advance\eqnshift@-\@tempcntb\alignsep@ + \global\divide\eqnshift@\tw@ + \else + \ifdim\dimen@<\eqnshift@ + \ifdim\dimen@<\z@ + \global\eqnshift@\z@ + \else + \global\eqnshift@\dimen@ + \fi + \fi + \ifdim\dimen@<\alignsep@ + \global\alignsep@\dimen@ + \fi + \fi + \fi + \fi + \endgroup + } +\fi\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@rcalc@width} +% \begin{macrocode} +\iftagsleft@\else + \def\x@rcalc@width{% + \ifdim\@tempa > \z@ + \advance\@tempdimc\@tempdimb + \ifodd\column@ + \advance\@tempdimc\maxcol@width\column@ + \@tempdimb\z@ + \else + \advance\@tempdimc\@tempa\relax + \@tempdimb\maxcol@width\column@ + \advance\@tempdimb-\@tempa\relax + \fi + \else + \advance\@tempdimb\maxcol@width\column@\relax + \fi + } +\fi +% \end{macrocode} +% \end{macro} +% +% \paragraph{Tag placement when \cs{tagsleft@true}, +% \cs{@fleqnfalse}.} +% +% \begin{macro}{\calc@shift@align} +% \begin{macrocode} +\iftagsleft@\if@fleqn\else + \def\calc@shift@align{% + \global\let\tag@shifts\@empty + \begingroup + \loop + \ifnum\row@>\z@ + \ifdim\tag@width\row@>\z@ + \x@calc@shift@lc + \else + \saveshift@0% + \fi + \advance\row@\m@ne + \repeat + \endgroup + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@calc@shift@lc} +% \begin{macrocode} + \def\x@calc@shift@lc{% + \column@\z@ +% \end{macrocode} +% \cs{@tempdima} will (eventually) be set to the effective width of +% the current row, defined as the distance from the leftmost point +% of the current line to the end of the last field of the +% \cs{halign}, ignoring any intervening \cs{tabskip}s, plus the +% width of the current tag. That is, it will be the width of the +% first non-empty field plus the sum of the maximum widths of all +% following fields, plus the tag width. +% +% \cs{@tempdimb} will be the ``indentation'' of leftmost end of +% text, ignoring the \cs{tabskip} glue, i.e., it will be the sum of +% the maximum widths of any fields to the left of the first +% non-empty field, plus whatever empty space there is at the +% beginning of the first non-empty field. +% \begin{macrocode} + \@tempdima\z@ % ``width of equation'' + \@tempdimb\z@ % ``indent of equation'' + \edef\@tempb{\fieldlengths@\row@}% + \@for\@tempa:=\@tempb\do{% + \advance\column@\@ne + \x@lcalc@width + }% + \begingroup + \tagwidth@\tag@width\row@\relax +% \end{macrocode} +% \cs{@tempdima} is now easy to calculate, since it is just +% $\cs{totwidth@} - \cs{@tempdimb} + \cs{tagwidth@}$. +% \begin{macrocode} + \@tempdima\totwidth@ + \advance\@tempdima-\@tempdimb + \advance\@tempdima\tagwidth@ +% \end{macrocode} +% Next, we check to see whether there is room for both the equation +% and the tag on the same line, by calculating the minimum +% acceptable length of the current row and comparing that to +% \cs{displaywidth}. Note that here we use \cs{@tempcntb}, i.e., +% the number of interalign spaces after the first non-empty align +% structure. +% \begin{macrocode} + \dimen@\minalignsep\relax + \multiply\dimen@\@tempcntb + \advance\dimen@\mintagsep\relax + \ifnum\xatlevel@=\tw@ \else + \advance\dimen@\mintagsep\relax + \fi + \advance\dimen@\@tempdima +% \end{macrocode} +% If the minimum acceptable width of the current line is greater +% than \cs{displaywidth}, we mark the current tag to be shifted to +% a separate line. +% \begin{macrocode} + \ifdim\dimen@>\displaywidth + \saveshift@1% + \else +% \end{macrocode} +% Otherwise, the tag can stay on the same line as the equation, but +% we need to check whether it is too close to the equation. So, we +% calculate the distance between the left margin and the left side +% of the equation, using the current values of \cs{eqnshift@} and +% \cs{alignsep@}. Note that we use \cs{count@} here, not +% \cs{@tempcntb}, as above. +% \begin{macrocode} + \saveshift@0% + \dimen@\alignsep@ + \multiply\dimen@\count@ + \advance\dimen@\eqnshift@ + \advance\dimen@\@tempdimb +% \end{macrocode} +% If the left margin is less than twice the tag width, we calculate +% new values of \cs{eqnshift@} and \cs{alignsep@} to move the +% equation further away from the tag. In particular, we center the +% current line between its tag and the right margin. Note that +% although we later will need to transform \cs{dimen@} into a value +% suitable for use as \cs{eqnshift@}, for the time being it is more +% useful to think of it as the space separating the tag from the +% equation. +% \begin{macrocode} + \ifdim\dimen@<2\tagwidth@ + \dimen@\displaywidth + \advance\dimen@-\@tempdima + \ifnum\xatlevel@=\tw@ + \advance\dimen@-\mintagsep\relax + \fi +% \end{macrocode} +% In certain circumstances we will get a divide-by-zero error here +% unless we guard against it. Use of \cs{@tempcnta} is complicated, +% sometimes it is assigned globally, sometimes locally. Need to sort +% it out one of these days [mjd,2000/06/02]. +% \begin{macrocode} + \ifnum\@tempcnta>\z@ + \divide\dimen@\@tempcnta + \else \dimen@\z@ + \fi +% \end{macrocode} +% As usual, we check to make sure we don't set \cs{alignsep@} +% smaller than \cs{minalignsep} and, in any case, that we don't +% replace \cs{alignsep@} by a larger value. +% \begin{macrocode} + \ifdim\dimen@<\minalignsep\relax + \global\alignsep@\minalignsep\relax + \dimen@\displaywidth + \advance\dimen@-\@tempdima + \advance\dimen@-\@tempcntb\alignsep@ + \global\divide\dimen@\tw@ + \else + \ifdim\dimen@<\alignsep@ + \global\alignsep@\dimen@ + \fi + \fi +% \end{macrocode} +% Next, we calculate an appropriate value of \cs{eqnshift@}, +% assuming that \cs{dimen@} is the desired separation between the +% tag and equation of the current line. This means that we first +% need to adjust \cs{dimen@} if we're in an \env{flalign} +% environment. +% \begin{macrocode} + \ifnum\xatlevel@=\tw@ + \dimen@\mintagsep\relax + \fi +% \end{macrocode} +% Now we calculate the value of \cs{eqnshift@} needed to produce a +% separation of \cs{dimen@} between the equation tag and the +% beginning of the equation. To do this, we need the following +% equation to hold: +% \[ +% \cs{eqnshift@} + n\cs{alignsep@} + \cs{@tempdimb} +% = \cs{tagwidth@} + \cs{dimen@} +% \] +% where $n = \cs{count@}$ is the number of interalign spaces before +% the first non-empty field of the current line. +% \begin{macrocode} + \advance\dimen@\tagwidth@ + \advance\dimen@-\@tempdimb + \advance\dimen@-\count@\alignsep@ +% \end{macrocode} +% The value of \cs{eqnshift@} just calculated is the minimum +% acceptable value; thus, we save it only if it is larger than the +% current value. +% \begin{macrocode} + \ifdim\dimen@>\eqnshift@ + \global\eqnshift@\dimen@ + \fi + \fi + \fi + \endgroup + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@lcalc@width} +% This macro calculates the ``indentation'' of the current row, as +% defined above under the description of \cs{x@calc@shift@lc}. +% This macro is called for each field of the current line, with +% \cs{@tempa} set to the width of the current field. Ideally, the +% loop enclosing \cs{x@lcalc@width} would terminate as soon as +% \cs{@tempa} is non-zero, but that would be a bit tricky to +% arrange. Instead, we use \cs{@tempdima} as a flag to signal when +% we've encountered the first non-empty field. +% +% \begin{macrocode} + \def\x@lcalc@width{% + \ifdim\@tempdima = \z@ +% \end{macrocode} +% If the current field is empty (i.e., $\cs{@tempa} = +% \mathrm{0\,pt}$, then we increment \cs{@tempdimb} by the width of +% the current field). Otherwise, we set $\cs{@tempdima} = +% \mathrm{1\,pt}$ as a signal value and increment \cs{@tempdimb} by +% the width of whatever empty space there might be at the left of +% the current field. +% \begin{macrocode} + \ifdim\@tempa > \z@ + \@tempdima\p@ + \ifodd\column@ + \advance\@tempdimb \maxcol@width\column@ + \advance\@tempdimb-\@tempa + \fi +% \end{macrocode} +% In addition, we need to adjust the values of \cs{@tempcnta} and +% \cs{@tempcntb} to account for any empty align structures that +% might occur at the beginning of the current line. More +% specifically, we first set \cs{count@} equal to the number of +% interalign spaces preceding the current field (namely, $\lfloor +% (\cs{\column@}-1)/2 \rfloor$), and then subtract \cs{count@} from +% both \cs{@tempcnta} and \cs{@tempcntb}. The rationale is that +% for the purposes of adjusting the spacing between the tag and the +% equation, the only flexible interalign spaces are those after +% the first non-empty align structure, so we need to treat those +% different from the ones before the first non-empty align +% structure. +% \begin{macrocode} + \count@\column@ + \advance\count@\m@ne + \divide\count@\tw@ + \advance\@tempcnta-\count@ + \advance\@tempcntb-\count@ + \else + \advance\@tempdimb \maxcol@width\column@\relax + \fi + \fi + } +\fi\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\place@tag} +% \cs{place@tag} takes care of the placment of tags in the +% \env{align} environments. +% \begin{macrocode} +\def\place@tag{% + \iftagsleft@ + \kern-\tagshift@ + \if1\shift@tag\row@\relax + \rlap{\vbox{% + \normalbaselines + \boxz@ + \vbox to\lineht@{}% + \raise@tag + }}% + \else + \rlap{\boxz@}% + \fi + \kern\displaywidth@ + \else + \kern-\tagshift@ + \if1\shift@tag\row@\relax +% \end{macrocode} +% Added depth to correct vertical spacing of shifted +% equation tags.---dmj, 1994/12/29 +% \begin{macrocode} + \llap{\vtop{% + \raise@tag + \normalbaselines + \setbox\@ne\null + \dp\@ne\lineht@ + \box\@ne + \boxz@ + }}% + \else + \llap{\boxz@}% + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\align@preamble} +% \begin{macrocode} +\def\align@preamble{% + &\hfil + \strut@ + \setboxz@h{\@lign$\m@th\displaystyle{##}$}% + \ifmeasuring@\savefieldlength@\fi + \set@field + \tabskip\z@skip + &\setboxz@h{\@lign$\m@th\displaystyle{{}##}$}% + \ifmeasuring@\savefieldlength@\fi + \set@field + \hfil + \tabskip\alignsep@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@field} +% \cs{set@field} increments the column counter, tracks the value of +% \cs{lineht@} and finally inserts the box containing the contents +% of the current field. +% \begin{macrocode} +\def\set@field{% + \column@plus + \iftagsleft@ + \ifdim\ht\z@>\lineht@ + \global\lineht@\ht\z@ + \fi + \else + \ifdim\dp\z@>\lineht@ + \global\lineht@\dp\z@ + \fi + \fi + \boxz@ +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection {The \env{split} environment} +% +% \begin{macro}{\split@err} +% A special error function for \env{split} to conserve main mem (at a +% cost of string pool/hash size. +% \begin{macrocode} +\edef\split@err#1{% + \@nx\@amsmath@err{% + \string\begin{split} won't work here% + }{% + \@xp\@nx\csname + Did you forget a preceding \string\begin{equation}?^^J% + If not, perhaps the `aligned' environment is what + you want.\endcsname}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{split} +% If the \env{split} environment occurs inside \env{align} or +% \env{gather}, it can make use of the enclosing halign; if it is +% called inside a simple equation, we add an implicit `gather' +% container. +% +% \begin{macrocode} +\newenvironment{split}{% + \if@display + \ifinner + \@xp\@xp\@xp\split@aligned + \else + \ifst@rred \else \global\@eqnswtrue \fi + \fi + \else \let\endsplit\@empty \@xp\collect@body\@xp\split@err + \fi + \collect@body\gather@split +}{% + \crcr + \egroup + \egroup + \iftagsleft@ \@xp\lendsplit@ \else \@xp\rendsplit@ \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\let\split@tag\relax % init +% \end{macrocode} +% +% \begin{macrocode} +\def\gather@split#1#2#3{% + \@xp\endgroup \reset@equation % math@cr will handle equation numbering + \iftag@ + \toks@\@xp{\df@tag}% + \edef\split@tag{% + \gdef\@nx\df@tag{\the\toks@}% + \global\@nx\tag@true \@nx\nonumber + }% + \else \let\split@tag\@empty + \fi + \spread@equation +% \end{macrocode} +% The extra vcenter wrapper here is not really a good thing but +% without it there are compatibility problems with old documents that +% throw in some extra material between \verb'\begin{equation}' and +% \verb'\begin{split}' (for example, \verb'\hspace{-1pc}' or +% \verb'\left\{'). [mjd,1999/09/20] +% \begin{macrocode} + \vcenter\bgroup + \gather@{\split@tag \begin{split}#1\end{split}}% + \def\endmathdisplay@a{% + \math@cr \black@ \totwidth@ \egroup + \egroup + }% +} +% \end{macrocode} +% +% \end{environment} +% +% \begin{macro}{\insplit@} +% \begin{macrocode} +\def\insplit@{% + \global\setbox\z@\vbox\bgroup + \Let@ \chardef\dspbrk@context\@ne \restore@math@cr + \default@tag % disallow use of \tag here + \ialign\bgroup + \hfil + \strut@ + $\m@th\displaystyle{##}$% + &$\m@th\displaystyle{{}##}$% + \hfill % Why not \hfil?---dmj, 1994/12/28 + \crcr +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rendsplit@} +% Moved the box maneuvers inside the \cs{ifinalign@}, since that is +% the only place they are needed.---dmj, 1994/12/28 +% +% TODO: Explore interaction of tag-placement algorithm with +% \env{split}. Is there any way for \env{split} to pass the +% relevant information out to the enclosing \env{gather} or +% \env{align}? +% \begin{macrocode} +\def\rendsplit@{% + \ifinalign@ +% \end{macrocode} +% Changed |\box9| into a \cs{vtop} here for better spacing. +% \begin{macrocode} + \global\setbox9 \vtop{% + \unvcopy\z@ + \global\setbox8 \lastbox + \unskip + }% + \setbox\@ne\hbox{% + \unhcopy8 + \unskip + \global\setbox\tw@\lastbox + \unskip + \global\setbox\thr@@\lastbox + }% + \ifctagsplit@ + \gdef\split@{% + \hbox to\wd\thr@@{}% + &\vcenter{\vbox{\moveleft\wd\thr@@\boxz@}}% + }% + \else + \global\setbox7 \hbox{\unhbox\tw@\unskip}% +% \end{macrocode} +% Added \cs{add@amps} to make sure we put the last line of the +% \env{split} into the proper column of an \env{align} environment +% with multiple align structures.---dmj, 1994/12/28 +% +% Special care has to be taken in this case because the \env{split} +% turns into two lines of the \env{align} instead of just one. So, +% we have to make sure that the first line produced by the +% \env{split} doesn't upset our bookkeeping, hence we call +% \cs{savetaglength@} to insert 0\,pt as the tag for this +% pseudo-line, and we advance the \cs{row@} counter and reset +% \cs{lineht@} afterwards. It would be nice if we could just +% replace the \cs{crcr} by \cs{math@cr@@@}, but that would cause +% problems with the tag processing. +% \begin{macrocode} + \gdef\split@{% + \global\@tempcnta\column@ + &\setboxz@h{}% + \savetaglength@ + \global\advance\row@\@ne + \vbox{\moveleft\wd\thr@@\box9}% + \crcr + \noalign{\global\lineht@\z@}% + \add@amps\@tempcnta + \box\thr@@ + &\box7 + }% + \fi + \else + \ifctagsplit@ + \gdef\split@{\vcenter{\boxz@}}% + \else +% \end{macrocode} +% Changed to just \cs{boxz@}, otherwise last line gets centered +% rather than aligned properly with respect to the rest of the +% lines. But this means that we can't see inside of the last line +% to decide whether the tag needs to be moved. Will have to think +% about this.---dmj, 1994/12/28 +% \begin{macrocode} + \gdef\split@{% + \boxz@ +% \box9 +% \crcr +% \hbox{\box\thr@@\box7}% + }% + \fi + \fi + \aftergroup\split@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lendsplit@} +% \begin{macrocode} +\def\lendsplit@{% + \global\setbox9\vtop{\unvcopy\z@}% + \ifinalign@ +% \end{macrocode} +% Moved following two boxes inside the \cs{ifinalign@}, since they +% are only used in that case. In fact, if we just kept track of +% the width of the first column, we could dispense with this +% entirely. Surely that would be more efficient than all these box +% copies.---dmj, 1994/12/28 +% \begin{macrocode} + \setbox\@ne\vbox{% + \unvcopy\z@ + \global\setbox8\lastbox + }% + \setbox\@ne\hbox{% + \unhcopy8% + \unskip + \setbox\tw@\lastbox + \unskip + \global\setbox\thr@@\lastbox + }% + \ifctagsplit@ + \gdef\split@{% + \hbox to\wd\thr@@{}% + &\vcenter{\vbox{\moveleft\wd\thr@@\box9}}% + }% + \else + \gdef\split@{% + \hbox to\wd\thr@@{}% + &\vbox{\moveleft\wd\thr@@\box9}% + }% + \fi + \else + \ifctagsplit@ + \gdef\split@{\vcenter{\box9}}% + \else + \gdef\split@{\box9}% + \fi + \fi + \aftergroup\split@ +} +% \end{macrocode} +% \end{macro} +% +% With \pkg{amsmath} 1.2 it was possible to put things like +% \verb'\left\{' between \verb'\begin{equation}' and +% \verb'\begin{split}' without getting any error message. For +% backward compatibility we try to avoid a fatal error in this case +% and instead attempt recovery with \env{aligned}. +% \begin{macrocode} +\def\split@aligned#1#2{% + \iffalse{\fi\ifnum0=`}\fi + \collect@body\split@al@a} +% \end{macrocode} +% +% \begin{macrocode} +\def\split@al@a#1#2#3{% + \split@warning + \endgroup +% \end{macrocode} +% If the \opt{fleqn} and \opt{tbtags} options are both in effect then +% we will need to add an optional argument on the \env{aligned} +% environment. +% \begin{macrocode} + \toks@{\begin{aligned}}% + \if@fleqn \split@al@tagcheck \fi +% \end{macrocode} +% The \cs{relax} here is to prevent \cs{@let@token} from being left +% equal to an ampersand if that happens to be the first thing in the body. +% \begin{macrocode} + \the\toks@\relax#1\end{aligned}% + \ifnum0=`{\fi\iffalse}\fi +} +% \end{macrocode} +% +% \begin{macrocode} +\def\split@al@tagcheck{% + \ifctagsplit@ + \else + \iftagsleft@ \toks@\@xp{\the\toks@ [t]}% + \else \toks@\@xp{\the\toks@ [b]}% + \fi + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\def\split@warning{% + \PackageWarning{amsmath}{% +Cannot use `split' here;\MessageBreak trying to recover with `aligned'}% +} +% \end{macrocode} +% +% \subsection{The \env{multline} environment} +% +% In the original \amstex/, \cn{multlinegap} is a macro with an +% argument that resets an internal dimension (one with an \qc{\@} +% character in its name). Here, to save control sequence names, we +% define \cn{multlinegap} to be the dimension itself and the +% documentation instructs users to use \cn{setlength} if they +% need to change it. +% \begin{macro}{\multlinegap} +% \begin{macro}{\multlinetaggap} +% Changed \cs{multlinegap} and \cs{multlinetaggap} to skip +% registers. Also changed name to \cs{multlinetaggap} from +% \cs{multlinetaggap@}. +% \begin{macrocode} +\newskip\multlinegap +\multlinegap10pt +\newskip\multlinetaggap +\multlinetaggap10pt +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\start@multline} +% \begin{macrocode} +\def\start@multline#1{% + \RIfM@ + \nomath@env + \DN@{\@namedef{end\@currenvir}{}\@gobble}% + \else + $$% + #1% + \ifst@rred + \nonumber + \else + \global\@eqnswtrue + \fi + \let\next@\multline@ + \fi + \collect@body\next@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{multline} +% \begin{environment}{multline*} +% \begin{macrocode} +\newenvironment{multline}{% + \start@multline\st@rredfalse +}{% + \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi + \ignorespacesafterend +} +% \end{macrocode} +% +% \begin{macrocode} +\newenvironment{multline*}{\start@multline\st@rredtrue}{\endmultline} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \begin{macro}{\multline@} +% \begin{macrocode} +\def\multline@#1{% + \Let@ +% \end{macrocode} +% +% For multline neither \cs{displ@y} no \cs{displ@y@} is quite right; +% we want to advance the row number and (I suppose?) the +% display-pagebreak level, but we only want to do tag-related stuff +% once before the first line, not repeat it for every line. (Recall +% that the arg of \cs{@display@init} goes into \cs{everycr}.) +% \begin{macrocode} + \@display@init{\global\advance\row@\@ne \global\dspbrk@lvl\m@ne}% + \chardef\dspbrk@context\z@ + \restore@math@cr +% \end{macrocode} +% The \env{multline} environment is somewhat unusual, in that +% \cs{tag} and \cs{label} are enabled only during the measuring +% phase and disabled during the production phase. +% Here we disable \cs{tag} and \cs{label}; \cs{mmeasure@} will +% re-enable them temporarily. +% \begin{macrocode} + \let\tag\tag@in@align + \global\tag@false \global\let\raise@tag\@empty + \mmeasure@{#1}% + \let\tag\gobble@tag \let\label\@gobble + \tabskip \if@fleqn \@mathmargin \else \z@skip \fi + \totwidth@\displaywidth + \if@fleqn + \advance\totwidth@-\@mathmargin + \fi + \halign\bgroup + \hbox to\totwidth@{% +% \end{macrocode} +% In order to get the spacing of the last line right in fleqn +% mode, we need to play a little game here. Normally the +% stretchability of the \cs{hskip} here will be suppressed by the +% \cs{hfil} at the end of the template, except inside the last line, +% when that \cs{hfil} will be removed by the \cs{hfilneg} in +% \cs{lendmultline@}. +% \begin{macrocode} + \if@fleqn + \hskip \@centering \relax + \else + \hfil + \fi + \strut@ + $\m@th\displaystyle{}##\endmultline@math + \hfil + }% + \crcr +% \end{macrocode} +% In \opt{fleqn} mode, it's the \cs{tabskip} of \cs{@mathmargin} +% that needs to be removed in the first line, not the \cs{hfil} at +% the beginning of the template. +% \begin{macrocode} + \if@fleqn + \hskip-\@mathmargin + \def\multline@indent{\hskip\@mathmargin}% put it back + \else + \hfilneg + \def\multline@indent{\hskip\multlinegap}% + \fi + \iftagsleft@ + \iftag@ + \begingroup + \ifshifttag@ + \rlap{\vbox{% + \normalbaselines + \hbox{% + \strut@ + \make@display@tag + }% + \vbox to\lineht@{}% + \raise@tag + }}% +% \end{macrocode} +% If the equation tag doesn't fit on the same line with the first +% line of the display, we'll indent the first line by +% \cn{multlinegap}. This is a change from \pkg{amstex}, where the +% first line would have been flush against the left margin in this +% case. A corresponding change will be made in \cs{rendmultline@}. +% \begin{macrocode} + \multline@indent + \else + \setbox\z@\hbox{\make@display@tag}% + \dimen@\@mathmargin \advance\dimen@-\wd\z@ + \ifdim\dimen@<\multlinetaggap + \dimen@\multlinetaggap + \fi + \box\z@ \hskip\dimen@\relax + \fi + \endgroup + \else + \multline@indent + \fi + \else + \multline@indent + \fi + #1% +} +% \end{macrocode} +% +% An extra level of indirection for the closing \verb'$' in multline +% allows us to avoid getting an extra thinmuskip from a final +% mathpunct in the equation contents, when equation numbers are on +% the right. If we did not use this workaround, the sequence of +% elements for a final comma would be, e.g., +% \begin{verbatim} +% ... , +% \end{verbatim} +% which is equivalent to a sequence \verb'' as +% far as the automatic math spacing is concerned. +% \begin{macrocode} +\def\endmultline@math{$} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lendmultline@} +% Bug fix: changed \cs{crcr} to \cs{math@cr} so that \cs{@eqpen} +% gets reset properly if \cs{displaybreak} is used on the +% penultimate line of an \env{align}. +% \begin{macrocode} +\def\lendmultline@{% + \hfilneg + \hskip\multlinegap + \math@cr + \egroup + $$% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rendmultline@} +% \begin{macrocode} +\def\rendmultline@{% + \iftag@ + $\let\endmultline@math\relax + \ifshifttag@ + \hskip\multlinegap +% \end{macrocode} +% Added depth to correct vertical spacing of shifted equation +% tags.---dmj, 1994/12/29 +% \begin{macrocode} + \llap{\vtop{% + \raise@tag + \normalbaselines + \setbox\@ne\null + \dp\@ne\lineht@ + \box\@ne + \hbox{\strut@\make@display@tag}% + }}% + \else + \hskip\multlinetaggap + \make@display@tag + \fi + \else + \hskip\multlinegap + \fi + \hfilneg +% \end{macrocode} +% Use \cs{math@cr} rather than just \cs{crcr} so that \cs{@eqpen} +% gets reset properly if \cs{displaybreak} is used. +% \begin{macrocode} + \math@cr + \egroup$$% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mmeasure@} +% \begin{macrocode} +\def\mmeasure@#1{% + \begingroup + \measuring@true +% \end{macrocode} +% We use \cs{begin/endgroup} rather than |{}| in this definition of +% \cn{label} because the latter would create an extra (wasteful of +% main mem) null box in the current math list. [mjd, 1995/01/17] +% \begin{macrocode} + \def\label##1{% + \begingroup\measuring@false\label@in@display{##1}\endgroup}% + \def\math@cr@@@{\cr}% + \let\shoveleft\@iden \let\shoveright\@iden + \savecounters@ + \global\row@\z@ + \setbox\@ne\vbox{% + \global\let\df@tag\@empty + \halign{% + \setboxz@h{\@lign$\m@th\displaystyle{}##$}% + \iftagsleft@ + \ifnum\row@=\@ne + \global\totwidth@\wdz@ + \global\lineht@\ht\z@ + \fi + \else + \global\totwidth@\wdz@ + \global\lineht@\dp\z@ + \fi + \crcr + #1% + \crcr + }% + }% + \ifx\df@tag\@empty\else\global\tag@true\fi + \if@eqnsw\global\tag@true\fi + \iftag@ + \setboxz@h{% + \if@eqnsw + \stepcounter{equation}% + \tagform@\theequation + \else + \df@tag + \fi + }% + \global\tagwidth@\wdz@ + \dimen@\totwidth@ + \advance\dimen@\tagwidth@ + \advance\dimen@\multlinetaggap + \iftagsleft@\else + \if@fleqn + \advance\dimen@\@mathmargin + \fi + \fi + \ifdim\dimen@>\displaywidth + \global\shifttag@true + \else + \global\shifttag@false + \fi + \fi + \restorecounters@ + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\shoveleft} +% \begin{macro}{\shoveright} +% \cs{shoveleft} and \cs{shoveright} need to do slightly different +% things depending on whether tags are on the left or the right and +% whether we're in \opt{fleqn} mode. For compactness of code, we +% make the appropriate decisions at ``compile'' time rather than at +% load time. +% +% TODO: Investigate making \cs{shoveright} behave ``properly''(?) if +% used on the first line of a \env{multline} and make \cs{shoveleft} +% behave properly if used on the last line of a \env{multline}. But +% in his \fn{amstex.doc} Spivak indicates those commands should never +% be used on a first or last line. Perhaps better to leave the +% question open unless/until real-life examples turn up. +% \begin{macrocode} +\iftagsleft@ + \def\shoveright#1{% + #1% + \hfilneg + \hskip\multlinegap + } +\else + \def\shoveright#1{% + #1% + \hfilneg + \iftag@ + \ifshifttag@ + \hskip\multlinegap + \else + \hskip\tagwidth@ + \hskip\multlinetaggap + \fi + \else + \hskip\multlinegap + \fi + } +\fi + +\if@fleqn + \def\shoveleft#1{#1}% +\else + \iftagsleft@ + \def\shoveleft#1{% + \setboxz@h{$\m@th\displaystyle{}#1$}% + \setbox\@ne\hbox{$\m@th\displaystyle#1$}% + \hfilneg + \iftag@ + \ifshifttag@ + \hskip\multlinegap + \else + \hskip\tagwidth@ + \hskip\multlinetaggap + \fi + \else + \hskip\multlinegap + \fi + \hskip.5\wd\@ne + \hskip-.5\wdz@ + #1% + } + \else + \def\shoveleft#1{% + \setboxz@h{$\m@th\displaystyle{}#1$}% + \setbox\@ne\hbox{$\m@th\displaystyle#1$}% + \hfilneg + \hskip\multlinegap + \hskip.5\wd\@ne + \hskip-.5\wdz@ + #1% + } + \fi +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{The \env{equation} environment} +% +% Rewritten from the ground up for version 2.0 to fix no-shrink and +% no-shortskips bugs [mjd,2000/01/06]. +% +% Standard \latex/ provides three environments for one-line equations: +% \cn{[}\cn{]}, \env{equation}, and \env{displaymath}. We add +% \env{equation*} as a synonym for \env{displaymath}. +% \begin{macrocode} +\@saveprimitive\leqno\@@leqno +\@saveprimitive\eqno\@@eqno +\def\eqno{\@@eqno\let\eqno\relax\let\leqno\relax} +\def\leqno{\@@leqno\let\leqno\relax\let\eqno\relax} +% +\let\veqno=\@@eqno +\iftagsleft@ \let\veqno=\@@leqno \fi +% \end{macrocode} +% +% Support for the \pkg{showkeys} package: provide no-op definitions +% for a couple of SK functions, if they are not already defined. Then +% we can just call them directly in our code without any extra fuss. +% If the \pkg{showkeys} package is loaded later, our trivial +% definitions will get overridden and everything works fine. +% \begin{macrocode} +\@ifundefined{SK@@label}{% + \let\SK@@label\relax \let\SK@equationtrue\relax +}{} +% \end{macrocode} +% +% \begin{macrocode} +\let\reset@equation\@empty +% \end{macrocode} +% +% Cf \cs{tag@in@align}. This is a bit of a mess though. Could use +% some work. [mjd,1999/12/21] +% \begin{macrocode} +\let\alt@tag\@empty +\def\tag@in@display#1#{\relax\tag@in@display@a{#1}} +\def\tag@in@display@a#1#2{% + \iftag@ + \invalid@tag{Multiple \string\tag}\relax + \else + \global\tag@true \nonumber \reset@equation \st@rredtrue + \if *\string#1% + \gdef\alt@tag{\def\SK@tagform@{#2\@gobble}% + \ifx\SK@@label\relax \let\tagform@\SK@tagform@ \fi + }% + \make@df@tag@@{#2}% + \else + \make@df@tag@@@{#2}% + \fi + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\let\restore@hfuzz\@empty +% \end{macrocode} +% +% \begin{macrocode} +\def\mathdisplay#1{% + \ifmmode \@badmath + \else + $$\def\@currenvir{#1}% +% \end{macrocode} +% Allow use of \cn{displaybreak}. +% \begin{macrocode} + \let\dspbrk@context\z@ +% \end{macrocode} +% Although in some cases simpler label handling would seem to be +% sufficient, always using \cs{label@in@display} makes it easier to +% support the \pkg{showkeys} package. +% \begin{macrocode} + \let\tag\tag@in@display \let\label\label@in@display \SK@equationtrue + \global\let\df@label\@empty \global\let\df@tag\@empty + \global\tag@false + \let\mathdisplay@push\mathdisplay@@push + \let\mathdisplay@pop\mathdisplay@@pop + \if@fleqn +% \end{macrocode} +% Turn off overfull box messages temporarily\mdash otherwise there +% would be unwanted extra ones emitted during our measuring +% operations. +% \begin{macrocode} + \edef\restore@hfuzz{\hfuzz\the\hfuzz\relax}% + \hfuzz\maxdimen +% \end{macrocode} +% Initially set the equation body in a box of displaywidth. Then if +% the box is not overfull, as we find by checking \cs{badness}, we +% have acquired useful information for the subsequent processing. +% \begin{macrocode} + \setbox\z@\hbox to\displaywidth\bgroup + \let\split@warning\relax \restore@hfuzz + \everymath\@emptytoks \m@th $\displaystyle + \fi + \fi +} +% \end{macrocode} +% +% Arg 1 is not currently used. I thought it might come in handy for +% error messages. +% \begin{macrocode} +\def\endmathdisplay#1{% + \ifmmode \else \@badmath \fi + \endmathdisplay@a + $$% +% \end{macrocode} +% I guess the following code means this structure is non-reentrant. +% But there is plenty of scope for tricky bugs here; suppressing them +% by brute force at least makes it possible to get things working +% correctly for normal use. [mjd,2000/01/06] +% \begin{macrocode} + \global\let\df@label\@empty \global\let\df@tag\@empty + \global\tag@false \global\let\alt@tag\@empty + \global\@eqnswfalse +} +% \end{macrocode} +% +% \begin{macrocode} +\def\endmathdisplay@a{% + \if@eqnsw \gdef\df@tag{\tagform@\theequation}\fi + \if@fleqn \@xp\endmathdisplay@fleqn + \else \ifx\df@tag\@empty \else \veqno \alt@tag \df@tag \fi + \ifx\df@label\@empty \else \@xp\ltx@label\@xp{\df@label}\fi + \fi + \ifnum\dspbrk@lvl>\m@ne + \postdisplaypenalty -\@getpen\dspbrk@lvl + \global\dspbrk@lvl\m@ne + \fi +} +% \end{macrocode} +% +% A boolean variable: Was that last box overfull or not? A value of 0 +% means yes, it was overfull. +% \begin{macrocode} +\let\too@wide\@ne +% \end{macrocode} +% +% Special handling is needed for flush-left equations. We need to +% measure the equation body (found in box 0 after we close it with +% the \cs{egroup}). Then after a fairly normal test to see if it fits +% within the available space, we need to consider overlapping into +% the displayindent area if displayindent is nonzero (as in an +% indented list). If there is an equation number we may have to shift +% it by hand to a separate line when there is not enough room; +% we can no longer take advantage of the automatic shifting provided +% by the \cn{leqno}, \cn{eqno} primitives. +% +% We initially add \cs{@mathmargin} glue at the end of box 0 to get +% an accurate overfull test. If \cs{@mathmargin} contains any shrink +% then we cannot reliably tell whether the box will be overfull or +% not simply by doing hand calculations from the actual width of the +% equation body. We have to actually set the box and find out what +% happens. +% +% On the other hand if we put the \cs{@mathmargin} glue at the +% beginning of the box it's awkward to remove it afterwards. So we +% first put it in at the end and later we will move it to the +% beginning as needed. +% +% \begin{macrocode} +\def\endmathdisplay@fleqn{% + $\hfil\hskip\@mathmargin\egroup +% \end{macrocode} +% We need to save the information about whether box 0 was overfull in +% a variable, otherwise it will disappear in the next setbox +% operation. And we couldn't set the equation number box earlier than +% now, because the body of the equation might have contained a +% \cs{tag} command (well, it could have been done, but this way +% we can reuse the tag-handling code from elsewhere). +% \begin{macrocode} + \ifnum\badness<\inf@bad \let\too@wide\@ne \else \let\too@wide\z@ \fi + \ifx\@empty\df@tag + \else + \setbox4\hbox{\df@tag + \ifx\df@label\@empty \else \@xp\ltx@label\@xp{\df@label}\fi + }% + \fi + \csname emdf@% + \ifx\df@tag\@empty U\else \iftagsleft@ L\else R\fi\fi + \endcsname +} +% \end{macrocode} +% +% For an unnumbered flush-left equation we hope first that the +% the contents fit within displaywidth. If not we need to fall back +% on a more complicated reboxing operation. +% \begin{macrocode} +\def\emdf@U{% + \restore@hfuzz + \ifodd\too@wide % not too wide: just need to swap the glue around + \hbox to\displaywidth{\hskip\@mathmargin\unhbox\z@\unskip}% + \else % M+B > displaywidth + \emdf@Ua + \fi +} +% \end{macrocode} +% +% Some notation: $M$ \cs{@mathmargin}, $B$ the width of the equation +% body, $I$ \cs{displayindent}, $D$ \cs{displaywidth}, $N$ the width +% of the equation number (aka the tag), $S$ \cs{mintagsep}, $C$ +% \cs{columnwidth}. If $M+B > \mbox{displaywidth}$, and if we assume +% $M$ contains shrink, then the only solution left is to encroach +% into the displayindent space. +% \begin{macrocode} +\def\emdf@Ua{% + \hbox to\columnwidth{% + \ifdim\displayindent>\z@ + \hskip\displayindent minus\displayindent + \fi + \hskip\@mathmargin \unhbox\z@ \unskip + }% + \displayindent\z@ \displaywidth\columnwidth +} +% \end{macrocode} +% +% Find out first if the tag fits in ideal position. If so we can just +% plunk down box 2. Otherwise we need to do something more complicated. +% \begin{macrocode} +\def\emdf@R{% + \setbox\tw@\hbox to\displaywidth{% + \hskip\@mathmargin \unhcopy\z@\unskip\hfil\hskip\mintagsep\copy4 + }% + \restore@hfuzz + \ifnum\badness<\inf@bad \box\tw@ \else \emdf@Ra \fi +} +% \end{macrocode} +% +% We shift the equation number to line 2 if it does not fit within +% \cs{displaywidth}. Note that we do not first attempt to let the +% equation body shift leftward into the \cs{displayindent} space. If +% that is desired it will have to be done by hand by adding negative +% space at the beginning of the equation body. I don't expect this to +% arise very often in practice since most of the time +% \cs{displayindent} is zero anyway. +% \begin{macrocode} +\def\emdf@Ra{% + \skip@\displayindent minus\displayindent + \displayindent\z@ \displaywidth\columnwidth + \spread@equation \everycr{}\tabskip\z@skip + \halign{\hbox to\displaywidth{##}\cr + \relax + \ifdim\skip@>\z@ \hskip\skip@ \fi + \hskip\@mathmargin\unhbox\z@\unskip\hfil\cr + \noalign{\raise@tag}% + \hfil\box4 \cr}% +} +% \end{macrocode} +% +% Find out first if the tag fits in ideal position. If so we can just +% plunk down box 2. Otherwise we need to do something more +% complicated. +% \begin{macrocode} +\def\emdf@L{% +% \end{macrocode} +% Calculate the difference between $M$ and $N+S$. If the latter is +% greater, we don't want to add any extra glue between the number and +% the equation body. Otherwise the amount that we want to add is +% \verb'x minus x' where $x=M-(N+S)$. I.e., the distribution of +% spaces across the line is $N,S,x minus x,B,hfil$. +% \begin{macrocode} + \@tempdima\@mathmargin + \advance\@tempdima-\wd4 \advance\@tempdima-\mintagsep + \skip@\@tempdima minus\@tempdima + \setbox\tw@\hbox to\displaywidth{% + \copy4\hskip\mintagsep + \ifdim\skip@>\z@ \hskip\skip@\fi + \unhcopy\z@\unskip + }% + \restore@hfuzz + \ifnum\badness<\inf@bad \box\tw@ \else \emdf@La \fi +} +% \end{macrocode} +% +% If the equation body and equation number will not fit on the same +% line, we put the number on line 1 and the body on line 2, with the +% body positioned as for an unnumbered equation. +% \begin{macrocode} +\def\emdf@La{% + \spread@equation \everycr{}\tabskip\z@skip + \halign{\hbox to\displaywidth{##}\cr + \box4 \hfil \cr + \noalign{\raise@tag}% + \hskip\@mathmargin\unhbox\z@\unskip\hfil\cr}% +} +% \end{macrocode} +% +% If someone has \verb'\[ \]' nested inside a minipage environment +% nested inside a numbered equation, the mathdisplay variables that +% are global will get out of whack unless we take extra care. So we +% make a stack and push all the variables before entering mathdisplay +% and pop them afterwards. But we can save a little work by not doing +% this at the top level, only at inner levels. +% \begin{macrocode} +\newtoks\mathdisplay@stack +\let\mathdisplay@push\@empty +\def\mathdisplay@@push{% + \begingroup + \toks@\@xp{\df@label}\@temptokena\@xp{\df@tag}% + \toks8\@xp{\alt@tag}% + \edef\@tempa{% + \global\if@eqnsw\@nx\@eqnswtrue\else\@nx\@eqnswfalse\fi + \global\iftag@\@nx\tag@false\else\@nx\tag@true\fi + \gdef\@nx\df@label{\the\toks@}\gdef\@nx\df@tag{\the\@temptokena}% + \gdef\@nx\alt@tag{\the\toks8}% + \global\mathdisplay@stack{\the\mathdisplay@stack}% + }% + \global\mathdisplay@stack\@xp{\@tempa} + \endgroup +} +% \end{macrocode} +% +% \begin{macrocode} +\let\mathdisplay@pop\@empty +\def\mathdisplay@@pop{\the\mathdisplay@stack} +% \end{macrocode} +% +% \begin{macrocode} +\renewenvironment{equation}{% + \incr@eqnum + \mathdisplay@push + \st@rredfalse \global\@eqnswtrue + \mathdisplay{equation}% +}{% + \endmathdisplay{equation}% + \mathdisplay@pop + \ignorespacesafterend +} +% \end{macrocode} +% +% \begin{macrocode} +\newenvironment{equation*}{% + \mathdisplay@push + \st@rredtrue \global\@eqnswfalse + \mathdisplay{equation*}% +}{% + \endmathdisplay{equation*}% + \mathdisplay@pop + \ignorespacesafterend +} +% \end{macrocode} +% +% Note: \latex/ defines the \env{displaymath} environment in +% terms of \cn{[} and \cn{]}. +% \begin{macrocode} +\DeclareRobustCommand{\[}{\begin{equation*}} +\DeclareRobustCommand{\]}{\end{equation*}} +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \section{Credits} +% +% Much of the code for the \pkg{amsmath} package had its orgin in +% \fn{amstex.tex}, written by Michael Spivak. The initial work of +% porting \fn{amstex.tex} to \fn{amstex.sty} was done in 1988--1989 +% by Frank Mittelbach and Rainer Sch\"opf. In 1994 David M. Jones +% added the support for the \opt{fleqn} option and did extensive +% improvements to the \env{align[at]} family of environments and to +% the equation number handling in general. Michael Downes at the AMS +% served as coordinator for the efforts of Mittelbach, Sch\"opf, and +% Jones, and has contributed various bug fixes and additional +% refinements over time. +% +% Versions 1.0 and 1.1 of the package carried the name \pkg{amstex} +% instead of \pkg{amsmath}, to indicate its origins; the name was +% changed in 1994 to make it user-oriented rather than +% history-oriented. +% +% \changes{v1.2b}{1995/02/15}{Added kern -alignsep@ to math@cr@@@align} +% \changes{v1.2b}{1995/02/15}{Modified one piece of measure@} +% \changes{v1.2b}{1995/02/15}{Cleaned out some obsolete commentary} +% \changes{v1.2b}{1995/02/15}{Changed kern tagshift@ to kern -tagshift@ +% in the reqno case of place@tag} +% +% \changes{v1.2c}{1996/11/01}{Changed `over etc from error to warning} +% +% \changes{v1.2d}{1997/03/20}{% +% Removed dependency on mixed-case fd file names} +% +% \CheckSum{6699} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsmidx.dtx b/Master/texmf-dist/source/latex/amslatex/amsmidx.dtx new file mode 100644 index 00000000000..3692d6cc76c --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsmidx.dtx @@ -0,0 +1,241 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsmidx.dtx", +%%% version = "2.01", +%%% date = "2004/08/03", +%%% time = "14:45:42 EDT", +%%% checksum = "63234 241 948 8307", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995, 2004 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Publications Technical Group, +%%% 201 Charles Street, +%%% Providence, RI 02904, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, amslatex, multiple indexes", +%%% supported = "yes", +%%% abstract = "This is part of the AMS-\LaTeX{} distribution. +%%% It contains code to support the creation and +%%% typesetting of multiple indexes with AMS-LaTeX{} +%%% document classes, superseding the single-index +%%% facilities built into those document classes. +%%% It also provides a facility to insert a paragraph +%%% of comments between the title and the index proper", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +% \iffalse +%<*driver> +\documentclass{amsdtx} +\begin{document} +\title{The \pkg{amsmidx} package} +\author{American Mathematical Society\\Barbara Beeton} +\date{Version \fileversion, \filedate} +\hDocInput{amsmidx.dtx} +\end{document} +% +% \fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% +% This package provides the facility to produce multiple indexes +% with \amslatex/ document classes (particularly \fn{amsbook} and +% the AMS author packages for books), superseding the built-in +% index facility which can accommodate only one index. This may +% in the future be incorporated as an option into the \amslatex/ +% document classes. +% +% This package is based on \pkg{multind.sty} by F.W. Long. +% +% \StopEventually{} +% +% Standard file identification. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{amsmidx}[2004/08/03 v2.01 multiple indexes for AMS classes] +% \end{macrocode} +% +% \section{User instructions} +% +% In the preamble, invoke \cn{makeindex} with a file name to provide +% as many indexes as desired: +%\begin{verbatim} +% \makeindex{filename-a} +% \makeindex{filename-b} +%\end{verbatim} +% This will initiate the creation of \fn{filename-a.idx} etc. +% +% In the body of the text, use the \cn{index} command with two +% arguments +%\begin{verbatim} +% \index{filename-a}{index term} +%\end{verbatim} +% as appropriate to populate the \fn{.idx} files. +% +% In the \cn{backmatter} segment of the driver file, insert the +% \cn{Printendex} command to print the indexes; the second argument +% gives the title to be printed at the top of the index: +%\begin{verbatim} +% \Printindex{filename-a}{First Index} +% \Printindex{filename-b}{Second Index} +%\end{verbatim} +% +% On the first pass, the \fn{.idx} files will be created. Process +% each \fn{.idx} file with \textit{MakeIndex} to generate an \fn{.ind} +% file, which will then be read in by \cn{Printindex}. Whenever any +% page references change, be sure to run \textit{MakeIndex} again, +% and process the entire job with \latex/ once more to get the correct +% page references in the indexes. +% +% To include a paragraph of comments below the index title, insert +% the text as an \cn{indexcomment} before the relevant \cn{Printindex}: +%\begin{verbatim} +% \indexcomment{Text of comments} +% \Printindex{...}{...} +%\end{verbatim} +% The \cn{indexcomment} text will be cleared after use. +% +% +% \section{Implementation} +% +% \begin{macro}{makeindex} +% Redefine \cn{makeindex} to create a new \fn{.idx} file with the +% name provided by argument |#1|. +% \begin{macrocode} +\renewcommand{\makeindex}[1]{% + \begingroup + \makeatletter + \if@filesw \expandafter\newwrite\csname #1@idxfile\endcsname + \expandafter\immediate\openout \csname #1@idxfile\endcsname #1.idx\relax + \typeout{Writing index file #1.idx }\fi + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{index} +% Redefine \cn{index} to specify into which file/index the term is +% to be placed. Argument |#1| identifies the file, |#2| provides +% the text of the term to be indexed. +% \begin{macrocode} +\renewcommand{\index}[1]{% + \@bsphack + \begingroup + \def\protect##1{\string##1\space}\@sanitize\@wrindex{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{@wrindex} +% \cs{@wrindex} checks to make sure that the requested file is available, +% and writes an entry into the file or emits an error message. +% \begin{macrocode} +\renewcommand{\@wrindex}[2]{% + \let\thepage\relax + \xdef\@gtempa{% + \@ifundefined{#1@idxfile}{% + \PackageError{\@packagename}{% + The requested file, #1@idxfile.idx, does not exist;\MessageBreak + index term #2 will not be be written out.% + }% + }{% + \expandafter\write\csname #1@idxfile\endcsname + {\string\indexentry{#2}{\thepage}}% + }% + }% + \endgroup\@gtempa + \if@nobreak \ifvmode\nobreak\fi\fi + \@esphack + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{printindex} +% \begin{macro}{Printindex} +% Redefine \cs{printindex} to specify the file to be included; provide +% an alternate command \cs{Printindex} that specifies both the file and +% the index title to be printed. Argument |#1| identifies the file, +% |#2| provides the title. Also modify some formatting commands to +% improve the appearance of index entries, especially long ones in +% the presence of three index levels. +% \begin{macrocode} +\renewcommand{\printindex}[1]{\@input{#1.ind}} +\newcommand{\Printindex}[2]{% + \begingroup + \cleardoublepage + \def\indexname{#2}% + \raggedright + \hyphenpenalty=10000 + \renewcommand{\seename}{see~also} + \renewcommand{\subitem}{\par\hangindent 3em\hspace*{1em}} + \@input{#1.ind}% + \endgroup + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{indexcomment} +% \begin{macro}{indexchap} +% Format comments in a block somewhat narrower than the full page +% width, and redefine \cn{indexchap} to insert the block below the +% title, before starting the two-column index. Clear out +% \cs{indexcomment} after use. +% \begin{macrocode} +\newdimen\@indexcommentwidth +\@indexcommentwidth=\textwidth +\ifdim\@indexcommentwidth > 26pc + \advance\@indexcommentwidth-6pc +\else + \advance\@indexcommentwidth-4pc +\fi +\newcommand{\indexcomment}[1]{% + \def\theindexcomment{% + \vskip\baselineskip + \parbox[t]{\@indexcommentwidth}{\normalsize\mdseries#1}% + }% + } +\let\theindexcomment\@empty +\renewcommand{\indexchap}[1]{% + \global\topskip 7.5pc\relax + \twocolumn[\fontsize{\@xivpt}{18}% + \vskip\topskip\vskip-\baselineskip\hbox{}% adjust top space + \bfseries\centering #1\par + \ifx\theindexcomment\@empty + \else \theindexcomment + \global\let\theindexcomment\@empty + \fi + ]% + \global\topskip 34\p@ +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{131} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsopn.dtx b/Master/texmf-dist/source/latex/amslatex/amsopn.dtx new file mode 100644 index 00000000000..fd60965d788 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsopn.dtx @@ -0,0 +1,254 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsopn.dtx", +%%% version = "2.01", +%%% date = "1999/12/14", +%%% time = "17:30:59 EST", +%%% checksum = "46904 254 1037 9431", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995, 1999 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "operator name, amsopn, DeclareMathOperator", +%%% supported = "yes", +%%% abstract = "This is a \LaTeX{} package that provides a +%%% DeclareMathOperator command for defining named +%%% operators like sin and lim.", +%%% docstring = "The checksum field above contains a CRC-16 checksum +%%% as the first value, followed by the equivalent of +%%% the standard UNIX wc (word count) utility output of +%%% lines, words, and characters. This is produced by +%%% Robert Solovay's checksum utility.", +%%% } +%%% ==================================================================== +% +%\iffalse +%<*driver> +\documentclass{amsdtx} +\begin{document} +\title{The \pkg{amsopn} package} +\author{Michael Downes} +\date{Version \fileversion, \filedate} +\hDocInput{amsopn.dtx} +\end{document} +% +%\fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% +% The \pkg{amsopn} package provides a command +% \cn{DeclareMathOperator} for defining new `math operator names' +% similar to the standard function names \cn{sin}, \cn{lim}, +% \cn{max}, etc. +% +% \StopEventually{} +% +% Standard file identification. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1994/12/01]% LaTeX date must December 1994 or later +\ProvidesPackage{amsopn}[1999/12/14 v2.01 operator names] +% \end{macrocode} +% +% What \cs{nolimits@} does is keep a \cn{limits} typed by the user +% from having any effect. This is used for operatornames whose +% standard usage is never to have limits. +% \begin{macrocode} +\def\nolimits@{\@ifnextchar\limits{\nolimits\@gobble}{\nolimits}} +% \end{macrocode} +% +% In operator names, it is sometimes desired to have text-mode +% punctuation characters such as |*-/:'|. +% Because the body of an +% operator name is set in math mode, these few punctuation +% characters will not come out right (wrong symbol/and or wrong +% spacing). The purpose of \cs{newmcodes@} is to make them act like +% their normal text versions. +% +% Where practical, we use decimal numbers to cut down main mem +% usage (\qc{\"} not needed). +% \begin{macrocode} +\begingroup \catcode`\"=12 +\gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A% +% \end{macrocode} +% Define \cs{std@minus} for \cs{relbar} use; otherwise there are +% problems with arrows constructed with relbar. +% \begin{macrocode} + \ifnum\mathcode`\-=45 \else + \mathchardef\std@minus\mathcode`\-\relax + \fi + \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax} +\endgroup +% \end{macrocode} +% +% The command \cs{operatorname} prints its argument as a `math +% operator' like \cs{sin} or \cs{det}, with proper font and spacing. +% \begin{macrocode} +\DeclareRobustCommand{\operatorname}{% + \@ifstar{\qopname\newmcodes@ m}% + {\qopname\newmcodes@ o}}% +% \end{macrocode} +% In the interior of the \cs{mathop} we need a null object (we choose +% a zero kern for minimum waste of main mem) in order to guard +% against the case where \arg{3} is a single letter; \tex/ will seize +% it and center it on the math axis if there is nothing else inside +% the \cs{mathop} atom. +% \begin{macrocode} +\DeclareRobustCommand{\qopname}[3]{% + \mathop{#1\kern\z@\operator@font#3}% + \csname n#2limits@\endcsname} +% \end{macrocode} +% +% \begin{macro}{\DeclareMathOperator} +% The command \cn{DeclareMathOperator} defines the first argument to +% be an operator name whose text is the second argument. The star +% form means that the operator name should take limits (like \cn{max} +% or \cn{lim}). +% \begin{macrocode} +\newcommand{\DeclareMathOperator}{% + \@ifstar{\@declmathop m}{\@declmathop o}} +% \end{macrocode} +% \end{macro} +% +% In the basic set of operator names (below) we did not use +% \cn{DeclareRobustCommand} because of the hash table cost. But we +% use it here to minimize the chances of trouble, since we are +% producing a user-defined command. +% \begin{macrocode} +\long\def\@declmathop#1#2#3{% + \@ifdefinable{#2}{% + \DeclareRobustCommand{#2}{\qopname\newmcodes@#1{#3}}}} +% +\@onlypreamble\DeclareMathOperator +\@onlypreamble\@declmathop +% \end{macrocode} +% +% \begin{macrocode} +\def\arccos{\qopname\relax o{arccos}} +\def\arcsin{\qopname\relax o{arcsin}} +\def\arctan{\qopname\relax o{arctan}} +\def\arg{\qopname\relax o{arg}} +\def\cos{\qopname\relax o{cos}} +\def\cosh{\qopname\relax o{cosh}} +\def\cot{\qopname\relax o{cot}} +\def\coth{\qopname\relax o{coth}} +\def\csc{\qopname\relax o{csc}} +\def\deg{\qopname\relax o{deg}} +\def\det{\qopname\relax m{det}} +\def\dim{\qopname\relax o{dim}} +\def\exp{\qopname\relax o{exp}} +\def\gcd{\qopname\relax m{gcd}} +\def\hom{\qopname\relax o{hom}} +\def\inf{\qopname\relax m{inf}} +\def\injlim{\qopname\relax m{inj\,lim}} +\def\ker{\qopname\relax o{ker}} +\def\lg{\qopname\relax o{lg}} +\def\lim{\qopname\relax m{lim}} +\def\liminf{\qopname\relax m{lim\,inf}} +\def\limsup{\qopname\relax m{lim\,sup}} +\def\ln{\qopname\relax o{ln}} +\def\log{\qopname\relax o{log}} +\def\max{\qopname\relax m{max}} +\def\min{\qopname\relax m{min}} +\def\Pr{\qopname\relax m{Pr}} +\def\projlim{\qopname\relax m{proj\,lim}} +\def\sec{\qopname\relax o{sec}} +\def\sin{\qopname\relax o{sin}} +\def\sinh{\qopname\relax o{sinh}} +\def\sup{\qopname\relax m{sup}} +\def\tan{\qopname\relax o{tan}} +\def\tanh{\qopname\relax o{tanh}} +% \end{macrocode} +% +% \begin{macro}{\operator@font} +% \begin{macro}{\operatorfont} +% This command is provided to allow the document styles to decide in +% which way math operators like `max' or `log' are typeset. The +% default is to set them in \meta{math group} zero of the current +% math version. The original name was \cs{operator@font}, retained +% for compatibility; the second name was added to make it +% more accessible so that users can call this font for use in special +% constructs that are not ordinary operator names but conceptually +% related. +% \begin{macrocode} +\def\operator@font{\mathgroup\symoperators} +\def\operatorfont{\operator@font} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% For backwards compatibility we keep this old command name for the +% time being: +% \begin{macrocode} +\def\operatornamewithlimits{\operatorname*} +% \end{macrocode} +% +% These macros use \cs{mathpalette}s so that they will change size +% in script and scriptscript styles, though it's hard to imagine they +% will ever be used there (the arrows, particularly, look bad in +% subscript sizes). Notice that the use of \cs{ex@} means that the +% vertical spacing may not be optimal in script and scriptscript +% sizes. Unfortunately \tex/ provides no easy way to do math mode +% vertical spacing that varies with current math style like mu units. +% \begin{macrocode} +\def\varlim@#1#2{% + \vtop{\m@th\ialign{##\cr + \hfil$#1\operator@font lim$\hfil\cr + \noalign{\nointerlineskip\kern1.5\ex@}#2\cr + \noalign{\nointerlineskip\kern-\ex@}\cr}}% +} +\def\varinjlim{% + \mathop{\mathpalette\varlim@{\rightarrowfill@\textstyle}}\nmlimits@ +} +\def\varprojlim{% + \mathop{\mathpalette\varlim@{\leftarrowfill@\textstyle}}\nmlimits@ +} +\def\varliminf{\mathop{\mathpalette\varliminf@{}}\nmlimits@} +\def\varliminf@#1{\@@underline{\vrule\@depth.2\ex@\@width\z@ + \hbox{$#1\m@th\operator@font lim$}}} +\def\varlimsup{\mathop{\mathpalette\varlimsup@{}}\nmlimits@} +\def\varlimsup@#1{\@@overline{\hbox{$#1\m@th\operator@font lim$}}} +% \end{macrocode} +% +% \begin{macrocode} +\let\nmlimits@\displaylimits +\DeclareOption{namelimits}{\let\nmlimits@\displaylimits} +\DeclareOption{nonamelimits}{\let\nmlimits@\nolimits} +\ProcessOptions\relax +% \end{macrocode} +% +% If we don't load the \pkg{amsgen} package then the use of \cs{ex@} +% in \cs{varlim@} will lead to trouble. +% \begin{macrocode} +\RequirePackage{amsgen}\relax +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \changes{v1.2a}{1995/02/20}{Fixed operatorname +% (shouldn't have same limits behavior as operatorname*)} +% \CheckSum{300} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsrefs.dtx b/Master/texmf-dist/source/latex/amslatex/amsrefs.dtx new file mode 100644 index 00000000000..e8d81ed6336 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsrefs.dtx @@ -0,0 +1,8030 @@ +%%% ==================================================================== +%%% @LaTeX-doc-source-file{ +%%% filename = "amsrefs.dtx", +%%% version = "2.0", +%%% date = "2004/06/30", +%%% time = "11:24:39 EDT", +%%% author = "Michael J Downes and David M. Jones", +%%% address = "American Mathematical Society, +%%% Publications Technical Group, +%%% PO Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% email = "tech-support@ams.org", +%%% URL = "http://www.ams.org/", +%%% abstract = "A LaTeX package that permits bibliography style +%%% to be controlled completely from the LaTeX side +%%% instead of being determined chiefly by the BibTeX +%%% style file.", +%%% checksum = "09127 8030 25325 242081", +%%% docstring = "The checksum field, produced by Robert Solovay's +%%% checksum utility, gives CRC-16 checksum, lines, +%%% words, and characters.", +%%% } +%%% ==================================================================== +%%% +% \iffalse +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\documentclass[draft,oneside]{amsdtx} + +\setcounter{secnumdepth}{3} +\setcounter{tocdepth}{3} + +\DoNotIndex{\bib,\BibSpec,\@apply,\citesel,\cite@cj,\cite} +\DoNotIndex{\IfOption,\add@toks@,\@emptytoks,\@temptokenb} + +\makeatletter +\DeclareRobustCommand{\fld}{\category@index{field}} +\DeclareRobustCommand{\btype}{\category@index{entry type}} +\DeclareRobustCommand{\attr}{\category@index{attribute}} +\makeatother + +%\OnlyDescription + +\usepackage{amsrefs} +\usepackage{multicol} + +\providecommand{\lat}[1]{\protect\LaTeX{}} + +\DeclareTextSymbol{\lbracechar}{OT1}{123} +\DeclareTextSymbolDefault{\lbracechar}{OT1} +\DeclareTextSymbol{\rbracechar}{OT1}{125} +\DeclareTextSymbolDefault{\rbracechar}{OT1} + +\newcommand{\rdag}{{\normalfont\dag}} + +\providecommand{\embrace}[1]{% + \begingroup \ntt\lbracechar#1\rbracechar\endgroup} + +% One mandatory argument: cnm; two: cnmm; one optional and one +% mandatory: cnom; throwing in a star: cnsom; and so on. +\providecommand{\cnbreak}{\penalty999\hskip0pt\relax} +\providecommand{\cnm}[2]{\cn{#1}\cnbreak\embrace{#2}} +\providecommand{\cnmm}[3]{\cn{#1}\cnbreak\embrace{#2}\cnbreak\embrace{#3}} +\providecommand{\cnom}[1]{\cn{#1}\cnbreak\ommitude} +\providecommand{\ommitude}[2][]{{\ntt[#1]}\cnbreak\embrace{#2}} +\providecommand{\cnmsm}[4]{% + \cn{#1}\cnbreak\embrace{#2}\cnbreak *\embrace{#4}} + +\newcommand{\rpack}[1]{\pkg{amsrefs} package} + +\newcommand{\MacroArgs}{% + \par + \medskip \noindent\emph{Arguments}: \par} + +\newcommand{\macroarg}[2]{ + \texttt{\arg{#1} <- }\emph{#2}\unkern\texttt{.}\par} + +\newenvironment{bug}{% + \quote + \emph{Known bug:}} + {\endquote} + +% non-stupid hline: support for adding some space below +\newcommand{\nshline}{\hline\omit\\} + +\newcommand{\SeveralOptions}[1]{% + \vbox{\def\\{\unskip,\egroup\hbox\bgroup\ignorespaces}% + \hbox{\strut#1}}} + +% Make this a self-contained document without separate .bbl file. +\newcommand{\PrintBibliography}{% + \begin{bibsection}\begin{biblist}\raggedright + \bib{Jones2004}{article}{ + author={Jones, David M.}, + title={User's Guide to the \pkg{amsrefs} Package}, + note={distributed with the \pkg{amsrefs} code} + } + \bib{SOS99}{book}{ + author={Swanson, Ellen}, + author={O'Sean, Arlene}, + author={Schleyer, Antoinette}, + title={Mathematics into Type}, + edition={updated}, + year={1999}, + publisher={American Mathematical Society}, + } + \end{biblist}\end{bibsection} +} + +\makeatletter + +\def\nametest#1{% + \par + \begingroup + \let\EmptyNameWarning\relax + \vdef\@tempa{#1}% + {\tt author=\embrace\@tempa}: + \name@split#1,,,\@nil + G=\@showname{given} + S=\@showname{surname} + J=\@showname{jr}% + \endgroup +} + +\def\@showname#1{% + {\ntt\lbracechar}% + {\tt\@xp\macrotext\csname bib'#1\endcsname}% + {\ntt\rbracechar} +} + +\def\initialtest#1{% + \par + \begingroup + \vdef\@tempa{#1}% + {\tt author=\embrace\@tempa}: + \name@split#1,,,\@nil + I={\ntt\lbracechar}\csname bib'initials\endcsname{\ntt\rbracechar}% + \endgroup +} + +\makeatother + +\CodelineIndex + +\begin{document} +\title{The \pkg{amsrefs} package} +\author{Michael Downes and David M. Jones\\American Mathematical Society} +\date{Version \fileversion, \filedate} +\hDocInput{amsrefs.dtx} +\PrintIndex +\end{document} +% +% \fi +% +% \MakeShortVerb{\|} +% +% \maketitle +% +% \tableofcontents +% +% \section{Introduction} +% +% The \rpack/ is a \lat/ package for bibliographies that provides an +% archival data format similar to the format of \bibtex/ database +% files, but adapted to make direct processing by \lat/ easier. The +% package can be used either in conjunction with \bibtex/ or as a +% replacement for \bibtex/. +% +% This document is written for anyone who wants to implement a new +% bibliography style for \pkg{amsrefs} or who is just curious about +% how the package is implemented. +% The reader should be familiar with the contents of the ``User's +% Guide to the \pkg{amsrefs} Package''~\cite{Jones2004} +% (\fn{amsrdoc.tex}). +% +% For the publisher or implementor, the chief advantages of the +% \rpack/ are as follows: +% \begin{description} +% +% \item[Preservation of structure] +% +% The internal structural information of the bibliography entries is not +% lost when they are imported from the database file into the \lat/ +% document. This takes on its greatest significance when archiving +% documents in \lat/ form or transmitting them to another user (such as a +% publisher). +% +% \item[Deferred formatting] +% +% This means that the style of the bibliography can be readily changed +% without reimporting everything from the original database(s). +% +% \item[Setup requires only \lat/ knowledge] +% +% All bibliography setup can be done in \lat/; learning another +% programming language (such as the one used in \bibtex/ \fn{bst} +% files) is unnecessary. +% +% \end{description} +% +% \section{Package options} +% +% In addition to the options documented in the user's guide, there +% are a few additional options that were omitted either because +% they are obsolete or deprecated options included only for +% backwards compatability or because they are still considered +% experimental and not yet ready for widespread use. +% +% \begin{description} +% +% \item[?] +% +% Informational option. This causes \pkg{amsrefs} to +% display a pointer to the User's Guide on the terminal an in the +% log file. (In previous versions, it displayed much more +% material, including a summary of package options.) +% +% \item[traditional-quotes, logical-quotes] +% +% With the \textit{traditional quotes} option +% (default), quotation marks produced by \cn{bibquotes} +% (\secref{misc-cmds}) fall outside of other punctuation, ``like +% this,'' whereas with the \textit{logical quotes} option the order +% is reversed, ``like this''. +% +% \item[beta, jpa] +% +% Obsolete; these applied only to the beta version of the +% \pkg{amsrefs} package. +% +% \end{description} +% +% \section{More about the \cn{bib} command}\label{bib-command} +% +% \subsection{Field names for the \cn{bib} command} +% +% In addition to the fields discussed in the user's guide, the +% following fields are used internally: +% \begin{description} +% +% \item[fulljournal] +% +% Used internally by \cn{DefineJournal}. +% +% \item[name] +% +% Used internally by the \btype{name} bibliography type and +% \cn{DefineName}. +% +% \item[transition] +% +% A dummy field used inside \cs{BibSpec}s when we want to force an +% action unconditionally. +% +% \end{description} +% +% The following fields are included for backwards compatibility: +% \begin{description} +% +% \item[institution, school] +% +% These are provided as aliases for \fld{organization} for +% compatibility with \BibTeX. +% +% \item[place] +% +% A synonym for \fld{address}. In earlier versions of +% \pkg{amsrefs}, \fld{place} was preferred and \fld{address} was +% considered as an alias for \fld{place}. However, this seemed +% like a gratuitous incompatibility with \BibTeX\ to me, so I have +% reinstated \fld{address} as the primary field and \fld{place} is +% now an undocumented alias. +% +% \end{description} +% +% The following fields are reserved for future use: +% \begin{description} +% +% \item[doi] Digital Object Identifier +% +% \item[setup] +% +% This is a special field that can be used to give arbitrary +% commands to be executed at the beginning of the current \cn{bib} +% entry, after all the fields have been read. The idea is that one +% can alter the formatting of an individual entry through this +% field, to handle special cases. +% +% This is fully implemented, but I've been unable to think of any +% good examples of its use; so, I've decided to suppress it until +% such an example comes to light. +% +% \item[url] Universal Resource Locator. +% +% \end{description} +% +% \subsection{Bibliography entry types} +% +% The following additional entry types (or, really, pseudo-entry +% types) are used internally by \pkg{amsrefs}: +% \begin{description} +% +% \item[collection.article] +% +% \item[proceedings.article] +% +% \item[partial] +% +% \item[conference] +% +% \item[innerbook] +% +% \item[name] +% +% \item[nameLE] +% +% \item[nameBE] +% +% \item[nameinverted] +% +% \item[publisher] +% +% \end{description} +% +% The following are currently undocumented aliases for various of +% the standard types: +% \begin{description} +% +% \item[miscellaneous] +% +% \item[periodical] +% +% \end{description} +% +% \section{Customizing the bibliography style}\label{other-styles} +% +% If you use the \rpack/ as is, the bibliography style you get is the +% kind of style customarily seen in AMS publications. The recommended +% way to get a different bibliography style is to write a \lat/ +% package which loads the \rpack/ with \cn{RequirePackage} and +% then makes the desired changes by using suitable \cn{BibSpec} +% commands as explained below. Thus, the general form of the custom +% package will be +% \begin{verbatim} +% \ProvidesPackage{xyzbib}[2002/11/06 v1.28] +% +% \RequirePackage{amsrefs}\relax +% +% \BibSpec{article}{ +% ... +% } +% +% \BibSpec{book}{ +% ... +% } +%\end{verbatim} +% +% The interior formatting within entries is specified by \cn{BibSpec} +% commands, one for each entry type. To illustrate, let's look at an +% example style specification for entries of type \btype{article}: +% \begin{verbatim} +% \BibSpec{article}{% +% +{}{\PrintAuthors} {author} +% +{,}{ \textit} {title} +% +{,}{ } {journal} +% +{}{ \textbf} {volume} +% +{}{ \parenthesize} {date} +% +{,}{ } {pages} +% +{,}{ } {note} +% +{.}{} {transition} +% +{}{ } {review} +% } +%\end{verbatim} +% +% It should be pretty obvious that each line specifies the formatting +% for a particular field. After reading the data for a particular +% \cn{bib} command, \lat/ steps through the style specification and +% for each +% field listed, prints the field with the given formatting \emph{if +% and only if the field has a nonempty value}. The \verb'+' character +% at the beginning of each field specification must be followed by three +% arguments: the punctuation to be added if the field is nonempty; +% space and/or other material to be added after the punctuation; and +% the field name. It is permissible for the second part to end with a +% command that takes an argument, such as \cn{textbf}, in which case +% it will receive the field's value as its argument. By defining a +% suitable command and using it here you can place material after the +% field contents as well as before; \cn{parenthesize} is an example +% of this. +% +% The reason that the punctuation and the following space are specified +% separately is that between them there is a crucial boundary for line +% breaks. If you put a \cn{linebreak} command at the end of a field value, +% the break point will actually be carried onward to a suitable point after +% the next bit of punctuation (whose actual value may vary depending on +% which of the following fields is the first to turn up with a nonempty +% value). +% +% The meaning of the \cn{parenthesize} command, supplied by +% \pkg{amsrefs}, should be obvious. The meaning of the \cn{PrintAuthors} +% command is a different story. But I don't think it is all that hard to +% understand. If we have two or more author names which were given +% separately, +% and we need to combine them into a conventional name list using commas +% and the word \qq{and}, then it would be nice if we had a command which +% could take a list of names and Do The Right Thing. And that is just +% what \cn{PrintAuthors} is. +% +% The \pkg{rkeyval} package allows keys to be defined as additive: if the +% key occurs more than once, each successive value will be concatenated to +% the previous value, along with a prefix. The setup done by +% \pkg{amsrefs} for the \fld{author} field is +% \begin{verbatim} +% \DefineAdditiveKey{bib}{author}{\name} +%\end{verbatim} +% This means that if two names are given, as in +% \begin{verbatim} +% author={Bertram, A.}, +% author={Wentworth, R.}, +%\end{verbatim} +% then the final value of the \fld{author} field seen when \lat/ +% processes the style specification will be +% \begin{verbatim} +% \name{Bertram, A.}\name{Wentworth, R.} +%\end{verbatim} +% +% The \fld{transition} field in our \cn{BibSpec} example is a dummy +% field to be +% used when punctuation or other material must be added at a certain point +% in the bibliography without regard to the emptiness or non-emptiness of +% the fields after it. The \fld{transition} field always tests as non-empty +% but has no printed content. So when you use it you always get the +% indicated punctuation and space at the indicated point in the list of +% fields. If it were the last thing in this \cn{BibSpec} example, it could +% serve just to put in the final period that is always wanted. But in AMS +% bibliographies, if a \emph{Mathematical Reviews} reference is given, it is +% conventionally printed \emph{after} the final period. Using the +% \fld{transition} field as shown here ensures that the final period will +% be always printed, even when the \fld{review} field is empty. +% +% \section{Miscellaneous commands provided by the \pkg{amsrefs} +% package}\label{misc-cmds} +% +% Most of the following commands are helper commands for use in +% \cn{BibSpec} statements. The others are intended for use in bibliography +% data. +% \begin{description} +% +% \item[\cn{parenthesize}]\SpecialUsageIndex{\parenthesize} +% This command adds parentheses around its +% argument. It is useful in \cn{BibSpec} statements because there is no +% special provision for adding material after the field value. +% +% \item[\cn{bibquotes}]\SpecialUsageIndex{\bibquotes} +% This command is much like \cn{parenthesize} but +% it adds quotes around its argument and it has one other important +% difference: there are special arrangements to print the closing quote +% \emph{after} a following comma or similar punctuation (unless the +% \pkg{amsrefs} package is invoked with the \opt{logical-quotes} option, +% in which case \cn{bibquotes} puts the closing quote immediately after +% the quoted material). +% +% \item[\cn{voltext}]\SpecialUsageIndex{\voltext} +% This is used to format volume numbers. By default, it precedes +% the volume number by ``vol.'' +% +% \item[\cn{issuetext}]\SpecialUsageIndex{\issuetext} +% This is used to format issue numbers. By default, it precedes +% the volume number by ``no.'' +% +% \item[\cn{editiontext}]\SpecialUsageIndex{\editiontext} +% This command produces ``ed.''\ following an +% edition number. See \cn{PrintEdition} for more information. +% +% \item[\cn{DashPages}]\SpecialUsageIndex{\DashPages} +% This command is similar in spirit to +% \cn{voltext} but more complicated in its implementation. It takes +% one argument which is expected to contain one or more page numbers +% or a range of page numbers. The argument is printed with a prefix +% of \qq{p.} if it seems to be a single page number, otherwise with a +% prefix of \qq{pp.}. +% +% \item[\cn{tsup}, \cn{tsub}, \cn{tprime}]\SpecialUsageIndex{\tsup} +% \SpecialUsageIndex{\tsub}\SpecialUsageIndex{\prime} +% These are for text subscripts +% and superscripts, with \cn{tprime} producing a superscript prime +% symbol. Unlike the standard \cn{textsuperscript} and +% \cn{textsubscript} functions provided by \lat/, these do not use +% math mode at all.\footnote{There is one drawback: If you don't +% want to get the prime symbol for \cn{tprime} from the \fnt{cmsy} +% font, you will need to redefine \cn{tprime} in some suitable +% way.} +% +% \item[\cn{nopunct}]\SpecialUsageIndex{\nopunct} +% This command causes following punctuation to be omitted if it is +% added with the internal function \cs{@addpunct}. +% +% \item[\cn{PrintPrimary}]\SpecialUsageIndex{\PrintPrimary} +% This is a relatively complicated function that determines the +% ``primary'' contributors for an entry and formats them, or +% replaces them by \cn{sameauthors} if appropriate. It should be +% used when an entry type might have editors or translators instead +% of authors. It prefers authors over editors and editors over +% translators and generates a warning if there are no primary +% contributors. +% +% \item[\cn{PrintAuthors}]\SpecialUsageIndex{\PrintAuthors} +% This is used to format the list of authors as the primary +% contributors for an entry type. +% +% \item[\cn{PrintEditorsA}]\SpecialUsageIndex{\PrintEditorsA} +% This is similar to \cn{PrintAuthors} but adds |(ed.)| or |(eds.)| +% following the editors. +% +% \item[\cn{PrintEditorsB}]\SpecialUsageIndex{\PrintEditorsB} +% This is similar to \cn{PrintEditorsA} but puts parentheses around +% the entire list of editors. It's used by, for example, the +% \btype{article} type to print the editors of a +% \btype{proceedings} or \btype{collection}. +% +% \item[\cn{PrintEditorsC}]\SpecialUsageIndex{\PrintEditorsC} +% Similar to \cn{PrintEditorsA} but precedes the editors by +% |Edited by|. It's used when the editors should be treated as +% subsidiary contributors, rather than the primary contributor. +% +% \item[\cn{PrintTranslatorsA}]\SpecialUsageIndex{\PrintTranslatorsA} +% This is similar to \cn{PrintEditorsA} but adds |(trans.)| +% following the translators. +% +% \item[\cn{PrintTranslatorsB}]\SpecialUsageIndex{\PrintTranslatorsB} +% This is similar to \cn{PrintEditorsB}. It's not currently used, +% but is provided for symmetry. +% +% \item[\cn{PrintTranslatorsC}]\SpecialUsageIndex{\PrintTranslatorsC} +% Similar to \cn{PrintEditorsC} but precedes the translators by +% |Translated by|. +% +% \item[\cn{sameauthors}]\SpecialUsageIndex{\sameauthors} +% This is a function of one argument. If you use +% the default set of \cn{BibSpec}s from the \pkg{amsrefs}, +% \cn{sameauthors} is applied to the author name for a given \cn{bib} +% command if it matches exactly the author name of the preceding +% \cn{bib} command. Change the definition of \cn{sameauthors} if you +% don't want to get a bysame dash. +% +% \item[\cn{bysame}]\SpecialUsageIndex{\bysame} +% This is a horizontal rule of length 3~em. The default +% definition of \cn{sameauthors} prints \cn{bysame} instead of the +% author names. +% +% \item[\cn{Plural}, \cn{SingularPlural}]\SpecialUsageIndex{\Plural} +% \SpecialUsageIndex{\SingularPlural} +% These are helper functions +% that allow you to conditionally +% print singular or plural forms such as \verb'(ed.)' or \verb'(eds.)' +% depending on the number of names in the current name list. +% The definition of \cn{PrintEditorsA} reads, in part, +% \begin{verbatim} +% ... (ed\Plural{s}.) ... +%\end{verbatim} +% +% \item[\cn{PrintReviews}]\SpecialUsageIndex{\PrintReviews} +% This is similar to \cn{AuthorList} but is used for +% printing (possibly multiple) MR numbers given in the \fld{review} +% field. +% +% \item[\cn{BibField}]\SpecialUsageIndex{\BibField} +% This is for more complicated programming tasks such +% as may be necessary for some \cn{BibSpec}s. It takes one +% argument, a field name, and yields the contents of that field for +% the current \cn{bib} entry. +% +% \item[\cn{IfEmptyBibField}]\SpecialUsageIndex{\IfEmptyBibField} +% If one writes +% \begin{verbatim} +% \IfEmptyBibField{isbn}{A}{B} +%\end{verbatim} +% then the commands in A will be executed if the \fld{isbn} field is empty, +% otherwise the commands in B. +% +% \item[\cn{PrintEdition}]\SpecialUsageIndex{\PrintEdition} +% If a bibliography entry has +% \begin{verbatim} +% edition={2} +%\end{verbatim} +% and the \cn{BibSpec} used \cn{PrintEdition} to handle this field, then the +% edition information will be printed as \qq{2nd ed.}\mdash that is, the +% number is converted to cardinal form and \qq{ed.} is added (taken from +% \cn{editiontext}). +% +% \item[\cn{CardinalNumeric}]\SpecialUsageIndex{\CardinalNumeric} +% This provides the conversion to cardinal +% number form used by \cn{PrintEdition}. +% +% \item[\cn{PrintDate}, \cn{PrintYear}]\SpecialUsageIndex{\PrintDate} +% \SpecialUsageIndex{\PrintYear} +% These functions convert a date in +% canonical form (ISO 8601) to the form required by the current +% bibliography style. You can get your preferred date form by +% redefining these functions or by changing your \cn{BibSpec} statements +% to use another function of your own devising. The original definition +% of \cn{PrintDate} adds parentheses (as for the year of a journal article +% in normal AMS style), whereas the \cn{PrintYear} function simply +% prints the year without any additional material (as for a book's year +% of publication in normal AMS style). +% +% \item[\cn{mdash}, \cn{ndash}]\SpecialUsageIndex{\mdash} +% \SpecialUsageIndex{\ndash} +% These are short forms for \cn{textemdash} +% and \cn{textendash}, recommended instead of the more usual \verb'---' +% and \verb'--' notation. From the \pkg{textcmds} package. +% +% \item[et cetera \dots] [mjd,2002-01-03] See the \fn{.dtx} files for +% further possibilities that I have not managed to get properly +% documented yet! +% \end{description} +% +% \StopEventually{\PrintBibliography} +% \iffalse +% \clearpage +% \typeout{@@@ That was the last page of the OnlyDescription} +% \fi +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Implementation} +% +% \subsection{Overview} +% +% It will be a while yet before we get to any actual code. First we +% need to understand what the code needs to accomplish in order to +% provide the user interface described above in a way that is as +% compatible as possible with existing \lat/ mechanisms. +% +% \subsubsection{Normal \lat/ processing of cites} +% +% \paragraph{First \lat/ pass} +% +% Various commands are written to the \fn{.aux} file that are +% mostly used by \bibtex/. +% \begin{enumerate} +% \item A \cnm{cite}{moo} command writes one line to the \fn{.aux} file: +% \cnm{citation}{moo}. This indicates to \bibtex/ that it should +% include `moo' in the list of cited items to be searched for. +% The \cn{cite} command also checks to see if \cs{b@moo} contains +% the corresponding citation label, but since this is the first +% pass, the label won't be known yet, so \lat/ emits an `Undefined +% citation' warning and prints a placeholder (i.e., \textbf{???}) +% instead of the citation label. +% +% \item A \cnm{bibliographystyle}{har} command writes one line to the +% \fn{.aux} file: \cnm{bibstyle}{har}. This indicates to \bibtex/ that it +% should use \fn{har.bst} to determine the style for sorting and +% formatting the bibliography items. +% +% \item A \cnm{bibliography}{hij,klm,...} command writes one line to the +% \fn{.aux} file: \cnm{bibdata}{hij,klm,...}. This indicates to \bibtex/ +% that it should look in \fn{hij.bib}, \fn{klm.bib}, \dots\ for +% bibliographic data. The \cn{bibliography} also tries to input +% the \fn{.bbl} file, but on the first pass it won't exist +% yet. +% +% \end{enumerate} +% +% On the first pass all \cn{cite}'s normally are reported as +% undefined because the \fn{.bbl} file has not yet been created. +% +% \paragraph{\bibtex/ pass} +% +% For a document named \fn{xyz.tex}, the command \verb'bibtex xyz' is +% used to invoke \bibtex/. It looks in \fn{xyz.aux} to find the +% citation information written there by \lat/. For each \cn{citation} line, +% \bibtex/ searches for a corresponding entry in the specified +% \fn{.bib} files and formats it. The entire list is then sorted in +% whatever way dictated by the bibliography style, and written out to +% the file \fn{xyz.bbl}. This normally produces entries that look +% something like: +% \begin{verbatim} +% \bibitem{BGL} P. Busch, M. Grabowski and P. J. Lahti: +% {\it Operational Quantum Physics.} +% Springer Verlag, New York (1995). +%\end{verbatim} +% +% \paragraph{Second \lat/ pass} +% +% Now the \fn{.bbl} file exists and contains some \cn{bibitem} +% commands. At \cnm{begin}{document}, \lat/ reads the \fn{.aux} file, +% hoping to find some \cn{bibcite} commands, but it will not find +% them until the next time around. \cn{citation}, \cn{bibstyle}, and +% \cn{bibdata} commands in the \fn{.aux} file are simply ignored by \lat/. +% Then \lat/ proceeds to typeset the body of the document. +% \begin{enumerate} +% \item Instances of \cn{cite} still print question marks. +% +% \item The \cn{bibliography} command causes \lat/ to input \fn{xyz.bbl} +% and typeset its contents. +% +% \item A \cnm{bibitem}{moo} command writes one line to the +% \fn{.aux} file: \cnmm{bibcite}{moo}{9}, where 9 is the current item +% number. +% +% \item A \cnom{bibitem}[Moody]{moo} command writes one line to the +% \fn{.aux} file: \cnmm{bibcite}{moo}{Moody}, using the supplied label +% instead of a number. +% +% \end{enumerate} +% +% \paragraph{Third \lat/ pass} +% +% Now the \fn{.aux} file contains some \cn{bibcite} commands. Once again, +% \lat/ reads the \fn{.aux} file when it reaches \cnm{begin}{document}. +% \begin{enumerate} +% +% \item A \cnmm{bibcite}{moo}{Moody} causes \lat/ to define \cs{b@moo} +% with `Moody' as the replacement text. +% +% \item If two \cn{bibcite} commands have the same citation key, \lat/ +% gives a warning message. This happens at \cnm{begin}{document}, +% during the reading of the \fn{.aux} file. +% +% \item Instances of \cn{cite} in the body of the document will print +% the appropriate labels obtained from the \fn{.aux} file. +% +% \item If there are any \cn{cite} commands for which the \fn{.aux} file did +% not have a \cn{bibcite} command, \lat/ will give an `Undefined +% citation' warning. This often happens if the \fn{.aux} file is incomplete +% due to a \TeX{} error on the preceding pass. +% \end{enumerate} +% +% \subsection{How cites are processed by \pkg{amsrefs}} +% +% In order to support its additional features (e.g., author-year +% citations and the \opt{backrefs} option), the \rpack/ stores additional +% information for each cite in the macro \cs{b@whatever}. Instead of +% simply using the defined or undefined status of this macro to +% trigger the standard warnings, we add some boolean flags to allow +% us to discriminate more finely what the current situation is. +% \begin{itemize} +% \item Each time an item is cited in the body of the document, a +% \texttt{backref} entry is added to the info of that item. The +% \texttt{backref} info +% is the current page and section location. Section location is a bit +% hard to get right without better support from the document class. +% So we provide a hook to allow it to work better when the support is +% there. +% +% \item When a cite occurs, if the info is undefined then a warning is +% issued and the info structure is created. A \cs{citation} command +% and a \cs{citedest} command (providing backref info) are written to +% the \fn{.aux} file. Because the backref info includes page number, it has +% to be a non-immediate write. +% +% An undefined info structure would normally happen only on a first +% pass when no \fn{.aux} file exists, or when a new cite is added. +% I.e., when the corresponding \cs{citation} command is not yet +% present in the \fn{.aux} file. +% +% \item When a citation command occurs in the \fn{.aux} file, it initializes +% the info structure if necessary, setting the ``bib-info-present'' +% flag to 0. +% +% \item When a \cs{citedest} command occurs in the \fn{.aux} file, it +% initializes the info structure if necessary---but this shouldn't +% happen: if the corresponding \cs{citation} command did not already +% get processed, then something is wrong. So normally, the +% \cs{citedest} command merely needs to add its backref info to the +% existing info structure. +% +% \item When a \cs{bibcite} command occurs in the \fn{.aux} file, it will +% normally find that \cs{b@whatever} is already defined, if the +% bibliography occurs after all the \cn{cite} commands. What it must +% do is fill in the appropriate blank slots in the info structure +% set up by a previous \cs{citation} command. +% +% \item The \fn{.aux} file is actually processed two times, once at the +% beginning of the document and once at the end. In the latter case, +% \cs{bibcite} should give a warning if the backref-list is empty, +% since that means there were no \cn{cite} commands for the given +% key. +% +% \item When processing the bibliography: The \cn{bib} command needs to +% check if it is using a key that is already used by another \cn{bib} +% command. +% \end{itemize} +% +% We therefore have +% \begin{verbatim} +% \b@xyz -> \citesel 00{label}{year}{backref-list} +%\end{verbatim} +% where the first~0 is replaced by~1 if there has already been another +% citation for the same key earlier in the document (some citation +% styles use abbreviated forms for all instances after the first), +% and the second~0 is replaced by~1 if the same key was already +% used by an earlier \cn{bib} command. +% +% Because the backref-list often includes page number information, it +% cannot be built on the fly as we go along; instead we have to write +% the information to the \fn{.aux} file and read it in at the beginning of +% the next run. +% +% If there was no \cs{bibcite} in the \fn{.aux} file for a given key, then +% the info is +% \begin{verbatim} +% \b@xyz -> \citesel 00{}{}{backref-list} +%\end{verbatim} +% If there was neither \cs{citation} nor \cs{bibcite} in the \fn{.aux} file +% for a given key, then the \cn{cite} command should find that +% \ncn{b@xyz} is undefined. +% +% If the author-year option is in effect, the \qq{label} contains +% the author last names instead of a label: +% \begin{verbatim} +% \b@xyz -> \citesel 00{\name{Smith}\name{Jones}}{...}{...} +%\end{verbatim} +% Full name information is included in the data because some citation +% styles give full names at the first citation and abbreviated forms +% for subsequent instances. +% +% \subsection{Data structures} +% +% The result of scanning the key/value pairs of a \cn{bib} command is +% an assignment statement for \cs{rsk@toks}. (Cf.\@ the \pkg{rkeyval} +% package.) For example, consider the entry +% \begin{verbatim} +% \bib{miller83}{article}{ +% author={Miller, G.}, +% title={Eine Bemerkung zur Darstellung von Polynomen \"{u}ber +% Verb\"{a}nden}*{language={german}}, +% journal={J. Math. Sent.}, +% volume={10}, +% year={1983}, +% pages={26\ndash 30}, +% } +%\end{verbatim} +% The scanned result is to assign +% \begin{verbatim} +% \global\rsk@toks{% +% \set:bib'author{Miller, G.}{}% +% \set:bib'title{Eine Bemerkung zur Darstellung von Polynomen +% \"{u}ber Verb\"{a}nden}{language={german}}% +% \set:bib'journal{J. Math. Sent.}{}% +% \set:bib'volume{10}{}% +% \set:bib'year{1983}{}% +% \set:bib'pages{26\ndash 30}{}% +% } +%\end{verbatim} +% The code in the last arg of \cn{RestrictedSetKeys} then invokes +% \cs{bib@exec} to do something with the value of \cs{rsk@toks}. +% \begin{verbatim} +% \bib@exec{miller83}{\the\rsk@toks}{\setbib@article}{} +%\end{verbatim} +% +% \subsection{Preliminaries} +% +% \begin{macrocode} +%<*pkg> +% \end{macrocode} +% +% Standard declaration of package name and date. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +% \end{macrocode} +% +% \begin{macro}{\amsrefs@warning@nl} +% \begin{macrocode} +\def\amsrefs@warning@nl{\PackageWarningNoLine{amsrefs}} +% \end{macrocode} +% \end{macro} +% +% Backward handling for beta version. +% \begin{macrocode} +\@ifpackagewith{amsrefs}{beta}{% + \amsrefs@warning@nl{The beta option is deprecated^^J% + and will be removed in a future release of amsrefs} + \expandafter\edef\csname opt@amsrbeta.sty\endcsname + {\@ptionlist{amsrefs.sty}}% + \def\@currname{amsrbeta}% + \expandafter\let\csname amsrbeta.sty-h@@k\endcsname\@empty + \def\@tempa{\input{amsrbeta.sty}\endinput}% +}{% + \let\@tempa\@empty +} +\@tempa +% \end{macrocode} +% +% \begin{macrocode} +\IfFileExists{url.sty}{% + \RequirePackage{url}\relax + \@gobble +}{% + \@firstofone +} +{ + \DeclareRobustCommand{\url}[1]{% + \def\@tempa{#1}% + \texttt{\@urlsetup $\expandafter\strip@prefix\meaning\@tempa$}% + }% + \def\@urlsetup{% + \check@mathfonts \textfont\@ne\the\font \textfont\z@\the\font + \@apply\@urlfix{\do\+\do\=\do\:\do\-\do\.\do\,\do\;}% + \@apply\@urlbreak{\do\&\do\/\do\?}% + }% + \def\@urlbreak#1{% + \mathcode`#1="8000 + \begingroup \lccode`\~=`#1 \lowercase{\endgroup \edef~}% + {\mathchar\number`#1\penalty\hyphenpenalty}% + }% + \def\@urlfix#1{% + \mathcode`#1=`#1\relax + }% +} +% \end{macrocode} +% +% \begin{macrocode} +\@ifundefined{NormalCatcodes}{\RequirePackage{pcatcode}\relax}{} +\PushCatcodes\NormalCatcodes +\ProvidesPackage{amsrefs}[2004/06/07 v1.71] +% \end{macrocode} +% +% \begin{macrocode} +%% WARNING WARNING WARNING: Catcode of apostrophe ' is letter +%% throughout this file. +\catcode`\'=11 % letter +% \end{macrocode} +% +% \subsection{Utilities} +% +% Some of these useful functions are also found in AMS +% document classes. +% +% \begin{macro}{\after@deleting@token} +% Similar in concept to \cs{afterassignment}, except it deletes the +% next token in the stream before putting its argument +% back into the input. Useful for skipping past tokens during +% parsing. +% \begin{macrocode} +\def\after@deleting@token#1{% + \afterassignment#1% + \let\@let@token= % Don't delete this space! +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ifempty} +% \begin{macro}{\@ifnotempty} +% Some frequently used tests for empty arguments. Note that an +% argument consisting entirely of spaces (e.g., +% \verb*|\@ifempty{ }|) counts as empty. +% \begin{macrocode} +\long\def\@ifempty#1{\@xifempty#1@@..\@nil} + +\long\def\@xifempty#1#2@#3#4#5\@nil{% + \ifx#3#4\@xp\@firstoftwo\else\@xp\@secondoftwo\fi +} + +\long\def\@ifnotempty#1{\@ifempty{#1}{}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\macrotext} +% \begin{macrocode} +\def\macrotext{\expandafter\strip@prefix\meaning} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\vdef} +% ``Verbatim'' def. +% \begin{macrocode} +\def\vdef#1#2{% + \def#1{#2}% + \edef#1{\macrotext#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\auto@protect} +% Sometimes it's convenient to render a given control sequence +% unexpandable for a time. \cs{auto@protect} provides a way to do +% that.\footnote{There really should be a special name for macros +% that, like \cs{auto@protect}, take a control sequence as an +% argument and redefine that control sequence in order to achieve +% some special effect. Pending happier inspiration, I'm +% going to call them ``wrapper'' macros.\index{wrapper macros, +% definition}} +% +% An earlier version of this code read simply |\let#1\relax| but +% that had the disadvantage of making all \cs{auto@protect}ed +% macros compare equal via \cs{ifx}. This version allows macros to +% keep their identities under comparisons. +% \begin{macrocode} +\def\auto@protect#1{\def#1{\@nx#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\g@undef} +% Globally undefine a control sequence. +% \begin{macrocode} +\def\g@undef#1{\global\let#1\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@concat} +% Concatenate onto the end of a token list. Expands everything. +% \begin{macrocode} +\def\@concat#1#2{\edef#1{#1#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\add@toks@} +% This saves a few tokens of main memory and a lot of typing. +% \begin{macrocode} +\def\add@toks@{\addto@hook\toks@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@lappend} +% Append an element to a \cs{do}-delimited list. As long as the +% element to be appended (|#2|) is a single token, nothing is +% expanded. If it contains multiple tokens, all tokens after the +% first will be expanded. +% \begin{macrocode} +\def\@lappend#1#2{% + \begingroup + \def\do{\@nx\do\@nx}% + \edef\@tempa{\def\@nx#1{#1\do#2}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@apply} +% Apply a macro to each element of a \cs{do}-delimited list. +% \begin{macrocode} +\def\@apply#1#2{% + \let\do#1% + #2% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@numberof} +% This is a generic macro for counting the number of elements in a +% \lat/-style list. +% The first argument is a \cs{count} register that will receive the +% final count; the second argument is the control sequence that +% separates elements of the list, and the third argument is the +% list itself. So, for example, +% \begin{verbatim} +% \get@numberof\@tempcnta\do\dospecials +%\end{verbatim} +% would count the number of special characters in \cs{dospecials} +% and store the number in \cs{@tempcnta}. +% \begin{macrocode} +\def\get@numberof#1#2#3{% + \begingroup + \def#2{\advance\@tempcnta\@ne \@gobble}% + \@tempcnta\z@ + #3\relax + \edef\@tempb{#1=\the\@tempcnta\relax}% + \@xp\endgroup + \@tempb +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\safe@set} +% This is a quick and dirty way of extracting an integer prefix +% from a string and assigning it to a counter. If the string does +% not begin with an integer, the counter receives the value~0. The +% suffix after the integer prefix is discarded. (But bad things +% will happen if the string contains the token \cs{@nil}.) +% \begin{macrocode} +\def\safe@set#1#2{% + \afterassignment\@nilgobble + #1=0#2\relax\@nil +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@chomp} +% Vaguely reminiscent of Perl's \texttt{chomp} function, which removes +% a substring from the end of a variable, but ours works with +% tokens (more-or-less) and takes the substring to be removed as +% its second argument. Note the use of \cs{@empty} to anchor the +% chomped substring to the end of the string. Note also that the +% second argument will be fully expanded during the chomping. +% \begin{macrocode} +\def\@chomp#1#2{% + \begingroup + \toks@\@emptytoks + \def\@chomper##1##2#2\@empty##3\@nil{% + \ifx\@let@token\bgroup + \toks@{{##1}##2}% + \else + \toks@{##1##2}% + \fi + }% + \@xp\chomp@ #1\@empty#2\@empty\@nil + \edef\@tempa{\def\@nx#1\@xp{\the\toks@}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\chomp@} +% Before passing control to \cs{@chomper}, we peek ahead at the +% next token in the stream. That way, if the next token is an open +% brace, we know we need to surround \cs{@chomper}'s first argument +% with braces. Unfortunately, this might still remove braces from +% the second argument, but I think that's ok for our purposes. +% \begin{macrocode} +\def\chomp@{% + \futurelet\@let@token + \@chomper +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\amsrefs@warning} +% \begin{macrocode} +\def\amsrefs@warning{\PackageWarning{amsrefs}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\amsrefs@error} +% \begin{macrocode} +\def\amsrefs@error{\PackageError{amsrefs}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MessageBreakNS} +% This suppresses the leading space in \cs{on@line} in error and +% warning messages. +% \begin{macrocode} +\def\MessageBreakNS{\MessageBreak\romannumeral`\^^@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addpunct} +% The \cs{@addpunct} function is defined by AMS document classes and +% the \pkg{amsgen} package. But if we find it undefined we had better +% define it. +% \begin{macrocode} +\@ifundefined{@addpunct}{% + \def\@addpunct#1{% + \relax\ifhmode + \ifnum\spacefactor>\@m \else#1\fi + \fi + } + \def\frenchspacing{% + \sfcode`\.1006 + \sfcode`\?1005 + \sfcode`\!1004 + \sfcode`\:1003 + \sfcode`\;1002 + \sfcode`\,1001\relax + } +}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nopunct} +% Omit any following punctuation that would normally be inserted by +% \cs{@addpunct}. +% \begin{macrocode} +\providecommand{\nopunct}{\spacefactor \@nopunctsfcode} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nopunctsfcode} +% \begin{macrocode} +\def\@nopunctsfcode{1007 } +% \end{macrocode} +% \end{macro} +% +% \subsection{Declaring package options} +% +% We call the \pkg{ifoption} package to facilitate some option tests. +% \begin{macrocode} +\RequirePackage{ifoption}[2000/02/15] +% \end{macrocode} +% +% The \opt{sorted} option is a no-op and is no longer documented. +% I'm only leaving it here for backwards compatibility. +% \begin{macrocode} +\DeclareExclusiveOptions{sorted,citation-order} +% \end{macrocode} +% The \opt{alphabetic} option corresponds to the standard \bst{alpha} +% biblio style with labels like Knu66 (three letters from name plus +% two digits of year). Maybe should provide an alias LllYY for this +% option. Numeric is the default since it is commoner in AMS +% publications. +% \begin{macrocode} +\DeclareExclusiveOptions{alphabetic,shortalphabetic,author-year,numeric} +% \end{macrocode} +% +% \begin{option}{y2k} +% \begin{macrocode} +\DeclareBooleanOption{y2k} +% \end{macrocode} +% \end{option} +% +% \begin{option}{nobysame} +% \begin{macrocode} +\DeclareBooleanOption{nobysame} +% \end{macrocode} +% \end{option} +% +% The standard \bst{abbrv} bibliography style uses abbreviations for +% month names and journal names, and first names of people are +% abbreviated to their initials. Since the second test bibliography +% that I tested with had unabbreviated month names but abbreviated +% journal names, perhaps it is a good idea to let these choices be +% specified separately. +% \begin{macrocode} +\DeclareBooleanOption{short-journals} +% \end{macrocode} +% \begin{macrocode} +\DeclareBooleanOption{short-publishers} +% \end{macrocode} +% The \opt{short-journals} and \opt{short-publishers} options only +% affect journal and publisher names that are defined with +% \cn{DefineJournal} and \cn{DefinePublisher} commands. +% \begin{macrocode} +\DeclareBooleanOption{short-months} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareBooleanOption{initials} +% \end{macrocode} +% Nevertheless, it's to be expected that the preceding four options +% would typically be used together, so we provide a short-hand for +% requesting them all. +% \begin{macrocode} +\DeclareOption{abbrev}{% + \@pass@ptions + \@currext + {initials,short-months,short-journals,short-publishers}% + \@currname +} +% \end{macrocode} +% +% In the bibliography, if a title or something is enclosed in quotes, +% should the closing quotes go inside the punctuation (logical +% position) rather than outside (traditional)? These options give you +% a choice. +% \begin{macrocode} +\DeclareExclusiveOptions{traditional-quotes,logical-quotes} +% \end{macrocode} +% +% A sequence of cites will be sorted and ranges of length three or +% greater will be compressed if these options so indicate. Note +% that the \opt{non-sorted-cites} option automatically disables +% compression. This is probably a feature. +% \begin{macrocode} +\DeclareExclusiveOptions{sorted-cites,non-sorted-cites} +\DeclareExclusiveOptions{non-compressed-cites,compressed-cites} +% \end{macrocode} +% +% In the bibliography, print page numbers showing where each +% entry was cited. +% \begin{macrocode} +\DeclareBooleanOption{backrefs} +% \end{macrocode} +% +% Option for giving information about the available options: +% \begin{macrocode} +\DeclareBooleanOption{?} +% \end{macrocode} +% +% This option means to forgo loading of the \pkg{textcmds} and +% \pkg{mathscinet} packages. +% \begin{macrocode} +\DeclareBooleanOption{lite} +% \end{macrocode} +% +% This option can be used by later releases as a sign that fall-back +% adaptations need to be done. +% \begin{macrocode} +\DeclareBooleanOption{beta} +% \end{macrocode} +% +% This one is obsolete now. +% \begin{macrocode} +\DeclareBooleanOption{jpa} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareBooleanOption{bibtex-style} +% \end{macrocode} +% +% \begin{macrocode} +\ExecuteOptions{numeric,traditional-quotes,sorted-cites,compressed-cites} + +\ProcessOptions\relax + +\ProcessExclusiveOptions +% \end{macrocode} +% +% \begin{macrocode} +\IfOption{backrefs}{% + \IfFileExists{hyperref.sty}{% + \RequirePackage{hyperref}[1999/07/08] + }{}% + \IfFileExists{backref.sty}{% + \RequirePackage{backref}[1999/05/30] + }{}% +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{?} option} +% +% Note that in the following auxiliary package list, \pkg{getwidth} +% is not (yet) included. +% \begin{macrocode} +\IfOption{?}{% + \typeout{^^J% + Documentation for the amsrefs package is found in amsrdoc.dvi^^J% + (or .pdf or .tex). + ^^J% + }% +}{}% +% \end{macrocode} +% +% \subsection{Loading auxiliary packages} +% Now, if these other packages make use of the \pkg{pcatcode} package +% like they should, then we don't need to make any fuss here about +% the special catcode of \texttt{'}. Just load the packages. +% \begin{macrocode} +\RequirePackage{rkeyval}[2001/12/22] +% \end{macrocode} +% +% \subsubsection{The \opt{lite} option} +% +% In my opinion, this is misguided, since \pkg{amsrefs} shouldn't +% be loading these packages to begin with. But it's too late to +% change it now. +% +% \begin{macrocode} +\IfOption{lite}{% True? Then don't load the next two packages. +}{% False? OK, let's load them: + \RequirePackage{textcmds}[2001/12/14] + \RequirePackage{mathscinet}[2002/01/01] +} +% \end{macrocode} +% +% \subsection{Key-value setup} +% +% \begin{macro}{\BibField} +% This provides easy access to individual fields for user-defined +% formatting functions. +% \begin{macrocode} +\newcommand{\BibField}[1]{\csname bib'#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfEmptyBibField} +% A convenient partial application of \cn{rkvIfEmpty}. +% \begin{macrocode} +\newcommand{\IfEmptyBibField}{\rkvIfEmpty{bib}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Standard field names (the \texttt{bib} group)} +% +% And here are the predefined key names. You could always add some +% more if you needed them. Only worry is about compatibility if you +% want to share your data with other people. +% +% \begin{macro}{\fld@elt} +% \begin{macro}{\name} +% We want the list macros used above to be unexpandable except when +% special processing is done. (It's not clear to me there's any +% real benefit to using these instead of just using \cn{do}.---dmj) +% \begin{macrocode} +\let\fld@elt=? +\let\name=? +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% First the fields that could be repeated more than once in a single +% entry. Maybe publisher should be allowed to repeat also, for +% co-published works. But then need to worry about the address +% handling. +% \begin{macrocode} +\DefineAdditiveKey{bib}{author}{\name} +\DefineAdditiveKey{bib}{editor}{\name} +\DefineAdditiveKey{bib}{translator}{\name} +\DefineAdditiveKey{bib}{contribution}{\fld@elt} +\DefineAdditiveKey{bib}{isbn}{\fld@elt} +\DefineAdditiveKey{bib}{issn}{\fld@elt} +\DefineAdditiveKey{bib}{review}{\fld@elt} +\DefineAdditiveKey{bib}{partial}{\fld@elt} +% \end{macrocode} +% +% \begin{macrocode} +\DefineSimpleKey{bib}{address} +\DefineSimpleKey{bib}{book} +\DefineSimpleKey{bib}{booktitle} +\DefineSimpleKey{bib}{conference} +%\DefineSimpleKey{bib}{contributor} +\DefineSimpleKey{bib}{copula} +\DefineSimpleKey{bib}{date} +\DefineSimpleKey{bib}{doi} +\DefineSimpleKey{bib}{edition} +\DefineSimpleKey{bib}{eprint} +\DefineSimpleKey{bib}{fulljournal} +\DefineSimpleKey{bib}{hyphenation} +\DefineSimpleKey{bib}{institution} +\DefineSimpleKey{bib}{journal} +\DefineSimpleKey{bib}{label} +\DefineSimpleKey{bib}{language} +\DefineSimpleKey{bib}{name} +\DefineSimpleKey{bib}{note} +\DefineSimpleKey{bib}{number} +\DefineSimpleKey{bib}{organization} +\DefineSimpleKey{bib}{pages} +\DefineSimpleKey{bib}{part} +\DefineSimpleKey{bib}{place} +\DefineSimpleKey{bib}{publisher} +\DefineSimpleKey{bib}{reprint} +\DefineSimpleKey{bib}{school} +\DefineSimpleKey{bib}{series} +\DefineSimpleKey{bib}{setup} +\DefineSimpleKey{bib}{status} +\DefineSimpleKey{bib}{subtitle} +\DefineSimpleKey{bib}{title} +\DefineSimpleKey{bib}{translation} +\DefineSimpleKey{bib}{type} +\DefineSimpleKey{bib}{url} +\DefineSimpleKey{bib}{volume} +\DefineSimpleKey{bib}{xref} +\DefineSimpleKey{bib}{year} +% \end{macrocode} +% The \fld{transition} key is used when we want to insert punctuation +% or other material at a given point in the sequence +% unconditionally. The key appears to have a non-empty value to +% \cn{IfEmptyBibField}, but its value (expansion) is empty. +% \begin{macrocode} +\DefineDummyKey{bib}{transition} +% \end{macrocode} +% +% \subsubsection{Auxiliary properties (the \texttt{prop} group)} +% +% \begin{macrocode} +\DefineSimpleKey{prop}{inverted} +\DefineSimpleKey{prop}{language} +% \end{macrocode} +% +% \subsection{Bibliography type specifications} +% +% \begin{macro}{\BibSpec} +% Accumulate specification material in \cs{toks@}, then define +% \cs{setbib@TYPE} from it. +% \begin{macrocode} +\newcommand{\BibSpec}[2]{% + \toks@\@emptytoks + \@ifnotempty{#2}{% +% \end{macrocode} +% The \cs{@ifnextchar} removes an optional |+| at the beginning of +% a specification. From then on, each time \cs{bibspec@scan} is +% invoked, it expects to find four arguments. The four +% \cs{@empty}s appended to the specification (|#2|) below ensure +% that this is so. +% \begin{macrocode} + \@ifnextchar{+}{\@xp\bibspec@scan\@gobble}{\bibspec@scan}% + #2\@empty\@empty\@empty\@empty + }% + \@xp\edef\csname setbib@#1\endcsname{\the\toks@}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibspec@scan} +% The \cs{bibspec@scan} function scans one field specification +% from the second arg of \cn{BibSpec}. Each field specification has +% the form +% \begin{verbatim} +% +{punctuation}{prelim material}{field name} +%\end{verbatim} +% Note however that because the initial |+| is stripped off by +% \cs{BibSpec} (see above), the actual order that \cs{bibspec@scan} +% reads the field specification is +% \begin{verbatim} +% #1={punctuation} #2={prelim material} #3={field name} #4=+ +%\end{verbatim} +% where the fourth argument is actually expected to be either the +% |+| from the following specification, or one of the special +% \cs{@empty} tokens inserted by \cs{BibSpec}. If it is neither of +% these special values, it means we have a malformed specification; +% so, we issue an error and then try to pick up where we left off. +% \begin{macrocode} +\def\bibspec@scan#1#2#3#4{% + \add@toks@{\bib@append{#1}{#2}}% + \edef\@tempa{% + \toks@{\the\toks@ \@xp\@nx\csname bib'#3\endcsname}% + }% + \@tempa + \ifx\@empty#4% + \@xp\@gobble % end the recursion + \else + \ifx +#4\else\bibspec@scan@error\fi + \fi + \bibspec@scan +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibspec@scan@error} +% \begin{macrocode} +\def\bibspec@scan@error{\amsrefs@error{Bad BibSpec: Expected '+'}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@append} +% The function \cs{bib@append} prints the value of a field, together +% with associated punctuation and font changes, unless the value is +% empty. Arg 1 is punctuation (that may need to be swapped with a +% preceding line break), arg 2 gives the space to be added after the +% punctuation, and possibly a function to be applied to the contents +% of arg 3, which is +% a macro containing the field +% value. So if we have \cn{moo} and \cn{bib'pages}, from +% \verb'pages={21\ndash 44}', then we want to arrange to call +% \begin{verbatim} +% \moo{21\ndash 44} +%\end{verbatim} +% We don't want to simply call \cs{moo}\cs{bib'bar} because that makes +% it rather difficult for \cs{moo} to look at the contents of +% \cs{bib@bar}. +% \begin{macrocode} +\def\bib@append#1#2#3{% + \ifx\@empty#3% + \else +% \end{macrocode} +% \begin{bug} +% Need better error message here. +% \end{bug} +% \begin{macrocode} + \ifx\relax#3% + \errmessage{#3=\relax}% + \else + \begingroup + \series@index\m@ne + \def\current@bibfield{#3}% + \@ifempty{#1}{% + \@temptokena{\ifnum\lastkern=\@ne\ignorespaces\fi #2}% + }{% + \@temptokena{\SwapBreak{#1}#2}% + }% + \toks@\@xp{#3}% + \edef\@tempa{\the\@temptokena{\the\toks@}}% + \rkvIfAdditive#3{}{% + \get@current@properties + \select@auxlanguage + }% + \@tempa + \endgroup + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\select@auxlanguage} +% \begin{macrocode} +\def\select@auxlanguage{% + \ifx\prop'language\@empty + \else + \@xp\selectlanguage\@xp{\prop'language}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\erase@field} +% There are some fields that can appear in more than one place in a +% reference, depending on context. For example, if a book has an +% editor but no author, the editor appears at the beginning of the +% entry, but if the book has both an editor and an author, the +% editor appears at the end of the entry. A simple way to handle +% this is to ``erase'' the \fld{editor} field after printing it, +% which is what \cs{erase@field} is for. +% +% The obvious definition of \cs{erase@field} is +% \begin{verbatim} +% \def\erase@field#1{\global\let#1\@empty} +%\end{verbatim} +% but that doesn't work because the top-level value of +% \pkg{rkeyval} fields isn't \cs{@empty}; instead, it contains a +% setter function used by \cs{RestrictedSetKeys} when processing a +% key-value list (see \cs{rkv@DSAK}, \cs{rsk@set@a} and +% \cs{rsk@set@b}). +% +% On the other hand, rewriting the field locally won't work +% either, since \cs{erase@field} will typically be executed inside +% the group established by \cs{bib@append}. Instead, we want to +% rewrite the value right after \cs{bib@append}'s group ends. One +% way to do this would be to keep a list of fields to be erased and +% have \cs{bib@append} iterate over the list after its +% \ncn{endgroup}. +% +% However, as long as the call to \cs{erase@field} +% is never nested within any deeper groups, it's simpler just to +% use \cs{aftergroup}, which is what we'll do (``Sufficient unto +% the day is the evil thereof'' and all that). +% \begin{macrocode} +\def\erase@field#1{% + \aftergroup\let\aftergroup#1\aftergroup\@empty +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@current@properties} +% This retrieves the auxiliary properties for the current field +% value, as defined by \cs{current@bibfield} and +% \cs{series@index}. +% \begin{macrocode} +\def\get@current@properties{% + \begingroup + \@xp\get@nth@property\@xp\@tempa\current@bibfield\series@index + \edef\@tempa{% + \@nx\RestrictedSetKeys{}{prop}{% + \def\@nx\@tempa{\@nx\prop@reset \@nx\the\@nx\rsk@toks}% + }{\@tempa}% + }% + \@tempa + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\BibSpecAlias} +% This is a \cs{def} rather than a \cs{let} because using \cs{let} +% would make \cn{BibSpecAlias} statements order-sensitive in a way +% that seems frequently to be a stumbling block to unwary package +% writers. But then we should probably do at least the simplest +% kind of infinite loop check. +% \begin{macrocode} +\newcommand{\BibSpecAlias}[2]{% + \@xp\def\@xp\@tempa\@xp{\csname setbib@#1\@xp\endcsname}% + \@xp\ifx\csname setbib@#2\endcsname\@tempa + \amsrefs@error{% + Mirror alias #1->#2 not allowed (infinite loop)}\@ehc + \else + \@xp\def\csname setbib@#1\@xp\endcsname + \@xp{\csname setbib@#2\endcsname}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \subsection{The standard bibliography types} +% +% \begin{macrocode} +\BibSpec{article}{% + +{} {\PrintAuthors} {author} + +{,} { \textit} {title} + +{.} { } {part} + +{:} { \textit} {subtitle} + +{,} { \PrintContributions} {contribution} + +{.} { \PrintPartials} {partial} + +{,} { } {journal} + +{} { \textbf} {volume} +% \end{macrocode} +% The date form is tricky depending on presence or absence of DOI. +% \begin{macrocode} + +{} { \PrintDatePV} {date} + +{,} { \issuetext} {number} + +{,} { \eprintpages} {pages} + +{,} { } {status} + +{,} { \PrintDOI} {doi} + +{,} { available at \eprint} {eprint} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} + +\BibSpec{partial}{% + +{} {} {part} + +{:} { \textit} {subtitle} + +{,} { \PrintContributions} {contribution} + +{,} { } {journal} + +{} { \textbf} {volume} + +{} { \PrintDatePV} {date} + +{,} { \issuetext} {number} + +{,} { \eprintpages} {pages} +} + +\BibSpec{contribution}{% + +{} {} {type} + +{} { by \PrintNameList} {author} +} + +\BibSpec{book}{% + +{} {\PrintPrimary} {transition} + +{,} { \textit} {title} + +{.} { } {part} + +{:} { \textit} {subtitle} + +{,} { \PrintEdition} {edition} + +{} { \PrintEditorsB} {editor} + +{,} { \PrintTranslatorsC} {translator} + +{,} { \PrintContributions} {contribution} + +{,} { } {series} + +{,} { \voltext} {volume} + +{,} { } {publisher} + +{,} { } {organization} + +{,} { } {address} + +{,} { \PrintDateB} {date} + +{,} { } {status} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} + +\BibSpec{collection.article}{% + +{} {\PrintAuthors} {author} + +{,} { \textit} {title} + +{.} { } {part} + +{:} { \textit} {subtitle} + +{,} { \PrintContributions} {contribution} + +{,} { \PrintConference} {conference} + +{} {\PrintBook} {book} + +{,} { } {booktitle} + +{,} { \PrintDateB} {date} + +{,} { pp.~} {pages} + +{,} { } {status} + +{,} { \PrintDOI} {doi} + +{,} { available at \eprint} {eprint} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} + +\BibSpec{conference}{% + +{} {} {title} + +{} {\PrintConferenceDetails} {transition} +} + +\BibSpec{innerbook}{% + +{,} { } {title} + +{.} { } {part} + +{:} { } {subtitle} + +{,} { \PrintEdition} {edition} + +{} { \PrintEditorsB} {editor} + +{,} { \PrintTranslatorsC} {translator} + +{,} { \PrintContributions} {contribution} + +{,} { } {series} + +{,} { \voltext} {volume} + +{,} { } {publisher} + +{,} { } {organization} + +{,} { } {address} + +{,} { \PrintDateB} {date} + +{.} { } {note} +} + +\BibSpec{report}{% + +{} {\PrintPrimary} {transition} + +{,} { \textit} {title} + +{.} { } {part} + +{:} { \textit} {subtitle} + +{,} { \PrintEdition} {edition} + +{,} { \PrintContributions} {contribution} + +{,} { Technical Report } {number} + +{,} { } {series} + +{,} { } {organization} + +{,} { } {address} + +{,} { \PrintDateB} {date} + +{,} { \eprint} {eprint} + +{,} { } {status} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} + +\BibSpec{thesis}{% + +{} {\PrintAuthors} {author} + +{,} { \textit} {title} + +{:} { \textit} {subtitle} + +{,} { \PrintThesisType} {type} + +{,} { } {organization} + +{,} { } {address} + +{,} { \PrintDateB} {date} + +{,} { \eprint} {eprint} + +{,} { } {status} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} +% \end{macrocode} +% +% \begin{macrocode} +\BibSpecAlias{periodical}{book} +\BibSpecAlias{collection}{book} +\BibSpecAlias{proceedings}{book} +\BibSpecAlias{manual}{book} +\BibSpecAlias{miscellaneous}{book} +\BibSpecAlias{misc}{miscellaneous} +\BibSpecAlias{unpublished}{book} +\BibSpecAlias{proceedings.article}{collection.article} +\BibSpecAlias{techreport}{report} +% \end{macrocode} +% +% \begin{macro}{\setbib@incollection} +% \begin{macrocode} +\edef\setbib@incollection{% + \@xp\@nx\csname setbib@collection.article\endcsname +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setbib@inproceedings} +% \begin{macrocode} +\edef\setbib@inproceedings{% + \@xp\@nx\csname setbib@collection.article\endcsname +} +% \end{macrocode} +% \end{macro} +% +% Some more entry types for implementing abbreviations. +% \begin{macrocode} +\BibSpec{name}{% + +{} {\PrintAuthors} {name} +} + +\BibSpec{publisher}{% + +{,} { } {publisher} + +{,} { } {address} +} +% \end{macrocode} +% +% \subsection{The \env{biblist} environment} +% +% The \env{biblist} environment can be used with a section or chapter +% heading. +% +% Use a standard \lat/ counter for numbering bibliography items. +% \begin{macrocode} +\newcounter{bib} +% \end{macrocode} +% +% \begin{environment}{biblist} +% \begin{macrocode} +\newenvironment{biblist}{% + \setcounter{bib}\z@ + \@biblist +}{% + \@endbiblist +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{biblist*} +% \begin{macrocode} +\newenvironment{biblist*}{% + \@biblist +}{% + \@endbiblist +} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\@biblist} +% \begin{macrocode} +\newcommand\@biblist[1][]{% + \stepcounter{bib@env} + \normalfont + \footnotesize + \labelsep .5em\relax + \list{\BibLabel}{% + \restore@labelwidth + \@maxlabelwidth\z@ + \@nmbrlisttrue + \def\@listctr{bib}% + \let\makelabel\bib@mklab + #1\relax + }% + \sloppy +% \end{macrocode} +% Discourage page breaks within bibliography entries and disable them +% completely for entries that are less than four lines long. +% \begin{macrocode} + \interlinepenalty\@m + \clubpenalty\@M + \widowpenalty\clubpenalty + \frenchspacing + \ResetCapSFCodes +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@endbiblist} +% Change error for empty list (no items) to warning, to allow authors +% to leave their bibliography temporarily empty during writing: +% \begin{macrocode} +\def\@endbiblist{% + \save@labelwidth + \def\@noitemerr{\@latex@warning{Empty bibliography list}}% + \endlist +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@maxlabelwidth} +% \begin{macrocode} +\newdimen\@maxlabelwidth +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@mklab} +% \begin{macrocode} +\def\bib@mklab#1{% + \settowidth\@tempdima{#1}% + \ifdim \@tempdima > \@maxlabelwidth + \global\@maxlabelwidth\@tempdima + \fi + #1\hfil +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\newcounter{bib@env} +% \end{macrocode} +% +% \begin{macro}{\save@labelwidth} +% \begin{macrocode} +\def\save@labelwidth{% + \if@filesw + \immediate\write\@auxout{% + \string\newlabel{[bibenv:\the\c@bib@env]}{\the\@maxlabelwidth}% + }% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\restore@labelwidth} +% \begin{macrocode} +\def\restore@labelwidth{% + \@xp\ifx \csname r@[bibenv:\the\c@bib@env]\endcsname \relax + \resetbiblist{00}% + \else + \@xp\labelwidth\csname r@[bibenv:\the\c@bib@env]\endcsname + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ResetCapSFCodes} +% Presumably this is here because there has been a problem in the +% past with packages that change the \cs{catcode}s of capital +% letters. +% \begin{macrocode} +\providecommand{\ResetCapSFCodes}{% + \count@=`\A + \def\@tempa{% + \sfcode\count@=\@m + \advance\count@\@ne + \ifnum\count@>`\Z\relax \expandafter\@gobble \fi + \@tempa + }% + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CurrentBib} +% In case this is undefined sometimes. +% \begin{macrocode} +\def\CurrentBib{??} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\BibLabel} +% \begin{macrocode} +\newcommand{\BibLabel}{% + [\hyper@anchorstart{cite.\CurrentBib}\relax\thebib\hyper@anchorend]% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\resetbiblist} +% \begin{macrocode} +\newcommand{\resetbiblist}[1]{% + \settowidth\labelwidth{\def\thebib{#1}\BibLabel}% + \leftmargin\labelwidth + \ifdim\labelwidth=\z@ + \leftmargin=1em + \itemindent=-\leftmargin + \else + \advance\leftmargin\labelsep + \fi +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Processing bibliography entries} +% +% There are several things one might want to do when a \cn{bib} entry +% is encountered: +% \begin{enumerate} +% +% \item Format and print it. This corresponds to the direct entry +% of bibliography items as described in section~2.1 of the users's +% guide. +% +% \item Copy it into a \fn{.bbl} file. This corresponds to the use +% of \cn{bibselect} and an external \fn{.ltb} database as described +% in section~2.2 of the user's guide. +% +% \item Store the full information in memory. This is done by +% \cn{bib*}. +% +% \end{enumerate} +% +% \begin{macro}{\bib} +% Here is where the rubber hits the road. +% \begin{macrocode} +\newcommand{\bib}{% + \begingroup + \@ifstar{% + \@tempswatrue + \let\@bibdef\star@bibdef + \BibItem + }{% + \@tempswafalse + \BibItem + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\BibItem} +% \MacroArgs +% \macroarg{1}{citekey} +% \macroarg{2}{bibtype} +% \begin{macrocode} +\newcommand{\BibItem}[2]{% + \def\@tempa{#1}% + \edef\@tempb{% + \@nx\@bibdef\@xp\@nx\csname setbib@#2\endcsname{#2}% + {\macrotext\@tempa}% + }% + \@tempb +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@bibdef} +% \cs{@bibdef} is a pointer to the procedure that should be handed +% the entry's key-value pairs. It has one of four values: +% \begin{enumerate} +% +% \item \cs{star@bibdef} +% +% \item \cs{normal@bibdef} +% +% \item \cs{copy@bibdef} +% +% \item \cs{selective@bibdef} +% +% \end{enumerate} +% \MacroArgs +% \macroarg{1}{\cs{setbib@}bibtype} +% \macroarg{2}{bibtype} +% \macroarg{3}{citekey} +% \begin{macrocode} +\AtBeginDocument{\let\@bibdef\normal@bibdef} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@exec} +% And \cs{bib@exec} is a pointer to the procedure that +% \cs{normal@bibdef} will invoke to process the key-value pairs +% after they've been parsed. It has one +% of these values: +% \begin{enumerate} +% +% \item \cs{bib@store} +% +% \item \cs{bib@print} +% +% \end{enumerate} +% \MacroArgs +% \macroarg{1}{citekey} +% \macroarg{2}{\cs{the}\cs{rsk@toks}} +% \macroarg{3}{\cs{setbib@}bibtype} +% \begin{macrocode} +\AtBeginDocument{\let\bib@exec\bib@print} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{\cs{@bibdef} Implementations} +% +% \begin{macro}{\normal@bibdef} +% \MacroArgs +% \macroarg{1}{\cs{setbib@}bibtype} +% \macroarg{2}{bibtype} +% \macroarg{3}{citekey} +% \begin{macrocode} +\def\normal@bibdef#1#2#3{% +% \end{macrocode} +% \cs{CurrentBibType} is used by \pkg{export-bibtex}, but there +% might be a better way to handle it. (dmj) +% \begin{macrocode} + \def\CurrentBibType{#2}% + \ifx\relax#1% + \amsrefs@error{Undefined entry type: #2}\@ehc + \let#1\setbib@misc + \fi + \RestrictedSetKeys{}{bib}% + {\bib@exec{#3}{\the\rsk@toks}{#1}\endgroup}% +} + +\let\@bibdef\normal@bibdef +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\star@bibdef} +% \MacroArgs +% \macroarg{1}{\cs{setbib@}bibtype} +% \macroarg{2}{bibtype} +% \macroarg{3}{citekey} +% \begin{macrocode} +\def\star@bibdef{% + \let\bib@exec\bib@store + \normal@bibdef +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\copy@bibdef} +% This is a variation that copies everything into the \fn{.bbl} +% file. Used by \cn{bibselect*} and \cn{bib*} inside \fn{.ltb} +% files. +% \begin{macrocode} +\def\copy@bibdef{% + \if@tempswa + \@xp\defer@bibdef + \else + \@xp\copy@bibdef@a + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\copy@bibdef@a} +% \begin{macrocode} +\def\copy@bibdef@a#1#2#3#4{% + \@open@bbl@file + \process@xrefs{#4}% + \bbl@write{% + \string\bib\if@tempswa*\fi{#3}{#2}\string{\iffalse}\fi + }% +% \end{macrocode} +% Since we're supplying our own definition of \cs{rsk@set}, we +% don't actually need the group argument, so we leave it out to +% save a few tokens. +% \begin{macrocode} + \RestrictedSetKeys{\global\let\rsk@set\bbl@copy}\@empty + {\bbl@write{\iffalse{\fi\string}^^J}% + \endgroup}{#4}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\catcode`\:=11 + +\def\modify@xref@fields{% + \let\set:bib'author\output@xref@a + \let\set:bib'editor\output@xref@a + \let\set:bib'translator\output@xref@a + \let\set:bib'journal\output@xref@a + \let\set:bib'publisher\output@xref@a + \def\set:bib'xref##1##2{\output@xref@{##1}\@empty}% +} + +\catcode`\:=12 + +\def\process@xrefs#1{% + \begingroup + \RestrictedSetKeys{\modify@xref@fields}{bib}{\the\rsk@toks}{#1}% + \endgroup +} + +\def\output@xref@a#1#2{% + \def\@tempa{#1}% + \lowercase{\def\@tempb{#1}}% + \ifx\@tempa\@tempb + \output@xref@{#1}% + \fi +} + +\def\output@xref@#1{% + \@ifnotempty{#1}{% + \@ifundefined{bi@#1}{}{% + \begingroup + \let\star@bibdef\copy@bibdef@a + \csname bi@#1\endcsname + \endgroup + }% + \@xp\g@undef\csname bi@#1\endcsname + }% +} +% \end{macrocode} +% +% \begin{macro}{\bbl@copy} +% \begin{macrocode} +\def\bbl@copy#1\endcsname#2{% + \begingroup + \def\@tempa{#1}% + \toks@{{#2}}% + \star@{\bbl@copy@a}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bbl@copy@a} +% \begin{macrocode} +\def\bbl@copy@a#1{% + \@ifnotempty{#1}{% + \add@toks@{*{#1}}% + }% + \bbl@write{ \space\@tempa=\the\toks@,}% + \endgroup + \rsk@resume +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\selective@bibdef} +% This is a variation that ignores anything not having a known +% citation key. Used by \cn{bibselect}. +% +% \MacroArgs +% \macroarg{1}{\cs{setbib@}bibtype} +% \macroarg{2}{bibtype} +% \macroarg{3}{citekey} +% \begin{macrocode} +\def\selective@bibdef#1#2#3{% + \@xp\selbibdef@a\csname b@#3\endcsname{#1}{#2}{#3}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\selbibdef@a} +% \begin{macrocode} +\def\selbibdef@a#1{% + \def\@tempa{\endgroup\@gobblefour}% + \ifx\relax#1\else \@xp\selbibdef@b#1\@nil \fi + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\selbibdef@b} +% \begin{macrocode} +\def\selbibdef@b#1#2#3\@nil{% + \ifx 1#2\let\@tempa\copy@bibdef\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\defer@bibdef} +% This is a variation that ignores anything not having a known +% citation key. Used by \cn{bibselect}. +% +% \MacroArgs +% \macroarg{1}{\cs{setbib@}bibtype} +% \macroarg{2}{bibtype} +% \macroarg{3}{citekey} +% \macroarg{4}{key-val pairs} +% \begin{macrocode} +\def\defer@bibdef#1#2#3#4{% + \@xp\gdef\csname bi@#3\endcsname{% + \bib*{#3}{#2}{#4}% + }% + \@xp\addto@defer@list \csname bi@#3\endcsname + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibdefer@list} +% \begin{macrocode} +\let\bibdefer@list\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addto@defer@list} +% \begin{macrocode} +\def\addto@defer@list#1{% + \begingroup + \def\do{\@nx\do\@nx}% + \xdef\bibdefer@list{\bibdefer@list\do#1}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{\cs{bib@exec} Implementations} +% +% \begin{macro}{\bib@store} +% This is the easy one. It just stores the entire set of key-value +% pairs in \cs{bi@}\emph{citekey}. +% \begin{macrocode} +\def\bib@store#1{% + \afterassignment\@gobble + \@xp\xdef\csname bi@#1\endcsname +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\numeric@refs} +% \begin{macrocode} +\def\numeric@refs{00} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@print} +% \MacroArgs +% \macroarg{1}{citekey} +% \macroarg{2}{\cs{the}\cs{rsk@toks}} +% \macroarg{3}{\cs{setbib@}bibtype} +% \begin{macrocode} +\def\bib@print#1#2#3{% + \bib@start{#1}% + \let\setbib@@#3% + #2\relax % execute definitions locally + \bib@resolve@xrefs + \bib@field@patches + \bib@selectlanguage + \generate@label + \bib'setup + \bib@cite{#1}% + \kern\@ne sp + \ifx\setbib@@\setbib@article + \ifx\bib'booktitle\@empty + \ifx\bib'book\@empty + \ifx\bib'conference\@empty + \else + \let\setbib@@\setbib@incollection + \fi + \else + \let\setbib@@\setbib@incollection + \fi + \else + \let\setbib@@\setbib@incollection + \fi + \fi + \setbib@@ + \bib@end +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@print@inner} +% Note that the order of the arguments is reversed with respect to +% \cs{bib@print}. Maybe that isn't such a great idea. +% \MacroArgs +% \macroarg{1}{\cs{setbib@}bibtype} +% \macroarg{2}{\cs{the}\cs{rsk@toks}} +% \begin{macrocode} +\def\bib@print@inner#1#2{% + \begingroup + #2\relax % execute definitions locally + \bib@field@patches + \bib'setup + #1% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\current@citekey} +% \begin{macrocode} +\let\current@citekey\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\prev@citekey} +% \begin{macrocode} +\let\prev@citekey\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@start} +% There used to be more to it. +% \begin{macrocode} +\def\bib@start#1{% + \begingroup + \def\current@citekey{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@end} +% Instead of being handled by \cs{bib@end}, ending punctuation is +% normally handled via the \fld{transition} field (q.v.) +% \begin{macrocode} +\def\bib@end{% + \relax + \@xp\PrintBackRefs\@xp{\CurrentBib}% + \par + \save@primary + \global\let\prev@citekey\current@citekey + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Resolving cross-references} +% +% \begin{macro}{\bib@resolve@xrefs} +% \begin{macrocode} +\def\bib@resolve@xrefs{% + \xref@check@c\bib'xref + \xref@check@a\bib'author + \xref@check@a\bib'editor + \xref@check@a\bib'translator + \xref@check@b\bib'journal + \xref@check@b\bib'publisher +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xref@check@a} +% Resolve a contributor (typically a \cn{DefineName}) alias. +% Requires rebuilding the list. +% \begin{macrocode} +\def\xref@check@a#1{% + \ifx\@empty#1\relax + \else + \begingroup + \toks@\@emptytoks + \@temptokenb\@emptytoks + \series@index\z@ + \def\name{\xref@check@aa#1}% + #1\relax + \edef\@tempa{% + \def\@nx#1{\the\toks@}% + \the\@temptokenb + }% + \@xp\endgroup + \@tempa + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xref@check@aa} +% \begin{macrocode} +\def\xref@check@aa#1#2{% + \advance\series@index\@ne + \def\@tempa{#2}% + \lowercase{\def\@tempb{#2}}% + \ifx\@tempa\@tempb + \ifx\@tempa\@empty + \add@toks@{\name{}}% + \else + \@ifundefined{bi@#2}{% + \BibAbbrevWarning{#2}% + \add@toks@{\name{#2}}% + }{% + \xref@check@ab#1{#2}% + }% + \fi + \else + \add@toks@{\name{#2}}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xref@check@ab} +% \begin{macrocode} +\def\xref@check@ab#1#2{% + \csname bi@#2\endcsname + \ifx\@empty\bib'name + \@temptokena{#2}% + \else + \@temptokena\@xp{\bib'name}% + \get@property\@tempa\bib'name + \edef\@tempa{% + \@nx\addto@hook\@temptokenb{% + \@nx\reset@nth@property\@nx#1\the\series@index{\@tempa}% + }% + }% + \@tempa + \fi + \edef\@tempa{\@nx\add@toks@{\@nx\name{\the\@temptokena}}}% + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xref@check@b} +% Resolve a \fld{journal} or \fld{publisher} alias (typically a +% \cn{DefinePublisher} or \cn{DefineJournal} alias). +% \begin{macrocode} +\def\xref@check@b#1{% + \ifx\@empty#1% + \else + \toks@\@xp{#1}% + \edef\@tempb{\lowercase{\def\@nx\@tempa{\the\toks@}}}% + \@tempb + \ifx\@tempa#1\relax % all lowercase + \@ifundefined{bi@#1}{% + \BibAbbrevWarning{#1}% + }{% +% \end{macrocode} +% We pass control to \cs{xref@check@c} here to handle inheritance +% of multiple fields properly. This means some of the checking +% we've just done gets done again, but I can live with that. +% \begin{macrocode} + \let#1\@empty + \xref@check@c\@tempa + }% + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xref@check@c} +% Resolve an \fld{xref} field. +% \begin{macrocode} +\def\xref@check@c#1{% + \ifx#1\@empty + \else + \begingroup + \let\DSK@def\xref@add@toks + \let\DSK@append\xref@append + \toks@\@emptytoks + \let\bib@reset\@empty +% \end{macrocode} +% The \cs{@for} here is just a fancy way of expanding \arg{1}. (Or +% is it?) +% \begin{macrocode} + \@for\xref@ID:=#1\do{% + \@ifundefined{bi@\xref@ID}{% + \XRefWarning{\xref@ID}% + }{% + \csname bi@\xref@ID\endcsname + }% + }% + \edef\@tempa{\endgroup\the\toks@}% + \@tempa + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xref@add@toks} +% If any title occurs in an \fld{xref}ed item, assume that it is a book +% title. This might not always be the best assumption? Let's see how +% it goes though. [mjd,2001-12-11] +% +% \MacroArgs +% \macroarg{1}{\cs{bib'}field} +% \macroarg{2}{value} +% \begin{macrocode} +\def\xref@add@toks#1#2#3{% + \ifx#1\@empty + \edef\@tempa{% + \@nx\add@toks@{\@xp\@nx\csname\rkv@setter#1\endcsname{#2}{#3}}% + }% + \@tempa + \else + \in@\bib'title{#1}% + \ifin@ + \ifx\bib'booktitle\@empty + \edef\@tempa{% + \@nx\add@toks@{% + \@xp\@nx\csname set:bib'booktitle\endcsname + }% + }% + \@tempa + \add@toks@{{#2}{#3}}% + \fi + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\def\xref@append#1#2#3#4{% + \edef\@tempa{% + \@nx\add@toks@{\@xp\@nx\csname\rkv@setter#2\endcsname{#3}{#4}}% + }% + \@tempa +} +% \end{macrocode} +% +% \begin{macro}{\BibAbbrevWarning} +% \begin{macrocode} +\def\BibAbbrevWarning#1{\amsrefs@warning{Abbreviation '#1' undefined}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\XrefWarning} +% \begin{macrocode} +\def\XRefWarning#1{\amsrefs@warning{Xref '#1' undefined}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Bib field preprocessing} +% +% \begin{macro}{\current@primary} +% \begin{macrocode} +\let\current@primary\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\previous@primary} +% \begin{macrocode} +\let\previous@primary\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\save@primary} +% \begin{macrocode} +\IfOption{nobysame}{% + \let\save@primary\@empty +}{% + \def\save@primary{% + \global\let\previous@primary\current@primary + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@field@patches} +% \begin{macrocode} +\def\bib@field@patches{% + \ifx\bib'author\@empty + \ifx\bib'editor\@empty + \let\current@primary\bib'translator + \let\print@primary\PrintTranslatorsA + \else + \let\current@primary\bib'editor + \let\print@primary\PrintEditorsA + \fi + \else + \let\current@primary\bib'author + \let\print@primary\PrintAuthors + \fi + \ifx\bib'address\@empty + \let\bib'address\bib'place + \fi + \ifx\bib'organization\@empty + \ifx\bib'institution\@empty + \let\bib'organization\bib'school + \else + \let\bib'organization\bib'institution + \fi + \fi + \ifx\bib'date\@empty + \ifx\bib'year\@empty + \let\bib@year\bib'status + \else + \bib@parsedate\bib'year + \fi + \else + \bib@parsedate\bib'date + \fi +% \end{macrocode} +% Example~21 on page~74 of \emph{Mathematics into +% Type}~\cite{SOS99} seems to indicate that when the year serves as +% the volume number, the date should be suppressed. If so, this is +% where that is done. +% \begin{macrocode} + \def\@tempa{year}% + \ifx\bib'volume\@tempa + \let\bib'volume\bib@year + \let\bib'date\@empty + \fi +% \end{macrocode} +% \cs{bib'language} is used for producing the printed rendition of +% the language. \cs{bib@language} needs to be in the form required by +% \cn{selectlanguage}. +% \begin{macrocode} + \bib@language@fixup +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Date setup} +% +% \begin{macro}{\bib@year} +% \begin{macrocode} +\let\bib@year\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@month} +% \begin{macrocode} +\let\bib@month\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@day} +% \begin{macrocode} +\let\bib@day\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@parsedate} +% Parse an ISO 8601 date into its year, month and day components, +% but without actually verifying that any of the components are +% numeric. Hmmm. +% \begin{macrocode} +\def\bib@parsedate#1{% + \@xp\bib@parsedate@a#1---\@nil +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@parsedate@a} +% \begin{macrocode} +\def\bib@parsedate@a#1-#2-#3-#4\@nil{% + \def\bib@year{#1}% + \def\bib@month{#2}% + \def\bib@day{#3}% +% \end{macrocode} +% The rest of this macro tries to rewrite \cs{bib'date} into a +% normalized form. I'm not sure if this is a good idea. +% \begin{macrocode} + \ifx\@empty\bib@day + \ifx\@empty\bib@month + \let\bib'date\bib@year + \else + \def\bib'date{#1-#2}% + \fi + \else + \def\bib'date{#1-#2-#3}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Language setup} +% +% \begin{macro}{\bib@language@fixup} +% \begin{macrocode} +\def\bib@language@fixup{% + \ifx\bib'hyphenation\@empty + \ifx\bib'language\@empty + \let\bib@language\biblanguagedefault + \else + \let\bib@language\bib'language + \fi + \else + \let\bib@language\bib'hyphenation + \fi + \def\@tempa##1 ##2\@nil{\lowercase{\def\bib@language{##1}}}% +% \end{macrocode} +% The mysterious \cs{@firstofone} here is to preserve the space +% before the \cs{@nil}. +% \begin{macrocode} + \@firstofone{\@xp\@tempa\bib@language} \@nil +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@selectlanguage} +% For \cn{bib} purposes we are interested mainly in testing whether +% the hyphenation patterns are the same. So we use an +% if-same-patterns test (by which \pkg{babel}'s `english' and +% `american' compare as equal) rather than an if-same-language test. +% Also, the way that the \cn{selectlanguage} command checks to see +% whether a language has been properly defined for babel use is to +% see if \cs{dateLANGUAGE} is defined. And if we tried to select an +% undefined language, the result would be a \lat/ error. +% \begin{macrocode} +\def\bib@selectlanguage{% + \@ifsame@patterns{\languagename}{\bib@language}{}{% + \@ifundefined{date\bib@language}{}{% + \@xp\selectlanguage\@xp{\bib@language}% + }% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ifsame@patterns} +% \begin{macrocode} +\def\@ifsame@patterns#1#2{% + \@xp\@ifsamepat\csname l@#1\@xp\endcsname\csname l@#2\endcsname +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ifsamepat} +% \begin{macrocode} +\def\@ifsamepat#1#2{% + \ifnum \ifx\relax#1\m@ne\else#1\fi = \ifx\relax#2\m@ne\else#2\fi + \@xp\@firstoftwo + \else + \@xp\@secondoftwo + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\languagename} +% \begin{macro}{\biblanguageEnglish} +% \begin{macro}{\biblanguagedefault} +% \begin{macro}{\bib@language} +% \begin{macrocode} +\providecommand{\languagename}{english} +\def\biblanguageEnglish{english} +\let\biblanguagedefault\biblanguageEnglish +\let\bib@language\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Citation label setup} +% +% \begin{macro}{\generate@label} +% \begin{macrocode} +\let\generate@label\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@label} +% \begin{macrocode} +\def\cite@label{\@currentlabel} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\alpha@label} +% \begin{macrocode} +\let\alpha@label\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@cite} +% When \cs{bib@cite} is called, author name and year are available +% in \cs{bib@author} and \cs{bib@year}. +% \MacroArgs +% \macroarg{1}{citekey} +% \begin{macrocode} +\def\bib@cite#1{% + \def\CurrentBib{#1}% + \alpha@label % modify \thebib if necessary + \item\leavevmode + \SK@\SK@@label{#1}% + \@xp\bib@cite@a\csname b@#1\endcsname + \bibcite@write{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\def\bib@cite@a#1{% + \ifx\relax#1% + \begingroup + \auto@protect\etaltext + \protected@edef\@tempa{% + \gdef\@nx#1{% + \@nx\citesel 01{\cite@label}{\bib@label@year}{}% + }% + }% + \@xp\endgroup + \@tempa + \else + \@xp\bib@cite@check\@xp#1#1\@empty\@empty\@empty\@empty\@empty + \fi +} +% \end{macrocode} +% +% \begin{macro}{\bib@cite@check} +% For the citation key we want to check if it is already defined. But +% there is a slight problem. There is already one control +% sequence in use for each bibliography entry, to store the label or +% the author/year information needed by \cn{cite}. If we introduce +% another control sequence to check whether a particular cite is +% multiply defined, then we double the number of control sequences +% used. For a large bibliography in a book this is fairly serious. +% This is addressed by using a \cs{citesel} function. +% +% \MacroArgs +% \macroarg{1}{\cs{b@}citekey} +% \macroarg{2}{\cs{citesel}} +% \macroarg{3}{cited?} +% \macroarg{4}{used?} +% \macroarg{5}{label} +% \macroarg{6}{year} +% \macroarg{7}{backrefs} +% \begin{macrocode} +\def\bib@cite@check#1#2#3#4#5#6#7{% + \ifx 1#4\relax + \DuplicateBibKeyWarning + \else +% \end{macrocode} +% This has gotten \emph{way} out of hand. +% \begin{macrocode} + \begingroup + \auto@protect\etaltext + \@apply\auto@protect\amsrefs@textsymbols + \@apply\auto@protect\amsrefs@textaccents + \@tempswafalse + \in@\CitePrintUndefined{#5}% + \ifin@ + \let\@tempa\@empty + \else + \def\@tempa{#5}% + \fi + \ifx\@tempa\@empty + \else + \@xp\ifx\@xp\@currentlabel\cite@label + \edef\@tempb{\cite@label}% + \else + \let\@tempb\cite@label + \fi + \ifx\@tempa\@tempb + \def\@tempa{#6}% + \ifx\@tempa\bib@label@year + \else + \@tempswatrue + \fi + \else + \@tempswatrue + \fi + \fi + \if@tempswa + \@ifempty{#6}{% + \def\@tempa{#5}% + \let\@tempb\cite@label + }{% + \def\@tempa{#5, #6}% + \def\@tempb{\cite@label, \bib@label@year}% + }% + \amsrefs@warning{Citation label for \extr@cite#1 is + changing from `\@tempa ' to `\@tempb '}% + \fi + \protected@edef\@tempa{% + \gdef\@nx#1{% + \@nx\citesel #31{\cite@label}{\bib@label@year}{#7}% + }% + }% + \@xp\endgroup + \@tempa + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@label@year} +% \begin{macrocode} +\let\bib@label@year\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DuplicateBibKeyWarning} +% \begin{macrocode} +\def\DuplicateBibKeyWarning{% + \amsrefs@warning{% + Duplicate \protect\bib\space key + `\CurrentBib ' detected\MessageBreakNS}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibcite@write} +% \begin{macrocode} +\def\bibcite@write#1{% + \if@filesw + \let\citesel\citesel@write + \csname b@#1\endcsname + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel@write} +% \begin{macrocode} +\def\citesel@write#1#2#3#4#5{% + \begingroup + \toks@{{#3}{#4}}% + \immediate\write\@auxout{\string\bibcite{\CurrentBib}{\the\toks@}}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% Because duplicate bibs are caught immediately, we don't need +% \cs{bibcite} to run \cs{@testdef}. +% \begin{macrocode} +\AtEndDocument{\let\bibcite\@gobbletwo} +% \end{macrocode} +% +% \subsubsection{Printing the bibliography} +% +% \begin{macro}{\bibname} +% \begin{macrocode} +\providecommand{\bibname}{Bibliography} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\refname} +% \begin{macrocode} +\providecommand{\refname}{References} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{bibchapter} +% We need to take a little extra trouble here to pre-expand the +% \cn{bibname}. +% \begin{macrocode} +\newenvironment{bibchapter}[1][\bibname]{% + \begingroup + \protected@edef\@{\endgroup\protect\chapter*{#1}}% + \@ +}{\par} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{bibsection} +% And here to pre-expand the \cn{refname}. +% \begin{macrocode} +\newenvironment{bibsection}[1][\refname]{% + \begingroup + \protected@edef\@{\endgroup\protect\section*{#1}}% + \@ +}{\par} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{bibdiv} +% Here we try to guess whether this is a book-like document or an +% article-like document. +% \begin{macrocode} +\@ifundefined{chapter}{% + \newenvironment{bibdiv}{\bibsection}{\endbibsection} +}{% + \newenvironment{bibdiv}{\bibchapter}{\endbibchapter} +} +% \end{macrocode} +% \end{environment} +% +% This is what the standard \cls{book} class has for the bibliography +% title: +% \begin{verbatim} +% \newenvironment{thebibliography}[1] +% {\chapter*{\bibname +% \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}}% +% \list{\@biblabel{\@arabic\c@enumiv}}% +%\end{verbatim} +% +% \begin{environment}{thebibliography} +% \begin{macrocode} +\renewenvironment{thebibliography}[1]{% + \bibdiv + \biblist[\resetbiblist{#1}]% +}{% + \endbiblist + \endbibdiv +} +% \end{macrocode} +% \end{environment} +% +% \subsection{Name, journal and publisher abbreviations} +% +% The commands \cn{DefineName}, \cn{DefinePublisher}, and +% \cn{DefineJournal} are provided to make abbreviations a little +% easier. +% +% \begin{macro}{\DefineName} +% \begin{macrocode} +\newcommand{\DefineName}[2]{% + \bib*{#1}{name}{name={#2}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DefineJournal} +% \begin{macrocode} +\newcommand{\DefineJournal}[4]{% + \bib*{#1}{periodical}{ + issn={#2}, + journal={#4} + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DefinePublisher} +% Note that an explicit \fld{address} field in a \cn{bib} entry will +% override the \fld{address} supplied as part of a +% \cn{DefinePublisher}. +% \begin{macrocode} +\newcommand{\DefinePublisher}[4]{% + \bib*{#1}{publisher}{% + publisher={#3}, + address={#4} + }% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Processing \fn{.ltb} files} +% +% If you have a file that contains \pkg{amsrefs}-style +% \cn{bib} entries, you can use it as a database and extract items +% from it for use in another document. In typical relatively simple +% scenarios, the extraction can be done by \lat/ itself on the first +% pass, so that citations in the text will be successfully resolved +% on the second pass (possibly even the first, depending on what kind +% of bibliography sorting is used). +% +% \begin{macro}{\bibselect} +% \begin{macrocode} +\newcommand{\bibselect}{% + \@ifstar{% + \let\@bibdef\copy@bibdef + \BibSelect + }{% + \let\@bibdef\selective@bibdef + \BibSelect + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\BibSelect} +% \begin{macrocode} +\newcommand{\BibSelect}[2][\bblname]{% + \if@filesw + \typeout{Trying to create bbl file `#1.bbl' ...}% + \def\bibselect@msg{% + \typeout{ ... rats. Unable to create bbl file.}% + }% + \let\@open@bbl@file\OpenBBLFile + \@for\@tempa:=#2\do{\ReadBibData{\@tempa}}% + \fi + \@close@bbl@file + \@apply\g@undef\bibdefer@list + \global\let\bibdefer@list\@empty +% \end{macrocode} +% Now read the \fn{.bbl} file we just created. +% \begin{macrocode} + \let\@bibdef\normal@bibdef + \@input@{#1.bbl}% + \let\BibSelect\MultipleBibSelectWarning +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MultipleBibSelectWarning} +% \begin{macrocode} +\newcommand\MultipleBibSelectWarning[2][]{% + \amsrefs@warning{% + Multiple \string\bibselect 's found (only one + \string\bibselect\space per biblist environment is allowed)% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bblname} +% \begin{macrocode} +\def\bblname{\jobname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@dbfile} +% \begin{macrocode} +\newread\bib@dbfile +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ReadBibData} +% \begin{macrocode} +\newcommand{\ReadBibData}[1]{% + \IfFileExists{#1.ltb}{% + \openin\bib@dbfile=\@filef@und \relax + }{% + \IfFileExists{#1.ltx}{% + \openin\bib@dbfile=\@filef@und \relax + }{% + \IfFileExists{#1.tex}{% + \openin\bib@dbfile=\@filef@und \relax + }{% + \begingroup + \NoBibDBFile{#1}% + \let\ReadBibData@a\endgroup + }% + }% + }% + \ReadBibData@a +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NoBibDBFile} +% \begin{macrocode} +\def\NoBibDBFile#1{% + \amsrefs@warning{No data file #1.ltb (.ltx, .tex) found}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ReadBibData@a} +% \begin{macrocode} +\def\ReadBibData@a{% + \ProvidesFile{\@filef@und}\relax + \begingroup + \let\star@bibdef\defer@bibdef + \ReadBibLoop + \endgroup + \closein\bib@dbfile +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ReadBibLoop} +% \begin{macrocode} +\def\ReadBibLoop{% + \ifeof\bib@dbfile + \@xp\@gobble + \else + \read\bib@dbfile to\CurLine +% \end{macrocode} +% The \cs{@empty} is in case \cs{CurLine} is empty. +% \begin{macrocode} + \@xp\ReadBibLoop@a\CurLine\@empty\@nil + \fi + \ReadBibLoop +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ReadBibLoop@e} +% This traps top-level \cn{bib} commands. Note that: +% \begin{itemize} +% +% \item +% If \cs{CurLine} doesn't contain a complete \cn{bib} entry, the +% code chokes. +% +% \item +% I \cn{bib} is not the very first non-space token in a line, it +% will not be recognized. +% +% \end{itemize} +% +% \begin{macrocode} +\long\def\ReadBibLoop@a#1#2\@nil{% + \ifx\bib#1% + \CurLine % just exec it + \else +% \end{macrocode} +% We're not done yet. The line may contain something like +% \cn{DefineName}, so we need to expand the first macro in the line +% and see if it starts with \cn{bib}. But first we check to make +% sure that the token we're about to expand isn't \cn{endinput}. +% \begin{macrocode} + \ifx\endinput#1% + \let\ReadBibLoop\@empty + \else +% \end{macrocode} +% And this \cs{@empty} is for the admittedly unlikely case that +% \cs{CurLine} isn't empty, but its expansion is. +% \begin{macrocode} + \@xp\ReadBibLoop@b#1#2\@empty\@nil + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ReadBibLoop@b} +% \begin{macrocode} +\long\def\ReadBibLoop@b#1#2\@nil{% + \ifx\bib#1% + \CurLine % just exec it + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\let\bbl@out=\relax +\let\bbl@write\@gobble +\let\@open@bbl@file\relax +\let\@close@bbl@file\relax +% \end{macrocode} +% +% \begin{macro}{\OpenBBLFile} +% \begin{macrocode} +\def\OpenBBLFile{% + \if@filesw + % Just use the next unused output stream + \count@\count17 + \advance\count@\@ne + \ifnum\count@<\sixt@@n + \global\chardef\bbl@out=\count@ + \immediate\openout\bbl@out=\bblname.bbl\relax + \global\let\@close@bbl@file\CloseBBLFile + \gdef\bbl@write{\immediate\write\bbl@out}% + \else + \ch@ck\count@\sixt@@n\write + \fi + \fi + \global\let\@open@bbl@file\relax +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CloseBBLFile} +% \begin{macrocode} +\def\CloseBBLFile{% + \immediate\closeout\bbl@out\relax + \global\let\@close@bbl@file\relax + \global\let\bbl@write\@gobble + \global\let\bbl@out\relax +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Citation processing} +% +% \subsubsection{The \cs{citesel} structure} +% +% The information used by \cn{cite} for key \texttt{moo} is stored in +% \cs{b@moo} in the form +% \begin{verbatim} +% \citesel{status1}{status2}{label}{year}{backref-info} +%\end{verbatim}% +% +% The first status flag is~1 if this key has already been cited +% earlier in the same document; 0~otherwise. This is used in some +% bibliography schemes to print a full list of author names for the first +% citation and an abbreviated author list for subsequent citations. +% +% The second status flag is~1 if this key has already been used by a +% define-cite command (such as \cn{bib}); 0~otherwise. This makes it +% possible to issue a warning message as soon as the conflict is seen, +% on the first \lat/ run, instead of on a subsequent run during the +% processing of the \fn{.aux} file. +% +% When an author/year citation scheme is in use, args 3 and~4 hold +% respectively author names and year. Otherwise arg~3 simply holds +% a cite label and arg~4 is empty. +% +% And finally, arg~5 holds a list of backref pointers indicating the +% locations in the document where this entry has been cited. +% +% \begin{macro}{\citesel@update} +% \begin{macrocode} +\def\citesel@update#1#2#3#4#5#6{% + \gdef#6{\citesel 1#2{#3}{#4}{#5}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel@number} +% \begin{macrocode} +\def\citesel@number#1#2#3#4#5{#3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel@year} +% \begin{macrocode} +\def\citesel@year#1#2#3#4#5{#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel} +% \begin{macrocode} +\let\citesel\citesel@number +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The basic \cn{cite} command} +% +% Here is the difference between the various optional forms of +% \cn{cite}: +% \begin{verbatim} +% \cite{xyz} -> \cite@a\citesel{xyz}{} +% -> \cite@bc\b@xyz\citesel{} +% +% \cite{xyz}*{blub} -> \cite@a\citesel{xyz}{blub} +% -> \cite@bc\b@xyz\citesel{blub} +% +% \cite[blub]{xyz} -> \cite@a\citesel{xyz}{blub} +% -> \cite@bc\b@xyz\citesel{blub} +%\end{verbatim} +% +% Canceling the old \lat/ definition of \verb*'\cite ' prevents +% certain problems that could arise with the \pkg{showkeys} package. +% \begin{macrocode} +\expandafter\let\csname cite \endcsname\relax +% \end{macrocode} +% +% \begin{macro}{\cite} +% Need to handle the standard [...] option for compatibility's sake. +% \begin{macrocode} +\renewcommand{\cite}[2][]{% + \if\cite@single#2,\@gobble \else\MultipleCiteKeyWarning{#2}{#1}\fi + \@ifempty{#1}{% + \cites@o{#2}% + }{% + \ObsoleteCiteOptionWarning + \cites@a{*{#1}}{#2}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MultipleCiteKeyWarning} +% \begin{macrocode} +\def\MultipleCiteKeyWarning#1#2{% + \amsrefs@warning{% + Use of \string\cites\space is recommended instead of % + \string\cite\space\MessageBreak + for multiple cites '#1'}% + \@ifnotempty{#2}{% + \amsrefs@warning{Star option requires \string\citelist\space here}% + }% + \global\let\MultipleCiteKeyWarning\@gobbletwo +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ObsoleteCiteOptionWarning} +% \begin{macrocode} +\def\ObsoleteCiteOptionWarning{% + \amsrefs@warning{% + The form \string\cite{...}*{...} is recommended\MessageBreak + instead of \string\cite[...]{...}}% + \global\let\ObsoleteCiteOptionWarning\@empty +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@single} +% \begin{macrocode} +\edef\cite@single#1,#2{\iffalse{\fi\iffalse{\fi\string}#2.\string}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cites@o} +% \begin{macrocode} +\def\cites@o#1{\star@{\cites@oo{#1}}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cites@oo} +% \begin{macrocode} +\def\cites@oo#1#2{\@ifempty{#2}{\cites@a{}{#1}}{\cites@a{*{#2}}{#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cites@a} +% \begin{macrocode} +\def\cites@a#1#2{% + \begingroup + \toks@{\endgroup \cites@b{#1}}% + \vdef\@tempa{#2}% + \edef\@tempa{% + \the\toks@ \@firstofone{\@xp\zap@space\@tempa} \@empty + }% + \@tempa,\@empty + \edef\@tempa{\endgroup\@nx\citelist{\the\toks@}}% + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cites@b} +% \begin{macrocode} +\def\cites@b#1#2,#3{% + \begingroup + \toks@{\InnerCite{#2}#1}% + \ifx\@empty#3\@xp\@gobble\fi + \cites@c#3% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cites@c} +% \begin{macrocode} +\def\cites@c#1,#2{% + \add@toks@{\InnerCite{#1}}% + \ifx\@empty#2\@xp\@gobble\fi + \cites@c#2% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citeleft} +% \begin{macro}{\citeright} +% \begin{macro}{\citemid} +% \begin{macro}{\citepunct} +% These variables are named to follow the precedent set by +% Arseneau's \pkg{cite} package. \cs{citemid} is used to separate a +% citation label from additional information such as \qq{Theorem +% 4.9}. \cs{citepunct} is used to separate multiple cites, unless +% one of the cites has additional associated information, in which +% case \cs{CiteAltPunct} is used. +% \begin{macrocode} +\def\citeleft{[} +\def\citeright{]} +% \end{macrocode} +% \begin{macrocode} +\def\citemid{,\penalty9999 \space} +\def\citepunct{,\penalty9999 \hskip.13em plus.1em minus.05em\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\citeAltPunct} +% When a citation list contains one or more citations with optional +% arguments, we replace \cs{citemid} by \cs{CiteAltPunct}. +% \begin{macrocode} +\def\citeAltPunct{;\ } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citeform} +% This is used for formatting the citation label. It can be used, +% for example, to bolden the labels (as in \cls{amsbook} and +% \cls{amsproc}) or to do more elaborate things such as convert the +% numbers to roman numerals. By default, it's just a no-op. +% +% Note that currently there is no corresponding macro for changing +% the formatting of \cn{cite}'s optional argument. This is +% probably a bug. +% \begin{macrocode} +\providecommand{\citeform}{\@firstofone} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citelist} +% The \cs{@citelist} indirection turns out to be helpful in +% implementing the \cs{ocites} command for the \opt{author-year} +% option. +% \begin{macrocode} +\DeclareRobustCommand{\citelist}{\@citelist} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@citelist} +% \begin{macrocode} +\def\@citelist#1{% + \leavevmode + \begingroup + \@citestyle + \citeleft\nopunct % suppress first \citepunct + \cite@begingroup + \in@*{#1}% + \ifin@ + \let\citepunct\citeAltPunct + \fi + \let\cite@endgroup\@empty + \cites@init + \def\citeleft{\@addpunct{\citepunct}}% + \let\citeright\ignorespaces + \def\cite{\InnerCite}% + \process@citelist{#1}% + \endgroup + \citeright + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@citestyle} +% Reset the font to an upright, medium font (e.g. \fnt{cmr}), per +% AMS style. Also set $\cs{mathsurround} = 0\,\mathrm{pt}$ just in +% case there are subscripts in the cite numbers (from +% \cn{etalchar}, for example). +% \begin{macrocode} +\providecommand{\@citestyle}{\m@th\upshape\mdseries} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@begingroup} +% Grouping that encloses an entire cite block (a single cite or a +% list of cites). +% \begin{macrocode} +\def\cite@begingroup{\begingroup\let\cite@begingroup\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@endgroup} +% \begin{macrocode} +\let\cite@endgroup\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cites@init} +% This needs to be called at the beginning of a list of cites to +% reset a few things. +% \begin{macrocode} +\def\cites@init{% + \gdef\prev@names{???}% + \let\cites@init\@empty +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\InnerCite} +% \begin{macrocode} +\newcommand{\InnerCite}[1]{\star@{\cite@a\citesel{#1}}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@a} +% The job of \cs{cite@a} is to convert the cite key to all catcode-12 +% characters and remove any spaces it might contain before passing +% it on to \cs{cite@b}. +% +% \MacroArgs +% \macroarg{1}{\cs{CITESEL}} +% \macroarg{2}{citekey} +% \begin{macrocode} +\def\cite@a#1#2{% + \BackCite{#2}% + \cite@begingroup + \cites@init + \let\citesel#1\relax + \ifx\citesel\citesel@author + \let\citeleft\@empty + \let\citeright\@empty + \fi + \begingroup + \toks@{\endgroup \cite@b}% + \vdef\@tempa{#2}% + \edef\@tempa{% + \the\toks@{\@firstofone{\@xp\zap@space\@tempa} \@empty}% + }% + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@b} +% \MacroArgs +% \macroarg{1}{citekey} +% \macroarg{2}{star-optional-arg} +% \begin{macrocode} +\def\cite@b#1#2{% + \@xp\cite@bc\csname b@#1\@xp\endcsname {#1}{#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@bc} +% If it's uninitialized, plug in an empty cite structure. +% \cs{cite@bc} should be executed only once for a given instance of a +% cite key. All further processing should go through \cs{cite@cj}. +% \begin{macrocode} +\def\cite@bc#1#2{% + \ifx#1\@@undefined \global\let#1\relax \fi + \ifx#1\relax \global\let#1\empty@cite \fi + \@xp\cite@nobib@test#1{}{}{}{}\@nil#1% + \cite@cj#1% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\empty@cite} +% \begin{macrocode} +\def\empty@cite{\citesel 00{}{}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@nobib@test} +% If arg 4 is empty, it means there wasn't any \cn{bib} command that +% defined a valid label. +% +% \MacroArgs +% \macroarg{1}{\cs{citesel}} +% \macroarg{2}{cited?} +% \macroarg{3}{used?} +% \macroarg{4}{label} +% \macroarg{5}{backrefs} +% \macroarg{6}{\cs{b@}citekey} +% \begin{macrocode} +\def\cite@nobib@test#1#2#3#4#5\@nil#6{% + \@ifempty{#4}{% + \G@refundefinedtrue + \UndefinedCiteWarning#6% + \xdef#6{\@nx\citesel #2#3{% + \@nx\CitePrintUndefined{\extr@cite#6}}{}{}}% + }{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\UndefinedCiteWarning} +% This is a copy of the standard warning from \cs{@citex}. +% \begin{macrocode} +\def\UndefinedCiteWarning#1{% + \@latex@warning{% + Citation `\extr@cite#1' on page \thepage\space undefined}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CitePrintUndefined} +% \begin{macrocode} +\DeclareRobustCommand{\CitePrintUndefined}[1]{% + \begingroup\fontshape{n}\fontseries\mddefault \ttfamily ?#1\endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CPU@normal} +% This has to be a \cs{let}, not a \cs{def}. +% \begin{macrocode} +\let\CPU@normal\CitePrintUndefined +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@cj} +% \MacroArgs +% \macroarg{1}{\cs{b@}citekey} +% \macroarg{2}{star-optional-arg} +% \begin{macrocode} +\def\cite@cj#1#2{% + \leavevmode + \begingroup + \cite@cb#1% write info to aux file + \ar@SK@cite#1% + \@citeleft + \ar@hyperlink{#1}% + \@ifnotempty{#2}{\citemid{#2}}% + \citeright + \endgroup + \ignorespaces % ignore spaces inside \citelist + \cite@endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@citeleft} +% The following definition provides some indirection that helps to +% deal with author-year object cites. +% \begin{macrocode} +\def\@citeleft{\citeleft} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@cb} +% \begin{macrocode} +\def\cite@cb#1{% + \if@filesw + \immediate\write\@auxout{\string\citation{\extr@cite#1}}% + \fi +% \end{macrocode} +% Define \cs{citesel} to make \cs{b@whatever} update itself. +% \begin{macrocode} + \begingroup + \let\citesel\citesel@update + #1#1% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extr@cite} +% Extract \emph{citekey} from \cs{b@}\emph{citekey}. +% \begin{macrocode} +\def\extr@cite{\@xp\@gobblethree\string} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Fancier \cn{cite} commands} +% +% \begin{macro}{\cites} +% A list of simple cites. Make it robust in case used inside a figure +% caption. (But then also, by the way, listoffigures should provide +% special handling.) +% \begin{macrocode} +\DeclareRobustCommand{\cites}{\cites@a{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citen} +% This is just to keep the showkeys package from clobbering the wrong +% part of our definition of \cn{cite}: +% \begin{macrocode} +\providecommand{\citen}{\ocite} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ycite} +% \cn{cite} gets redefined inside of \cn{citelist}, so we need to +% \cs{def} \cn{ycite} here instead of just \cs{let}ting everything +% to \cn{cite}. +% \begin{macrocode} +\def\ycite{\cite} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ycites} +% \begin{macrocode} +\let\ycites\cites +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ocite} +% \begin{macrocode} +\let\ocite\ycite +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ocites} +% \begin{macrocode} +\let\ocites\cites +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fullcite} +% \begin{macrocode} +\let\fullcite\cite +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fullocite} +% \begin{macrocode} +\let\fullocite\ocite +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citeauthor} +% \begin{macrocode} +\let\citeauthor\ycite +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citeauthory} +% \begin{macrocode} +\let\citeauthory\ycite +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The \cn{nocite} command} +% +% \begin{macro}{\nocite} +% \begin{macrocode} +\renewcommand{\nocite}[1]{\othercites{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\othercites} +% \begin{macrocode} +\newcommand{\othercites}[1]{% + \cite@begingroup + \let\cite@endgroup\@empty + \def\citelist{\othercitelist}% + \cites{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\othercitelist} +% \begin{macrocode} +\newcommand{\othercitelist}[1]{% + \cite@begingroup + \let\cite@endgroup\@empty + \cites@init + \let\citeleft\relax + \let\citeright\ignorespaces + \def\InnerCite{\OtherCite}% + \def\cite@cj ##1##2{% + \begingroup + \@xp\citesel##1% + \cite@cb ##1% + \endgroup +% \end{macrocode} +% If we detect |\nocite{*}|, we globally alias +% \cs{selective@bibdef} to \cs{copy@bibdef} so that all succeeding +% \cn{bibselect} commands act like \cn{bibselect*}. +% \begin{macrocode} + \@xp\ifx\csname b@*\endcsname ##1% + \global\let\selective@bibdef\copy@bibdef + \fi + \ignorespaces + \cite@endgroup + }% + #1\relax + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\OtherCite} +% \begin{macrocode} +\def\OtherCite#1{\cite@a\citesel@other{#1}{}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel@other} +% \begin{macrocode} +\def\citesel@other#1#2#3#4#5#6{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\b@*} +% This provides a dummy definition to keep things like |\nocite{*}| +% from generating an error message. +% \begin{macrocode} +\@namedef{b@*}{\citesel 11{*}{*}{*}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Citation sorting} +% +% \begin{macro}{\process@citelist@sorted} +% \begin{macrocode} +\def\process@citelist@sorted#1{% + \ifx\citesel\citesel@number + \cite@sorted@s #1\cite@sorted@e + \else + \NonNumericCiteWarning + \process@citelist@unsorted{#1}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NonNumericCiteWarning} +% \begin{macrocode} +\def\NonNumericCiteWarning{% + \amsrefs@warning{% + Unable to confirm that cite keys are numeric: not sorting% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@citelist@unsorted} +% \begin{macrocode} +\def\process@citelist@unsorted#1{% + \ignorespaces#1\relax +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@citelist} +% By default, citation lists will be sorted. +% \begin{macrocode} +\let\process@citelist\process@citelist@sorted +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CPU@sort} +% By defining this as \TeX's maxint, undefined cites migrate to the +% end of a sorted list. +% \begin{macrocode} +\def\CPU@sort#1{2147483647} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@sorted@s} +% Here's where we prepare to sort the citations and (optionally) +% compress ranges. +% \begin{macrocode} +\def\cite@sorted@s{% + \begingroup + \let\CitePrintUndefined\CPU@sort + \let\cite@cjs\cite@cj + \let\cite@cj\cite@compress + \begingroup + \toks@\@emptytoks + \let\cite@cj\cite@sort + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@sorted@e} +% \begin{macrocode} +\def\cite@sorted@e{% + \@xp\endgroup + \the\toks@ + \cite@dash + \prev@cite + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@sort} +% This is essentially an insertion sort. I think. +% +% \MacroArgs +% \macroarg{1}{\cs{b@}citekey} +% \macroarg{2}{optional arg} +% \begin{macrocode} +\def\cite@sort#1#2{% + \safe@set\@tempcnta#1% highest number so far + \toks@{\cite@cj#1{#2}}% + \@temptokena\toks@ + \let\cite@cj\cite@sort@a + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@sort@a} +% \begin{macrocode} +\def\cite@sort@a#1#2{% + \safe@set\@tempcntb#1% + \ifnum\@tempcntb > \@tempcnta + \add@toks@{\cite@cj#1{#2}}% + \@tempcnta\@tempcntb + \else + \let\cite@cj\cite@sort@b + \toks@\@emptytoks + \def\@tempb{\add@toks@{\cite@cj#1{#2}}}% + \the\@temptokena + \@tempb + \let\cite@cj\cite@sort@a + \fi + \@temptokena\toks@ + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@sort@b} +% \begin{macrocode} +\def\cite@sort@b#1#2{% + \safe@set\count@#1% + \ifnum\@tempcntb < \count@ + \@tempb + \let\@tempb\@empty + \fi + \add@toks@{\cite@cj#1{#2}}% + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Range compression} +% +% When the time comes to apply compression, we have at our disposal a +% list of internal cite calls that looks like this: +% \begin{verbatim} +% \cite@cj\b@aaa{opta}\cite@cj\b@bbb{optb}...\cite@cj\b@zzz{optz} +%\end{verbatim} +% where +% \[ \ncn{b@aaa} < \ncn{b@bbb} < \cdots < \ncn{b@zzz} \] +% and the \texttt{opt} arguments are possibly null. +% To print the citations while collapsing sequences of 3 or more +% contiguous numbers into ranges of the form $n$--$m$, we bind +% \cs{cite@cj} to a suitably clever function and then execute the +% list. In the absence of optional arguments, here's the algorithm: +% +% \begin{enumerate} +% \item[Begin.] +% Enter state~0. This is done by \cs{cite@sorted@s}. +% \item[State 0.] +%^^A This is the initial state. +% The current citation is the beginning +% of a range (possibly a singleton range). Print it. Then, set +% $\mathit{prevnum} := \mathit{number}$ and enter state~1. +% +% \item[State 1.] +% The current citation might be the second element of a range. +% \begin{enumerate} +% \item[Case a)] +% $\mathit{number} = \mathit{prevnum} + 1$. Then the current +% item is definitely the second element of a range. It might be +% the last element of the range, but we won't know until we examine +% the following citation. So, save the current citation in +% \cs{prev@cite}, set $\mathit{prevnum} := \mathit{number}$, and go +% to state~2. +% +% \item[Case b)] +% $\mathit{number} \ne \mathit{prevnum} + 1$. The current citation +% is the beginning of a new range. Print it, set +% $\mathit{prevnum} := \mathit{number}$ and remain in state~1. +% (This is essentially identical to stage~0.) +% +% \end{enumerate} +% +% \item[State 2.]\leavevmode +% The current citation might be the third (or later) element of a +% range. +% \begin{enumerate} +% \item[Case a)] +% $\mathit{number} = \mathit{prevnum} + 1$. The current element is +% definitely part of a range. It might be the last +% element of the range, but again we won't know until we examine +% the following citation. Save the current citation +% in \cs{prev@cite} and set $\mathit{prevnum} := \mathit{number}$. +% Remain in state~2. +% +% \item[Case b)] +% $\mathit{number} \ne \mathit{prevnum} + 1$. The previous +% citation was the end of a range and the current citation is the +% beginning of a new range. Print a dash followed by +% \cs{prev@cite}, then set $\mathit{prevnum} := \mathit{number}$ +% and enter state~1. +% +% \end{enumerate} +% +% \item[End.] If \cs{prev@cite} is not empty, print it, preceded by a +% dash if we were in the middle of a range. (This is done by +% \cs{cite@sorted@e}.) +% +% \end{enumerate} +% +% The presence of optional arguments complicates things +% somewhat, since a citation with an optional argument should never +% participate in range compression. In other words, when we come +% across an optional argument, we should finish off the preceding +% range, print the current citation, and then return to the initial +% state. More precisely, here are the actions taken in each state +% when there is an optional argument: +% +% \begin{enumerate} +% +% \item[State 0.] +% Print the current citation and remain in state~0. +% +% \item[State 1.] +% Print the current citation and return to state~0. +% +% \item[State 2.] +% Print a dash followed by \cs{prev@cite}. Then print the current +% citation and return to state~0. +% +% \end{enumerate} +% +% \begin{macro}{\prev@cite} +% \begin{macrocode} +\let\prev@cite\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\prev@cite@cb} +% There's one further complication: Even though we're suppressing +% some of the citation numbers, we need to make sure that each +% citation is recorded in the \fn{.aux} file. So, in case~2a, +% before we overwrite \cs{prev@cite}, we first invoke +% \cs{prev@cite@cb} to record the previous citation (if any). +% \begin{macrocode} +\def\prev@cite@cb{% + \ifx\@prev@cite\@empty + \else + \begingroup + \def\cite@print##1##2{% + \cite@cb##1% + }% + \prev@cite + \endgroup + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@print} +% \begin{macrocode} +\def\cite@print#1#2{% + \begingroup + \let\CitePrintUndefined\CPU@normal + \cite@cjs#1{#2}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@dash} +% Ok, I lied. There was more than one further complication. +% Suppose that when we hit the end of the list, we're in state~2. +% We need to know whether to output a dash or a comma. (For +% example, both the sequences $[2, 3]$ and $[1, 2, 3]$ will end in +% state~2 with $\mathit{prevcite} = 3$, but in the former case we +% want a comma before the~3 and in the latter case we want a dash.) +% So, rather than printing the dash explicitly, we use +% \cs{cite@dash} to keep track of whether a dash is needed. +% \begin{macrocode} +\let\cite@dash\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@one@dash} +% \begin{macrocode} +\def\print@one@dash{% + \textendash \nopunct + \let\cite@dash\@empty +} +% \end{macrocode} +% \end{macro} +% +% State 0, 1 and~2 each correspond to a different binding for +% \cs{cite@cj}. Here they are. The role of $\mathit{prevnum}$ is +% played by \cs{@tempcnta}, with \cs{@tempcntb} assisting as +% $\mathit{number}$ at times. +% +% \begin{macro}{\cite@compress} +% State~0: +% \begin{macrocode} +\def\cite@compress#1#2{% + \cite@print#1{#2}% + \@ifempty{#2}{% + \safe@set\@tempcnta#1% + \let\cite@cj\cite@compress@a + }{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@compress@a} +% State~1: +% \begin{macrocode} +\def\cite@compress@a#1#2{% + \@ifempty{#2}{% + \advance\@tempcnta\@ne + \safe@set\@tempcntb#1% + \ifnum\@tempcnta=\@tempcntb + \def\prev@cite{\cite@print#1{}}% + \let\cite@cj\cite@compress@b + \else + \cite@print#1{}% + \@tempcnta\@tempcntb + \fi + }{% + \cite@print#1{#2}% + \let\cite@cj\cite@compress + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@compress@b} +% State~2: +% \begin{macrocode} +\def\cite@compress@b#1#2{% + \@ifempty{#2}{% + \advance\@tempcnta\@ne + \safe@set\@tempcntb#1% + \ifnum\@tempcnta=\@tempcntb + \let\cite@dash\print@one@dash + \prev@cite@cb + \def\prev@cite{\cite@print#1{}}% + \else + \cite@dash + \prev@cite + \let\prev@cite\@empty + \cite@print#1{}% + \@tempcnta\@tempcntb + \let\cite@cj\cite@compress@a + \fi + }{% + \cite@dash + \prev@cite + \let\prev@cite\@empty + \cite@print#1{#2}% + \let\cite@cj\cite@compress + }% +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Munging the \fn{.aux} file} +% +% \begin{macro}{\bibcite} +% When processing the \fn{.aux} file at begin-document, this is what +% \cs{bibcite} will do: +% \begin{macrocode} +\def\bibcite#1{\@xp\bibcite@a\csname b@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibcite@a} +% \MacroArgs +% \macroarg{1}{\cs{b@}citekey} +% \macroarg{2}{\embrace{\emph{label}}\embrace{} or \embrace{\emph{author}}\embrace{\emph{year}}} +% \begin{macrocode} +\def\bibcite@a#1#2{% +% \end{macrocode} +% Most of the time arg 1 will already be defined, by an earlier +% \cs{citedest} command in the \fn{.aux} file. Then we just need to change +% the number. +% \begin{macrocode} + \ifx\relax#1% + \gdef#1{\citesel 00#2{}}% + \else + \begingroup + \@xp\bibcite@b\@xp#1#1{#2}% + \endgroup + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibcite@b} +% +% \MacroArgs +% \macroarg{1}{\cs{b@}citekey} +% \macroarg{2}{\cs{citesel}} +% \macroarg{3}{cited?} +% \macroarg{4}{used?} +% \macroarg{5}{label} +% \macroarg{6}{year} +% \macroarg{7}{backrefs} +% \macroarg{8}{\embrace{\emph{newlabel}}\embrace{\emph{newyear}}} +% \begin{macrocode} +\def\bibcite@b#1#2#3#4#5#6#7#8{\gdef#1{\citesel#3#4#8{#7}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citedest} +% The \cs{citedest} command goes into the \fn{.aux} file to provide +% back-reference support. +% \begin{macrocode} +\newcommand{\citedest}[1]{\@xp\cite@dest\csname b@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@dest} +% \begin{macrocode} +\def\cite@dest#1{% + \ifx\relax#1% + \gdef#1{\citesel 00{}{}{}}% + \fi + \@xp\cite@dest@b\@xp#1#1% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite@dest@b} +% \MacroArgs +% \macroarg{1}{\cs{b@}citekey} +% \macroarg{2}{\cs{citesel}} +% \macroarg{3}{cited?} +% \macroarg{4}{used?} +% \macroarg{5}{label} +% \macroarg{6}{year} +% \macroarg{7}{backrefs} +% \macroarg{8}{\embrace{\emph{more backrefs}}} +% \begin{macrocode} +\def\cite@dest@b#1#2#3#4#5#6#7#8{% + \@ifempty{#7}{% + \def#1{\citesel #3#4{#5}{#6}{{#8}}}% + }{% + \gdef#1{\citesel #3#4{#5}{#6}{#7,{#8}}}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Back references} +% +% \begin{macro}{\ifBR@verbose} +% \begin{macrocode} +\@ifundefined{ifBR@verbose}{\let\ifBR@verbose\iffalse \let\fi\fi}{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\BackCite} +% \begin{macrocode} +\let\BackCite\@gobble +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\back@cite} +% \begin{macrocode} +\def\back@cite#1{% + \ifBR@verbose + \PackageInfo{backref}{back cite \string `\extr@cite#1'}% + \fi + \Hy@backout{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@backrefs} +% In an AMS-style bibliography, the backref info might follow the +% final period of the reference, or it might follow some +% \emph{Mathematical Reviews} info, without a period. +% \begin{macrocode} +\def\print@backrefs#1{% + \space\SentenceSpace$\uparrow$\csname br@#1\endcsname +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintBackRefs} +% \begin{macrocode} +\let\PrintBackRefs\@gobble +% \end{macrocode} +% \end{macro} +% +% \subsubsection{\pkg{hyperref} and \pkg{showkeys} support} +% +% \begin{macro}{\ar@hyperlink} +% \begin{macrocode} +\def\ar@hyperlink#1{\hyper@@link [cite]{}{cite.\extr@cite#1}{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ar@SK@cite} +% \begin{macrocode} +\def\ar@SK@cite#1{\@bsphack\@xp\SK@\@xp\SK@@ref\@xp{\extr@cite#1}\@esphack} +% \end{macrocode} +% \end{macro} +% +% Turn off \pkg{hyperref} and \pkg{showkeys} support if those +% packages don't appear to be loaded. +% \begin{macrocode} +\AtBeginDocument{% + \@ifundefined{hyper@@link}{% + \let\ar@hyperlink\@firstofone + \let\hyper@anchorstart\@gobble + \let\hyper@anchorend\relax + }{}% + \@ifundefined{SK@@label}{% + \let\ar@SK@cite\@gobble + \let\SK@@label\@gobble + \let\SK@\@gobbletwo + }{}% +} +% \end{macrocode} +% +% \subsection{Lexical structure of names} +% +% Before we can begin parsing names, we need to give some thought +% to the lexical structure of names. For the remainder of this +% document, when we refer to a ``name'' and especially when we +% speak of a name as a macro argument, we assume that the only +% tokens contained in the name are +% \begin{itemize} +% +% \item +% letters and punctuation (i.e., characters with catcode 11 or~12), +% +% \item +% ties (the token |~|$_{13}$), +% +% \item +% accent commands, such as |\"| or |\k|, +% +% \item +% text symbol macros, such as |\i|, |\ae| or |\cprime|, +% +% \item +% grouping characters (braces). +% +% \end{itemize} +% +% In addition to their normal function of delimiting macro +% arguments, braces inside names have the following special +% functions: +% \begin{enumerate} +% +% \item They are used to indicate that multiple characters should +% be considered a single ``compound'' character when extracting +% initials. For example, |Yuri| becomes |Y.|, but |{Yu}ri| becomes +% |Yu.| +% +% \label{initial-braces} +% An important aspect of this use of braces is that it only applies +% to the first characters of a given name. As we'll see below, +% this has important implications for our parsing code, which must +% preserve braces at the beginning of given names, but can be more +% cavalier with braces in other positions. +% +% \item +% Spaces and commas are ordinarily interpreted as name separators, +% rather than name components. Similarly, periods and hyphens +% usually have a special interpretation. All these characters can +% be stripped of their special meanings by putting them within +% braces. +% +% \end{enumerate} +% +% In practice, it might be possible to insert other tokens (such as +% macros) into names as long as they either (a)~are non-expandable +% or (b)~expand into a series of tokens of the above enumerated +% types. However, in such cases it will probably be safer to +% declare the macro in question as either a text accent or a text +% symbol. +% +% \subsubsection{Text accents} +% +% Syntactically, a text accent is a macro that takes a single, +% undelimited argument, i.e, it has a ``prototype'' of +% |macro:#1->|. Semantically, the implication is that it takes a +% letter (the \emph{base}) as an argument and produces a glyph that +% for certain purposes can be considered equivalent to the +% base (see the discussion of stem comparison on +% page~\pageref{stem-comparison}).\footnote{Note that this is meant +% to be a pragmatic definition for the purposes of this package. +% No claim is made to greater generality.} +% +% \begin{macro}{\amsrefs@textaccents} +% This will contain a list of accent commands in standard \LaTeX\ +% format (i.e., separated by the token \cs{do}). For example, +% after registering the \cn{"} and \cn{'} accents, it will contain +% \begin{verbatim} +% \do \"\do \' +%\end{verbatim} +% \begin{macrocode} +\let\amsrefs@textaccents\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareNameAccent} +% \MacroArgs +% \macroarg{1}{accent} +% \begin{macrocode} +\def\DeclareNameAccent{% + \@lappend\amsrefs@textaccents +} +% \end{macrocode} +% \end{macro} +% +% Here are all the standard \LaTeX\ accents, as well as a few +% nonstandard accents from the \pkg{mathscinet} package. +% \begin{macrocode} +\DeclareNameAccent\" +\DeclareNameAccent\' +\DeclareNameAccent\. +\DeclareNameAccent\= +\DeclareNameAccent\^ +\DeclareNameAccent\` +\DeclareNameAccent\~% +\DeclareNameAccent\b +\DeclareNameAccent\c +\DeclareNameAccent\d +\DeclareNameAccent\H +\DeclareNameAccent\k +\DeclareNameAccent\r +\DeclareNameAccent\t +\DeclareNameAccent\u +\DeclareNameAccent\v +% \end{macrocode} +% From \pkg{mathscinet}: +% \begin{macrocode} +\DeclareNameAccent\utilde +\DeclareNameAccent\uarc +\DeclareNameAccent\dudot +\DeclareNameAccent\lfhook +\DeclareNameAccent\udot +\DeclareNameAccent\polhk +\DeclareNameAccent\soft +% \end{macrocode} +% \cn{etalchar} and \cn{etaltext} are sort of accent-like if you +% look at them in the right light. +% \begin{macrocode} +\DeclareNameAccent\etalchar +%\DeclareNameAccent\etaltext +% \end{macrocode} +% +% \subsubsection{Text symbols} +% +% Syntactically, a text symbol is a macro with a empty parameter +% text, i.e., a prototype of |macro:->|. Semantically, it's a +% letter-like glyph that should not be considered equivalent +% to any other glyph or group of glyphs. In addition, it may exist +% in both upper- and lowercase variants, unlike text accents, where +% we consider the case to be an attribute of the base letter, not +% of the accent.\footnote{As with text accents, this is not +% intended as a fully general definition.} +% +% \begin{macro}{\amsrefs@textsymbols} +% This is analogous to \cs{amsrefs@textaccents} but a little more +% complicated due to the need to store lowercase equivalents. It +% consists of a list of double entries of the form +% \begin{verbatim} +% \do \symbol \do \lcsymbol +%\end{verbatim} +% which means that \cs{symbol} is a text symbol whose corresponding +% lowercase version is \cs{lcsymbol}. (Note that nothing is +% implied about whether \cs{symbol} is to be considered as +% uppercase or lowercase.) For example, in +% \begin{verbatim} +% \do \ae \do \ae \do \OE \do \oe +%\end{verbatim} +% the first four tokens indicate that \cn{ae} is a text symbol with +% lowercase equivalent \cn{ae}, while the last four tokens indicate +% that \cn{OE} is a text symbol with lowercase equivalent \cn{oe}. +% This scheme is somewhat redundant, but pleasingly simple. +% +% This also duplicates some of the information in \cs{@uclclist}, +% but it seems safer to do this than to modify \cs{@uclclist}. +% \begin{macrocode} +\let\amsrefs@textsymbols\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareNameSymbol} +% \MacroArgs +% \macroarg{1}{symbol} +% \macroarg{2}{lowercase} +% \begin{macrocode} +\def\DeclareNameSymbol#1#2{% + \@lappend\amsrefs@textsymbols#1% + \@lappend\amsrefs@textsymbols#2% + \ifx#1#2\else + \@lappend\amsrefs@textsymbols#2% + \@lappend\amsrefs@textsymbols#2% + \fi +} +% \end{macrocode} +% \end{macro} +% +% Here are the standard \LaTeX\ and \pkg{mathscinet} text +% symbols. +% +% \label{anomalies} +% Note that \cn{i} and \cn{j} are anomalous in being syntactically +% like text symbols, but semantically more like text accents. +% \begin{macrocode} +\DeclareNameSymbol\i\i +\DeclareNameSymbol\j\j +\DeclareNameSymbol\AE\ae +\DeclareNameSymbol\OE\oe +\DeclareNameSymbol\O\o +\DeclareNameSymbol\DH\dh +\DeclareNameSymbol\DJ\dj +\DeclareNameSymbol\L\l +\DeclareNameSymbol\NG\ng +\DeclareNameSymbol\SS\ss +\DeclareNameSymbol\TH\th +% \end{macrocode} +% From \pkg{mathscinet}: +% \begin{macrocode} +\DeclareNameSymbol\Dbar\dbar +\DeclareNameSymbol\lasp\lasp +\DeclareNameSymbol\rasp\rasp +\DeclareNameSymbol\cprime\cprime +\DeclareNameSymbol\cdprime\cdprime +\DeclareNameSymbol\bud\bud +\DeclareNameSymbol\cydot\cydot +% \end{macrocode} +% |~| can be considered a text symbol in much the same way that +% \cn{etalchar} can be considered an accent. +% \begin{macrocode} +\DeclareNameSymbol~~% +% \end{macrocode} +% +% \subsubsection{\cs{edef}-like macros for names} +% The following macros all behave sort of like \cs{edef}, in the +% sense that +% \begin{verbatim} +% \X@edef\foo{name} +%\end{verbatim} +% defines \cs{foo} to be the result of expanding |name| and +% applying a certain transformation to it. +% +% \begin{macro}{\normalize@edef} +% This converts accents in the name to a normalized form where the +% accent and its argument are surrounded by braces. E.g., after +% \begin{verbatim} +% \normalize@edef\cs{P\'olya} +%\end{verbatim} +% \cs{cs} will contain |P{\'o}lya|. (This might result in a +% redundant layer of braces if the original text contained, say, +% ``\verb+P{\'o}lya+'', but that's ok.) This lets us extract the +% first $n$ characters from a name by using \TeX's macro +% argument-gobbling mechanism without worrying that an accent +% will be separated from its base letter. +% As a bonus, it also replaces ties (|~|) by spaces. +% \begin{macrocode} +\def\normalize@edef#1#2{% + \begingroup + \@apply\auto@protect\amsrefs@textsymbols + \@apply\wrap@accent\amsrefs@textaccents +% \end{macrocode} +% Redefine \cs{@tabacckludge} in case someone wants to use this +% with the \pkg{inputenc} package. +% \begin{macrocode} + \let\@tabacckludge\use@accent + \let~\space + \edef\@tempa{\def\@nx#1{#2}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\use@accent} +% This is identical to \cs{@nameuse} except for the addition of the +% \cs{string}, which, as per \fn{ltoutenc.dtx}, guards against the +% eventuality that something like |'| might be active at the point +% of use. We don't expect to find a \cs{bib} in the middle of a +% \env{tabbing} environment (do we?)\ so we +% \begin{macrocode} +\def\use@accent#1{\csname\string#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\wrap@accent} +% Here's a wrapper macro that causes an accent to become +% auto-wrapping. E.g., after \verb+\wrap@accent\'+, \verb+\'o+ +% will expand to \verb+{\'o}+. +% \begin{macrocode} +\def\wrap@accent#1{% + \def#1##1{{\@nx#1##1}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lc@edef} +% This converts all the characters in a name to all lowercase, +% using the mapping defined by \cs{amsrefs@textsymbols}. So, after +% \begin{verbatim} +% \lc@edef\cs{P\'olya} +%\end{verbatim} +% \cs{cs} will contain |p\'olya|. Note that accents are not +% wrapped and ties are passed through unmolested. +% \begin{macrocode} +\def\lc@edef#1#2{% + \begingroup + \let\@tabacckludge\use@accent %%?? + \@apply\auto@protect\amsrefs@textaccents + \@apply\lc@do\amsrefs@textsymbols + \edef\@tempa{\lowercase{\def\@nx#1{#2}}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lc@do} +% This is a slighly more complicated wrapper macro than previous +% ones. +% The first argument is a text symbol; the second argument is the +% lowercase variant of the symbol. If they're the same (i.e., the +% first argument is a lowercase text symbol), we \cs{auto@protect} +% it. Otherwise we define the first symbol to expand to the +% second. +% \begin{macrocode} +\def\lc@do#1\do#2{% + \ifx#1#2% + \auto@protect#1% + \else + \def#1{#2}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\purge@edef} +% Removes accents and braces from a name and converts ties to +% spaces, leaving only letters, punctuation and text symbols. For +% example, +% \begin{verbatim} +% \lc@edef\cs{P{\'o}lya} +%\end{verbatim} +% will put |Polya| in~\cs{cs}. +% \begin{macrocode} +\def\purge@edef#1#2{% + \begingroup + \@apply\auto@protect\amsrefs@textsymbols + \let~\space + \@apply\purge@accent\amsrefs@textaccents + \let\@tabacckludge\@gobble +% \end{macrocode} +% As mentioned above (page~\pageref{anomalies}), \cn{i} and \cn{j} +% are semantically like text accents; hence, they require special +% treatment here. +% \begin{macrocode} + \def\i{i}% + \def\j{j}% + \edef\@tempa{#2}% + \toks@\@emptytoks + \@xp\purge@edef@ \@tempa \@nil + \edef\@tempa{\def\@nx#1{\the\toks@}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\purge@edef@} +% Peek ahead so \cs{purge@edef@a} will know whether its argument +% was originally surrounded by braces. +% \begin{macrocode} +\def\purge@edef@{% + \futurelet\@let@token + \purge@edef@a +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\purge@edef@a} +% Process a single ``chunk'' (i.e., one macro-argument's worth) of +% the name. +% \begin{macrocode} +\def\purge@edef@a#1{% +% \end{macrocode} +% If we've run into the \cs{@nil} terminator, we're done. +% \begin{macrocode} + \ifx\@let@token\@nil + \let\@tempa\@empty + \else +% \end{macrocode} +% Otherwise, if the argument was originally surrounded by braces, +% process it recursively before processing the remainder of the +% token stream. +% \begin{macrocode} + \ifx\@let@token\bgroup + \def\@tempa{% + \purge@edef@ #1\@nil + \purge@edef@ + }% + \else +% \end{macrocode} +% If the argument is a single unbracketed token, just copy it into +% the output. +% \begin{macrocode} + \add@toks@{#1}% + \let\@tempa\purge@edef@ + \fi + \fi + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\purge@accent} +% This is similar to \cs{wrap@accent} but it removes the accent +% command (and possibly a layer of braces surrounding the accent's +% argument). +% \begin{macrocode} +\def\purge@accent#1{% + \def#1##1{##1}% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Name parsing} +% +% Parsing names is somewhat complicated because parts of the name +% can (in principle) be empty (G=given, S=surname, J=jr)): +% \begin{quote} +% \nametest{Doe, John, Jr.} +% \nametest{Doe, John} +% \nametest{Doe, , Jr.} +% \nametest{Doe} +% \nametest{, John, Jr.} +% \nametest{, John} +% \nametest{, , Jr.} +% \nametest{} +% \end{quote} +% Not all of these forms are legal, of course, but that's no excuse +% for not parsing them correctly. +% +% We also want to be somewhat lenient about the placement of +% spaces: +% \begin{quote} +% \nametest{ Doe,John,Jr.} +% \end{quote} +% +% However, because one must have some standards, we assume there +% are no spaces in the following positions in the input: +% \begin{enumerate} +% \item before periods, +% +% \item before commas, +% +% \item at the end of the name, +% +% \item before or after hyphens. +% \end{enumerate} +% +% Thus, we make no attempt to compensate for the misplaced spaces +% in examples like these: +% \begin{quote} +% \nametest{Doe , J ., Jr. } +% \nametest{Doe, J. - M.} +% \end{quote} +% +% Also, unless we are generating initials, we don't try to +% normalize spaces \emph{after} periods: +% \begin{quote} +% \nametest{Doe, J.M.}\\ (not G=\embrace{J. M.}) +% \end{quote} +% +% Finally, since we allow authors to group together characters that +% should be treated as a single unit, we need to be careful to +% preserve the author's markup in cases like these: +% +% \begin{quote} +% \nametest{Doe, {Yu}ri} +% \nametest{Doe, {Yu}} +% \end{quote} +% +% This is harder than it seems. For example, consider a naive +% implementation that uses delimited arguments to pull the name +% apart: +% \begin{verbatim} +% \def\parsename#1,#2\@nil{% +% \def\bib'surname{#1}% +% \def\bib'given{#2}% +% } +% +% \parsename Doe, {Yu}ri\@nil +%\end{verbatim} +% Unfortunately, this results in the space after the comma +% becoming part of \cs{bib'given}: ``\verb+ {Yu}ri+''. +% +% Our next thought would be to modify the definition slightly to +% trick \TeX\ into gobbling the space: +% \begin{verbatim} +% \def\parsename#1,#2#3\@nil{% +% \def\bib'surname{#1}% +% \def\bib'given{#2#3}% +% } +%\end{verbatim} +% Now the space is gone, but---surprise!---so are the braces: +% ``\verb+Yuri+''. In addition, this approach makes it difficult +% to handle empty name parts correctly. +% +% To sidestep these problems, instead of blindly gobbling macro +% arguments, we use \cs{futurelet} to look ahead at certain +% strategic moments so we can take the appropriate action (see +% \cs{get@namepart@d}--|f|). We only really care about preserving +% braces at the start of names (page~\pageref{initial-braces}), +% which simplifies things somewhat.\label{brace-preservation} +% +% \begin{macro}{\name@split} +% \cs{name@split} parses a name into its three parts and stores +% them in \cs{bib'surname}, \cs{bib'given} and \cs{bib'jr}. If the +% \opt{initials} option is in force, it also extracts the initials +% from the given name and stores them in \cs{bib'initials}. +% +% It expects the name to be parsed to be terminated by \cs{@nil} +% and to contain at least three commas. Thus the usual way to +% invoke it is +% \begin{quote} +% \cs{name@split} $\langle\mathit{name}\rangle$\verb+,,,\@nil+ +% \end{quote} +% +% \cs{name@split} just uses \cs{get@namepart} to peal off the +% surname and then passes control to \cs{name@split@given}. +% (Note the spiffy continuation-passing programming style.) +% \begin{macrocode} +\def\name@split{% + \get@namepart\bib'surname\name@split@given +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\name@split@given} +% Pretty much the same, \em{mutatis mutandis}\ldots +% \begin{macrocode} +\def\name@split@given{% + \get@namepart\bib'given\name@split@jr +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\name@split@jr} +% And again\ldots +% \begin{macrocode} +\def\name@split@jr{% + \get@namepart\bib'jr\name@split@finish +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\name@split@finish} +% We have all three parts now. Do some consistency checking, +% extract the initials from the given name, and then call +% \cs{@nilgobble} to remove anything (such as extra commas) left on +% the stack. +% \begin{macrocode} +\def\name@split@finish{% + \ifx\bib'surname\@empty \EmptyNameWarning \fi +% \end{macrocode} +% Theoretically, we could try to check for uninverted names here, +% but only at the risk of producing spurious warnings when the name +% really does only have one part (\verb+author={Arvind}+). +% +% A possible solution: Now that we have the +% \attr{inverted} attribute, we could issue a warning if the given +% name is empty and the family name contains a space. I'm sure +% someone could find valid input that would still generate a +% spurious warning, but this would take care of the most common +% cases. This bears more thinking about. +% \begin{macrocode} +%% \ifx\@empty\bib'given +%% \NameCheck \bib'surname ??\@nil +%% \else + \extract@initials\bib'given +%% \fi + \@nilgobble +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@namepart} +% Now for the fun part. \cs{get@namepart} takes two arguments. +% The first (the destination) should be a control sequence; the +% second (the continuation) will normally also be a control +% sequence, though technically we only require that it be a single +% token. \cs{get@namepart} scans everything up to the next level-0 +% comma, places it in the destination, and then calls the +% continuation. +% \begin{macrocode} +\def\get@namepart#1#2{% +% \end{macrocode} +% Save the destination in \cs{toks@} and the continuation in +% \cs{@temptokena}. It's unfortunate that this trashes the +% previous contents of those token lists (as well as the contents +% of \cs{@tempa} later on), but preliminary attempts to rewrite the +% code to leave the calling environment unchanged were not +% encouraging. +% \begin{macrocode} + \toks@{#1}% + \@temptokena{#2}% + \get@namepart@a +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@namepart@a} +% Now peek ahead at the next token in the stream and call +% \cs{get@namepart@b} to examine it. +% \begin{macrocode} +\def\get@namepart@a{% + \futurelet\@let@token + \get@namepart@b +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@namepart@b} +% If the next token is a space token, we want to delete it. +% Otherwise we're ready to read the name. +% \begin{macrocode} +\def\get@namepart@b{% + \ifx\@let@token\@sptoken + \@xp\get@namepart@c + \else + \@xp\get@namepart@d + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@namepart@c} +% The next token is a space; we delete it and restart +% \cs{get@namepart@a}, in case there are multiple spaces. +% \begin{macrocode} +\def\get@namepart@c{% + \after@deleting@token\get@namepart@a +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@namepart@d} +% We're at the beginning of the name part. However, there are +% still two special cases we have to watch out for. First, the +% next token might be a comma, meaning that this name part is +% empty. Second, the next token might be an open brace (\verb+{+), +% which we have to be sure to copy into the destination. So, we +% peek ahead again before proceeding. +% \begin{macrocode} +\def\get@namepart@d{% + \futurelet\@let@token + \get@namepart@e +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@namepart@e} +% If the next token is a comma, it means the name part is empty; +% so, we set the destination to an empty list and then arrange to +% execute the continuation after deleting the comma. Otherwise we +% call \cs{get@namepart@f} to read a non-empty name, leaving +% \cs{@let@token} undisturbed so that \cs{get@namepart@f} knows +% what's coming up. +% \begin{macrocode} +\def\get@namepart@e{% + \ifx\@let@token,% + \@xp\let\the\toks@\@empty + \edef\@tempa{% + \@nx\after@deleting@token\the\@temptokena + }% + \@xp\@tempa + \else + \@xp\get@namepart@f + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@namepart@f} +% We know whether or not the name begins with a brace, but we don't +% know if the corresponding group contains the entire name or only +% part of it. By reading the name as two arguments, we can handle +% all cases correctly.\footnote{More or less. If the second +% argument is brace-delimited, the braces will be lost. But as +% mentioned above (page~\pageref{brace-preservation}), we don't +% really care.} +% +% Note that the arguments are not expanded. +% \begin{macrocode} +\def\get@namepart@f#1#2,{% + \ifx\@let@token\bgroup + \@xp\def\the\toks@{{#1}#2}% + \else + \@xp\def\the\toks@{#1#2}% + \fi + \the\@temptokena +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\EmptyNameWarning} +% Or translator or contributor or\ldots +% \begin{macrocode} +\def\EmptyNameWarning{\amsrefs@warning{Empty contributor name}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Extracting initials} +% +% Extracting initials from the author's given name is tricky +% because of the numerous special cases that need to be +% handled. Consider the following examples, some of which are +% admittedly contrived: +% \begin{quote} +% \initialtest{Arvind} +% \initialtest{Bing, R H} +% \initialtest{Harish, \'Etienne} +% \initialtest{Harish, \'E.} +% \initialtest{Harish, \'{E}.} +% \initialtest{Harish, {\'E}.} +% \initialtest{Harish, \'E} +% \initialtest{Harish, \'Etienne-P\^{\i}erre} +% \initialtest{Jones, David} +% \initialtest{Jones, David-Michael} +% \initialtest{Katzenbach, Nicholas {deB}elleville} +% \initialtest{Katzenbach, Nicholas deB.} +% \initialtest{Matiyasevich, {Yu}ri} +% \initialtest{Matiyasevich, {Yu}} +% \initialtest{Matiyasevich, Yu.} +% \end{quote} +% When processing initials, we loosen our strictures on spaces +% inside the given name by not requiring spaces after periods and +% tolerating them around hyphens and after the name: +% \begin{quote} +% \initialtest{Jones, D.M.} +% \initialtest{Jones, David - Michael} +% \initialtest{Jones, David , Jr.} +% \end{quote} +% (Strictly speaking, only the support for the first of these +% examples was a deliberate design decision; the other two are +% side-effects of the implementation. In any case, toleration of +% these quirks is in no way an endorsement of them, especially +% since they may make it more difficult for third-party software to +% correctly process bibliography entries.) +% +%^^A We also make one additional assumption: a hyphen does not occur +%^^A as the last character in the name. +% +% \subsubsection{The algorithm} +% +% As a running example, consider the following contrived input: +% \begin{quote} +% {\tt \verb+\'E.-P\^{\i}erre J.K. M+} +% \end{quote} +% which we want to turn into {\makeatletter``{\'E}.~\ini@hyphen +% P.~J.~K.~M''}. +% +% We precede by stages. +% \begin{enumerate} +% +% \item +% Normalize the name by surrounding accents and their arguments by +% braces: +% \begin{quote} +% \verb+{\'E}.-P{\^\i }erre J.K. M+ +% \end{quote} +% We also replace \verb+~+s by spaces at this stage. +% +% \item +% Replace each hyphen (\verb+-+) by ``\verb*+ \ini@hyphen +'': +% \begin{quote} +% \verb+{\'E}. \ini@hyphen P{\^\i }erre J.K. M+ +% \end{quote} +% +% \item +% Add a space after each period: +% \begin{quote} +% \verb+{\'E}. \ini@hyphen P{\^\i }erre J. K. M+ +% \end{quote} +% +% \item +% Now we have the name as a list of space-separated components. +% (In our example, the components are ``\verb+{\'E}.+'', +% ``\verb+\ini@hyphen+'', ``\verb+P{\^\i }erre+'', ``\verb+J.+'', +% ``\verb+K.+'', and ``\verb+M+''.) We loop through the compoments +% and replace each one by its ``initialized'' form. There are +% four cases:\label{initial_cases} +% \begin{enumerate} +% +% \item +% The component ends in a period. Copy it and add the token +% \verb+~+. (In our example, these are the +% components ``\verb+{\'E}.+'', ``\verb+J.+'' and ``\verb+K.+''.) +% +% \item +% The component consists of a single (possibly compound) character +% without a period. Again, copy it and add +% \verb+~+. (In our example, this is the component +% ``\verb+M+''.) +% +% \item +% The component is the token \verb+\ini@hyphen+. Copy it. +% +% \item +% The component consts of two or more (possibly compound) +% characters without a period (e.g., ``\verb+P{\^\i }erre+''). +% Copy the first character and add the tokens \verb+.~+. +% \end{enumerate} +% +% \item +% The token list generated above will end with an unwanted |~|. +% Delete it. +% +% \end{enumerate} +% +% The end result is +% \begin{verbatim} +% {\'E}.~\ini@hyphen P.~J.~K.~M +%\end{verbatim} +% which, when typeset, does indeed produce +% {\makeatletter''{\'E}.~\ini@hyphen P.~J.~K.~M''}.\footnote{Tying +% all the characters together is potentially undesirable when, as +% in the example, there are a large number of pieces in the given +% name.} +% +% \subsubsection{The implementation} +% +% \begin{macro}{\extract@initials} +% This is pretty straightforward. +% \begin{macrocode} +\def\extract@initials#1{% + \begingroup + \auto@protect\ini@hyphen + \auto@protect\nobreakspace + \let~\relax + \@apply\auto@protect\amsrefs@textsymbols + \@apply\auto@protect\amsrefs@textaccents + \normalize@edef\@tempa{#1}% + \ifx\@tempa\@empty + \else +% \end{macrocode} +% It would be nice if \cs{process@hyphens} and \cs{process@dots} +% commuted, and they almost do. However, suppose you have the +% (admittedly contrived) name |Yu.-{Yu}|, which should be turned +% into ``Yu.-Yu''. If \cs{process@dots} is applied first, the +% braces around the second ``Yu'' get removed, so the output is +% ``Yu.-Y.''. (Even worse would be |P.-\'E|, which would produce +% ``P.-\'.'') +% \begin{macrocode} + \process@hyphens\@tempa + \process@dots\@tempa + \process@names\@tempa + \@chomp\@tempa{~}% + \fi + \edef\@tempa{\def\@nx\bib'initials{\@tempa}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ini@hyphen} +% The \cs{unskip} removes the space at the end of a potential (and +% probable) preceding |~|, but leaves the \cs{nobreak} penalty. +% \begin{macrocode} +\def\ini@hyphen{\unskip-\nobreak} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@hyphens} +% This follows the same general pattern as \cs{get@namepart}, but +% with an extra layer of grouping to avoid unwanted side-effects. +% Otherwise, it uses the same parsing techniques. +% +% One difference is that there is no explicit continuation: +% instead, we iterate by repeatedly calling +% \cs{process@one@hyphen@d} until we run into the \cs{@nil} +% marker. +% \begin{macrocode} +\def\process@hyphens#1{% + \begingroup + \toks@\@emptytoks + \@xp\process@one@hyphen #1-\@nil + \edef\@tempa{\the\toks@}% +% \end{macrocode} +% Because of the |-| we have to stick in as a delimiter above, +% \cs{process@one@hyphen} will always generate unwanted code at the +% end of the name. We now delete it. (This also has the necessary +% side-effect of expanding the \cs{space} macros into space +% characters.) +% \begin{macrocode} + \@chomp\@tempa{ \ini@hyphen\space}% + \edef\@tempa{\def\@nx#1{\@tempa}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@hyphen} +% Cf.\ \cs{get@namepart@a}. +% \begin{macrocode} +\def\process@one@hyphen{% + \futurelet\@let@token + \process@one@hyphen@a +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@hyphen@a} +% Cf.\ \cs{get@namepart@b} and \cs{extract@initial@a}. +% +% The tests for \cs{@nil} and~|-| here are purely to supply better +% error recovery. Without them, a hyphen at the end of the given +% name (.e.g, |author={Doe, John-}|) would produce a very +% mysterious error message. Since it's unlikely the hyphen really +% belongs there, we delete it, but we also issue a warning to the +% author. (It will still show up as part of the full given name, +% though.) +% +% We borrow \cs{fsa@n} from \pkg{rkeyval} to keep track of the +% appropriate next action. +% \begin{macrocode} +\def\process@one@hyphen@a{% + \ifx\@let@token\@nil + \let\fsa@n\@gobble + \else + \ifx\@let@token -% + \TrailingHyphenWarning + \let\fsa@n\process@one@hyphen@b + \else + \ifx\@let@token\@sptoken + \let\fsa@n\process@one@hyphen@b + \else + \let\fsa@n\process@one@hyphen@c + \fi + \fi + \fi + \fsa@n +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@hyphen@b} +% Cf.\ \cs{get@namepart@c}. +% \begin{macrocode} +\def\process@one@hyphen@b{% + \after@deleting@token\process@one@hyphen +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@hyphen@c} +% Cf.\ \cs{get@namepart@f}. +% \begin{macrocode} +\def\process@one@hyphen@c#1#2-{% + \ifx\bgroup\@let@token + \add@toks@{{#1}#2 \ini@hyphen\space}% + \else + \add@toks@{#1#2 \ini@hyphen\space}% + \fi + \futurelet\@let@token + \process@one@hyphen@d +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@hyphen@d} +% Here we just check for \cs{@nil} and terminate if we detect it. +% Otherwise, we start over. +% \begin{macrocode} +\def\process@one@hyphen@d{% + \ifx\@let@token\@nil + \@xp\@gobble + \else + \@xp\process@one@hyphen + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TrailingHyphenWarning} +% Or translator or contributor or\ldots +% \begin{macrocode} +\def\TrailingHyphenWarning{% + \amsrefs@warning{Trailing hyphen deleted from name}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@dots} +% This is almost completely parallel to \cs{process@hyphens}. +% \begin{macrocode} +\def\process@dots#1{% + \begingroup + \toks@\@emptytoks + \@xp\process@one@dot #1.\@nil + \edef\@tempa{\the\toks@}% + \@chomp\@tempa{. }% +% \end{macrocode} +% Since it's legitimate for names to end in periods, we might +% still have an unwanted space at the end of the name, so we delete +% it too. +% \begin{macrocode} + \@chomp\@tempa{ }% + \edef\@tempa{\def\@nx#1{\@tempa}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@dot} +% \begin{macrocode} +\def\process@one@dot{% + \futurelet\@let@token + \process@one@dot@a +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@dot@a} +% This is a bit different from \cs{process@one@hyphen@a} since we +% expect names sometimes to end in a period---or even two +% periods---not least because of the |.| we add as a delimiter when +% invoking \cs{process@one@dot}. +% \begin{macrocode} +\def\process@one@dot@a{% + \ifx\@let@token .% + \def\fsa@n{\after@deleting@token\process@bare@dot}% + \else + \ifx\@let@token\@sptoken + \let\fsa@n\process@one@dot@b + \else + \let\fsa@n\process@one@dot@c + \fi + \fi + \fsa@n +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@bare@dot} +% \begin{macrocode} +\def\process@bare@dot{% + \add@toks@{. }% + \futurelet\@let@token + \process@one@dot@d +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@dot@b} +% \begin{macrocode} +\def\process@one@dot@b{% + \after@deleting@token\process@one@dot +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@dot@c} +% \begin{macrocode} +\def\process@one@dot@c#1#2.{% + \ifx\bgroup\@let@token + \add@toks@{{#1}#2. }% + \else + \add@toks@{#1#2. }% + \fi + \futurelet\@let@token + \process@one@dot@d +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@one@dot@d} +% \begin{macrocode} +\def\process@one@dot@d{% + \ifx\@let@token\@nil + \@xp\@gobble + \else + \@xp\process@one@dot + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@names} +% This is very similar to \cs{process@hyphens} and +% \cs{process@dots}, but with a couple of twists, as noted below. +% \begin{macrocode} +\def\process@names#1{% + \begingroup + \toks@\@emptytoks + \@xp\extract@initial #1 \@nil + \edef\@tempa{\def\@nx#1{\the\toks@}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extract@initial} +% Scan through the token stream replacing words by their initials +% until we hit the terminating~|'|$_{11}$ +% \begin{macrocode} +\def\extract@initial{% + \futurelet\@let@token + \extract@initial@a +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extract@initial@a} +% As with \cs{process@one@hyphen@a}, the test for |'|$_{11}$ here +% is purely to provide better recovery, this time in case the given +% name has a trailing space (.e.g, |author={Doe, John }|). +% But since we're just deleting whitespace, we don't bother issuing +% a warning. +% \begin{macrocode} +\def\extract@initial@a{% + \ifx\@let@token\@nil + \let\fsa@n\@gobble + \else + \ifx\@let@token\@sptoken + \let\fsa@n\extract@initial@b + \else + \let\fsa@n\extract@initial@c + \fi + \fi + \fsa@n +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extract@initial@b} +% \begin{macrocode} +\def\extract@initial@b{% + \after@deleting@token\extract@initial +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extract@initial@c} +% Here, instead of just copying the name, we extract its initials +% and copy those. +% \begin{macrocode} +\def\extract@initial@c#1#2 {% + \ifx\@let@token\bgroup +% \end{macrocode} +% Note that we double-brace the first argument to avoid having to +% test \cs{@let@token} again inside \cs{@extract@initial}. +% \begin{macrocode} + \@extract@initial {{#1}}#2\@nil + \else + \@extract@initial #1#2\@nil + \fi + \futurelet\@let@token + \extract@initial@d +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extract@initial@d} +% \begin{macrocode} +\def\extract@initial@d{% + \ifx\@let@token\@nil + \@xp\@gobble + \else + \@xp\extract@initial + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@extract@initial} +% This handles the four cases mentioned on +% page~\pageref{initial_cases}. +% \begin{macrocode} +\def\@extract@initial#1#2\@nil{% + \ifx\ini@hyphen#1% + \add@toks@{\ini@hyphen}% + \else + \in@{.\@nil}{#1#2\@nil}% Look for a period at the end of the name + \ifin@ + \add@toks@{#1#2~}% + \else + \count@chars\@tempcnta{#1#2}% + \ifnum\@tempcnta > \@ne + \add@toks@{#1.~}% + \else + \add@toks@{#1~}% + \fi + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\count@chars} +% This sets its first argument (which is assumed to be a count +% register) to the number of characters in the second argument. +% Compound characters are counted as a single character. +% \begin{macrocode} +\def\count@chars#1#2{% + \begingroup + \@tempcnta\z@ + \@count@chars#2\@nil + \edef\@tempb{#1=\the\@tempcnta\relax}% + \@xp\endgroup + \@tempb +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@count@chars} +% \begin{macrocode} +\def\@count@chars#1{% + \ifx #1\@nil + \else + \advance\@tempcnta\@ne + \@xp\@count@chars + \fi +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Generating alphabetic labels} +% +% \subsubsection{The algorithm} +% +% Like Gaul, an alphabetic label is divided into three parts. +% \begin{enumerate} +% +% \item The author part. In the simplest case, this is formed by +% extracting the first character of each word of each last name of +% each author. Thus, if there were two authors with last names +% ``Vaughan Williams'' and ``Tallis'', the author part would be +% ``VWT''. +% +% If there are more than four authors, only the first three names +% are used, and a superscript~``+'' is appended to represent the +% elided names. Similarly, if an author name is ``others'', +% it is replaced by a superscript~``+'' and any following author +% names (of which there shouldn't be any) are ignored. +% +% Finally, if there is only one author and the author's last name +% consists of a single word, the first three characters of that +% name are used. +% +% \item The year part. If the \opt{y2k} option is in force, or if +% the year is less than~1901, the entire year is used. Otherwise +% the last two digits of the year are used.\footnote{Years with +% more than 4 digits are not currently handled correctly. +% \emph{Caveat lector}.} +% +% The combination of author part and year part will be referred to +% as the \emph{stem}. +% +% \item[3.] The suffix. If two or more items have the same stems, +% a suffix consisting of a lowercase latin letter will be appended +% to each label to make it unique. +% +% \end{enumerate} +% +% \label{stem-comparison} +% This third part is more subtle than it might first appear. +% First, case is ignored when comparing stems, so that, for +% example, ``Ahl1999'' and ``AHL1999'' are considered identical. +% Second, existing practice (in English, at least), is to ignore +% diacritics so that, for example, ``Ahl1999'' and ``\"Ahl1999'' +% are considered identical. +% +% Note that when checking for duplicate stems, we assume that +% bibliography items appear sorted by label, which means that all +% items with the same stem will be adjacent. This means we can use +% the naive algorithm (check to see if the current item has the +% same stem as the previous item and, if so, append a suffix) to +% detect clashes. This sorting will be done automatically by +% \bst{amsxport}, but the document author is responsible for +% ensuring the appropriate order if \bst{amsxport} is not used. +% This is why it's an error to mix the \opt{alphabetic} and +% \opt{citation-order} options. +% +% \subsubsection{The implementation} +% +% \begin{macrocode} +\let\previous@stem\@empty +\let\current@stem\@empty +% \end{macrocode} +% +% \begin{macrocode} +\let\previous@year\@empty +\let\current@year\@empty +% \end{macrocode} +% +% \begin{macro}{\append@to@stem} +% \begin{macrocode} +\def\append@to@stem{\global\@concat\current@stem} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\generate@alphalabel} +% \begin{macrocode} +\def\generate@alphalabel{% +% \end{macrocode} +% If the user supplied an explicit \fld{label} field, we use it. +% Otherwise, we generate our own. +% \begin{macrocode} + \ifx\bib'label\@empty + \begingroup +% \end{macrocode} +% We begin by saving the previous stem and initializing the +% current stem to the empty string. +% \begin{macrocode} + \global\let\previous@stem\current@stem + \global\let\current@stem\@empty +% \end{macrocode} +% The list of primary contributors is available to us in +% \cs{current@primary} in the form +% \begin{quote} +% \cnm{name}{$\mathrm{Last}_1, \mathrm{First}_1$}% +% \cnm{name}{$\mathrm{Last}_2, \mathrm{First}_2$} +% \ldots +% \cnm{name}{$\mathrm{Last}_n, \mathrm{First}_n$} +% \end{quote} +% We will be executing this list multiple times with various +% definitions of \cs{name}. So the first thing we want to do is +% establish a safe environment and normalize the names. +% \begin{macrocode} + \@apply\auto@protect\amsrefs@textsymbols + \@apply\auto@protect\amsrefs@textaccents + \auto@protect\name + \auto@protect\etaltext + \normalize@edef\@tempa\current@primary +% \end{macrocode} +% Now we count the number of authors in the list and invoke the +% appropriate macro to calculate the author part of the +% reference label. +% \begin{macrocode} + \get@numberof\@tempcnta\name\@tempa + \calc@author@part +% \end{macrocode} +% Next append the year part. +% \begin{macrocode} + \append@label@year +% \end{macrocode} +% At this point, the \cs{current@stem} is complete and we're ready +% to determine what (if any) suffix is needed to disambiguate +% it from the previous label. +% \begin{macrocode} + \calc@alpha@suffix +% \end{macrocode} +% We have all the pieces now. Arrange to end the current group and +% then define \cs{bib@label} in the enclosing group. (This keeps +% \cs{bib@label} from being defined outside the group started by +% \cs{bib@start}. This isn't strictly necessary, but it provides a +% bit of compartmentalization.) +% \begin{macrocode} + \edef\@tempa{% + \def\@nx\bib'label{% + \current@stem + \alpha@label@suffix + }% + }% + \@xp\endgroup + \@tempa + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\calc@author@part} +% \begin{macrocode} +\def\calc@author@part{% + \ifnum \@tempcnta = 1 + \@xp\@oneauthorlabel\@xp{\@tempa}% + \else + \@xp\@multiauthorlabel\@xp{\@tempa}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@firstone} +% This extracts the first character from a properly prepared author +% name (i.e., one in which accents are properly wrapped). +% \begin{macrocode} +\def\@firstone#1{\@car#1\@empty\@nil} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@firstthree} +% And this extracts the first three characters. +% \begin{macrocode} +\def\@firstthree#1{\@carcube#1\@empty\@empty\@empty\@nil} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nametoken} +% \begin{macrocode} +\let\@nametoken\@firstone +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\hyph@to@space} +% \begin{macrocode} +\def\hyph@to@space#1-{#1 \hyph@to@space} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@marknames} +% Since we have a~' with funny catcode already, let's use it (being +% able to easily put a space after the |'| makes things easier). +% \begin{macrocode} +\def\@marknames#1{% + \@ifnotempty{#1}{\surround@names#1 ' }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\surround@names} +% \begin{macrocode} +\def\surround@names#1 {% + \ifx '#1% + \else + \@nx\@nametoken{#1}% + \@xp\surround@names + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extract@surnames} +% \begin{macrocode} +\def\extract@surnames#1#2{% + \get@namepart\@tempb\@nilgobble #2,\@nil + \edef\@tempb{\@nx\@marknames{\@xp\hyph@to@space\@tempb\@gobble-}}% + \edef#1{\@tempb}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@oneauthorlabel} +% This is the easy case. +% \begin{macrocode} +\newcommand{\@oneauthorlabel}[1]{% + \def\name##1{% + \extract@surnames\@tempa{##1}% + \get@numberof\@tempcnta\@nametoken\@tempa + \ifnum \@tempcnta = 1 + \let\@nametoken\@firstthree + \fi + \append@to@stem{\@tempa}% + }% + #1% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@threeauthors} +% \begin{macrocode} +\def\@threeauthors\name#1\name#2\name#3#4\@empty{% + \name{#1}\name{#2}\name{#3}% + \append@to@stem{\etalchar{+}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@multiauthorlabel} +% \begin{macrocode} +\newcommand{\@multiauthorlabel}[1]{% + \def\name##1{% + \ifx\etaltext ##1% + \def\@tempa{\@nx\etalchar{+}}% + \let\name\@gobble + \else + \extract@surnames\@tempa{##1}% + \fi + \append@to@stem{\@tempa}% + }% + \ifnum \@tempcnta > 4 \@xp \@threeauthors \fi + #1\@empty +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\etalchar} +% \begin{macrocode} +\newcommand{\etalchar}[1]{$^{#1}$} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\year@short} +% For alphanumeric labels, we want to extract the last 2 digits of +% the year. Here's a way to do that, assuming a 4-digit year. +% \begin{macrocode} +\def\year@short#1#2#3#4\@nil{#3#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\append@label@year} +% \begin{macrocode} +\def\append@label@year{% + \safe@set\@tempcnta\bib@year + \edef\bib@citeyear{\the\@tempcnta}% + \append@to@stem{% + \ifx\bib@year\@empty + \else + \@xp\year@short \bib@citeyear \@nil + \fi + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\let\alpha@label@suffix\@empty + +\newcount\alpha@suffix +\alpha@suffix\@ne +\let\@suffix@format\@alph +% \end{macrocode} +% +% \begin{macro}{\calc@alpha@suffix} +% \begin{macrocode} +\def\calc@alpha@suffix{% + \@tempswafalse + \compare@stems\previous@stem\current@stem + \ifsame@stems +% \end{macrocode} +% Under the \opt{alphabetic} option, \cs{previous@year} and +% \cs{current@year} will always be the same (namely, both will be +% empty), but including the test allows this code to work with the +% \opt{author-year} option as well. +% \begin{macrocode} + \ifx\previous@year\current@year + \@tempswatrue + \fi + \fi + \if@tempswa + \global\advance\alpha@suffix\@ne + \edef\alpha@label@suffix{\@suffix@format\alpha@suffix}% + \ifnum\alpha@suffix=\tw@ + \immediate\write\@auxout{% + \string\ModifyBibLabel{\prev@citekey}% + }% + \fi + \else + \let\alpha@label@suffix\@empty + \global\alpha@suffix\@ne + \@xp\ifx \csname b@\current@citekey @suffix\endcsname \relax + \else + \edef\alpha@label@suffix{\@suffix@format\alpha@suffix}% + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifsame@stems} +% \begin{macrocode} +\newif\ifsame@stems +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\compare@stems} +% \begin{macrocode} +\def\compare@stems#1#2{% + \begingroup + \purge@edef\@tempa{#1}% + \purge@edef\@tempb{#2}% + \lc@edef\@tempa{\@tempa}% + \lc@edef\@tempb{\@tempb}% + \ifx\@tempa\@tempb + \def\@tempa{\same@stemstrue}% + \else + \def\@tempa{\same@stemsfalse}% + \fi + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ModifyBibLabel} +% \begin{macrocode} +\def\ModifyBibLabel#1{% + \global\@xp\let\csname b@#1@suffix\endcsname\@empty +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Generating short alphabetic labels} +% +% This style for alphabetic labels is somewhat simpler than the +% regular alphabetic style. The stem consists only of an author +% part without a year part. The author part is formed in the same +% way, except that even when there is only a single author with a +% one-word last name, only the first letter of the name is used, +% not the first three. Finally, the suffix used to disambiguate +% identical stems is numeric rather than alphabetic. +% +% See section~\ref{opt:shortalphabetic} on +% page~\pageref{opt:shortalphabetic} for the implementation. +% +% \subsection{Formatting series} +% +% The \cn{PrintSeries} command prints a list of objects in series +% form. The essential idea is to produce something like \qq{A, B, and +% C} when we are given three elements ``A'', ``B'', and ``C'', with +% suitable variations in the punctuation and other intervening +% material depending on the number of elements. +% +% More precisely, we can envision \cn{PrintSeries} being +% called as +% \begin{quote} +% |\PrintSeries{|$S$|}{|$i_1$|}{|$i_2$|}{|$i_3$|}{|$E$|}{\do{|$T_1$|}| \dots|\do{|$T_n$|}}| +%\end{quote} +% where $S$ and~$E$ are material to be interpolated before the +% start and after the end of the list, respectively, +% $i_1$, \dots, $i_3$ are material to be interpolated between the +% elements, and the final argument is a list of indeterminate +% length where each element consists of a macro and its +% argument. If there are exactly two elements, $i_1$ is inserted +% between them; otherwise, $i_2$ is inserted between each pair of +% items except for the last pair, where $i_3$ is inserted. Thus, +% \begin{center} +% \begin{tabular}{ll} +% $n$ & output \\ +% 1 & $S$ $T_1$ $E$ \\ +% 2 & $S$ $T_1$ $i_1$ $T_2$ $E$ \\ +% 3 & $S$ $T_1$ $i_2$ $T_2$ $i_3$ $T_3$ $E$ \\ +% 4 & $S$ $T_1$ $i_2$ $T_2$ $i_2$ $T_3$ $i_3$ $T_4$ $E$ +%^^A \\$>4$ & $S$ $T_1$ $i_2$ $T_2$ $i_2$ $T_3$ \dots $T_{n-1}$ $i_3$ $T_n$ $E$ +% \end{tabular} +% \end{center} +% and so forth. For example, a standard comma-separated list could +% be formatted by +% \begin{verbatim} +% \PrintSeries{}{ and }{, }{, and }{}{...} +%\end{verbatim} +% +% That is the simple case but in practice there are +% additional complications. What if user-supplied line breaks have to +% be supported at the boundaries between elements? What if in +% addition to adding material between elements we also want to apply +% some handy function to each element (e.g., \cn{textsc})? Even +% worse, what if we want the function to be different depending on +% the position of the element in the list? Indeed if this did not +% happen to be the case with the current application I would not have +% gone to the extra trouble of supporting it. But if it must be so, +% then the output that we need from a list |\do{A}\do{B}...| is +% \begin{verbatim} +% f0{A} +% f0{A} p1 i1 f1{B} +% f0{A} p2 i2 f2{B} p3 i3 f3{B} +%\end{verbatim} +% and so on, where +% \begin{itemize} +% \item $f_n$ is a macro taking one argument, +% \item $p_n$ is punctuation\mdash material that must precede a line +% break if one occurs at this boundary, +% \item $i_n$ other interpolated material, as before. +% \end{itemize} +% To reduce the number of distinct required objects we decree that +% each element will get braces wrapped around it as a matter of +% course; then it is possible for $f_1$, $f_2$, $f_3$ to be +% assimilated onto the tail end of $i_1$, $i_2$, $i_3$. Since we +% also have to specify the macro that delimits the elements +% of the list, we end up with the following rather formidable +% signature: +% \begin{quote}\raggedright +% |\PrintSeries{\m} {|$f_0$|}| +% |{|$p_1$|}{|$i_1 f_1$|}| |{|$p_2$|}{|$i_2 f_2$|}| +% |{|$p_3$|}{|$i_3 f_3$|}| +% \hspace*{2 em} |{|$S$|} {\m{|$T_1$|}|$\dots$|\m{|$T_n$|}} {|$E$|}| +%\end{quote} +% and our comma-separated list example becomes +% \begin{verbatim} +% \PrintSeries{\do}{} {}{ and } {,}{ } {,}{ and } {}{...}{} +%\end{verbatim} +% +% \begin{macro}{\series@index} +% First we define a dedicated count register to be used in tracking +% the ordinal number of the item currently being processed. +% \begin{macrocode} +\newcount\series@index +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintSeries} +% \begin{macrocode} +\def\PrintSeries#1#2#3#4#5#6#7#8{% + \begingroup + \def\series@add@a{#2}% + \def\series@add@b{\SwapBreak{#3}#4}% + \def\series@add@c{\SwapBreak{#5}#6}% + \def\series@add@d{\SwapBreak{#7}#8}% + \def\series@add@e{\SwapBreak{#7}}% + \PrintSeries@a{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrinteSeries@a} +% For \cs{PrintSeries@a} the first arg is the iterator function +% present in the list which is arg 3. Args 2 and 4 are extra material +% to be added before and after the list that may require the use of +% \cn{Plural} or \cn{SingularPlural}. +% \begin{macrocode} +\def\PrintSeries@a#1#2#3#4{% + \get@numberof\@tempcnta#1{#3}% + \chardef\series@total=\@tempcnta + \ifnum\series@total=\@ne + \let\SingularPlural\@firstoftwo + \else + \let\SingularPlural\@secondoftwo + \fi + \series@index=\z@ + \let#1\series@add + #2#3#4\relax + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\series@add} +% This is the inner function called by \cn{PrintSeries} that +% carefully distributes all the material stored previously in +% \cs{series@add@...} macros. +% +% Note that the handling of ``et al.''\ cases is somewhat +% hardcoded. This seemed preferable to adding yet another argument +% (or two!\@) to \cs{PrintSeries}. +% \begin{macrocode} +\def\series@add#1{% + \advance\series@index\@ne + \ifx\etaltext#1\relax + \ifnum\series@index=\tw@ + \def\@tempa{\space\SubEtal}% + \else + \def\@tempa{\series@add@e\space\SubEtal}% + \fi +% \end{macrocode} +% We assume there are fewer than 20,000 items in the list. +% \begin{macrocode} + \series@index\@MM + \else + \ifcase\series@index + \or +% \end{macrocode} +% Material before name 1: +% \begin{macrocode} + \let\@tempa\series@add@a + \or +% \end{macrocode} +% Material before name 2: +% \begin{macrocode} + \ifnum\series@total<\thr@@ + \let\@tempa\series@add@b + \else + \let\@tempa\series@add@c + \fi + \else +% \end{macrocode} +% Material before names 3, 4, 5,\dots +% \begin{macrocode} + \ifnum\series@index=\series@total + \let\@tempa\series@add@d + \else + \ifnum\series@index<\series@total + \let\@tempa\series@add@c + \else + \let\@tempa\@gobble + \fi + \fi + \fi + \fi + \@tempa{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SwapBreak} +% This takes a single argument, which should begin with a +% punctuation character, and conditionally appends it to the +% current horizontal list after removing any preceding whitespace. +% If there was also a penalty at the end of the hlist (presumed to +% be the result of a |\linebreak| at the end of a field value), it +% moves the penalty to \emph{after} the argument. +% +% \begin{bug} +% \cn{SwapBreak} interferes with \TeX's kerning mechanism. For +% example, consider a field value that ends with a~``y'' and that +% should have a comman automatically appended. \pkg{amsrefs} +% generates the equivalent of |y\SwapBreak{,}|, which results in +% ``y\SwapBreak{,}'' (no kern before the comma) rather than~``y,''. +% Unfortunately, fixing this would likely require a +% disproportionate effort. In cases where the lack of kerning is +% unacceptable, a workaround is to add the punctuation mark to the +% field value manually. For example, |title={...y,}| would +% generate the equivalent of |y,\SwapBreak{,}|, which in turn would +% produce ``y,\SwapBreak{,}'' since \cs{SwapBreak} is careful not +% to add duplicate punctuation. +% \end{bug} +% \begin{macrocode} +\def\SwapBreak#1{% + \relax\ifvmode\leavevmode\fi + \@tempcnta\@MM + \toks@{#1}% +% \end{macrocode} +% First, remove any preceding glue. (There usually shouldn't be +% any of this.) +% \begin{macrocode} + \unskip +% \end{macrocode} +% There might be also be kern, typically an italic correction left +% there by a previous \texttt{TextFontCommand} like \ncn{textit}. +% But don't remove the special 1\,sp kern used to mark the +% beginning of a bibliography entry. +% +% \begin{bug} +% Sometimes we want to keep the italic correction. +% \end{bug} +% \begin{macrocode} + \ifnum \lastkern>\@ne \unkern \fi +% \end{macrocode} +% And now look for a penalty and stash it in a safe place. +% \begin{macrocode} + \ifnum\lastpenalty=\z@ + \else + \@tempcnta\lastpenalty + \unpenalty + \fi +% \end{macrocode} +% Now we add the punctuation, \emph{unless} one of the following +% conditions is true: +% \begin{enumerate} +% +% \item +% The last item on the horizontal list was a kern of~1\,sp, +% indicating that we're at the very beginning of a bibliography +% item. +% +% \item +% The current space factor is equal to the \cs{sfcode} of the +% puncutation mark we are adding, meaning that the mark is already +% on the list. +% +% \item +% The current space factor is equal to the special value +% |\@nopunctsfcode|, meaning that |\nopunct| was specified. +% +% \end{enumerate} +% This relies on distinct punctuation marks having distinct space +% factors, as established by our definition of \cn{frenchspacing}. +% \begin{macrocode} + \edef\@tempa{% + \@nx\deferredquoteslogical + \ifnum\lastkern=\@ne + \else + \ifnum\spacefactor=\sfcode\@xp\@xp\@xp`\@xp\@car\string#1)\@nil + \else + \ifnum\spacefactor=\@nopunctsfcode + \else + \the\toks@ + \fi + \fi + \fi + \@nx\deferredquotes + \ifnum\@tempcnta=\@MM \else \penalty\number\@tempcnta\space \fi + \ifnum\lastkern=\@ne \ignorespaces \fi + }% + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Plural} +% \begin{macro}{\SingularPlural} +% \cn{Plural} takes one argument and prints it if there were two or +% more elements in the current list. So, to get \qq{editors} instead +% of \qq{editor} after printing a list of editor names, write +% \verb'editor\Plural{s}'. +% +% \cn{SingularPlural} takes two arguments and prints the first if +% there was only one element, otherwise prints the second arg. +% \begin{macrocode} +\newcommand{\SingularPlural}[2]{#1} +\newcommand{\Plural}{\SingularPlural{}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Formatting names and series of names}\label{name-style} +% +% Now that we have a general mechanism for formatting series, we +% can easily specialize to the common case of a comma-separated +% list of names. First we provide specifications for the three +% most common name formats. +% +% \begin{macro}{\setbib@nameLE} +% This sets a name in standard western uninverted order, e.g., +% ``John Doe Jr.'' (The ``LE'' stands for little-endian.) +% \begin{macrocode} +\BibSpec{nameLE}{ + +{}{}{given} + +{}{\IfEmptyBibField{given}{}{ }}{surname} + +{}{ }{jr} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setbib@nameBE} +% Big-endian order, as used for example in traditional Chinese, +% Japanese, Vietnamese, and Hungarian names: ``Doe John''. +% Big-endian formatting can be requested for name by setting the +% ``inverted'' property to ``yes.'' +% \begin{macrocode} +\BibSpec{nameBE}{ + +{}{}{surname} + +{}{ }{given} +% \end{macrocode} +% I don't know what should happen if there's a suffix, so I'm going +% to just leave it out for now (although I should probably issue a +% warning). I suspect that either (a)~it never comes up or (b)~if +% it does come up, there's no set standard for how it should be +% handled. +% \begin{macrocode} +% +{}{ }{jr} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setbib@nameinverted} +% Inverted western-style names: ``Doe, John, Jr.'' +% \begin{macrocode} +\BibSpec{nameinverted}{ + +{} {} {surname} + +{,}{ } {given} + +{,}{ } {jr} +} +% \end{macrocode} +% \end{macro} +% +% Incidentally, it would probably be cleaner if names had their +% own namespace like properties do, i.e., something like +% \begin{verbatim} +% \DefineSimpleKey{name}{given} +% \DefineSimpleKey{name}{initials} +% \DefineSimpleKey{name}{surname} +% \DefineSimpleKey{name}{jr} +%\end{verbatim} +% followed by +% \begin{verbatim} +% \NameSpec{nameLE}{...} +%\end{verbatim} +% or +% \begin{verbatim} +% \BibSpec[name]{nameLE}{...} +%\end{verbatim} +% But this seems a little extravagant at this stage, so I've +% decided to leave things as-is for now. +% +% \begin{macro}{\PrintNames} +% \cn{PrintNames} is a simplified interface to \cs{PrintSeries} that +% takes only the last three arguments: +% \begin{quote}\raggedright +% |\PrintNames {|$S$|} {|$E$|} {\name{|$T_1$|}|$\dots$|\name{|$T_n$|}}| +%\end{quote} +% The order of the last two arguments is reversed to make it +% moderately easier to use; cf.\ \cn{PrintEditorsA}, etc. +% +% The first name in a series is treated differently than the other +% names in the \opt{author-year} style, so we use a separate +% formatting macro for it. +% \begin{macrocode} +\newcommand{\PrintNames}{% + \@ifstar{\PrintNames@a\set@othername}{\PrintNames@a\set@firstname}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintNames@a} +% \begin{macrocode} +\newcommand{\PrintNames@a}[4]{% + \PrintSeries{\name} + {#1} + {}{ and \set@othername} + {,}{ \set@othername} + {,}{ and \set@othername} + {#2}{#4}{#3}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@firstname} +% By default, the first name is formatted in little-endian format. +% The \opt{author-year} option changes this to inverted order. +% \begin{macrocode} +\def\set@firstname#1{% + \set@name{#1}\setbib@nameLE +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@othername} +% The rest of the names are set in little-endian format by +% default. +% \begin{macrocode} +\def\set@othername#1{% + \set@name{#1}\setbib@nameLE +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@name} +% Parse the name into its components and then pass control to +% \cs{set@name@a}, which will decide what format to use for the +% name. +% \begin{macrocode} +\def\set@name#1{% + \name@split#1,,,\@nil + \set@name@a +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@namea} +% Use the requested format unless the |order| property has been set +% to ``inverted.'' +% \begin{macrocode} +\def\set@name@a#1{% + \begingroup + \get@current@properties + \select@auxlanguage + \def\@tempa{yes}% + \ifx\@tempa\prop'inverted + \setbib@nameBE + \else + #1% + \fi + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintPrimary} +% \begin{macrocode} +\def\PrintPrimary{% + \ifx\current@primary\@empty + \EmptyPrimaryWarning + \else + \print@primary\current@primary + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\EmptyPrimaryWarning} +% \begin{macrocode} +\def\EmptyPrimaryWarning{% + \amsrefs@warning{No authors, editors or translators}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintAuthors} +% The comparison of \cs{previous@primary} and \cs{current@primary} +% doesn't look at auxiliary properties (see also \cs{PrintEditorsA} +% and \cs{PrintTranslatorsA}). This is probably ok. +% \begin{macrocode} +\newcommand{\PrintAuthors}[1]{% + \ifx\previous@primary\current@primary + \sameauthors\@empty + \else + \def\current@bibfield{\bib'author}% + \PrintNames{}{}{#1}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sameauthors} +% \begin{macrocode} +\newcommand{\sameauthors}[1]{\bysame#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bysame} +% \begin{macrocode} +\def\bysame{% + \leavevmode\hbox to3em{\hrulefill}\thinspace + \kern\z@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintNameList} +% This just prints the names without any additional information. +% \begin{macrocode} +\newcommand{\PrintNameList}{\PrintNames{}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintEditorsC} +% \begin{macrocode} +\newcommand{\PrintEditorsC}[1]{% + \PrintNames{Edited by }{}{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintEditorsA} +% When we consider editor names we have to think about some further +% complications. First, for the case of a book where editor names are +% listed in place of author names, just copy the same style with a +% bit of added text at the end. +% \begin{macrocode} +\newcommand{\PrintEditorsA}[1]{% + \ifx\previous@primary\current@primary + \sameauthors{(ed\Plural{s}.)}% + \else + \def\current@bibfield{\bib'editor}% + \PrintNames{}{ (ed\Plural{s}.)}{#1}% + \fi + \erase@field\bib'editor +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintEditorsB} +% \begin{macrocode} +\newcommand{\PrintEditorsB}{% + \PrintNames*{(}{\SwapBreak{,}~ed\Plural{s}.)}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintContributions} +% \begin{macrocode} +\newcommand{\PrintContributions}[1]{% + \PrintSeries + {\fld@elt} + {\print@contribution} + {}{ and \print@contribution} + {,}{ \print@contribution} + {,}{ and \print@contribution}{}{#1}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@contribution} +% \begin{macrocode} +\newcommand{\print@contribution}[1]{% + \in@={#1}% + \ifin@ + \ifnum\series@index=\@ne with \fi + \RestrictedSetKeys{}{bib}{% + \bib@print@inner\setbib@contribution{\the\rsk@toks}% + }{#1}% + \else + #1% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\resolve@inner} +% \begin{macrocode} +\def\resolve@inner#1#2{% + \in@={#2}% + \ifin@ + \RestrictedSetKeys{}{bib}{#1{\the\rsk@toks}}{#2}% + \else + \@ifundefined{bi@#2}{% + \XRefWarning{#2}% + }{% + #1{\csname bi@#2\endcsname}% + }% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintConference} +% \begin{macrocode} +\def\PrintConference{% + \resolve@inner{\bib@print@inner\setbib@conference} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintConferenceDetails} +% \begin{macrocode} +\def\PrintConferenceDetails#1{% + \ifx\@empty\bib'address + \ifx\@empty\bib'date + \else + \PrintConferenceDetails@ + \fi + \else + \PrintConferenceDetails@ + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintConferenceDetails@} +% \begin{macrocode} +\def\PrintConferenceDetails@{% + \ifnum\lastkern=\@ne\else\space\fi(\kern 1sp + \ifx\@empty\bib'address + \else + \bib'address + \fi + \ifx\@empty\bib'date + \else + \SwapBreak{,}\space + \print@date + \fi + )%\spacefactor\sfcode`\,% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintBook} +% \begin{macrocode} +\def\PrintBook{% + \resolve@inner{\bib@print@inner\setbib@innerbook} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintReprint} +% \begin{macrocode} +\def\PrintReprint{% + \resolve@inner{\bib@reprint} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@reprint} +% \begin{macrocode} +\def\bib@reprint#1{% + \begingroup + #1\relax % execute definitions locally + \bib@field@patches + \bib'setup + \IfEmptyBibField{copula}{reprinted in}{\bib'copula} \nopunct + \let\bib'language\@empty + \setbib@book + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintTranslation} +% \begin{macrocode} +\def\PrintTranslation{% + \resolve@inner{\bib@translation} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@translation} +% \begin{macrocode} +\def\bib@translation#1{% + \begingroup + #1\relax % execute definitions locally + \bib@field@patches + \bib'setup + \let\PrintPrimary\@empty + \bib@append{;}{ % keep this space! + \IfEmptyBibField{language}{English}{\bib'language} transl.% + \IfEmptyBibField{pages}{ in \kern\@ne sp}{, }% + }\bib'transition + \let\bib'language\@empty + \setbib@@ + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintTranslatorsC} +% \begin{macrocode} +\newcommand{\PrintTranslatorsC}[1]{% + \PrintNames{translated by }{}{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintTranslatorsA} +% \begin{macrocode} +\newcommand{\PrintTranslatorsA}[1]{% + \ifx\previous@primary\current@primary + \sameauthors{(trans.)}% + \else + \def\current@bibfield{\bib'translator}% + \PrintNames{}{ (trans.)}{#1}% + \fi + \erase@field\bib'translator +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintTranslatorsB} +% \begin{macrocode} +\newcommand{\PrintTranslatorsB}[1]{ + \PrintNames*{(}{\SwapBreak{,}~tran\Plural{s}.)}% +} +% \end{macrocode} +% \end{macro} +% +% Some special handling for ``et alii'' or ``and others''. +% \begin{macrocode} +\DefineName{alii}{\etaltext} +\DefineName{others}{\etaltext} +% \end{macrocode} +% +% \begin{macro}{\etaltext} +% \begin{macro}{\SubEtal} +% The Chicago Manual of Style suggests that it is slightly better not +% to italicize `et al' and some other extremely common abbreviations +% inherited from Latin. (Compare `etc'.) +% \begin{macrocode} +\newcommand{\etaltext}{et al.} +\newcommand{\SubEtal}[1]{\etaltext} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{The \fld{partial} field} +% +% \begin{macro}{\print@partial} +% \begin{macrocode} +\newcommand{\print@partial}{% + \resolve@inner{\bib@print@inner\setbib@partial} +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Special formatting for other fields} +% +% \begin{macro}{\parenthesize} +% The \cn{parenthesize} function adds parentheses around its +% argument, calling \cn{upn} to optionally prevent italic +% parentheses from being used. +% \begin{macrocode} +\newcommand{\parenthesize}[1]{% + \leavevmode\push@bracket)\upn{(}#1\pop@bracket +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\upn} +% By default, \cn{upn} is a no-op, meaning that this refinement +% lies dormant unless the \pkg{upref} package or other activation +% is done. (Probably better done via special fonts, anyway.) +% \begin{macrocode} +\providecommand{\upn}[1]{#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\push@bracket} +% \begin{macro}{\pop@bracket} +% \begin{macrocode} +\let\bracket@stack\@empty + +\def\push@bracket#1{% + \xdef\bracket@stack{#1\bracket@stack}% +} + +\def\pop@bracket{% + \iffalse{\fi + \@xp\pop@bracket@a\bracket@stack \@empty}% +} + +\def\pop@bracket@a#1{% + \leavevmode\/\upn{#1}% + \xdef\bracket@stack{\iffalse}\fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bibquotes} +% \begin{macrocode} +\newcommand{\bibquotes}[1]{% + \textquotedblleft#1% + \gdef\deferredquotes{% + \global\let\deferredquotes\@empty + \textquotedblright + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mdash} +% \begin{macro}{\ndash} +% Cf.\@ \pkg{textcmds}, where there's also a penalty added. +% \begin{macrocode} +\providecommand{\mdash}{\textemdash} +\providecommand{\ndash}{\textendash} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\MR} +% \begin{macrocode} +\def\MR#1{% + \relax\ifhmode\unskip\spacefactor3000 \space\fi + \def\@tempa##1:##2:##3\@nil{% + \ifx @##2\@empty##1\else\textbf{##1:}##2\fi + }% + \MRhref{#1}{MR \@tempa#1:@:\@nil}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MRhref} +% For older versions of some AMS document classes, this patch is +% needed. +% \begin{macrocode} +\providecommand{\MRhref}[1]{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintReviews} +% Reviews are handled as a list to support the theoretical +% possibility of multiple reviews. +% \begin{macrocode} +\newcommand{\PrintReviews}[1]{% + \PrintSeries{\fld@elt}{}{,}{ }{,}{ }{,}{ }{}{#1}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintPartials} +% \begin{macrocode} +\newcommand{\PrintPartials}[1]{% + \PrintSeries + {\fld@elt} + {\print@partial} + {;}{ \print@partial} + {;}{ \print@partial} + {;}{ \print@partial}{}{#1}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintISBNs} +% And similarly for ISBNs. There seem to be a few different +% situations where one book might have two different ISBN numbers. +% Here are the ones I know of so far [mjd,2002-02-18]: separate ISBN +% numbers for hardback and paperback; separate ISBN numbers for U.S. +% edition and European edition. +% \begin{macrocode} +\newcommand{\PrintISBNs}[1]{% + \PrintSeries{\fld@elt}{}{,}{ }{,}{ }{,}{ }{ISBN }{#1}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\voltext} +% \begin{macrocode} +\newcommand{\voltext}{\IfEmptyBibField{series}{Vol.~}{vol.~}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\issuetext} +% \begin{macrocode} +\newcommand{\issuetext}{no.~} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DashPages} +% Scan the contents of a page value to see if it is a single page. +% Presence of \cn{ndash} or hyphen is taken to mean no. Probably +% should test also for spaces and commas. [mjd,2000/01/24] +% \begin{macrocode} +\newcommand{\DashPages}[1]{% + p\pp@scan@a#1@\ndash p@\ndash{\pp@scan#1@-p@-{}\@nil}\@nil.~#1% +} + +\def\pp@scan#1-#2@-#3#4\@nil{#3} + +\def\pp@scan@a#1\ndash#2@\ndash#3#4\@nil{#3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eprintpages} +% If we have eprint info and pages info and no journal name, the +% pages information is presumably the number of pages in the eprint. +% \begin{macrocode} +\newcommand{\eprintpages}[1]{% + #1\IfEmptyBibField{eprint}{}{\IfEmptyBibField{journal}{ pp.}{}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintThesisType} +% \begin{macrocode} +\def\PrintThesisType#1{% + \thesis@type#1?\@nil{#1}% +} + +\def\thesis@type#1#2\@nil#3{% + \ifx p#1% + Ph.D. Thesis% + \else + \ifx m#1% + Master's Thesis% + \else + #3% + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintDOI} +% Perhaps need to add allowbreak penalties at the parentheses in a DOI. +% Also what about prohibiting a break after the leading S? +% \begin{macrocode} +\newcommand{\PrintDOI}[1]{% + DOI #1% + \IfEmptyBibField{volume}{, (to appear in print)}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintDatePV} +% Print date in different forms depending on DOI and volume +% information. +% \begin{macrocode} +\newcommand{\PrintDatePV}[1]{% + \IfEmptyBibField{doi}{% + \let\@tempa\PrintDate + }{% + \IfEmptyBibField{volume}{% + \let\@tempa\PrintDatePosted + }{% + \let\@tempa\PrintDate + }% + }% + \@tempa{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintDate} +% The intent is to handle variations such as \texttt{1987}, +% \texttt{August 1987}, \texttt{1987-08}, and +% \texttt{1987-08-14}. If the month is present, print August or +% Aug. or 08 or nothing, at the behest of the bib style. +% +% We've taken some special care to parse out the date info ahead of +% time, so this function just discards arg 1 and uses the +% already-parsed value. +% \begin{macrocode} +\newcommand{\PrintDate}[1]{(\print@date)} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintDateB} +% The same, but without the parentheses. +% \begin{macrocode} +\newcommand{\PrintDateB}[1]{\print@date} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@date} +% \begin{macrocode} +\def\print@date{% + \ifx\bib@month\@empty + \else + \print@month@day + \fi + \bib@year +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@month@day} +% \begin{macrocode} +\def\print@month@day{% + \bib@monthname + \ifx\@empty\bib@day \else \nobreakspace\number 0\bib@day,\fi + \space +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@monthname} +% With the Babel package, month names for a given language are +% typically available in a macro \cs{month@}\emph{language}: +% \begin{verbatim} +% \def\month@german{\ifcase\month\or +% Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or +% Juli\or August\or September\or Oktober\or November\or Dezember\fi} +%\end{verbatim} +% However this is not true for English. +% \begin{macrocode} +\newcommand{\bib@monthname}{% + \ifcase 0\bib@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\or + Winter\or Spring\or Summer\or Fall\else Unknown Month% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintYear} +% You can use \cn{PrintYear} if you want to suppress month/day even +% when supplied in the data. +% \begin{macrocode} +\newcommand{\PrintYear}[1]{\bib@year} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintDatePosted} +% This one is special for AMS use. +% \begin{macrocode} +\newcommand{\PrintDatePosted}[1]{\unskip, posted on \print@date} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintEdition} +% \begin{macrocode} +\newcommand{\PrintEdition}[1]{% + \afterassignment\print@edition + \count@ 0#1\relax\@nil +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@edition} +% If the number assignment swept up all the contents, produce a +% cardinal number from \cs{count@}. +% \begin{macrocode} +\def\print@edition#1#2\@nil{% + \ifx\relax#1\relax + \ifnum\count@>\z@ + \CardinalNumeric\count@ + \else + ??th% + \fi + \ \editiontext + \else + \ifnum \count@>\z@ \number\count@ \fi + #1#2\relax + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\editiontext} +% \begin{macrocode} +\newcommand{\editiontext}{ed.} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CardinalNumber} +% \begin{macrocode} +\newcommand{\CardinalNumeric}[1]{% + \number#1\relax + \if + \ifnum#1<14 + \ifnum#1>\thr@@ T\else F\fi + \else + F% + \fi + T% + th% + \else + \@xp\keep@last@digit\@xp#1\number#1\relax + \ifcase#1th\or st\or nd\or rd\else th\fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\keep@last@digit} +% \begin{macrocode} +\def\keep@last@digit#1#2{% + \ifx\relax#2% + \@xp\@gobbletwo + \else + #1=#2\relax + \fi + \keep@last@digit#1% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SentenceSpace} +% Note how careful we are here to preserve \cn{frenchspacing}. +% \begin{macrocode} +\newcommand{\SentenceSpace}{\relax\ifhmode\spacefactor`\. \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eprint} +% For now, this does nothing. Could do a url/hyperlink or something. +% \begin{macrocode} +\newcommand{\eprint}[1]{\url{#1}} +% \end{macrocode} +% \end{macro} +% The \url{www.arXiv.org} recommendations for citing their eprints are +% found at \url{http://xxx.lanl.gov/help/faq/references}, including +% these examples: +% \begin{verbatim} +% arXiv:hep-th/9910001 +% arXiv:math.AT/9910001 +% arXiv:physics.acc-ph/9911027 +%\end{verbatim} +% +% \subsection{\BibTeX\ support} +% +% \begin{macro}{\bibliographystyle} +% Disable \cn{bibliographystyle} since we're going to handle that +% behind the scenes. +% \begin{macrocode} +\let\bibliographystyle\@gobble +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibtex@style} +% \begin{macrocode} +\def\bibtex@style{amsrn} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\AtBeginDocument{ + \if@filesw + \immediate\write\@auxout{\string\bibstyle{\bibtex@style}}% + \fi +} +% \end{macrocode} +% +% \subsection{Implementing package options} +% +% \subsubsection{The \opt{alphabetic} option} +% +% \begin{macrocode} +\IfOption{alphabetic}{% + \def\bibtex@style{amsra}% + \def\alpha@label{% + \ifx\@empty\bib'label + \def\thebib{\CurrentBib}% + \else + \let\thebib\bib'label + \fi + }% + \let\generate@label\generate@alphalabel + \let\process@citelist\process@citelist@unsorted + \def\numeric@refs{01}% +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{shortalphabetic} option} +% \label{opt:shortalphabetic} +% +% \begin{macrocode} +\IfOption{shortalphabetic}{% + \def\bibtex@style{amsrs}% + \def\alpha@label{% + \ifx\@empty\bib'label + \def\thebib{\CurrentBib}% + \else + \let\thebib\bib'label + \fi + }% + \let\@suffix@format\@arabic + \def\calc@author@part{% + \@xp\@multiauthorlabel\@xp{\@tempa}% + }% + \let\append@label@year\@empty + \let\generate@label\generate@alphalabel + \let\process@citelist\process@citelist@unsorted + \def\numeric@refs{01}% +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{backrefs} option} +% +% \begin{macrocode} +\IfOption{backrefs}{% + \let\PrintBackRefs\print@backrefs + \@ifundefined{Hy@backout}{% + \amsrefs@warning{backref option requires hyperref package}% + }{% + \let\BackCite\back@cite + \AtBeginDocument{\@starttoc{brf}{}}% + }% +}{% +} +% \end{macrocode} +% +% \subsubsection{The \opt{citation-order} option} +% +% \begin{macrocode} +\IfOption{citation-order}{% + \IfOption{alphabetic}{% + \amsrefs@warning@nl{% + The 'citation-order' and 'alphabetic' options are + incompatible% + }% + }{ + \def\bibtex@style{amsru}% + } +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{initials} option} +% +% \begin{macrocode} +\IfOption{initials}{% TRUE: + \BibSpec{nameLE}{ + +{}{}{initials} + +{}{\IfEmptyBibField{initials}{}{ }}{surname} + +{}{ }{jr} + } + + \BibSpec{nameBE}{ + +{}{}{surname} + +{}{ }{initials} + % +{}{ }{jr} + } + + \BibSpec{nameinverted}{ + +{} {} {surname} + +{,}{ } {initials} + +{,}{ } {jr} + } +}{% initials? FALSE: +% \let\extract@initials\@gobble +} % end conditional code for initials option +% \end{macrocode} +% +% \subsubsection{The \opt{jpa} option} +% +% \begin{macrocode} +\IfOption{jpa}{% + \amsrefs@warning{The 'jpa' option is obsolete}% + \typeout{Trying \string\usepackage{amsjpa} instead ...}% + \RequirePackage{amsjpa}[2000/02/02] +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{logical-quotes} option} +% +% \begin{macro}{\deferredquotes} +% \begin{macrocode} +\let\deferredquotes\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\deferredquoteslogical} +% \begin{macrocode} +\IfOption{logical-quotes}{% + \def\deferredquoteslogical{\deferredquotes}% +}{% + \let\deferredquoteslogical\relax +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The \opt{non-compressed-cites} option} +% +% \begin{macrocode} +\IfOption{non-compressed-cites}{% + \let\cite@compress\cite@print +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{non-sorted-cites} option} +% +% \begin{macrocode} +\IfOption{non-sorted-cites}{% + \let\process@citelist\process@citelist@unsorted +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{short-journals} option} +% +% \begin{macrocode} +\IfOption{short-journals}{% + \renewcommand{\DefineJournal}[4]{% + \bib*{#1}{periodical}{ + issn={#2}, + journal={#3}, + }% + } +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{short-publishers} option} +% +% \begin{macrocode} +\IfOption{short-publishers}{% + \renewcommand{\DefinePublisher}[4]{% + \bib*{#1}{publisher}{% + publisher={#2},% +% \end{macrocode} +% Maybe \opt{short-publishers} should suppress the \fld{address}? Or +% is that a separate option? I sense a combinatorial explosion +% coming on.\ldots +% \begin{macrocode} + address={#4}, + }% + }% +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{short-months} option} +% +% \begin{macrocode} +\IfOption{short-months}{% + \renewcommand{\bib@monthname}{% + \ifcase 0\bib@month + \or Jan.\or Feb.\or Mar.\or Apr.\or May\or June\or + July\or Aug.\or Sep.\or Oct.\or Nov.\or Dec.\or + Winter\or Spring\or Summer\or Fall\else Unknown Month% + \fi + }% +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{y2k} option} +% +% \begin{macrocode} +\IfOption{y2k}{% + \IfOption{alphabetic}{% + \def\year@short#1\@nil{#1}% + \def\bibtex@style{amsry}% + }{% + \amsrefs@warning@nl{% + The 'y2k' option can only be used with the^^J% + 'alphabetic' option% + }% +} +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{bibtex-style} option} +% +% \begin{macrocode} +\IfOption{bibtex-style}{% + \RequirePackage{amsbst} +}{} +% \end{macrocode} +% +% \subsubsection{The \opt{author-year} option} +% +% Here ends the \pkg{amsrefs} package, unless the \opt{author-year} +% option is in effect; then we want to use some different +% bibspecs. +% \begin{macrocode} +\IfOption{author-year}{}{\PopCatcodes \endinput} +% \end{macrocode} +% +% \begin{macro}{\generate@label} +% \begin{macrocode} +\def\generate@label{% +% \end{macrocode} +% If the user supplied an explicit \fld{label} field, we use it. +% Otherwise, we generate our own. +% \begin{macrocode} + \ifx\bib'label\@empty + \begingroup +% \end{macrocode} +% We begin by saving the previous stem and initializing the +% current stem to the empty string. +% \begin{macrocode} + \global\let\previous@stem\current@stem + \global\let\current@stem\@empty + \global\let\previous@year\current@year + \global\let\current@year\bib@year +% \end{macrocode} +% The list of primary contributors is available to us in +% \cs{current@primary} in the form +% \begin{quote} +% \cnm{name}{$\mathrm{Last}_1, \mathrm{First}_1$}% +% \cnm{name}{$\mathrm{Last}_2, \mathrm{First}_2$} +% \ldots +% \cnm{name}{$\mathrm{Last}_n, \mathrm{First}_n$} +% \end{quote} +% We will be executing this list multiple times with various +% definitions of \cs{name}. So the first thing we want to do is +% establish a safe environment and normalize the names. +% \begin{macrocode} + \@apply\auto@protect\amsrefs@textsymbols + \@apply\auto@protect\amsrefs@textaccents + \def\name##1{\@nx\name{\lnscan@a##1,\@nil}}% + \auto@protect\etaltext + \normalize@edef\current@stem{\current@primary}% + \xdef\current@stem{\current@stem}% +% \end{macrocode} +% At this point, the \cs{current@stem} is complete and we're ready +% to determine what (if any) suffix is needed to disambiguate +% it from the previous label. +% \begin{macrocode} + \calc@alpha@suffix +% \end{macrocode} +% We have all the pieces now. Arrange to end the current group and +% then define \cs{bib@label} in the enclosing group. (This keeps +% \cs{bib@label} from being defined outside the group started by +% \cs{bib@start}. This isn't strictly necessary, but it provides a +% bit of compartmentalization.) +% \begin{macrocode} + \edef\@tempa{% + \def\@nx\cite@label{\current@stem}% + \def\@nx\bib@label@year{% + \current@year + \alpha@label@suffix + }% + } + \@xp\endgroup + \@tempa + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lnscan@a} +% \begin{macrocode} +\def\lnscan@a#1,#2\@nil{#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel@author} +% \begin{macrocode} +\def\citesel@author#1#2#3#4#5{\PrintCiteNames{#3}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel@authoryear} +% \begin{macrocode} +\def\citesel@authoryear#1#2#3#4#5{\PrintCNY{#3}{#4}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel@object} +% \begin{macrocode} +\def\citesel@object#1#2#3#4#5{\PrintCiteNames{#3} \citeleft#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citesel} +% \begin{macrocode} +\let\citesel\citesel@authoryear +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\numeric@refs} +% \begin{macrocode} +\def\numeric@refs{01}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citeleft} +% \begin{macrocode} +\def\citeleft{(}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citeright} +% \begin{macrocode} +\def\citeright{)}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@citeleft} +% \begin{macrocode} +\def\@citeleft{\ifx\citesel\citesel@object\else\citeleft\fi}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citepunct} +% \begin{macrocode} +\def\citepunct{; } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\BibLabel} +% \begin{macrocode} +\let\BibLabel\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@citelist} +% \begin{macrocode} +\let\process@citelist\process@citelist@unsorted +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ycite} +% \begin{macrocode} +\DeclareRobustCommand{\ycite}[1]{% + \star@{\cite@a\citesel@year{#1}}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ycites} +% \begin{macrocode} +\DeclareRobustCommand{\ycites}[1]{% + \begingroup + \def\citepunct{, }% + \let\citesel\citesel@year + \cites{#1}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ocite} +% \begin{macrocode} +\DeclareRobustCommand{\ocite}[1]{% + \star@{\cite@a\citesel@object{#1}}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ocites} +% \begin{macrocode} +\DeclareRobustCommand{\ocites}[1]{% + \begingroup + \let\@citelist\@ocitelist + \cites{#1}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ocitelist} +% \begin{macrocode} +\def\@ocitelist#1{% + \PrintSeries{\InnerCite}% + {\ocite}% + {}{ and \ocite}% +% \end{macrocode} +% For three or more names: print `et al' instead of the last name. +% Have to putz around with the space factor a bit or the comma +% between name and year will not be applied. +% \begin{macrocode} + {,}{ \ocite}% + {,}{ and \ocite}% + {}% + {#1}% + {}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citeauthor} +% \begin{macrocode} +\DeclareRobustCommand{\citeauthor}[1]{% + \star@{\cite@a\citesel@author{#1}}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citeauthory} +% \begin{macrocode} +\DeclareRobustCommand{\citeauthory}[1]{% + \citeauthor{#1} \ycite{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fullcite} +% \begin{macrocode} +\DeclareRobustCommand{\fullcite}[1]{% + \begingroup + \let\print@citenames\CiteNamesFull + \star@{\cite@a\citesel@authoryear{#1}}{}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fullocite} +% \begin{macrocode} +\DeclareRobustCommand{\fullocite}[1]{% + \begingroup + \let\print@citenames\CiteNamesFull + \star@{\cite@a\citesel@object{#1}}{}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% Invert the first author's name. +% \begin{macrocode} +\def\set@firstname#1{% + \set@name{#1}\setbib@nameinverted +} +% \end{macrocode} +% +% \begin{macro}{\PrintCNY} +% \begin{macrocode} +\def\PrintCNY#1#2{% + \PrintCiteNames{#1}% + \@ifnotempty{#2}{\@addpunct{,} #2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintCiteNames} +% \begin{macrocode} +\def\PrintCiteNames#1{% + \leavevmode + \def\@tempa{#1}% + \ifx\@tempa\prev@names + \else + \gdef\prev@names{#1}% + \@xp\ifx\@car#1.\@nil\CitePrintUndefined + #1\relax + \else + \print@citenames{#1}% + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CiteNames} +% \begin{macrocode} +\newcommand{\CiteNames}[1]{% + \PrintSeries{\name}% + {}% + {}{ and }% +% \end{macrocode} +% For three or more names: print `et al' instead of the last name. +% Have to putz around with the space factor a bit or the comma +% between name and year will not be applied. +% \begin{macrocode} + {}{\@gobble}% + {}{ \etaltext\@\@gobble}% + {}% + {#1}% + {}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@citenames} +% \begin{macrocode} +\let\print@citenames\CiteNames +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CiteNamesFull} +% \begin{macrocode} +\newcommand{\CiteNamesFull}[1]{% + \PrintSeries{\name}% + {}% + {}{ and }% +% \end{macrocode} +% For three or more names: print `et al' instead of the last name. +% Have to putz around with the space factor a bit or the comma +% between name and year will not be applied. +% \begin{macrocode} + {,}{ }% + {,}{ and }% + {}% + {#1}% + {}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintDate} +% No parentheses around the year. +% \begin{macrocode} +\renewcommand{\PrintDate}[1]{\bib@label@year} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@date} +% Only print the year, not the month or day. +% \begin{macrocode} +\def\print@date{% + \IfEmptyBibField{date}{% + \IfEmptyBibField{year}{\BibField{status}}{\bib@year}% + }{% + \bib@year + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\BibSpec{article}{% + +{} {\PrintAuthors} {author} + +{.} { \PrintDate} {date} + +{.} { \textit} {title} + +{.} { } {part} + +{:} { \textit} {subtitle} + +{,} { \PrintContributions} {contribution} + +{.} { \PrintPartials} {partial} + +{,} { } {journal} + +{} { \textbf} {volume} + +{,} { \issuetext} {number} + +{,} { \eprintpages} {pages} + +{,} { } {status} + +{,} { \PrintDOI} {doi} + +{,} { available at \eprint} {eprint} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} + +\BibSpec{book}{% + +{} {\PrintPrimary} {transition} + +{.} { \PrintDate} {date} + +{.} { \textit} {title} + +{.} { } {part} + +{:} { \textit} {subtitle} + +{,} { \PrintEdition} {edition} + +{} { \PrintEditorsB} {editor} + +{,} { \PrintTranslatorsC} {translator} + +{,} { \PrintContributions} {contribution} + +{,} { } {series} + +{,} { \voltext} {volume} + +{,} { } {publisher} + +{,} { } {organization} + +{,} { } {address} + +{,} { } {status} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} + +\BibSpec{collection.article}{% + +{} {\PrintAuthors} {author} + +{.} { \PrintDate} {date} + +{.} { \textit} {title} + +{.} { } {part} + +{:} { \textit} {subtitle} + +{,} { \PrintContributions} {contribution} + +{,} { \PrintConference} {conference} + +{} {\PrintBook} {book} + +{,} { } {booktitle} + +{,} { pp.~} {pages} + +{,} { } {status} + +{,} { \PrintDOI} {doi} + +{,} { available at \eprint} {eprint} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} + +\BibSpec{report}{% + +{} {\PrintPrimary} {transition} + +{.} { \PrintDate} {date} + +{.} { \textit} {title} + +{.} { } {part} + +{:} { \textit} {subtitle} + +{,} { \PrintEdition} {edition} + +{,} { \PrintContributions} {contribution} + +{,} { Technical Report } {number} + +{,} { } {series} + +{,} { } {organization} + +{,} { } {address} + +{,} { \eprint} {eprint} + +{,} { } {status} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} + +\BibSpec{thesis}{% + +{} {\PrintAuthors} {author} + +{.} { \PrintDate} {date} + +{.} { \textit} {title} + +{:} { \textit} {subtitle} + +{,} { \PrintThesisType} {type} + +{,} { } {organization} + +{,} { } {address} + +{,} { \eprint} {eprint} + +{,} { } {status} + +{} { \parenthesize} {language} + +{} { \PrintTranslation} {translation} + +{;} { \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} + +{} {\SentenceSpace \PrintReviews} {review} +} +% \end{macrocode} +% +% \begin{macrocode} +\PopCatcodes +% +% \end{macrocode} +% +% \subsection{The \pkg{amsbst} package} +% +% \begin{macrocode} +%<*bst> +% \end{macrocode} +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{amsbst}[2004/03/29 v1.68] +%\RequirePackage{amsrefs}[2004/03/29] +% \end{macrocode} +% +% \begin{macrocode} +\BibSpec{article}{% + +{} {\PrintAuthors} {author} + +{.} { } {title} + +{.} { } {part} + +{:} { } {subtitle} + +{.} { \PrintContributions} {contribution} + +{.} { \PrintPartials} {partial} + +{.} { \emph} {journal} + +{} { } {volume} + +{} { \parenthesize} {number} + +{:} {} {pages} + +{,} { \PrintDateB} {date} + +{,} { } {status} + +{.} { \PrintTranslation} {translation} + +{.} { Reprinted in \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} +} + +\BibSpec{partial}{% + +{} {} {part} + +{:} { } {subtitle} + +{.} { \PrintContributions} {contribution} + +{.} { \emph} {journal} + +{} { } {volume} + +{} { \parenthesize} {number} + +{:} {} {pages} + +{,} { \PrintDateB} {date} +} + +\BibSpec{book}{% + +{} {\PrintPrimary} {transition} + +{.} { \emph} {title} + +{.} { } {part} + +{:} { \emph} {subtitle} + +{.} { } {series} + +{,} { \voltext} {volume} + +{.} { Edited by \PrintNameList} {editor} + +{.} { Translated by \PrintNameList}{translator} + +{.} { \PrintContributions} {contribution} + +{.} { } {publisher} + +{.} { } {organization} + +{,} { } {address} + +{,} { \PrintEdition} {edition} + +{,} { \PrintDateB} {date} + +{.} { } {note} + +{.} {} {transition} + +{.} { \PrintTranslation} {translation} + +{.} { Reprinted in \PrintReprint} {reprint} + +{.} {} {transition} +} + +\BibSpec{collection.article}{% + +{} {\PrintAuthors} {author} + +{.} { } {title} + +{.} { } {part} + +{:} { } {subtitle} + +{.} { \PrintContributions} {contribution} + +{.} { \PrintConference} {conference} + +{.} { \PrintBook} {book} + +{.} { In } {booktitle} + +{,} { pages~} {pages} + +{.} { \PrintDateB} {date} + +{.} { \PrintTranslation} {translation} + +{.} { Reprinted in \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} +} + +\BibSpec{conference}{% + +{} {} {title} + +{} {\PrintConferenceDetails} {transition} +} + +\BibSpec{innerbook}{% + +{.} { \emph} {title} + +{.} { } {part} + +{:} { \emph} {subtitle} + +{.} { } {series} + +{,} { \voltext} {volume} + +{.} { Edited by \PrintNameList} {editor} + +{.} { Translated by \PrintNameList}{translator} + +{.} { \PrintContributions} {contribution} + +{.} { } {publisher} + +{.} { } {organization} + +{,} { } {address} + +{,} { \PrintEdition} {edition} + +{,} { \PrintDateB} {date} + +{.} { } {note} + +{.} {} {transition} +} + +\BibSpec{report}{% + +{} {\PrintPrimary} {transition} + +{.} { \emph} {title} + +{.} { } {part} + +{:} { \emph} {subtitle} + +{.} { \PrintContributions} {contribution} + +{.} { Technical Report } {number} + +{,} { } {series} + +{.} { } {organization} + +{,} { } {address} + +{,} { \PrintDateB} {date} + +{.} { \PrintTranslation} {translation} + +{.} { Reprinted in \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} +} + +\BibSpec{thesis}{% + +{} {\PrintAuthors} {author} + +{,} { \emph} {title} + +{:} { \emph} {subtitle} + +{.} { \PrintThesisType} {type} + +{.} { } {organization} + +{,} { } {address} + +{,} { \PrintDateB} {date} + +{.} { \PrintTranslation} {translation} + +{.} { Reprinted in \PrintReprint} {reprint} + +{.} { } {note} + +{.} {} {transition} +} +% \end{macrocode} +% +% \begin{macro}{\PrintEditorsA} +% When we consider editor names we have to think about some further +% complications. First, for the case of a book where editor names are +% listed in place of author names, just copy the same style with a +% bit of added text at the end. +% \begin{macrocode} +\renewcommand{\PrintEditorsA}[1]{% + \def\current@bibfield{\bib'editor}% + \PrintNames{}{, editor\Plural{s})}{#1}% + \erase@field\bib'editor +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PrintTranslatorsA} +% \begin{macrocode} +\renewcommand{\PrintTranslatorsA}[1]{% + \def\current@bibfield{\bib'translator}% + \PrintNames{}{, translator\Plural{s}}{#1}% + \erase@field\bib'translator +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +% +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{5005} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amstext.dtx b/Master/texmf-dist/source/latex/amslatex/amstext.dtx new file mode 100644 index 00000000000..0ef49f67a64 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amstext.dtx @@ -0,0 +1,314 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amstext.dtx", +%%% version = "2.01", +%%% date = "2000/06/29", +%%% time = "08:34:33 EDT", +%%% checksum = "09860 314 1647 12368", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995, 1999 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@ams.org (Internet)", +%%% supported = "yes", +%%% keywords = "latex, math, text", +%%% abstract = "This is a \LaTeX{} package that defines a +%%% \cn{\text} macro, which makes it easy to +%%% incorporate fragments of text inside a displayed +%%% equation or a sub or superscript. Font sizes +%%% are automatically scaled in sub/superscripts.", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +% \iffalse +%<*driver> +\documentclass{amsdtx} +\usepackage{amstext} +\begin{document} +\title{The \pkg{amstext} package} +\author{Frank Mittelbach \and Rainer Sch\"opf} +\date{Version \fileversion, \filedate} +\hDocInput{amstext.dtx} +\end{document} +% +% \fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% +% This style file implements the \AmSTeX{} macro \cn{text} for use +% with the new font selection scheme. The \cn{text} macro is a +% sophisticated command which allows the user to insert ``normal text'' +% into math formulas without worrying about correct sizes in sub- or +% superscripts. It can also be used in ordinary text; there it +% produces an unbreakable unit similar to \cn{mbox}. +% +% Here is an example demonstrating some of its features: +% \[ +%^^A mathbin spacing is nonscript glue, disappears in superscript +% x^{2\,\times\,\text{size of $y$}} +% \leq +% z_{i_{\text{upper bound of the array}}} +% \] +% This was produced by +% \begin{verbatim} +% \[ +% x^{2\,\times\,\text{size of $y$}} +% \leq +% z_{i_{\text{upper bound of the array}}} +% \] +% \end{verbatim} +% +% Additionally this style file redefines an internal \fn{plain.tex} +% macro called \cs{mathhexbox} so that commands like \cn{dag} +% or \cn{P} will change sizes if used in math subscripts. +% +% \StopEventually{} +% Package information. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1994/12/01]% LaTeX date must be December 1994 or later +\ProvidesPackage{amstext}[2000/06/29 v2.01] +% \end{macrocode} +% +% \section{The implementation} +% We need a few tools from \fn{amsgen.sty}. +% \begin{macrocode} +\RequirePackage{amsgen} +% \end{macrocode} +% +% \begin{macro}{\text} +% Now we come to the \cn{text} macro which is used to place +% ordinary text inside of math formulas. If it is used outside +% math it will produce an unbreakable unit of text. +% \begin{macrocode} +\DeclareRobustCommand{\text}{% + \ifmmode\expandafter\text@\else\expandafter\mbox\fi} +% \end{macrocode} +% At the present time (late 1994) the \latex/ internal function +% |\nfss@text| is used in |\ref|, in font commands like |\textbf|, +% and in a few text symbol definitions like |\$| and |\pounds|. By +% equating |\nfss@text| to |\text| we give it the ability of +% |\text| to change sizes properly if used in a subscript. +% \begin{macrocode} +\let\nfss@text\text +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\text@} +% If \cn{text} is encountered inside math mode the macro +% \cs{text@} is called. It has one mandatory argument, the text +% which should be produced. Since we do not know in which math +% style we are currently in we call \cs{mathchoice} to tyeset +% our text in all four possible styles. +% \begin{macrocode} +\def\text@#1{{\mathchoice +% \end{macrocode} +% To save token space we call a macro \cs{textdef@} which takes +% three arguments: the current math style, the corresponding size +% macro and the text to typeset possibly with some additional +% information for typesetting. +% \begin{macrocode} + {\textdef@\displaystyle\f@size{#1}}% +% \end{macrocode} +% The other three cases are similar except for the +% \cs{iffirstchoice} switch which we set to false. This is +% done to prevent \LaTeX{} macros like \cn{ref} or \cn{index} +% from writing their arguments more than once. +% \begin{macrocode} + {\textdef@\textstyle\f@size{\firstchoice@false #1}}% + {\textdef@\textstyle\sf@size{\firstchoice@false #1}}% + {\textdef@\textstyle \ssf@size{\firstchoice@false #1}}% +% \end{macrocode} +% Here we need to check whether a math size-change occurred inside +% the argument of \cn{text}. If so, restore +% \begin{macrocode} + \check@mathfonts + }% +} +% \end{macrocode} +% The macros \cs{f@size}, \cs{sf@size} and \cs{ssf@size} hold the +% sizes which should be used when we are loading a new font for use +% in \cs{textfont}, \cs{scriptfont} and \cs{scriptscriptfont}. There +% is some question whether we should use use \cs{tf@size} or +% \cs{f@size} for the main size, but since the primary purpose of the +% \cn{text} macro is to switch back to text within a display, it +% seems that \cs{f@size} is the better choice. (Indeed it could be +% said that the \cn{text} actually provides two different functions: +% one for escaping out of math mode in a display to print some words, +% and the other for handling math objects that are named by a +% fragment of text, when \cn{operatorname} isn't the right choice. +% For the latter \cs{tf@size} might be more correct but for the +% former \cs{f@size} is clearly better.) +% \end{macro} +% +% \begin{macro}{\textdef@} +% To typeset the argument of \cn{text} correctly we have to make +% several actions. We start by placing everything inside an +% \cs{hbox}. But this is not enough: we need one extra level of +% grouping. These extra braces are necessary because of the new +% font selection scheme which might produce an \cs{aftergroup} +% to globally restore some font values after the current group. To +% prevent any damage by this mechanism we add the braces thereby +% bringing the token inserted by \cs{aftergroup} inside the +% \cs{hbox}.\footnote{The mechanism will not produce a second +% \cs{aftergroup}. For more details see the technical documentation +% for NFSS2.} +% \begin{macrocode} +\def\textdef@#1#2#3{\hbox{{% +% \end{macrocode} +% Since text typeset inside an \cs{hbox} always stays in the size +% of the text surrounding the formula we have to adjust this for +% script and scriptscript sizes. For any math formula inside this +% argument this will be achieved by setting \cs{everymath} to +% the first argument of \cs{textdef@} since this argument +% contains the math size in the current typeset case of +% \cs{mathchoice}. +% Since \latex/ also knows about \cn{parbox}es and the +% \env{minipage} environment it might be neccessary to adjust +% \cs{everydisplay} too but this has to be tested further. +% \begin{macrocode} + \everymath{#1}% +% \end{macrocode} +% The next line of code changes locally (i.e.\ inside the current +% \cs{hbox}) the value of \cs{f@size}. This macro holds the +% size for typesetting ordinary text (e.g.\ loading or selecting a +% new font via \cs{selectfont}). By changing it to a smaller +% value a following \cs{selectfont} will switch to the wanted +% size. +% \begin{macrocode} + \let\f@size#2\selectfont +% \end{macrocode} +% Now we simply call the third argument and close all open groups. +% \begin{macrocode} + #3}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\iffirstchoice@} +% Here is the switch that we use to decide if \cn{ref} etc.\ +% should print its warnings. The default is true since +% normally these warnings shouldn't be suppressed. +% \begin{macrocode} +\newif\iffirstchoice@ +\firstchoice@true +% \end{macrocode} +% \end{macro} +% +% \subsection{Re-definition of \latex/ macros to work with \cn{text}} +% +% If a counter-changing command occurs inside the argument of +% \cn{text}, we don't want the counter to be changed four times +% because \cn{stepcounter} and \cn{addtocounter} have global effect. +% So we add the \cs{iffirstchoice@} test to make the counter +% operations execute only once. +% +% \begin{macro}{\stepcounter} +% Use \cs{def} rather than \cn{renewcommand*} because the star-form +% (for non-\cs{long} definitions) doesn't work with the June 1994 +% release of \latex/. +% \begin{macrocode} +\def\stepcounter#1{% + \iffirstchoice@ + \addtocounter{#1}\@ne + \begingroup \let\@elt\@stpelt \csname cl@#1\endcsname \endgroup + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addtocounter} +% \begin{macrocode} +\def\addtocounter#1#2{% + \iffirstchoice@ + \@ifundefined {c@#1}{\@nocounterr {#1}}% + {\global \advance \csname c@#1\endcsname #2\relax}% + \fi} +% \end{macrocode} +% \end{macro} +% +% For \cn{ref}, \cn{pageref}, and indeed anything else that issues a +% warning or error, \cn{text} will produce four copies of the +% warning/error message. To suppress the last three copies, we change +% \cs{GenericInfo}, \cs{GenericWarning}, \cs{GenericError}. +% \begin{macrocode} +\let\m@gobble\@empty +\@xp\let\csname m@gobble4\endcsname\@gobblefour +\long\@xp\def\csname m@gobble6\endcsname#1#2#3#4#5#6{} +% \end{macrocode} +% +% \begin{macrocode} +\toks@{% + \csname m@gobble\iffirstchoice@\else 4\fi\endcsname + \protect} +\edef\GenericInfo{\the\toks@ + \@xp\@nx\csname GenericInfo \endcsname} +% +\edef\GenericWarning{\the\toks@ + \@xp\@nx\csname GenericWarning \endcsname} +% +\toks@{% + \csname m@gobble\iffirstchoice@\else 6\fi\endcsname + \protect} +\edef\GenericError{\the\toks@ + \@xp\@nx\csname GenericError \endcsname} +% \end{macrocode} +% +% At one time \cn{label}, \cs{@wrindex} and \cs{@wrglossary} were +% changed here too to use the \cs{iffirstchoice@} test but it seems +% that was a mistake because those are non-immediate writes. +% Something like +% \begin{verbatim} +% \text{something \index{foo}} +% \end{verbatim} +% within a math formula would therefore \emph{lose the index term} if +% the surrounding context was not displaystyle. (Unlikely in +% practice, but not impossible.) [mjd,1994/12/09] +% +%\subsection{Applications of \cn{text}} +% +% \begin{macro}{\mathhexbox} +% We start with an re-definition of the \fn{plain.tex} macro +% \cs{mathhexbox}. (Although M. Spivak in \amstex/ uses the name +% \cs{mathhexbox@} for this purpose, I [FMi] don't see any reason +% to use a new name since the new definition is superior, has the +% same syntax and is used for the same purpose.) +% \begin{macrocode} +\begingroup \catcode`\"=12 +\gdef\mathhexbox#1#2#3{\text{$\m@th\mathchar"#1#2#3$}} +\endgroup +% \end{macrocode} +% This redefinition means that now symbols like \S, \P, \dag, \ldots, +% which are defined via \cs{mathhexbox} in \fn{plain.tex} or +% elsewhere now correctly change sizes if they are used in math mode. +% \end{macro} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{129} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsxport.dtx b/Master/texmf-dist/source/latex/amslatex/amsxport.dtx new file mode 100644 index 00000000000..308a8c2698c --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsxport.dtx @@ -0,0 +1,1822 @@ +%%% ==================================================================== +%%% @BibTeX-source-file{ +%%% filename = "amsxport.dtx", +%%% version = "2.00", +%%% date = "2004/06/28", +%%% time = "14:50:12 EDT", +%%% author = "Michael J Downes", +%%% address = "American Mathematical Society, +%%% Publications Technical Group, +%%% PO Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% email = "tech-support at ams.org", +%%% URL = "http://www.ams.org/", +%%% abstract = "The BibTeX style file amsxport.bst produces .bbl +%%% entries where most of the database structure is +%%% retained. This is intended for processing by a smart +%%% bibliography package such as the amsrefs package.", +%%% checksum = "40425 1822 6396 51551", +%%% docstring = "The checksum field, produced by Robert Solovay's +%%% checksum utility, gives CRC-16 checksum, lines, +%%% words, and characters.", +%%% } +%%% ==================================================================== +% \iffalse +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\documentclass[draft,oneside]{amsdtx}[1999/11/01] + +\providecommand{\vn}[1]{\emph{#1}}% variable name + +\renewcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries #1:} + +%% Use normal typesize instead of \small for code listings. + +\def\MacroFont{% + \fontencoding\encodingdefault + \fontfamily\ttdefault + \fontseries\mddefault + \upshape +} + +\makeatletter + +%% Don't prepend \ to macro names. + +\def\SpecialIndex@#1#2{% + \@SpecialIndexHelper@#1\@nil + \def\@tempb{ }% + \ifcat \@tempb\@gtempa + \special@index{\quotechar\space\actualchar + \string\verb\quotechar*\verbatimchar + \quotechar\space\verbatimchar#2}% + \else + \def\@tempb##1##2\relax{\ifx\relax##2\relax + \def\@tempc{\special@index{\quotechar##1\actualchar + \string\verb\quotechar*\verbatimchar + \quotechar##1\verbatimchar#2}}% + \else + \def\@tempc{\special@index{##1##2\actualchar + \string\verb\quotechar*\verbatimchar + ##1##2\verbatimchar#2}}% + \fi}% + \expandafter\@tempb\@gtempa\relax + \@tempc + \fi} + +\makeatother + +\PageIndex + +\begin{document} +\title{The AMS Export Bib\TeX{} style [\fn{amsxport}]} +\author{American Mathematical Society\\Michael Downes\\David M. Jones} +\date{Version \fileversion, \filedate} +\hDocInput{amsxport.dtx} +\PrintIndex +\end{document} +% +% \fi +% +% \MakeShortVerb{\|} +% +% \maketitle +% +% \tableofcontents +% +% \section{Introduction} +% +% \bst{amsxport} is the collective name for a collection of +% \bibtex/ styles that form a bridge between \BibTeX\ and +% \pkg{amsrefs}. It produces output in which the structural +% information of the original \bibtex/ database file is +% retained. No ad hoc visual formatting is introduced that would +% hamper the application of alternative design specifications when +% rendering the information on paper or screen. This makes it +% possible to have \bibtex/ handle only extraction and sorting and +% leave the visual appearance to be controlled entirely by +% \latex/. The process of applying typical bibliography specs to +% exported data is illustrated in the \pkg{amsrefs} package. The +% authoritative description of the export format is in the +% \pkg{amsrefs} documentation, inasmuch as interpreting the format +% is the chief task of the \pkg{amsrefs} package. +% +% Each of the five \fn{.bst} files generated from this file +% corresponds to a combination of \pkg{amsrefs} package options, as +% follows: +% \begin{description} +% +% \item[amsrn] +% +% This is the default style, used when none of the following is +% appropriate. +% +% \item[amsru] +% +% This is used when the \opt{citation-order} option is specified. +% It is identical to \bst{amsrn} except that the bibliography items +% are not sorted. +% +% \item[amsra] +% +% This is when with the \opt{alphabetic} option is specified, byt +% the \opt{y2k} option is \emph{not} also specified. +% +% \item[amsry] +% +% This is used when both the \opt{alphabetic} and \opt{y2k} options +% are specified. +% +% \item[amsrs] +% +% This is used when the \opt{shortalphabetic} option is specified. +% +% \end{description} +% +% Readers may wish to refer also to the standard \bibtex/ +% documentation (\fn{btxdoc.tex}, \fn{btxhak.tex}, \fn{btxbst.doc}) +% for background information. +% +% \StopEventually{} +% +% \section{Implementation} +% +% The list below gives the fields that are expected to occur. (Other +% fields will be discarded without comment.) +% suggested fields. +% \begin{macrocode} +%<*bst> +ENTRY + { + address institution number status + archive isbn organization subtitle + author issn pages title + booktitle journal part translator + chapter key pii type + date language preprint url + edition meeting publisher volume + editor month review xid + eprint mrnumber school year + howpublished note series + } + { } + { label } +% \end{macrocode} +% +% Some comments about specific fields: +% \begin{description} +% \item[archive] The archive that holds the eprint listed in the +% \fn{eprint} field. +% \item[author] \bibtex/ doesn't allow this field (or any field) to be +% used more than once, but in the output its contents will be split +% into a separate key-value pair for each name. Likewise for +% \fn{editor} and \fn{translator}. +% \item[crossref] This is a built-in field type, so it doesn't occur in +% the argument of ENTRY above. +% \item[date] This is a generalization of the \fn{year} and \fn{month} +% fields. Its value should be written in ISO 8601 format, e.g., +% 1987-06-05; but the day and month are omissible, so this can be +% easily be used instead of the \fn{year} field. +% \item[edition] For books. The \bibtex/ documentation suggests that the +% value of this field should be an ordinal word such as \qq{Second}. +% This may be because the \bibtex/ language provides only the weakest +% sort of support for an \emph{is-numeric} test. +% \item[eprint] Electronic preprint information such as for +% \url{www.arXiv.org}. +% \item[institution] What's the difference between an \fn{institution} +% and an \fn{organization}? The \bibtex/ documentation says that +% \fn{institution} should be used for technical reports and +% \fn{organization} for other entry types. +% \item[isbn] International Standard Book Number. +% \item[issn] International Standard Serial Number. See the discussion +% of journal abbreviations. +% \item[language] Language of the work. This is especially desirable +% when the value of the title field is a translation of the true +% title (most often when the original language is one like Arabic or +% Chinese that poses rendering problems for non-native software). +% \item[meeting] Since \bibtex/ doesn't allow a field name to be the +% same as a function name, we have to use \fn{meeting} instead of +% \fn{conference} if we want to give the title of a conference in a +% dedicated field. +% \item[mrnumber] An alias for \fn{review} which we provide because +% MathSciNet has been using it in the \bibtex/ output that it +% provides for a couple of years already. +% \item[organization] See the comment for \fn{institution}. +% \item[pii] Publisher Item Identifier +% \item[part] This is for a long journal article that is published in +% separate issues of the same journal. There should be a separate +% \bibtex/ entry for each part (though all the ones after part 1 +% could crossref the first one). +% +% \item[preprint] It is not possible quite yet to assume that all +% preprints should be classified as eprints. If you have a preprint +% that is not an eprint, use this field to give the \qq{address} +% where the preprint may be found (institution, preprint number, +% etc.). +% +% \item[review] Review numbers or similar pointers, e.g., for +% Mathematical Reviews or Zentralblatt. +% +% \item[school] The analog of \qq{organization}, for a thesis. +% +% \item[status] Typically used for notes such as ``to appear'' or ``in +% preparation'' with journal articles. +% +% \item[subtitle] Typically used with a multipart journal article to +% give a subtitle for each part. +% +% \item[translator] This needs no explanation, surely? Except perhaps to +% note that the standard \bibtex/ styles don't provide it. +% +% \item[url] Universal Resource Locator. +% +% \item[xid] This is used by a cross-referenced item to pass its +% identity to child entries that refer to it. It would not be +% necessary if \bibtex/ left the \fn{crossref} field value +% accessible, but for some reason that I have not found yet (skimming +% in the source code) it is cleared internally before there is any +% opportunity to save it. +% +% Practically speaking: For every \fn{crossref} in your \fn{.bib} +% files, the target should contain a matching \fn{xid} field. +% +% \end{description} +% +% More on extra fields. In the Shelah bibliography, the \fn{author} +% field is given without any accents in the author names, and the +% normal \tex/ version of the author names is given in a separate +% field called \fn{trueauthor}. +% +% Also, for MR reviews: +% \begin{verbatim} +% review = {MR 48:3735}, +%\end{verbatim} +% And for each author a country is indicated with the \fn{fromwhere} +% field, e.g., +% \begin{verbatim} +% fromwhere = {UK, IL}, +%\end{verbatim} +% This means the first author is from the United Kingdom and the +% second one from Israel. +% +% \section{Macros for month names} +% +% \begin{macrocode} +MACRO {jan} {"-01"} +MACRO {feb} {"-02"} +MACRO {mar} {"-03"} +MACRO {apr} {"-04"} +MACRO {may} {"-05"} +MACRO {jun} {"-06"} +MACRO {jul} {"-07"} +MACRO {aug} {"-08"} +MACRO {sep} {"-09"} +MACRO {oct} {"-10"} +MACRO {nov} {"-11"} +MACRO {dec} {"-12"} +% \end{macrocode} +% +% Some scratch variables and global variables. +% \begin{macrocode} +STRINGS { p s t l } +% \end{macrocode} +% +% \begin{macrocode} +INTEGERS { len ptr } +% +% \end{macrocode} +% +% \begin{footnotesize}\itshape +% Note: \bibtex/ 0.99 requires a blank line in certain contexts, such +% as after the \fn{READ} command, and will choke if it is missing. +% When it is necessary to add a blank line at the boundary of a macro +% code section we use a \verb'' marker.\par +% \end{footnotesize} +% +% Some utility functions. +% \begin{macrocode} +FUNCTION {NOT} { { #0 } { #1 } if$ } + +FUNCTION {AND} { 'skip$ { pop$ #0 } if$ } + +FUNCTION {OR} { { pop$ #1 } 'skip$ if$ } + +FUNCTION {TRUE} { #1 } + +FUNCTION {FALSE} { #0 } +% +% \end{macrocode} +% +% \begin{macro}{incr.ptr} +% \begin{macrocode} +FUNCTION {incr.ptr} { ptr #1 + 'ptr := } +% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{current.char} +% Returns: first character of STRING +% \begin{macrocode} +FUNCTION {current.char} { ptr #1 substring$ } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{copy.two.chars} +% The function \fn{copy.two.chars} appends the next two characters +% from s to STRING. +% +% Arg: STRING (partial copy of pages string) +% +% Returns: Modified version of STRING +% +% Side effects: advances ptr +% \begin{macrocode} +FUNCTION {copy.two.chars} { t * incr.ptr s current.char * incr.ptr } +% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{is.digit} +% \begin{macrocode} +FUNCTION {is.digit} { + chr.to.int$ + duplicate$ + "0" chr.to.int$ #1 - > + swap$ + "9" chr.to.int$ #1 + < + AND +} +% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{is.lowercase.letter} +% In a previous implementation the \fn{is.letter} function first +% lowercased the character using \verb'change.case$', then tested it +% against the range a--z. But \verb'change.case$' issues a warning if +% it is applied to a lone brace character. +% \begin{macrocode} +FUNCTION {is.lowercase.letter} { + chr.to.int$ duplicate$ + "a" chr.to.int$ #1 - > + swap$ + "z" chr.to.int$ #1 + < + AND +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{is.uppercase.letter} +% \begin{macrocode} +FUNCTION {is.uppercase.letter} { + chr.to.int$ duplicate$ + "A" chr.to.int$ #1 - > + swap$ + "Z" chr.to.int$ #1 + < + AND +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{is.letter} +% \begin{macrocode} +FUNCTION {is.letter} { + duplicate$ + is.lowercase.letter + { pop$ TRUE } + { is.uppercase.letter } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{skip.accent} +% This implementation of \fn{skip.accent} simply skips ahead one +% character whenever a backslash is found. This handles things like +% \verb'\v', \verb'\u', \verb'\k', \verb'\r'. Although this is overly +% simplistic it is still an improvement over the previous method +% which was to not even make the attempt. [mjd,2001-10-27] +% \begin{macrocode} +FUNCTION {skip.accent} { pop$ incr.ptr } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{strip.label} +% \begin{macrocode} +FUNCTION {strip.label} { + 's := + #1 'ptr := + "" + { s ptr #1 substring$ duplicate$ empty$ NOT } + { duplicate$ is.letter + { * } + { duplicate$ "\" = + { skip.accent } + 'pop$ + if$ + } + if$ + incr.ptr + } + while$ +% \end{macrocode} +% When the loop ends we have an extra empty-string on top of the +% stack to get rid of. +% \begin{macrocode} + pop$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{sortify} +% \begin{macrocode} +FUNCTION {sortify} { + purify$ + "l" change.case$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{rpad} +% Warning: The use of |text.length$| here and in \fn{lpad} +% restricts their use to strings that we know do not contain any +% special characters. Since we only use \fn{lpad} for field names +% and \fn{rpad} for |purify$|ed strings, this is ok. +% +% \ \ \fn{rpad} +% \begin{macrocode} +FUNCTION {rpad} { + swap$ + 'l := + l text.length$ - 'len := + { len #0 > } + { + l " " * 'l := + len #1 - 'len := + } + while$ + l +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{lpad} +% \ \ \fn{lpad} +% \begin{macrocode} +FUNCTION {lpad} { + swap$ + 'l := + l text.length$ - 'len := + { len #0 > } + { + " " l * 'l := + len #1 - 'len := + } + while$ + l +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{field.or.null} +% \begin{macrocode} +FUNCTION {field.or.null} { + duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{missing.or.empty} +% \begin{macrocode} +FUNCTION {missing.or.empty} { duplicate$ missing$ swap$ empty$ OR } +% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{append.ndash.and.skip.hyphens} +% The function \fn{append.ndash.and.skip.hyphens} adds \verb'\ndash' +% to STRING when a hyphen is found and advances ptr to the next +% non-hyphen character in \fn{s}. +% +% Arg: STRING (partial copy of pages string) +% +% Returns: modified version of STRING +% +% Side effects: advances ptr +% \begin{macrocode} +FUNCTION {append.ndash.and.skip.hyphens} { + "\ndash " * + incr.ptr + { s current.char "-" = } + { incr.ptr } + while$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{n.dashify} +% In the \fn{n.dashify} function we store the given string in \fn{s}, +% push an empty string on the stack, and start examining the +% characters of \fn{s}. For a non-hyphen character, we just append a +% copy of it to the top string. For a hyphen, we append \cs{ndash} to +% the top string and advance the pointer until we reach a non-hyphen +% character. And there is one more exceptional case: for a backslash, +% we copy two characters instead of one. This keeps us from +% erroneously translating \verb'\-' to \verb'\\ndash'. One would +% scarcely expect to see an instance of \verb'\-' in a page number +% field but let's face it, in actual use nearly anything can and does +% happen. +% +% Arg: STRING (value of \fn{pages} field) +% +% Returns: STRING (dashified version of input string) +% \begin{macrocode} +FUNCTION {n.dashify} { + 's := + #1 'ptr := + "" + { s current.char 't := t "" = NOT } + { t "\" = + { copy.two.chars } + { t "-" = + { append.ndash.and.skip.hyphens } + { t * incr.ptr } + if$ + } + if$ + } + while$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{missing.warning} +% Standard warning message for a missing or empty field. For the user +% we call any such field `missing' without respect to the distinction +% made by \bibtex/ between missing and empty. +% \begin{macrocode} +FUNCTION {missing.warning} { + "missing " swap$ * " in " * cite$ * warning$ +} +% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{string.length} +% Because \bibtex/ doesn't provide a straightforward +% \fn{string.length} function (\verb'text.length$' counts ``special +% characters'' as a single character), it appears necessary to +% implement one the hard way. +% \begin{macrocode} +INTEGERS { string.ptr } + +FUNCTION {string.length} { + #1 'string.ptr := + { duplicate$ string.ptr #1 substring$ "" = 'FALSE 'TRUE if$ } + { string.ptr #1 + 'string.ptr := } + while$ + pop$ + string.ptr #1 - +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{format.title} +% \begin{macrocode} +FUNCTION {format.title}{ + duplicate$ + missing.or.empty + { pop$ "" } + { "t" change.case$ } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{start.field} +% \begin{macrocode} +FUNCTION {start.field} { + #12 lpad "={" * write$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{fin.field} +% \begin{macrocode} +FUNCTION {fin.field} { "}," write$ newline$ } +% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{write.field} +% \begin{macrocode} +FUNCTION {write.field} { + duplicate$ + missing$ + { pop$ missing.warning } + { duplicate$ empty$ + { pop$ missing.warning } + { swap$ start.field write$ fin.field } + if$ + } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{optional.field} +% \begin{macrocode} +FUNCTION {optional.field} { + duplicate$ + missing.or.empty + { pop$ pop$ } + { swap$ start.field write$ fin.field } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{optional.title.field} +% \begin{macrocode} +FUNCTION {optional.title.field} { + duplicate$ + missing.or.empty + { pop$ pop$ } + { format.title swap$ start.field write$ fin.field } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{optional.pages.field} +% \begin{macrocode} +FUNCTION {optional.pages.field} { + duplicate$ + missing.or.empty + { pop$ pop$ } + { swap$ start.field + n.dashify + write$ fin.field + } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{optional.mr.field} +% \begin{macrocode} +FUNCTION {optional.mr.field} { + duplicate$ + missing.or.empty + { pop$ pop$ } + { + swap$ start.field + "\MR{" swap$ * "}" * write$ fin.field + } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{remove.ordinal.suffix} +% \begin{macrocode} +FUNCTION {remove.ordinal.suffix} { + 's := + s string.length 'len := + #1 'ptr := + { ptr len < s ptr #1 substring$ is.digit AND } + 'incr.ptr + while$ + s ptr global.max$ substring$ 'p := + p "st" = + { TRUE } + { p "nd" = + { TRUE } + { p "rd" = + { TRUE } + { p "th" = + { TRUE } + { FALSE } + if$ + } + if$ + } + if$ + } + if$ + { s #1 ptr #1 - substring$ } + { s } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{optional.edition.field} +% \begin{macrocode} +FUNCTION {optional.edition.field} { + duplicate$ missing.or.empty + { pop$ pop$ } + { swap$ start.field + remove.ordinal.suffix + write$ fin.field + } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \section{Formatting author names and editor names} +% +% Take a name list in \bibtex/ form (names separated by the word +% \qq{and}) and output the desired form of each name. +% \begin{macrocode} +INTEGERS { nameptr numnames namesleft } +STRINGS { namelist fieldname } +% \end{macrocode} +% +% \begin{macro}{format.name} +% The \fn{format.name} function operates on a single name, producing +% a string of the form +% \begin{verbatim} +% von Last, First, Jr. +%\end{verbatim} +% +% Args: \vn{namelist}, \vn{index} (top; integer) +% +% Returns: formatted version of the $n$th name in \vn{namelist} where +% integer \vn{index} specifies $n$. +% \begin{macrocode} +FUNCTION {format.name} { "{vv~}{ll}{, ff}{, jj}" format.name$ } +% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{optional.name.field} +% The function \fn{optional.name.field} handles the task of splitting +% a multiple-name field value into multiple fields with single +% values. +% +% Args: \vn{fieldname}, \vn{namelist} (top) +% +% Side effects: writes a key/value pair to the output file for each +% name in \vn{namelist}. +% \begin{macrocode} +FUNCTION {optional.name.field}{ + duplicate$ missing.or.empty + { pop$ pop$ } + { swap$ 'fieldname := + duplicate$ num.names$ + 'namesleft := + #1 'ptr := + { namesleft #0 > } + { fieldname start.field +% \end{macrocode} +% Copy the name string before running \fn{format.name} on it. +% \begin{macrocode} + duplicate$ ptr format.name write$ + fin.field + ptr #1 + 'ptr := + namesleft #1 - 'namesleft := + } + while$ +% \end{macrocode} +% At this point we have an extra copy of the name string on the +% stack. +% \begin{macrocode} + pop$ + } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \section{Handling year, month, date} +% +% \begin{macro}{assemble.date.field} +% In the output we produce a \fn{date} field instead of the year and +% month fields normally used in \bibtex/ files. In the date field we +% use ISO date notation (e.g., 1987-06-05) to facilitate switching +% between full and abbreviated month names. The month and day parts +% are frequently absent, making the date field equivalent to a year +% field. +% \begin{macrocode} +FUNCTION {assemble.date.field} +{ date missing$ + { year missing.or.empty + { status missing.or.empty + { "No year or other date information for " + cite$ * warning$ } + 'skip$ + if$ + "status" + } + { year month missing$ { "" } { month } if$ * } + if$ + } + { date } + if$ +% \end{macrocode} +% If the date string is now equal to \qq{status}, it means that we +% have a status field or we already gave a warning about lack of date +% info; in either case omit the date field. +% \begin{macrocode} + duplicate$ "status" = + { pop$ pop$ } + { swap$ start.field write$ fin.field } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \section{Journal abbreviations} +% +% Use of journal abbreviations is recommended to make supplying ISSN +% numbers easier. To use this feature, you need a STRING definition +% of the form +% \begin{verbatim} +% @STRING{cpam="cpam/0010-3640/" +% #"Communications in Pure and Applied Mathematics"} +%\end{verbatim} +% Then when you write +% \begin{verbatim} +% journal=cpam, +%\end{verbatim} +% exporting with \fn{amsxport} will produce +% \begin{verbatim} +% journal={cpam}, +% ISSN={0010-3640}, +%\end{verbatim} +% The text before the ISSN number in the STRING definition is +% preferably a repetition of the abbreviation name (leaving expansion +% to be done on the \latex/ side); or it could be the full journal +% name. +% +% \textbf{Warning:} If you include braces and write +% \verb'journal={cpam},' \bibtex/ will not expand the abbreviation +% but leave it as the field value; and then you will not get +% automatic lookup of the ISSN number. +% +% \begin{macro}{optional.journal.field} +% \begin{macrocode} +FUNCTION {optional.journal.field} { + duplicate$ missing.or.empty + { pop$ pop$ } + { + 's := + start.field + #1 'ptr := + s current.char is.lowercase.letter + { + s "/" * 's := + { s ptr #1 substring$ "/" = NOT } + { incr.ptr } + while$ +% \end{macrocode} +% Journal name started with a lowercase letter, but we couldn't find +% no slash? All right, just let it go through as it is. +% \begin{macrocode} + s ptr #1 + #1 substring$ empty$ + { s #1 ptr #1 - substring$ } +% \end{macrocode} +% But if we did find a slash, then we probably have found us an ISSN +% number that we can write out. +% \begin{macrocode} + { + s #1 ptr #1 - substring$ + write$ + fin.field +% \end{macrocode} +% ISSNs are always nine characters in length (four digits, hyphen, +% four digits). +% \begin{macrocode} + "ISSN" start.field + s ptr #1 + #9 substring$ + } + if$ + } + { s } + if$ + write$ + fin.field + } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \section{Type info} +% +% \begin{macro}{optional.type.field} +% Putz around with the type info a little, for theses mainly. Two +% types here: the type field, and the entry type. +% \begin{macrocode} +FUNCTION {optional.type.field} +{ duplicate$ missing.or.empty + { type$ "mastersthesis" = { "Master's Thesis" } + { type$ "phdthesis" = { "Ph.D. Thesis" } + { "" } if$ } if$ + swap$ pop$ + } + 'skip$ + if$ + duplicate$ empty$ + { pop$ pop$ } + { swap$ start.field write$ fin.field } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \section{Miscellaneous tail-end information} +% +% \begin{macro}{url.note.status.review} +% The following items are common to all entry types are output at +% the tail end of the entry. +% \begin{macrocode} +FUNCTION {url.note.status.review} { + "url" url optional.field + "note" note optional.field + "status" status optional.field +% \end{macrocode} +% The \fn{review} field should perhaps be translated into multiple +% fields like author names, if more than one review is given. +% \begin{macrocode} + "review" review optional.field +% \end{macrocode} +% Data from MathSciNet will have the Math Reviews number in an +% mrnumber field. We assume that a given entry will have a review +% field or an mrnumber field but not both. +% \begin{macrocode} + "review" mrnumber optional.mr.field +} +% \end{macrocode} +% \end{macro} +% +% \section{Wrapper for each entry} +% +% \begin{macro}{start.entry} +% \begin{macrocode} +FUNCTION {start.entry} { + newline$ + "\bib{" cite$ * "}{" * +% \end{macrocode} +% Merge Master's thesis and Ph.D. thesis into a single type. +% \begin{macrocode} + type$ "mastersthesis" = type$ "phdthesis" = OR + { "thesis" } + { type$ } + if$ + * "}{" * write$ + newline$ +%<*debug> + "sort.label" label sortify optional.field + "sort.key" sort.key$ optional.field +% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{fin.entry} +% \begin{macrocode} +FUNCTION {fin.entry} { + "}" write$ + newline$ +} +% \end{macrocode} +% \end{macro} +% +% \section{Entry types} +% +% Here are the types of entries that are normally allowed in a +% \bibtex/ file: +% \begin{description} +% +% \item[book] A book with an explicit publisher. +% +% \item[booklet] A work that is printed and bound, but without a named +% publisher or sponsoring institution. +% +% \item[inbook] A part of a book, which may be a chapter (or section or +% whatever) and/or a range of pages. +% +% \item[incollection] A part of a book having its own title. +% +% \item[manual] Technical documentation. +% +% \item[mastersthesis] A Master's thesis. +% +% \item[phdthesis] A PhD thesis. +% +% \item[proceedings] The proceedings of a conference. +% +% \item[techreport] A report published by a school or other institution, +% usually numbered within a series. +% +% \item[article] An article from a journal or magazine. +% +% \item[inproceedings] An article in a conference proceedings. +% +% \item[conference] An alias for \fn{inproceedings}. +% +% \item[unpublished] A document having an author and title, but not +% formally published. +% +% \item[misc] Use this type when nothing else fits. +% +% \end{description} +% +% \begin{macro}{article} +% A journal article differs from an inproceedings article by not +% having booktitle, publisher, editor, and other such info. +% \begin{macrocode} +FUNCTION {article} { + start.entry + "author" author optional.name.field + "translator" translator optional.name.field + "title" title format.title write.field + "subtitle" subtitle optional.title.field + "language" language optional.field + "organization" organization optional.field + "how" howpublished optional.field +% \end{macrocode} +% Construct a date value from date, year, month fields +% \begin{macrocode} + "date" assemble.date.field + "ISSN" issn optional.field + "journal" journal optional.journal.field + "volume" volume optional.field + "number" number optional.field + "pages" pages optional.pages.field + "PII" pii optional.field + "archive" archive optional.field + "eprint" eprint optional.field + "preprint" preprint optional.field + url.note.status.review + fin.entry +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{inproceedings} +% An inproceedings entry may have xid, booktitle, meeting, publisher +% info; it is not expected to have journal, eprint, or preprint info. +% \begin{macrocode} +FUNCTION {inproceedings} { + start.entry + "author" author optional.name.field + "translator" translator optional.name.field + "title" title format.title write.field + "subtitle" subtitle optional.title.field + "language" language optional.field + "organization" organization optional.field + "how" howpublished optional.field +% \end{macrocode} +% Construct a date value from date, year, month fields +% \begin{macrocode} + "date" assemble.date.field + "xid" xid optional.field +% \end{macrocode} +% The following fields might be inherited from the parent of an +% article in a proceedings volume or collection. +% \begin{macrocode} + "conference" meeting optional.field + "booktitle" booktitle optional.title.field +% \end{macrocode} +% Include the edition in case this is an inbook entry. +% \begin{macrocode} + "edition" edition optional.edition.field + "editor" editor optional.name.field + "series" series optional.field + "volume" volume optional.field + "publisher" publisher optional.field + "address" address optional.field + "pages" pages optional.pages.field + url.note.status.review + fin.entry +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{inbook} +% \begin{macrocode} +FUNCTION {inbook} { inproceedings } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{incollection} +% \begin{macrocode} +FUNCTION {incollection} { inproceedings } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{inproceedings} +% \begin{macrocode} +FUNCTION {conference} { inproceedings } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{book} +% The book type includes a meeting field because otherwise we'd have +% to repeat the entire definition for the proceedings type with that +% as the sole difference. +% \begin{macrocode} +FUNCTION {book} { + start.entry + "author" author optional.name.field + "editor" editor optional.name.field + "translator" translator optional.name.field + "title" title missing$ { booktitle } { title } if$ + format.title write.field + "subtitle" subtitle optional.title.field + "type" type optional.type.field + "language" language optional.field + "conference" meeting optional.field + "edition" edition optional.edition.field + "series" series optional.field + "publisher" publisher optional.field + organization missing.or.empty + { "institution" institution optional.field } + { "organization" organization optional.field } + if$ + "address" address optional.field + "how" howpublished optional.field + "date" year write.field + "volume" volume optional.field +% \end{macrocode} +% The number here is intended for a tech report. +% \begin{macrocode} + "number" number optional.field + "ISBN" isbn optional.field + url.note.status.review + fin.entry +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{booklet} +% \begin{macrocode}{booklet} +FUNCTION {booklet} { book } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{manual} +% \begin{macrocode} +FUNCTION {manual} { book } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{mastersthesis} +% \begin{macrocode} +FUNCTION {mastersthesis} { book } + +FUNCTION {phdthesis} { book } + +FUNCTION {proceedings} { book } + +FUNCTION {collection} { book } + +FUNCTION {techreport} { book } + +FUNCTION {unpublished} { book } + +FUNCTION {misc} { book } + +FUNCTION {default.type} { misc } +% +% \end{macrocode} +% \end{macro} +% +% \bibtex/ 0.99 keels over if READ does not have a blank line after +% it. +% \begin{macrocode} +% +READ +% +% \end{macrocode} +% +% \section{Sorting the entries} +% +% Since the final labels will be produced by the \pkg{amsrefs} +% package, we don't need to worry about generating suffixes to +% disambiguate between equal stems. All we have to do is strive to +% generate stems that are identical to the ones that \pkg{amsrefs} +% will generate, so that \bst{amsxport} will sort its output in a +% fashion that will be consistent with the labels. +% +% Overall, this simplifies our job, since we don't have to keep +% track of duplicate labels, so we can process each entry in +% isolation. However, we do have to be more careful about the +% handling of text accents and text symbols in order to maintain +% compatibility with \pkg{amsrefs}. +% +% See (\emph{inter alia}) the sections ``Lexical structure of +% names'' and ``Generating alphabetic lables'' in the +% \pkg{amsrefs} implementation documentation for more information. +% +% \begin{macrocode} +%<*sort> +% \end{macrocode} +% +% \begin{macro}{chop.word} +% \begin{macrocode} +FUNCTION {chop.word} { + 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{sort.format.title} +% \begin{macrocode} +FUNCTION {sort.format.title} { + 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{format.lab.names} +% \begin{macrocode} +%<*alpha|short> +FUNCTION {format.lab.names} { + 's := + s num.names$ 'numnames := + numnames #1 > + { numnames #4 > + { #3 'namesleft := } + { numnames 'namesleft := } + if$ + #1 'nameptr := + "" + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { "{\etalchar{+}}" * } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + numnames #4 > + { "{\etalchar{+}}" * } + 'skip$ + if$ + } + { s #1 "{v{}}{l{}}" format.name$ + duplicate$ text.length$ #2 < +% { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } +% { pop$ s #1 "{ll}" format.name$ #1 text.prefix$ } + 'skip$ + if$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.key.organization.label} +{ author empty$ + { key empty$ + { organization empty$ + { cite$ #1 #3 substring$ } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.organization.label} +{ editor empty$ + { key empty$ + { organization empty$ + { cite$ #1 #3 substring$ } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.label}{ + type$ "book" = type$ "inbook" = OR + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.organization.label + { type$ "manual" = + 'author.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ + strip.label + sortify +%<*alpha> + year field.or.null +% #3 #8 substring$ + purify$ * +% + 'label := +} +% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{sort.format.names} +% \begin{macrocode} +FUNCTION {sort.format.names} { + 's := + #1 'ptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { ptr #1 > + { " " * } + 'skip$ + if$ + s ptr "{ll}{ ff}{ jj}" format.name$ 't := + ptr numnames = t "others" = AND + { "et al" } + { t sortify } + if$ + #20 rpad * + ptr #1 + 'ptr := + namesleft #1 - 'namesleft := + } + while$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{sort.warning} +% \begin{macrocode} +FUNCTION {sort.warning} { + "to sort, need " swap$ * " or key in " * cite$ * warning$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{author.sort} +% \begin{macrocode} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "author" sort.warning + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{author.editor.sort} +% \begin{macrocode} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "author, editor," sort.warning + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{author.organization.sort} +% \begin{macrocode} +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "author, organization," sort.warning + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{editor.organization.sort} +% \begin{macrocode} +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "editor, organization," sort.warning + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{presort} +% \begin{macrocode} +FUNCTION {presort} { +%<*alpha|short> + calc.label + label #20 rpad +% + type$ "book" = type$ "inbook" = OR type$ "collection" = OR + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ +% * " " * +% year field.or.null sortify #12 rpad * " " * + title field.or.null sort.format.title * + #1 entry.max$ substring$ + 'sort.key$ := +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +ITERATE {presort} + +SORT +% \end{macrocode} +% +% \begin{macrocode} +% +% \end{macrocode} +% +% \section{Final pass for output} +% +% \begin{macro}{write.with.newlines} +% The \fn{write.with.newlines} functions stores a string in \fn{s} +% and runs through it looking for occurrences of \verb'^^M'; when one +% is found, the substring before it is written out with a newline, +% the remainder is left in \fn{s}, and the cycle begins again. +% \begin{macrocode} +FUNCTION {write.with.newlines} +{ 's := #1 'ptr := + { s ptr #2 + #1 substring$ "" = NOT } + { s ptr #3 substring$ "^^M" = + { s #1 ptr #1 - substring$ write$ newline$ + ptr #3 + 'ptr := + s ptr global.max$ substring$ 's := + #1 'ptr := + } + { incr.ptr } + if$ + } + while$ + s write$ newline$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{begin.bin} +% \begin{macrocode} +FUNCTION {begin.bib} { + preamble$ empty$ + 'skip$ + { preamble$ write.with.newlines } + if$ + "% \bib, bibdiv, biblist are defined by the amsrefs package." + write$ newline$ + "\begin{bibdiv}" write$ newline$ + "\begin{biblist}" write$ newline$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{end.bin} +% \begin{macrocode} +FUNCTION {end.bib} { + newline$ + "\end{biblist}" write$ newline$ + "\end{bibdiv}" write$ newline$ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +EXECUTE {begin.bib} + +ITERATE {call.type$} + +EXECUTE {end.bib} +% +% \end{macrocode} +% +% \section{Journal abbreviations} +% +% By putting the ISSN into the \latex/ document, we make it easier to +% construct www queries from the bibliography data. These string +% definitions tie together journal abbreviations, ISSN numbers, and +% journal names. +% +% These are the journals that are cited most frequently by American +% Mathematical Society authors at the present time (2000 CE). +% +% The format used here is designed to make it easy for BibTeX +% to retrieve an ISSN number when given a journal abbreviation. +% \begin{macrocode} +%<*abbrevs> +@string{aa="aa/0065-1036/" + #"Acta Arithmetica"} +@string{actamath="actamath/0001-5962/" + #"Acta Mathematica"} +@string{asms="asms/0001-6969/" + #"Acta Scientiarum Mathematicarum"} +@string{advmath="advmath/0001-8708/" + #"Advances in Mathematics"} +@string{ajm="ajm/0002-9327/" + #"American Journal of Mathematics"} +@string{amm="amm/0002-9890/" + #"American Mathematical Monthly"} +@string{aifg="aifg/0373-0956/" + #"Annales de l'Institut Fourier"} +@string{am2="am2/0003-486X/Annals of Mathematics"} +@string{ap="ap/0091-1798/" + #"The Annals of Probability"} +@string{asens4="asens4/0012-9593/" + #"Annales Scientifiques de l'\'{E}cole Normale Sup\'{e}rieure"} +@string{amb="amb/0003-889X/Archiv der Mathematik"} +@string{arma="arma/0003-9527/" + #"Archive for Rational Mechanics and Analysis"} +@string{bamsn="bamsn/0273-0979/" + #"Bulletin (New Series) of the American Mathematical Society"} +@string{bams="bams/0004-9727/" + #"Bulletin of the Australian Mathematical Society"} +@string{blms="blms/0024-6093/" + #"Bulletin of the London Mathematical Society"} +@string{bsmf="bsmf/0037-9484/" + #"Bulletin de la Soci\'{e}t\'{e} Math\'{e}matique de France"} +@string{craspi="craspi/0764-4442/" + #"Comptes Rendus de l'Acad\'{e}mie des Sciences (Paris)" + #" S\'{e}rie I Math\'{e}matique"} +@string{cjm="cjm/0008-414X/Canadian Journal of Mathematics"} +@string{cmb="cmb/0008-4395/" + #"Canadian Mathematical Bulletin"} +@string{colloqmath="colloqmath/0010-1354/" + #"Colloquium Mathematicum"} +@string{commalgebra="commalgebra/0092-7872/" + #"Communications in Algebra"} +@string{cmp="cmp/0010-3616/" + #"Communications in Mathematical Physics"} +@string{cpam="cpam/0010-3640/" + #"Communications on Pure and Applied Mathematics"} +@string{cmh="cmh/0010-2571/" + #"Commentarii Mathematici Helvetici"} +@string{cvta="cvta/0278-1077/" + #"Complex Variables"} +@string{compositiomath="compositiomath/0010-437X/" + #"Compositio Mathematica"} +@string{c="c/0010-485X/Computing"} +@string{constrapprox="constrapprox/0176-4276/" + #"Constructive Approximation"} +@string{dmj="dmj/0012-7094/" + #"Duke Mathematical Journal"} +@string{eraams="eraams/1079-6762/" + #"Electronic Research Announcements" + #" of the American Mathematical Society"} +@string{etds="etds/0143-3857/" + #"Ergodic Theory and Dynamical Systems"} +@string{fm="fm/0016-2736/" + #"Fundamenta Mathematicae"} +@string{gd="gd/0046-5755/" + #"Geometriae Dedicata"} +@string{illinoisjmath="illinoisjmath/0019-2082/" + #"Illinois Journal of Mathematics"} +@string{iumj="iumj/0022-2518/" + #"Indiana University Mathematics"} +@string{im="im/0020-9910/" + #"Inventiones Mathematicae"} +@string{israeljmath="israeljmath/0021-2172/" + #"Israel Journal of Mathematics"} +@string{iansm="iansm/??/" + #"Izvestiya Akademii Nauk SSSR. Seriya Matematicheskaya"} +@string{ja="ja/0021-8693/" + #"Journal of Algebra"} +@string{jams="jams/0894-0347/" + #"Journal of the American Mathematical Society"} +@string{jam="jam/0021-7670/" + #"Journal d'Analyse Math\'{e}matique"} +@string{jamm="jamm/0021-8928/" + #"Journal of Applied Mathematics and Mechanics"} +@string{jat="jat/0021-9045/" + #"Journal of Approximation Theory"} +@string{jamsa="jamsa/0263-6115/" + #"Journal of the Australian Mathematical Society"} +@string{jcta="jcta/0097-3165/" + #"Journal of Combinatorial Theory"} +@string{jde="jde/0022-0396/" + #"Journal of Differential Equations"} +@string{jdg="jdg/0022-040X/Journal of Differential Geometry"} +@string{jfa="jfa/0022-1236/" + #"Journal of Functional Analysis"} +@string{jlms2="jlms2/0024-6107/" + #"Journal of the London Mathematical Society"} +@string{jmaa="jmaa/0022-247X/" + #"Journal of Mathematical Analysis and Applications"} +@string{jmp="jmp/0022-2488/" + #"Journal of Mathematical Physics"} +@string{jmsj="jmsj/0025-5645/" + #"Journal of the Mathematical Society of Japan"} +@string{jnt="jnt/0022-314X/Journal of Number Theory"} +@string{jot="jot/0379-4024/" + #"Journal of Operator Theory"} +@string{jpaa="jpaa/0022-4049/" + #"Journal of Pure and Applied Algebra"} +% Braces instead of quotes, to hide the embedded \" control sequence +@string{jram={jram/0075-4102/} + #{Journal f\"{u}r die Reine und Angewandte Mathematik}} +@string{jsl="jsl/0022-4812/" + #"The Journal of Symbolic Logic"} +@string{laa="laa/0024-3795/" + #"Linear Algebra and its Applications"} +@string{mm="mm/0025-2611/" + #"Manuscripta Mathematica"} +@string{matzametki="matzametki/0025-567X/Matematicheskie Zametki"} +@string{ma="ma/0025-5831/" + #"Mathematische Annalen"} +@string{mc="mc/0025-5718/" + #"Mathematics of Computation"} +@string{mj="mj/0025-5513/" + #"Mathematica Japonica"} +@string{mn="mn/0025-584X/Mathematische Nachrichten"} +@string{mpcps="mpcps/0305-0041/" + #"Mathematical Proceedings of the" + #" Cambridge Philosophical Society"} +@string{mrl="mrl/1073-2780/" + #"Mathematical Research Letters"} +@string{ms="ms/0025-5521/" + #"Mathematica Scandinavica"} +@string{mathz="mathz/0025-5874/" + #"Mathematische Zeitschrift"} +@string{m="m/0025-5793/" + #"Mathematika"} +@string{mmj="mmj/0026-2285/" + #"The Michigan Mathematical Journal"} +@string{nmj="nmj/0027-7630/" + #"Nagoya Mathematical Journal"} +@string{na="na/0362-546X/Nonlinear Analysis"} +@string{nm="nm/0029-599X/Numerische Mathematik"} +@string{ojm="ojm/0030-6126/" + #"Osaka Journal of Mathematics"} +@string{pjm="pjm/0030-8730/" + #"Pacific Journal of Mathematics"} +@string{pams="pams/0002-9939/" + #"Proceedings of the American Mathematical Society"} +@string{pems2="pems2/0013-0915/" + #"Proceedings of the Edinburgh Mathematical Society"} +@string{pjaa="pjaa/0386-2194/" + #"Proceedings of the Japan Academy"} +@string{plms3="plms3/0024-6115/" + #"Proceedings of the London Mathematical Society"} +@string{qjmo2="qjmo2/0033-5606/" + #"The Quarterly Journal of Mathematics"} +@string{rmi="rmi/0213-2230/" + #"Revista Matem\'{a}tica Iberoamericana"} +@string{rmjm="rmjm/0035-7596/" + #"Rocky Mountain Journal of Mathematics"} +@string{sjam="sjam/0036-1399/" + #"SIAM Journal on Applied Mathematics"} +@string{sjc="sjc/0097-5397/" + #"SIAM Journal on Computing"} +@string{sjma="sjma/0036-1410/" + #"SIAM Journal on Mathematical Analysis"} +@string{sjna="sjna/0036-1429/" + #"SIAM Journal on Numerical Analysis"} +@string{sr="sr/0036-1445/" + #"SIAM Review"} +@string{sm="sm/0039-3223/" + #"Studia Mathematica"} +@string{tjm="tjm/0387-3870/" + #"Tokyo Journal of Mathematics"} +@string{ta="ta/0166-8641/" + #"Topology and its Applications"} +@string{t="t/0040-9383/" + #"Topology"} +@string{tams="tams/0002-9947/" + #"Transactions of the American Mathematical Society"} +% +% \end{macrocode} +% +% \section{To Do} +% +% ---When there is no author or editor info to create a label from: Use +% the initial letters of all the words in the title. Plus the year. +% Maybe year first. +% +% ---Add linelength and indent options to control the output? +% +% ---Discuss apacite "originalfoo" fields etc. +% +% ---Discuss Beebe's work. +% +% ---Add bibliography. +% +% ---Add AUDIO, VIDEO entry types. +% +% ---Add a field for MR subject classification numbers and the like? +% +% ---Write a converter to convert from typical .bib data to preferred +% form. Have to go via perl or something to capture STRING defs and +% PREAMBLE and interspersed comments? Or emacs lisp? Provide .bst +% version as fallback. +% +% ---Alpha labels: add numbers after sorting? subscript option? L3Y2a +% option. +% +% ---Test multi-author articles with ten-plus authors. What happens +% with the alpha labels then? +% +% ---For url field especially, check length and prebreak by hand instead +% of relying on \bibtex/'s slapdash stick-in-a-percent-at-column-72 +% regardless of where it happens to fall. +% +% ---How about a general `contributor' field. +% +% ---Test with a wimpy older version of \bibtex/. +% +% \CheckSum{24} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/amsxtra.dtx b/Master/texmf-dist/source/latex/amslatex/amsxtra.dtx new file mode 100644 index 00000000000..b0f19da7d07 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/amsxtra.dtx @@ -0,0 +1,136 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "amsxtra.dtx", +%%% version = "1.2c", +%%% date = "1999/11/15", +%%% time = "14:15:41 EST", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1995, 1999 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% checksum = "41382 136 533 5124", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, accentedsymbol, fracwithdelims, sphat", +%%% supported = "yes", +%%% abstract = "This package contains some seldom-used commands +%%% ported from AMS-TeX in 1989.", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +%\iffalse +%<*driver> +\documentclass{amsdtx} +\begin{document} +\title{The \pkg{amsxtra} package} +\author{American Mathematical Society\\Michael Downes} +\date{Version \fileversion, \filedate} +\hDocInput{amsxtra.dtx} +\end{document} +% +%\fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% The \pkg{amsxtra} package contains a few rarely used commands that +% were present in version 1.1 of the \pkg{amstex} package: +% \cn{fracwithdelims}, {accentedsymbol}, \cn{sphat}, \cn{spcheck}, +% \cn{sptilde}, \cn{spdot}, \cn{spddot}, \cn{spdddot}, \cn{spbreve}. +% If any of these commands were used in existing documents, the +% \pkg{amsxtra} package provides a way to get them. But for 99\% of +% documents using the \pkg{amstex} package these commands are just +% wasted overhead. +% +% \StopEventually{} +% +% \begin{macrocode} +\ProvidesPackage{amsxtra}[1999/11/15 v1.2c] +% \end{macrocode} +% We need to ensure that either the \pkg{amstex} package or the +% \pkg{amsmath} package is loaded. This means we need something a +% little more complicated than \cn{RequirePackage}. +% \begin{macrocode} +\@ifpackageloaded{amstex}{}{% + \RequirePackage{amsmath}[1996/10/01 v1.2]} +% \end{macrocode} +% +% Superscripted accent characters. +% \begin{macrocode} +\def\sphat{^{\mathchoice{}{}% + {\,\,\smash[b]{\hbox{\lower4\ex@\hbox{$\m@th\widehat{\null}$}}}}% + {\,\smash[b]{\hbox{\lower3\ex@\hbox{$\m@th\hat{\null}$}}}}}} +\def\spcheck{^\vee} +\def\sptilde{^\sim} +\def\spdot{^{\hbox{\raise\ex@\hbox{\normalfont .}}}} +\def\spddot{^{\hbox{\raise\ex@\hbox{\normalfont ..}}}} +\def\spdddot{^{\hbox{\raise\ex@\hbox{\normalfont...}}}} +\def\spbreve{^{\!\smash[b]{\hbox{\lower4\ex@\hbox{\u{}}}}}} +% \end{macrocode} +% +% The \cn{fracwithdelims} command is skipped if the base package is +% \pkg{amsmath}; it is only needed if the base package is +% \pkg{amstex}. +% \begin{macrocode} +\@ifpackageloaded{amstex}{% +\def\fracwithdelims#1#2{\new@ifnextchar[{\fracwithdelims@#1#2}% + {\fracwithdelims@#1#2[\@empty]}} +\def\fracwithdelims@#1#2[#3]#4#5{\relax + \ifx\@empty#3{#4\overwithdelims#1#2#5}\else + {#4\abovewithdelims#1#2#3\relax#5}\fi} +}{} +% \end{macrocode} +% +% Perhaps |\accentedsymbol| should use |\newsavebox|, but I don't +% know of any compelling reason at the moment.[mjd,5-Sep-1994] +% |\accentedsymbol| can only produce a single size of +% the given symbol, so you'd need two different versions for main +% size and subscript size. +% \begin{macrocode} +\def\accentedsymbol#1#2{% + \expandafter\newbox + \csname\expandafter\@gobble\string#1@box\endcsname + \expandafter\setbox + \csname\expandafter\@gobble\string#1@box\endcsname + \hbox{$\m@th#2$}% + \newcommand{#1}{% + \expandafter\copy + \csname\expandafter\@gobble\string#1@box\endcsname{}}% +} +% \end{macrocode} +% +% Change the definition of \qc{\~} to automatically remove a +% preceding space as well as a following space, if present. +% \begin{macrocode} +\def~{\nobreakspace} +\DeclareRobustCommand{\nobreakspace}{\unskip\nobreak\ \ignorespaces} +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{113} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/ifoption.dtx b/Master/texmf-dist/source/latex/amslatex/ifoption.dtx new file mode 100644 index 00000000000..4bb4670a72a --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/ifoption.dtx @@ -0,0 +1,170 @@ +%%% ==================================================================== +%%% @LaTeX-doc-source-file{ +%%% filename = "ifoption.dtx", +%%% version = "1.02", +%%% date = "2002/03/04", +%%% time = "16:33:16 EST", +%%% author = "Michael J Downes", +%%% address = "American Mathematical Society, +%%% Publications Technical Group, +%%% PO Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% email = "tech-support@ams.org", +%%% URL = "http://www.ams.org/", +%%% abstract = "", +%%% checksum = "06695 170 563 5432", +%%% docstring = "The checksum field, produced by Robert Solovay's +%%% checksum utility, gives CRC-16 checksum, lines, +%%% words, and characters.", +%%% } +%%% ==================================================================== +% \iffalse +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\documentclass{amsdtx} +\providecommand{\mdash}{\textemdash} +\newcommand{\xt}[1]{\texttt{#1}} +\providecommand{\qq}[1]{``#1''} +\providecommand{\lat}[1]{\protect\LaTeX{}} +\begin{document} +\title{The \pkg{ifoption} package} +\author{Michael~J. Downes\\American Mathematical Society} +\date{Version \fileversion, \filedate} +\hDocInput{ifoption.dtx} +\end{document} +% +% \fi +% +% \maketitle +% \section{Introduction} +% +% The \pkg{ifoption} package provides an \cn{IfOption} command that +% has certain advantages over the \cs{@ifpackagewith} command\mdash +% e.g., default options specified with \cs{ExecuteOptions} test as +% true rather than false. In order for this to work properly, +% mutually exclusive options should be specified with +% \cs{DeclareExclusiveOptions}, another command defined by the +% \pkg{ifoption} package. +% \StopEventually{} +% +% \section{Implementation} +% \subsection{Package info} +% +% Standard declaration of package name and date. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ifoption}[2002/03/04 v1.02] +% \end{macrocode} +% +% \subsection{Some utility functions} +% +% \begin{macrocode} +\let\@xp\expandafter \let\@nx\noexpand +% \end{macrocode} +% +% \begin{macrocode} +\def\@True{00} +\def\@False{01} +% \end{macrocode} +% +% \subsection{Background} +% See the definitions of \cs{@onefilewithoptions} and +% \cs{@pushfilename} in the \lat/ kernel. +% +% When we have +%\begin{verbatim} +%\DeclareOption{foo}{some code} +%\end{verbatim} +% in a file named \fn{bar.sty}, \lat/ defines \cs{ds@foo} to contain +% \emph{some code}. Then if the package is invoked with +%\begin{verbatim} +%\usepackage[foo]{bar} +%\end{verbatim} +% there are two consequences: \opt{foo} is added to the options list +% for package \pkg{bar}, which is the control sequence +% \cs{opt@bar.sty}; and when \cs{ProcessOptions} is called, it +% executes \cs{ds@option-name} for each option found in the list. +% When it is finished running the options, \cs{ProcessOptions} +% undefines all the \cs{ds@whatever} for the current package, which +% are listed in the control sequence \cs{@declaredoptions}. At the +% end of \fn{bar.sty}, \cs{@declaredoptions} is globally reset to +% empty. Thus subordinate packages with options cannot be loaded in +% the \qq{first half} of a package that also has options, where first half +% means the area leading up to the \cs{ProcessOptions} call. +% +% For mutually exclusive options \xt{a}, \xt{b}, \xt{c}, when option +% \xt{b} is invoked it should remove all of its sibling options from +% the options-actually-used list and add itself to the list. For this +% task we make use of the fact that \cs{ProcessOptions} ends by +% undefining all the declared options of the current package or +% documentclass. +% +% \begin{macrocode} +\def\CurrentPackage{\@currname} +\let\CurrentClass\CurrentPackage +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\IfOption}{} +\def\IfPackageOption{\@ifpackagewith} +\def\IfClassOption{\@ifclasswith} +\def\IfOption{% + \ifx\@currext\@pkgextension \@xp\IfPackageOption + \else \@xp\IfClassOption + \fi + \@currname +} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\DeclareExclusiveOptions}[1]{% + \xdef\@declaredoptions{\@declaredoptions,#1}% + \gdef\ProcessExclusiveOptions{\relax}% + \@for\CurrOption:=#1\do{% + \@xp\deo@a\csname ds@\CurrOption\@xp\endcsname\@xp{\CurrOption}{#1}% + }% +} +\def\DeclareBooleanOption{\DeclareExclusiveOptions} +% \end{macrocode} +% +% \begin{macrocode} +\def\deo@a#1#2#3{% + \def#1{% + \g@addto@macro\ProcessExclusiveOptions{\OptionsFalseTrue{#3}{#2}}% + }% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\cull@options#1,{% + \@xp\ifx\csname ds@#1\@gobble\@percentchar\@empty\endcsname\@False + \else #1,\fi + \cull@options +} + +\newcommand{\OptionsFalseTrue}[2]{% + \begingroup + \@for\CurrentOption:=#1\do{% + \@xp\let\csname ds@\CurrentOption\endcsname\@False + }% + \let\ds@\@False + \@xp\xdef\csname opt@\@currname.\@currext\endcsname{% + \@xp\@xp\@xp\cull@options\csname opt@\@currname.\@currext\endcsname +% \end{macrocode} +% Lacking \cs{@secondofthree} and not keen on defining it \ldots +% \begin{macrocode} + ,\@firstoftwo\@firstoftwo,#2% + }% + \endgroup +} +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{112} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/mathscinet.dtx b/Master/texmf-dist/source/latex/amslatex/mathscinet.dtx new file mode 100644 index 00000000000..78e01159ad6 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/mathscinet.dtx @@ -0,0 +1,595 @@ +%%% ==================================================================== +%%% @LaTeX-doc-source-file{ +%%% filename = "mathscinet.dtx", +%%% version = "2.01", +%%% date = "2004/06/30", +%%% time = "12:00:17 EDT", +%%% author = "Michael J Downes and David M. Jones", +%%% address = "American Mathematical Society, +%%% Publications Technical Group, +%%% PO Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% email = "tech-support@ams.org", +%%% URL = "http://www.ams.org/", +%%% abstract = "", +%%% checksum = "34681 595 2175 20194", +%%% docstring = "The checksum field, produced by Robert Solovay's +%%% checksum utility, gives CRC-16 checksum, lines, +%%% words, and characters.", +%%% } +%%% ==================================================================== +%%% +% \iffalse +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\documentclass[draft]{amsdtx} + +\usepackage{mathscinet} + +\newcommand{\uchar}[1]{{\small \texttt{U+#1}}} + +\newcommand{\enc}{\texttt} + +\newenvironment{chartable}{% + \begin{tabular}{% + l@{\extracolsep{1em}}% + l@{\extracolsep{1em}}% + r@{\extracolsep{2em}}% + l@{\extracolsep{1em}}% + l@{\extracolsep{1em}}% + r}% +}{% + \end{tabular}% +} + +\makeatletter + +\DeclareTextCommandDefault{\xudot}{\@underaccent\@empty{'137}} + +\makeatother + +\MakeShortVerb{\|} + +\begin{document} +\title{The \pkg{mathscinet} package} +\author{American Mathematical Society} +\date{Version \fileversion, \filedate} +\hDocInput{mathscinet.dtx} +\end{document} +% +% \fi +% +% \maketitle +% \section{Introduction} +% +% The \pkg{mathscinet} packages provides definitions for certain +% commands that occasionally occur in bibliographic data exported +% from MathSciNet and that are not provided by \latex/. +% +% \textbf{Warning:} Although the macros provided in this package +% are probably acceptable if all you need to do is format an entry +% downloaded from MathSciNet, they should probably not be used for +% other purposes. In general, if you are trying to typeset +% material in any languages that require these characters, you are +% better off using specialized fonts and encodings for those +% languages. +% +% All Unicode character references are taken from \emph{The Unicode +% Standard, Version~3.0} (Addison-Wesley, 2000). +% +% \StopEventually{} +% +% \section{Implementation} +% Standard declaration of package name and date. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{mathscinet}[2002/04/17 v1.05] +\RequirePackage{textcmds}\relax +% \end{macrocode} +% +% \begin{macro}{\setboxz@h} +% A useful abbreviation borrowed from \pkg{amsgen}. +% \begin{macrocode} +\providecommand\setboxz@h{\setbox\z@\hbox} +% \end{macrocode} +% \end{macro} +% +% \subsection{Math font commands} +% +% \begin{macro}{\bold} +% \begin{macro}{\scr} +% These are simple aliases of core \latex/ commands. +% \begin{macrocode} +\providecommand{\bold}{\mathbf} +\providecommand{\scr}{\mathcal} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\germ} +% Since this doesn't correspond to a core \latex/ command, we +% generate an error if no appropriate definition is available. +% \begin{macrocode} +\AtBeginDocument{% + \@ifundefined{mathfrak}{% + \providecommand{\germ}{% + \PackageError{mathscinet}{To use the \string\germ\space + command, please load the amsfonts package}\@ehc + }% + }{% + \providecommand{\germ}{\mathfrak}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\romsup} +% \begin{macro}{\asup} +% The \cs{tsup} command comes from the \pkg{textcmds} package. +% \begin{macrocode} +\providecommand{\romsup}{\tsup} +\providecommand{\asup}{\tsup} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\hslash} +% Planck's constant over~$2\pi$:~$\hslash$ (\uchar{210F}). +% +% If the \pkg{amssymb} package isn't loaded, we just want this to +% be an alias for |\hbar|, which is defined in the \latex/ kernel +% (and then redefined by the \pkg{amssymb} package). If the +% \pkg{amssymb} package is loaded, we want to use its definition +% of~|\hslash|. To prevent problems if \pkg{amsrefs} is loaded +% before \pkg{amssymb}, we defer our definition of \cn{hslash} +% until after all packages have been loaded. +% \begin{macrocode} +\AtBeginDocument{\providecommand{\hslash}{\hbar}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Arabic transliteration} +% +% \begin{macro}{\rasp} +% Transliteration of the Arabic letter \emph{hamza} +% (\uchar{0621}):~\rasp\ (\uchar{02BE}). +% \begin{macrocode} +\ProvideTextCommandDefault{\rasp}{\leavevmode\raise.45ex\hbox{$\rhook$}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lasp} +% Transliteration of the Arabic letter \emph{ain} +% (\uchar{0639}):~\lasp\ (\uchar{02BF}). +% \begin{macrocode} +\ProvideTextCommandDefault{\lasp}{\leavevmode\raise.45ex\hbox{$\lhook$}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Latin Extended-A (\texttt{latin1}) characters} +% +% These are based on Barbara Beeton's definitions from +% \fn{amsclass.dtx}. +% +% \begin{macro}{\Dbar} +% Latin capital letter D with stroke:~\Dbar\ (\uchar{0110}). In the +% T1 encoding, we just use |\DJ|; otherwise we fake it. +% \begin{macrocode} +\ProvideTextCommand{\Dbar}{T1}{\DJ} + +\ProvideTextCommandDefault{\Dbar}{% + \leavevmode\lower.5ex\rlap{\hskip-.07em\accent"16}D% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dbar} +% Latin lower letter~d with stroke:~\dbar\ (\uchar{0111}). In the +% T1 encoding, we just use |\dj|; otherwise we fake it. +% \begin{macrocode} +\ProvideTextCommand{\dbar}{T1}{\dj} +% \end{macrocode} +% If it looks like this is a small-caps font, we adjust the spacing +% appropriately. +% \begin{macrocode} +\ProvideTextCommandDefault{\dbar}{% + \begingroup + \edef\@tempa{\scdefault}% + \ifx\@tempa\f@shape + \dimen@-.75ex + \dimen@i-.08em + \else + \dimen@.02ex + \dimen@i.1em + \fi + \leavevmode\raise\dimen@\rlap{\hskip\dimen@i\char"16}d% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Cyrillic transliteration} +% +% \begin{macro}{\cprime} +% Transliteration of the Cyrillic letter soft sign +% (\uchar{042C}):~\cprime. +% \begin{macrocode} +\ProvideTextCommandDefault{\cprime}{\tprime} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cdprime} +% Transliteration of the Cyrillic letter hard sign +% (\uchar{042A}):~\cdprime. +% \begin{macrocode} +\ProvideTextCommandDefault{\cdprime}{\tprime\tprime} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bud} +% Ditto. +% \begin{macrocode} +\ProvideTextCommandDefault{\bud}{\cdprime} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cydot} +% Vertically centered dot. +% \begin{macrocode} +\ProvideTextCommandDefault{\cydot}{\leavevmode\raise.4ex\hbox{.}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Miscellaneous diacritics (aka Frankenstein's\\ +% diacritics)} +% +% \begin{macro}{\save@sf} +% When putting together an accented character from bits and pieces, +% the |\spacefactor| of the base character often gets lost in the +% shuffle. We use essentialy the same technique as |\add@accent| +% to save and restore the spacefactor, but we wrap in in a pair of +% macros for convenience. +% \begin{macrocode} +\def\save@sf{% + \ifmmode\else\global\mathchardef\accent@spacefactor\spacefactor\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\restore@sf} +% And here's the corresponding restore. +% \begin{macrocode} +\def\restore@sf{\ifmmode\else\spacefactor\accent@spacefactor\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@underaccent} +% This is perhaps the most interesting macro in this package (which +% admittedly isn't saying much). It attempts to convert a character +% (usually one of the standard above-letter diacritics like~\"{}) +% into an underhanging diacritic (like~\dudot{\hbox to +% .5em{\hss}}). This is similar in spirit to the way that the +% \enc{OT1} \cn{b} command converts a macron into a bar-under +% accent, or the way that \cn{d} converts a period into an +% underhanging dot. However, the technique used here is a little +% more complicated and, hopefully, a little more general, in the +% sense of requiring fewer ad-hoc parameters. It only contains one +% magic constant (.2\,ex), which seems to provide reasonable +% results for all of the Computer Modern fonts. +% +% The basic algorithm is as follows: +% +% \begin{enumerate} +% +% \item +% Create a box~$B$ containing the base character at its natural +% height, depth, and width. +% +% \item +% Create a box~$d$ consisting of the diacritic centered in a space +% equal to the width of~$B$. +% +% \item +% Lower box~$d$ by the sum of its height (to bring the top of~$d$ +% down to the baseline) plus the depth of $B$ (to bring the top +% of~$d$ down to the bottom of~$B$) plus .2\,ex (to provide the +% spacing between the bottom of the letter and the top of the +% diacritic). Call the new box~$d'$. +% +% \item +% Create a new box~$C$ by superimposing boxes $B$ and~$d'$. +% +% \item +% If the height of~$d$ was greater than 1\,ex, reset the depth of +% box~$C$ to the sum of the depth of~$B$ and 1\,ex less than the +% height of~$d$. (See the appendix for a discussion of this step.) +% +% \end{enumerate} +% +% \begin{macrocode} +\def\@underaccent#1#2#3{% + \leavevmode + \begingroup + \ifmmode\let\@mathtoggle$\else\let\@mathtoggle\relax\fi + \setboxz@h{\@mathtoggle#3\save@sf\@mathtoggle}% + \setbox\@ne\hb@xt@\wd\z@{% + \hss\fontshape\updefault\rmfamily#1\char#2\hss + }% + \dimen@\ht\@ne + \advance\dimen@\dp\z@ + \advance\dimen@.2ex + \setboxz@h{\lower\dimen@\rlap{\copy\@ne}\unhbox\z@}% + \ifdim\ht\@ne>1ex + \advance\dimen@-1.2ex + \dp\z@\dimen@ + \fi + \box\z@ + \restore@sf + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\utilde} +% Tilde below (\uchar{0330}): +% +% \begin{chartable} +% |\utilde{E}| & \utilde{E} & \uchar{1E1A} & +% |\utilde{e}| & \utilde{e} & \uchar{1E1B} \\ +% |\utilde{I}| & \utilde{I} & \uchar{1E2C} & +% |\utilde{i}| & \utilde{i} & \uchar{1E2D} \\ +% |\utilde{U}| & \utilde{U} & \uchar{1E74} & +% |\utilde{u}| & \utilde{u} & \uchar{1E75} +% \end{chartable} +% \begin{macrocode} +\DeclareTextCommandDefault{\utilde}{\@underaccent\@empty{`\~}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\uarc} +% Breve below (\uchar{032E}): +% +% \begin{chartable} +% |\uarc{H}| & \uarc{H} & \uchar{1E2A} & +% |\uarc{h}| & \uarc{h} & \uchar{1E2B} +% \end{chartable} +% \begin{macrocode} +\DeclareTextCommandDefault{\uarc}{\@underaccent\@empty{'025}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lfhook} +% Comma below (\uchar{0326}): +% +% \begin{chartable} +% |\lfhook{S}| & \lfhook{S} & \uchar{0218} & +% |\lfhook{s}| & \lfhook{s} & \uchar{0219} \\ +% |\lfhook{T}| & \lfhook{T} & \uchar{021A} & +% |\lfhook{t}| & \lfhook{t} & \uchar{021B} +% \end{chartable} +% \begin{macrocode} +\DeclareTextCommandDefault{\lfhook}{\@underaccent\supsize{`\,}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dudot} +% Diaeresis below (\uchar{0324}): +% +% \begin{chartable} +% |\dudot{U}| & \dudot{U} & \uchar{1E72} & +% |\dudot{u}| & \dudot{u} & \uchar{1E73} +% \end{chartable} +% \begin{macrocode} +\DeclareTextCommandDefault{\dudot}{\@underaccent\@empty{'177}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\udot} +% Dot below (\uchar{0323}): There are two options for implementing +% this: either map to the standard \cn{d} accent or define using +% \cs{@underaccent}. If we choose the former, we have two +% problems: (a)~when applied to capital letters, the standard +% \enc{T1} and \enc{OT1} implementations of~|\d| produce +% \cs{spacefactor}s of~1000 instead of~999, and (b)~the +% underspacing of the \cs{udot} accent will differ from that of the +% \cs{dudot} accent:~\udot{x}\dudot{x}. On the other hand, if we +% choose the latter, course, \cn{d} and \cn{udot} will +% differ:~\d{x}\xudot{x}. +% Neither solution appeals, but it's easier to stick with~\cs{d}, +% so that's what I'll do. +% \begin{macrocode} +\DeclareTextCommandDefault{\udot}{\d} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\polhk} +% Ogonek (Polish hook) (\uchar{0328}): +% +% \begin{chartable} +% |\polhk{A}| & \polhk{A} & \uchar{0104} & +% |\polhk{a}| & \polhk{a} & \uchar{0105} \\ +% |\polhk{E}| & \polhk{E} & \uchar{0118} & +% |\polhk{e}| & \polhk{e} & \uchar{0119} \\ +% |\polhk{I}| & \polhk{I} & \uchar{012E} & +% |\polhk{i}| & \polhk{i} & \uchar{012F} \\ +% |\polhk{U}| & \polhk{U} & \uchar{0172} & +% |\polhk{u}| & \polhk{u} & \uchar{0173} \\ +% |\polhk{O}| & \polhk{O} & \uchar{01EA} & +% |\polhk{o}| & \polhk{o} & \uchar{01EB} +% \end{chartable} +% +% The \enc{T1} and \enc{OT4} encodings implement the |\k| accent, +% so we just use it for most characters, although we will +% supplement them later with +% \begin{macrocode} +\DeclareTextCommand{\polhk}{OT4}{\k} +\DeclareTextCommand{\polhk}{T1}{\k} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextCommand{\polhk}{OT1}[1]{\TextSymbolUnavailable{\k{#1}}#1} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextCompositeCommand{\polhk}{OT1}{a}{\msc@ogonek {.6}{.07} a} +\DeclareTextCompositeCommand{\polhk}{OT1}{A}{\msc@ogonek {.6}{.07} A} +\DeclareTextCompositeCommand{\polhk}{OT1}{e}{\msc@ogonek 0 {.06} e} +\DeclareTextCompositeCommand{\polhk}{OT1}{E}{\msc@ogonek{.35}{.07} E} +\DeclareTextCompositeCommand{\polhk}{OT1}{i}{\msc@ogonek {.2}{.07} i} +\DeclareTextCompositeCommand{\polhk}{OT1}{I}{\msc@ogonek {.2}{.07} I} +\DeclareTextCompositeCommand{\polhk}{OT1}{u}{\msc@ogonek {.6}{.07} u} +\DeclareTextCompositeCommand{\polhk}{OT1}{U}{\msc@ogonek 0 {.05} U} +\DeclareTextCompositeCommand{\polhk}{OT1}{o}{\msc@ogonek 0 {.07} o} +\DeclareTextCompositeCommand{\polhk}{OT1}{O}{\msc@ogonek 0 {.05} O} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextCompositeCommand{\polhk}{T1}{i}{\msc@ogonek@a 0 i} +\DeclareTextCompositeCommand{\polhk}{T1}{I}{\msc@ogonek@a 0 I} +\DeclareTextCompositeCommand{\polhk}{T1}{u}{\msc@ogonek@a {.6} u} +\DeclareTextCompositeCommand{\polhk}{T1}{U}{\msc@ogonek@a 0 U} +\DeclareTextCompositeCommand{\polhk}{T1}{o}{\msc@ogonek@a 0 o} +\DeclareTextCompositeCommand{\polhk}{T1}{O}{\msc@ogonek@a 0 O} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextCompositeCommand{\polhk}{OT4}{i}{\msc@ogonek {.2}{.07} i} +\DeclareTextCompositeCommand{\polhk}{OT4}{I}{\msc@ogonek {.2}{.07} I} +\DeclareTextCompositeCommand{\polhk}{OT4}{u}{\msc@ogonek {.6}{.07} u} +\DeclareTextCompositeCommand{\polhk}{OT4}{U}{\msc@ogonek 0 {.05} U} +\DeclareTextCompositeCommand{\polhk}{OT4}{o}{\msc@ogonek 0 {.07} o} +\DeclareTextCompositeCommand{\polhk}{OT4}{O}{\msc@ogonek 0 {.05} O} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\msc@ogonek} +% \begin{macrocode} +\def\msc@ogonek#1#2#3{% + \begingroup + \setboxz@h{#3\save@sf}% + \dimen@\wd\z@ + \ooalign{% + \unhbox\z@\crcr + \hidewidth + \setboxz@h{\kern#1\dimen@\supsize$\lhook$}% + \dimen@\ht\z@ + \advance\dimen@-#2ex\relax + \lower\dimen@\box\z@ + \hidewidth + }% + \restore@sf + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\msc@ogonek@a} +% \begin{macrocode} +\def\msc@ogonek@a#1#2{% + \begingroup + \ooalign{% + #2\save@sf\crcr + \hidewidth + \raise0.02ex\hbox{\kern#1ex\char'014}% + \hidewidth + }% + \restore@sf + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\soft} +% Polish `soft' letters T, D, L: +% +% \begin{chartable} +% |\soft{T}| & \soft{T} & \uchar{0164} & +% |\soft{t}| & \soft{t} & \uchar{0165} \\ +% |\soft{D}| & \soft{D} & \uchar{010E} & +% |\soft{d}| & \soft{d} & \uchar{010f} \\ +% |\soft{L}| & \soft{L} & \uchar{013B} & +% |\soft{l}| & \soft{l} & \uchar{013C} +% \end{chartable} +% \begin{macrocode} +\DeclareTextCommand{\soft}{OT4}{\v} +\DeclareTextCommand{\soft}{T1}{\v} +\DeclareTextCommand{\soft}{OT1}{\v} + +\DeclareTextCompositeCommand{\soft}{OT1}{t}{\msc@soft{t}\@ne{.5ex}} +\DeclareTextCompositeCommand{\soft}{OT1}{d}{\msc@soft{d}{.925}{.95ex}} +\DeclareTextCompositeCommand{\soft}{OT1}{l}{\msc@soft{l}{.95}{.4ex}} +\DeclareTextCompositeCommand{\soft}{OT1}{L}{\msc@soft{L}{.975}{.8ex}} + +\DeclareTextCompositeCommand{\soft}{OT4}{t}{\msc@soft{t}\@ne{.5ex}} +\DeclareTextCompositeCommand{\soft}{OT4}{d}{\msc@soft{d}{.925}{.95ex}} +\DeclareTextCompositeCommand{\soft}{OT4}{l}{\msc@soft{l}{.95}{.4ex}} +\DeclareTextCompositeCommand{\soft}{OT4}{L}{\msc@soft{L}{.975}{.8ex}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\msc@soft} +% \begin{macrocode} +\def\msc@soft#1#2#3{% + \leavevmode + \begingroup + \setboxz@h{#1}% + \raise#2\ht\z@\rlap{\kern#3\supsize,}\unhbox\z@ + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \section*{\raggedright Appendix: Plumbing the depths of +% underhanging diacritics: Notes on the magic constant 0.2\,ex and +% an exegesis of certain obscure corners of the \cn{@underaccent} +% macro} +% +% \tex/ assumes that a combining accent can be superimposed +% directly on top of any character whose height is 1\,ex. If the +% actual height of the base character differs from 1\,ex, the +% accent is shifted up or down to maintain the same vertical +% separation. Put another way, subtracting 1\,ex from the height +% of a combining accent tells us how much a character's height is +% increased when that accent is added. Call this +% distance~$\delta$. +% +% This distance can be analyzed into two pieces: $\delta = \sigma + +% \eta$, where $\sigma$ is the separation between the top of +% the base character and the \emph{bottom} of the accent, and +% $\eta$ is the height of the bounding box of the accent. +% +% If we now consider moving the accent to the bottom of a +% character, we have a new relation $\delta' = \sigma' + \eta$, +% where $\sigma'$ is the distance between the bottom of the base +% and the \emph{top} of the accent, and $\delta'$ is the amount by +% which the depth of the base character is increased. +% +% If the placement of the underhanging version of an accent were +% strictly symmetrical with the overhanging version, then we would +% have $\sigma' = \sigma$ and thus $\delta' = \delta$. However, the +% placement is not symmetric since for aesthetic reasons we have +% chosen to set $\sigma' = .2\,\mathrm{ex}$, which seems in general +% to be a little less than the corresponding~$\sigma$. +% Unfortunately, this means we can't calculate~$\delta'$ accurately +% since there is no way to deduce $\eta$ (or, equivalently, +% $\sigma$) from the font metric information available to us +% within~\TeX.\footnote{By exploiting symmetries present in some +% fonts, one can calculate $\eta$ for some of the accents in those +% fonts, but this doesn't help us much since both $\sigma$ +% and~$\eta$ vary between accents.} +% +% This leaves us in a bit of a bind, since it means there is no way +% to calculate the depth accurately. In despair, I've decided just +% to pretend that $\delta' = \delta$ for now. +% +% \subsection*{Finis} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{365} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/pcatcode.dtx b/Master/texmf-dist/source/latex/amslatex/pcatcode.dtx new file mode 100644 index 00000000000..192cb201871 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/pcatcode.dtx @@ -0,0 +1,359 @@ +%%% ==================================================================== +%%% @LaTeX-doc-source-file{ +%%% filename = "pcatcode.dtx", +%%% version = "1.04", +%%% date = "2002/04/16", +%%% time = "09:20:52 EDT", +%%% author = "Michael J Downes", +%%% copyright = "Copyright 2001 American Mathematical Society", +%%% address = "American Mathematical Society, +%%% Publications Technical Group, +%%% PO Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% email = "tech-support@ams.org", +%%% URL = "http://www.ams.org/", +%%% abstract = "The pcatcode package changes LaTeX package loading +%%% internals so that all subsequently loaded packages +%%% can rely on having normal catcodes in effect.", +%%% license = "Artistic", +%%% checksum = "25118 359 1469 13319", +%%% docstring = "The checksum field, produced by Robert Solovay's +%%% checksum utility, gives CRC-16 checksum, lines, +%%% words, and characters.", +%%% } +%%% ==================================================================== +% \iffalse +%<*driver> +\documentclass{amsdtx} +%\usepackage{pcatcode}\relax +\begin{document} +\title{The \pkg{pcatcode} package} +\author{Michael~J. Downes\\American Mathematical Society} +\date{Version \fileversion, \filedate} +\hDocInput{pcatcode.dtx} +\end{document} +% +% \fi +% +% \maketitle +% \section{Introduction} +% +% The \pkg{pcatcode} package provides mechanisms for robustly +% changing the catcode environment for the duration of a package and +% restoring it afterwards to whatever it was before the package was +% loaded. +% +% Motivation: The \pkg{amsmath} package (for example), makes a number +% of assignments using characters such as double-quote and +% left-quote, because these are hard-wired into the \tex/ syntax for +% numbers and other things. If a package that makes double-quote an +% active character is loaded before \pkg{amsmath}, all the +% statements that use double-quote turn into error messages. +% +% But now! Groan and grumble no more, ye package writers, for putting +% a magical invocation of the pcatcode package at the beginning of +% your package file, as shown here, will ensure that your +% package contents will be processed with completely normal catcodes. +%\begin{verbatim} +%\NeedsTeXFormat{LaTeX2e}[1995/12/01] +%\@ifundefined{PushCatcodes}{% +% \RequirePackage{pcatcode}\relax\PushCatcodes\NormalCatcodes +%}{} +%\ProvidesPackage{foo}[2002/04/16 v1.04] +%\end{verbatim} +% +% It must be followed by a matching \cs{PopCatcodes} command, +% typically used in conjunction with \cs{endinput}. +% +% WARNING: This functionality would work best if it were built into +% the \LaTeX{}2e kernel, but it cannot be usefully added to the +% kernel now without adversely affecting document compatibility +% across different systems. This package therefore modifies one or +% two of the low-level package-loading functions defined by the +% kernel. This means that there may be trouble if any other package, +% or some future version of \LaTeX{}, changes the definitions of +% those functions. +% +% NOTE: Packages that do not call \cs{PushCatcodes} +% \cs{NormalCatcodes} will remain transparent to the external catcode +% environment in the usual way (i.e., for all characters except the +% \verb'@' character). +% +% \StopEventually{} +% +% \section{Implementation} +% \subsection{Preliminary Remarks} +% +% At the document level, we assume that the following characters +% always have their standard catcode: +% \begin{center} +% \begin{tabular}{lp{.75\columnwidth}} +% \verb'\{}' & for commands and arguments\\ +% \verb'%' & for comments\\ +% \verb'#' & for use with \cn{newcommand}\\ +% \verb'*' & cannot be changed without breaking star-form commands\\ +% \verb'[]' & cannot be changed without breaking optional arguments\\ +% \verb'~' & already active, no reason to change catcode +% \end{tabular} +% \end{center} +% +% One might think that we could assume hyphen, period (and comma, for +% European decimal notation) are always catcode 12. Experience has +% shown, however, that for just about every character there is some +% plausible application that would be facilitated by making that +% character active and giving it a complex definition. Surely hyphen +% and period must stay catcode 12 in order to work in statements like +% the following? +%\begin{verbatim} +%\addtocounter{section}{-1} +%\addtolength{\columnwidth}{-1.5cm} +%\end{verbatim} +% Yet hyphen and period are important constituents of ordinary text +% and therefore special applications arise. For example, +% what if you would like +% mdashes to be surrounded by extra space but your authors prefer to +% continue writing \verb'---' in the accustomed manner? +% +% Theoretically speaking, the \pkg{pcatcode} package itself has to +% guard against the kind of catcode problems that it is intended to +% circumvent. If you would like a nice little \tex/nician's +% exercise, try your hand, before looking at the code below, at the +% task that I set for myself: Find the minimal set of catcode +% assumptions that one has to make before attempting to establish +% normalcy, where normalcy is defined as the state at the end of +% \fn{latex.ltx}, just before the last \cs{makeatother}. This is the +% state that may normally be expected at the beginning of a +% documentclass file, if the \LaTeX{} format file does not have any +% extensions (e.g., babel) compiled in. +% +% Ready to look, now? +% +% In order for the following code to work it is only necessary that +% backslash, letters, and digits have their normal catcodes: 0, 11, +% 12 respectively. One could argue that if \fn{pcatcode.sty} is +% invoked through a standard \cs{RequirePackage} call, it can be +% assumed that curly braces also have their normal catcodes. But I +% suppose it is not utterly inconceivable that in some special +% circumstances one might want to load the package with the +% \cs{@@input} primitive, sans braces. And in any case the extra +% overhead to handle braces as well is trivial so for esthetic +% reasons I'm gonna put it in. +% +% If you look really hard you'll find one or two other assumptions, +% such as ``endlinechar is not a letter''. Wait, come to think of it, +% I can fix that \ldots +% +% The purpose of the group is chiefly to localize the temporarily +% changed definitions of \cs{e}, \cs{n}, etc. +% \begin{macrocode} +\begingroup\let\e\endlinechar\iffalse\ +\fi\chardef\E\e\e13\chardef\n\catcode\e\catcode\e5\relax\relax +\chardef\s\catcode32\chardef\t10\catcode32\t +\chardef\c\catcode37 \catcode37 14 % percent +\chardef\=\catcode61 \catcode61 12 % equal sign +\chardef\l=\catcode123 \catcode123=1 % left brace +\chardef\r=\catcode125 \catcode125=2 % right brace +\chardef\[=\catcode91 \catcode91=12 % left bracket +\chardef\]=\catcode93 \catcode93=12 % right bracket +\chardef\^=\catcode94 \catcode94=7 % hat +\chardef\.=\catcode46 \catcode46=12 % period +\chardef\/=\catcode47 \catcode47=12 % slash +\edef\c{% + \endgroup + \def\noexpand\pcat@restore{% + \catcode\number\e=\number\n \catcode32=\number\s + \catcode123=\number\l \catcode125=\number\r + \catcode37=\number\c \catcode61=\number\=% + \catcode91=\number\[\catcode93=\number\]\catcode94=\number\^% + \catcode46=\number\.\catcode47=\number\/% + \endlinechar=\number\E \relax + }% +} +\c +\endlinechar13\catcode13\string=5\relax\relax +\catcode32\string=10 \catcode37 14\relax\relax +\catcode61 12\catcode123=1\catcode125=2\catcode91=12\catcode93=12\relax +\catcode46=12\catcode47=12\catcode94=7\relax +% \end{macrocode} +% +% This code was postponed until now to avoid all but the most +% essential assumptions. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{pcatcode}[2002/04/16 v1.04] +% \end{macrocode} +% +% \begin{macrocode} +\def\NormalCatcodes{% + \endlinechar=13% + \catcode33=12\catcode34=12\catcode35=6\catcode36=3\catcode37=14% + \catcode38=4\catcode39=12\catcode40=12\catcode41=12\catcode42=12% + \catcode43=12\catcode44=12\catcode45=12\catcode46=12\catcode47=12% + \catcode58=12\catcode59=12\catcode60=12\catcode61=12\catcode62=12% + \catcode63=12\catcode91=12\catcode92=0\catcode93=12\catcode94=7% + \catcode95=8\catcode96=12\catcode123=1\catcode124=12\catcode125=2% + \catcode126=13\catcode32=10\catcode13=5\catcode9=10\catcode10=12% + \relax +} +% \end{macrocode} +% +% \begin{macrocode} +\def\CatcodeStack{} +% \end{macrocode} +% +% Notably absent from the following list: the \verb'@' character and +% whitespace characters. The former is already handled in the +% \LaTeX{} kernel, and I hesitate to interfere with its current +% catcode transitions. +% \begin{macrocode} +\begingroup \escapechar=\m@ne \let\s\string +\xdef\pcat@otherchars{% + \s\!\s\"\s\#\s\$\s\%\s\&\s\'\s\(\s\)\s\*\s +\s\,\s\-\s\.\s\/\s\:% + \s\;\s\<\s\=\s\>\s\?\s\[\s\\\s\]\s\^\s\_\s\`\s\{\s\|\s\}\s\~% +} +\endgroup +% \end{macrocode} +% +% \begin{macrocode} +\gdef\PushCatcodes{% + \xdef\CatcodeStack{% + \expandafter\PushCat@a\pcat@otherchars\ \ + \^^I\^^J{T \@gobbletwo}\@empty + \relax + {\CatcodeStack}}% +} +\def\PushCat@a#1{\catcode\number`#1=\number\catcode`#1 \PushCat@a} +% \end{macrocode} +% +% \begin{macrocode} +\PushCatcodes \NormalCatcodes +% \end{macrocode} +% +% \begin{macrocode} +\def\PopCatcodes{\expandafter\PopCat@a\CatcodeStack} +\def\PopCat@a#1#{#1\xdef\CatcodeStack} +% \end{macrocode} +% +% \subsection{Checking current settings} +% +% This can be used to store a copy of the current settings. Or print +% it with \cs{typeout}. +% \begin{macrocode} +\def\CCSdo#1{ (\string#1\@iden{:\number\catcode`#1)\CCSdo}} +\def\CurrentCatcodesSubset{% + \romannumeral 0\CCSdo\^^I\^^J\^^L\^^M\ \!\"\#\$\%\&\'\(\)\*+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}{\~\@gobbletwo}:\number\catcode`\~)% +} +% \end{macrocode} +% +% \subsection{Futurelet support} +% +% For code that does futureletting to see if a punctuation character +% follows, it is distressing to handle the case when some characters +% might be made active (e.g., by the babel package). +% +% The \cs{FutureLetSetup} function attempts to minimize the +% difficulties by defining canonical control sequences to represent +% all the visible ASCII characters (i.e., ranging from space to +% \qc{\~}, 32--126, plus TAB) whose catcode could be changed without +% transgressing the limits of standard \LaTeX{} syntax. +% \begin{macrocode} +\begingroup\pcat@restore +\begingroup +\catcode`\3="3 \catcode`\4="4 \catcode`\7="7 \catcode`\8="8 +\catcode`\A="A \catcode`\B="B \catcode`\C="C \catcode`\D="D +\gdef\fls@let#1#2{% + \ifx\@@undefined#1\else\errmessage{\string#1 already defined}\fi + \begingroup + \lccode`\3=`#2\lccode`\7=`#2\lccode`\8=`#2% + \lccode`\B=`#2\lccode`\C=`#2\lccode`\D=`#2\relax + \ifnum\catcode`#2=\active + \def\do##1{\noexpand\do\noexpand##1\noexpand}% + \lowercase{% + \xdef\fls@active@characters{% + \fls@active@characters + \do#1D}% + }% + \fi + \aftergroup\global \aftergroup\let \aftergroup#1\aftergroup=% + \lowercase{\aftergroup} % + \lowercase{\expandafter\endgroup + \ifcase\catcode`#2 % + 0\or \bgroup\or \egroup\or 3\or 4\or 5\or 6\or 7\or 8\or 9\or + \@sptoken\or B\or C\else D\fi + }% +} +\endgroup +% \end{macrocode} +% \cs{dl@@dblquote} means ``document-level double quote'': a +% character token number 34 that has the catcode which is in effect +% at \verb'\begin{document}' for double quotes. +% \begin{macrocode} +\gdef\FutureLetSetup{% + \gdef\fls@active@characters{}% +% \end{macrocode} +% This will normally be the same as \cs{@sptoken}. +% \begin{macrocode} + \fls@let\dl@@space\ % + \fls@let\dl@@exclam\!% + \fls@let\dl@@dblquote\"% + \fls@let\dl@@hash\#% + \fls@let\dl@@dollar\$% +% \end{macrocode} +% At document level, this cannot occur as a separate token. +% \begin{macrocode} +% \fls@let\dl@@percent\%% + \fls@let\dl@@ampersand\&% + \fls@let\dl@@rquote\'% + \fls@let\dl@@lparen\(% + \fls@let\dl@@rparen\)% + \fls@let\dl@@star\*% + \fls@let\dl@@plus\+% + \fls@let\dl@@comma\,% + \fls@let\dl@@hyphen\-% + \fls@let\dl@@period\.% + \fls@let\dl@@slash\/% + \fls@let\dl@@colon\:% + \fls@let\dl@@semicolon\;% + \fls@let\dl@@less\<% + \fls@let\dl@@equal\=% + \fls@let\dl@@greater\>% + \fls@let\dl@@question\?% + \fls@let\dl@@lbracket\[% +% \end{macrocode} +% At document level, this cannot occur as a separate token. +% \begin{macrocode} +% \fls@let\dl@@backslash\\% + \fls@let\dl@@rbracket\]% + \fls@let\dl@@hat\^% + \fls@let\dl@@underscore\_% + \fls@let\dl@@lquote\`% +% \end{macrocode} +% Here one would normally use \cs{bgroup}. +% \begin{macrocode} + \fls@let\dl@@lbrace\{% + \fls@let\dl@@vert\|% +% \end{macrocode} +% Here one would normally use \cs{egroup}. +% \begin{macrocode} + \fls@let\dl@@rbrace\}% + \fls@let\dl@@tilde\~% +} +\AtBeginDocument{\FutureLetSetup} +% \end{macrocode} +% +% \begin{macrocode} +\gdef\FutureLetReset{% + \def\do##1##2{\let##1= ##2}% + \fls@active@characters + \let\do\relax +} +\endgroup +% \end{macrocode} +% +% \begin{macrocode} +\endinput \PopCatcodes\pcat@restore +% \end{macrocode} +% +% \CheckSum{530} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/rkeyval.dtx b/Master/texmf-dist/source/latex/amslatex/rkeyval.dtx new file mode 100644 index 00000000000..88d4642df27 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/rkeyval.dtx @@ -0,0 +1,1116 @@ +%%% ==================================================================== +%%% @LaTeX-doc-source-file{ +%%% filename = "rkeyval.dtx", +%%% version = "2.00", +%%% date = "2004/06/28", +%%% time = "15:19:29 EDT", +%%% author = "Michael J Downes and David M. Jones", +%%% address = "American Mathematical Society, +%%% Publications Technical Group, +%%% PO Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% email = "tech-support@ams.org", +%%% URL = "http://www.ams.org/", +%%% abstract = "Key-value scanning functions with more restrictive +%%% syntax than the standard keyval package. This permits +%%% some improvements in the error-checking.", +%%% checksum = "44721 1116 3178 30537", +%%% docstring = "The checksum field, produced by Robert Solovay's +%%% checksum utility, gives CRC-16 checksum, lines, +%%% words, and characters.", +%%% } +%%% ==================================================================== +% \iffalse +%<*driver> +\documentclass[draft,oneside]{amsdtx} +\pagestyle{myheadings} + +\makeatletter +\DeclareRobustCommand{\fld}{\@category@index{field}} +\makeatother + +\DoNotIndex{\@emptytoks,\@temptokenb} + +\CodelineIndex + +\begin{document} +\title{The \pkg{rkeyval} package:\protect\linebreak[1] + Syntactically restricted key-value scanning} +\author{Michael Downes and David M. Jones\\American Mathematical Society} +\date{Version \fileversion, \filedate} +\hDocInput{rkeyval.dtx} +\PrintIndex +\end{document} +% +% \fi +% +% \MakeShortVerb{\|} +% +% \maketitle +% \markboth{The \protect\pkg{rkeyval} package} +% {Version \protect\fileversion, \protect\filedate} +% +% \tableofcontents +% +% \section{Introduction} +% +% The \pkg{rkeyval} package provides functions for scanning key-value +% notation similar to the kind of scanning supported by the standard +% \pkg{keyval} package. However, the syntax is more restrictive in +% order to make some improved error-checking possible. In particular, +% if a comma is omitted between two instances of |key={value}| +% form, the \cn{RestrictedSetKeys} command will spot the missing +% comma and issue a suitable error message (and it will be given at +% the point where the missing comma is detected, before reading any +% further in the \tex/ file). The standard \cn{setkeys} command, by +% contrast, will append the second key name to the value of the first +% key and discard the second value, without any notification to the +% user that anything has gone wrong. But that is partly because the +% standard \cn{setkeys} command allows implied values and does not +% require braces around explicit values (except when necessary to +% hide material that has a syntactic resemblance to a key-value +% pair). With \cn{RestrictedSetKeys} the value must always be present +% and it must be enclosed in braces. +% +%^^A Maybe commas should be optional. +% +% Further restrictions of the \cn{RestrictedSetKeys} command and its +% companion commands reduce memory consumption in certain ways. +% Defining a key creates only one control sequence, a container for +% holding the value. Processing of key values is normally limited to +% storing a value given by the user; any additional processing must +% be supplied separately by the programmer. +% +% Generally speaking, the error-checking done by +% \cn{RestrictedSetKeys} is better for applications where all the +% keys are expected to have textual values, while \cn{setkeys} is +% better when one wants to silently recover as far as possible from +% syntactic errors, instead of notifying the user of the errors; or +% when keys have nontrivial default values (i.e., not empty) or other +% kinds of special processing. +% +% \begin{verbatim} +% \RestrictedSetKeys{setup-code}{group}{code}{key={val}, ...} +%\end{verbatim} +% Normally \cn{RestrictedSetKeys} simply carries out the following +% assignment for each key-value pair: +% \begin{verbatim} +% \def\group'key{val} +%\end{verbatim} +% The first argument is normally empty, but the exact nature of the +% warnings given and other aspects of the processing can be affected +% by putting extra setup code there. The \pkg{amsrefs} package uses +% this to implement a copying operation where field name and value +% are written out immediately to another file instead of being stored +% in the usual way. +% +% Some examples for defining the key names associated with a given +% group. This defines ``title'' as a recognized key for the \fn{bib} +% group: +% \begin{verbatim} +% \DefineSimpleKey{bib}{title} +%\end{verbatim} +% If a key is defined with \cs{DefineSimpleKey}, the result of using +% the same key more than once in a single entry will be an error +% message. +% +% This defines ``title'' to be a repeatable key: +% \begin{verbatim} +% \DefineSupersedingKey{bib}{title} +%\end{verbatim} +% If it occurs more than once, the last value supersedes the earlier +% ones, instead of getting an error. This variation is not needed for +% simple usage, but in more complicated situations where key values +% are combined from multiple sources, it may be useful. +% +% This defines ``author'' to be a repeatable key, with each value +% being appended to a list of values: +% \begin{verbatim} +% \DefineAdditiveKey{bib}{author}{\name} +%\end{verbatim} +% The third argument specifies a wrapper function that should be +% applied to each item in the list. I.e., suppose that two author +% names are given: +% \begin{verbatim} +% author={Smith, J. Q.}, +% author={Taylor, X. Y.}, +%\end{verbatim} +% Then they will be stored in the form +% \begin{verbatim} +% \name{Smith, J. Q.}\name{Taylor, X. Y.} +%\end{verbatim} +% +% This defines ``transition'' to be a dummy key with a value that is +% superficially nonempty but effectly empty: +% \begin{verbatim} +% \DefineDummyKey{bib}{transition} +%\end{verbatim} +% Defining a dummy key like this can be useful in dealing with +% certain boundary situations that sometimes arise. +% +% \StopEventually{} +% +% \section{Implementation} +% Standard declaration of package name and date. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{rkeyval}[2004/05/05 v1.08] +% \end{macrocode} +% +% \begin{macro}{\@xp} +% \begin{macro}{\@nx} +% \begin{macrocode} +\let\@xp\expandafter +\let\@nx\noexpand +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@gobblethree} +% \begin{macro}{\@nilgobble} +% Not in the \latex/ kernel yet. +% \begin{macrocode} +\long\def\@gobblethree#1#2#3{} +\long\def\@nilgobble#1\@nil{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@emptytoks} +% Using \cs{@ifundefined} here avoids problems with really old +% versions of \latex/ that choke on \cs{newtoks} if it is written +% directly in the false branch of a conditional. +% \begin{macrocode} +\@ifundefined{@emptytoks}{\csname newtoks\endcsname\@emptytoks}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@temptokenb} +% \begin{macrocode} +\@ifundefined{@temptokenb}{\csname newtoks\endcsname\@temptokenb}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@append} +% \begin{macrocode} +\def\@append#1#2#3{\@xp\def\@xp#2\@xp{#2#1{#3}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\star@} +% Test for a trailing option marked by a star. Usage: +% \begin{verbatim} +% \newcommand{\blub}[1]{\star@{\blubaux{#1}}{default}} +%\end{verbatim} +% Arg 1 of \cs{star@} is the code to +% be run, arg 2 is the default value of the option (could be empty). +% If arg 1 is \ncn{moo}, this test discards a star and expands to +% \ncn{moo} if a star is found, or expands to |\moo{#2}| if +% not. As the example shows, arg 1 need not be a single token. +% \begin{macrocode} +\def\star@#1#2{% + \def\star@a##1{#1}% + \def\star@b{#1{#2}}% + \futurelet\@let@token\star@test +} + +\def\star@test{\ifx*\@let@token \let\star@b\star@a\fi \star@b} +% \end{macrocode} +% +% Please note: If there is a space before the star, then the star is +% not treated as an option char. +% +% Why use a star? Since it's already part of standard \latex/ +% command syntax, it's unlikely to suffer from catcode changes. +% +% Why not just put the star at the beginning in the usual way? It +% seemed to me that the lack of a trailing option +% feature was a deficiency in current \latex/ and could be given an +% experimental implementation in a package like this without any +% adverse effect on existing documents. +% \end{macro} +% +% Ensure non-weird catcode for relevant characters. +% \begin{macrocode} +\@ifundefined{NormalCatcodes}{\RequirePackage{pcatcode}\relax}{} +\PushCatcodes\NormalCatcodes +% \end{macrocode} +% +% \begin{macro}{\extract@group} +% Extracts ``group'' from |\group'field|. +% \begin{macrocode} +\def\extract@group#1{% + \@xp\extract@group@a\string#1\@nil +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extract@group@a} +% \begin{macrocode} +\def\extract@group@a#1#2'{#2\@nilgobble} +% \end{macrocode} +% \end{macro} +% +% \section{Data structures} +% +% The result of scanning the key/value pairs is an assignment statement +% for \cs{rsk@toks}. For example, consider the entry +% \begin{verbatim} +% \bib{LelekZ1962}{article}{ +% author={Lelek, A.}, +% author={Zaremba, D.}, +% title={Dimensions of irreducible ...}, +% journal={Fund. Math.}, +% date={1962/63}, +% } +%\end{verbatim} +% The scanned result is to assign +% \begin{verbatim} +% \global\rsk@toks{% +% \set:bib'author{Lelek, A.}{}% +% \set:bib'author{Zaremba, D.}{}% +% \set:bib'title{Dimensions of irreducible ...}{}% +% \set:bib'journal{Fund. Math.}{}% +% \set:bib'date{1962/63}{}% +% } +%\end{verbatim} +% The extra empty arguments on each line are for auxiliary +% properties (see below). +% What happens thereafter with \cs{rsk@toks} depends on the code in +% the last arg of \cs{RestrictedSetKeys}. +% +% \section{Auxiliary properties} +% +% Unfortunately, the previous section isn't the entire story. In +% addition to the values of each field, we need to store a set of +% auxiliary properties associated with those values. Note that +% properties are explicitly associated with \emph{values}, not with +% keys, because each value of an additive key could have different +% properties. +% +% All such extra data will be stored in a special field named +% ``aux'', with embedded tags to indicate which field each piece of +% the \fld{aux} field is associated with. The extra bits can be +% extracted on demand using standard techniques, and the primary +% value of each field is not burdened with any attachments, so that +% comparisons or scanning of the field contents can remain as +% simple as possible. +% +% Thus in practice there is at least one bit of auxiliary information +% in every bib item, and our previous example would have the title +% language indicated: +% \begin{verbatim} +% \DSK@def\bib'title{Eine Bemerkung zur Darstellung von Polynomen +% \"{u}ber Verb\"{a}nden}% +% \@append\bib'title\bib'aux{\selectlanguage{german}}% +%\end{verbatim} +% +% \begin{macro}{\set@property} +% \begin{macrocode} +\def\set@property#1{% + \begingroup + \edef\@tempa{\extract@group#1}% + \edef\@tempa{% + \@nx\@append\@nx#1\@xp\@nx\csname \@tempa,aux\endcsname + }% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@property} +% \begin{macrocode} +% \get@property\destination\bib'title +\def\get@property#1#2{% + \get@nth@property#1#2\m@ne +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@nth@property} +% \begin{macrocode} +% \get@nth@property\destination\bib'title N +\def\get@nth@property#1#2#3{% + \begingroup + \edef\@tempa{\extract@group#2}% + \@tempcnta#3\relax + \@tempcntb\z@ + \@xp\scan@properties\@xp#2\csname \@tempa,aux\endcsname + \edef\@tempa{\def\@nx#1{\@tempa}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\scan@properties} +% \begin{macrocode} +\def\scan@properties#1#2{% + \begingroup + \def\@tempa{#1}% + \let\@tempc\@empty + \@xp\find@property #2 \@nil\@nil + \edef\@tempa{\def\@nx\@tempa{\@tempc}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\find@property} +% \begin{macrocode} +\def\find@property#1#2{% + \ifx\@nil#1% + \else + \def\@tempb{#1}% + \ifx\@tempa\@tempb + \ifnum\@tempcnta<\z@ + \def\@tempc{#2}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcnta + \def\@tempc{#2}% + \fi + \fi + \fi + \@xp\find@property + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reset@property} +% \begin{macrocode} +\def\reset@property#1#2{% + \reset@nth@property#1\m@ne{#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reset@nth@property} +% \begin{macrocode} +% \reset@nth@property\bib'title N VALUE +\def\reset@nth@property#1#2#3{% + \begingroup + \edef\@tempa{\extract@group#1}% + \@tempcnta#2\relax + \@temptokena{#3}% + \toks@\@emptytoks + \@tempcntb\z@ + \@xp\reset@scan\@xp#1\csname \@tempa,aux\endcsname + \edef\@tempa{% + \def\@xp\@nx\csname \@tempa,aux\endcsname{\the\toks@}% + }% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reset@scan} +% \begin{macrocode} +\def\reset@scan#1#2{% + \begingroup + \def\@tempa{#1}% + \@xp\reset@scan@a #2 \@nil\@nil + \edef\@tempa{\toks@{\the\toks@}}% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\find@property} +% \begin{macrocode} +\def\reset@scan@a#1#2{% + \ifx\@nil#1% + \else + \def\@tempb{#1}% + \ifx\@tempa\@tempb + \ifnum\@tempcnta<\z@ + \@temptokenb\@temptokena + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcnta + \@temptokenb\@temptokena + \fi + \fi + \else + \@temptokenb{#2}% + \fi + \edef\@tempb{% + \toks@{\the\toks@ \@nx#1{\the\@temptokenb}}% + }% + \@tempb + \@xp\reset@scan@a + \fi +} +% \end{macrocode} +% \end{macro} +% +% \section{Some machinery for finite state automata} +% +% Coincidentally I needed to write two finite state automaton parsers +% for two related packages, so after writing them separately I spent +% some time analyzing the code fragments they shared in common and +% abstracted them so that the cs names could be shared. +% +% \begin{macro}{\fsa@l} +% FSA lookahead. +% \begin{macrocode} +\def\fsa@l{\futurelet\@let@token\fsa@t} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fsa@b} +% FSA bypass a token. Don't delete the space at the end! +% \begin{macrocode} +\def\fsa@b{\afterassignment\fsa@l \let\@let@token= } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fsa@c} +% FSA copy a token (not space, bgroup, egroup). +% \begin{macrocode} +\def\fsa@c#1{\aftergroup#1\fsa@l} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fsa@n} +% FSA next action. This is just a placeholder definition. +% \begin{macrocode} +\let\fsa@n\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fsa@t} +% FSA test. This is just a placeholder definition. +% \begin{macrocode} +\let\fsa@t\@empty +% \end{macrocode} +% \end{macro} +% +% \section{Now some of the real work} +% +% \begin{macro}{\rsk@toks} +% \begin{macrocode} +\newtoks\rsk@toks +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rkvIfEmpty} +% Beginning here. +% \begin{macrocode} +\def\rkvIfEmpty#1#2{% + \@xp\ifx\csname#1'#2\endcsname\@empty + \@xp\@firstoftwo + \else + \@xp\@secondoftwo + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rkvIfAdditive} +% \begin{macrocode} +\def\rkvIfAdditive#1{% + \@xp\let\@xp\@let@token \csname \rkv@setter#1\endcsname + \afterassignment\@nilgobble + \@xp\let\@xp\@let@token \@let@token \@empty\@empty\@nil + \ifx\@let@token\DSK@append + \@xp\@firstoftwo + \else + \@xp\@secondoftwo + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rkv@setter} +% It irritates me that I can't embed the \ncn{csname} and +% \ncn{endcsname} in here. +% \begin{macrocode} +\def\rkv@setter#1{set:\@xp\@gobble\string#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rkv@DSAK} +% Define a simple, superseding, or additive key. +% \begin{macrocode} +\def\rkv@DSAK#1#2{% + \addto@group@reset#1{\let#1\@empty}% + \edef\@tempa{\def\csname \rkv@setter#1\endcsname}% + \@tempa{#2#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rkv@DDK} +% This function is used for a dummy key whose value (expansion) +% should be empty but that should appear non-empty to +% \cs{rkvIfEmpty}. +% \begin{macrocode} +\def\rkv@DDK#1{% + \addto@group@reset#1{\def#1{\@empty}}% + \@xp\let\csname \rkv@setter#1\endcsname\@gobble +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DSK@def} +% \begin{macrocode} +\def\DSK@def#1{% + \ifx#1\@empty\else + \PackageWarningNoLine{rkeyval}% + {Key \string#1 should not be repeated}% + \fi + \DSK@redef#1% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DSK@redef} +% We weed out empty field values for consistency with +% \cs{DSK@append}. +% \begin{macrocode} +\def\DSK@redef#1#2{% + \@ifempty{#2}{\@gobble}{% + \def#1{#2}% + \set@property#1 + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\init@group@reset} +% \begin{macrocode} +\def\init@group@reset#1{% + \begingroup + \edef\@tempb{\@xp\@nx\csname #1@reset\endcsname}% + \@xp\ifx\@tempb\relax + \@xp\xdef\@tempb{\let \csname #1,aux\endcsname\@nx\@empty} + \fi + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addto@group@reset} +% \begin{macrocode} +\def\addto@group@reset#1{% + \begingroup + \edef\@tempa{\extract@group#1}% + \init@group@reset\@tempa + \edef\@tempa{% + \@nx\g@addto@macro\@xp\@nx\csname\@tempa @reset\endcsname + }% + \@xp\endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DefineSimpleKey} +% \begin{macrocode} +\newcommand{\DefineSimpleKey}[2]{% + \@xp\rkv@DSAK + \csname #1'#2\endcsname + {\DSK@def}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DefineSupersedingKey} +% \begin{macrocode} +\newcommand{\DefineSupersedingKey}[2]{% + \@xp\rkv@DSAK + \csname #1'#2\endcsname + {\DSK@redef}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DefineAdditiveKey} +% \begin{macrocode} +\newcommand{\DefineAdditiveKey}[3]{% + \@xp\rkv@DSAK + \csname #1'#2\endcsname + {\DSK@append#3}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DSK@append} +% We weed out empty field values (e.g., |editor={}| or +% \verb*|editor={ }|) because otherwise an additive field could +% end up with a value like |\name{}| which appears non-empty to +% \cs{rkvIfEmpty} but produces no output on the page. +% \begin{macrocode} +\def\DSK@append#1#2#3{% + \@ifempty{#3}{\@gobble}{% + \@append#1#2{#3}% + \set@property#2 + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DefineDummyKey} +% \begin{macrocode} +\newcommand{\DefineDummyKey}[2]{% + \@xp\rkv@DDK \csname #1'#2\endcsname +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\RestrictedSetKeys} +% \begin{macrocode} +\newcommand{\RestrictedSetKeys}[3]{% + \global\rsk@toks\@xp{\csname #2@reset\endcsname}% + \def\rsk@finish{#3}% + \gdef\rsk@set{\@xp\rsk@set@a\csname#2'}% + #1\relax + \begingroup + \rsk@changecase + \aftergroup\rsk@set +% \end{macrocode} +% Start by removing the opening brace. +% \begin{macrocode} + \let\fsa@t\rsk@z + \fsa@l +} +% \end{macrocode} +% \end{macro} +% +% The aftergroup tokens end up looking like this: +% \begin{verbatim} +% \lowercase{\rsk@set FIELDNAME\endcsname} +% --> \@xp\rsk@set@a\csname bib'fieldname\endcsname +% --> \rsk@set@a\bib'abcdef +%\end{verbatim} +% +% \begin{macro}{\rsk@unknown@key} +% \begin{macrocode} +\def\rsk@unknown@key#1{% + \PackageWarning{rkeyval}{Unknown key: \string#1}% + \@xp\def\csname\rkv@setter#1\endcsname {\DSK@redef#1}% +} +% \end{macrocode} +% \end{macro} +% +% \section{The state machine} +% +%\begin{verbatim} +% State 0: Skip opening brace (\rsk@z). +% space -> 0 +% { -> 2 +% other -> error "Missing open brace" +% +% State 1: Skip comma (\rsk@a). +% space -> 1 +% \par -> 1 +% comma -> 2 +% @ -> read optional arg; 1 +% } -> 6 +% other -> error "Missing comma"; 2 +% +% State 2: Find field name (\rsk@b). +% space -> 2 +% \par -> 2 +% comma -> 2 +% letter -> 3 +% { -> error "Missing key name"; 4 +% } -> 6 +% other -> error "Invalid key name character"; 2 +% +% State 3: Scan field name (\rsk@c). +% letter -> 3 +% comma -> error "Invalid key name character"; 3 +% equal -> 4 +% other punct -> 3 +% space -> 4 +% { -> error "Missing equal sign"; 4 +% } -> error "Missing equal sign"; 4 +% other -> error "Invalid key name character"; 3 +% +% State 4: Skip equals (\rsk@d). +% space -> 4 +% equal -> 4 +% { -> 5 +% other -> error "Missing { for value of current key"; 5 +% +% State 5: Read field value (\rsk@set@a). +% any -> 1 +% +% State 6: Done (\rsk@end). +%\end{verbatim} +% +% \begin{macro}{\rsk@z} +% State 0: Skip opening brace. +% \begin{macrocode} +\def\rsk@z{% + \ifx\bgroup\@let@token + \let\fsa@t\rsk@b + \let\fsa@n\fsa@b + \else + \ifx\@sptoken\@let@token + \let\fsa@n\fsa@b + \else + \rsk@errf + \fi + \fi + \fsa@n +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@a} +% State 1: Skip comma. +% \begin{macrocode} +\def\rsk@a{% + \ifx\@let@token\@sptoken + \let\fsa@n\fsa@b + \else + \ifx\@let@token\par + \let\fsa@n\fsa@b + \else + \ifx,\@let@token + \endgroup + \let\fsa@t\rsk@b + \let\fsa@n\fsa@b + \else + \ifx\egroup\@let@token + \endgroup + \let\fsa@n\rsk@end + \else + \endgroup + \let\fsa@n\rsk@erraa + \fi + \fi + \fi + \fi + \fsa@n +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@b} +% State 2: Find field name. +% +% Allow \cs{par} here to permit a blank line after +% the end of one key-val pair and the start of the next (perhaps to +% break up a long list into sections). +% \begin{macrocode} +\def\rsk@b{% + \ifcat\@nx\@let@token A% + \let\fsa@t\rsk@c + \let\fsa@n\fsa@c + \else + \ifx\@sptoken\@let@token + \let\fsa@n\fsa@b + \else + \rsk@bb + \fi + \fi + \fsa@n +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@bb} +% \begin{macrocode} +\def\rsk@bb{% + \ifx,\@let@token + \let\fsa@n\fsa@b + \else + \ifx\bgroup\@let@token + \let\fsa@n\rsk@errb + \else + \ifx\egroup\@let@token + \let\fsa@n\rsk@end + \else + \ifx\par\@let@token + \let\fsa@n\fsa@b + \else + \let\fsa@n\rsk@errc + \fi + \fi + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@c} +% State 3: Scan field name. +% \begin{macrocode} +\def\rsk@c{% + \ifcat\@nx\@let@token A% + \let\fsa@n\fsa@c + \else + \ifx\@sptoken\@let@token + \let\fsa@t\rsk@d + \let\fsa@n\fsa@b + \else + \ifx=\@let@token + \let\saw@equal T% + \let\fsa@t\rsk@d + \let\fsa@n\fsa@b + \else + \rsk@cb + \fi + \fi + \fi + \fsa@n +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@cb} +% \begin{macrocode} +\def\rsk@cb{% + \ifx,\@let@token + \let\fsa@n\rsk@errc + \else + \ifcat\@nx\@let@token .% + \let\fsa@n\fsa@c + \else + \ifx\bgroup\@let@token + \let\fsa@n\rsk@noequal + \else + \ifx\egroup\@let@token + \let\fsa@n\rsk@noequal + \else + \let\fsa@n\rsk@errc + \fi + \fi + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\saw@equal} +% \begin{macrocode} +\let\saw@equal=F +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@d} +% State 4: Skip equals. +% +% If no equal sign ever came +% along, then give a warning about it and set \cs{saw@equal} to true +% so that when \cs{rsk@noequal} cycles through again it will take the +% other branch. +% \begin{macrocode} +\def\rsk@d{% + \ifx\bgroup\@let@token + \ifx\saw@equal T% + \aftergroup\endcsname + \rsk@endcase + \let\fsa@n\endgroup + \else + \let\saw@equal T% + \let\fsa@n\rsk@noequal + \fi + \else + \ifx\@sptoken\@let@token + \let\fsa@n\fsa@b + \else + \ifx=\@let@token + \let\saw@equal T% + \let\fsa@n\fsa@b + \else + \let\fsa@n\rsk@erre + \fi + \fi + \fi + \fsa@n +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@casesensitive} +% \begin{macrocode} +\def\rsk@casesensitive{% + \let\rsk@changecase\@empty + \let\rsk@endcase\@empty +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@startlc} +% \begin{macrocode} +\def\rsk@startlc{\aftergroup\lowercase\aftergroup{\iffalse}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@endlc} +% \begin{macrocode} +\def\rsk@endlc{\iffalse{\fi\aftergroup}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@lowercase} +% \begin{macrocode} +\def\rsk@lowercase{% + \let\rsk@changecase\rsk@startlc + \let\rsk@endcase\rsk@endlc +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\rsk@lowercase +% \end{macrocode} +% +% \begin{macro}{\rsk@resume} +% Here we get improved reporting of error context by changing +% end-of-line to be different from normal space. If we don't find a +% comma on the current line, assume it is an error. +% \begin{macrocode} +\def\rsk@resume{% + \begingroup + \rsk@changecase + \aftergroup\rsk@set + \let\fsa@t\rsk@a + \begingroup + \catcode\endlinechar=\active + \lccode`\~=\endlinechar + \lowercase{\let~\par}% + \fsa@l +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@set@a} +% State 5: Read field value. +% \begin{macrocode} +\def\rsk@set@a#1#2{% + \star@{\rsk@set@b#1{#2}}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@set@b} +% \begin{macrocode} +\def\rsk@set@b#1#2#3{% + \@xp\ifx \csname\rkv@setter#1\endcsname \relax + \rsk@unknown@key#1% + \fi + \edef\@tempa{\@xp\@nx\csname \rkv@setter#1\endcsname}% + \toks@\@xp{\@tempa{#2}{#3}}% + \edef\@tempa{% + \global\rsk@toks{\the\rsk@toks \the\toks@}% + }% + \@tempa + \rsk@resume +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@end} +% State 6: Done. +% +% Lets see, now why did I add this? +% \begin{macrocode} +\def\rsk@end{% + \global\let\rsk@set\rsk@terminate + \rsk@endcase + \endgroup + \endcsname + \afterassignment\rsk@finish + \toks@\bgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@terminate} +% \begin{macrocode} +\def\rsk@terminate{\@xp\@gobble\csname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NoCommaWarning} +% \begin{macrocode} +\def\NoCommaWarning{\PackageWarning{rkeyval}{Missing comma}}% +% \end{macrocode} +% \end{macro} +% +%% % \begin{macro}{\NoCommaError} +%% % \begin{macrocode} +%% \def\NoCommaError{\rsk@err{Missing comma}\@ehc} +%% % \end{macrocode} +%% % \end{macro} +% +% \begin{macro}{\rsk@nocomma} +% \begin{macrocode} +\def\rsk@nocomma{\NoCommaWarning} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@err} +% \begin{macrocode} +\def\rsk@err{\PackageError{rkeyval}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@errf} +% \begin{macrocode} +\def\rsk@errf{\rsk@err{Missing open brace}\@ehc\rsk@b} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@erraa} +% \begin{macrocode} +\long\def\rsk@erraa{\rsk@nocomma \let\fsa@t\rsk@b \fsa@l} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@errb} +% \begin{macrocode} +\def\rsk@errb{\rsk@err{Missing key name}\@ehc\rsk@d} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@errc} +% \begin{macrocode} +\def\rsk@errc{\rsk@err{Invalid key name character}\@ehc\fsa@b} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rsk@noequal} +% \begin{macrocode} +\def\rsk@noequal{\rsk@err{Missing equal sign}\@ehc\rsk@d} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\rsk@erre} +% In this case we guess that the value is without braces but probably +% terminated with a comma. We want to scan up to the comma in order +% to get back in synch. +% \begin{macrocode} +\def\rsk@erre#1,{% + \rsk@err{Missing open brace for key value}\@ehc + \iffalse{\fi + \endgroup + \endcsname + \rsk@endcase }{#1},% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\PopCatcodes +% \end{macrocode} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{871} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/textcmds.dtx b/Master/texmf-dist/source/latex/amslatex/textcmds.dtx new file mode 100644 index 00000000000..cbd82171c0a --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/textcmds.dtx @@ -0,0 +1,283 @@ +%%% ==================================================================== +%%% @LaTeX-doc-source-file{ +%%% filename = "textcmds.dtx", +%%% version = "1.05", +%%% date = "2002/04/16", +%%% time = "08:47:47 EDT", +%%% author = "Michael J Downes", +%%% address = "American Mathematical Society, +%%% Publications Technical Group, +%%% PO Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% email = "tech-support@ams.org", +%%% URL = "http://www.ams.org/", +%%% abstract = "Short forms for textemdash and the other LaTeX +%%% commands that correspond to ligatures of +%%% convenience.", +%%% checksum = "55773 283 1136 10227", +%%% docstring = "The checksum field, produced by Robert Solovay's +%%% checksum utility, gives CRC-16 checksum, lines, +%%% words, and characters.", +%%% } +%%% ==================================================================== +% \iffalse +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\documentclass{amsdtx} +% Undo some things defined by amsdtx.cls +\let\qq=\UnDefined \let\mdash=\UnDefined \let\ndash=\UnDefined +\usepackage{textcmds} +\begin{document} +\title{The \pkg{textcmds} package} +\author{Michael~J. Downes\\American Mathematical Society} +\date{Version \fileversion, \filedate} +\hDocInput{textcmds.dtx} +\end{document} +% +% \fi +% +% \maketitle +% \section{Introduction} +% +% The \pkg{textcmds} package provides shorthand commands for all the +% text symbols that are traditionally produced in \LaTeX{} documents +% by non-letter ligatures. One of the principal benefits of using +% these commands is that it makes translating your document from +% \LaTeX{} to some other form (e.g., HTML) easier and less bug-prone. +% But it also makes your document less dependent on the use of +% special font metric files having the required ligature information, +% and it makes it far easier to achieve special effects for the +%^^A Either don't use \mdash here, or add textcmds pkg in the driver. +% characters in question\textemdash for example, to add or not to add +% a small amount of extra space around an em-dash character. With the +% ligature method you have to manually add the space for each +% instance, whereas if you use the \verb'\mdash' command, it suffices +% to change the definition of \verb'\mdash' to suit your wishes. +% +% All of these definitions use the preferred +% font-encoding-independent \LaTeX{} commands to obtain the +% characters in question. +% \begin{center} +% \begin{tabular}{lll} +% \textbf{Command}& \textbf{Definition}& \textbf{Result}\\ +% \cn{mdash}& \cn{textemdash}& \mdash\\ +% \cn{ndash}& \cn{textendash}& \ndash\\ +% \cn{qd}& \cn{textquestiondown}& \qd\\ +% \cn{xd}& \cn{textexclamdown}& \xd\\ +% \cn{ldq}& \cn{textquotedblleft}& \ldq\\ +% \cn{rdq}& \cn{textquotedblright}& \rdq\\ +% \cn{lq}& \cn{textquoteleft}& \lq\\ +% \cn{rq}& \cn{textquoteright}& \rq +% \end{tabular} +% \end{center} +% +% This package also provides short forms for certain text +% symbols whose generic name is too long for convenient entry. +% (The \cn{cwm} command does not produce visible output but marks +% word boundaries in a compound word.) +% \begin{center} +% \begin{tabular}{lll} +% \textbf{Command}& \textbf{Definition}& \textbf{Result}\\ +% \cn{bul}& \cn{textbullet}& \bul\\ +% \cn{vsp}& \cn{textvisiblespace}& \vsp\\ +% \cn{pdc}& \cn{textperiodcentered}& \pdc\\ +% \cn{vrt}& \cn{textbar}& \vrt\\ +% \cn{cir}& \cn{textasciicircum}& \cir\\ +% \cn{til}& \cn{textasciitilde}& \til\\ +% \cn{bsl}& \cn{textbackslash}& \bsl\\ +% \cn{cwm}& \cn{textcompwordmark}& \cwm +% \end{tabular} +% \end{center} +% +% Finally, a few other miscellaneous commands are provided, including +% a quoting command \cn{qq}. It seems clearly consonant with other +% parts of \LaTeX{} to write \verb'\qq{...}' to quote a word or short +% phrase rather than \verb'\ldq ...\rdq'; and the use of higher-level +% markup is groundwork that must be laid if one should ever want to +% do anything more sophisticated at the boundaries of a quoted +% expression (such as automatically transposing the quote character +% with following punctuation, if traditional rather than logical +% punctuation style is desired). +% +% \begin{center} +% \begin{tabular}{lll} +% \textbf{Example}& \textbf{Definition}& \textbf{Result}\\ +% \verb'\qq{some text}'& \verb'\ldq#1\rdq'& \qq{some text}\\ +% \verb'\lara{some text}'& \verb'\textlangle#1\textrangle'& +% \lara{some text}\\ +% \verb'Jello\tsup{TM}'& \textit{raise .9ex}\verb'{\supsize#1}'& +% Jello\tsup{TM}\\ +% \verb'Jello\tsub{TM}'& \textit{lower .6ex}\verb'{\supsize#1}'& +% Jello\tsub{TM}\\ +% \verb'a\tprime b'& \verb'\tsup{\textprimechar}'& +% a\tprime b +% \end{tabular} +% \end{center} +% +% \StopEventually{} +% +% \begin{macrocode} +%<*pkg> +% \end{macrocode} +% +% \section{Implementation} +% +% Package name, date, version number. +% \begin{macrocode} +\ProvidesPackage{textcmds}[2002/04/16 v1.05] +% \end{macrocode} +% +% Dashes and inverted beginning-of-sentence punctuation. +% \begin{macrocode} +\providecommand{\mdash}{\textemdash\penalty\exhyphenpenalty} +\providecommand{\ndash}{\textendash\penalty\exhyphenpenalty} +\newcommand{\qd}{\textquestiondown} +\newcommand{\xd}{\textexclamdown} +% \end{macrocode} +% +% Quote commands. Note that \cs{lq} and \cs{rq} are defined in the +% \LaTeX{} kernel to produce functionally different quote characters. +% \begin{macrocode} +\newcommand{\ldq}{\textquotedblleft} +\newcommand{\rdq}{\textquotedblright} +\newcommand{\lsq}{\textquoteleft} +\newcommand{\rsq}{\textquoteright} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand{\bul}{\textbullet}% +\newcommand{\vsp}{\textvisiblespace}% +\newcommand{\pdc}{\textperiodcentered}% +\newcommand{\vrt}{\textbar}% +\newcommand{\cir}{\textasciicircum}% +\newcommand{\til}{\textasciitilde}% +\newcommand{\bsl}{\textbackslash}% +\newcommand{\cwm}{\textcompwordmark}% +% \end{macrocode} +% +% \begin{macrocode} +\providecommand{\qq}[1]{\ldq#1\/\rdq} +% \end{macrocode} +% +% Unlike \cs{textsuperscript} and \cs{textsubscript}, these do not +% use math mode at all. The difference between \cn{scriptsize} and +% \cn{supsize} is that the former is fixed at a single constant size +% regardless of context, whereas the latter adapts to the current +% font size. +% \begin{macrocode} +\newcommand{\supsize}{% +% \end{macrocode} +% Cf \cs{glb@settings}. +% \begin{macrocode} + \expandafter\ifx\csname S@\f@size\endcsname\relax + \calculate@math@sizes + \fi + \csname S@\f@size\endcsname + \fontsize\sf@size\z@\selectfont +} +\DeclareRobustCommand{\tsup}[1]{% + \leavevmode\raise.9ex\hbox{\supsize #1}% +} +\DeclareRobustCommand{\tsub}[1]{% + \leavevmode\lower.6ex\hbox{\supsize #1}% +} +% \end{macrocode} +% +% The \LaTeX{} kernel contains fallback definitions for various +% symbols that traditionally came from the \texttt{cmsy} font: +%\begin{verbatim} +%\DeclareTextSymbolDefault{\textbraceleft}{OMS} +%\end{verbatim} +% But there is no definition of that kind for the cmsy prime +% character that we want to use for \cn{tprime}. So we need to do it +% here. +% \begin{macrocode} +\DeclareTextSymbolDefault{\textprimechar}{OMS} +\DeclareTextSymbol{\textprimechar}{OMS}{48} +\DeclareRobustCommand{\tprime}{\tsup{\textprimechar}} +% \end{macrocode} +% +% And one more pair of symbols that are sometimes useful in text, yet +% do not have suitable text definitions in the \LaTeX{} kernel. (They +% do in the \pkg{textcomp} package.) +% +% If the \pkg{textcmds} package is loaded together with the +% \pkg{textcomp} package, we don't want to clobber the TS1 default. +% \begin{macrocode} +\@ifundefined{textlangle}{% + \DeclareTextSymbolDefault{\textlangle}{OMS} + \DeclareTextSymbolDefault{\textrangle}{OMS} +}{} +\DeclareTextSymbol{\textlangle}{OMS}{"68} +\DeclareTextSymbol{\textrangle}{OMS}{"69} +% \end{macrocode} +% Not sure what's the best name for the angle-brackets analog of the +% \cn{qq} command. How about ``lara'' for ``left-angle right-angle''? +% +% Unlike the quotes case, it is highly unlikely that the font +% contains kern information for the rangle character and the +% character preceding it! So let's put in an italic correction. +% \begin{macrocode} +\DeclareRobustCommand{\lara}[1]{\textlangle#1\/\textrangle} +% \end{macrocode} +% +% \begin{macrocode} +\csname endinput\endcsname +% +% \end{macrocode} +% +% Do you want some Emacs code to convert \verb"--" to \cn{ndash} while +% you write? And \verb"``" to \verb'\qq{' ? Try this. +% \begin{macrocode} +<*emacs> +(defvar latex-ndash-command "\\ndash" + "*String to insert for an n-dash in LaTeX mode.") + +(defvar latex-mdash-command "\\mdash" + "*String to insert for an m-dash in LaTeX mode.") + +(defvar latex-quote-command "\\qq" + "*String to insert for quotes in LaTeX mode.") + +(defun latex-maybe-start-quotes (arg) + "Insert the beginning of a \\qq{...} structure if the preceding char is +a left quote." + (interactive "*p") + (if (= (preceding-char) ?\`) + (progn + (delete-backward-char 1) + (insert-and-inherit (concat latex-quote-command "\{"))) + (self-insert-command arg))) + +(defun latex-maybe-end-quotes (arg) + "Insert the end of a \\qq{...} structure if appropriate." + (interactive "*p") + (if (= (preceding-char) ?\') + (progn + (delete-backward-char 1) + (insert-and-inherit "\}")) + (self-insert-command arg))) + +(defun latex-maybe-dash (arg) + "Convert two or three hyphens to \\mdash or \\ndash." + (interactive "*p") + (cond + ((re-search-backward + (concat (regexp-quote latex-ndash-command) " *\\=") nil t) + (replace-match (concat (regexp-quote latex-mdash-command) " "))) + ((= (preceding-char) ?-) + (delete-backward-char 1) + (insert-and-inherit (concat latex-ndash-command " "))) + (t (self-insert-command arg)))) + +(add-hook 'TeX-mode-hook + '(lambda + (define-key LaTeX-mode-map "\`" 'latex-maybe-start-quotes) + (define-key LaTeX-mode-map "\'" 'latex-maybe-end-quotes) + (define-key LaTeX-mode-map "-" 'latex-maybe-dash))) + +% \end{macrocode} +% +% \CheckSum{133} +% \Finale diff --git a/Master/texmf-dist/source/latex/amslatex/upref.dtx b/Master/texmf-dist/source/latex/amslatex/upref.dtx new file mode 100644 index 00000000000..843126b3b58 --- /dev/null +++ b/Master/texmf-dist/source/latex/amslatex/upref.dtx @@ -0,0 +1,151 @@ +%%% ==================================================================== +%%% @LaTeX-file{ +%%% filename = "upref.dtx", +%%% version = "2.01", +%%% date = "2004/07/29", +%%% time = "16:37:01 EDT", +%%% checksum = "07926 151 617 5530", +%%% author = "American Mathematical Society", +%%% copyright = "Copyright 1996 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name.", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, amslatex, ams-latex, cross references", +%%% supported = "yes", +%%% abstract = "This is a LaTeX package that provides printing +%%% of \cn{ref}s in an upright font even if the +%%% current context is italic or slanted.", +%%% docstring = "The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== +% +%\iffalse +%<*driver> +\documentclass{amsdtx} +\begin{document} +\title{The \pkg{upref} package} +\author{American Mathematical Society\\ Michael Downes\\ + updated by Barbara Beeton} +\date{Version \fileversion, \filedate} +\hDocInput{upref.dtx} +\end{document} +% +%\fi +% +% \maketitle +% +% \MakeShortVerb\| +% +% \section{Introduction} +% +% This package changes the \cn{ref} command so that it never applies +% a slanted font shape to its argument, regardless of context. This +% was the default behavior in \cls{amsart} version 1.1. Starting with +% \cls{amsart} version 1.2, upright references must be obtained via +% |\usepackage{upref}|. +% +% \StopEventually{} +% +% \section{Implementation} +% Give package name, date, version. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{upref}[2004/07/29 v2.01] +% \end{macrocode} +% +% \begin{macro}{\@noref} +% Give a warning if a cited reference isn't defined. +% \begin{macrocode} +\newcommand{\@noref}[1]{% + \G@refundefinedtrue + \nfss@text{\reset@font\bfseries ??}% + \@latex@warning{Reference `#1' on page \thepage\space undefined}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@setref} +% If the current fontshape is italic or slanted, we want to switch to +% upright/roman for printing the number of a \cn{ref}. This requires +% changing the \cs{@setref} command. +% +% Since \cs{@setref} is modified by the \pkg{hyperref} package, delay +% the definition until \cs{AtBeginDocument}. Then check whether +% \pkg{hyperref} is loaded. If it is, we have to redefine some +% control sequences that \pkg{hyperref} defined in order to get +% upright references even in a \pkg{hyperref} environment. +% [tjk,bnb, 2004/07/29] +% \begin{macrocode} +\AtBeginDocument{% + \@ifpackageloaded{hyperref}{% +% \end{macrocode} +% We overload \cs{Hy@setref@link} as this is where the upright +% references get clobbered. Used in overloaded \cs{@setref}. +% \begin{macrocode} + \def\Hy@setref@link#1#2#3#4#5#6\@nil#7{% + \begingroup + \toks0{\hyper@@link{#5}{#4}}% + \toks1\@xp{#7{\textup{#1}\hbox{}}{#2}{#3}{#4}{#5}}% + \edef\x{\endgroup\the\toks0{\the\toks1}}\x + }% +% \end{macrocode} +% We should not have to overload \cs{@setref}, but there is +% a chance that an author is using an old version of hyperref +% which does not use \cs{Hy@setref@link} in \cs{@setref}. +% \begin{macrocode} + \def\@setref#1#2#3{% + \ifx#1\relax + \@xp\protect\@noref{#3}% + \else + \@xp\Hy@setref@link#1\@empty\@empty\@nil{#2}% + \fi + }% + }{% + \def\@setref#1#2#3{\ifx#1\relax + \protect\@noref{#3}% + \else + \protect\textup{\@xp#2#1\hbox{}}% + \fi + }% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@upn} +% The function \cs{\@upn} is used to force theorem numbers and +% similar elements to be upright in sloped or italic contexts. +% If a suitable italic font with upright numbers and punctuation is +% available, this function should be redefined to be a no-op. +% \begin{macrocode} +\providecommand\@upn{\textup} +% \end{macrocode} +% \end{macro} +% +% The usual \cs{endinput} to ensure that random garbage at the end of +% the file doesn't get copied by \fn{docstrip}. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \CheckSum{61} +% \Finale -- cgit v1.2.3