diff options
Diffstat (limited to 'texmf/source/latex')
| -rw-r--r-- | texmf/source/latex/revtex/aip4-2.dtx | 4233 | ||||
| -rw-r--r-- | texmf/source/latex/revtex/ltxdocext.dtx | 1259 | ||||
| -rw-r--r-- | texmf/source/latex/revtex/ltxfront.dtx | 3763 | ||||
| -rw-r--r-- | texmf/source/latex/revtex/ltxgrid.dtx | 6849 | ||||
| -rw-r--r-- | texmf/source/latex/revtex/ltxutil.dtx | 4449 | ||||
| -rw-r--r-- | texmf/source/latex/revtex/revtex-bst.dtx | 3873 | ||||
| -rw-r--r-- | texmf/source/latex/revtex/revtex4-2.dtx | 8383 |
7 files changed, 32809 insertions, 0 deletions
diff --git a/texmf/source/latex/revtex/aip4-2.dtx b/texmf/source/latex/revtex/aip4-2.dtx new file mode 100644 index 0000000..2c40254 --- /dev/null +++ b/texmf/source/latex/revtex/aip4-2.dtx @@ -0,0 +1,4233 @@ +% \iffalse meta-comment +% aip4-2.dtx: package to change page grid, MVL. +% Copyright (c) 2019 American Institute of Physics +% mailto:tex@aip.org +% +% Disclaimer +% This file is distributed WITHOUT ANY WARRANTY; +% without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +% License +% You may distribute this file under the conditions of the +% LaTeX Project Public License 1.3c or later +% (http://www.latex-project.org/lppl.txt). +% ReadMe +% For the documentation and more detailed instructions for +% installation, typeset this document with \LaTeX. +% Maintenance Status +% This work has the LPPL maintenance status "maintained"; +% Current Maintainer of this work is Arthur Ogawa +% changes for version 4.2d and 4.2e by Phelype Oleinik. +% +% Version (4.2e) +% Modified by Aptara +% +% This work consists of the main source file aip4-2.dtx +% and the derived files +% aip.rtx, aip.pdf, aip.ins, aip.drv. +% Distribution: +% CTAN:macros/latex/contrib/aip/ +% +% Unpacking: +% tex aip4-2.dtx +% +% Documentation: +% latex aip4-2.dtx; ... +% +% Programm calls to get the documentation (example): +% pdflatex aip4-2.dtx +% makeindex -s gind.ist aip +% makeindex -s gglo.ist -o aip.gls aip.glo +% pdflatex aip4-2.dtx +% makeindex -s gind.ist aip +% pdflatex aip4-2.dtx +% +% Installation: +% TDS:bibtex/bst/aip/ +% TDS:doc/latex/aip/ +% TDS:source/latex/aip/ +% TDS:tex/latex/aip/ +% +% Thanks, Heiko! +% This method of letting a single .dtx file serve as both +% documentation (via latex) and installer (via tex) follows +% the example of Heiko Oberdiek. Thanks! +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase + 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi + \relax +\else + \csname fi\endcsname +%</ignore> +%<*install> +%% This file will generate documentation and runtime files +%% from aip4-2.dtx when run through LaTeX or TeX. +%% This file requires docstrip version 2.4 or higher available from +%% ftp://ctan.tug.org/tex-archive/macros/latex/unpacked/docstrip.tex +\input docstrip +\preamble + +This is a generated file; +altering it directly is inadvisable; +instead, modify the original source file. +See the URL in the file README-AIP. + +Copyright (c) 2019--2020 American Institute of Physics. +mailto:tex@aip.org + +Maintained by Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net) +under contract to American Institute of Physics + +Version (4.2c) +Modified by Aptara +under contract to American Institute of Physics + +Version (4.2d,4.2e) +Modified by Phelype Oleinik for the American Physical Society (mailto:phelype.oleinik at latex-project.org) + +License + You may distribute this file under the conditions of the + LaTeX Project Public License 1.3c or later + (http://www.latex-project.org/lppl.txt). + + This file is distributed WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. + +\endpreamble +\askforoverwritefalse +\keepsilent + \generate{% + %{ignore} +% \file{aip.ins}{\from{aip4-2.dtx}{install}}% +% \file{aip.drv}{\from{aip4-2.dtx}{driver}}% +% \usedir{tex/latex/aip}% + \file{aip4-2.rtx}{\from{aip4-2.dtx}{package}}% + \file{aapm4-2.rtx}{\from{aip4-2.dtx}{aapm}}% + \file{sor4-2.rtx}{\from{aip4-2.dtx}{sor}}% + }% +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation, please move} +\Msg{* aip.rtx} +\Msg{* into a directory searched by TeX;} +\Msg{* in a TDS-compliant installation:} +\Msg{* texmf/tex/macros/latex/aip/.} +\Msg{*} +\Msg{* To produce the documentation, + run aip4-2.dtx through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% \fi +% +% \GetFileInfo{aip4-2.dtx} +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +% +% \StopEventually{} +% \iffalse ltxdoc klootch +%<*package> +%%% @LaTeX-file{ +%%% filename = "aip4-2.dtx", +%%% version = "4.2e", +%%% date = "2020/10/03", +%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net), +%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org), +%%% commissioned by the American Institute of Physics. +%%% ", +%%% copyright = "Copyright (C) 2019--2020 American Institute of Physics, +%%% distributed under the terms of the +%%% LaTeX Project Public License 1.3c, see +%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt +%%% ", +%%% address = "AIP Journal Program +%%% American Institute of Physics, +%%% Suite 1NO1, 2 Huntington Quadrangle, +%%% Melville, NY 11747 USA", +%%% telephone = "", +%%% FAX = "", +%%% email = "mailto colon tex at aip.org", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, page grid, main vertical list", +%%% supported = "yes", +%%% abstract = "aip substyle for REVTeX", +%%% } +%</package> +% \fi +% +% \iffalse ltxdoc klootch +% The following references the \file{README-AIP} file, +% which contains basic information about this package. +% The contents of this file are generated when +% you typeset the programmer's documentation. +% Search on "{filecontents*}{README-AIP}" to locate it. +% \fi\input{README-AIP}% +% +% \subsection{Bill of Materials} +% +% Following is a list of the files in this distribution arranged +% according to provenance. +% +% \subsubsection{Primary Source}% +% One single file generates all. +%\begin{verbatim} +%aip4-2.dtx +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{latex aip4-2.dtx}}% +% Typesetting the source file under \LaTeX\ +% generates the readme and the installer. +%\begin{verbatim} +%README aip.ins +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{tex aip4-2.dtx}}% +% Typesetting the installer generates +% the package files. +%\begin{verbatim} +%aip.rtx +%\end{verbatim} +% +% \subsubsection{Documentation}% +% The following are the online documentation: +% \begin{verbatim} +%aip.pdf +% \end{verbatim} +% +% \subsubsection{Auxiliary}% +% The following are auxiliary files generated +% in the course of running \LaTeX: +% \begin{verbatim} +%aip.aux aip.idx aip.ind aip.log aip.toc +% \end{verbatim} +% +% \section{Code common to all modules}% +% +% The following may look a bit klootchy, but we +% want to require only one place in this file +% where the version number is stated, +% and we also want to ensure that the version +% number is embedded into every generated file. +% +% Now we declare that +% these files can only be used with \LaTeXe. +% An appropriate message is displayed if +% a different \TeX{} format is used. +% \begin{macrocode} +%<*driver|package|aapm|sor> +\NeedsTeXFormat{LaTeX2e}[1996/12/01]% +%</driver|package|aapm|sor> +% \end{macrocode} +% As desired, the following modules all +% take common version information: +% \begin{macrocode} +%<package>\ProvidesFile{aip4-2.rtx}% +%<aapm>\ProvidesFile{aapm4-2.rtx}% +%<sor>\ProvidesFile{sor4-2.rtx}% +%<*driver> +\expandafter\ProvidesFile\expandafter{\jobname.dtx}% +%</driver> +% \end{macrocode} +% +% The following line contains, for once and for all, +% the version and date information. +% By various means, this information is reproduced +% consistently in all generated files and in the +% typeset documentation. +% \begin{macrocode} +%<*driver|package> +%<version> + [2020/10/03 4.2e AIP substyle for REVTeX]% \fileversion +%</driver|package> +% \end{macrocode} +% +% +% \section{The driver module \texttt{driver}} +% +% This module, consisting of the present section, +% typesets the programmer's documentation, +% generating the \file{.ins} installer and \file{README-AIP} as required. +% +% Because the only uncommented-out lines of code at the beginning of +% this file constitute the \file{driver} module itself, +% we can simply typeset the \file{.dtx} file directly, +% and there is thus rarely any need to +% generate the ``driver'' {\sc docstrip} module. +% Module delimiters are nonetheless required so that +% this code does not find its way into the other modules. +% +% The \enve{document} command concludes the typesetting run. +% +% \begin{macrocode} +%<*driver> +% \end{macrocode} +% +% \subsection{The Preamble} +% The programmers documentation is formatted +% with the \classname{ltxdoc} class with local customizations, +% and with the usual code line indexing. +% \begin{macrocode} +\documentclass{ltxdoc} +\RequirePackage{ltxdocext}% +\let\url\undefined +\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}% +\gdef\lquote{`}\gdef\rquote{'}% +\CodelineIndex\EnableCrossrefs % makeindex -s gind.ist aip +\RecordChanges % makeindex -s gglo.ist -o aip.gls aip.glo +% \end{macrocode} +% +% \subsubsection{Docstrip and info directives} +% We use so many {\sc docstrip} modules that we set the +% \texttt{StandardModuleDepth} counter to 1. +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% The following command retrieves the date and version information +% from this file. +% \begin{macrocode} +\expandafter\GetFileInfo\expandafter{\jobname.dtx}% +% \end{macrocode} +% +% \subsection{The ``Read Me'' File} +% As promised above, here is the contents of the +% ``Read Me'' file. That file serves a double purpose, +% since it also constitutes the beginining of the +% programmer's documentation. What better thing, after +% all, to have appear at the beginning of the +% typeset documentation? +% +% A good discussion of how to write a ReadMe file can be found in +% Engst, Tonya, ``Writing a ReadMe File? Read This'' +% \emph{MacTech} October 1998, p. 58. +% +% Note the appearance of the +% \cmd\StopEventually\ command, which marks the +% dividing line between the user documentation +% and the programmer documentation. +% +% The usual user will not be asked to +% do a full build, not to speak +% of the bootstrap. +% Instructions for carrying these processes +% begin the programmer's manual. +% +%\changes{4.1b}{2008/08/06}{Beta candidate b} +% \begin{macrocode} +\begin{filecontents*}{README-AIP} +\title{% + The \classname{aip} substyle for REV\TeX% + \protect\thanks{% + \fileversion\ \copyright 2009 American Institute of Physics + % For version number and date, + % search on "\fileversion" in the .dtx file, + % or see the end of the README file. + }% +}% + +\author{% +Arthur Ogawa\thanks{mailto:arthur\_ogawa at sbcglobal.net}% +}% +\date{Version \fileversion, dated \filedate}% +\maketitle + +This file embodies the implementation of the +AIP journal substyles for APS's \revtex\ 4.2 document class +for electronic submissions to AIP journals. + +The distribution point for this work is +\url{http://publishing.aip.org/authors/preparing-your-manuscript}. +The archive contains ready-to-Install files, documentation, and full source. + +This package is also distributed via CTAN: +\url{http://www.ctan.org/pub/tex-archive/macros/latex/contrib/aip}, and as a ready-to-install image as +\url{http://www.ctan.org/pub/tex-archive/install/macros/latex/contrib/aip.tds.zip}. + +The \classname{aip} package was commissioned by the American Institute of Physics +and is distributed under the terms of the \LaTeX\ Project Public License, +the same license under which all the portions of \LaTeX\ itself is distributed. +Please see \url{http://ctan.tug.org/macros/latex/base/lppl.txt} for details. + +To use this document class, you must have a working +\TeX\ installation equipped with \LaTeXe\ +and possibly pdftex and Adobe Acrobat Reader or equivalent. + +To install, retrieve the distribution, +unpack it into a directory on the target computer, +and move the file \file{aip.rtx} +into a location in your filesystem where it will be found by \LaTeX. + +To use, read the user documentation \file{auguide.pdf}. + +\tableofcontents + +\section{Overview}% +\revtex\ is a \LaTeXe\ document class, somewhat like a hybrid of +the standard \LaTeX\ \classname{book} and \classname{article} classes. + +This document class implements the AIP society and journal substyles: +the journals represent a set of mutually exclusive class options that, in this case, allow the +document class to address multiple journals within the AIP family. +This society is obtained with class option \classoption{aip}. + +\section{Processing Instructions} + +The package file \file{aip.rtx} +is generated from this file, \file{aip4-2.dtx}, +using the {\sc docstrip} facility of \LaTeX +via |tex aip4-2.dtx|. +The typeset documentation that you are now reading is generated from +the same file by typesetting it with \LaTeX\ or pdftex +via |latex aip4-2.dtx| or |pdflatex aip4-2.dtx|. + +\subsection{Build Instructions} + +You may bootstrap this suite of files solely from \file{aip4-2.dtx}. +Prepare by installing \LaTeXe\ (and either tex or pdftex) on your computer, +then carry out the following steps: +\begin{enumerate} +\item +Within an otherwise empty directory, +typeset \file{aip4-2.dtx} with \LaTeX\ or pdflatex; +you will obtain the typeset documentation you are now reading, +along with +the installer \file{aip.ins}, +and the file \file{README-AIP}. + +Note: you will have to run \LaTeX\ twice, then \file{makeindex}, then +\LaTeX\ again in order to obtain a valid index and table of contents. +\item +Now typeset \file{aip4-2.dtx} with \TeX (not \LaTeX), +thereby generating the package file \file{aip.rtx}. +\item +Install \classname{aip.rtx} +by moving it to a location +in your filesystem where it will be found by \LaTeX, +like \file{tex/latex/aip}. +\item +Install \classname{aip.pdf} +by moving it to +\file{doc/latex/aip}. +\item +Using the \file{.dbj} information herein, +generate the needed \file{.bst} files and install them in +\file{bibtex/bst/aip}. +\end{enumerate} +\end{filecontents*} +% \end{macrocode} +% +% \subsection{The Document Body} +% +% Here is the document body, containing only a +% \cmd\DocInput\ directive---referring to this very file. +% This very cute self-reference is a common \classname{ltxdoc} idiom. +% \begin{macrocode} +\begin{document}% +\newcommand\revtex{REV\TeX}% +\expandafter\DocInput\expandafter{\jobname.dtx}% +% ^^A\PrintChanges +\end{document} +% \end{macrocode} +% +% \begin{macrocode} +%</driver> +% \end{macrocode} +% +% \section{AIP: A set of journal-specifc extensions to \revtex} +% +% To create a journal substyle, you create +% a \file{.rtx} file, in our case \file{aip.rtx}. +% Within that file, you override procedures and parameter assignments as you see fit. +% Ideally they will be generally applicable to all of that society's +% journals (see the file \file{aps.rtx} for a realization of this scheme). +% Also within that file, you include a +% section of code for each journal, that for JMP looks like: +% \begin{verbatim} +% \@ifx{\@journal\journal@jmp}{% +% <code specific to the JMP> +% }{}% +% \end{verbatim} +% +% \section{The \classoption{aip} class option: the \texttt{aip} module} +% The file \file{aip.rtx} is read in by the \classname{revtex4} document class +% if \cmd\@society\ has the value \classoption{aip}. +% +% Here, code specific to AIP journals appears. +% +% We first give some text entities (amounting to journal abbreviations), +% then some AIP-specific initialisations, +% then code for particular AIP journals. +% In the latter case, the choice is +% keyed off the macro \cmd\@journal. +% +% Note on \cmd\AtEndOfClass: +% this file, like all journal substyles, is read in at \cmd\AtEndOfClass\ time, +% so you should not use this command in this file. +% Note for \LaTeX\ developers: It would be an improvement in \LaTeX\ to +% \cmd\let\cmd\AtEndOfClass\ to something like \cmd\@firstofone. +% This change would be effected in \cmd\@onefilewithoptions. +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \subsection{Defend Against Forseeable Errors}% +% Protect this file from being read in by anything but \revtex. +% \begin{macrocode} +\ifx\undefined\substyle@ext + \def\@tempa{% + \endinput + \GenericWarning{I must be read in by REVTeX! (Bailing out)}% + }% + \expandafter\else + \def\@tempa{}% + \expandafter\fi\@tempa + \class@info{RevTeX society AIP selected}% +% \end{macrocode} +% +% \subsection{Substyle Options}% +% +% Here are the class options relating to the AIP: +% \begin{macrocode} +\DeclareOption{jcp}{\change@journal{jcp}}% +\DeclareOption{pop}{\change@journal{pop}}% +\DeclareOption{rsi}{\change@journal{rsi}}% +\DeclareOption{jap}{\change@journal{jap}}% +\DeclareOption{apl}{\change@journal{apl}}% +\DeclareOption{apm}{\change@journal{apm}}% +\DeclareOption{cha}{\change@journal{cha}}% +\DeclareOption{pof}{\change@journal{pof}}% +\DeclareOption{bmf}{\change@journal{bmf}}% +\DeclareOption{rse}{\change@journal{rse}}% +\DeclareOption{jmp}{\change@journal{jmp}}% +\DeclareOption{adv}{\change@journal{adv}}% +\DeclareOption{sd}{\change@journal{sd}}% +\DeclareOption{jor}{\change@journal{jor}}% +\DeclareOption{cp}{\change@journal{cp}}% +% \end{macrocode} +% +% \subsection{Abbreviations}% +% \changes{4.1p}{2010/02/24}{(AO, 584) Per MD, remove trailing space character from each journal abbreviation: it had caused an extraneous space in the .bbl} +% The following macros constitute typing shortcuts for +% certain journal names. +% \begin{macrocode} +\def\adv{AIP Advances}% +\def\ao{Appl.\ Opt.}% +\def\ap{Appl.\ Phys.}% +\def\apl{Appl.\ Phys.\ Lett.}% +\def\apm{Appl.\ Phys.\ Lett.\ Mater.}% +\def\apj{Astrophys.\ J.}% +\def\bell{Bell Syst.\ Tech.\ J.}% +\def\bmf{Biomicrofluidics}% +\def\cha{Chaos}% +\def\jqe{IEEE J.\ Quantum Electron.}% +\def\assp{IEEE Trans.\ Acoust.\ Speech Signal Process.}% +\def\aprop{IEEE Trans.\ Antennas Propag.}% +\def\mtt{IEEE Trans.\ Microwave Theory Tech.}% +\def\iovs{Invest.\ Ophthalmol.\ Vis.\ Sci.}% +\def\jcp{J.\ Chem.\ Phys.}% +\def\jap{J.\ Appl.\ Phys.}% +\def\jmp{J.\ Math.\ Phys.}% +\def\jmo{J.\ Mod.\ Opt.}% +\def\josa{J.\ Opt.\ Soc.\ Am.}% +\def\josaa{J.\ Opt.\ Soc.\ Am.\ A}% +\def\josab{J.\ Opt.\ Soc.\ Am.\ B}% +\def\jpp{J.\ Phys.\ (Paris)}% +\def\jpr{J.\ Phys.\ Chem.\ Ref.\ Data}% +\def\ltp{Low.\ Temp.\ Phys.}% +\def\nat{Nature (London)}% +\def\oc{Opt.\ Commun.}% +\def\ol{Opt.\ Lett.}% +\def\pl{Phys.\ Lett.}% +\def\pop{Phys.\ Plasmas}% +\def\pof{Phys.\ Fluids}% +\def\pra{Phys.\ Rev.\ A}% +\def\prb{Phys.\ Rev.\ B}% +\def\prc{Phys.\ Rev.\ C}% +\def\prd{Phys.\ Rev.\ D}% +\def\pre{Phys.\ Rev.\ E}% +\def\prl{Phys.\ Rev.\ Lett.}% +\def\rmp{Rev.\ Mod.\ Phys.}% +\def\rsi{Rev.\ Sci.\ Instrum.}% +\def\rse{J.\ Renewable Sustainable Energy}% +\def\pspie{Proc.\ Soc.\ Photo-Opt.\ Instrum.\ Eng.}% +\def\sjqe{Sov.\ J.\ Quantum Electron.}% +\def\vr{Vision Res.}% +\def\sd{Structural\ Dynamics}% +\def\jor{J.\ Rheol.}% +\def\cp{AIP\ Conference\ Proceedings}% +% \end{macrocode} +% +% Option allowing for ``numerical author-year'' bibliography. +% \begin{macrocode} +\DeclareOption{author-numerical}{% + \@booleantrue\authoryear@sw + \@booleantrue\authornum@sw +}% +% \end{macrocode} +% +% Optionally allow article title in bibliography entries. +% A new switch is defined here: \cmd\aip@jtitx@sw\ signifies that +% the numbered style bibliography is to be prepared without article titles in @ARTICLE entries. +% Otherwise, such titles are incorporated if present in the \file{.bib} entry. +% By default, exclude the article titles. +% \begin{macrocode} +\DeclareOption{article-title}{% + \@booleanfalse\aip@jtitx@sw +}% +\@booleantrue \aip@jtitx@sw +% \end{macrocode} +% +% Establish default options for this society. +% +% \begin{macrocode} +\@booleanfalse\authoryear@sw +\@booleanfalse\authornum@sw +\@booleanfalse\onecolumn@sw +\@booleanfalse\newonecolumn@sw +% \end{macrocode} +% +% \begin{macro}{\@bibdataout@init} +% \begin{macro}{\@bibdataout@aip} +% \changes{4.1o}{2010/02/12}{(AO, 580) Control .bst at run time.}% +% Procedure \cmd\@bibdataout@aip\ has the job of writing the control record into the +% job's \cmd\jobname\filename{.bib} file, where it will adjust the options to \filename{.bst} processing. +% It is installed into the initialization procedure \cmd\@bibdataout@init, and its meaning +% is set by the society (AIP) and journal. +% +% \begin{macrocode} +\appdef\@bibdataout@rev{\@bibdataout@aip}% +\def\@bibdataout@aip{% + \immediate\write\@bibdataout{% +% \end{macrocode} +% An entry that controls processing of the \filename{.bst} file has entry type \texttt{@CONTROL}. +% \begin{macrocode} + @CONTROL{% + aip41Control% +% \end{macrocode} +% Say whether we want long bibliography style (the default), or the abbreviated style. +% \begin{macrocode} + \longbibliography@sw{\true@sw}{\aip@jtitx@sw{\false@sw}{\true@sw}}% + {% + ,pages="1",title="0"% + }{% + ,pages="0",title=""% + }% + }% + }% +% \end{macrocode} +% Place a \cmd\citation\ into the auxiliary file corresponding to this entry. +% \begin{macrocode} + \if@filesw + \immediate\write\@auxout{\string\citation{aip41Control}}% + \fi +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% For AIP, the preprint style \classoption{preprint} is the default. +% \begin{macrocode} +\@booleantrue\preprintsty@sw +% \end{macrocode} +% +% \begin{macro}{\showPACS@sw} +% \begin{macro}{\showKEYS@sw} +% If \cmd\showPACS@sw\ is true, print the PACS information in the title block, +% otherwise not. +% Similarly for \cmd\showKEYS@sw\ and the keywords. +% \begin{macrocode} +\@booleantrue\showPACS@sw +\@booleantrue\showKEYS@sw +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\refname} +% +% In reprint style only, we eliminate the head above the bibliography. +% \begin{macrocode} +% TeXSupport +\let\old@refname\refname +\appdef\setup@hook{% + \preprintsty@sw{}{% + \let\refname\@empty + }% +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{AIP Setup}% +% Here we define the default procedures for AIP journals. +% Individual AIP journals may override these definitions. +% +% \subsubsection{Running header and footer}% +% +% Page style for all AIP journals. +% We assert our own page style only if nobody else has done so. +% Users wishing to customize their documents will be able to invoke a \cmd\pagestyle\ +% command anywhere in the preamble. +%FIXME: \cmd\preprintsty@sw\ is defined? +% \begin{macrocode} +\appdef\setup@hook{% + \preprintsty@sw{% + \ps@preprint + }{% + \ps@article + }% +}% +% \end{macrocode} +% +% The spc says: ``Running title must be provided on title page'', +% and that journal classes 1b and 2 have no running title. +% \begin{macrocode} +\def\ps@preprint{% + \def\@oddhead{\@runningtitle\hfil}% + \def\@evenhead{\@runningtitle\hfil}% + \def\@oddfoot{\hfil\thepage\quad\checkindate\hfil}% + \def\@evenfoot{\hfil\thepage\quad\checkindate\hfil}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\ps@article{% + \def\@evenhead{\let\\\heading@cr\thepage\quad\checkindate\hfil\@runningtitle}% + \def\@oddhead{\let\\\heading@cr\@runningtitle\hfil\checkindate\quad\thepage}% + \def\@oddfoot{}% + \def\@evenfoot{}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\@runningtitle{\@shorttitle}% +% \end{macrocode} +% +% \subsubsection{Title block}% +% +% The specifics of the title block. +% Apply to all AIP journals; individual journals may override these settings. +% +% \begin{macro}{\titlepage} +% \begin{macrocode} +\renewenvironment{titlepage}{% + \let\wastwocol@sw\twocolumn@sw + \onecolumngrid + \newpage + \thispagestyle{titlepage}% + \c@page\z@% article sets this to one not zero??? +}{% + \wastwocol@sw{\twocolumngrid}{\newpage}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fnsymbol} +% On the title page, footnotes are lettered with right parenthesis: ``a)''. +% \begin{macrocode} +\let\@fnsymbol@latex\@fnsymbol +\let\@fnsymbol\@alph +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\adjust@abstractwidth} +% This procedure is used by many titlepage elements to indent on the left by a particular +% amount. The author list uses \cmd\frontmatter@authorformat\ to accomplish the same. +% \begin{macrocode} +\def\adjust@abstractwidth{% + \parindent1em\relax + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@afterheading\@afterindentfalse +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractheading} +% AIP Journals all set the abstract head the same way, with no head. +% \begin{macrocode} +\def\frontmatter@abstractheading{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractfont} +% All AIP journals set the abstract body the same way. +% \begin{macrocode} +\def\frontmatter@abstractfont{% +%\small + \adjust@abstractwidth +}% +% \end{macrocode} +% \end{macro} +% +% All AIP journal preprints use separate titlepage and full-width abstract. +% \begin{macrocode} +\appdef\setup@hook{% + \preprintsty@sw{% + \@booleantrue\titlepage@sw +% \def\frontmatter@affiliationfont{\it}% + \let\section\section@preprintsty +% \let\@hangfrom@section\@hangfrom@section@preprintsty + \let\subsection\subsection@preprintsty + \let\subsubsection\subsubsection@preprintsty + }{}% +}% +% \end{macrocode} +% +% \begin{macro}{\frontmatter@authorformat} +% All AIP journals set the author list the same. +% The leading is 11.5 points, and +% there is 11.5 points of extra space above the first author line +% (which amounts to the same thing as 11.5 points extra below the title) +% for a total of 23 points base-to-base. +% +% \begin{macrocode} +\def\frontmatter@@indent{% + \skip@\@flushglue + \@flushglue\z@ plus.3\hsize\relax + \raggedright + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@flushglue\skip@ +}% +\def\frontmatter@authorformat{% + \frontmatter@@indent + \sffamily +%\advance\baselineskip\p@ +%\parskip11.5\p@\relax +}% +\renewcommand*\email[1][Electronic mail: ]{\begingroup\sanitize@url\@email{#1}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@above@affilgroup} +% The default amount of space above affiliation. +% \begin{macrocode} +\def\frontmatter@above@affilgroup{% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@above@affiliation} +% \begin{macro}{\frontmatter@above@affiliation@script} +% The default amount of space above affiliation. +% \begin{macrocode} +\def\frontmatter@above@affiliation@script{% + \frontmatter@@indent +%\addvspace{3.5\p@}% +}% +\def\frontmatter@above@affiliation{% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\frontmatter@affiliationfont} +% All AIP journals set the affiliation the same. +% Like the author, but in italic. +% \begin{macrocode} +\def\frontmatter@affiliationfont{% + \frontmatter@@indent + \preprintsty@sw{}{\small}% + \it +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@collaboration@above} +% \begin{macrocode} +\def\frontmatter@collaboration@above{% +}% +% \end{macrocode} +% \end{macro} +% +% Set up the default AIP style for title block authors and affiliations. +% +% \begin{macro}{\frontmatter@setup} +% All AIP journals set the title page using the same font and size. +% However, justification varies for the title block elements, so +% we assert none here. +% \begin{macrocode} +\def\frontmatter@setup{% + \normalfont +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@title@above} +% \begin{macro}{\frontmatter@title@format} +% \begin{macro}{\frontmatter@title@below} +% All AIP journals set the article title 12 point Times Roman, bold, flush left. +% +% \begin{macrocode} +\def\frontmatter@title@above{\addvspace{6\p@}}% +\def\frontmatter@title@format{% + \preprintsty@sw{}{\Large}% + \sffamily + \bfseries + \raggedright + \parskip\z@skip +}% +\def\frontmatter@title@below{\addvspace{3\p@}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\frontmatter@makefnmark} +% All AIP journals share this procedure for setting the titlepage footnote text: +% superior lowercase letter, with right parenthesis. +% \begin{macrocode} +\def\@author@parskip{3\p@}% +\@booleantrue\altaffilletter@sw +\def\frontmatter@makefnmark{% + \@textsuperscript{% + \normalfont\@thefnmark%( + )% + }% +}% +\def\frontmatter@authorbelow{% + \addvspace{3\p@}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\affil@cutoff} +% We override \cmd\affil@cutoff\ to enforce the rule that, +% if a single affiliation appears on the title page, then +% no affiliation superscript at all is produced. +% \begin{macrocode} +\let\affil@cutoff\tw@ +% \end{macrocode} +% De awa. +% \end{macro} +% +% \begin{macro}{\frontmatter@RRAP@format} +% All AIP journals use the same format for the ``Received, Revised, etc.'' block on the title page. +% +% Change note: 11.5 points b-b from author/affiliation down to date. +% \begin{macrocode} +\def\frontmatter@RRAP@format{% + \addvspace{5\p@}% + \small + \raggedright + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip +% \preprintsty@sw{}{\parskip.5ex\relax}% + \everypar{% + \hbox\bgroup(\@gobble@leavemode@uppercase%) + }% + \def\par{% + \@ifvmode{}{%( + \unskip)\egroup\@@par + }% + }% +}% +\def\punct@RRAP{;\egroup\ \hbox\bgroup}% +\def\@gobble@leavemode@uppercase#1#2{\expandafter\MakeTextUppercase}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@PACS@format} +% +% \begin{macrocode} +\def\frontmatter@PACS@format{% + \addvspace{11\p@}% +% \footnotesize + \adjust@abstractwidth + \parskip\z@skip + \samepage +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@keys@format} +% +% \begin{macrocode} +\def\frontmatter@keys@format{% +% \footnotesize + \adjust@abstractwidth + \samepage +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@titlepage} +% Title page style. Currently empty except for preprint header, +% which consists of all the \cmd\preprint\ arguments, +% stacked flush right at the right margin. +% \begin{macrocode} +\def\ps@titlepage{% + \def\@oddhead{% + \@runningtitle + \hfill + \produce@preprints\@preprint + }% + \let\@evenhead\@oddhead + \def\@oddfoot{% + \hb@xt@\z@{\byrevtex\hss}% + \hfil + \preprintsty@sw{\thepage}{}% + \quad\checkindate + \hfil + }% + \let\@evenfoot\@oddfoot +}% +\def\byrevtex{\byrevtex@sw{Typeset by REV\TeX and AIP}{}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\produce@preprints} +% \begin{macrocode} +\def\produce@preprints#1{% + \preprint@sw{% + \vtop to \z@{% + \def\baselinestretch{1}% + \small + \let\preprint\preprint@count + \count@\z@#1\@ifnum{\count@>\tw@}{% + \hbox{% + \let\preprint\preprint@hlist + #1\setbox\z@\lastbox + }% + }{% + \let\preprint\preprint@cr + \halign{\hfil##\cr#1\crcr}% + \par + \vss + }% + }% + }{}% +}% +\def\preprint@cr#1{#1\cr}% +\def\preprint@count#1{\advance\count@\@ne}% +\def\preprint@hlist#1{#1\hbox{, }}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Lead-in paragraph}% +% +% The \env{Lead-in paragraph} environment formats the AIP ``lead paragraph''. +% To avoid introducing new syntax, we take over the \env{quotation} environment +% until the first \cmd\section\ (or other sectioning command) appears. +% +% \begin{macrocode} +\newenvironment{Lead@inParagraph}{% + \par + \bfseries + \@afterheading\@afterindentfalse +}{% + \par + \hb@xt@\hsize{\hfil\leaders\hrule\hfil\leaders\hrule\hfil\hfil}% +}% +% \end{macrocode} +% At the beginning of the document temporarily change the meaning of +% the \env{quotation} environment, restoring it once the first sectioning +% command is given. +% \begin{macrocode} +\appdef\frontmatter@init{% + \let@environment{quotation@ltx}{quotation}% + \let@environment{quotation}{Lead@inParagraph}% +}% +\appdef\@startsection@hook{% + \let@environment{quotation}{quotation@ltx}% +}% +% \end{macrocode} +% +% \subsubsection{Stacked Heads}% +% All AIP journals put a period (.), followed by quad space, after the section number. +% Also, no hanging section number. +% \begin{macrocode} +\def\@seccntformat#1{\csname the#1\endcsname.\quad}% +\def\@hang@from#1#2#3{#1#2#3}% +% \end{macrocode} +% +% Note that in the following, we wish to set the section head uppercase, so we use +% David Carlisle's \cmd\MakeTextUppercase. However, because this procedure effectively +% parses its argument (looking for things to \emph{not} translate), it has to be invoked +% in such a way that the argument of the \cmd\section\ command is passed to it as its +% own argument. +% +% To accomplish this, we use the \cmd\@hangfrom@\ hook, which was developed for this +% purpose. +% +% \begin{macrocode} +\def\section{% + \@startsection + {section}% + {1}% + {\z@}% + {0.8cm \@plus1ex \@minus .2ex}% + {0.5cm}% + {% + \normalfont + \small + \sffamily + \bfseries + \raggedright + }% +}% +\def\@hangfrom@section#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}% +\def\@hangfroms@section#1#2{#1\MakeTextUppercase{#2}}% +% \end{macrocode} +% +% See, e.g., BMF\_044101\_1 (1) or BMF\_044103\_1 (1) +% \begin{macrocode} +\def\subsection{% + \@startsection + {subsection}% + {2}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \small + \sffamily + \bfseries + \raggedright + }% +}% +% \end{macrocode} +% +% See, e.g., BMF\_044104\_1 (1), JMP\_123520\_1 (48), +% \begin{macrocode} +\def\subsubsection{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \small + \sffamily + \bfseries + \itshape + \raggedright + }% +}% +% \end{macrocode} +% +% \subsubsection{Runin Heads}% +% \begin{macrocode} +\def\paragraph{% + \@startsection + {paragraph}% + {4}% + {\parindent}% + {\z@}% + {-1em}% + {\normalfont\normalsize\itshape}% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\subparagraph{% + \@startsection + {subparagraph}% + {5}% + {\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}% +}% +% \end{macrocode} +% +% \begin{macro}{\section@preprintsty} +% \begin{macro}{\subsection@preprintsty} +% \begin{macro}{\subsubsection@preprintsty} +% Here are the formatting procedures specific to the preprint style; +% the only difference is that the heads are flush left instead of centered. +% +% \begin{macrocode} +\def\section@preprintsty{% + \@startsection + {section}% + {1}% + {\z@}% + {0.8cm \@plus1ex \@minus .2ex}% + {0.5cm}% + {% + \normalfont + \bfseries + \raggedright + }% +}% +%\def\@hangfrom@section@preprintsty#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}% +% \end{macrocode} +% \begin{macrocode} +\def\subsection@preprintsty{% + \@startsection + {subsection}% + {2}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \bfseries + \raggedright + }% +}% +% \end{macrocode} +% \begin{macrocode} +\def\subsubsection@preprintsty{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont +% \small + \itshape\bfseries + \raggedright + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% For examples of +% \env{theorem}, \env{proposition}, \env{lemma}, \env{remark}, \env{corollary}, \env{example}, +% and \env{proof} (with optional title), +% using independent numbering for each class, +% and with numbered and roman lists therein, +% see JMP\_122901\_1 (48). +% +% For theorems, etc, numbered by section, (and with theorems in the appendix) +% but equations numbered throughout, +% see JMP\_123301\_1 (48). +% +% For a (roman) list in text, theorem, and proof, +% see JMP\_123514\_1 (48). +% +% For numbered list in text, +% and equations numbered by section, +% see JMP\_123518\_1 (48). +% +% All AIP journals use frontmatter footnotes by default. +% \begin{macrocode} +\let\frontmatter@footnote@produce\frontmatter@footnote@produce@footnote +% \end{macrocode} +% +% +% \subsubsection{Table of Contents}% +% The toc will itself make an entry in the toc, +% but we temporarily turn off toc formatting for the duration. +% \begin{macrocode} +\def\@pnumwidth{1.55em} +\def\@tocrmarg {2.55em} +\def\@dotsep{2} +\def\ltxu@dotsep{4.5pt} +\setcounter{tocdepth}{3} +% \end{macrocode} +% +% \begin{macrocode} +\def\tableofcontents{% + \addtocontents{toc}{\string\tocdepth@munge}% + \print@toc{toc}% + \addtocontents{toc}{\string\tocdepth@restore}% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\tocdepth@munge{% + \let\l@section@saved\l@section + \let\l@section\@gobble@tw@ +}% +\def\@gobble@tw@#1#2{}% +% \end{macrocode} +% +% \begin{macrocode} +\def\tocdepth@restore{% + \let\l@section\l@section@saved +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\l@part#1#2{\addpenalty{\@secpenalty}% + \begingroup + \set@tocdim@pagenum{#2}% +% \@tempdima 3em % + \parindent \z@ + \rightskip\tocleft@pagenum plus 1fil\relax + \skip@\parfillskip\parfillskip\z@ + \addvspace{2.25em plus\p@}% + \large \bf % + \leavevmode\ignorespaces#1\unskip\nobreak\hskip\skip@ + \hb@xt@\rightskip{\hfil\unhbox\z@}\hskip-\rightskip\hskip\z@skip + \par + \nobreak % + \endgroup +}% +% \end{macrocode} +% +% \begin{macro}{\l@section} +% Determine which TOC elements are automatically indented. +% \begin{macrocode} +\def\tocleft@{\z@}% +\def\tocdim@min{5\p@}% +\def\l@section{% + \l@@sections{}{section}% Implicit #3#4 +}% +\def\l@f@section{% + \addpenalty{\@secpenalty}% + \addvspace{1.0em plus\p@}% + \bf +}% +\def\l@subsection{% + \l@@sections{section}{subsection}% Implicit #3#4 +}% +\def\l@subsubsection{% + \l@@sections{subsection}{subsubsection}% Implicit #3#4 +}% +\def\l@paragraph#1#2{}% +\def\l@subparagraph#1#2{}% +% \end{macrocode} +% \end{macro} +% +% Activate the auto TOC processing. +% \begin{macrocode} +\let\toc@pre\toc@pre@auto +\let\toc@post\toc@post@auto +% \end{macrocode} +% +% \begin{macrocode} +\def\listoffigures{\print@toc{lof}}% +\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +% \end{macrocode} +% +% \begin{macrocode} +\def\listoftables{\print@toc{lot}}% +\let\l@table\l@figure +% \end{macrocode} +% +% \subsubsection{Default column bottom}% +% All AIP journal styles have flush bottoms. +% +% \begin{macrocode} +\@booleanfalse\raggedcolumn@sw +% \end{macrocode} +% +% +% \subsubsection{Table alignment style}% +% +% \begin{macro}{\tableft@skip@float} +% \begin{macro}{\tabmid@skip@float} +% \begin{macro}{\tabright@skip@float} +% \begin{macro}{\array@row@pre@float} +% \begin{macro}{\array@row@pst@float} +% All AIP publications have the same table specification: +% Scotch rules above and below, centered in column. +% \begin{macrocode} +\def\tableft@skip@float{\z@ plus\hsize}% +\def\tabmid@skip@float{\@flushglue}% +\def\tabright@skip@float{\z@ plus\hsize}% +\def\array@row@pre@float{\hline\hline\noalign{\vskip\doublerulesep}}% +\def\array@row@pst@float{\noalign{\vskip\doublerulesep}\hline\hline}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Footnote formatting}% +% We customize the formatting of footnotes for all AIP journals. +% \begin{macro}{\@makefntext} +% \begin{macrocode} +\def\@makefntext#1{% + \def\baselinestretch{1}% + \leftskip1em% + \parindent1em% + \noindent + \nobreak\hskip-\leftskip + \hb@xt@\leftskip{% + \hss\@makefnmark\ % + }% + #1% + \par +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Appendix}% +% \begin{macro}{\appendix} +% \begin{macro}{\@hangfrom@appendix} +% \begin{macro}{\@hangfroms@appendix} +% \begin{macro}{\@appendixcntformat} +% \begin{macrocode} +\prepdef\appendix{% + \par + \let\@hangfrom@section\@hangfrom@appendix +%\let\@hangfroms@section\@hangfroms@appendix + \let\@sectioncntformat\@appendixcntformat +}% +\def\@hangfrom@appendix#1#2#3{% + #1% + \@if@empty{#2}{% + #3% + }{% + #2\@if@empty{#3}{}{:\ #3}% + }% +}% +\def\@hangfroms@appendix#1#2{% + #1#2% +}% +\def\@appendixcntformat#1{\appendixname\ \csname the#1\endcsname}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Bibliography}% +% +% Customize the \revtex\ for the AIP society. +% this task requires three components: +% the \BibTeX\ \file{aipnum.bst} and \file{aipauth.bst} style files, +% customizing code for \file{natbib}, and +% customizations of the \env{thebibliography} environment. +% +% \begin{macro}{\@bibstyle} +% Define the argument of the \cmd\bibliographystyle\ command. +% The user must have installed a \file{.bst} file of the corresponding name. +% This file will then be used by \BibTeX\ when compiling the document's \file{.bbl} file. +% +% The default bibliography style for the AIP journal substyles are \file{aipnum.bst} and \file{aipauth.bst}. +% To generate them, use \classname{custom-bib} version 4.21 or later. +% Run the \file{.bst} generator, \file{makebst.tex}, and +% accept all defaults, with the following exceptions: +% +% \begin{enumerate} +% \item +% ORDERING OF REFERENCES: c: seq-no (references in order of Citation); +% \item +% AUTHOR NAMES: i: nm-init,ed-au (Initials + surname); +% \item +% NUMBER OF AUTHORS: l: max 12, min 12 (there will be three prompts total); +% \item +% TYPEFACE FOR AUTHORS IN LIST OF REFERENCES: u: nmft,nmft-def (User defined author font); +% \item +% FONT FOR FIRST NAMES: u: fnm-def (First names in user defined font); +% \item +% EDITOR NAMES IN INCOLLECTION ETC: a: nmfted (Editors incollection like authors); +% \item +% DATE FORMAT: p: yr-par (Date in parentheses); +% \item +% SUPPRESS MONTH: x: xmth (Date is year only); +% \item +% TITLE OF ARTICLE: i: tit-it (Title italic) +% \item +% ARTICLE TITLE PRESENT: x: jtit-x (No article title); +% \item +% JOURNAL NAME FONT: r: jttl-rm (Journal title normal); +% \item +% TECHNICAL REPORT TITLE: b: trtit-b (Tech. report title like books); +% \item +% JOURNAL VOLUME: b: vol-bf (Volume bold); +% \item +% VOLUME PUNCTUATION: c: volp-com (Volume with comma); +% \item +% PAGE NUMBERS: f: jpg-1 (Only start page number); +% \item +% JOURNAL NAME PUNCTUATION: x: jnm-x (Space after journal); +% \item +% PUBLISHER IN PARENTHESES: d: pub-date (Publisher and date in parentheses); +% \item +% PUBLISHER POSITION: p: pre-pub (Publisher before chapter, pages); +% \item +% ISBN NUMBER: isbn: (Include ISBN for books, booklets) +% \item +% ISSN NUMBER: issn: (Include ISSN for periodicals) +% \item +% EDITOR IN COLLECTIONS: b: edby (Booktitle, edited by \dots); +% \item +% PUNCTUATION BETWEEN SECTIONS (BLOCKS): c: blk-com (Comma between blocks); +% \item +% ABBREVIATE WORD `PAGES': a: pp (`Page' abbreviated); +% \item +% ABBREVIATE WORD `EDITORS': a: ed (`Editor' abbreviated); +% \item +% OTHER ABBREVIATIONS: a: abr (Abbreviations); +% \item +% ABBREVIATION FOR `EDITION': a: ednx (`Edition' abbreviated as `ed'); +% \item +% EDITION NUMBERS: n: ord (Numerical editions); +% \item +% STORED JOURNAL NAMES: a: jabr (Abbreviated journal names); +% \item +% FONT OF `ET AL': i: etal-it (Italic et al); +% \item +% ADDITIONAL REVTeX DATA FIELDS: r: revdata, eprint, url, url-blk (Include REVTeX data fields collaboration, eid, eprint, numpages, url) +% \item +% NEW FONT SELECTION SCHEME: n: nfss (NFSS); +% \item +% ADDITIONAL REVTeX DATA FIELDS: y: revdata (additional data fields); +% \item +% REFERENCE COMPONENT TAGS: y: reference component tags; +% \item +% URL ADDRESS: n: URL as note; +% \end{enumerate} +% +% A file \file{aipnum.dbj} file equivalent to the following should result: +% \begin{verbatim} +%\input docstrip +%\preamble +%---------------------------------------- +%*** REVTeX-compatible aipnum4-1.bst 2009-10-08 *** +%\endpreamble +%\postamble +%End of customized bst file +%\endpostamble +%\keepsilent +%\askforoverwritefalse +%\def\MBopts{\from{merlin.mbs}{% +% head,\MBopta} +%\from{physjour.mbs}{\MBopta} +%\from{geojour.mbs}{\MBopta} +%\from{photjour.mbs}{\MBopta} +%\from{merlin.mbs}{tail,\MBopta}} +%\def\MBopta{% +% lang,%: Use language field to switch hyphenation patterns for title +% pres,pres-bf,%: Presentation, speaker bold face +% seq-no,%: Citation order (unsorted, like unsrt.bst) +% vonx,%: Sort without von part (de la Maire after Mahone) +% nm-init,ed-au,%: Initials + surname (J. F. Smith) +% nmft,nmft-def,%: User defined author font (\bibnamefont) +% fnm-def,%: First names in user defined font (\bibfnamefont) +% nmfted,%: Editors incollection like authors font +% nmand-rm,%: `And' in normal font (JONES and JAMES) +% lab,lab-def,%: User defined citation font (\citenamefont) +% and-rm,%: Cited `and' in normal font +% yr-par,%: Date in parentheses as (May 1993) +% date-nil-x,%: If date is empty, then do not produce the surrounding punctuation (parens, brackets, colon, comma) +% tit-qq,%: Title and punctuation in double quotes (``Title,'' ..) +% inproceedings-chapter,%: produce pages after chapter, just as in InBook +% jtit-x,%: Title is ignored +% inproceedings-chapter,%: produce pages after chapter just as in InBook +% article-booktitle,%: format booktitle +% article-series,%: article can has series +% jttl-rm,%: Journal name normal font +% journal-address,%: Include address field (in parentheses) along with journal name +% book-bt,%: Field `booktitle', or if absent field `title', is book title +% thesis-title-o,%: Title is optional: no warning issued if empty +% techreport-institution-par,%: format tech report institution like book publisher +% vol-bf,%: Volume bold as {\bf vol}(num) +% vnum-x,%: Journal vol, without number as 34 +% volp-com,%: Volume with comma as vol(num), ppp +% jpg-1,%: Only start page number +% book-editor-booktitle,%: Book permits empty author, produces title before editor in this case +% inbook-editor-booktitle,%: Allow using both title/booktitle, both author/editor +% bookaddress,%: Italic booktitle followed by bookaddress in roman +% num-xser,%: Allows number without series and suppresses word "number" +% number-cap,%: Capitalize word `number' as: "Number 123" +% chapter-cap,%: Capitalize word `chapter' as: `Chapter 42' +% series-number,%: Series number as: `Springer Lecture Notes No. 125' +% numser-booktitle,%: After book title and conference address, and before editors +% ser-vol,%: Series, vol. 23 +% ser-rm,%: format series roman , even when used with volume +% volume-cap,%: Capitalize word `volume', as: `Volume 7 in Lecture Series' +% ser-ed,%: Series and volume after booktitle and before editors +% jnm-x,%: Space after journal name +% pg-bk,book-chapter-pages,%: As chapter and page: chapter 42, page 345 +% pub-date,%: Publisher with address and date in parentheses (Oxford, 1994) +% ay-empty-pub-parens-x,%: eliminate parentheses altogether if nothing inside +% pre-pub,%: Publisher before volume, chapter, pages +% pre-edn,%: Edition before publisher +% pre-pub,pre-edn,%: Edition, publisher, volume, chapter, pages +% isbn,%: Include ISBN for books, booklets, etc. +% issn,%: Include ISSN for periodicals +% doi-link,doi,%: Doi forms a link to the publication, anchored to the volume or title +% edby,%: In booktitle, edited by .. (where .. is names) +% blk-com,%: Comma between blocks +% fin-endbibitem,%: Command at end instead of period +% pp,%: `Page' abbreviated as p. or pp. +% ed,%: `Editor' abbreviated as ed. or eds. +% abr,%: Abbreviations of such words +% ednx,%: `Edition' abbreviated as `ed' +% ord,%: Numerical editions as 1st, 2nd, 3rd, etc +% jabr,%: Abbreviated journal names +% etal-it,%: Italic et al +% revdata,eprint,url,url-blk,translation,%: Include REVTeX data fields collaboration, eid, eprint, archive, url, translation +% SLACcitation,%: Produce SLACcitation field +% numpages-x,%: Do not include numpages field +% url,url-prefix-x,%: URL without prefix (default: `URL ') +% bibinfo,%: Reference component tags like \bibinfo in the content of \bibitem +% bibfield,%: Element tags like \bibfield in the content of \bibitem +% nfss,%: Use LaTeX commands which may not work with Plain TeX +%,{% +% }} +%\generate{\file{aipnum4-1.bst}{\MBopts}} +%\endbatchfile +% \end{verbatim} +% +% Between the two files \file{aipnum.dbj} and \file{aipauth.dbj}, +% the differences are limited: +% \file{aipnum.dbj} has two lines lacking in \file{aipauth.dbj}: +% \begin{verbatim} +% seq-no,%: Citation order (unsorted, like unsrt.bst) +% nm-init,ed-au,%: Initials + surname (J. F. Smith) +% \end{verbatim} +% thus, the ``numbered citation'' bibliography is sorted by citation order, and +% the names are give first inital, then last name. +% +% Likewise, \file{aipauth.dbj} has one line lacking in \file{aipnum.dbj}: +% \begin{verbatim} +% nm-rev,%: Surname + comma + initials (Smith, J. F.) +% \end{verbatim} +% Thus, the ``author-year'' bibliography is sorted by author name, and +% names are given last name first, followed by initials. +% +% We ensure that the journal substyle has the first word +% in the matter by installing the (default) AIP code +% later on (see Section~\ref{sec:aip-defaults}). +% \end{macro} +% +% \begin{macro}{\pre@bibdata} +% +% Set up to write endnotes to a .bib file; its data will be incorporated into the bibliography. +% \begin{macrocode} + \def\pre@bibdata{\jobname\bibdata@app}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibsection} +% We define the sectioning command to use when starting the bibliography +% (we use \cmd\refname). +% \begin{macrocode} +\def\refname{References}% +\def\rtx@bibsection{% + \@ifx@empty\refname{% + \par\vspace{6\p@ plus 6\p@}% + }{% +% \end{macrocode} +% The following line has been commented out: +% \begin{verbatim} +% \let\@hangfroms@section\@hang@froms +% \end{verbatim} +% \begin{macrocode} + \expandafter\section\expandafter*\expandafter{\refname}% + \@nobreaktrue + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibpreamble} +% \begin{macro}{\bibsep} +% \begin{macro}{\newblock} +% \begin{macrocode} +\let\bibpreamble\@empty +\appdef\setup@hook{% + \bibsep\z@\relax +}% +\def\newblock{\ }% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bibfont} +% We define the font switch that applies to the body of the bibliography. +% +% \begin{macrocode} +\appdef\setup@hook{% + \def\bibfont{% + \preprintsty@sw{}{\footnotesize}% + \@clubpenalty\clubpenalty + \labelsep\z@ + }% +}% +\let\place@bibnumber\place@bibnumber@sup +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Index}% +% \begin{macrocode} +\newenvironment{theindex}{% + \columnseprule \z@ + \columnsep 35\p@ + \c@secnumdepth-\maxdimen + \onecolumngrid@push + \section{\indexname}% + \thispagestyle{plain}% + \parindent\z@ + \parskip\z@ plus.3\p@\relax + \let\item\@idxitem + \onecolumngrid@pop +}{% +}% +% +\def\@idxitem{\par\hangindent 40\p@} +% +\def\subitem{\par\hangindent 40\p@ \hspace*{20\p@}} +% +\def\subsubitem{\par\hangindent 40\p@ \hspace*{30\p@}} +% +\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax} +% \end{macrocode} +% +% +% \subsubsection{Typesize Processing}% +% The formatting specification for the preprint option is: +% Times Roman 12 pt, double spacing, with 1-inch margins on letter paper. +% Paragraphs indented ``five spaces''. +% Display math on standard indent, with equation number flush right in parenthesis, with subequations roman. +% +% That for reprint option is to format similar to the printed journal; with most journals +% set (approximately analyzed) 10-point, 2-column grid, letter paper. +% \begin{macrocode} +\expandafter\def\csname rtx@aip10pt\endcsname{% + \let\@currname@class\@currname + \def\@currname{aps10pt\substyle@post}% + \class@info{Reading file \@currname.\substyle@ext}% + \input{\@currname.\substyle@ext}% + \let\@currname\@currname@class + \class@info{Overriding 10pt}% + \aipreprint +}% +\expandafter\def\csname rtx@aip11pt\endcsname{\csname rtx@aip12pt\endcsname}% +\expandafter\def\csname rtx@aip12pt\endcsname{% + \let\@currname@class\@currname + \def\@currname{aps12pt\substyle@post}% + \class@info{Reading file \@currname.\substyle@ext}% + \input{\@currname.\substyle@ext}% + \let\@currname\@currname@class + \class@info{Overriding 12pt}% + \aippreprint +}% +% \end{macrocode} +% +% \begin{macro}{\today} +% Procedure \cmd\today\ is used in the article class, but not in +% this document class. +% \begin{macrocode} +\def\today{% + \number\day\space + \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\year +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{A. Running Title} +% User-provided running title \cmd\@shorttitle\ to be set. +% +% \subsection{B. Equation numbering, figure and table numbering} +% Equations can be numbered throughout, or by section, with appendix equations prepended by the appendix label. +% Figures and tables are numbered throughout. +% +% +% \subsection{C. Title} +% Title page may break above abstract, within author list. +% Title notes are signified by superior letter followed by right parenthesis. +% +% \subsection{D. Author footnote} +% Set short line above these footnotes. +% +% \subsection{E. Author} +% Class option \classoption{superscriptaddress} is standard. +% \begin{macrocode} + \clo@superscriptaddress +% \end{macrocode} +% +% \subsection{F. Affiliations} +% Set italic. +% +% \subsection{G. Received date} +% +% +% \subsection{H. Abstract} +% Single paragraph, no indent. +% +% \subsection{J. Lead Paragraph} +% Set boldface, flush left before main text, single paragraph. +% Separated from text by a short centered rule. +% +% \subsection{K. Headings} +% Use labels: ROMAN, LETTER, arabic, letter. +% Set ALLCAPS, boldface; Initial cap, boldface; Initial cap, bold-italic; Initial cap, italic. +% +% Theorem, proof title followed by colon. Follow author. +% +% \subsection{L. Text Footnotes} +% Not permitted; use endnotes. +% +% \subsection{M. Citations and Bibliography} +% Numerical \filename{aipnum.bst}, author-year \filename{aipauth.bst}, and numbered author-year \filename{aipnumauth.bst} are the available choices. +% Numerical is standard, with all styles permitted in journal classes 3a and 4b. +% +% +% \subsection{N. References} +% +% Article Title usage: +% +% Article title required in all journals with "unpublished", "to be published", "in press" and "submitted" refs. +% +% Exceptions: +% +% Journal classes 1a,1b,2,4a: +% +% Article title not allowed in published references, except in the case of "in press" or submitted" (see sample references below). +% +% Journal class 3a: +% +% Article title allowed but not required in author-year references (use must be consistent within a single manuscript). +% +% Journal class 3b: +% +% Article title required in all journal references and report references. +% +% Journal class 4b: +% +% Article title allowed in journal references in author-year mode. +% +% \subsection{O. Examples of Numerical References} +% +% +% \subsection{P. References in Author-year mode} +% +% +% \subsection{Q. Numbered Author-year References} +% +% +% \subsection{R. Tables} +% Placed within text (floated), labeled with Roman numeral. +% +% Table caption placed above table, followed by space, +% two double lines, space, table column headings, space, +% single line, table contents, two double lines. +% +% Footnotes labeled with superior lower-case letter, set below table contents. +% +% \subsection{S. Figures} +% Placed within text (floated), labeled with arabic numbers. +% +% Caption set below figure. A citation to be set inline, not superscripted. +% +% \subsection{Society defaults}% +% +% After this society file is read in, we will process the +% \cmd\@journal- and \cmd\@pointsize-specific code. +% Here we define the defaults. +% +% We select \textbf{Chaos} as the default journal substyle, because it is +% the most permissive in terms of bibliography and citation style, +% and it is formatted in two column in the reprint style. +% +% \begin{macrocode} +\def\@journal@default{cha}% +\def\@pointsize@default{12}% +% \end{macrocode} +% +% \subsection{Journal-Specific Code}% +% +% For AIP journals, we supply code specific to JCP, POP, RSI, JAP, APL, CHA, POF, BMF, RSE, JMP. +% +% \subsubsection{\classoption{jcp}}% +%A member of the journal class 1a. +% \begin{macrocode} +\def\rtx@aipjcp{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Journal class 1a uses the (superscript) numerical citation style by default. +% \begin{macrocode} + \@booleanfalse\authoryear@sw +% \end{macrocode} +% +% End of \classoption{jcp} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{pop}}% +%A member of the journal class 1a. +% \begin{macrocode} +\def\rtx@aippop{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Journal class 1a uses the (superscript) numerical citation style by default. +% \begin{macrocode} + \@booleanfalse\authoryear@sw +% \end{macrocode} +% +% End of \classoption{pop} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{rsi}}% +%A member of the journal class 1a. +% \begin{macrocode} +\def\rtx@aiprsi{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Journal class 1a uses the (superscript) numerical citation style by default. +% \begin{macrocode} + \@booleanfalse\authoryear@sw +% \end{macrocode} +% +% End of \classoption{rsi} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{jap}}% +%Sole member of the journal class 1b. +% +% No running title. +% \begin{macrocode} +\def\rtx@aipjap{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Journal class 1b uses the (superscript) numerical citation style by default. +% \begin{macrocode} + \@booleanfalse\authoryear@sw + \let\@runningtitle\@empty +% \end{macrocode} +% +% End of \classoption{jap} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{apl}}% +%Sole member of the journal class 2. +% +% No running title. +% \begin{macrocode} +\def\rtx@aipapl{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Journal class 2 uses the (superscript) numerical citation style by default. +% \begin{macrocode} + \@booleanfalse\authoryear@sw + \let\@runningtitle\@empty +% \end{macrocode} +% +% End of \classoption{apl} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{apm}}% +% +% \begin{macrocode} +\def\rtx@aipapm{% + \typeout{Using journal substyle \@journal.}% + \@booleanfalse\authoryear@sw + \let\@runningtitle\@empty +}% +% \end{macrocode} +% +% +% \subsubsection{\classoption{cha}}% +%Sole member of the journal class 3a. +% \begin{macrocode} +\def\rtx@aipcha{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Article titles are allowed. +% \begin{macrocode} + \@booleanfalse\aip@jtitx@sw +% \end{macrocode} +% +% End of \classoption{cha} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{pof}}% +%Sole member of the journal class 3b. +% \begin{macrocode} +\def\rtx@aippof{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Journal class 3b uses the (superscript) numerical citation style by default. +% Article titles are required, so we include them if available, +% but if absent, we can do no more than make a warning in the \file{.blg}. +% \begin{macrocode} + \@booleanfalse\authoryear@sw + \@booleanfalse\aip@jtitx@sw +% \end{macrocode} +% +% End of \classoption{pof} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{bmf}}% +% A member of the journal class 4a, +% the Biomicrofluidics journal is single column. +% \begin{macrocode} +\def\rtx@aipbmf{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Journal class 4a uses the (superscript) numerical citation style by default. +% Journal is formatted in a single column. +% \begin{macrocode} + \@booleanfalse\authoryear@sw +% \end{macrocode} +% +% End of \classoption{bmf} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% +% \subsubsection{\classoption{sd}}% +% \begin{macrocode} +\def\rtx@aipsd{% + \typeout{Using journal substyle \@journal.}% + \@booleanfalse\authoryear@sw +}% +% \end{macrocode} +% +% \subsubsection{\classoption{cp}}% +% \begin{macrocode} +\def\rtx@aipcp{% + \typeout{Using journal substyle \@journal.}% + \@booleanfalse\authoryear@sw% +% \@booleantrue\authoryear@sw + \@booleanfalse\twocolumn@sw% +% \@booleantrue\longbibliography@sw% +% \@booleanfalse\aip@jtitx@sw +}% +% \end{macrocode} +% +% \subsubsection{\classoption{jor}}% +% \begin{macrocode} +\def\rtx@aipjor{% + \typeout{Using journal substyle \@journal.}% + \@booleantrue\authoryear@sw% + \@booleantrue\twoside@sw\@mparswitchfalse% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{rse}}% +%A member of the journal class 4a. +% \begin{macrocode} +\def\rtx@aiprse{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Journal class 4a uses the (superscript) numerical citation style by default. +% \begin{macrocode} + \@booleanfalse\authoryear@sw +% \end{macrocode} +% +% End of \classoption{rse} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{jmp}}% +% Sole member of the journal class 4b, Journal of Mathematical Physics is single column. +% For an example of \env{itemize}, see JMP\_122901\_1 (48). +% \begin{macrocode} +\def\rtx@aipjmp{% + \typeout{Using journal substyle \@journal.}% +% \end{macrocode} +% Article titles are allowed. +% Journal is formatted in a single column. +% \begin{macrocode} + \@booleanfalse\aip@jtitx@sw + \@booleanfalse\twocolumn@sw + \@booleantrue\onecolumn@sw +% \end{macrocode} +% +% End of \classoption{jmp} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% +% \subsubsection{\classoption{adv}}% +% \begin{macrocode} +\def\rtx@aipadv{% + \typeout{Using journal substyle \@journal.}% + \@booleanfalse\authoryear@sw + \let\@runningtitle\@empty +}% +% \end{macrocode} +% +% +% \subsection{Establish AIP Defaults\label{sec:aip-defaults}} +% +% \begin{macro}{\footinbib@sw} +% All AIP journals invoke the \classoption{footinbib} option. +% \begin{macrocode} +\@booleantrue\footinbib@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\place@bibnumber} +% \begin{macro}{\@bibstyle} +% \begin{macro}{\bibpunct} +% We install code that will +% govern the style in which \cmd\cite\ commands are +% formatted, +% select the presentation for \cmd\bibitem s +% and control the \BibTeX\ processing. +% +% Note that a journal substyle may override these settings. +% Likewise, document preamble may itself invoke \cmd\bibpunct\ or \cmd\bibliographystyle, +% thereby overriding these settings and those of the journal substyle. +% +% The numbered citations of \file{aipnum} and \file{aipauthnum} +% are compatible with \classoption{footinbib} and +% the compression and coalescing features of \classname{natbib}, +% while \file{aipauth}'s author-year citations are not. +% Therefore, we de-select such options if we are selecting author-year citations. +% +% Note on \classname{natbib} presets: +% \file{aipnum} and \file{aipauthnum} uses the Chicago \cmd\bibpunct\ style; +% while \file{aipauth} uses that of Nature. +% +% Note on \cmd\NAT@mcite: if not using numerical citations, we set \cmd\NAT@mcite\ +% to a lower value, to turn off the mcite semantics of \classname{natbib}. +% \begin{macrocode} +\let\old@place@bibnumber\place@bibnumber +\let\place@bibnumber\place@bibnumber@sup +\appdef\setup@hook{% + \authoryear@sw{% + \aip@jtitx@sw{% + \def\@bibstyle{aipauth\substyle@post}% + }{% + \def\@bibstyle{aipauth\substyle@post}% + }% + \authornum@sw{% + \bibpunct{}{}{,}{s}{}{\textsuperscript{,}}% + \let\onlinecite\rev@citealpnum + }{% + \bibhang10\p@ + \bibpunct{(%) + }{%( + )}{; }{a}{,}{,}% + \@booleanfalse\footinbib@sw + \let\NAT@mcite\@ne + \let\NAT@sort\z@ + \def\NAT@cmprs{\z@}% + \let\NAT@def@citea\rtx@def@citea + \let\NAT@def@citea@close\rtx@def@citea@close + }% + }{% + \aip@jtitx@sw{% + \def\@bibstyle{aipnum\substyle@post}% + }{% + \def\@bibstyle{aipnum\substyle@post}% + }% + \bibpunct{}{}{,}{s}{}{\textsuperscript{,}}% + \let\onlinecite\rev@citealpnum + }% +}% +\def\make@footnote@endnote{% + \footinbib@sw{% + \authoryear@sw{\authornum@sw{\false@sw}{\true@sw}}{\false@sw}% + {}{% + \ltx@footnote@push + \def\thempfn{Note\thefootnote}% + \let\ltx@footmark\rev@citemark + \let\ltx@foottext\rev@endtext + \appdef\class@enddocumenthook{\auto@bib}% + \let\printendnotes\relax + }% + }{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\aipreprint}% +% We want to override \filename{aps10pt.rtx}. +% \begin{macrocode} +\def\aipreprint{% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\aippreprint}% +% We want to override \filename{aps12pt.rtx}. +% \begin{macrocode} +\def\aippreprint{% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Fixing the bug for single author/affiliation}% +% In case of single author/affiliation no need to produce the affiliation number after the author name. +% +% \begin{macrocode} +%% +\xdef\t@talAU{0}% TeXSupport +\def\frontmatter@author@produce@script{% + \begingroup + \let\@author@present\@author@present@script + \frontmatterverbose@sw{\typeout{\string\frontmatter@author@produce@script:}\say\@AAC@list\say\@AFF@list\say\@AFG@list}{}% + \let\AU@temp\@empty + \@tempcnta\z@ + \let\AF@opr \@gobble + \def\AU@opr{\@author@count\@tempcnta}% + \def\CO@opr{\@collaboration@count\AU@temp\@tempcnta}% + \@AAC@list% + \xdef\t@talAU{\the\@tempcnta}% TeXSupport + \expandafter\CO@opr\@author@cleared + \begingroup + \frontmatter@authorformat + \let\AF@opr \@affilID@def + \let\AU@opr \@author@present + \def\CO@opr{\@collaboration@present\AU@temp}% + \set@listcomma@list\AU@temp + \@AAC@list + \unskip\unskip + \par + \endgroup + \begingroup + \frontmatter@above@affiliation@script + \let\AFF@opr \@affil@script + \@AFF@list + \frontmatter@footnote@produce + \par + \endgroup + \endgroup +}% +\def\doauthor#1#2#3{% TeXSupport + \ignorespaces#1\unskip\@listcomma + \begingroup + \ifnum\t@talAU=1\else\ifnum\c@affil=\@ne\relax\else#3\fi\fi% TeXSupport + \@if@empty{#2}{\endgroup{}{}}{\endgroup{\ifnum\t@talAU=1\else\ifnum\c@affil=\@ne\relax\else\comma@space\fi\fi}{}\frontmatter@footnote{#2}}% TeXSupport + \space \@listand +}% +%% +% \end{macrocode} +% +% \subsubsection{\classoption{Page restriction for APL (removed)}}% +% +% This macro was installed to calculate page-lenght for APL articles. +%% Appended by Ms. Sehar Tahir (Aptara) for American Institute of Physics. +%% To impose page restrictions for APL journal at MSP stage. +% +% \begin{macrocode} +%% +%% HISTORY +%% Revised page restriction to 4 pages: 05/10/2011 +%% Tweaked the page over length message: 31/10/2011 +%% Removed unused page restriction code: 30/09/2020 +%% +\DeclareOption{no-pagerestrict}{% + \class@warn{Deprecated pagerestrict code. Option 'no-pagerestrict' was ignored.}}% +% \end{macrocode} +% End of \classoption{apl} pagerestriction code. +% +% \subsubsection{Style updates for \texttt{jmp} and \texttt{rse}}% +% +% JMP, BMF and RSE journal's to be as one column at Reprint stage +% +%\begin{macrocode} +%% +%% JMP, BMF and RSE journal's to be as one column at Reprint stage +%% +\appdef\rtx@require@packages{% +\def\jnl@rse{rse}% +\def\jnl@jmp{jmp}% +\preprintsty@sw{}% + {%\ifx\@journal\jnl@jmp% + \onecolumn@sw{% + \typeout{AIP Info: \@journal\space journal style Single column, 2013/07/30}% + \@booleanfalse\twocolumn@sw% + \appdef\setup@hook{% + \twoside@sw{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 60pt + }{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 44pt + }% + }% + \marginparsep 10pt + \topmargin -17pt + \headheight 12pt + \headsep 25pt + \topskip 10pt + \splittopskip\topskip + \footskip 30pt + \textheight=53.5pc + \textwidth 33pc + \columnsep 10pt + \def\title@column#1{% + \minipagefootnote@init + \begingroup + \let\@footnotetext\frontmatter@footnotetext + \ltx@no@footnote + #1% + \endgroup + \minipagefootnote@foot + }% +}{}% +% \fi% Curly brace +} +% \end{macrocode} +% +% \subsubsection{Style updates for \texttt{bmf} and addition of new substyle \texttt{sd}}% +% +% BMF journal to match with final layout (textheight and other page setup dimensions). +% Addition of new journal SD: Structural Dynamics. +% +% \begin{macrocode} +%% BMF journal to match with final layout (textheight) +%% Addition of new journals SD: Structural Dynamics +% +\def\jnl@bmf{bmf}% +\def\jnl@sd{sd}% +\preprintsty@sw{}% + {%\ifx\@journal\jnl@bmf% + \newonecolumn@sw{% + \typeout{AIP Info: \@journal\space journal style Single column, 2011/08/11}% + \@booleanfalse\twocolumn@sw% + \appdef\setup@hook{% + \twoside@sw{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 60pt + }{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 44pt + }% + }% + \marginparsep 10pt + \topmargin -17pt + \headheight 12pt + \headsep 25pt% 25pt + \topskip 10pt + \splittopskip\topskip + \footskip 30pt +% \textheight=53.5pc + \textheight=54.5pc% + \textwidth 33pc + \columnsep 10pt + \def\title@column#1{% + \minipagefootnote@init + \begingroup + \let\@footnotetext\frontmatter@footnotetext + \ltx@no@footnote + #1% + \endgroup + \minipagefootnote@foot + }% +\def\adjust@abstractwidth{% + \parindent1em\relax +% \advance\leftskip.5in\relax + \advance\leftskip2.5pc\relax + \advance\rightskip2.5pc\relax + \@totalleftmargin\leftskip + \@afterheading\@afterindentfalse +}% +% \fi +}{}% +} +% \end{macrocode} +% +% \subsubsection{Addition of new substyle \texttt{jor}}% +% +% Addition of new journal JOR: Journal of Rheology. +% +% \begin{macrocode} +%% +%% Journal of Rheology (jor) +%% +\def\jnl@jor{jor}% +\preprintsty@sw{}% + {\ifx\@journal\jnl@jor% + \typeout{AIP Info: \@journal\space journal style Single column, 2013/10/24}% + \@booleanfalse\twocolumn@sw% + \appdef\setup@hook{% + \twoside@sw{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 60pt + }{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 44pt + }% + }% + \marginparsep 10pt + \topmargin -17pt + \headheight 12pt + \headsep 25pt + \topskip 10pt + \splittopskip\topskip + \footskip 30pt + \textheight=53.5pc + \textwidth 33pc + \columnsep 10pt + \def\title@column#1{% + \minipagefootnote@init + \begingroup + \let\@footnotetext\frontmatter@footnotetext + \ltx@no@footnote + #1% + \endgroup + \minipagefootnote@foot + }% +\def\frontmatter@title@format{% + \preprintsty@sw{}{\Large}% + \sffamily% + \bfseries% + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%\raggedright% + \parskip\z@skip% +}% +\def\frontmatter@@indent{% + \skip@\@flushglue + \@flushglue\z@ plus.3\hsize\relax + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%\raggedright +%\advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@flushglue\skip@ +}% +%\def\frontmatter@authorformat{% +% \frontmatter@@indent +% \sffamily +%}% +\def\frontmatter@RRAP@format{% + \addvspace{5\p@}% + \small + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%%\raggedright +%%\advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \everypar{% + \hbox\bgroup(\@gobble@leavemode@uppercase%) + }% + \def\par{% + \@ifvmode{}{%( + \unskip)\egroup\@@par + }% + }% +}% +\def\frontmatter@abstractfont{}% +\def\frontmatter@abstractwidth{\textwidth} +\def\abstractname{Synopsis} +\def\frontmatter@abstractheading{% + \begingroup + \centering\large + {\bfseries\abstractname} + \par\vskip.25\baselineskip + \endgroup +}% +\appdef\setup@hook{% + \preprintsty@sw{}{% + \let\refname\old@refname%\@empty + }% +}% +% +\def\ps@article{% + \def\@evenhead{\let\\\heading@cr\sffamily\thepage\quad\checkindate\hfil\@runningtitle\hfil}% + \def\@oddhead{\let\\\heading@cr\hfil\sffamily\@runningtitle\hfil\checkindate\quad\thepage}% + \def\@oddfoot{}% + \def\@evenfoot{}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\@make@capt@title#1#2{% + \@ifx@empty\float@link{\@firstofone}{\expandafter\href\expandafter{\float@link}}% + {{\bfseries#1}}\@caption@fignum@sep#2% +}% +\def\@caption@fignum@sep{{\bfseries.} }% + \fi} +% \end{macrocode} +% +% \subsubsection{Addition of new substyle \texttt{cp}}% +% +% Addition of new journal AIP-CP: AIP Conference Proceedings. +% +% \begin{macrocode} +%% +%% AIP Conference Proceedings +%% +\def\jnl@cp{cp}% +\preprintsty@sw{}% + {\ifx\@journal\jnl@cp% + \typeout{AIP Info: \@journal\space journal style Single column, 2013/10/30}% + \@booleanfalse\twocolumn@sw% + \appdef\setup@hook{% + \twoside@sw{% + \oddsidemargin 0pt + \evensidemargin 0pt + \marginparwidth 60pt + }{% + \oddsidemargin 0pt + \evensidemargin 0pt + \marginparwidth 44pt + }% + }% + \marginparsep 10pt + \topmargin -29.5pt + \headheight 12pt + \headsep 25pt + \topskip 10pt + \splittopskip\topskip + \footskip 30pt + \textheight=53.5pc + \textwidth 39pc + \columnsep 10pt +%% + \def\title@column#1{% + \minipagefootnote@init + \begingroup + \let\@footnotetext\frontmatter@footnotetext + \ltx@no@footnote + #1% + \endgroup + \minipagefootnote@foot + }% +%% +\def\frontmatter@title@format{% + \preprintsty@sw{}{\LARGE}% \Large +%\sffamily% + \bfseries% + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%\raggedright% + \parskip\z@skip% +}% +%% +\def\frontmatter@@indent{% + \skip@\@flushglue + \@flushglue\z@ plus.3\hsize\relax + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%\raggedright +%\advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@flushglue\skip@ +}% +%% +\def\frontmatter@RRAP@format{% + \addvspace{5\p@}% + \small + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%%\raggedright +%%\advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \everypar{% + \hbox\bgroup(\@gobble@leavemode@uppercase%) + }% + \def\par{% + \@ifvmode{}{%( + \unskip)\egroup\@@par + }% + }% +}% +\def\frontmatter@abstractfont{\small}% +\def\frontmatter@abstractwidth{\textwidth} +\def\@keys@name{{\small\bfseries Keywords:} }% +\def\@pacs@name{{\small\bfseries PACS:} }% +\def\abstractname{Abstract.} +%% +\def\frontmatter@abstractheading{% + \begingroup +% \centering\large + \small% + {\bfseries\abstractname} +% \par\vskip.25\baselineskip + \endgroup +}% +%% +\def\adjust@abstractwidth{% + \parindent1em\relax +% \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@afterheading\@afterindentfalse + \small% +}% +%% +\def\frontmatter@PACS@format{% +% \addvspace{11\p@}% + \adjust@abstractwidth +% \parskip\z@skip + \samepage +}% +\def\frontmatter@keys@format{% + \addvspace{11\p@}% + \adjust@abstractwidth + \parskip\z@skip + \samepage +}% +%% +\def\frontmatter@authorformat{% + \frontmatter@@indent + \Large% +% \sffamily + \vskip.5\baselineskip% +}% +%% +%% +\def\titleblock@produce{% + \begingroup + \ltx@footnote@pop + \def\@mpfn{mpfootnote}% + \def\thempfn{\thempfootnote}% + \c@mpfootnote\z@ + \let\@makefnmark\frontmatter@makefnmark + \frontmatter@setup + \thispagestyle{titlepage}\label{FirstPage}% + \frontmatter@title@produce + \groupauthors@sw{% + \frontmatter@author@produce@group + }{% + \frontmatter@author@produce@script + }% + \frontmatter@RRAPformat{% + \expandafter\produce@RRAP\expandafter{\@date}% + \expandafter\produce@RRAP\expandafter{\@received}% + \expandafter\produce@RRAP\expandafter{\@revised}% + \expandafter\produce@RRAP\expandafter{\@accepted}% + \expandafter\produce@RRAP\expandafter{\@published}% + }% + \frontmatter@abstract@produce + \@ifx@empty\@keywords{}{% + \@keywords@produce\@keywords + }% + \@ifx@empty\@pacs{}{% + \@pacs@produce\@pacs + }% + \par + \frontmatter@finalspace + \endgroup +}% +%% +\appdef\setup@hook{% + \preprintsty@sw{}{% + \let\refname\old@refname%\@empty + }% +}% +%% +\def\ps@article{% +% \def\@evenhead{\let\\\heading@cr\thepage\quad\checkindate\hfil{\leftmark}}% +% \def\@oddhead{\let\\\heading@cr{\rightmark}\hfil\checkindate\quad\thepage}% + \def\@evenhead{}% + \def\@oddhead{}% + \def\@oddfoot{}% + \def\@evenfoot{}% + \let\@mkboth\markboth + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +%% +\def\@make@capt@title#1#2{% + \@ifx@empty\float@link{\@firstofone}{\expandafter\href\expandafter{\float@link}}% + {{\bfseries#1}}\@caption@fignum@sep#2% +}% +\def\@caption@fignum@sep{{\bfseries.} }% +\setcounter{secnumdepth}{0} +\def\section{\@startsection{section}{1}{\z@}{-0.8cm \@plus-1ex \@minus -.2ex}{0.5cm}{\normalfont\large\bfseries\centering}}% \sffamily\small +\def\subsection{\@startsection{subsection}{2}{\z@}{-.8cm \@plus-1ex \@minus -.2ex}{.5cm}{\normalfont\large\bfseries\centering}}% \sffamily\small +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-.8cm \@plus-1ex \@minus -.2ex}{.5cm}{\normalfont\large\bfseries\itshape\centering}}% \sffamily\small +% +\def\BIBsection{\@startsection{section}{1}{\z@}{-0.8cm \@plus-1ex \@minus -.2ex}{0.5cm}{\normalfont\large\bfseries\centering}}% \sffamily\small +\def\figurename{FIGURE} +%% +\newcommand\rtx@myciteonline[3]{% + \ifNAT@swa + \leavevmode + \unskip +% \textsuperscript{\normalfont#1}% TeXSupport + \space[{\normalfont#1}]% + \if*#3*\else\ (#3)\fi + \else + #1% + \fi + \endgroup +}% +%% +\appdef\setup@hook{% + \authoryear@sw{}{% + \def\NAT@cmprs{\z@} +% \let\rtx@citesuper\rtx@mycitesuper% + \let\NAT@citesuper\rtx@myciteonline%\rtx@citesuper + \let\place@bibnumber\old@place@bibnumber + \gdef\place@bibnumber@online#1{{#1}.\hskip5pt}% + \let\place@bibnumber\place@bibnumber@online + \def\NAT@spacechar{}% + \def\NAT@conj{and\ }% + \bibpunct{}{}{, }{s}{}{\textsuperscript{,}}% TeXSupport + }% +}% +%% + \def\rtx@mybibsection{% + \@ifx@empty\refname{% + \par\vspace{6\p@ plus 6\p@}% + }{% + \expandafter\BIBsection\expandafter*\expandafter{\refname}% + \@nobreaktrue + }% +}% +\let\bibsection\rtx@mybibsection% + \fi} +% +% \end{macrocode} +% +% \subsubsection{\classoption{pof}}% +% This macro modifies the reprint output of POF journal to single column. +% \begin{macrocode} +%% POF journal to be one column at Reprint stage +%% +%% HISTORY +%% Further corrected the text area and margins to closely match Print output: 23/04/2012 +\def\jnl@pof{pof}% +\preprintsty@sw{}% + {\ifx\@journal\jnl@pof% + \typeout{AIP Info: \@journal\space journal style Single column, 2011/08/11}% + \@booleanfalse\twocolumn@sw% + \appdef\setup@hook{% + \twoside@sw{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 60pt + }{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 44pt + }% + }% + \marginparsep 10pt + \topmargin -17pt + \headheight 12pt + \headsep 25pt + \topskip 10pt + \splittopskip\topskip + \footskip 30pt + \textheight=53.5pc + \textwidth 33pc + \columnsep 10pt + \def\title@column#1{% + \minipagefootnote@init + \begingroup + \let\@footnotetext\frontmatter@footnotetext + \ltx@no@footnote + #1% + \endgroup + \minipagefootnote@foot + }% + \fi} +}% +% \end{macrocode} +% End of \classoption{pof} code. +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% +% +% \section{AAPM: The Socity Journals Style (\texttt{mph} substyle)} +% +% The file \file{aapm.rtx} is read in by the \classname{revtex4} document class +% for applying the journal specific changes. User should use \texttt{[aapm,mph]} +% for applying the required updates. +% +% +% \begin{macrocode} +%<*aapm> +% \end{macrocode} +% +% Protect this file from being read in by anything but \revtex. +% \begin{macrocode} +\ifx\undefined\substyle@ext + \def\@tempa{% + \endinput + \GenericWarning{I must be read in by REVTeX! (Bailing out)}% + }% + \expandafter\else + \def\@tempa{}% + \expandafter\fi\@tempa + \class@info{RevTeX society AAPM selected}% +\DeclareOption{mph}{\change@journal{mph}}% +%% +\@booleantrue\longbibliography@sw +\@booleanfalse\authoryear@sw +\def\@bibstyle{aapmrev\substyle@post}% +\appdef\@bibdataout@rev{\@bibdataout@aapm}% +\def\@bibdataout@aapm{% + \immediate\write\@bibdataout{% + @CONTROL{% + aapm41Control% + \longbibliography@sw{% + ,pages="1",title="0"% + }{% + ,pages="0",title=""% + }% + }% + }% + \if@filesw + \immediate\write\@auxout{\string\citation{aapm41Control}}% + \fi +}% +\appdef\setup@hook{% + \lengthcheck@sw{% + \RequirePackage{times}% + \frenchspacing% + }{}% +} +\@booleantrue\preprintsty@sw +\@booleantrue\showPACS@sw +\@booleantrue\showKEYS@sw +\appdef\setup@hook{% + \preprintsty@sw{}{% + \let\refname\@empty + }% +}% +\appdef\setup@hook{% + \preprintsty@sw{% + \ps@preprint + }{% + \ps@article + }% +}% +\def\ps@preprint{% + \def\@oddhead{\@runningtitle\hfil}% + \def\@evenhead{\@runningtitle\hfil}% + \def\@oddfoot{\hfil\thepage\quad\checkindate\hfil}% + \def\@evenfoot{\hfil\thepage\quad\checkindate\hfil}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\ps@article{% + \def\@evenhead{\let\\\heading@cr\thepage\quad\checkindate\hfil\@runningtitle}% + \def\@oddhead{\let\\\heading@cr\@runningtitle\hfil\checkindate\quad\thepage}% + \def\@oddfoot{}% + \def\@evenfoot{}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\@runningtitle{\@shorttitle}% +\renewenvironment{titlepage}{% + \let\wastwocol@sw\twocolumn@sw + \onecolumngrid + \newpage + \thispagestyle{titlepage}% + \c@page\z@% article sets this to one not zero??? +}{% + \wastwocol@sw{\twocolumngrid}{\newpage}% +}% +\let\@fnsymbol@latex\@fnsymbol +\let\@fnsymbol\@alph +\def\adjust@abstractwidth{% + \parindent1em\relax + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \preprintsty@sw{}{\rightskip.14\hsize\relax} + \@afterheading\@afterindentfalse +}% +\def\frontmatter@abstractheading{}% +\def\frontmatter@abstractfont{% + \adjust@abstractwidth +}% +\def\frontmatter@postabstractspace{1\baselineskip} +\def\frontmatter@finalspace{\addvspace{28\p@}} +\appdef\setup@hook{% + \preprintsty@sw{% + \@booleantrue\titlepage@sw + \let\section\section@preprintsty + \let\subsection\subsection@preprintsty + \let\subsubsection\subsubsection@preprintsty + }{}% +}% +\def\frontmatter@@indent{% + \skip@\@flushglue + \preprintsty@sw{\@flushglue\z@ plus.3\hsize\relax}% + {\@flushglue.14\hsize\relax} + \raggedright + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@flushglue\skip@ +}% +\def\frontmatter@authorformat{% + \frontmatter@@indent + \sffamily +}% +\renewcommand*\email[1][Electronic mail: ]{\begingroup\sanitize@url\@email{#1}}% +\def\frontmatter@above@affilgroup{\par\addvspace{6\p@}% +}% +\def\frontmatter@above@affiliation@script{% + \frontmatter@@indent +}% +\def\frontmatter@above@affiliation{% +}% +\def\frontmatter@affiliationfont{% + \frontmatter@@indent + \preprintsty@sw{}{\small}% + \it +}% +\def\frontmatter@collaboration@above{% +}% +\def\frontmatter@setup{% + \normalfont +}% +\def\frontmatter@title@above{\addvspace{6\p@}}% +\def\frontmatter@title@format{% + \preprintsty@sw{}{\Large}% + \sffamily + \bfseries + \raggedright + \parskip\z@skip +}% +\def\frontmatter@title@below{\addvspace{7.5\p@}}% +\def\@author@parskip{3\p@}% +\@booleanfalse\altaffilletter@sw +\def\frontmatter@makefnmark{% + \@textsuperscript{% + \normalfont\@thefnmark%( + )% + }% +}% +\def\frontmatter@authorbelow{% +\addvspace{3\p@}% +}% +\let\affil@cutoff\tw@ +\def\frontmatter@RRAP@format{% + \addvspace{2\p@}% + \raggedright + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \preprintsty@sw{}{\advance\rightskip.14\hsize\relax} + \everypar{% + \hbox\bgroup(\@gobble@leavemode@uppercase%) + }% + \def\par{% + \@ifvmode{}{%( + \unskip)\egroup\@@par + }% + }% +}% +\def\punct@RRAP{;\egroup\ \hbox\bgroup}% +\def\@gobble@leavemode@uppercase#1#2{\expandafter\MakeTextUppercase}% +\def\frontmatter@PACS@format{% + \addvspace{11\p@}% + \adjust@abstractwidth + \parskip\z@skip + \samepage +}% +\def\frontmatter@keys@format{% + \adjust@abstractwidth + \samepage +}% +\def\ps@titlepage{% + \def\@oddhead{% + \@runningtitle + \hfill + \produce@preprints\@preprint + }% + \let\@evenhead\@oddhead + \def\@oddfoot{% + \hb@xt@\z@{\byrevtex\hss}% + \hfil + \preprintsty@sw{\thepage}{}% + \quad\checkindate + \hfil + }% + \let\@evenfoot\@oddfoot +}% +\def\byrevtex{\byrevtex@sw{Typeset by REV\TeX and AAPM}{}}% +\def\produce@preprints#1{% + \preprint@sw{% + \vtop to \z@{% + \def\baselinestretch{1}% + \small + \let\preprint\preprint@count + \count@\z@#1\@ifnum{\count@>\tw@}{% + \hbox{% + \let\preprint\preprint@hlist + #1\setbox\z@\lastbox + }% + }{% + \let\preprint\preprint@cr + \halign{\hfil##\cr#1\crcr}% + \par + \vss + }% + }% + }{}% +}% +\def\preprint@cr#1{#1\cr}% +\def\preprint@count#1{\advance\count@\@ne}% +\def\preprint@hlist#1{#1\hbox{, }}% +\newenvironment{Lead@inParagraph}{% + \par + \bfseries + \@afterheading\@afterindentfalse +}{% + \par + \hb@xt@\hsize{\hfil\leaders\hrule\hfil\leaders\hrule\hfil\hfil}% +}% +\appdef\frontmatter@init{% + \let@environment{quotation@ltx}{quotation}% + \let@environment{quotation}{Lead@inParagraph}% +}% +\appdef\@startsection@hook{% + \let@environment{quotation}{quotation@ltx}% +}% +\def\secnums@rtx{% + \@ifxundefined\thepart{% + \def\thepart {\Roman{part}}% + }{}% + \@ifxundefined\thesection{% + \def\thesection {\Roman{section}}% + \def\p@section {}% + }{}% + \@ifxundefined\thesubsection{% + \def\thesubsection {\thesection.\Alph{subsection}}% + \def\p@subsection {}% + }{}% + \@ifxundefined\thesubsubsection{% + \def\thesubsubsection {\thesubsection.\arabic{subsubsection}}% + \def\p@subsubsection {}% + }{}% + \@ifxundefined\theparagraph{% + \def\theparagraph {\thesubsubsection.\alph{paragraph}}% + \def\p@paragraph {}% + }{}% + \@ifxundefined\thesubparagraph{% + \def\thesubparagraph {\theparagraph.\arabic{subparagraph}}% + \def\p@subparagraph {}% + }{}% +}% +\def\@seccntformat#1{\csname the#1\endcsname.\hskip0.5em\relax}% +\def\@hang@from#1#2#3{#1#2#3}% +\def\section{% + \@startsection + {section}% + {1}% + {\z@}% + {1.5\baselineskip \@plus1ex \@minus .2ex}% + {.5\baselineskip}% + {% + \normalfont + \sffamily + \bfseries + \raggedright + }% +}% +\def\@hangfrom@section#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}% +\def\@hangfroms@section#1#2{#1\MakeTextUppercase{#2}}% +\def\subsection{% + \@startsection + {subsection}% + {2}% + {\z@}% + {1.5\baselineskip \@plus1ex \@minus .2ex}% + {.5\baselineskip}% + {% + \normalfont + \fontsize{9.5}{12} + \sffamily + \bfseries + \raggedright + }% +}% +\def\subsubsection{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {1.5\baselineskip \@plus1ex \@minus .2ex}% + {.5\baselineskip}% + {% + \normalfont + \fontsize{9.5}{12} + \sffamily + \bfseries + \itshape + \raggedright + }% +}% +\def\paragraph{% + \@startsection + {paragraph}% + {4}% + {\parindent}% + {\z@}% + {-1em}% + {\normalfont\normalsize\itshape}% +}% +\def\subparagraph{% + \@startsection + {subparagraph}% + {5}% + {\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}% +}% +\def\section@preprintsty{% + \@startsection + {section}% + {1}% + {\z@}% + {0.8cm \@plus1ex \@minus .2ex}% + {0.5cm}% + {% + \normalfont + \bfseries + \raggedright + }% +}% +\def\subsection@preprintsty{% + \@startsection + {subsection}% + {2}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \bfseries + \raggedright + }% +}% +\def\subsubsection@preprintsty{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \itshape\bfseries + \raggedright + }% +}% +\let\frontmatter@footnote@produce\frontmatter@footnote@produce@endnote +\def\@pnumwidth{1.55em} +\def\@tocrmarg {2.55em} +\def\@dotsep{2} +\def\ltxu@dotsep{4.5pt} +\setcounter{tocdepth}{3} +\def\tableofcontents{% + \addtocontents{toc}{\string\tocdepth@munge}% + \print@toc{toc}% + \addtocontents{toc}{\string\tocdepth@restore}% +}% +\def\tocdepth@munge{% + \let\l@section@saved\l@section + \let\l@section\@gobble@tw@ +}% +\def\@gobble@tw@#1#2{}% +\def\tocdepth@restore{% + \let\l@section\l@section@saved +}% +\def\l@part#1#2{\addpenalty{\@secpenalty}% + \begingroup + \set@tocdim@pagenum{#2}% + \parindent \z@ + \rightskip\tocleft@pagenum plus 1fil\relax + \skip@\parfillskip\parfillskip\z@ + \addvspace{2.25em plus\p@}% + \large \bf % + \leavevmode\ignorespaces#1\unskip\nobreak\hskip\skip@ + \hb@xt@\rightskip{\hfil\unhbox\z@}\hskip-\rightskip\hskip\z@skip + \par + \nobreak % + \endgroup +}% +\def\tocleft@{\z@}% +\def\tocdim@min{5\p@}% +\def\l@section{% + \l@@sections{}{section}% Implicit #3#4 +}% +\def\l@f@section{% + \addpenalty{\@secpenalty}% + \addvspace{1.0em plus\p@}% + \bf +}% +\def\l@subsection{% + \l@@sections{section}{subsection}% Implicit #3#4 +}% +\def\l@subsubsection{% + \l@@sections{subsection}{subsubsection}% Implicit #3#4 +}% +\def\l@paragraph#1#2{}% +\def\l@subparagraph#1#2{}% +\let\toc@pre\toc@pre@auto +\let\toc@post\toc@post@auto +\def\listoffigures{\print@toc{lof}}% +\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\def\listoftables{\print@toc{lot}}% +\let\l@table\l@figure +\def\figurename{\textsc{Fig.}} +\def\tablename{\textsc{Table}} +\long\def\@makecaption#1#2{% + \par + \vskip\abovecaptionskip + \begingroup + \preprintsty@sw{\small}{\footnotesize}\rmfamily + \sbox\@tempboxa{% + \let\\\heading@cr + \@make@capt@title{#1}{#2}% + }% + \@ifdim{\wd\@tempboxa >\hsize}{% + \begingroup + \samepage + \flushing + \let\footnote\@footnotemark@gobble + \@make@capt@title{#1}{#2}\par + \endgroup + }{% + \global \@minipagefalse + \hb@xt@\hsize{\hfil\unhbox\@tempboxa\hfil}% + }% + \endgroup + \vskip\belowcaptionskip +}% +\def\@caption@fignum@sep{\nobreak\hskip.5em plus.2em\ignorespaces}% +\@booleanfalse\raggedcolumn@sw +\def\table@hook{\preprintsty@sw{\small}{\footnotesize}}% +\def\tableft@skip@float{\z@ plus\hsize}% +\def\tabmid@skip@float{\@flushglue}% +\def\tabright@skip@float{\z@ plus\hsize}% +\def\array@row@pre@float{\hline\hline\noalign{\vskip\doublerulesep}}% +\def\array@row@pst@float{\noalign{\vskip\doublerulesep}\hline\hline}% +\def\@makefntext#1{% + \def\baselinestretch{1}% + \leftskip1em% + \parindent1em% + \noindent + \nobreak\hskip-\leftskip + \hb@xt@\leftskip{% + \hss\@makefnmark\ % + }% + #1% + \par +}% +\prepdef\appendix{% + \par + \let\@hangfrom@section\@hangfrom@appendix + \let\@sectioncntformat\@appendixcntformat +}% +\def\@hangfrom@appendix#1#2#3{% + #1% + \@if@empty{#2}{% + #3% + }{% + #2\@if@empty{#3}{}{:\ #3}% + }% +}% +\def\@hangfroms@appendix#1#2{% + #1#2% +}% +\def\@appendixcntformat#1{\appendixname\ \csname the#1\endcsname}% + \def\pre@bibdata{\jobname\bibdata@app}% +\def\refname{References}% +\def\rtx@bibsection{% + \@ifx@empty\refname{% + \par\vspace{6\p@ plus 6\p@}% + }{% + \expandafter\section\expandafter*\expandafter{\refname}% + \@nobreaktrue + }% +}% +\let\bibpreamble\@empty +\appdef\setup@hook{% + \bibsep\z@\relax +}% +\def\newblock{\ }% +\appdef\setup@hook{% + \def\bibfont{% + \preprintsty@sw{}{\footnotesize}% + \@clubpenalty\clubpenalty + \labelsep\z@ + }% +}% +\let\place@bibnumber\place@bibnumber@sup +\newenvironment{theindex}{% + \columnseprule \z@ + \columnsep 35\p@ + \c@secnumdepth-\maxdimen + \onecolumngrid@push + \section{\indexname}% + \thispagestyle{plain}% + \parindent\z@ + \parskip\z@ plus.3\p@\relax + \let\item\@idxitem + \onecolumngrid@pop +}{% +}% +\def\@idxitem{\par\hangindent 40\p@} +\def\subitem{\par\hangindent 40\p@ \hspace*{20\p@}} +\def\subsubitem{\par\hangindent 40\p@ \hspace*{30\p@}} +\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax} +\expandafter\def\csname rtx@aapm10pt\endcsname{% + \let\@currname@class\@currname + \def\@currname{aps10pt\substyle@post}% + \class@info{Reading file \@currname.\substyle@ext}% + \input{\@currname.\substyle@ext}% + \let\@currname\@currname@class + \class@info{Overriding 10pt}% + \aapmreprint +}% +\expandafter\def\csname rtx@aapm11pt\endcsname{\csname rtx@aapm12pt\endcsname}% +\expandafter\def\csname rtx@aapm12pt\endcsname{% + \let\@currname@class\@currname + \def\@currname{aps12pt\substyle@post}% + \class@info{Reading file \@currname.\substyle@ext}% + \input{\@currname.\substyle@ext}% + \let\@currname\@currname@class + \class@info{Overriding 12pt}% + \aapmpreprint +}% +\def\today{% + \number\day\space + \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\year +}% +\@booleantrue\groupauthors@sw +\@booleanfalse\@affils@sw +\@booleantrue\runinaddress@sw +\def\@journal@default{mph}% +\def\@pointsize@default{12}% + \appdef\setup@hook{% + \preprintsty@sw{}{% + \def\normalsize{% + \@setfontsize\normalsize\@xpt{12}% + \abovedisplayskip 6\p@ plus2\p@ minus5\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \abovedisplayskip + \belowdisplayshortskip \abovedisplayskip + \let\@listi\@listI + }% + \def\small{% + \@setfontsize\small\@ixpt{11}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{% + \leftmargin\leftmargini + \topsep 4\p@ \@plus2\p@ \@minus2\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep + }% + }% + \def\Large{% + \@setfontsize\Large\@xivpt{16pt}% + }% + \def\@listI{% + \leftmargin\leftmargini + \parsep 4\p@ plus2\p@ minus\p@ + \topsep 8\p@ plus2\p@ minus4\p@ + \itemsep\z@ + }% + \textheight = 694.0\p@ + }% + }% +\def\rtx@aapmmph{% + \typeout{Using journal substyle \@journal.}% + \@booleanfalse\authoryear@sw% + \input{fleqn.clo}% + \PassOptionsToPackage{fleqn}{amsmath}% + \AtBeginDocument{\mathindent12pt\relax}% +}% +\appdef\setup@hook{% + \bibpunct{}{}{,}{s}{}{\textsuperscript{,}}% + \let\onlinecite\rev@citealpnum +}% +\@booleantrue\footinbib@sw +\let\place@bibnumber\place@bibnumber@sup +\appdef\setup@hook{% + \footinbib@sw{}{% + \class@warn{Citations are superscript numbers: footnotes must be endnotes; changing to that configuration}% + \@booleantrue\footinbib@sw + }% +}% +\def\present@bibnote#1#2{% + \item[% + \textsuperscript{% + \normalfont% + \Hy@raisedlink{\hyper@anchorstart{frontmatter.#1}\hyper@anchorend}% + \begingroup% + \csname c@\@mpfn\endcsname#1\relax% + \frontmatter@thefootnote% + )\endgroup% + }% + ]#2\par% +}% +\def\make@footnote@endnote{% + \footinbib@sw{% + \ltx@footnote@push + \def\thempfn{Note\thefootnote}% + \let\ltx@footmark\rev@citemark + \let\ltx@foottext\rev@endtext + \appdef\class@enddocumenthook{\auto@bib}% + \let\printendnotes\relax + }{}% +}% +\def\aapmreprint{% +}% +\def\aapmpreprint{% +}% +% \end{macrocode} +% +% +% \begin{macrocode} +%</aapm> +% \end{macrocode} +% +% +% +% \section{SOR: The Socity Journals Style (\texttt{jor} substyle)} +% +% The file \file{sor.rtx} is read in by the \classname{revtex4} document class +% for applying the journal specific changes. User should use \texttt{[sor,jor]} +% for applying the required updates. +% +% +% \begin{macrocode} +%<*sor> +% \end{macrocode} +% +% Protect this file from being read in by anything but \revtex. +% \begin{macrocode} +\ifx\undefined\substyle@ext + \def\@tempa{% + \endinput + \GenericWarning{I must be read in by REVTeX! (Bailing out)}% + }% + \expandafter\else + \def\@tempa{}% + \expandafter\fi\@tempa + \class@info{RevTeX society AIP selected}% +%% +\DeclareOption{jor}{\change@journal{jor}}% +\def\adv{AIP Advances}% +\def\ao{Appl.\ Opt.}% +\def\ap{Appl.\ Phys.}% +\def\apl{Appl.\ Phys.\ Lett.}% +\def\apm{Appl.\ Phys.\ Lett.\ Mater.}% +\def\apj{Astrophys.\ J.}% +\def\bell{Bell Syst.\ Tech.\ J.}% +\def\bmf{Biomicrofluidics}% +\def\cha{Chaos}% +\def\jqe{IEEE J.\ Quantum Electron.}% +\def\assp{IEEE Trans.\ Acoust.\ Speech Signal Process.}% +\def\aprop{IEEE Trans.\ Antennas Propag.}% +\def\mtt{IEEE Trans.\ Microwave Theory Tech.}% +\def\iovs{Invest.\ Ophthalmol.\ Vis.\ Sci.}% +\def\jcp{J.\ Chem.\ Phys.}% +\def\jap{J.\Appl.\Phys.}% +\def\jmp{j.\Math.\Phys.}% +\def\jmo{J.\ Mod.\ Opt.}% +\def\josa{J.\ Opt.\ Soc.\ Am.}% +\def\josaa{J.\ Opt.\ Soc.\ Am.\ A}% +\def\josab{J.\ Opt.\ Soc.\ Am.\ B}% +\def\jpp{J.\ Phys.\ (Paris)}% +\def\jpr{j.\Phys.\Chem.\Ref.\Data}% +\def\ltp{Low.\Temp.\Phys.}% +\def\nat{Nature (London)}% +\def\oc{Opt.\ Commun.}% +\def\ol{Opt.\ Lett.}% +\def\pl{Phys.\ Lett.}% +\def\pop{Phys.\Plasmas}% +\def\pof{Phys.\Fluids}% +\def\pra{Phys.\ Rev.\ A}% +\def\prb{Phys.\ Rev.\ B}% +\def\prc{Phys.\ Rev.\ C}% +\def\prd{Phys.\ Rev.\ D}% +\def\pre{Phys.\ Rev.\ E}% +\def\prl{Phys.\ Rev.\ Lett.}% +\def\rmp{Rev.\ Mod.\ Phys.}% +\def\rsi{Rev.\Sci.\Instrum.}% +\def\rse{J. \Renewable Sustainable Energy}% +\def\pspie{Proc.\ Soc.\ Photo-Opt.\ Instrum.\ Eng.}% +\def\sjqe{Sov.\ J.\ Quantum Electron.}% +\def\vr{Vision Res.}% +\def\sd{Structural Dynamics}% +\def\jor{J.\ Rheol.}% +\def\cp{AIP\ Conference\ Proceedings}% +%% +\DeclareOption{author-numerical}{% + \@booleantrue\authoryear@sw + \@booleantrue\authornum@sw +}% +\DeclareOption{article-title}{% + \@booleanfalse\sor@jtitx@sw +}% +\@booleantrue \sor@jtitx@sw +\@booleanfalse\authoryear@sw +\@booleanfalse\authornum@sw +\@booleanfalse\onecolumn@sw +\@booleanfalse\newonecolumn@sw +\appdef\@bibdataout@rev{\@bibdataout@sor}% +\def\@bibdataout@sor{% + \immediate\write\@bibdataout{% + @CONTROL{% + sor41Control%% TeXSupport: aip + \longbibliography@sw{\true@sw}{\sor@jtitx@sw{\false@sw}{\true@sw}}% + {% + ,pages="1",title="0"% + }{% + ,pages="0",title=""% + }% + }% + }% + \if@filesw + \immediate\write\@auxout{\string\citation{sor41Control}}%% TeXSupport: aip + \fi +}% +\@booleantrue\preprintsty@sw +\@booleantrue\showPACS@sw +\@booleantrue\showKEYS@sw +%% TeXSupport +\let\old@refname\refname +\appdef\setup@hook{% + \preprintsty@sw{}{% + \let\refname\@empty + }% +}% +\appdef\setup@hook{% + \preprintsty@sw{% + \ps@preprint + }{% + \ps@article + }% +}% +\def\ps@preprint{% + \def\@oddhead{\@runningtitle\hfil}% + \def\@evenhead{\@runningtitle\hfil}% + \def\@oddfoot{\hfil\thepage\quad\checkindate\hfil}% + \def\@evenfoot{\hfil\thepage\quad\checkindate\hfil}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\ps@article{% + \def\@evenhead{\let\\\heading@cr\thepage\quad\checkindate\hfil\@runningtitle}% + \def\@oddhead{\let\\\heading@cr\@runningtitle\hfil\checkindate\quad\thepage}% + \def\@oddfoot{}% + \def\@evenfoot{}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\@runningtitle{\@shorttitle}% +\renewenvironment{titlepage}{% + \let\wastwocol@sw\twocolumn@sw + \onecolumngrid + \newpage + \thispagestyle{titlepage}% + \c@page\z@% article sets this to one not zero??? +}{% + \wastwocol@sw{\twocolumngrid}{\newpage}% +}% +\let\@fnsymbol@latex\@fnsymbol +\let\@fnsymbol\@alph +\def\adjust@abstractwidth{% + \parindent1em\relax + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@afterheading\@afterindentfalse +}% +\def\frontmatter@abstractheading{}% +\def\frontmatter@abstractfont{% + \adjust@abstractwidth +}% +\appdef\setup@hook{% + \preprintsty@sw{% + \@booleantrue\titlepage@sw + \let\section\section@preprintsty + \let\subsection\subsection@preprintsty + \let\subsubsection\subsubsection@preprintsty + }{}% +}% +\def\frontmatter@@indent{% + \skip@\@flushglue + \@flushglue\z@ plus.3\hsize\relax + \raggedright + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@flushglue\skip@ +}% +\def\frontmatter@authorformat{% + \frontmatter@@indent + \sffamily +}% +\renewcommand*\email[1][Electronic mail: ]{\begingroup\sanitize@url\@email{#1}}% +\def\frontmatter@above@affilgroup{% +}% +\def\frontmatter@above@affiliation@script{% + \frontmatter@@indent +}% +\def\frontmatter@above@affiliation{% +}% +\def\frontmatter@affiliationfont{% + \frontmatter@@indent + \preprintsty@sw{}{\small}% + \it +}% +\def\frontmatter@collaboration@above{% +}% +\def\frontmatter@setup{% + \normalfont +}% +\def\frontmatter@title@above{\addvspace{6\p@}}% +\def\frontmatter@title@format{% + \preprintsty@sw{}{\Large}% + \sffamily + \bfseries + \raggedright + \parskip\z@skip +}% +\def\frontmatter@title@below{\addvspace{3\p@}}% +\def\@author@parskip{3\p@}% +\@booleantrue\altaffilletter@sw +\def\frontmatter@makefnmark{% + \@textsuperscript{% + \normalfont\@thefnmark%( + )% + }% +}% +\def\frontmatter@authorbelow{% +\addvspace{3\p@}% +}% +\let\affil@cutoff\tw@ +\def\frontmatter@RRAP@format{% + \addvspace{5\p@}% + \small + \raggedright + \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \everypar{% + \hbox\bgroup(\@gobble@leavemode@uppercase%) + }% + \def\par{% + \@ifvmode{}{%( + \unskip)\egroup\@@par + }% + }% +}% +\def\punct@RRAP{;\egroup\ \hbox\bgroup}% +\def\@gobble@leavemode@uppercase#1#2{\expandafter\MakeTextUppercase}% +\def\frontmatter@PACS@format{% + \addvspace{11\p@}% + \adjust@abstractwidth + \parskip\z@skip + \samepage +}% +\def\frontmatter@keys@format{% + \adjust@abstractwidth + \samepage +}% +\def\ps@titlepage{% + \def\@oddhead{% + \@runningtitle + \hfill + \produce@preprints\@preprint + }% + \let\@evenhead\@oddhead + \def\@oddfoot{% + \hb@xt@\z@{\byrevtex\hss}% + \hfil + \preprintsty@sw{\thepage}{}% + \quad\checkindate + \hfil + }% + \let\@evenfoot\@oddfoot +}% +\def\byrevtex{\byrevtex@sw{Typeset by REV\TeX and AIP}{}}% +\def\produce@preprints#1{% + \preprint@sw{% + \vtop to \z@{% + \def\baselinestretch{1}% + \small + \let\preprint\preprint@count + \count@\z@#1\@ifnum{\count@>\tw@}{% + \hbox{% + \let\preprint\preprint@hlist + #1\setbox\z@\lastbox + }% + }{% + \let\preprint\preprint@cr + \halign{\hfil##\cr#1\crcr}% + \par + \vss + }% + }% + }{}% +}% +\def\preprint@cr#1{#1\cr}% +\def\preprint@count#1{\advance\count@\@ne}% +\def\preprint@hlist#1{#1\hbox{, }}% +\newenvironment{Lead@inParagraph}{% + \par + \bfseries + \@afterheading\@afterindentfalse +}{% + \par + \hb@xt@\hsize{\hfil\leaders\hrule\hfil\leaders\hrule\hfil\hfil}% +}% +\appdef\frontmatter@init{% + \let@environment{quotation@ltx}{quotation}% + \let@environment{quotation}{Lead@inParagraph}% +}% +\appdef\@startsection@hook{% + \let@environment{quotation}{quotation@ltx}% +}% +\def\@seccntformat#1{\csname the#1\endcsname.\quad}% +\def\@hang@from#1#2#3{#1#2#3}% +\def\section{% + \@startsection + {section}% + {1}% + {\z@}% + {0.8cm \@plus1ex \@minus .2ex}% + {0.5cm}% + {% + \normalfont + \small + \sffamily + \bfseries + \raggedright + }% +}% +\def\@hangfrom@section#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}% +\def\@hangfroms@section#1#2{#1\MakeTextUppercase{#2}}% +\def\subsection{% + \@startsection + {subsection}% + {2}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \small + \sffamily + \bfseries + \raggedright + }% +}% +\def\subsubsection{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \small + \sffamily + \bfseries + \itshape + \raggedright + }% +}% +\def\paragraph{% + \@startsection + {paragraph}% + {4}% + {\parindent}% + {\z@}% + {-1em}% + {\normalfont\normalsize\itshape}% +}% +\def\subparagraph{% + \@startsection + {subparagraph}% + {5}% + {\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}% +}% +\def\section@preprintsty{% + \@startsection + {section}% + {1}% + {\z@}% + {0.8cm \@plus1ex \@minus .2ex}% + {0.5cm}% + {% + \normalfont + \bfseries + \raggedright + }% +}% +\def\subsection@preprintsty{% + \@startsection + {subsection}% + {2}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \bfseries + \raggedright + }% +}% +\def\subsubsection@preprintsty{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont + \itshape\bfseries + \raggedright + }% +}% +\let\frontmatter@footnote@produce\frontmatter@footnote@produce@footnote +\def\@pnumwidth{1.55em} +\def\@tocrmarg {2.55em} +\def\@dotsep{2} +\def\ltxu@dotsep{4.5pt} +\setcounter{tocdepth}{3} +\def\tableofcontents{% + \addtocontents{toc}{\string\tocdepth@munge}% + \print@toc{toc}% + \addtocontents{toc}{\string\tocdepth@restore}% +}% +\def\tocdepth@munge{% + \let\l@section@saved\l@section + \let\l@section\@gobble@tw@ +}% +\def\@gobble@tw@#1#2{}% +\def\tocdepth@restore{% + \let\l@section\l@section@saved +}% +\def\l@part#1#2{\addpenalty{\@secpenalty}% + \begingroup + \set@tocdim@pagenum{#2}% + \parindent \z@ + \rightskip\tocleft@pagenum plus 1fil\relax + \skip@\parfillskip\parfillskip\z@ + \addvspace{2.25em plus\p@}% + \large \bf % + \leavevmode\ignorespaces#1\unskip\nobreak\hskip\skip@ + \hb@xt@\rightskip{\hfil\unhbox\z@}\hskip-\rightskip\hskip\z@skip + \par + \nobreak % + \endgroup +}% +\def\tocleft@{\z@}% +\def\tocdim@min{5\p@}% +\def\l@section{% + \l@@sections{}{section}% Implicit #3#4 +}% +\def\l@f@section{% + \addpenalty{\@secpenalty}% + \addvspace{1.0em plus\p@}% + \bf +}% +\def\l@subsection{% + \l@@sections{section}{subsection}% Implicit #3#4 +}% +\def\l@subsubsection{% + \l@@sections{subsection}{subsubsection}% Implicit #3#4 +}% +\def\l@paragraph#1#2{}% +\def\l@subparagraph#1#2{}% +\let\toc@pre\toc@pre@auto +\let\toc@post\toc@post@auto +\def\listoffigures{\print@toc{lof}}% +\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\def\listoftables{\print@toc{lot}}% +\let\l@table\l@figure +\@booleanfalse\raggedcolumn@sw +\def\tableft@skip@float{\z@ plus\hsize}% +\def\tabmid@skip@float{\@flushglue}% +\def\tabright@skip@float{\z@ plus\hsize}% +\def\array@row@pre@float{\hline\hline\noalign{\vskip\doublerulesep}}% +\def\array@row@pst@float{\noalign{\vskip\doublerulesep}\hline\hline}% +\def\@makefntext#1{% + \def\baselinestretch{1}% + \leftskip1em% + \parindent1em% + \noindent + \nobreak\hskip-\leftskip + \hb@xt@\leftskip{% + \hss\@makefnmark\ % + }% + #1% + \par +}% +\prepdef\appendix{% + \par + \let\@hangfrom@section\@hangfrom@appendix + \let\@sectioncntformat\@appendixcntformat +}% +\def\@hangfrom@appendix#1#2#3{% + #1% + \@if@empty{#2}{% + #3% + }{% + #2\@if@empty{#3}{}{:\ #3}% + }% +}% +\def\@hangfroms@appendix#1#2{% + #1#2% +}% +\def\@appendixcntformat#1{\appendixname\ \csname the#1\endcsname}% + \def\pre@bibdata{\jobname\bibdata@app}% +\def\refname{References}% +\def\rtx@bibsection{% + \@ifx@empty\refname{% + \par\vspace{6\p@ plus 6\p@}% + }{% + \expandafter\section\expandafter*\expandafter{\refname}% + \@nobreaktrue + }% +}% +\let\bibpreamble\@empty +\appdef\setup@hook{% + \bibsep\z@\relax +}% +\def\newblock{\ }% +\appdef\setup@hook{% + \def\bibfont{% + \preprintsty@sw{}{\footnotesize}% + \@clubpenalty\clubpenalty + \labelsep\z@ + }% +}% +\let\place@bibnumber\place@bibnumber@sup +\newenvironment{theindex}{% + \columnseprule \z@ + \columnsep 35\p@ + \c@secnumdepth-\maxdimen + \onecolumngrid@push + \section{\indexname}% + \thispagestyle{plain}% + \parindent\z@ + \parskip\z@ plus.3\p@\relax + \let\item\@idxitem + \onecolumngrid@pop +}{% +}% +\def\@idxitem{\par\hangindent 40\p@} +\def\subitem{\par\hangindent 40\p@ \hspace*{20\p@}} +\def\subsubitem{\par\hangindent 40\p@ \hspace*{30\p@}} +\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax} +\expandafter\def\csname rtx@sor10pt\endcsname{%% TeXSupport: aip + \let\@currname@class\@currname + \def\@currname{aps10pt\substyle@post}% + \class@info{Reading file \@currname.\substyle@ext}% + \input{\@currname.\substyle@ext}% + \let\@currname\@currname@class + \class@info{Overriding 10pt}% + \sorreprint +}% +\expandafter\def\csname rtx@sor11pt\endcsname{\csname rtx@sor12pt\endcsname}% +\expandafter\def\csname rtx@sor12pt\endcsname{% + \let\@currname@class\@currname + \def\@currname{aps12pt\substyle@post}% + \class@info{Reading file \@currname.\substyle@ext}% + \input{\@currname.\substyle@ext}% + \let\@currname\@currname@class + \class@info{Overriding 12pt}% + \sorpreprint +}% +\def\today{% + \number\day\space + \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\year +}% + \clo@superscriptaddress +\def\@journal@default{cha}% +\def\@pointsize@default{12}% +\@booleanfalse\pagerestrict@sw% +%% +\def\rtx@sorjor{% + \typeout{Using journal substyle \@journal.}% + \@booleantrue\authoryear@sw% + \@booleantrue\twoside@sw\@mparswitchfalse% +}% +%% +\@booleantrue\footinbib@sw +\let\old@place@bibnumber\place@bibnumber +\let\place@bibnumber\place@bibnumber@sup +\appdef\setup@hook{% + \authoryear@sw{% + \sor@jtitx@sw{% + \def\@bibstyle{aipauth\substyle@post}% + }{% + \def\@bibstyle{aipauth\substyle@post}% + }% + \authornum@sw{% + \bibpunct{}{}{,}{s}{}{\textsuperscript{,}}% + \let\onlinecite\rev@citealpnum + }{% + \bibhang10\p@ + \bibpunct{(%) + }{%( + )}{; }{a}{,}{,}% + \@booleanfalse\footinbib@sw + \let\NAT@mcite\@ne + \let\NAT@sort\z@ + \def\NAT@cmprs{\z@}% + \let\NAT@def@citea\rtx@def@citea + \let\NAT@def@citea@close\rtx@def@citea@close + }% + }{% + \sor@jtitx@sw{% + \def\@bibstyle{sornum\substyle@post}% + }{% + \def\@bibstyle{sornum\substyle@post}% + }% + \bibpunct{}{}{,}{s}{}{\textsuperscript{,}}% + \let\onlinecite\rev@citealpnum + }% +}% +\def\make@footnote@endnote{% + \footinbib@sw{% + \authoryear@sw{\authornum@sw{\false@sw}{\true@sw}}{\false@sw}% + {}{% + \ltx@footnote@push + \def\thempfn{Note\thefootnote}% + \let\ltx@footmark\rev@citemark + \let\ltx@foottext\rev@endtext + \appdef\class@enddocumenthook{\auto@bib}% + \let\printendnotes\relax + }% + }{}% +}% +\def\sorreprint{% +}% +\def\sorpreprint{% +}% +%% +\xdef\t@talAU{0}% TeXSupport +\def\frontmatter@author@produce@script{% + \begingroup + \let\@author@present\@author@present@script + \frontmatterverbose@sw{\typeout{\string\frontmatter@author@produce@script:}\say\@AAC@list\say\@AFF@list\say\@AFG@list}{}% + \let\AU@temp\@empty + \@tempcnta\z@ + \let\AF@opr \@gobble + \def\AU@opr{\@author@count\@tempcnta}% + \def\CO@opr{\@collaboration@count\AU@temp\@tempcnta}% + \@AAC@list% + \xdef\t@talAU{\the\@tempcnta}% TeXSupport + \expandafter\CO@opr\@author@cleared + \begingroup + \frontmatter@authorformat + \let\AF@opr \@affilID@def + \let\AU@opr \@author@present + \def\CO@opr{\@collaboration@present\AU@temp}% + \set@listcomma@list\AU@temp + \@AAC@list + \unskip\unskip + \par + \endgroup + \begingroup + \frontmatter@above@affiliation@script + \let\AFF@opr \@affil@script + \@AFF@list + \frontmatter@footnote@produce + \par + \endgroup + \endgroup +}% +\def\doauthor#1#2#3{% TeXSupport + \ignorespaces#1\unskip\@listcomma + \begingroup + \ifnum\t@talAU=1\else\ifnum\c@affil=\@ne\relax\else#3\fi\fi% TeXSupport + \@if@empty{#2}{\endgroup{}{}}{\endgroup{\ifnum\t@talAU=1\else\ifnum\c@affil=\@ne\relax\else\comma@space\fi\fi}{}\frontmatter@footnote{#2}}% TeXSupport + \space \@listand +}% +%% +\appdef\rtx@require@packages{% +%% +%% +%% Journal of Rheology (jor) +%% +\def\jnl@jor{jor}% +\preprintsty@sw{}% + {\ifx\@journal\jnl@jor% + \typeout{SOR Info: \@journal\space journal style Single column, 2013/10/24}% + \@booleanfalse\twocolumn@sw% + \appdef\setup@hook{% + \twoside@sw{% + \oddsidemargin 28pt% + \evensidemargin 28pt% + \marginparwidth 30pt% + }{% + \oddsidemargin 28pt + \evensidemargin 0pt + \marginparwidth 44pt + }% + }% + \marginparsep 10pt + \topmargin -17pt + \headheight 12pt + \headsep 25pt + \topskip 10pt + \splittopskip\topskip + \footskip 30pt + \textheight=53.5pc + \textwidth 33pc + \columnsep 10pt + \def\title@column#1{% + \minipagefootnote@init + \begingroup + \let\@footnotetext\frontmatter@footnotetext + \ltx@no@footnote + #1% + \endgroup + \minipagefootnote@foot + }% +\def\frontmatter@title@format{% + \preprintsty@sw{}{\Large}% + \sffamily% + \bfseries% + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%% \raggedright% + \parskip\z@skip% +}% +\def\frontmatter@@indent{% + \skip@\@flushglue + \@flushglue\z@ plus.3\hsize\relax + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%% \raggedright +%% \advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \@flushglue\skip@ +}% +%% \def\frontmatter@authorformat{% +%% \frontmatter@@indent +%% \sffamily +%% }% +\def\frontmatter@RRAP@format{% + \addvspace{5\p@}% + \small + \leftskip0pt plus1fill% + \rightskip0pt plus1fill% + \parindent\z@% +%%\raggedright +%%\advance\leftskip.5in\relax + \@totalleftmargin\leftskip + \everypar{% + \hbox\bgroup(\@gobble@leavemode@uppercase%) + }% + \def\par{% + \@ifvmode{}{%( + \unskip)\egroup\@@par + }% + }% +}% +\def\frontmatter@abstractfont{}% +\def\frontmatter@abstractwidth{\textwidth} +\def\abstractname{Synopsis} +\def\frontmatter@abstractheading{% + \begingroup + \centering\large + {\bfseries\abstractname} + \par\vskip.25\baselineskip + \endgroup +}% +\appdef\setup@hook{% + \preprintsty@sw{}{% + \let\refname\old@refname%\@empty + }% +}% +% +\def\ps@article{% + \def\@evenhead{\let\\\heading@cr\sffamily\thepage\quad\checkindate\hfil\@runningtitle\hfil}% + \def\@oddhead{\let\\\heading@cr\hfil\sffamily\@runningtitle\hfil\checkindate\quad\thepage}% + \def\@oddfoot{}% + \def\@evenfoot{}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\@make@capt@title#1#2{% + \@ifx@empty\float@link{\@firstofone}{\expandafter\href\expandafter{\float@link}}% + {{\bfseries#1}}\@caption@fignum@sep#2% +}% +\def\@caption@fignum@sep{{\bfseries.} }% +%% + \fi% +} +}% +% \end{macrocode} +% +% +% \begin{macrocode} +%</sor> +% \end{macrocode} +% +% +% +% +% \Finale +% %Here ends the programmer's documentation. +% \endinput +% +\endinput diff --git a/texmf/source/latex/revtex/ltxdocext.dtx b/texmf/source/latex/revtex/ltxdocext.dtx new file mode 100644 index 0000000..d3d8b77 --- /dev/null +++ b/texmf/source/latex/revtex/ltxdocext.dtx @@ -0,0 +1,1259 @@ +% \iffalse meta-comment balanced on line 108 +% ltxdocext.dtx: package to extend the ltxdoc class of standard LaTeX +% Copyright (c) 2008 Arthur Ogawa +% +% Disclaimer +% This file is distributed WITHOUT ANY WARRANTY; +% without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +% License +% You may distribute this file under the conditions of the +% LaTeX Project Public License 1.3c or later +% (http://www.latex-project.org/lppl.txt). +% ReadMe +% For the documentation and more detailed instructions for +% installation, typeset this document with \LaTeX. +% Maintenance Status +% This work has the LPPL maintenance status "maintained"; +% Current Maintainer of this work is Arthur Ogawa. +% +% This work consists of the main source file ltxdocext.dtx +% and the derived files +% ltxdocext.sty, ltxdocext.pdf, ltxdocext.ins, ltxdocext.drv. +% Distribution: +% CTAN:macros/latex/contrib/revtex/ +% +% Unpacking: +% tex ltxdocext.dtx +% +% Documentation: +% latex ltxdocext.dtx; ... +% +% Program calls to get the documentation (example): +% pdflatex ltxdocext.dtx +% makeindex -s gind.ist ltxdocext.idx +% makeindex -s gglo.ist -o ltxdocext.gls ltxdocext.glo +% pdflatex ltxdocext.dtx +% makeindex -s gind.ist ltxdocext.idx +% pdflatex ltxdocext.dtx +% +% Installation: +% TDS:doc/latex/revtex/ +% TDS:source/latex/revtex/ +% TDS:tex/latex/revtex/ +% +% Thanks, Heiko! +% This method of letting a single .dtx file serve as both +% documentation (via latex) and installer (via tex) follows +% the example of Heiko Oberdiek. Thanks! +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase + 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi + \relax +\else + \csname fi\endcsname +%</ignore> +%<*install> +\input docstrip +\preamble + +This is a generated file; +altering it directly is inadvisable; +instead, modify the original source file. +See the URL in the file README. + +License + You may distribute this file under the conditions of the + LaTeX Project Public License 1.3c or later + (http://www.latex-project.org/lppl.txt). + + This file is distributed WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. + +\endpreamble +\askforoverwritefalse +\keepsilent + \generate{% + %{ignore} +%\usedir{tex/latex/revtex}% + \file{ltxdocext.sty}{% + \from{ltxdocext.dtx}{package,kernel}% + }% + % \file{acrofont.sty}{\from{ltxdocext.dtx}{fonts}}% + }% +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation, please move} +\Msg{* ltxdocext.sty} +\Msg{* into a directory searched by TeX;} +\Msg{* in a TDS-compliant installation:} +\Msg{* texmf/tex/macros/latex/revtex/.} +\Msg{*} +\Msg{* To produce the documentation, + run ltxdocext.dtx through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% \fi +% +% \GetFileInfo{ltxdocext.dtx} +% +% \iffalse ltxdoc klootch +%<*ltxdocext> +%%% @LaTeX-file{ +%%% filename = "ltxdocext.dtx", +%%% version = "1.0a", +%%% date = "2018/12/26", +%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net), +%%% commissioned by the American Physical Society. +%%% ", +%%% copyright = "Copyright (C) 1999, 2008 Arthur Ogawa, +%%% distributed under the terms of the +%%% LaTeX Project Public License, see +%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt +%%% ", +%%% address = "Arthur Ogawa, +%%% USA", +%%% telephone = "", +%%% FAX = "", +%%% email = "mailto colon arthur_ogawa at sbcglobal.net", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, ltxdoc", +%%% supported = "yes", +%%% abstract = "extensions to the ltxdoc class", +%%% } +%</ltxdocext> +% \fi +% +% \iffalse ltxdoc klootch +% The following references the \file{README-LTXDOCEXT} file, +% which contains basic information about this package. +% The contents of this file are generated when +% you typeset the programmer's documentation. +% Search on "{filecontents*}{README-LTXDOCEXT}" to locate it. +% \fi\input{README-LTXDOCEXT}% +% +% \subsection{Bill of Materials} +% +% Following is a list of the files in this distribution arranged +% according to provenance. +% +% \subsubsection{Primary Source}% +% One single file generates all. +%\begin{verbatim} +%ltxdocext.dtx +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{latex ltxdocext.dtx}}% +% Typesetting the source file under pdflatex +% generates the readme and the documentation. +%\begin{verbatim} +%README ltxdocext.pdf +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{tex ltxdocext.ins}}% +% Typesetting this file with \TeX\ generates +% the package file. +%\begin{verbatim} +%ltxdocext.sty acrofont.sty +%\end{verbatim} +% +% \subsubsection{Documentation}% +% The following are the online documentation: +% \begin{verbatim} +%ltxdocext.pdf +% \end{verbatim} +% +% \subsubsection{Auxiliary}% +% The following are auxiliary files generated +% in the course of running \LaTeX: +% \begin{verbatim} +%ltxdocext.aux ltxdocext.idx ltxdocext.ind ltxdocext.log ltxdocext.toc +% \end{verbatim} +% +% \section{Code common to all modules}% +% +% We want to require only one place in this file +% where the version number is stated, +% and we also want to ensure that the version +% number is embedded into every generated file. +% +% Now we declare that +% these files can only be used with \LaTeXe. +% An appropriate message is displayed if +% a different \TeX{} format is used. +% \begin{macrocode} +%<*driver|package|fonts> +\NeedsTeXFormat{LaTeX2e}[1995/12/01]% +%</driver|package|fonts> +% \end{macrocode} +% As desired, the following modules all +% take common version information: +% \begin{macrocode} +%<package>\ProvidesFile{ltxdocext.sty}% +%<fonts>\ProvidesFile{acrofont.sty}% +%<*driver> +\expandafter\ProvidesFile\expandafter{\jobname.dtx}% +%</driver> +% \end{macrocode} +% +% The following line contains, for once and for all, +% the version and date information. +% By various means, this information is reproduced +% consistently in all generated files and in the +% typeset documentation. +% \begin{macrocode} +%<version> + [2018/12/26 1.0a ltxdoc extensions package]% \fileversion +% \end{macrocode} +% +% +% \section{The driver module \texttt{doc}} +% +% This module, consisting of the present section, +% typesets the programmer's documentation, +% generating the \file{README-LTXDOCEXT} as required. +% +% Because the only uncommented-out lines of code at the beginning of +% this file constitute the \file{doc} module itself, +% we can simply typeset the \file{.dtx} file directly, +% and there is thus rarely any need to +% generate the ``doc'' {\sc docstrip} module. +% Module delimiters are nonetheless required so that +% this code does not find its way into the other modules. +% +% The \enve{document} command concludes the typesetting run. +% +% \begin{macrocode} +%<*driver> +% \end{macrocode} +% +% \subsection{The Preamble} +% The programmers documentation is formatted +% with the \classname{ltxdoc} document class, with local customizations, +% and with the usual code line indexing. +% \begin{macrocode} +\documentclass[draft]{ltxdoc} +\RequirePackage{ltxdocext}% +\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}% +%\expandafter\ifx\csname package@font\endcsname\@undefined\else +% \expandafter\RequirePackage\expandafter{\csname package@font\endcsname}% +%\fi +\CodelineIndex\EnableCrossrefs % makeindex -s gind.ist ltxdocext +\RecordChanges % makeindex -s gglo.ist -o ltxdocext.gls ltxdocext.glo +% \end{macrocode} +% +% \subsubsection{Docstrip and info directives} +% We use so many {\sc docstrip} modules that we set the +% \texttt{StandardModuleDepth} counter to 1. +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% The following command retrieves the date and version information +% from this file. +% \begin{macrocode} +\expandafter\GetFileInfo\expandafter{\jobname.dtx}% +% \end{macrocode} +% +% \subsection{The ``Read Me'' File} +% As promised above, here is the contents of the +% ``Read Me'' file. That file serves a double purpose, +% since it also constitutes the beginining of the +% programmer's documentation. What better thing, after +% all, to have appear at the beginning of the +% typeset documentation? +% +% A good discussion of how to write a ReadMe file can be found in +% Engst, Tonya, ``Writing a ReadMe File? Read This'' +% \emph{MacTech} October 1998, p. 58. +% +% Note the appearance of the +% \cmd\StopEventually\ command, which marks the +% dividing line between the user documentation +% and the programmer documentation. +% +% The usual user will not be asked to +% do a full build, not to speak +% of the bootstrap. +% Instructions for carrying these processes +% begin the programmer's manual. +% +% \begin{macrocode} +\begin{filecontents*}{README-LTXDOCEXT} +\title{% + Extensions to the \classname{ltxdoc} class% + \thanks{% + This file has version number \fileversion, + last revised \filedate.% + }% + \thanks{% + Version \fileversion\ \copyright\ 2019 American Physical Society + }% +}% +\author{% +Arthur Ogawa% + \thanks{\texttt{mailto:arthur\_ogawa at sbcglobal.net}}% +}% +%\iffalse +% For version number and date, +% search on "\fileversion" in the .dtx file, +% or see the end of the README file. +%\fi + +\maketitle + +This file embodies the \classname{ltxdocext} package, +the implementation and its user documentation. + +The distribution point for this work is +\url{journals.aps.org/revtex}, +which contains prebuilt runtime files, documentation, and full source, +ready to add to a TDS-compliant \TeX\ installation. + +The \classname{ltxdocext} package was commissioned by the American Physical Society +and is distributed under the terms of the \LaTeX\ Project Public License, +the same license under which all the portions of \LaTeX\ itself are distributed. +Please see \url{http://ctan.tug.org/macros/latex/base/lppl.txt} for details. + +To use this document class, you must have a working +\TeX\ installation equipped with \LaTeXe\ +and possibly pdftex and Adobe Acrobat Reader or equivalent. + +To install, retrieve the distribution, +unpack it into a directory on the target computer, +and move the files \file{ltxdocext.sty} and \file{acrofont.sty} +into a location in your filesystem where they will be found by \LaTeX. + +If you will be using the \classname{acrofont} package, you must +also install the virtual fonts +\file{zpsynocmrv}, \file{zptmnocmr}, +\file{zptmnocmrm}, and \file{zpzcnocmry}. +The corresponding \file{.tfm}, \file{.vf}, and \file{.vpl} +files are part of this distribution. + +To use, read the user documentation \file{ltxdocext.pdf}. +The \file{.dtx} file, \file{ltxdocext.dtx}, constitutes +in itself an instance of use of the \classname{ltxdocext} +package and the \classname{acrofont} package. + +\tableofcontents + +\section{Processing Instructions} + +The package files \file{ltxdocext.sty} and \file{acrofont.sty} +are generated from this file, \file{ltxdocext.dtx}, +using the {\sc docstrip} facility of \LaTeX +via |tex ltxdocext.dtx| (Note: do \emph{not} use \LaTeX\ for this step). +The typeset documentation that you are now reading is generated from +the same file by typesetting it with \LaTeX\ or pdftex +via |latex ltxdocext.dtx| or |pdflatex ltxdocext.dtx|. + +\subsection{Build Instructions} + +You may bootstrap this suite of files solely from \file{ltxdocext.dtx}. +Prepare by installing \LaTeXe\ (and either tex or pdftex) on your computer, +then carry out the following steps: +\begin{enumerate} +\item +Within an otherwise empty directory, +typeset \file{ltxdocext.dtx} with \TeX\ or pdftex; +thereby generating the package file \file{ltxdocext.sty}, +and the package file \file{acrofont.sty}. +Make sure that {\sc docstrip} receives permission +to overwrite existing versions of these packages. +\item +Now +typeset \file{ltxdocext.dtx} with \LaTeX\ or pdflatex; +you will obtain the typeset documentation you are now reading, +along with +the file \file{README}. + +Note: you will have to run \LaTeX, then +\file{makeindex} \texttt{-s gind.ist ltxdocext.idx}, then +\file{makeindex} \texttt{-s gglo.ist -o ltxdocext.gls ltxdocext.glo}, then +\LaTeX\ again in order to obtain a valid index and table of contents. +\item +Install the following files into indicated locations within your +TDS-compliant \texttt{texmf} tree (you may need root access): +\begin{itemize} +\item +\file{$TEXMF/}\file{tex/}\file{latex/}\file{revtex/}\classname{ltxdocext.sty} and +\file{$TEXMF/}\file{tex/}\file{latex/}\file{revtex/}\classname{acrofont.sty} +\item +\file{$TEXMF/}\file{source/}\file{latex/}\file{revtex/}\classname{ltxdocext.dtx} +\item +\file{$TEXMF/}\file{doc/}\file{latex/}\file{revtex/}\classname{ltxdocext.pdf} +\end{itemize} +where \file{$TEXMF/} stands for \file{texmf-local/}, or some other \texttt{texmf} tree +in your installation. +\item +Run \texttt{mktexlsr} on \file{$TEXMF/} (you may need root access). +\item +Build and installation are now complete; +now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble! +\end{enumerate} + +\subsection{Change Log} +\changes{1.0a}{2018/12/12}{(MD) Updated name of README file and use standard fonts when typesetting}% + + +\end{filecontents*} +% \end{macrocode} +% +% \subsection{The Document Body} +% +% Here is the document body, containing only a +% \cmd\DocInput\ directive---referring to this very file. +% This very cute self-reference is a common \classname{ltxdoc} idiom. +% \begin{macrocode} +\begin{document}% +\expandafter\DocInput\expandafter{\jobname.dtx}% +\PrintChanges +\end{document} +%</driver> +% \end{macrocode} +% +% \section{Using the \classname{ltxdoc} and \classname{acrofont} packages}% +% These packages are an adjunct to the +% standard \LaTeX\ \classname{ltxdoc} class and may be +% simply invoked as follows: +%\begin{verbatim} +%\documentclass[draft]{ltxdoc} +%\RequirePackage{ltxdocext}% +%\RequirePackage{acrofont}% +%\CodelineIndex\EnableCrossrefs +%\end{verbatim} +% +% Your document should simply cleave to the standards of the +% \classname{ltxdoc} class, with extensions and alterations as noted. +% +% \subsection{Extensions to the \classname{ltxdoc} class}% +% +% \subsubsection{Extensions to the \env{verbatim} environment and \cs{verb} command}% +% +% The delimiters \verb$<<$ and \verb$>>$ within the scope of the verbatim environment +% or within the argument of the \cmd\verb\ command produce +% italics surrounded by angle brackets. +% This typographic convention usually indicates +% \emph{metalanguage}, i.e., a placeholder. +% +% To obtain the angle bracket character per se, +% double the character, viz., ``\verb$the delimiter \verb+<<<<+$''. +% +% \subsubsection{The -\texttt{matter} Commands Work} +% The sectioning commands \cmd\frontmatter, \cmd\mainmatter, and \cmd\backmatter +% of the standard \LaTeX\ \classname{book} class are operative in the +% \classname{ltxdoc} class. +% +% \subsubsection{The \cs{GetFileInfo} command}\label{sec:GetFileInfo} +% You can use the \cmd\GetFileInfo\ command to extract +% the date, version, and file info of a file which has registered itself +% via the \cmd\ProvidesFile\ or \cmd\ProvidesClass\ command +% (employing the optional argument thereto). +% +% For instance, if your document contains the following: +%\begin{verbatim} +%\RequirePackage{ltxdocext}% +%\GetFileInfo{ltxdocext.sty}% +%\end{verbatim} +% then the following control sequence names will have +% a value corresponding to that package's \cmd\ProvidesFile\ +% command: +% \cmd\filedate: the file's date, +% \cmd\fileversion: the file's version, and +% \cmd\fileinfo: the file's info. +% +% \subsubsection{Self-Indexing Commands}% +% Certain commands automatically produce an index entry +% (or several related entries) according to the meaning. +% +% \begin{unnumtable} +% \begin{tabular}{ll} +% meta-text &\cmd\marg\arg{text}\\ +% command &\cmd\cmd\cmd\csname\\ +% environment name &\cmd\env\arg{name}\\ +% \cmd\begin\verb`{foo}`&\cmd\envb\arg{foo}\\ +% \cmd\end\verb`{foo}` &\cmd\enve\arg{foo}\\ +% argument &\cmd\arg\arg{name}\\ +% optional &\cmd\oarg\arg{name}\\ +% filename &\cmd\file\arg{name}\\ +% url &\cmd\url\arg{name}\\ +% document class &\cmd\classname\arg{name}\\ +% document substyle &\cmd\substyle\arg{name}\\ +% class option &\cmd\classoption\arg{name} +% \end{tabular} +% \end{unnumtable} +% +% \subsubsection{Unnumbered Tables}% +% +% When your documentation requires the use of an unnumbered table, +% use the \env{unnumtable} environment: +% \begin{verbatim} +%\begin{unnumtable} +%\begin{tabular}{ll} +%<table rows> +%\end{tabular} +%\end{unnumtable} +% \end{verbatim} +% +% \subsubsection{Structuring Tables}% +% The commands \cmd\toprule, \cmd\colrule, and \cmd\botrule +% allow you to mark the beginning of the column heads +% the beginning of the table body, and the end of +% the table body, respectively. +% In context, +% \begin{verbatim} +%\begin{tabular}{ll} +%\toprule +%<table head rows> +%\colrule +%<table rows> +%\botrule +%\end{tabular} +% \end{verbatim} +% +% \subsubsection{A Sectioning Command Below \cs{subsection}}% +% The \cmd\subsubsection\ command is defined. +% +% +% \subsection{Alterations to the \classname{ltxdoc} class}% +% The following involve no new markup, but they +% do change the appearance of your formatted documentation: +% \begin{enumerate} +% \item +% Using the \classname{acrofont} package causes your +% document to be formatted using the standard +% Acrobat fonts to the greatest extent possible. +% This means that for most documents, Computer Modern +% is not used at all. +% Math that unavoidable must use CM still exists, however. +% \item +% An index will be produced at the end of the document +% without your needing to explicitly mark it up, and +% it will have an entry in the TOC. +% \item +% The \env{quote} environment has a slightly smaller left margin. +% \item +% Array columns are set tight by default. +% \item +% A host of \cmd\DoNotIndex\ directives are invoked. +% I intend this list to grow to encompass +% even more commands. Send me your suggestions. +% \end{enumerate} +% +% +% +%\StopEventually{} +% +% \section{Extensions to the ltxdoc class} +% The \file{package} {\sc docstrip} module comprises the +% package \classname{ltxdocext.sty}, which provides extensions +% to the standard \LaTeX\ \classname{ltxdoc} class. +% +% \subsection{Beginning of the \file{package} {\sc docstrip} module} +% This portion of code is only present in the \LaTeX\ package (\texttt{.sty} file), +% not in the kernel portion. +% \begin{macrocode} +%<*package> +\def\class@name{ltxdocext}% +\expandafter\PackageInfo\expandafter{\class@name}{% + An extension to the \protect\LaTeXe\space ltxdoc class + by A. Ogawa (arthur\_ogawa sbcglobal.net)% +}% +%</package> +% \end{macrocode} +% +% \subsection{Beginning of the \file{kernel} {\sc docstrip} module} +% +% The bulk of the code is the kernel portion; a brief tail of \file{package} code then follows. +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% \subsection{Incorporate \classname{ltxguide.cls} extensions} +% +% Code extracted from \classname{ltxguide.cls}, by Alan Jeffrey. +% ``This code stolen from \classname{ltxguide.cls}: +% Some hacks with verbatim... NB: this would be better done with the +% verbatim package, but this document has to run on any \LaTeX +% installation.'' +% \begin{macrocode} +\RequirePackage{verbatim}% +\let\o@verbatim\verbatim +\def\verbatim{% + \ifhmode\unskip\par\fi +% \nopagebreak % Overridden by list penalty + \ifx\@currsize\normalsize + \small + \fi + \o@verbatim +}% +% \end{macrocode} +% +% Here we extend the font-setting command to include making \texttt{<>} active +% (i.e., adjusting the input encoding). +% \begin{macrocode} +\renewcommand \verbatim@font {% + \normalfont \ttfamily + \catcode`\<=\active + \catcode`\>=\active +}% +% \end{macrocode} +% +% Make \verb$|...|$ a synonym for \cmd\verb\verb$|...|$. +% \begin{macrocode} +\RequirePackage{shortvrb} +\AtBeginDocument{% + \MakeShortVerb{\|}% +}% +% \end{macrocode} +% +% Make active bracket characters produce italics surrounded by angle brackets +% (used in \env{verbatim} and \cmd\verb). +% \verb|<<| produces a less-than, and \verb|>>| produces a greater-than. +% \begin{macrocode} +\begingroup + \catcode`\<=\active + \catcode`\>=\active + \gdef<{\@ifnextchar<\@lt\@meta} + \gdef>{\@ifnextchar>\@gt\@gtr@err} + \gdef\@meta#1>{\marg{#1}} + \gdef\@lt<{\char`\<} + \gdef\@gt>{\char`\>} +\endgroup +\def\@gtr@err{% + \ClassError{ltxguide}{% + Isolated \protect>% + }{% + In this document class, \protect<...\protect> + is used to indicate a parameter.\MessageBreak + I've just found a \protect> on its own. + Perhaps you meant to type \protect>\protect>? + }% +} +\def\verbatim@nolig@list{\do\`\do\,\do\'\do\-} +% \end{macrocode} +% End of code stolen from \file{ltxguide.cls}. Thanks, Alan. +% +% Add functionality from doc.dtx: +% (code stolen from doc.dtx): +% \begin{macrocode} +\def\GetFileInfo#1{% + \def\filename{#1}% + \def\@tempb##1 ##2 ##3\relax##4\relax{% + \def\filedate{##1}% + \def\fileversion{##2}% + \def\fileinfo{##3}}% + \edef\@tempa{\csname ver@#1\endcsname}% + \expandafter\@tempb\@tempa\relax? ? \relax\relax} +% \end{macrocode} +% (end of code stolen from doc.dtx. Thanks FMi.) +% +% Various forms of self-indexing commands: +% \begin{macrocode} +\DeclareRobustCommand{\marg}[1]{% + \meta{#1}% + \index{#1=\string\meta{#1} placeholder}\index{placeholder>#1=\string\meta{#1}}% +}% +\DeclareRobustCommand\meta[1]{% + \mbox{\LANGLE\itshape#1\/\RANGLE}% +}% +\def\LANGLE{$\langle$}% +\def\RANGLE{$\rangle$}% +\DeclareRobustCommand{\arg}[1]{% + {\ttfamily\string{}\meta{#1}{\ttfamily\string}}% + \index{#1=\string\ttt{#1}, argument}\index{argument>#1=\string\ttt{#1}}% +}% +\let\oarg\undefined +\DeclareRobustCommand{\oarg}[1]{% + {\ttfamily[%] + }\meta{#1}{\ttfamily%[ + ]}% + \index{#1=\string\ttt{#1}, optional argument}% + \index{argument, optional>#1=\string\ttt{#1}}% +}% +\DeclareRobustCommand\cmd{\begingroup\makeatletter\@cmd}% +\long\def\@cmd#1{% + \endgroup + \cs{\expandafter\cmd@to@cs\string#1}% + \expandafter\cmd@to@index\string#1\@nil +}% +\def\cmd@to@cs#1#2{\char\number`#2\relax}% +\def\cmd@to@index#1#2\@nil{% + \index{#2=\string\cmd#1#2}%\index{command>#2=\string\cmd#1#2}% +}% +\DeclareRobustCommand\cs[1]{{\ttfamily\char`\\#1}}% +\def\scmd#1{% + \cs{\expandafter\cmd@to@cs\string#1}% + \expandafter\scmd@to@index\string#1\@nil +}% +\def\scmd@to@index#1#2\@nil#3{% + \index{\string$#3=\string\cmd#1#2---#3}% +%\index{command>\string$#3=\string\cmd#1#2---#3}% +}% +\DeclareRobustCommand\env{\name@idx{environment}}% +\DeclareRobustCommand\envb[1]{% + {\ttfamily\string\begin\string{}\env{#1}{\ttfamily\string}}% +}% +\DeclareRobustCommand\enve[1]{{\ttfamily\string\end\string{}\env{#1}{\ttfamily\string}}}% +\DeclareRobustCommand{\file}{\begingroup\@sanitize\@file}% +\long\def\@file#1{\endgroup + {\ttfamily#1}% + \index{#1=\string\ttt{#1}}\index{file>#1=\string\ttt{#1}}% +}% +\DeclareRobustCommand\substyle{\name@idx{document substyle}}% +\DeclareRobustCommand\classoption{\name@idx{document class option}}% +\DeclareRobustCommand\classname{\name@idx{document class}}% +\def\name@idx#1#2{% + {\ttfamily#2}% + \index{#2\space#1=\string\ttt{#2}\space#1}\index{#1>#2=\string\ttt{#2}}% +}% +\DeclareRobustCommand\url@ltxdocext{\begingroup\catcode`\/\active\catcode`\.\active\catcode`\:\active\@url}% +\AtBeginDocument{% + \ifx\url\undefined\let\url\url@ltxdocext\fi +}% +\def\@url#1{% + \url@break{\ttfamily#1}% + \url@char\edef\@tempa{#1=\string\url{#1}}% + \expandafter\index\expandafter{\@tempa}% + \expandafter\index\expandafter{\expandafter u\expandafter r\expandafter l\expandafter >\@tempa}% + \endgroup +}% +{\catcode`\:\active\aftergroup\def\aftergroup:}{\active@colon}% +\def\colon@break{\colon@char\allowbreak}% +\def\colon@char{:}% +{\catcode`\/\active\aftergroup\def\aftergroup/}{\active@slash}% +\def\slash@break{\slash@char\allowbreak}% +\def\slash@char{/}% +{\catcode`\.\active\aftergroup\def\aftergroup.}{\active@dot}% +\def\dot@break{\dot@char\allowbreak}% +\def\dot@char{.}% +\def\url@break{\let\active@slash\slash@break\let\active@dot\dot@break\let\active@colon\colon@break}% +\def\url@char{\let\active@slash\slash@char\let\active@dot\dot@char\let\active@colon\colon@char}% +% \end{macrocode} +% +% \subsection{Changes to the base class of the ltxdoc class} +% Modify \env{theindex} environment so that it produces a TOC entry +% \begin{macrocode} +\renewenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ +\def\see##1##2{\textit{See} ##1}% +\def\seealso##1##2{\textit{See also} ##1}% +\long\def\cmd##1{\cs{\expandafter\cmd@to@cs\string##1}}% +\def\@url##1{\url@break\ttt{##1}\endgroup}% +\def\ttt{\begingroup\@sanitize\ttfamily\@ttt}% +\def\@ttt##1{##1\endgroup}% +\mathchardef\save@secnumdepth\c@secnumdepth +\c@secnumdepth\m@ne + \twocolumn[\section{\indexname}]% +% \@mkboth{\MakeUppercase\indexname}% +% {\MakeUppercase\indexname}% +\c@secnumdepth\save@secnumdepth + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\renewenvironment{quote} + {\list{}{% + \leftmargin1em\relax + \rightmargin\leftmargin + }% + \item\relax} + {\endlist} +% \end{macrocode} +% +% \subsection{Extensions to the base class of \classname{ltxdoc.cls}} +% +% Matter commands from \classname{book.cls} +% \begin{macrocode} +\newif\if@mainmatter +\newif\if@openright +\@openrighttrue +\DeclareRobustCommand\frontmatter{% + \cleartorecto + \@mainmatterfalse + \pagenumbering{roman}% +}% +\DeclareRobustCommand\mainmatter{% + \cleartorecto + \@mainmattertrue + \pagenumbering{arabic}% +}% +\DeclareRobustCommand\backmatter{% + \if@openright + \cleartorecto + \else + \clearpage + \fi + \@mainmatterfalse +}% +\ifx\undefined\cleartorecto + \def\cleartorecto{\cleardoublepage}% +\fi +% \end{macrocode} +% +% Unnumbered tables +% +% \begin{environment}{unnumtable} +% An unnumbered table does not float. +% \begin{macrocode} +\def\@to{to}% +\newenvironment{unnumtable}{% + \par + \addpenalty\predisplaypenalty + \addvspace\abovedisplayskip + \hbox\@to\hsize\bgroup\hfil\ignorespaces + \let\@Hline\@empty +}{% + \unskip\hfil\egroup + \penalty\postdisplaypenalty + \vskip\belowdisplayskip + \aftergroup\ignorespaces + \@endpetrue +}% +% \end{macrocode} +% \end{environment} +% +% Emulate \cmd\toprule\ and friends +% \begin{macrocode} +\providecommand\toprule{\hline\hline}% +\providecommand\colrule{\\\hline}% +\providecommand\botrule{\\\hline\hline}% +% \end{macrocode} +% +% Define sectioning command below \cmd\subsubsection. +% \begin{macrocode} +\DeclareRobustCommand\subsubsubsection{% + \@startsection{subsubsection}{4}% + {\z@}{-15\p@\@plus-5\p@\@minus-2\p@}% + {5\p@}{\normalfont\normalsize\itshape}% +}% +% \end{macrocode} +% +% \subsection{In lieu of \file{ltxdoc.cfg}} +% We don't want everything to appear in the index +% \begin{macrocode} +\DoNotIndex{\',\.,\@M,\@@input,\@Alph,\@alph,\@addtoreset,\@arabic} +\DoNotIndex{\@badmath,\@centercr,\@cite} +\DoNotIndex{\@dotsep,\@empty,\@float,\@gobble,\@gobbletwo,\@ignoretrue} +\DoNotIndex{\@input,\@ixpt,\@m,\@minus,\@mkboth} +\DoNotIndex{\@ne,\@nil,\@nomath,\@plus,\roman,\@set@topoint} +\DoNotIndex{\@tempboxa,\@tempcnta,\@tempdima,\@tempdimb} +\DoNotIndex{\@tempswafalse,\@tempswatrue,\@viipt,\@viiipt,\@vipt} +\DoNotIndex{\@vpt,\@warning,\@xiipt,\@xipt,\@xivpt,\@xpt,\@xviipt} +\DoNotIndex{\@xxpt,\@xxvpt,\\,\ ,\addpenalty,\addtolength,\addvspace} +\DoNotIndex{\advance,\ast,\begin,\begingroup,\bfseries,\bgroup,\box} +\DoNotIndex{\bullet} +\DoNotIndex{\cdot,\cite,\CodelineIndex,\cr,\day,\DeclareOption} +\DoNotIndex{\def,\DisableCrossrefs,\divide,\DocInput,\documentclass} +\DoNotIndex{\DoNotIndex,\egroup,\ifdim,\else,\fi,\em,\endtrivlist} +\DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup} +\DoNotIndex{\endlist,\everycr,\everypar,\ExecuteOptions,\expandafter} +\DoNotIndex{\fbox} +\DoNotIndex{\filedate,\filename,\fileversion,\fontsize,\framebox,\gdef} +\DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule} +\DoNotIndex{\hsize,\hskip,\hspace,\hss,\if@tempswa,\ifcase,\or,\fi,\fi} +\DoNotIndex{\ifhmode,\ifvmode,\ifnum,\iftrue,\ifx,\fi,\fi,\fi,\fi,\fi} +\DoNotIndex{\input} +\DoNotIndex{\jobname,\kern,\leavevmode,\let,\leftmark} +\DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark,\markboth,\markright} +\DoNotIndex{\month,\newcommand,\newcounter,\newenvironment} +\DoNotIndex{\NeedsTeXFormat,\newdimen} +\DoNotIndex{\newlength,\newpage,\nobreak,\noindent,\null,\number} +\DoNotIndex{\numberline,\OldMakeindex,\OnlyDescription,\p@} +\DoNotIndex{\pagestyle,\par,\paragraph,\paragraphmark,\parfillskip} +\DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions} +\DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright} +\DoNotIndex{\refstepcounter,\relax,\renewcommand} +\DoNotIndex{\rightmargin,\rightmark,\rightskip,\rlap,\rmfamily} +\DoNotIndex{\secdef,\selectfont,\setbox,\setcounter,\setlength} +\DoNotIndex{\settowidth,\sfcode,\skip,\sloppy,\slshape,\space} +\DoNotIndex{\symbol,\the,\trivlist,\typeout,\tw@,\undefined,\uppercase} +\DoNotIndex{\usecounter,\usefont,\usepackage,\vfil,\vfill,\viiipt} +\DoNotIndex{\viipt,\vipt,\vskip,\vspace} +\DoNotIndex{\wd,\xiipt,\year,\z@} +\DoNotIndex{\next} +% \end{macrocode} +% +% Direct \classname{ltxdoc} to produce an index. +% \begin{macrocode} +\AtEndDocument{\PrintIndex\PrintChanges}% +% \end{macrocode} +% +% \subsection{Extension to \LaTeX's \env{filecontents} Environment} +% We want to +% coax the version number into \env{filecontents}-generated files. +% Note that we expect \cmd\fileversion\ and \cmd\filedate\ to +% hold the needed information. For this to be the case, +% your document should execute the \cmd\GetFileInfo\ command +% (as documented in section~\ref{sec:GetFileInfo}) before +% any instances of \env{filecontents}. +% \begin{macrocode} +\makeatletter +\def\endfilecontents{% + \immediate\write\reserved@c{% + \string\iffalse\space ltxdoc klootch^^J% + \ifx\undefined\fileversion\else + \ifx\undefined\filedate\else + This file has version number \fileversion, last revised \filedate.% + \fi\fi + \string\fi + }% + \immediate\closeout\reserved@c + \def\T##1##2##3{% + \ifx##1\@undefined\else + \@latex@warning@no@line{##2 has been converted to Blank ##3e}% + \fi + }% + \T\L{Form Feed}{Lin}% + \T\I{Tab}{Spac}% + \immediate\write\@unused{}% +}% +\expandafter\let\csname endfilecontents*\endcsname\endfilecontents +\makeatother +% \end{macrocode} +% +% Alter formatting in arrays; set them tight. +% \begin{macrocode} +\setlength\arraycolsep{0pt}% +% \end{macrocode} +% +% \subsection{End of the \file{kernel} {\sc docstrip} module} +% +% \begin{macrocode} +%</kernel> +% \end{macrocode} +% +% \subsection{Tail of the \file{package} {\sc docstrip} module} +% Here is the remainder of the package code. +% \begin{macrocode} +%<*package> +% \end{macrocode} +% Currently, there is little. +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% +% \section{Font Package for Acrobat Compatability}% +% The package \classname{acrofont} +% substitutes Acrobat-standard fonts for Computer Modern where possible, +% even in math mode. +% Documents typeset with this package in effect will require as little +% downloaded font data as possible, but will not be exemplars of +% fine math typesetting. +% +% \subsection{Beginning of the \file{fonts} {\sc docstrip} module} +% The document class module comprises this and the next +% four sections. +% \begin{macro}{\class@base} +% We define in exactly one spot the base class. +% Typically that class will be one of \classname{book}, +% \classname{article}, or \classname{report}. +% The base class effectively defines the use and the markup scheme +% of the class of documents to be handled by this class. +% +% This class is a variant of the standard \LaTeX\ book class: +% \url{ftp://ctan.tug.org/tex-archive/macros/latex/unpacked}. +% \begin{macrocode} +%<*fonts> +\def\class@name{ltxdocext}% +\expandafter\ClassInfo\expandafter{\class@name}{% + Written for \protect\LaTeXe\space + by A. Ogawa (arthur_ogawa at sbcglobal.net)% +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Variants on psfonts packages}% +% The following uses \file{times.sty} from \url{/packages/psnfss/psfonts.dtx} +% \begin{macrocode} +\RequirePackage{times}% +% \end{macrocode} +% +% The following uses \file{mathptm.sty} from \url{/packages/psnfss/psfonts.dtx} +% \begin{macrocode} +\RequirePackage{mathptm}% +% \end{macrocode} +% +% The following is a customization of \file{ot1ptmcm.fd}. +% The virtual font referred to here \file{zptmnocmr} is +% a variant of Sebastian Rahtz's \file{zptmcmr}, but with +% even more glyphs moved from CM to Acrobat-standard fonts. +% \begin{macrocode} +\DeclareFontFamily{OT1}{ptmcm}{} +\DeclareFontShape{OT1}{ptmcm}{m}{n}{ + <-> zptmnocmr +}{} +\DeclareFontShape{OT1}{ptmcm}{l}{n}{<->ssub * ptmnocm/m/n}{} +% \end{macrocode} +% +% The following is a customization of \file{omlptmcm.fd} +% The virtual font referred to here \file{zptmnocmrm} is +% a variant of Sebastian Rahtz's \file{zptmcmrm}, but with +% even more glyphs moved from CM to Acrobat-standard fonts. +% \begin{macrocode} +\DeclareFontFamily{OML}{ptmcm}{\skewchar \font =127} +\DeclareFontShape{OML}{ptmcm}{m}{it}{ + <-> zptmnocmrm +}{} +\DeclareFontShape{OML}{ptmcm}{l}{it}{<->ssub * ptmcm/m/it}{} +\DeclareFontShape{OML}{ptmcm}{m}{sl}{<->ssub * ptmcm/m/it}{} +\DeclareFontShape{OML}{ptmcm}{l}{sl}{<->ssub * ptmcm/m/sl}{} +% \end{macrocode} +% +% The following is a customization of \file{omspzccm.fd} +% The virtual font referred to here \file{zpzcnocmry} is +% a variant of Sebastian Rahtz's \file{zpzccmry}, but with +% even more glyphs moved from CM to Acrobat-standard fonts. +% \begin{macrocode} +\DeclareFontFamily{OMS}{pzccm}{} +\DeclareFontShape{OMS}{pzccm}{m}{n}{ + <-> zpzcnocmry +}{}% cmsy10 Symbol Zapf Chancery Medium-Italic Times-Roman +\DeclareFontShape{OMS}{pzccm}{l}{n}{<->ssub * pzccm/m/n}{} +% \end{macrocode} +% +% The following is a customization of \file{omxpsycm.fd} +% The virtual font referred to here \file{zpsynocmrv} is +% a variant of Sebastian Rahtz's \file{zpsycmrv}, but with +% even more glyphs moved from CM to Acrobat-standard fonts. +% \begin{macrocode} +\DeclareFontFamily{OMX}{psycm}{} +\DeclareFontShape{OMX}{psycm}{m}{n}{ + <-> zpsynocmrv +}{} +\DeclareFontShape{OMX}{psycm}{l}{n}{<->ssub * psycm/m/n}{} +% +\DeclareFontEncoding{8r}{}{}% from file: 8renc.def +\DeclareFontFamily{8r}{cmr}{\hyphenchar\font45 }% from file: 8rcmr.fd +\DeclareFontShape{8r}{cmr}{m}{n}{ + <-> cmr10 +}{} +% \end{macrocode} +% +% \subsection{Font definition files}% +% +% The following forces \LaTeX\ to do now what it would do anyway: +% load the `font definition' information for the fonts that we +% use. In this way, we prepare for faster processing through +% the \cmd\dump\ of a preformatted macro package that will not +% need to read in any packages or font definitions from disk. +% \begin{macrocode} +\input{8rphv.fd}% +\input{8rptm.fd}% +\input{ot1phv.fd}% +\input{ot1ptm.fd}% +\input{t1ptm.fd}% +% \end{macrocode} +% +% \subsection{More math substitutions}% +% +% The following definitions arrange to get certain glyphs from the +% text font instead of out of math pi fonts. +% In particular, the copyright and registered symbols +% are single glyphs instead of composites involving +% the big circle from the \file{cmsy} font. +% \begin{macrocode} + \def\eightRChar#1{{\def\encodingdefault{8r}\fontencoding\encodingdefault\selectfont\char"#1}}% + \def\LANGLE{$<$}%{\eightRChar{8B}}% + \def\RANGLE{$>$}%{\eightRChar{9B}}% +%\def\ASTER{\eightRChar{2A}}% +%\def\DAGGER{\eightRChar{86}}% +%\def\DDAGGER{\eightRChar{87}}% + \def\BULLET{\eightRChar{95}}% +%\def\SECTION{\eightRChar{A7}}% +%\def\PARAGRAPH{\eightRChar{B6}}% + \def\VERTBAR{\eightRChar{7C}}% + \def\COPYRIGHT{\eightRChar{A9}}% + \def\REGISTERED{\eightRChar{AE}}% +% \end{macrocode} +% +% \begin{macrocode} + \def\textbar{\VERTBAR}% + \def\textbullet{\BULLET}% + \def\textcopyright{\COPYRIGHT}% + \def\textregistered{\REGISTERED}% +% \end{macrocode} +% +% I have removed \cmd\ensuremath\ from the following definition, and +% all commands like \cmd\mathsection have been converted to +% e.g., \cmd\textsection. +% \begin{macrocode} +\def\@makefnmark{\@thefnmark}% +\def\@fnsymbol#1{{\ifcase#1\or *\or \dagger\or \ddagger\or + \textsection\or \textparagraph\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi}} +% \end{macrocode} +% +% \subsection{End of the \file{fonts} {\sc docstrip} module} +% Here ends the module. +% \begin{macrocode} +%</fonts> +% \end{macrocode} +% +% +% \section{Programming Conventions}% +% In writing the above code, I cleave to certain conventions, noted +% here. +% My goal in explaining them is to encourage others maintaining this +% body of code to consider following them as well. +% The benefits are twofold: +% Some of the coding conventions aim to avoid programming pitfalls; +% following them reduces maintenance costs. +% Others make the code easier to read; following these eases the +% process of understanding how the code works. +% +% And, for my part, I prefer to read code of this type. +% +% \subsection{Whitespace Conventions}% +% Exactly where code lines break and indent, and where additional +% whitespace is inserted is explained here. +% \begin{itemize} +% \item +% Each new macro definition or register assignment begins a new line. +% Therefore, \cmd\def, \cmd\newcommand, and their ilk will start in column~1. +% \item +% Code is indented one space for each level of nesting within braces +% \verb|{}|. +% \item +% Likewise, if possible, for \cmd\if\dots and matching \cmd\fi. +% \item +% However, the closing brace or \cmd\fi\ is outdented by one so that it +% falls +% at the same level of indentation as its matching brace or \cmd\if, +% and it appears alone on its line. +% \item +% Use of the |tab| character is deprecated +% (tabs are not standardized across all applications and operating +% systems). +% \item +% Lines of code are limited to 72 characters. +% I follow this convention mostly to ease the transmission of files +% via email (a deprecated practice) and to accomodate people with +% small monitors. +% But \classname{ltxdoc} output looks better with the shorter lines, too. +% \item +% Extraneous whitespace in the replacement part of a macro definition +% is avoided by using the comment character |%|. +% In most cases, if falling at the end of a line of code, +% a brace will be immediately followed by a comment character, +% as will the macro parameter |#1| and any one-letter control sequence, +% like |\\|. +% \item +% Extraneous whitespace in the package file is also avoided. +% When \TeX\ reads in the .sty file, it will process \cmd\def s, and other commands, +% but will not process blank spaces. +% This practice is simply a discipline. You don't need to do this. +% But sometimes \TeX\ has to read in a file while it is in horizontal mode, +% at which point this practice is essential. +% \end{itemize} +% These conventions taken together are illustrated by the following: +% \begin{verbatim} +%\def\prepdef#1#2{% +% \@ifxundefined#1{\toks@{}}{\toks@\expandafter{#1}}% +% \toks@ii{#2}% +% \edef#1{\the\toks@ii\the\toks@}% +%}% +% \end{verbatim} +% In the above, the definition of \cmd\prepdef\ would not fit on a single +% line, +% and required breaking. The first and last lines have matching braces, +% and are a the same level of indentation, with the last line containing +% a single brace. +% +% Each of the three intervening lines has balanced braces and is +% indented by one space. Each line that would otherwise end in a single +% brace character is terminated by a comment character. +% +% Some coders rely on the fact that a space character seen by \TeX's +% scanner while in vertical mode is a no-op. +% Be that as it may, I eliminate them unless actually intentional. +% +% \subsection{Conventions For Procedures}% +% Here are some of my preferences when writing procedures: +% \begin{itemize} +% +% \item +% I dislike defining a macro within another macro, especially when the +% pattern part is non-nil. +% You know, you are not saving much space in |mem| when you do this, +% right? +% You do save space in the hash table and the string pool, though. +% On the other hand, we are not dealing with small \TeX\ engines +% anymore; Team \LaTeX\ has made sure of this. +% +% \item +% If two or more macros have very similar replacement parts, consider +% layering. +% +% \item +% Macros may perform parsing, may maintain tokens or registers, or may +% set type (produce marks). I try to avoid combining the three functions +% in a single macro. +% +% \item +% When a procedure both does assignments and sets type, I try to have a +% clean separations between the two activities. Try to avoid: +% \begin{verbatim} +% \vskip10pt +% \parindent=0pt +% \leavevmode +% \end{verbatim} +% +% \item +% The Boolean calculus (cf. \cmd\@ifx) +% is very useful and produces code that executes nicely. +% Using it also helps avoid your having to debug problems where +% \cmd\if\dots\ and \cmd\fi\ are not properly balanced +% (a nightmare, in case you have not already experienced it). +% +% \end{itemize} +% +% \subsection{Conventions For \LaTeX}% +% Team \LaTeX\ make certain recommendations in \file{clsguide.tex}. +% Ones that I particularly pay attention to are: +% \begin{itemize} +% +% \item +% For the sake of ``color safety'', +% use \cmd\sbox\ rather than \cmd\setbox, \cmd\mbox\ rather than \cmd\hbox, and +% \cmd\parbox\ or \env{minipage} rather than \cmd\vbox. +% +% \item +% Use \cmd\newcommand\ and \cmd\newenvironment\ to declare user-level commands +% and environments. Avoid the idiom \cmd\def\cmd\foo, \cmd\def\cmd\endfoo\ to define +% an environment. +% Ideally, all user-level markup could be extracted from the +% document class by grepping on \cmd\newcommand\ and \cmd\newenvironment. +% +% \item +% Prefer to use \cmd\setlength\ to assign registers. +% +% \end{itemize} +% I cannot help but notice that much of the code of \LaTeX\ itself fails +% to comply with many of the coding recommendations of Team \LaTeX. +% +% \Finale +% \iffalse Here ends the programmer's documentation.\fi +% \endinput +% +\endinput +%%EOF diff --git a/texmf/source/latex/revtex/ltxfront.dtx b/texmf/source/latex/revtex/ltxfront.dtx new file mode 100644 index 0000000..86dc0f3 --- /dev/null +++ b/texmf/source/latex/revtex/ltxfront.dtx @@ -0,0 +1,3763 @@ +% \iffalse meta-comment balanced on line 108 +% ltxfront.dtx: package to change page grid, MVL. +% Copyright (c) 2009 Arthur Ogawa +% +% Disclaimer +% This file is distributed WITHOUT ANY WARRANTY; +% without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +% License +% You may distribute this file under the conditions of the +% LaTeX Project Public License 1.3c or later +% (http://www.latex-project.org/lppl.txt). +% ReadMe +% For the documentation and more detailed instructions for +% installation, typeset this document with \LaTeX. +% Maintenance Status +% This work has the LPPL maintenance status "maintained"; +% Current Maintainer of this work is Arthur Ogawa. +% +% This work consists of the main source file ltxfront.dtx +% and the derived files +% ltxfront.sty, ltxfront.pdf +% Distribution: +% CTAN:macros/latex/contrib/revtex/ +% +% Unpacking: +% tex ltxfront.dtx +% +% Documentation: +% latex ltxfront.dtx; ... +% +% Programm calls to get the documentation (example): +% pdflatex ltxfront.dtx +% makeindex -s gind.ist ltxfront.idx +% makeindex -s gglo.ist -o ltxfront.gls ltxfront.glo +% pdflatex ltxfront.dtx +% makeindex -s gind.ist ltxfront.idx +% pdflatex ltxfront.dtx +% +% Installation: +% TDS:doc/latex/revtex/ +% TDS:source/latex/revtex/ +% TDS:tex/latex/revtex/ +% +% Thanks, Heiko! +% This method of letting a single .dtx file serve as both +% documentation (via latex) and installer (via tex) follows +% the example of Heiko Oberdiek. Thanks! +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase + 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi + \relax +\else + \csname fi\endcsname +%</ignore> +%<*install> +%% This file will generate documentation and runtime files +%% from ltxfront.dtx when run through LaTeX or TeX. +\input docstrip +\preamble + +This is a generated file; +altering it directly is inadvisable; +instead, modify the original source file. +See the URL in the file README-LTXFRONT.tex. + +License + You may distribute this file under the conditions of the + LaTeX Project Public License 1.3c or later + (http://www.latex-project.org/lppl.txt). + + This file is distributed WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. + +\endpreamble +\askforoverwritefalse +\keepsilent + \generate{% + %{ignore} +% \usedir{tex/latex/revtex}% + \file{ltxfront.sty}{% + \from{ltxfront.dtx}{package,options,kernel}% + }% + }% +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation, please move} +\Msg{* ltxfront.sty} +\Msg{* into a directory searched by TeX;} +\Msg{* in a TDS-compliant installation:} +\Msg{* texmf/tex/macros/latex/revtex/.} +\Msg{*} +\Msg{* To produce the documentation, + run ltxfront.dtx through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% \fi +% +% \GetFileInfo{ltxfront.dtx} +% +% \iffalse ltxdoc klootch +%<*package> +%%% @LaTeX-file{ +%%% filename = "ltxfront.dtx", +%%% version = "4.2e", +%%% date = "2020/10/03", +%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net), +%%% commissioned by the American Physical Society. +%%% ", +%%% copyright = "Copyright (C) 1999, 2009 Arthur Ogawa, +%%% distributed under the terms of the +%%% LaTeX Project Public License 1.3c, see +%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt +%%% ", +%%% address = "Arthur Ogawa, +%%% USA", +%%% telephone = "", +%%% FAX = "", +%%% email = "mailto colon arthur_ogawa at sbcglobal.net", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, page grid, main vertical list", +%%% supported = "yes", +%%% abstract = "package to change page grid, MVL", +%%% } +%</package> +% \fi +% +% \iffalse ltxdoc klootch +% The following references the \file{README-LTXFRONT} file, +% which contains basic information about this package. +% The contents of this file are generated when +% you typeset the programmer's documentation. +% Search on "{filecontents*}{README-LTXFRONT.tex}" to locate it. +% \fi\input{README-LTXFRONT}% +% +% \subsection{Bill of Materials} +% +% Following is a list of the files in this distribution arranged +% according to provenance. +% +% \subsubsection{Primary Source}% +% One single file generates all. +%\begin{verbatim}ltxfront.dtx\end{verbatim} +% +% \subsubsection{Generated by \texttt{latex ltxfront.dtx}}% +% Typesetting the source file under \LaTeX\ +% generates the readme and the documentation. +%\begin{verbatim}README-LTXFRONT\end{verbatim} +% +% \subsubsection{Generated by \texttt{tex ltxfront.dtx}}% +% Typesetting the installer generates +% the package files. +%\begin{verbatim}ltxfront.sty\end{verbatim} +% +% \subsubsection{Documentation}% +% The following are the online documentation: +% \begin{verbatim}ltxfront.pdf\end{verbatim} +% +% \subsubsection{Auxiliary}% +% The following are auxiliary files generated +% in the course of running \LaTeX: +% \begin{verbatim}ltxfront.aux ltxfront.idx ltxfront.ind ltxfront.log ltxfront.toc\end{verbatim} +% +% \section{Code common to all modules}% +% +% We want to require only one place in this file +% where the version number is stated, +% and we also want to ensure that the version +% number is embedded into every generated file. +% +% Now we declare that +% these files can only be used with \LaTeXe. +% An appropriate message is displayed if +% a different \TeX{} format is used. +% \begin{macrocode} +%<*doc|package> +\NeedsTeXFormat{LaTeX2e}[1995/12/01]% +%</doc|package> +% \end{macrocode} +% As desired, the following modules all +% take common version information: +% \begin{macrocode} +%<kernel&!package&!doc>\typeout{% +%<*package|doc> +\ProvidesFile{% +%</package|doc> +%<*kernel|package|doc> +ltxfront% +%</kernel|package|doc> +%<*doc> +.dtx% +%</doc> +%<package>.sty% +%<*package|doc> +}% +%</package|doc> +% \end{macrocode} +% +% The following line contains, for once and for all, +% the version and date information. +% By various means, this information is reproduced +% consistently in all generated files and in the +% typeset documentation. +% \begin{macrocode} +%<*doc|package|kernel> +%<version> + [2020/10/03 4.2e frontmatter package (AO,DPC,MD)]% \fileversion +%</doc|package|kernel> +%<kernel&!package&!doc>}% +% \end{macrocode} +% +% +% \section{The doc module \texttt{doc}} +% +% This module, consisting of the present section, +% typesets the programmer's documentation, +% generating the \file{README-LTXFRONT} and sample document as needed. +% +% Because the only uncommented-out lines of code at the beginning of +% this file constitute the \file{doc} module itself, +% we can simply typeset the \file{.dtx} file directly, +% and there is thus rarely any need to +% generate the ``doc'' {\sc docstrip} module. +% Module delimiters are nonetheless required so that +% this code does not find its way into the other modules. +% +% The \enve{document} command concludes the typesetting run. +% +% \begin{macrocode} +%<*doc> +% \end{macrocode} +% +% \subsection{The Preamble} +% The programmers documentation is formatted +% with the \classname{ltxdoc} class with local customizations, +% and with the usual code line indexing. +% \begin{macrocode} +\documentclass{ltxdoc} +\RequirePackage{ltxdocext}% +\let\url\undefined +\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}% +%\expandafter\ifx\csname package@font\endcsname\@undefined\else +% \expandafter\RequirePackage\expandafter{\csname package@font\endcsname}% +%\fi +\CodelineIndex\EnableCrossrefs % makeindex -s gind.ist ltxfront +\RecordChanges % makeindex -s gglo.ist -o ltxfront.gls ltxfront.glo +% \end{macrocode} +% +% \subsubsection{Docstrip and info directives} +% We use so many {\sc docstrip} modules that we set the +% \texttt{StandardModuleDepth} counter to 1. +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% The following command retrieves the date and version information +% from this file. +% \begin{macrocode} +\expandafter\GetFileInfo\expandafter{\jobname.dtx}% +% \end{macrocode} +% +% \subsection{The ``Read Me'' File} +% As promised above, here is the contents of the +% ``Read Me'' file. That file serves a double purpose, +% since it also constitutes the beginining of the +% programmer's documentation. What better thing, after +% all, to have appear at the beginning of the +% typeset documentation? +% +% A good discussion of how to write a ReadMe file can be found in +% Engst, Tonya, ``Writing a ReadMe File? Read This'' +% \emph{MacTech} October 1998, p. 58. +% +% Note the appearance of the +% \cmd\StopEventually\ command, which marks the +% dividing line between the user documentation +% and the programmer documentation. +% +% The usual user will not be asked to +% do a full build, not to speak +% of the bootstrap. +% Instructions for carrying these processes +% begin the programmer's manual. +% +% \begin{macrocode} +\begin{filecontents*}{README-LTXFRONT.tex} +\title{% + A \LaTeX\ Package for\\the frontmatter and title page% + \thanks{% + This file has version number \fileversion, + last revised \filedate.% + }% + \thanks{% + Version \fileversion\ \copyright\ 2019 American Physical Society + }% +}% + +\author{% + Arthur Ogawa% + \thanks{\texttt{mailto:arthur\_ogawa at sbcglobal.net}}% +}% +%\iffalse +% For version number and date, +% search on "\fileversion" in the .dtx file, +% or see the end of the README-LTXFRONT file. +%\fi +\maketitle + +This file embodies the \classname{ltxfront} package, +the implementation and its user documentation. + +The distribution point for this work is +\url{https://journals.aps.org/revtex}, +which contains fully unpacked, prebuilt runtime files and documentation. + +The \classname{ltxfront} package was commissioned by the American Physical Society +and is distributed under the terms of the \LaTeX\ Project Public License 1.3c, +the same license under which all the portions of \LaTeX\ itself is distributed. +Please see \url{http://ctan.tug.org/macros/latex/base/lppl.txt} for details. + +To use this document class, you must have a working +\TeX\ installation equipped with \LaTeXe\ +and possibly pdftex and Adobe Acrobat Reader or equivalent. + +To install, retrieve the distribution, +unpack it into a directory on the target computer, +and move the file \file{ltxfront.sty} +into a location in your filesystem where it will be found by \LaTeX. + +To use, read the user documentation \file{ltxfront.pdf}. + +\tableofcontents + +\section{Processing Instructions} + +The package file \file{ltxfront.sty} +is generated from this file, \file{ltxfront.dtx}, +using the {\sc docstrip} facility of \LaTeX +via |tex ltxfront.dtx|. +The typeset documentation that you are now reading is generated from +the same file by typesetting it with \LaTeX\ or pdftex +via |latex ltxfront.dtx| or |pdflatex ltxfront.dtx|. + +\subsection{Build Instructions} + +You may bootstrap this suite of files solely from \file{ltxfront.dtx}. +Prepare by installing \LaTeXe\ (and either tex or pdftex) on your computer, +then carry out the following steps: +\begin{enumerate} + +\item +Within an otherwise empty directory, +typeset \file{ltxfront.dtx} with \TeX\ or pdftex, +thereby generating the package file \file{ltxfront.sty}. + +\item +Next typeset \file{ltxfront.dtx} with \LaTeX\ or pdflatex; +you will obtain the typeset documentation you are now reading, +along with +the sample document \file{ltxfront-test.tex} +and the file \file{README-LTXFRONT}. + +Note: you will have to run \LaTeX, then +\file{makeindex} \texttt{-s gind.ist ltxfront.idx}, then +\file{makeindex} \texttt{-s gglo.ist -o ltxfront.gls ltxfront.glo}, then +\LaTeX\ again in order to obtain a valid index and table of contents. +\item +Now typeset \file{ltxfront.dtx} with \TeX (not \LaTeX), +thereby generating the package file \file{ltxfront.sty}. +\item +Install the following files into indicated locations within your +TDS-compliant \texttt{texmf} tree (you may need root access): +\begin{itemize} +\item +\file{$TEXMF/}\file{tex/}\file{latex/}\file{revtex/}\classname{ltxfront.sty} +\item +\file{$TEXMF/}\file{source/}\file{latex/}\file{revtex/}\classname{ltxfront.dtx} +\item +\file{$TEXMF/}\file{doc/}\file{latex/}\file{revtex/}\classname{ltxfront.pdf} +\end{itemize} +where \file{$TEXMF/} stands for \file{texmf-local/}, or some other \texttt{texmf} tree +in your installation. +\item +Run \texttt{mktexlsr} on \file{$TEXMF/} (you may need root access). +\item +Build and installation are now complete; +now put a \cmd\usepackage\texttt{\{ltxfront\}} in your document preamble! +\end{enumerate} + +\subsection{Change Log} +\changes{4.0b}{1999/06/20}{Change handling of \cs{@author} to prevent parsing problems. (Helps in error recovery when syntax errors exist)} +\changes{4.0b}{1999/06/20}{Gathered all code for the abstract environment together and abstracted out the formatting details for journals to override.} +\changes{4.0b}{1999/06/20}{Separate option now controls production} +\changes{4.0b}{1999/06/20}{Set \cs{footnote} to \LaTeX\ standard version for this scope.} +\changes{4.0c}{1999/11/13}{grid changes with ltxgrid} +\changes{4.0d}{1998/01/31}{\cs{comma@space}} +\changes{4.0d}{1998/01/31}{change name from \cs{tempaffiliation}} +\changes{4.0d}{1998/01/31}{hookify} +\changes{4.0d}{1998/01/31}{If empty \cs{abstractname} omit spacing} +\changes{4.0d}{1998/01/31}{PACS boxed to width of abstract} +\changes{4.0e}{2000/09/20}{Keywords on same footing as PACS} +\changes{4.0e}{2000/09/20}{Warn if no production} +\changes{4.0f}{2001/02/13}{Actually append \cs{AU@grp} to \cs{@AAClist}.} +\changes{4.0g}{1998/06/10}{multiple preprint commands} +\changes{4.0h}{1998/06/25}{Changes to support groups of affiliations} +\changes{4.0h}{1998/06/25}{new hook} +\changes{4.0l}{1998/09/01}{add optional argument handling back} +\changes{4.0l}{1998/09/01}{Changes to add collaboration processing, which now means doing comma/and processing on each sublist} +\changes{4.0l}{1998/09/01}{macro added} +\changes{4.1a}{2008-06-30}{(AO, 443) create an entry in the PDF bookmarks for the abstract via the toc} +\changes{4.1a}{2008-07-01}{(AO, 496) remove default prependation to \cs{email}.} +\changes{4.1a}{2008-07-01}{(AO, 496) remove default prependation to \cs{homepage}.} +\changes{4.1a}{2008/06/16}{removed code that had been commented out} +\changes{4.1b}{2008/06/29}{(AO, 455) provide a \texttt{description} environment for the abstract} +\changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +\changes{4.1b}{2008/08/02}{Change csname \cs{AFS@opr} to \cs{AFG@opr}} +\changes{4.1b}{2008/08/02}{Make the syntax of this package switch optional}% +\changes{4.1b}{2008/08/02}{Provide for diagnostics via \cs{frontmatterverbose@sw}} +\changes{4.1b}{2008/08/02}{Use \cs{@affil@def} for all access to \cs{@affil}} +\changes{4.1b}{2008/08/02}{Use \cs{frontmatter@init} as the vehicle for all initialization} +\changes{4.1b}{2008/08/04}{(AO, 443) PDF Bookmark for title page}% +\changes{4.1b}{2008/08/04}{Provide facility \cs{affil@cutoff}: if there is only one affiliation on the title page, no superscript}% +\changes{4.1c}{2008/08/04}{Hyperref compatibility: take \cs{maketitle} back.} +\changes{4.1c}{2008/08/04}{Parametrize the production after the address}% +\changes{4.1c}{2008/08/04}{Produce PACS, keywords only if specified}% +\changes{4.1d}{2008/10/17}{(AO, 410) compare \cs{@tempa} to \cs{blankaffiliation}.}% +\changes{4.1f}{2009/07/07}{(AO, 515) Use \cs{set@footnotefont}, which is defined in ltxutil} +\changes{4.1g}{2009/10/05}{(AO, 535) Robustify \cs{footnote} while \cs{class@warn} is expanding its argument} +\changes{4.1g}{2009/10/05}{(AO, 539) Robustify \cs{class@warn} against TOC processing}% +\changes{4.1i}{2009/10/18}{(AO, 540) More runtime diagnostics via \cs{frontmatterverbose@sw}} +\changes{4.1i}{2009/10/23}{(AO, 540) Rationalize code that appends to \cs{AF@grp}} +\changes{4.1i}{2009/10/23}{(AO, 540) Optimize boolean logic } +\changes{4.1i}{2009/10/23}{(AO, 544) Class options runinaddress and unsortedaddress stopped working} +\changes{4.1m}{2009/11/20}{(AO, 563) \cs{collaboration} to work with both \texttt{groupedaddress} and \texttt{superscriptaddress}} +\changes{4.1m}{2009/11/20}{(AO, 563) More complete runtime diagnostics via \cs{frontmatterverbose@sw}} +\changes{4.1m}{2009/11/20}{(AO, 563) Let \cs{@collaboration@gobble} parse all three arguments of \cs{CO@opr}} +\changes{4.1n}{2009/11/30}{(AO, 567) Handle \cs{noaffiliation} case} +\changes{4.1n}{2009/11/30}{(AO, 567) Handle punctuation for \classoption{superscriptaddress} style authors' extra information, such as \cs{email}} +\changes{4.1n}{2009/12/03}{(AO) remove http:// from \cs{href} call} +\changes{4.1n}{2010/01/02}{(AO, 571) Interface \cs{set@footnotewidth} for determining the set width of footnotes}% +\changes{4.1n}{2010/01/02}{(AO, 571) allow split after last line of footnote}% +\changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +\changes{4.2a}{2018/12/12}{(MD) Updated name of README file and use standard fonts when typesetting}% + +\end{filecontents*} +% \end{macrocode} +% +% \subsection{A Gnuly Created Sample Document} +% +% \begin{macrocode} +\begin{filecontents*}{ltxfront-test.tex} +\documentclass{article}% use any combination of titlepage, twocolumn +\usepackage[]{ltxfront}% use inactive to turn off features +\begin{document} + +\title{Gnu Veldt Cuisine} + +\author{G. Picking} +\thanks{Supported by a grant from the GSF.} +\affiliation{Acme Kitchen Products} + +\author{R. Dillo} +\thanks{On leave during 1985.} +\affiliation{Cordon Puce School} + +\date{24 July 1984}% +\revised{5 January 1985}% + +\maketitle + +\section{Introduction}% +We reproduce most features of \LaTeX\ manual, Figure C.4, p. 183. +\end{document} +\end{filecontents*} +% \end{macrocode} +% +% \subsection{The Document Body} +% +% Here is the document body, containing only a +% \cmd\DocInput\ directive---referring to this very file. +% This very cute self-reference is a common \classname{ltxdoc} idiom. +% \begin{macrocode} +\begin{document}% +\expandafter\DocInput\expandafter{\jobname.dtx}% +% ^^A\PrintChanges +\end{document} +% \end{macrocode} +% +% \begin{macrocode} +%</doc> +% \end{macrocode} +% +% \section{Using this package} +% Once this package is installed on your filesystem, you can employ it in +% adding functionality to \LaTeX\ by invoking it in your document or document class. +% +% \subsection{Invoking the package} +% In your document, you can simply call it up in your preamble: +% \begin{verbatim} +%\documentclass{book}% +%\usepackage{ltxfront}% +%\begin{document} +%<your document here> +%\end{document}\end{verbatim} +% However, the preferred way is to invoke this package from within your +% customized document class: +% \begin{verbatim} +%\NeedsTeXFormat{LaTeX2e}[1995/12/01]% +%\ProvidesClass{myclass}% +%\RequirePackage{ltxfront}% +%\LoadClass{book}% +%<class customization commands> +%\endinput\end{verbatim} +% +% Once loaded, the package gives you acccess to certain procedures, +% usually to be invoked by a \LaTeX\ command or environment. +% +% \section{Frontmatter commands} +% +% A document using this package will use commands like \cmd\title, \cmd\author, \cmd\thanks, +% the \texttt{abstract} environment +% and \cmd\maketitle. +% These are part of \LaTeX's standard document classes. +% But this package supplements \LaTeX\ syntax with additional commands, such as +% \cmd\affiliation, \cmd\collaboration, \cmd\email, \cmd\homepage, and others. +% +% Furthermore, you can have multiple \cmd\author, \cmd\affiliation, and \cmd\collaboration\ commands, +% each with their own set of \cmd\email, \cmd\homepage, etc. commands. +% +% \section{The Front Matter}\label{sec:front} +% +% This section describes the macros +% this package provides for formatting the front matter of an +% article. The behavior and usage of these macros can be quite +% different from those provided in \LaTeXe. +% +% \subsection{Setting the title} +% +% The title of the manuscript is simply specified by using the +% \cmd\title\arg{title} macro. A \verb+\\+ may be used to put a line +% break in a long title. +% The \cmd\title\ commnd takes an optional argument, which you will use to +% give an abbreviated title for use in the running header. +% +% \subsection{Specifying a date}% +% +% The \cmd\date\marg{date} command outputs the date on the manuscript. +% Using \cmd\today\ will cause \LaTeX{} to insert the +% current date whenever the file is run: +% \begin{verbatim}\date{\today}\end{verbatim} +% +% \subsection{Specifying authors and affiliations} +% +% Commands specifying author and affilliation have been improved to save +% labor for authors and in production. Authors and affiliations are +% arranged into groupings called, appropriately enough, \emph{author +% groups}. Each author group is a set of authors who share the same set +% of affiliations. Author names are specified with the \cmd\author\ +% macro while affiliations (or addresses) are specified with the +% \cmd\affiliation\ macro. Author groups are specified by sequences of +% \cmd\author\ macros followed by \cmd\affiliation\ macros. An +% \cmd\affiliation\ macro applies to all previously specified +% \cmd\author\ macros which don't already have an affiliation supplied. +% +% For example, if Bugs Bunny and Roger Rabbit are both at Looney Tune +% Studios, while Mickey Mouse is at Disney World, the markup would be: +% \begin{verbatim} +% \author{Bugs Bunny} +% \author{Roger Rabbit} +% \affiliation{Looney Tune Studios} +% \author{Mickey Mouse} +% \affiliation{Disney World}\end{verbatim} +% The default is to display this as +% \begin{center} +% Bugs Bunny and Roger Rabbit\\ +% \emph{Looney Tune Studios}\\ +% Mickey Mouse\\ +% \emph{Disney World}\\ +% \end{center} +% This layout style for displaying authors and their affiliations is +% chosen by selecting the class option +% \classoption{groupedaddress}. This option is the default for all APS +% journal styles, so it does not need to be specified explicitly. +% The other major way of displaying this +% information is to use superscripts on the authors and +% affiliations. This can be accomplished by selecting the class option +% \classoption{superscriptaddress}. To achieve the display +% \begin{center} +% Bugs Bunny,$^{1}$ Roger Rabbit,$^{1,2}$ and Mickey Mouse$^{2}$\\ +% \emph{$^{1}$Looney Tune Studios}\\ +% \emph{$^{2}$Disney World}\\ +% \end{center} +% one would use the markup +% \begin{verbatim} +% \author{Bugs Bunny} +% \affiliation{Looney Tune Studios} +% \author{Roger Rabbit} +% \affiliation{Looney Tune Studios} +% \affiliation{Disney World} +% \author{Mickey Mouse} +% \affiliation{Disney World}\end{verbatim} +% +% Note that this package takes care of any commas and \emph{and}'s that join +% the author names together and font selection, as well as any +% superscript numbering. Only the author names and affiliations should +% be given within their respective macros. +% +% There is a third class option, \classoption{unsortedaddress}, for +% controlling author/affiliation display. The default +% \classoption{groupedaddress} will actually sort authors into the +% approriate author groups if one chooses to specify an affiliation for +% each author. The markup: +% \begin{verbatim} +% \author{Bugs Bunny} +% \affiliation{Looney Tune Studios} +% \author{Mickey Mouse} +% \affiliation{Disney World} +% \author{Roger Rabbit} +% \affiliation{Looney Tune Studios}\end{verbatim} +% will result in the same display as for the first case given +% above even though Roger Rabbit is specified after Mickey Mouse. To +% avoid Roger Rabbit being moved into the same author group as Bugs +% Bunny, use the +% \classoption{unsortedaddress} option instead. In general, it is safest +% to list authors in the order they should appear and specify +% affiliations for multiple authors rather than one at a time. This will +% afford the most independence for choosing the display option. Finally, +% it should be mentioned that the affiliations for the +% \classoption{superscriptaddress} are presented and numbered +% in the order that they are encountered. This means that the order +% will usually follow the order of the authors. An alternative ordering +% can be forced by including a list of \cmd\affiliation\ commands before +% the first \cmd{\author} in the desired order. Then use the exact same +% text for each affilation when specifying them for each author. +% +% If an author doesn't have an affiliation, the \cmd\noaffiliation\ +% macro may be used in the place of an \cmd\affiliation\ macro. +% +% +% \subsubsection{Collaborations} +% +% A collaboration name can be specified with the \cmd\collaboration\ +% command. This is very similar to the \cmd\author\ command. +% It should appear at the end of an author group. +% The collaboration name will appear centered in parentheses. +% You may have multiple author groups, each with its own \cmd\collaboration. +% Because collaborations don't normally have affiliations, one needs to follow the +% \cmd\collaboration\ with \cmd\noaffiliation. +% +% \subsubsection{Footnotes for authors, collaborations, affiliations or title}\label{sec:footau} +% +% Often one wants to specify additional information associated with an +% author, collaboration, or affiliation such an e-mail address, an +% alternate affiliation, or some other ancillary information. +% This package introduces several new macros just for this purpose. They +% are: +% \begin{itemize} +% \item\cmd\email\oarg{optional text}\arg{e-mail address} +% \item\cmd\homepage\oarg{optional text}\arg{URL} +% \item\cmd\altaffiliation\oarg{optional text}\arg{affiliation} +% \item\cmd\thanks\arg{miscellaneous text} +% \end{itemize} +% In the first three, the \emph{optional text} will be prepended before the +% actual information specified in the required argument. \cmd\email\ and +% \cmd\homepage\ each have a default text for their optional arguments +% (`Electronic address:' and `URL:' respectively). The \cmd\thanks\ +% macro should only be used if one of the other three do not apply. Any +% author name can have multiple instances of these four commands. +% Note that unlike the +% \cmd\affiliation\ macro, these macros only apply to the \cmd\author\ +% that directly precedes it. Any \cmd\affiliation\ \emph{must} follow +% the other author-specific macros. A typical usage might be as follows: +% \begin{verbatim} +% \author{Bugs Bunny} +% \email[E-mail me at: ]{bugs@looney.com} +% \homepage[Visit: ]{http://looney.com/} +% \altaffiliation[Permanent address: ] +% {Warner Brothers} +% \affiliation{Looney Tunes}\end{verbatim} +% This would result in the footnote ``E-mail me at: \texttt{bugs@looney.com}, +% Visit: \texttt{http://looney.com/}, Permanent address: Warner +% Brothers'' being attached to Bugs Bunny. Note that: +% \begin{itemize} +% \item Only an e-mail address, URL, or affiliation should go in the +% required argument in the curly braces. +% \item The font is automatically taken care of. +% \item An explicit space is needed at the end of the optional text if one is +% desired in the output. +% \item Use the optional arguments to provide customized +% text only if there is a good reason to. +% \end{itemize} +% +% The \cmd\collaboration\ , \cmd\affiliation, or even \cmd\title\ can +% also have footnotes attached via these commands. If any ancillary data +% (\cmd\thanks, \cmd\email, \cmd\homepage, or +% \cmd\altaffiliation) are given in the wrong context (e.g., before any +% \cmd\title, \cmd\author, \cmd\collaboration, or \cmd\affiliation\ +% command has been given), then a warning is given in the \TeX\ log, and +% the command is ignored. +% +% Duplicate sets of ancillary data are merged, giving rise to a single +% shared footnote. However, this only applies if the ancillary data are +% identical: even the order of the commands specifying the data must be +% identical. Thus, for example, two authors can share a single footnote +% indicating a group e-mail address. +% +% Duplicate \cmd\affiliation\ commands may be given in the course of the +% front matter, without the danger of producing extraneous affiliations +% on the title page. However, ancillary data should be specified for +% only the first instance of any particular institution's +% \cmd\affiliation\ command; a later instance with different ancillary +% data will result in a warning in the \TeX\ log. +% +% It is preferable to arrange authors into +% sets. Within each set all the authors share the same group of +% affiliations. For each author, give the \cmd\author\ (and appropriate +% ancillary data), then follow this author group with the needed group +% of \cmd\affiliation\ commands. +% +% If affiliations have been listed before the first +% \cmd\author\ macro to ensure a particular ordering, be sure +% that any later \cmd\affiliation\ command for the given institution is +% an exact copy of the first, and also ensure that no ancillary data is +% given in these later instances. +% +% +% A journal may determine the placement of these +% ancillary information footnotes. One journal may put all +% such footnotes at the start of the bibliography while another +% journal may display them on the first page, as a footnote. One can override a +% journal style's default behavior by specifying explicitly the class +% option +% \classoption{bibnotes} (puts the footnotes at the start of the +% bibliography) or \classoption{nobibnotes} (puts them on the first page). +% +% \subsubsection{Specifying first names and surnames} +% +% Many authors have names in which either the surname appears first +% or in which the surname is made up of more than one name. To ensure +% that such names are accurately captured for indexing and other +% purposes, the \cmd\surname\ macro should be used to indicate which portion +% of a name is the surname. Similarly, there is a \cmd\firstname\ macro +% as well, although usage of \cmd\surname\ should be sufficient. If an +% author's surname is a single name and written last, it is not +% necessary to use these macros. These macros do nothing but indicate +% how a name should be indexed. Here are some examples; +% \begin{verbatim} +% \author{Andrew \surname{Lloyd Weber}} +% \author{\surname{Mao} Tse-Tung}\end{verbatim} +% +% \subsection{The abstract} +% An abstract for a paper is specified by using the \env{abstract} +% environment: +% \begin{verbatim} +% \begin{abstract} +% Text of abstract +% \end{abstract}\end{verbatim} +% Note that with this package, the abstract must be specified before the +% \cmd\maketitle\ command, and there is no need to embed it in an explicit +% minipage environment. +% +% \subsection{PACS codes} +% Some authors are asked to supply suggested PACS codes with their +% submissions. The \cmd\pacs\ macro is provided as a way to do this: +% \begin{verbatim}\pacs{23.23.+x, 56.65.Dy}\end{verbatim} +% The actual display of the PACS numbers below the abstract is +% controlled by two class options: \classoption{showpacs} and +% \classoption{noshowpacs}. In particular, this is now independent of +% the \classoption{preprint} option. \classoption{showpacs} must be +% explicitly included in the class options to display the PACS codes. +% +% \subsection{Keywords} +% A \cmd\keywords\ macro may also be used to indicate keywords for the +% article. +% \begin{verbatim}\keywords{nuclear form; yrast level}\end{verbatim} +% This will be displayed below the abstract and PACS (if supplied). Like +% PACS codes, the actual display of the the keywords is controlled by +% two classoptions: \classoption{showkeys} and +% \classoption{noshowkeys}. An explicit \classoption{showkeys} must be +% included in the \cmd\documentclass\ line to display the keywords. +% +% \subsection{Institutional report numbers} +% Institutional report numbers can be specified using the \cmd\preprint\ +% macro. These will be displayed in the upper lefthand corner of the +% first page. Multiple \cmd\preprint\ macros may be supplied (space is +% limited though, so only three or less may actually fit). +% +% \subsection{maketitle} +% After specifying the title, authors, affiliations, abstract, PACS +% codes, and report numbers, the final step for formatting the front +% matter of the manuscript is to issue the \cmd\maketitle\ command: +% \begin{verbatim}\maketitle\end{verbatim} +% This command must follow all of the macros listed above. +% The macro will format the front matter in accordance with the various +% class options that were specified in the +% \cmd\documentclass\ line (either implicitly through defaults or +% explicitly). +% +% +% \section{Compatability with \LaTeX's Required Packages} +% Certain packages, usually ones written by members of the +% \LaTeX\ Project itself, have been designated ``required'' and +% are distributed as part of standard \LaTeX. +% These packages have been placed in a priviledged position +% vis \'a vis the \LaTeX\ kernel in that they override the definitions of certain kernel macros. +% +% The \classname{ltxfront} package will be incompatible with any package that +% redefines any of the kernel macros that \classname{ltxfront} patches---if that +% package is loaded \emph{after} \classname{ltxfront}. +% +% Hereinafter follows some notes on specific \LaTeX\ packages. +% +%\StopEventually{} +% +% \section{Implementation of package} +% +% \subsection{Beginning of the \file{package} {\sc docstrip} module} +% \begin{macrocode} +%<*package> +\def\package@name{ltxfront}% +\expandafter\PackageInfo\expandafter{\package@name}{% + Title page macros for \protect\LaTeXe, + by A. Ogawa (arthur_ogawa at sbcglobal.net)% +}% +% \end{macrocode} +% +% \subsection{Prerequisites}% +% +% This package requires the use of the \classname{ltxutil} package. +% \begin{macrocode} +\let\class@name\package@name +\RequirePackage{ltxutil}% +%</package> +% \end{macrocode} +% End of the preliminary portion of the package code. +% \begin{macrocode} +% \end{macrocode} +% +% \subsection{Options}% +% Package options are treated in this portion of the dtx file. +% This portion is guarded by the \texttt{options} \classname{docstrip} code so that it can be +% merged into a larger package gracefully. +% \begin{macrocode} +%<*options> +% \end{macrocode} +% +% Package option turns on diagnostics that trace its operation. +% \cmd\frontmatterverbose@sw\ is set false by default: we do not elect to monitor +% the workings of these procedures. +% \begin{macrocode} +\DeclareOption{frontmatterverbose}{\@booleantrue\frontmatterverbose@sw}% +\@booleanfalse\frontmatterverbose@sw +% \end{macrocode} +% +% Package option inactivates its syntax, for testing purposes. +% \begin{macrocode} +\DeclareOption{inactive}{\@booleanfalse\frontmatter@syntax@sw}% +\@booleantrue\frontmatter@syntax@sw +% \end{macrocode} +% +% \begin{macro}{\runinaddress@sw} +% The flag \cmd\runinaddress@sw\ signifies that author addresses are to be set on the same +% line with the author. +% +% The \classoption{runinaddress} option is the only one that sets \cmd\runinaddress@sw\ to true. +% +% FIXME: this option pertains to cases where \cmd\groupauthors@sw\ is true, but is independant of \cmd\@affils@sw. +% So, it should be possible to assert both \classoption{runinaddress} and \classoption{unsortedaddress} as well as +% each separately. +% \begin{macrocode} +\@booleanfalse\runinaddress@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@affils@sw} +% If \cmd\@affils@sw\ is false, an address is never recognised as ``new'' +% and is therefore always entered into the affiliation list, +% stopping groups of authors at the same address being consolidated +% into the same list: +% the address will be printed the same number of times it is entered. +% +% The \classoption{unsortedaddress} option is the only one that sets \cmd\@affils@sw\ to false. +% \begin{macrocode} +\@booleantrue\@affils@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\groupauthors@sw} +% The flag \cmd\groupauthors@sw\ signifies that authors are to be grouped, +% affecting the meaning of \cmd\@author@present. +% +% Clients will want to set \cmd\groupauthors@sw\ true if they want grouped addresses +% or either of the following variants: +% for unsorted addresses: set \cmd\@affils@sw\ false; +% for run-in addresses, set \cmd\runinaddress@sw\ true. +% \begin{macrocode} +\@booleanfalse\groupauthors@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{groupedaddress} +% If we take the \classoption{groupedaddress} option as the default, then we can look upon +% the \classoption{superscriptaddress} option as simply turning \cmd\groupauthors@sw\ to \cmd\false@sw. +% +% \classoption{groupedaddress}, the default in APS journals, groups authors above a common address. +% \begin{macrocode} +\DeclareOption{groupedaddress}{\clo@groupedaddress}% +\def\clo@groupedaddress{% + \@booleantrue\groupauthors@sw + \@booleantrue\@affils@sw + \@booleanfalse\runinaddress@sw +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{unsortedaddress} +% \classoption{unsortedaddress} is similar to \classoption{groupedaddress}, +% but turns off \cmd\@affils@sw, +% with the result that each address that is entered will be printed. +% \begin{macrocode} +\DeclareOption{unsortedaddress}{\clo@unsortedaddress}% +\def\clo@unsortedaddress{% + \@booleantrue\groupauthors@sw + \@booleanfalse\@affils@sw + \@booleanfalse\runinaddress@sw +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{runinaddress} +% +% \classoption{runinaddress} is similar to \classoption{groupedaddress}, +% with the addition of the Boolean \cmd\runinaddress@sw, +% which causes the authors associated with a particular address group +% to be formatted in a paragraph instead of on separate lines. +% \begin{macrocode} +\DeclareOption{runinaddress}{\clo@runinaddress}% +\def\clo@runinaddress{% + \@booleantrue\groupauthors@sw + \@booleantrue\@affils@sw + \@booleantrue\runinaddress@sw +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{superscriptaddress} +% \classoption{superscriptaddress} presents author affiliations +% as superscripts. Authors with like affiliations share the same +% superscript. +% +% FIXME: if \cmd\groupauthors@sw\ is false, would not \cmd\@affils@sw\ be a don't care? +% \begin{macrocode} +\DeclareOption{superscriptaddress}{\clo@superscriptaddress}% +\def\clo@superscriptaddress{% + \@booleanfalse\groupauthors@sw + \@booleantrue\@affils@sw + \@booleanfalse\runinaddress@sw +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</options> +% \end{macrocode} +% +% \subsection{Process package options}% +% \begin{macrocode} +%<*package> +\DeclareOption*{\OptionNotUsed}% +\ProcessOptions* +%</package> +% \end{macrocode} +% +% \section{Kernel of Front Matter} +% Here begins the kernel of the \classname{frontmatter} package. +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% This package implements a new syntax for the title page of an article. +% +% Special acknowledgment: this package uses concepts pioneered +% and first realized by William Baxter (mailto:web at superscript.com) +% in his SuperScript line of commercial typesetting tools, and +% which are used here with his permission. +% +% These macros were first coded by David P. Carlisle for the American Physical +% society in the late 1990s as part of the development of REV\TeX4. +% That development work was taken over by Arthur Ogawa, who is the author of +% this package. +% +% \subsection{Initialization}% +% +% \begin{macro}{\frontmatter@init} +% The \cmd\frontmatter@init\ procedure sets up all the registers for +% processing the title page. +% At present, this is done once, at \cmd\class@documenthook\ time. +% If multiple title pages are to be processed within a job, +% the initialization must be done for each. +% \begin{macrocode} +\appdef\class@documenthook{\frontmatter@init}% +\let\frontmatter@init\@empty +% \end{macrocode} +% \end{macro} +% +% \subsection{The title command}% +% +% \begin{macro}{\title} +% \begin{macro}{\do@title} +% The author uses \cmd\title\ to specify the title. As in the AMS +% classes, \cmd\title\ has an optional argument specifying a short form +% for use in running heads. +% +% Once the \cmd\title\ is given, you can specify any combination of +% \cmd\thanks, \cmd\email, \cmd\homepage, and \cmd\altaffiliation\ commands, +% applying to the title of the document. +% +% Compatibility note: as with all of the standard \LaTeX\ commands that we override, +% we make here a private definition and later switch it in if so required. +% \changes{4.1b}{2008/08/02}{Make the syntax of this package switch optional}% +% \begin{macrocode} +\newcommand\frontmatter@title[2][]{% + \def\@title{#2}% + \def\@shorttitle{#1}% + \let\@AF@join\@title@join +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@title} +% \begin{macro}{\@shorttitle} +% The arguments to \cmd\title\ are saved in these internal +% macros, which are set up to produce a warning if \cmd\title\ has not +% been used before \cmd\maketitle. +% \changes{4.1b}{2008/08/02}{Use \cs{frontmatter@init} as the vehicle for all initialization} +% +% Extensibility note: by using \cmd\frontmatter@init\ as the initialization procedure, +% we open the possibility of more than one title page per document. +% \begin{macrocode} +\appdef\frontmatter@init{% + \def\@title{\class@warn{No title}}% + \let\@shorttitle\@empty + \let\@title@aux\@title@aux@cleared +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@title@join} +% \begin{macro}{\@title@join@} +% \begin{macro}{\@title@aux@cleared} +% +% \begin{macrocode} +\def\@title@join{\expandafter\@title@join@\@title@aux}% +\def\@title@join@#1#2{% + \def\@title@aux{{\@join{\@separator}{#1}{#2}}}% +}% +\def\@title@aux@cleared{{}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{The author, affiliation, and related commands}% +% +% \begin{macro}{\c@affil} +% \begin{macro}{\c@collab} +% \changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +% +% \cmd\c@affil\ stores the affiliation numbers used for the superscript marks. +% The \cmd\newcounter\ command defines \cmd\theaffil, which we never use: +% this counter is evaluated solely via \cmd\the. +% +% \cmd\c@collab\ stores the collaboration numbers. +% The \cmd\newcounter\ command defines \cmd\thecollab. +% As with \cmd\c@affil, we never use \cmd\thecollab; only \cmd\the\ \cmd\c@collab. +% +% Each counter must be cleared before frontmatter can be processed. +% \begin{macrocode} +\newcounter{affil}% +\newcounter{collab}% +\appdef\frontmatter@init{% + \c@affil\z@ + \c@collab\z@ +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Commands for author or collaboration}% +% +% \begin{macro}{\author} +% Each author is given in a \emph{separate} \cmd\author\ command. +% This is similar to the AMS classes, but the AMS also try to support +% the \classname{article} class's \cmd\and\ command for putting multiple +% authors in one \cmd\author\ command. +% This package, however, does not support the \cmd\and\ command. +% +% When the \cmd\author\ command is encountered, +% the previous author, author group, affiliation, and affiliation group are at an end. +% This procedure moves the previous author to the author group (\cmd\move@AU), +% moves the previous affiliation to the affiliation group (\cmd\move@AF), +% and terminates the previous author/affiliation group (\cmd\move@AUAF) as the case may require. +% +% Compatibility note: as with all of the standard \LaTeX\ commands that we override, +% we make here a private definition and later switch it in if so required. +% \changes{4.1b}{2008/08/02}{Make the syntax of this package switch optional}% +% \begin{macrocode} +\newcommand\frontmatter@author{% implicit #1 + \@author@def{}% implicit #2 +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\collaboration} +% Specify the collaboration (given after a group of authors). +% +% This procedure does exactly what \cmd\author\ does, and sets +% a flag signifying that the \cmd\collaboration\ command was given. +% +% Note: earlier versions attempted to ignore the collaboration command if it was considered inappropriate. +% We must not do this, however, because it throws the state machine out of kilter. +% \changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +% \begin{macrocode} +\def\collaboration{% implicit #1 + \@author@def{\@booleantrue\collaboration@sw}% implicit #2 +}% +\appdef\frontmatter@init{% + \@booleanfalse\collaboration@sw +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@author@init} +% \begin{macro}{\@author@cleared} +% \begin{macro}{\@authorclear@sw} +% \begin{macro}{\@author@def} +% \begin{macro}{\@author@join@} +% \begin{macro}{\@author@join} +% \changes{4.0b}{1999/06/20}{Change handling of \cs{@author} to prevent parsing problems. (Helps in error recovery when syntax errors exist)} +% \changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +% \changes{4.1b}{2008/08/02}{Use \cs{frontmatter@init} as the vehicle for all initialization} +% +% Here are all the access procedures for the author data structure. +% +% We define a flag value for \cmd\@author (private), +% a procedure \cmd\@author@gobble\ to read author data without any effect, +% a procedure for setting \cmd\@author\ to the flag value (\cmd\@author@init), +% a Boolean to test against the flag value (\cmd\@authorclear@sw), +% and a procedure to add new ancillary data to the author. +% +% Note that expanding the functionality of the \cmd\collaboration\ command entailed changing +% the data structures, because now all authors must remember the collaboration they belong to. +% This change affects procedures \cmd\@author@cleared\ and \cmd\@author@gobble. +% \begin{macrocode} +\def\@author@cleared{{}{}{}}% +\def\@author@gobble#1#2#3{}% +\def\@author@init{% + \let\@author\@author@cleared + \@booleanfalse\collaboration@sw +}% +\def\@authorclear@sw{\@ifx{\@author\@author@cleared}}% +\appdef\frontmatter@init{% + \@author@init +}% +% \end{macrocode} +% \changes{4.1i}{2009/10/18}{(AO, 540) More runtime diagnostics via \cs{frontmatterverbose@sw}} +% \begin{macrocode} +\def\@author@def#1#2{% + \frontmatterverbose@sw{\typeout{\string\author\space\string\collaboration}}{}% + \move@AU\move@AF\move@AUAF + \let\@AF@join\@author@join + #1% + \def\@author{{#2}{}}% +}% +\def\@author@join@#1#2#3{% + \def\@author{{#1}{\@join{\@separator}{#2}{#3}}}% +}% +\def\@author@join{\expandafter\@author@join@\@author}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\move@AU} +% \begin{macro}{\add@AUCO@grp} +% \changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +% The \cmd\move@AU\ procedure moves the most recent author to the current author group \cmd\AU@grp, +% or the most recent collaboration to the collaboration group \cmd\CO@grp. +% If we recently did a \cmd\@author@init, this is a no-op. +% +% To accommodate the expanded syntax of \cmd\collaboration, we add a new field to +% those associated with an author (collaborator), namely the value of the +% collaboration counter. +% \begin{macrocode} +\def\move@AU{% + \@authorclear@sw{}{% + \collaboration@sw{% + \advance\c@collab\@ne + \@argswap{\CO@grp\CO@opr}% + }{% + \@argswap{\AU@grp\AU@opr}% + }% + {% + \expandafter\@argswap@val + \expandafter{\@author}% + {\expandafter\@argswap@val\expandafter{\the\c@collab}{\add@AUCO@grp}}% + }% + }% + \@author@init +}% +% \end{macrocode} +% \changes{4.1b}{2008/08/02}{Provide for diagnostics via \cs{frontmatterverbose@sw}} +% The procedure \cmd\add@AUCO@grp\ adds to the specified group \#3 using the +% given intercollated operator \#4, with arguments \{\#1\} and \#2, +% where the first argument is the collaboration number, +% the second is the author name, and the third the joined attributes of the author. +% For example, \cmd\move@AU\ could finally execute: +% \cmd\appdef\ \cmd\AU@grp\ \{\cmd\AU@opr\{1\}\{A. Author\}\{\}\}. +% \begin{macrocode} +\def\add@AUCO@grp#1#2#3#4{% + \appdef#3{#4{#1}#2}% + \frontmatterverbose@sw{\say#3}{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@author@finish} +% We define a procedure to terminate author/affiliation parsing just before the title block is formatted. +% We detect the case where an author group is not followed by an affiliation group. +% \changes{4.0f}{2001/02/13}{Actually append \cs{AU@grp} to \cs{@AAClist}.} +% \changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +% \changes{4.1b}{2008/08/02}{Use \cs{@affil@def} for all access to \cs{@affil}} +% \changes{4.1b}{2008/08/02}{Provide for diagnostics via \cs{frontmatterverbose@sw}} +% \changes{4.1g}{2009/10/05}{(AO, 535) Robustify \cs{footnote} while \cs{class@warn} is expanding its argument} +% \changes{4.1i}{2009/10/18}{(AO, 540) More runtime diagnostics via \cs{frontmatterverbose@sw}} +% \changes{4.1m}{2009/11/20}{(AO, 563) \cs{collaboration} to work with both \texttt{groupedaddress} and \texttt{superscriptaddress}} +% \changes{4.1n}{2009/11/30}{(AO, 567) Handle \cs{noaffiliation} case} +% +% We first finish off any author- or affiliation groups in progress. +% Next, we detect the case where there is an author group or a collaboration group in progress, but no affiliation group. +% If so, we emit a diagnositic message and act as if a \cmd\noaffiliation\ command had been given. +% In any case, we finish off any author/affiliation pair that may remain. +% Formatting of the title block may now proceed. +% \begin{macrocode} +\def\@author@finish{% + \frontmatterverbose@sw{\typeout{\string\@author@finish}}{}% + \move@AU\move@AF + \@ifx{\AU@grp\@empty}{% + \@ifx{\CO@grp\@empty}% + }{% + \false@sw + }% + {}{% + \@ifx{\AF@grp\@empty}{% + \begingroup + \let\href\@secondoftwo + \let\AU@opr\@secondofthree + \let\CO@opr\@secondofthree + \let\footnote\@gobble + \@ifx{\CO@grp\@empty}{% + \class@warn{Assuming \string\noaffiliation\space for authors}% + \frontmatterverbose@sw{\say\AU@grp}% + }{% + \class@warn{Assuming \string\noaffiliation\space for collaboration}% + \frontmatterverbose@sw{\say\CO@grp}{}% + }% + \endgroup + \@affil@none\move@AF + }{}% + }% + \move@AUAF +}% +\def\@secondofthree#1#2#3{#2}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@join} +% The procedure \cmd\@join\ inserts +% a separator between two tokens, or, if the first token is +% nil, elides both that token and the separator. +% \begin{macrocode} +\def\@join#1#2#3{% + \@if@empty{#2}{#3}{#2#1#3}% +}% +\def\@separator{;\space}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\surname} +% \begin{macro}{\firstname} +% No-op to allow better post-processing of the file. +% \begin{macrocode} +\let\surname\@firstofone +\let\firstname\@firstofone +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\and} +% The original \LaTeX\ idea of using one \cmd\author\ command to capture +% all authors and their address just doesn't work with multiple authors +% possibly sharing addresses, so in this class disable \cmd\and. +% \begin{macrocode} +\newcommand\frontmatter@and{\class@err{\protect\and\space is not supported}} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Commands for affiliation}% +% +% \begin{macro}{\affiliation} +% \changes{4.1b}{2008/08/02}{Use \cs{@affil@def} for all access to \cs{@affil}} +% After each group of authors with the same address, +% give that address in \cmd\affiliation. +% If later in the list you have an author +% with the address of an earlier author, repeat the \cmd\affiliation\ +% command: the system will detect the equivalence and (if using the \classoption{superscriptaddress} option) +% only print the affiliation once, reusing the superscript marker. +% +% When the \cmd\affiliation\ command is encountered, the current author and author group (if any) are at an end. +% Also, the current affiliation is at an end. +% +% \changes{4.1i}{2009/10/18}{(AO, 540) More runtime diagnostics via \cs{frontmatterverbose@sw}} +% FIXME: changes to catcode required elsewhere now? +% \begin{macrocode} +\def\cat@comma@active{\catcode`\,\active}% +{\cat@comma@active\gdef,{\active@comma}}% +\def\active@comma{,\penalty-300\relax}% +\newcommand\affiliation{% + \frontmatterverbose@sw{\typeout{\string\affiliation}}{}% + \move@AU\move@AF + \begingroup + \cat@comma@active + \@affiliation +}% +\def\@affiliation#1{% + \endgroup + \let\@AF@join\@affil@join + \@affil@def{#1}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\noaffiliation} +% \changes{4.1b}{2008/08/02}{Use \cs{@affil@def} for all access to \cs{@affil}} +% \changes{4.1i}{2009/10/18}{(AO, 540) More runtime diagnostics via \cs{frontmatterverbose@sw}} +% \changes{4.1n}{2009/11/30}{(AO, 567) Handle \cs{noaffiliation} case} +% User-level command \cmd\noaffiliation\ signifies that the current group of authors, or the current collaboration, has \emph{no} affiliation. +% +% This is implemented by acting as if the \cmd\affiliation\ command has been given, and using a +% flag value of \{\cmd\relax\}, which adds an element to the affiliation group of this author, +% albeit a nil one (\cmd\AFF@opr\ \{\cmd\relax\} \{\}). +% +% Note that this procedure does substantially the same as \cmd\@author@finish. (the latter, If it does not bail out altogether, differs chiefly in providing diagnostics). +% \begin{macrocode} +\newcommand\frontmatter@noaffiliation{% + \frontmatterverbose@sw{\typeout{\string\noaffiliation}}{}% + \move@AU\move@AF +% \end{macrocode} +% In \cmd\@author@finish, there is code testing if an effective +% \cmd\noaffiliation\ should be executed now. Here, we do so in any case. +% \begin{macrocode} + \@affil@none\move@AF + \move@AUAF +}% +\def\blankaffiliation{{}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@affil@cleared} +% \begin{macro}{\@affil@nil} +% \begin{macro}{\@affil@init} +% \begin{macro}{\@affil@none} +% \begin{macro}{\@affilclear@sw} +% \begin{macro}{\@affil@def} +% \begin{macro}{\@affil@join@} +% \begin{macro}{\@affil@join} +% \changes{4.1b}{2008/08/02}{Use \cs{@affil@def} for all access to \cs{@affil}} +% \changes{4.1n}{2009/11/30}{(AO, 567) Handle \cs{noaffiliation} case} +% +% Here are all the access procedures for the affiliation data structure. +% Note the similarity to those of the \cmd\@author\ data structure. +% +% We define a flag value for \cmd\@affil\ (private), +% a procedure for setting \cmd\@affil\ to the flag value (\cmd\@affil@init), +% a Boolean to test against the flag value (\cmd\@affilclear@sw), +% a procedure \cmd\@affil@def\ to load a value into the structure, +% and a procedure to add new ancillary data to the affiliation. +% \begin{macrocode} +\def\@affil@cleared{{{}}{}}% +\def\@affil@nil{{\relax}{}}% +\appdef\frontmatter@init{% + \@affil@init +}% +\def\@affil@none{% + \let\@affil\@affil@nil +}% +\def\@affil@init{% + \let\@affil\@affil@cleared +}% +\def\@affilclear@sw{\@ifx{\@affil\@affil@cleared}}% +\def\@affil@def#1{% + \def\@affil{{#1}{}}% +}% +\def\@affil@join@#1#2#3{% + \def\@affil{{#1}{\@join{\@separator}{#2}{#3}}}% +}% +\def\@affil@join{\expandafter\@affil@join@\@affil}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\move@AF} +% \changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +% \changes{4.1i}{2009/10/23}{(AO, 540) Rationalize code that appends to \cs{AF@grp}} +% \changes{4.1n}{2009/11/30}{(AO, 567) Handle \cs{noaffiliation} case} +% Move the most recent affiliation to the affiliation group. +% If we recently did a \cmd\@affil@init, this is a no-op. +% +% Set the \cmd\temp@sw\ to false, then execute the affiliation list (\cmd\@AFF@list) +% with the intercollated operator set to \cmd\@affil@match\ +% and with \cmd\@tempa\ holding the first component of \cmd\@affil, the current affiliation, which is to be matched. +% +% If the current affiliation has been seen before, then by side effect +% \cmd\temp@sw\ will be set to true, +% \cmd\@tempc\ will be set to the matching affiliation number, +% and \cmd\@tempd\ will be set to the affiliation's ancillary data. +% The Boolean \cmd\@affils@sw\ being false prevents this test from ever returning a ``true'' result. +% +% This procedure uses \cmd\@tempa\ and sets \cmd\@tempc, \cmd\@tempd, and \cmd\temp@sw. +% \begin{macrocode} +\def\move@AF{% + \@affilclear@sw{}{% + \@booleanfalse\temp@sw + \let\@tempd\@empty + \@affils@sw{% + \expandafter\@affil@addr@def\expandafter\@tempa\@affil + \def\AFF@opr{\@affil@match\@tempa}% + \@AFF@list + }{}\temp@sw +% \end{macrocode} +% True clause: This affiliation has been seen before. +% If ancillary data for the affiliation have been given, but are not identical to those seen before, give a warning. +% \begin{macrocode} + {% + \expandafter\@affil@aux@def\expandafter\@tempb\@affil + \@ifx{\@tempb\@empty}{}{% + \@ifx{\@tempb\@tempd}{}{% + \class@warn{% + Ancillary information for \@tempa\space must not be different! + Please put all of it on the first instance% + }% + }% + }% + }% +% \end{macrocode} +% False clause: This affiliation is a new one: +% increment the affiliation counter to get a unique affiliation ID +% and append the new ID, collaboration number, address, and auxiliary information +% to the list \cmd\@AFF@list. +% +% Note that, with the expanded syntax of \cmd\collaboration, we need to label each address with +% its associated collaboration. +% +% Note also that the \cmd\noaffiliation\ case is handled by recognizing the flag value \cmd\@affil@nil. +% \begin{macrocode} + {% + \@ifx{\@affil\@affil@nil}{% + \def\@tempc{0}% + \@argswap@val{0}% + }{% + \advance\c@affil\@ne + \expandafter\def\expandafter\@tempc\expandafter{\the\c@affil}% + \expandafter\@argswap@val\expandafter{\the\c@affil}% + }% + {% + \expandafter\@argswap@val\expandafter{\the\c@collab}{% + \expandafter\@argswap@val\expandafter{\@affil}{% + \add@list@val@val@val\@AFF@list\AFF@opr + }% + }% + }% + }% +% \end{macrocode} +% In either case, append this affiliation number to the \cmd\AF@grp, the affiliation group of the current author group. +% (It will later be considered for the \cmd\@AFG@list.) +% Then assign the flag value to \cmd\@affil\ that signifies it has been cleared. +% \changes{4.1i}{2009/10/18}{(AO, 540) Rationalize code that appends to \cs{AF@grp}} +% \begin{macrocode} + \appdef@eval\AF@grp\@tempc + \frontmatterverbose@sw{\say\AF@grp}{}% + \@affil@init + }% +}% +\def\@affil@addr@def#1#2#3{% + \def#1{#2}% +}% +\def\@affil@aux@def#1#2#3{% + \def#1{#3}% +}% +% \end{macrocode} +% \changes{4.1b}{2008/08/02}{Provide for diagnostics via \cs{frontmatterverbose@sw}} +% Procedure \cmd\add@list@val@val@val\ appends to the given list \#1 using the given intercollated operator \#2, +% with arguments \#5 (affiliation ID) and \#4 (collaboration ID) delimited by braces, and \#3 bare. +% In the end, \cmd\move@AF\ may execute something like +% \cmd\appdef\ \cmd\@AFF@list\ \cmd\AFF@opr\ \{1\} \{3\} \{My Institution\} \{thanks\}. +% \begin{macrocode} +\def\add@list@val@val@val#1#2#3#4#5{% + \appdef#1{#2{#5}{#4}#3}% + \frontmatterverbose@sw{\say#1}{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@affil@match} +% \changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +% The procedure \cmd\@affil@match\ is the definition for \cmd\AFF@opr, +% the intercollated operator for \cmd\@AFF@list, +% when adding a new affiliation: it seeks a match with any earlier affiliation. +% When the affiliation list is executed, this procedure tests each entry against +% the `new' affiliation (which has been stored in \cmd\@tempa) and its associated +% collaboration number (in \cmd\@tempb). +% +% If \cmd\groupauthors@sw\ is true, then we require the collaboration ID to match, +% otherwise there is no such requirement, +% as is appropriate for the \classoption{superscriptaddress} class option. +% +% Uses \cmd\temp@sw, \cmd\@tempc, and \cmd\@tempd\ to communicate back: +% if it returns \cmd\temp@sw\ true, a match was found. +% Then +% \cmd\@tempc\ will be the affiliation ID of the matching entry +% and \cmd\@tempd\ will be the auxiliary information of the matching entry. +% \begin{macrocode} +\def\@affil@match#1#2#3#4#5{% + \temp@sw{}{% + \def\@tempifx{#4}% + \@ifx{\@tempifx#1}{% + \groupauthors@sw{% + \@ifnum{#3=\c@collab}{% + \true@sw + }{% + \false@sw + }% + }{% + \true@sw + }% + }{% + \false@sw + }% + {% + \@booleantrue\temp@sw + \def\@tempc{#2}% + \def\@tempd{#5}% + }{% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\move@AUAF} +% \changes{4.0h}{1998/06/25}{Changes to support groups of affiliations} +% \changes{4.1b}{2008/08/02}{(AO, 486) \cs{collaboration} to work with \texttt{groupedaddress}} +% \changes{4.1b}{2008/08/02}{Change csname \cs{AFS@opr} to \cs{AFG@opr}} +% \changes{4.1b}{2008/08/02}{Provide for diagnostics via \cs{frontmatterverbose@sw}} +% Append \cmd\AF@grp, \cmd\AU@grp, and \cmd\CO@grp\ to \cmd\@AAC@list, +% append \cmd\CO@grp\ to \cmd\@AFG@list, +% and merge any new \cmd\AF@grp\ to \cmd\@AFG@list. +% +% The entire procedure is predicated on something non-trivial to move. +% +% If both author group \cmd\AU@grp\ and affiliation group \cmd\AF@grp\ are nil, bail out. +% +% No, try that again: +% +% If we have seen any affiliations (\cmd\AF@grp\ is not nil), +% then it is time to move the current affiliation group and author group to \cmd\@AAC@list. +% If not, we are picking up authors into an author group, and we should bail out. +% +% To extend this scheme to the new \cmd\collaboration\ abilities, we must append an affiliation \cmd\AF@opr\ to \cmd\@AAC@list\ +% also in the case where there was no affiliation specified (e.g., \cmd\noaffiliation). This affiliation will be a nil affiliation: +% \cmd\AF@opr\verb+{{0}}+. +% +%FIXME: only one of \cmd\CO@grp\ or \cmd\AU@grp\ is non-empty at this point, +% but this code does not appear to recognize this fact! +% \changes{4.1i}{2009/10/18}{(AO, 540) More runtime diagnostics via \cs{frontmatterverbose@sw}} +% \begin{macrocode} +\def\move@AUAF{% + \frontmatterverbose@sw{\say\AU@grp\say\AF@grp\say\CO@grp}{}% + \@ifx{\AF@grp\@empty}{% + \@ifx{\@empty\CO@grp}{% +% \end{macrocode} +% Both \cmd\AF@grp\ and \cmd\CO@grp\ are empty: nothing to do. But what if \cmd\AU@grp\ is not empty? +% \begin{macrocode} + }{% +% \end{macrocode} +% Append the nil \cmd\AF@opr\ to \cmd\@AAC@list. +% \begin{macrocode} + \appdef \@AAC@list{\AF@opr{{0}}}% +% \end{macrocode} +% Append the collaboration group to the \cmd\@AAC@list; no intercollated operator need be added, +% because we already have \cmd\CO@opr. +% \begin{macrocode} + \appdef@e \@AAC@list{\CO@grp}% + \appdef@e \@AFG@list{\CO@grp}% + \let\CO@grp\@empty + }% + }{% +% \end{macrocode} +% Append current affiliation group (expansion of \cmd\AF@grp) +% to the author/affiliation list (\cmd\@AAC@list), +% using \cmd\AF@opr\ as the intercollated operator; +% also append the current authors (\cmd\AU@grp). +% \begin{macrocode} + \appdef \@AAC@list{\AF@opr}% + \appdef@eval\@AAC@list{\AF@grp}% + \appdef@e \@AAC@list{\AU@grp}% +% \end{macrocode} +% Determine if either \cmd\AU@grp\ or \cmd\CO@grp\ is non-empty. +% \begin{macrocode} + \@ifx{\@empty\AU@grp}{% + \@ifx{\@empty\CO@grp}% + }{% + \false@sw + }% +% \end{macrocode} +% At this point, there is a Boolean in \TeX's scanner; +% it will parse the following two brace-delimited sequences and select one of them. +% \begin{macrocode} + {% +% \end{macrocode} +% This branch is executed if and only if both \cmd\AU@grp\ and \cmd\CO@grp\ are empty. +% \begin{macrocode} + }{% +% \end{macrocode} +% There was either a \cmd\author\ or a \cmd\collaboration\ command. +% Append the current affiliation group to \cmd\@AFG@list, +% (only if it is not already there) +% using \cmd\AFG@opr\ as the intercollated operator. +% +% Note that \cmd\@AFG@list\ is a list of \emph{unique} affiliation \emph{groups}, +% and building it entails an \(N^2\) computation. +% \begin{macrocode} + \@booleanfalse\temp@sw + \def\AFG@opr{\x@match\AF@grp}% + \let\CO@opr\@author@gobble + \@AFG@list + \temp@sw{}{% + \appdef \@AFG@list{\AFG@opr}% + \appdef@eval\@AFG@list{\AF@grp}% + }% +% \end{macrocode} +% If the collaboration \cmd\CO@grp\ is not empty, we append it to the \cmd\@AFG@list\ and to the \cmd\@AAC@list. +% \changes{4.1m}{2009/11/20}{(AO, 563) \cs{collaboration} to work with both \texttt{groupedaddress} and \texttt{superscriptaddress}} +% \begin{macrocode} + \@ifx{\@empty\CO@grp}{}{% + \appdef@e \@AAC@list{\CO@grp}% + \appdef@e \@AFG@list{\CO@grp}% + \let\CO@grp\@empty + }% + }% +% \end{macrocode} +% Finally, null out the macros holding the author group \cmd\AU@grp, affiliation group \cmd\AF@grp, and collaboration group \cmd\CO@grp. +% \begin{macrocode} + \let\CO@grp\@empty + \let\AU@grp\@empty + \let\AF@grp\@empty + }% + \frontmatterverbose@sw{\say\@AAC@list\say\@AFG@list}{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AU@grp} +% \begin{macro}{\AF@grp} +% \begin{macro}{\@AAC@list} +% \begin{macro}{\@AFG@list} +% \begin{macro}{\@AFF@list} +% +% The control sequence name \cmd\AU@grp\ accumulates +% consecutive \cmd\author\ entries (with \cmd\AU@opr\ as the intercollated operator) +% and \cmd\collaboration\ entries (with \cmd\CO@opr\ as the intercollated operator). +% Ultimately, its contents are appended to the author/affiliation list \cmd\@AAC@list\ +% and to the list of affiliation groups, \cmd\@AFG@list. +% It must be initialized to \cmd\@empty. +% +% Note on \cmd\AU@opr\ and \cmd\CO@opr: it is essential to treat these two operators to the greatest extent possible on an equal footing. +% Therefore we invariably assign values to the pair of them within the same procedure. +% +% The macro \cmd\AF@grp\ accumulates affiliation IDs into an affiliation group. +% It must be empty at the beginning of the frontmatter. +% +% The \cmd\@AAC@list\ macro accumulates +% authors (using \cmd\AU@opr\ as the intercollated operator), +% collaborations (using \cmd\CO@opr\ as the intercollated operator), +% and +% affiliations (using \cmd\AF@opr\ as the intercollated operator). +% +% It must be empty at the beginning of the frontmatter. +% +% The macro \cmd\@AFG@list\ accumulates +% affiliation groups, with \cmd\AFG@opr\ as the intercollated operator, +% and collaborations, with no intercollated operator. +% This token list is employed when and only when \classoption{groupedaddress} is in effect. +% +% The macro \cmd\@AFF@list\ accumulates the list of affiliations +% with \cmd\AFF@opr\ as the intercollated operator. +% It must be empty at the beginning of the frontmatter. +% +% Each \cmd\affiliation\ command in the document contributes +% to this list, as long as the argument of that instance of the command +% is ``new''. +% +% Each entry in this list consists of the \cmd\AFF@opr\ intercollated operator +% followed by three brace-delimited tokens, representing, in order: +% \begin{enumerate} +% \item +% the affiliation's unique ID, a number increasing monotonically for +% each new entry, +% \item +% the optional argument of the \cmd\affiliation\ command, +% the footnote to the affiliation, and +% \item +% the text of the affiliation. +% \end{enumerate} +% +% At various junctures in the code, the control sequence name +% \cmd\AFF@opr\ assumes the meaning of +% \cmd\@affil@group, \cmd\affil@script, +% or is defined to expand to \cmd\@affil@match\cmd\@tempa, +% and the list \cmd\@AFF@list\ is expanded. +% +% For each of these lists, here is the syntax of an element and the usage of the associated operator: +% \begin{verbatim} +%\@AFF@list \AFF@opr{<affiliation ID>}{<collaboration ID>}{<address>}{<auxiliary info>} \frontmatter@author@produce@script \affils@present@group +%\@AFG@list \AFG@opr{{<affiliation ID>}..{<affiliation ID>}} \frontmatter@author@produce@group +%\@AAC@list \AF@opr{{<affiliation ID>}..{<affiliation ID>}} (\AU@opr|\CO@opr){<collaboration ID>}{<author>}{<auxilliary info>} \frontmatter@author@produce@script \frontmatter@author@produce@group \affils@present@group +% +%\AFF@opr \@affil@match\@tempa \@affil@script \@affil@group +%\AFG@opr \affils@present@group \x@match\AF@grp +%\AF@opr \@gobble \@affilID@def \@affilID@count\AF@temp\@tempcnta \@affilID@match\AF@temp +%\AU@opr \@secondofthree \@author@count\@tempcnta \@author@present \@author@gobble \@author@count#2 \@author@present +%\CO@opr \@secondofthree \@collaboration@count\AU@temp\@tempcnta \@collaboration@present\AU@temp \@collaboration@present\AU@temp \@collaboration@gobble +% +%\CO@opr\@author@cleared +% \end{verbatim} +% \begin{macrocode} +\appdef\frontmatter@init{% + \let\AU@grp\@empty + \let\CO@grp\@empty + \let\AF@grp\@empty + \let\@AAC@list\@empty + \let\@AFG@list\@empty + \let\@AFF@list\@empty +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@AF@join} +% The \cmd\csname\ \cmd\@AF@join\ is a procedure used within +% \cmd\email, \cmd\homepage, \cmd\thanks, and \cmd\altaffiliation. +% When such a command appears after an \cmd\author, \cmd\collaboration, or \cmd\affiliation +% command, the \cmd\@AF@join\ procedure appends the argument given to the appropriate +% macro. +% Its default is to give an error message, since these commands are legal only within +% the particular context mentioned. +% \begin{macrocode} +\appdef\frontmatter@init{% + \let\@AF@join\@AF@join@error +}% +\def\@AF@join@error#1{% + \class@warn{% + \string\email, \string\homepage, \string\thanks, or \string\altaffiliation\space + appears in wrong context. + }% +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Commands for auxiliary information}% +% +% \begin{macro}{\email} +% Just tacks the email address on to the current author or affiliation. +% \changes{4.1a}{2008-07-01}{(AO, 496) remove default prependation to \cs{email}.} +% \begin{macrocode} +\def\sanitize@url{% + \@makeother\%% + \@makeother\~% + \@makeother\_% +}% +\newcommand*\email[1][]{\begingroup\sanitize@url\@email{#1}}% +\def\@email#1#2{% + \endgroup + \@AF@join{#1\href{mailto:#2}{#2}}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\homepage} +% Just tacks the URL on to the current author or affiliation. +% Note: group opened in \cmd\homepage\ is closed in \cmd\@homepage. +% \changes{4.1a}{2008-07-01}{(AO, 496) remove default prependation to \cs{homepage}.} +% \changes{4.1n}{2009/12/03}{(AO) remove http:// from \cs{href} call} +% \begin{macrocode} +\newcommand*\homepage[1][]{\begingroup\sanitize@url\@homepage{#1}}% +\def\@homepage#1#2{% + \endgroup + \@AF@join{#1\href{#2}{#2}}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\href} +% The document may load a package that defines either of these commands; +% if not, we give a default meaning. +% \begin{macrocode} +\appdef\class@documenthook{% + \providecommand\href[1]{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thanks} +% \changes{4.1b}{2008/08/02}{Make the syntax of this package switch optional}% +% +% The operative version of \cmd\thanks\ appends an item to \cmd\@author, or \cmd\@affil's auxiliary data. +% \begin{macrocode} +\def\frontmatter@thanks{% implicit #1 + \@AF@join +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\altaffiliation} +% \changes{4.0d}{1998/01/31}{change name from \cs{tempaffiliation}} +% \changes{4.0l}{1998/09/01}{add optional argument handling back} +% Implemented more or less like \cmd\thanks\ but shares the affiliation +% counter. +% Optional argument may be used to give explanatory text eg +% `currently staying at' +% This will be placed before the address, if used in a footnote. +% \begin{macrocode} +\newcommand*\altaffiliation[2][]{% + \@AF@join{#1#2}% +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Procedures for author, collaboration, and affiliation}% +% +% Macros that list off, say, authors, and which require punctuation, like ``A, B, and C'', will use +% \cmd\set@listcomma@list, \cmd\set@listcomma@count, \cmd\@listand, and \cmd\@listcomma. +% These macros use the \cmd\@tempcnta\ register to keep track of how many items remain to be listed off. +% +% At present, \cmd\@author@present\ will decrement that counter. +% +% \begin{macro}{\set@listcomma@list} +% \begin{macro}{\set@listcomma@count} +% \changes{4.0l}{1998/09/01}{macro added} +% Pop the author count for this collaboration. +% +% Note: by side effect, it assigns \cmd\@listcomma: +% for a list of length two, suppress comma addition. +% \begin{macrocode} +\def\set@listcomma@list#1{% + \expandafter\@reset@ac\expandafter#1#1{0}\@reset@ac{% + \let\@listcomma\relax + }{% + \let\@listcomma\@listcomma@comma + }% +}% +\def\set@listcomma@count#1{% + \@ifnum{#1=\tw@}{% + \let\@listcomma\relax + }{% + \let\@listcomma\@listcomma@comma + }% +}% +% \end{macrocode} +% Does the actual pop operation, then generates a Boolean which selects one of the two assignments for \cmd\@listcomma. +% +% Note: this procedure sets \cmd\@tempcnta\ to reflect the number of items to list off. +% \begin{macrocode} +\def\@reset@ac#1#2#3\@reset@ac{% + \def#1{#3}% + \@tempcnta#2\relax + \@ifnum{#2=\tw@}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\listand} +% Might need extending with penalties etc. +% +% Note: this procedure expects \cmd\@tempcnta\ to reflect the current number of items remaining to list off. +% \begin{macrocode} +\def\@listand{\@ifnum{\@tempcnta=\tw@}{\andname\space}{}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@listcomma} +% This definition, with \cmd\@ne\ puts a comma before and. +% +% David Carlisle says: In UK English (at least) would have \cmd\tw@\ here, +% which would then implement the convention of indicating conjunction with comma or ``and'', but not both. +% +% Note: this procedure expects \cmd\@tempcnta\ to reflect the current number of items remaining to list off. +% \begin{macrocode} +\def\@listcomma@comma{\@ifnum{\@tempcnta>\@ne}{,}{}}% +\def\@listcomma@comma@UK{\@ifnum{\@tempcnta>\tw@}{,}{}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@collaboration@gobble} +% This command will be the synonym of \cmd\CO@grp\ during the expansion of \cmd\@AAC@list, +% within \cmd\affils@present@group execution (in a \classoption{groupedaddress} situation). +% +% \changes{4.1m}{2009/11/20}{(AO, 563) Let \cs{@collaboration@gobble} parse all three arguments of \cs{CO@opr}} +% \begin{macrocode} +\def\@collaboration@gobble#1#2#3{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doauthor} +% \changes{4.1b}{2008/08/04}{Provide facility \cs{affil@cutoff}: if there is only one affiliation on the title page, no superscript}% +% \changes{4.1n}{2009/11/30}{(AO, 567) Handle punctuation for \classoption{superscriptaddress} style authors' extra information, such as \cs{email}} +% Main control over how authors are typeset. +% +% |#1| is loaded by \cmd\author +% +% |#2| is loaded by \cmd\email, \cmd\homepage, \cmd\altaffiliation, or \cmd\thanks +% +% |#3| is the superscript affiliation, if at all used. +% +% First, the author name is formatted, followed by a comma, +% then come any marks relating to affiliation (if present), +% then come the homepage URL and email address, if any, with +% appropriate punctuation. +% +% Here, as in \cmd\@affil@script, the parameter \cmd\affil@cutoff\ +% controls whether the argument \#3 is produced as a superscript label +% connecting this author with its affiliation. (If there is only one +% affiliation on the title page, it makes sense to remove the superscript.) +% +% Note that argument \#3 must effectively execute either +% \cmd\aftergroup\cmd\true@sw\ or \cmd\aftergroup\cmd\false@sw\ (exactly once!). +% In the case of \classoption{superscriptaddress}, this is done when +% \cmd\@author@present@script\ invokes \cmd\doauthor\ with its third argument containing +% \cmd\@affil@present@script. +% Otherwise (e.g., \classoption{groupedaddress}), \cmd\doauthor\ is invoked by +% \cmd\@author@present@group\ with its third argument containing \cmd\@affil@present@group. +% \begin{macrocode} +\def\doauthor#1#2#3{% + \ignorespaces#1\unskip\@listcomma + \begingroup + #3% +% \end{macrocode} +% At this point, we must have queued up a Boolean (either \cmd\true@sw\ or \cmd\false@sw). +% \begin{macrocode} + \@if@empty{#2}{\endgroup{}{}}{\endgroup{\comma@space}{}\frontmatter@footnote{#2}}% + \space \@listand +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@match} +% Procedure \cmd\x@match\ is used as an alias \cmd\AFG@opr, +% probing the list of affiliation groups +% and setting a Boolean if a match is found to \#1 (usually the current affiliation group). +% +% Procedure \cmd\y@match\ is used as an alias to \cmd\@TBN@opr, +% probing the list of unique title block footnotes for a match to the footnote text: +% when the first match is found it sets a Boolean, +% defining \cmd\@tempb\ to the number of that footnote. +% \begin{macrocode} +\def\x@match#1#2{% + \temp@sw{}{% + \def\@tempifx{#2}% + \@ifx{\@tempifx#1}{% + \@booleantrue\temp@sw + }{% + }% + }% +}% +\def\y@match#1#2#3{% + \temp@sw{}{% + \def\@tempifx{#3}% + \@ifx{\@tempifx#1}{% + \@booleantrue\temp@sw + \def\@tempb{#2}% + }{% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@footnote} +% Used when typesetting a title block footnote. +% (Item 290: merge duplicates.) +% +% Maintains a list of frontmatter footnotes along with associated device. +% Uniquifies each footnote by traversing the list and looking for a match to the footnote text. +% If found, define \cmd\@tempb\ to the corresponding footnote device, and typeset it with \cmd\@footnotemark. +% If never found, manually increment footnote counter, +% determine the corresponding footnote device, and +% add footnote text and device to the list of frontmatter footnotes. +% +% The list \cmd\@FMN@list\ is processed later in the title block production. +% +% Note that this method of making footnotes runs afoul of \classname{hyperref}'s patches of the \LaTeX\ kernel. +% Therefore, we avoid trouble by refraining from using \cmd\@footnotemark\ and by creating our own hypertext links. +% \begin{macrocode} +\def\frontmatter@footnote#1{% + \begingroup + \@booleanfalse\temp@sw + \def\@tempa{#1}% + \let\@tempb\@empty + \def\@TBN@opr{\y@match\@tempa}% + \@FMN@list +% \end{macrocode} +% By side effect, \cmd\@tempb\ holds the value of the footnote counter if +% This note has been seen before. Otherwise \cmd\temp@sw\ is false. +% \begin{macrocode} + \temp@sw{% + \expandafter\frontmatter@footnotemark + \expandafter{\@tempb}% + }{% +% \end{macrocode} +% Execute \cmd\frontmatter@foot@mark, feeding it the value of the current footnote counter. +% This call requires two levels of pre-expansion to accomplish, the first to expand \cmd\csname, the second to evaluate \cmd\the. +% \begin{macrocode} + \stepcounter\@mpfn + \expandafter\expandafter + \expandafter\frontmatter@foot@mark + \expandafter\expandafter + \expandafter{% + \expandafter \the\csname c@\@mpfn\endcsname + }{#1}% + }% + \endgroup +}% +% \end{macrocode} +% Procedure \cmd\frontmatter@foot@mark\ lays down the footnote device (mark) and takes care of the footnote text. +% The latter merely involves queueing that text (along with its associated device) into \cmd\@FMN@list. +% \begin{macrocode} +\def\frontmatter@foot@mark#1#2{% + \frontmatter@footnotemark{#1}% + \g@addto@macro\@FMN@list{\@TBN@opr{#1}{#2}}% +}% +\appdef\frontmatter@init{% + \global\let\@FMN@list\@empty +}% +% \end{macrocode} +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \begin{macrocode} +\def\frontmatter@footnotemark#1{% + \leavevmode + \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi + \begingroup + \hyper@linkstart {link}{frontmatter.#1}% + \csname c@\@mpfn\endcsname#1\relax + \def\@thefnmark{\frontmatter@thefootnote}% + \@makefnmark + \hyper@linkend + \endgroup + \ifhmode\spacefactor\@x@sf\fi + \relax +}% +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{The keywords command}% +% \begin{macro}{\keywords} +% \begin{macro}{\@keywords} +% Usual game, save text in a macro for processing by \cmd\maketitle. +% \begin{macrocode} +\def\keywords#1{% + \aftermaketitle@chk{\keywords}% + \gdef\@keywords{#1}% +}% +\appdef\frontmatter@init{% + \let\@keywords\@empty +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{The \cs{date} command and related commands}% +% \begin{macro}{\date} +% \begin{macro}{\received} +% \begin{macro}{\revised} +% \begin{macro}{\accepted} +% \begin{macro}{\published} +% \begin{macro}{\@date} +% \begin{macro}{\@received} +% \begin{macro}{\@revised} +% \begin{macro}{\@accepted} +% \begin{macro}{\@published} +% \changes{4.1b}{2008/08/02}{Make the syntax of this package switch optional}% +% Use the \cmd\date\ command to specify the document date, +% the \cmd\received\ command to specify the date received, +% \cmd\revised\ for date revised, +% \cmd\accepted\ for date accepted, and +% \cmd\published\ for date published. +% Normally only \cmd\date\ to be used by author, +% the remainder used only by editors. +% +% DPC: As for \cmd\keywords, but this time don't flag a warning if there is no +% revision date specified. +% +% In each case the user-level command defines the value of a +% macro which buffers the data entered by the user. +% For instance, \cmd\received\ causes \cmd\@received\ to +% acquire a value. +% The optional argument allows the user to override the +% text that will be typeset along with the date; +% the default value of that text is itself +% a localized macro. +% \begin{macrocode} +\newcommand*\frontmatter@date[2][\Dated@name]{\def\@date{#1#2}}% +\def\@date{}% +\newcommand*\received[2][\Received@name]{\def\@received{#1#2}}% +\def\@received{}% +\newcommand*\revised[2][\Revised@name]{\def\@revised{#1#2}}% +\def\@revised{}% +\newcommand*\accepted[2][\Accepted@name]{\def\@accepted{#1#2}}% +\def\@accepted{}% +\newcommand*\published[2][\Published@name]{\def\@published{#1#2}}% +\def\@published{}% +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{The pacs command}% +% PACS, the Physics and Astronomy Classification Scheme. +% \begin{macro}{\pacs} +% \begin{macro}{\@pacs} +% As for \cmd\keywords\ +% \begin{macrocode} +\def\pacs#1{% + \aftermaketitle@chk{\pacs}% + \gdef\@pacs{#1}% +}% +\appdef\frontmatter@init{% + \let\@pacs\@empty +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{The \cs{preprint} command} +% +% \changes{4.0g}{1998/06/10}{multiple preprint commands} +% \begin{macrocode} +\def\preprint#1{\gappdef\@preprint{\preprint{#1}}}% +\appdef\frontmatter@init{% + \let\@preprint\@empty +}% +% \end{macrocode} +% +% \subsection{The \env{abstract} environment}% +% +% \changes{4.0b}{1999/06/20}{Gathered all code for the abstract environment together and abstracted out the formatting details for journals to override.} +% +% \begin{macro}{\absbox} +% +% \begin{macrocode} +\newbox\absbox +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{abstract} +% Abstract, as in AMS classes, must be specified \emph{before} +% \cmd\maketitle. It just saves everything up in \cmd\absbox. +% \changes{4.0d}{1998/01/31}{If empty \cs{abstractname} omit spacing} +% \changes{4.0d}{1998/01/31}{hookify} +% Note that the specifics of how the abstract is to be +% formatted are set by \cmd\frontmatter@abstractwidth, +% \cmd\frontmatter@abstractheading, and \cmd\frontmatter@abstractfont. +% +% Here we wish to set the abstract into type but save it away in a box, much like +% the \cmd\minipage\ command does. +% +% Note that the \cmd\endabstract\ portion of the environment +% begins with code that mostly duplicates \cmd\endminipage, but without the \cmd\@iiiparbox. +% At the end, we simply transfer the contents of the \cmd\minipage\ +% into a box of our own. +% +% However, we also have to end the gratuitous +% paragraph begun by \cmd\minipage. +% We ensure that no trace of that paragraph is left, +% by absorbing the \cmd\parindent\ box. +% Doing so destroys the paragraph entirely, except +% for the \cmd\parskip\ glue, and that morsel is pruned, because we are at the top +% of a page. +% +% This mechanism is vulnerable, however, because anything placed into the horizontal list +% after the \cmd\parindent\ box will confound it. +% And that is exactly what happens under Mik\TeX: +% There seems to be an extension to the \TeX\ standard operating here which inserts a \cmd\special \ at the beginning of every paragraph. +% (The mechnism is \emph{not} based on \cmd\everypar.) +% +% To accomodate this state of affairs, +% we have a new mechanism that offers an even more complete rewrite of \env{minipage}. +% +% Note that an entry is made in the toc for the abstract; this has the side effect +% of creating a PDF bookmark for this element if the \classname{hyperref} package is in effect. +% \changes{4.1a}{2008-06-30}{(AO, 443) create an entry in the PDF bookmarks for the abstract via the toc} +% \begin{macrocode} +\def\toclevel@abstract{1}% +\def\addcontents@abstract{% + \phantomsection + \expandafter\def\csname Parent0\endcsname{section*.2}% + \expandafter\@argswap@val\expandafter{\abstractname}{\addcontentsline{toc}{abstract}}% +}% +\newenvironment{frontmatter@abstract}{% + \aftermaketitle@chk{\begin{abstract}}% + \global\setbox\absbox\vbox\bgroup + \color@begingroup + \columnwidth\textwidth + \hsize\columnwidth + \@parboxrestore +% \end{macrocode} +% The following line switches footnotes to the \texttt{mpfoootnote} series. +% This action should rather be taken by \cmd\frontmatter@abstractfont, which can be customized. +% There is also an interaction with \cmd\mini@note. +% \begin{macrocode} + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ + \let\@footnotetext\frontmatter@footnotetext + \minipagefootnote@init + \let\set@listindent\set@listindent@ + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \let@environment{description}{frontmatter@description}% + \@minipagerestore + \@setminipage + \frontmatter@abstractheading + \frontmatter@abstractfont + \let\footnote\mini@note + \expandafter\everypar\expandafter{\the\everypar\addcontents@abstract\everypar{}}% +}{% + \par + \unskip + \minipagefootnote@here + \@minipagefalse %% added 24 May 89 + \color@endgroup + \egroup +}% +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\frontmatter@footnotetext} +% We reimplement \cmd\@mpfootnotetext\ under a new name (so as not to be overridden by the \classname{hyperref} package) +% and extend it to accomodate hyperrefs. +% +% Note that this procedure is very like \classname{ltxutil}'s \cmd\mp@footnotetext, except that it +% uses \cmd\frontmatter@makefntext\ instead of \cmd\@makefntext. +% +% \changes{4.1f}{2009/07/07}{(AO, 515) Use \cs{set@footnotefont}, which is defined in ltxutil} +% \changes{4.1n}{2010/01/02}{(AO, 571) allow split after last line of footnote}% +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \begin{macrocode} +\long\def\frontmatter@footnotetext#1{% + \minipagefootnote@pick + \set@footnotefont + \set@footnotewidth + \@parboxrestore + \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}% + \color@begingroup + \frontmatter@makefntext{% + \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox\vadjust{\vskip\z@skip}% + }% + \color@endgroup + \minipagefootnote@drop +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ltx@no@footwarn} +% +% \begin{macrocode} +\def\ltx@no@footnote{% + \let\ltx@xfootnote\ltx@no@xfootnote\let\ltx@yfootnote\ltx@no@yfootnote + \let\ltx@xfootmark\ltx@no@xfootmark\let\ltx@yfootmark\ltx@no@yfootmark + \let\ltx@xfoottext\ltx@no@xfoottext\let\ltx@yfoottext\ltx@no@yfoottext +}% +\def\ltx@no@xfootnote[#1]#2{\ltx@no@footwarn\footnote}% +\def\ltx@no@yfootnote#1{\ltx@no@footwarn\footnote}% +\def\ltx@no@xfootmark[#1]{\ltx@no@footwarn\footnotemark}% +\def\ltx@no@yfootmark{\ltx@no@footwarn\footnotemark}% +\def\ltx@no@xfoottext[#1]#2{\ltx@no@footwarn\footnotetext}% +\def\ltx@no@yfoottext#1{\ltx@no@footwarn\footnotetext}% +\def\ltx@no@footwarn#1{% + \class@warn{% + The \string#1\space command is not legal on the title page; + using \string\thanks\space instead might suit you: consult the manual for details% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractheading} +% The default abstract head; journals will override this procedure. +% \begin{macrocode} +\def\frontmatter@abstractheading{% + \begingroup + \centering\large + \abstractname + \par + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractfont} +% The default type specification for the body of the abstract. +% Journals will override this setting. +% \begin{macrocode} +\def\frontmatter@abstractfont{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{frontmatter@description} +% \changes{4.1b}{2008/06/29}{(AO, 455) provide a \texttt{description} environment for the abstract} +% Within the abstract, the description environment is defined as follows: +% \begin{macrocode} +\newenvironment{frontmatter@description}{% + \list{}{% + \leftmargin\z@ + \labelwidth\z@ +% \end{macrocode} +% \begin{verbatim} +% \itemindent-\leftmargin +% \end{verbatim} +% \begin{macrocode} + \itemindent\z@ + \let\makelabel\frontmatter@descriptionlabel + }% +}{% + \endlist +}% +\def\frontmatter@descriptionlabel#1{% + \hspace\labelsep + \normalfont\bfseries + #1:% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractwidth} +% The default setting is the full text width; +% journals can override this setting. +% \begin{macrocode} +\def\frontmatter@abstractwidth{\textwidth} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstract@produce} +% This procedure determines how the abstract is incorporated +% into the title block. We split this out in anticipation +% of the need to lift the limitation that the abstract not break over pages. +% +% If we are in preprint style, we provide an easy pagebreak point immediately above the abstract. +% This means that the abstract will either fit entirely on the same page as the title block, +% or it will start a page of its own (which may itself break onto a subsequent page if necessary). +% \begin{macrocode} +\def\frontmatter@abstract@produce{% + \par + \preprintsty@sw{% + \do@output@MVL{% + \vskip\frontmatter@preabstractspace + \vskip200\p@\@plus1fil + \penalty-200\relax + \vskip-200\p@\@plus-1fil + }% + }{% + \addvspace{\frontmatter@preabstractspace}% + }% + \begingroup + \dimen@\baselineskip + \setbox\z@\vtop{\unvcopy\absbox}% + \advance\dimen@-\ht\z@\advance\dimen@-\prevdepth + \@ifdim{\dimen@>\z@}{\vskip\dimen@}{}% + \endgroup + \begingroup + \prep@absbox + \unvbox\absbox + \post@absbox + \endgroup + \@ifx{\@empty\mini@notes}{}{\mini@notes\par}% + \addvspace\frontmatter@postabstractspace +}% +\appdef\frontmatter@init{\let\mini@notes\@empty}% +\let\prep@absbox\@empty +\let\post@absbox\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@preabstractspace} +% \begin{macro}{\frontmatter@postabstractspace} +% Space above and space below abstract in title block +% \begin{macrocode} +\def\frontmatter@preabstractspace{.5\baselineskip} +\def\frontmatter@postabstractspace{.5\baselineskip} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \subsection{Formatting the title block}% +% +% \begin{environment}{titlepage} +% This is \LaTeXe's \classname{article} class version, +% with modifications. +% \changes{4.0c}{1999/11/13}{grid changes with ltxgrid} +% \changes{4.1b}{2008/08/02}{Make the syntax of this package switch optional}% +% \begin{macrocode} +\newenvironment{frontmatter@titlepage}{% + \twocolumn@sw{\onecolumngrid}{\newpage}% + \thispagestyle{titlepage}% + \setcounter{page}\@ne +}{% + \twocolumn@sw{\twocolumngrid}{\newpage}% + \twoside@sw{}{% + \setcounter{page}\@ne + }% +}% +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\maketitle} +% \changes{4.0d}{1998/01/31}{hookify} +% Put it all together to format the title block. +% +% Gotcha! +% If you expand \cmd\csname undefined\cmd\endcsname, you change the meaning of \cmd\undefined\ from +% ``Undefined'' to \cmd\relax. +% Watchout! +% \begin{macrocode} +\def\frontmatter@maketitle{% + \@author@finish + \title@column\titleblock@produce + \suppressfloats[t]% +% \end{macrocode} +% Now save some memory. +% \begin{macrocode} + \let\and\relax + \let\affiliation\@gobble + \let\author\@gobble + \let\@AAC@list\@empty + \let\@AFF@list\@empty + \let\@AFG@list\@empty + \let\@AF@join\@AF@join@error + \let\email\@gobble + \let\@address\@empty + \let\maketitle\relax + \let\thanks\@gobble + \let\abstract\@undefined\let\endabstract\@undefined + \titlepage@sw{% + \vfil + \clearpage + }{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maketitle@Hy} +% \changes{4.1c}{2008/08/04}{Hyperref compatibility: take \cs{maketitle} back.} +% We provide the means to take back the definition of \cmd\maketitle\ from \classname{hyperref}: +% we do not need its help in providing hypertext services in the title page. +% \begin{macrocode} +\def\maketitle@Hy{% + \let\Hy@saved@footnotemark\@footnotemark + \let\Hy@saved@footnotetext\@footnotetext + \let\@footnotemark\H@@footnotemark + \let\@footnotetext\H@@footnotetext + \@ifnextchar[%] + \Hy@maketitle@optarg + {% + \HyOrg@maketitle + \Hy@maketitle@end + }% +}% +\appdef\class@documenthook{% + \@ifx{\maketitle\maketitle@Hy}{% + \class@info{Taking \string\maketitle\space back from hyperref}% + \let\maketitle\frontmatter@maketitle + }{% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\titleblock@produce} +% This procedure produces the title block. +% +% It effectively executes inside a group +% and always returns us to vertical mode. +% +% Note: we assume that it is OK to set the footnote counter to zero at this point. +% Is this a safe assumption? +% \begin{macrocode} +\def\titleblock@produce{% + \begingroup +% \end{macrocode} +% \changes{4.0b}{1999/06/20}{Set \cs{footnote} to \LaTeX\ standard version for this scope.} +% First, we restore the footnote mechanism to its default state, +% then we customize the way the footnote mark is produced and how it is formatted. +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \begin{macrocode} + \ltx@footnote@pop +% \end{macrocode} +% The following three lines establish an independent footnote counter for use in the title block. +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \begin{macrocode} + \def\@mpfn{mpfootnote}% + \def\thempfn{\thempfootnote}% + \c@mpfootnote\z@ + \let\@makefnmark\frontmatter@makefnmark + \frontmatter@setup + \thispagestyle{titlepage}\label{FirstPage}% +% \end{macrocode} +% Produce the title: +% \begin{macrocode} + \frontmatter@title@produce +% \end{macrocode} +% Produce the author list: +% \begin{macrocode} + \groupauthors@sw{% + \frontmatter@author@produce@group + }{% + \frontmatter@author@produce@script + }% +% \end{macrocode} +% Produce the dates: +% \begin{macrocode} + \frontmatter@RRAPformat{% + \expandafter\produce@RRAP\expandafter{\@date}% + \expandafter\produce@RRAP\expandafter{\@received}% + \expandafter\produce@RRAP\expandafter{\@revised}% + \expandafter\produce@RRAP\expandafter{\@accepted}% + \expandafter\produce@RRAP\expandafter{\@published}% + }% +% \end{macrocode} +% Produce the abstract, PACS, and keywords, and end any paragraph. +% \changes{4.1c}{2008/08/04}{Produce PACS, keywords only if specified}% +% \begin{macrocode} + \frontmatter@abstract@produce + \@ifx@empty\@pacs{}{% + \@pacs@produce\@pacs + }% + \@ifx@empty\@keywords{}{% + \@keywords@produce\@keywords + }% + \par + \frontmatter@finalspace + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@title@produce} +% The default formatting procedure for the article title. +% This procedure should take care of the vertical space below the title. +% +% Clients may override this procedure, but it is more likely that they will +% use the hooks \cmd\frontmatter@title@above, \cmd\frontmatter@title@format, and \cmd\frontmatter@title@below. +% \changes{4.1b}{2008/08/04}{(AO, 443) PDF Bookmark for title page}% +% \begin{macrocode} +\def\toclevel@title{0}% +\def\frontmatter@title@produce{% + \begingroup + \frontmatter@title@above + \frontmatter@title@format + \@title + \unskip + \phantomsection\expandafter\@argswap@val\expandafter{\@title}{\addcontentsline{toc}{title}}% + \@ifx{\@title@aux\@title@aux@cleared}{}{% + \expandafter\frontmatter@footnote\expandafter{\@title@aux}% + }% + \par + \frontmatter@title@below + \endgroup +}% +\appdef\let@mark{\let\\\relax}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@title@above} +% \begin{macro}{\frontmatter@title@format} +% \begin{macro}{\frontmatter@title@below} +% The default values for formatting specifications for the article title. +% +% The procedure \cmd\frontmatter@title@above\ should take care of the vertical space above the title; +% \cmd\frontmatter@title@below\ below. +% The procedure \cmd\frontmatter@title@format\ should invoke any font switches, etc. +% that may apply to the title. +% +% Journals will override this procedure. +% \begin{macrocode} +\def\frontmatter@title@above{}% +\def\frontmatter@title@format{}% +\def\frontmatter@title@below{\addvspace{\baselineskip}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Authors and affiliations in superscriptaddress style} +% +% \begin{macro}{\frontmatter@author@produce@script} +% \changes{4.1b}{2008/08/02}{Provide for diagnostics via \cs{frontmatterverbose@sw}} +% \cmd\frontmatter@author@produce@script\ is an alias for \cmd\frontmatter@author@produce, +% the procedure that formats the author/affiliation list. +% +% In this case, the authors affiliations are being superscripted +% (class option \classoption{superscriptaddress}). +% +% This procedure must ensure that any paragraph that it starts gets ended finally. +% \changes{4.1i}{2009/10/18}{(AO, 540) More runtime diagnostics via \cs{frontmatterverbose@sw}} +% \changes{4.1m}{2009/11/20}{(AO, 563) More complete runtime diagnostics via \cs{frontmatterverbose@sw}} +% \begin{macrocode} +\def\frontmatter@author@produce@script{% + \begingroup + \let\@author@present\@author@present@script + \frontmatterverbose@sw{\typeout{\string\frontmatter@author@produce@script:}\say\@AAC@list\say\@AFF@list\say\@AFG@list}{}% +% \end{macrocode} +% \changes{4.0l}{1998/09/01}{Changes to add collaboration processing, which now means doing comma/and processing on each sublist} +% When the author/affiliation list \cmd\@AAC@list\ is executed, +% \cmd\@tempcnt\ counts each author, +% and +% \cmd\@tempa\ stores a list of author indices for the current collaboration. +% +% Note: this procedure uses \cmd\AU@temp\ to hold a list of author counts for each collaboration. +% Note: also uses \cmd\@tempcnta\ to communicate between procedures. +% This usage ot \cmd\@tempcnta\ is OK, because the expansion of \cmd\@AAC@list\ will trigger only the execution of +% our own procedures. +% \begin{macrocode} + \let\AU@temp\@empty + \@tempcnta\z@ +% \end{macrocode} +% +% We wish to know how many authors are in each collaboration, for the purposes of \cmd\listcomma\ and \cmd\listand. +% +% Here we assign values for the intercollated operators appearing within \cmd\@AAC@list, +% then execute that macro, registering the authors in each collaboration. +% Afterwards, clean up by emulating an empty collaboration. +% +% The result, stored in \cmd\AU@temp, is a list of brace-delmited tokens, each a number +% representing the number of authors in that collaboration. +% \begin{macrocode} + \let\AF@opr \@gobble + \def\AU@opr{\@author@count\@tempcnta}% + \def\CO@opr{\@collaboration@count\AU@temp\@tempcnta}% + \@AAC@list + \expandafter\CO@opr\@author@cleared +% \end{macrocode} +% Next, present the authors and their affiliations, with the collaborations interleaved. +% +% We assign values for the intercollated operators appearing within \cmd\@AAC@list. +% Next, assign \cmd\@listcomma\ based on the number of authors in the first collaboration. +% Then expand \cmd\@AAC@list. +% +% Upon completion, there will be two space tokens following the last author because of \cmd\listand\ processing; +% remove them, then end the last paragraph. +% +% FIXME: this juncture would be a good time to effectively eliminate +% the unused affiliations in \cmd\@AFF@list. +% \begin{macrocode} + \begingroup + \frontmatter@authorformat + \let\AF@opr \@affilID@def + \let\AU@opr \@author@present + \def\CO@opr{\@collaboration@present\AU@temp}% + \set@listcomma@list\AU@temp + \@AAC@list + \unskip\unskip + \par + \endgroup +% \end{macrocode} +% We now list out the affiliations in the order they appeared. +% \begin{macrocode} + \begingroup + \frontmatter@above@affiliation@script + \let\AFF@opr \@affil@script + \@AFF@list + \frontmatter@footnote@produce + \par + \endgroup + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@author@count} +% This version of \cmd\AU@opr\ counts the number of authors it processes. +% \begin{macrocode} +\def\@author@count#1{% + \advance#1\@ne + \@author@gobble +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@collaboration@present} +% Format a collaboration. +% Note that we immediately end the paragraph thus begun, because we only support +% \classoption{superscriptaddress}-style processing. +% +% Note also that the execution of the production procedures takes place inside of a group; +% for reasons of protective programming. +% +% Bug note: originally, the number of authors in each collaboration was stored in \cmd\@tempa, +% but this exposed us to procedures in our production that modified the meaning of \cmd\@tempa. +% +% The last action done in this procedure is to assign \cmd\@listcomma\ based on the number of authors in the next collaboration. +% \begin{macrocode} +\def\@collaboration@present#1#2#3#4{% + \par + \begingroup + \frontmatter@collaboration@above + \@affilID@def{}% + \@tempcnta\z@ + \@author@present{}{(\ignorespaces#3\unskip)}{#4}% + \par + \endgroup + \set@listcomma@list#1% +}% +\def\frontmatter@collaboration@above{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@collaboration@count} +% Simply register each author in this collaboration. +% Note: \#1 is a \cmd\csname\ to hold the value, \#2 is the \cmd\count\ register holding the count of interest. +% \begin{macrocode} +\def\@collaboration@count#1#2{% + \appdef@eval#1{\the#2}#2\z@ + \@author@gobble +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@affilID@def} +% +% The \cmd\@affilID@def\ procedure, an alias of \cmd\AF@opr\ used during \cmd\frontmatter@author@produce@script\ processing, +% memorizes the affiliation in \cmd\@affilID@temp. +% \begin{macrocode} +\def\@affilID@def{\def\@affilID@temp}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@affilID@temp} +% +% The macro \cmd\@affilID@temp\ is used to communicate between +% \cmd\doauthor\ and instances of \cmd\AF@opr\ within the author list. +% \begin{macrocode} +\let\@affilID@temp\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\affils@present@script} +% An alias of \cmd\AFG@opr, this procedure is applied to elements in \cmd\@AFG@list. +% It builds \cmd\@AFU@list, a list of unique affiliations found within affiliation groups. +% +% \changes{4.1a}{2008/06/16}{removed code that had been commented out} +% \begin{verbatim} +%\def\affils@present@script#1{% +% \get@affil#1{}% +%}% +%\def\get@affil#1{% +% \def\@tempa{#1}% +% \@ifx{\@empty\@tempa}{}{% +% \@booleanfalse\temp@sw +% \def\AF@opr{\x@match\@tempa}% +% \@AFU@list +% \temp@sw{}{% +% \appdef\@AFU@list{\AF@opr{#1}}% +% }% +% \get@affil +% }% +%}% +% \end{verbatim} +% \end{macro} +% +% \begin{macro}{\affil@present@script} +% An alias of \cmd\AF@opr, this procedure is applied to \cmd\@AFU@list\ when formatting the affiliations +% under \classoption{superscriptaddress}. +% It in turn applies \cmd\affil@script\ to \cmd\@AFF@list, thereby formatting the affiliation +% associated with this affiliation index. +% +% Note: it traverses the \cmd\@AFF@list\ for each entry in the \cmd\@AFU@list, thereby making this +% portion of code execute in $N^{2}$ time. +% \changes{4.1a}{2008/06/16}{removed code that had been commented out} +% \begin{verbatim} +%\def\affil@present@script#1{% +% \def\@tempa{#1}% +% \begingroup +% \frontmatter@affiliationfont +% \let\AFF@opr \affil@script +% \@AFF@list +% \endgroup +%}% +% \end{verbatim} +% \end{macro} +% +% \begin{macro}{\affil@script} +% Alias of \cmd\AFF@opr, this procedure is applied to \cmd\@AFF@list\ when formatting the affiliations +% under \classoption{superscriptaddress}. +% It rejects all entries not matching the affiliation index held in \cmd\@tempa. +% \begin{macrocode} +\def\affil@script#1#2#3{% + \def\@tempifx{#1}\@ifx{\@tempifx\@tempa}{% + \@if@empty{#2}{}{% + \par + \begingroup + \def\@thefnmark{#1}\@makefnmark\ignorespaces + #2% + \@if@empty{#3}{}{\frontmatter@footnote{#3}}% + \par + \endgroup + }% + }{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@affil@script} +% Alias of \cmd\AFF@opr: +% The affiliations are being formatted in the case +% where affiliations are being superscripted: +% make a list out of the affiliations with the numbers printed. +% Society-specific code can change the formatting +% by overriding the definition of \cmd\frontmatter@affiliationfont. +% +% A client may choose to set \cmd\affil@cutoff\ to either \cmd\@ne\ (the default) +% or \cmd\tw@. The latter setting will enforce a rule to the effect that +% if a single affiliation appears on the title page, +% then no affiliation superscript at all is produced. +% +% |#1|---Affiliation ID: a number; zero signifies a \cmd\noaffiliation. +% +% |#2|---Collaboration ID +% +% |#3|---Affiliation address +% +% |#4|---Auxiliary info +% \begin{macrocode} +\def\@affil@script#1#2#3#4{% +% \end{macrocode} +% If the affiliation is the \cmd\noaffiliation, then we do nothing. +% \begin{macrocode} + \@ifnum{#1=\z@}{}{% + \par + \begingroup + \frontmatter@affiliationfont + \@ifnum{\c@affil<\affil@cutoff}{}{% + \def\@thefnmark{#1}\@makefnmark + }% + \ignorespaces#3% + \@if@empty{#4}{}{\frontmatter@footnote{#4}}% + \par + \endgroup + }% +}% +\let\affil@cutoff\@ne +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@author@present@script} +% \changes{4.0h}{1998/06/25}{Changes to support groups of affiliations} +% \changes{4.1n}{2009/11/30}{(AO, 567) Handle \cs{noaffiliation} case} +% This version of \cmd\AU@opr\ applies to the \classoption{superscriptaddress} class option. +% Need to add commas between groups +% of address numbers, which are passed in the macro \cmd\@affilID@temp\ in the form +% |{3}{4}{7}| if this set of authors is related to addresses, 3, 4 and 7. +% \begin{macrocode} +\def\@author@present@script#1#2#3{% + \begingroup + \gdef\comma@space{\textsuperscript{,\,}}% + \doauthor{#2}{#3}{\@affil@present@script}% + \endgroup + \advance\@tempcnta\m@ne +}% +\def\@affilcomma#1#2{% + \@ifx{\z@#1}{% + \@ifx{\relax#2}{}{% + \@affilcomma{#2}% + }% + }{% + #1% + \@ifx{\relax#2}{}{% + \@ifx{\z@#2}{% + \@affilcomma + }{% + ,\,\@affilcomma{#2}% + }% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@affil@present@script} +% \begin{macro}{\@affil@present@script@} +% \changes{4.1n}{2009/11/30}{(AO, 567) Handle punctuation for \classoption{superscriptaddress} style authors' extra information, such as \cs{email}} +% The \cmd\@affil@present@script\ procedure presents the reference to the affiliations in the case of superscript addresses. +% +% The affiliations are presented to \cmd\@affil@present@script@ as a list of brace-delimited tokens, each containing the affiliation ID (a number). +% The list is terminated by the token \cmd\relax. +% The macro recurses (via tail recursion) until the terminating token is encountered. +% Note that an affiliation ID of zero signifies a \cmd\noaffiliation: +% references to the \cmd\noaffiliation\ are passed over. +% +% Upon termination, the affiliations, if any, are produced via \cmd\textsuperscript\ and the appropriate boolean is queued via \cmd\aftergroup. +% The boolean signifies that a non-trivial affiliation was produced, so that the proper punctuation can be produced. +% The group in question is that opened and closed by the \cmd\doauthor\ procedure. +% +% This procedure uses \cmd\@tempa\ as a scratch register. +% \begin{macrocode} +\def\@affil@present@script{% + \let\@tempa\@empty + \expandafter\@affil@present@script@\@affilID@temp\relax +}% +\def\@affil@present@script@#1{% + \@ifx{\relax#1}{% + \@ifx{\@tempa\@empty}{% + \aftergroup\false@sw + }{% + \textsuperscript{\expandafter\@affilcomma\@tempa\relax\relax}% + \aftergroup\true@sw + }% + }{% + \@ifnum{#1=\z@}{}{\appdef\@tempa{{#1}}}% + \@affil@present@script@ + }% +}% +\@provide\@author@parskip{\z@skip}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Authors and affiliations in groupedaddress style} +% +% \begin{macro}{\frontmatter@author@produce@group} +% \changes{4.1b}{2008/08/02}{Provide for diagnostics via \cs{frontmatterverbose@sw}} +% Alias for \cmd\frontmatter@author@produce when \classoption{groupedaddress} is in effect, +% the procedure that formats the author/affiliation list. +% +% In this case, the authors are being grouped above their shared addresses. +% How it works: the \cmd\@AFG@list, a list of all unique affiliation groups, is expanded. +% For each such group, all authors belonging to that group are formatted above the affiliation group. +% Collaborations are silently passed over. +% +% This procedure must ensure that any paragraph that it starts gets ended finally. +% \changes{4.1i}{2009/10/18}{(AO, 540) More runtime diagnostics via \cs{frontmatterverbose@sw}} +% \changes{4.1m}{2009/11/20}{(AO, 563) More complete runtime diagnostics via \cs{frontmatterverbose@sw}} +% \begin{macrocode} +\def\frontmatter@author@produce@group{% + \begingroup + \let\@author@present\@author@present@group + \frontmatter@authorformat + \frontmatterverbose@sw{\typeout{\string\frontmatter@author@produce@group:}\say\@AAC@list\say\@AFF@list\say\@AFG@list}{}% + \let\AU@temp\@empty + \set@listcomma@list\AU@temp + \def\CO@opr{\@collaboration@present\AU@temp}% + \let\AFG@opr \affils@present@group + \let\@listcomma\relax + \@AFG@list + \frontmatter@footnote@produce + \par + \endgroup + \frontmatter@authorbelow +}% +\@provide\frontmatter@authorbelow{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\affils@present@group} +% \changes{4.1b}{2008/08/02}{Provide for diagnostics via \cs{frontmatterverbose@sw}} +% Alias of \cmd\AFG@opr, this procedure is used on every element of +% \cmd\@AFG@list, the list of unique affiliation groups, +% when formatting the author/affiliation block: +% It presents all authors sharing this affiliation group. +% +% This procedure is called via the procedure +% \cmd\frontmatter@author@produce@group, an alias for \cmd\frontmatter@author@produce, +% +% Its use pertains to the class options +% \classoption{groupedaddress}, \classoption{unsortedaddress}, and \classoption{runinaddress} +% (that is, \cmd\groupauthors@sw\ is true). +% +% For each invocation, the entire \cmd\@AAC@list\ is run through (twice), +% making this process execute in $N^{2}$ time. (Is this really true?) +% \begin{macrocode} +\def\affils@present@group#1{% +% \end{macrocode} +% Count (using \cmd\@tempcnta) the authors in the author list whose affiliation group +% matches the argument |#1|. +% +% Note that \cmd\AF@temp\ is used as a storage register for the argument +% of the procedure, for purposes of comparison using \cmd\ifx. +% +% Note: here we use \cmd\@tempcnta\ to accumulate the number of authors in the current affiliation set. +% +% QUERY: do the value of \cmd\AF@temp\ and \cmd\AF@opr\ need to persist? +% +% QUERY: what value does \cmd\AU@opr\ have at this point? +% ANSWER: the \cmd\@affilID@count\ and \cmd\@affilID@match\ procedures +% assign meanings to \cmd\AU@opr\ and \cmd\CO@opr\ dynamically. +% We initialize the two operators to \cmd\@undefined\ so as to catch the +% pathological cases. +% \begin{macrocode} + \begingroup + \def\AF@temp{#1}% + \@tempcnta\z@ + \let\AU@opr \@undefined + \let\CO@opr \@undefined + \def\AF@opr{\@affilID@count\AF@temp\@tempcnta}% + \@AAC@list +% \end{macrocode} +% +% If there are no authors using this affiliation group, skip it. +% \begin{macrocode} + \@ifnum{\@tempcnta=\z@}{}{% +% \end{macrocode} +% +% DPC: If we have a list of length two, need to locally zap a comma. +% \begin{macrocode} + \begingroup + \frontmatter@above@affilgroup + \set@listcomma@count\@tempcnta +% \end{macrocode} +% Run through the author list, presenting (with \cmd\@author@present) +% those authors whose affiliation matched the given one. +% \begin{macrocode} + \let\AU@opr \@undefined + \let\CO@opr \@undefined + \def\AF@opr{\@affilID@match\AF@temp}% + \@AAC@list + \endgroup +% \end{macrocode} +% Now that the authors have all been presented, present the affiliations, grouped. +% +% Note: \cmd\@tempcnta\ is the number of affiliations for this set of authors. +% \begin{macrocode} + \begingroup + \par + \frontmatter@above@affiliation + \frontmatter@affiliationfont + \let\\\frontmatter@addressnewline + \@tempcnta\z@ + \@tfor\AF@temp:=#1\do{% + \expandafter\@ifx\expandafter{\expandafter\z@\AF@temp}{}{% + \advance\@tempcnta\@ne + }% + }% + \@ifnum{\@tempcnta=\tw@}{% + \let\@listcomma\relax + }{}% + \def@after@address + \runinaddress@sw{% + }{% + \tightenlines@sw{}{% +% \end{macrocode} +% The following line determines the space between affilations in grouped mode +% \begin{macrocode} + \parskip\z@ + }% + \appdef\after@address\par + }% + \let\AFF@opr \@affil@group + \do@affil@fromgroup\@AFF@list#1\relax + \endgroup +% \end{macrocode} +% End of branch handling authors. +% \begin{macrocode} + }% +% \end{macrocode} +% +% \begin{macrocode} + \par + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\def@after@address} +% \begin{macro}{\def@after@address@empty} +% \changes{4.1c}{2008/08/04}{Parametrize the production after the address}% +% +% Each of these procedures assigns a meaning to \cmd\after@address, the first +% a useful default, the second a nil. +% A society or journal substyle may define it according to its own requirements. +% \begin{macrocode} +\def\def@after@address{\def\after@address{\@listcomma\ \@listand}}% +\def\def@after@address@empty{\let\after@address\@empty}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@affilID@count} +% \begin{macro}{\@affilID@match} +% +% The control sequence name \cmd\AF@opr\ is placed in the +% author/affiliation list (\cmd\@AAC@list) for each (new) affiliation, with that affiliation as its argument. +% +% The control sequence name \cmd\AF@opr\ is an alias of a procedure +% to count the number of authors at a given affiliation (\cmd\@affilID@count) +% or to present the given authors (\cmd\@affilID@match). +% These two procedures are executed when formatting under the \classoption{groupedaddress} class option. +% \begin{macrocode} +\def\@affilID@count#1#2#3{% + \def\@tempifx{#3}% + \@ifx{\@tempifx#1}{% + \def\AU@opr{\@author@count#2}% + }{% + \let\AU@opr \@author@gobble + }% + \let\CO@opr \@collaboration@gobble +}% +\def\@affilID@match#1#2{% + \def\@tempifx{#2}% + \@ifx{\@tempifx#1}{% + \let\AU@opr \@author@present + }{% + \let\AU@opr \@author@gobble + }% + \let\CO@opr \@collaboration@gobble +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\do@affil@fromgroup} +% Executes iteratively: +% selects the next address ID to print, +% and then re-execute the list of addresses to print the text of that address. +% +% Note: an argument of \cmd\relax\ breaks out of this iteration, +% while an argument of \cmd\z@\ (\cmd\noaffiliation) is a no-op. +% +% Note: we have created an $N^{2}$ computing process. +% FIXME: can use hashing instead, you know. +% \begin{macrocode} +\def\do@affil@fromgroup#1#2{% + \@ifx{\relax#2}{}{% + \count@#2\relax + \@ifnum{\z@=\count@}{}{#1}% + \do@affil@fromgroup#1% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@affil@group} +% The alias of \cmd\AFF@opr\ when the list \cmd\@AFF@list\ +% is executed by \cmd\do@affil@fromgroup\ (\classoption{groupedaddress}): +% Print the address if its number matches \cmd\count@\ (value set by \cmd\do@affil@fromgroup). +% +% Note that we detect a \cmd\noaffiliation\ here by the affiliation address being +% the same as the expansion of \cmd\blankaffiliation. +% +% \changes{4.1d}{2008/10/17}{(AO, 410) compare \cs{@tempa} to \cs{blankaffiliation}.}% +% +% I made a mistake when coding the comparison to \cmd\blankaffiliation: +% it originally read \cmd\@ifx\{\#3\cmd\blankaffiliation\}. +% This is obviously wrong once you think twice. +% \begin{macrocode} +\def\@affil@group#1#2#3#4{% + \@ifnum{#1=\count@}{% + \def\@tempa{#3}% + \@ifx{\@tempa\blankaffiliation}{}{% + #3% + \@if@empty{#4}{}{% + \frontmatter@footnote{#4}% + }% + \after@address + }% + \advance\@tempcnta\m@ne + }{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@author@present@group} +% \begin{macro}{\@affil@present@group} +% \changes{4.0d}{1998/01/31}{\cs{comma@space}} +% This version of \cmd\AU@opr\ applies to the \classoption{groupedaddress} class option and its ilk. +% Traverse the list calling the \cmd\doauthor\ hook on each author. +% +% The third argument of \cmd\doauthor\ fulfills the requirement that it +% queue up a boolean via \cmd\aftergroup. +% \begin{macrocode} +\def\@author@present@group#1#2#3{% + \gdef\comma@space{\gdef\comma@space{\textsuperscript{,\,}}}% + \doauthor{#2}{#3}{\@affil@present@group}% + \advance\@tempcnta\m@ne +}% +\def\@affil@present@group{% + \aftergroup\false@sw +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@pacs@produce} +% PACS, keywords and dates. +% \changes{4.0d}{1998/01/31}{PACS boxed to width of abstract} +% \changes{4.0b}{1999/06/20}{Separate option now controls production} +% \changes{4.0e}{2000/09/20}{Warn if no production} +% \begin{macrocode} +\def\@pacs@produce#1{% + \showPACS@sw{% + \begingroup + \frontmatter@PACS@format + \@pacs@name#1\par + \endgroup + }{% + \@if@empty{#1}{}{% + \class@warn{\PACS@warn}% + }% + }% +}% +\def\PACS@warn{If you want your PACS to appear in your output, use document class option showpacs}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@keywords@produce} +% \changes{4.0e}{2000/09/20}{Keywords on same footing as PACS} +% \begin{macrocode} +\def\@keywords@produce#1{% + \showKEYS@sw{% + \begingroup + \frontmatter@keys@format + \@keys@name#1\par + \endgroup + }{% + \@if@empty{#1}{}{% + \class@warn{If you want your keywords to appear in your output, use document class option showkeys}% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@footnote@produce@footnote} +% \begin{macro}{\frontmatter@footnote@produce@endnote} +% Produce any footnotes to appear at the bottom of the title page. +% +% If frontmatter footnotes have been redirected to the bibliography, this will be a no-op. +% ref.: \cmd\present@bibnote. +% \begin{macrocode} +\def\frontmatter@footnote@produce@footnote{% + \let\@TBN@opr\present@FM@footnote + \@FMN@list + \global\let\@FMN@list\@empty +}% +% \end{macrocode} +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \begin{macrocode} +\def\present@FM@footnote#1#2{% + \begingroup + \csname c@\@mpfn\endcsname#1\relax + \def\@thefnmark{\frontmatter@thefootnote}% + \frontmatter@footnotetext{#2}% + \endgroup +}% +\def\frontmatter@footnote@produce@endnote{% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{Package defaults} +% +% \begin{macro}{\title@column} +% \begin{macro}{\preprintsty@sw} +% \begin{macro}{\collaboration@sw} +% \begin{macro}{\frontmatter@footnote@produce} +% \begin{macro}{\do@output@MVL} +% \begin{macro}{\comma@space} +% We give meanings to the Booleans and other macros that a client document class would +% set on our behalf. +% \begin{macrocode} +\appdef\frontmatter@init{% + \@ifxundefined\title@column {\let\title@column\@empty}{}% + \@ifxundefined\preprintsty@sw {\@booleanfalse\preprintsty@sw}{}% + \@ifxundefined\frontmatter@footnote@produce{\let\frontmatter@footnote@produce\frontmatter@footnote@produce@footnote}{}% + \@ifxundefined\do@output@MVL {\let\do@output@MVL\@firstofone}{}% + \@ifxundefined\comma@space {\let\comma@space\@empty}{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\frontmatter@thefootnote} +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% In the title block, the footnote symbol (used for alternate affiliation and sundry) +% is a \cmd\@fnsymbol\ or a lowercase letter, as selected by a boolean. +% The society or journal may override this definition. +% \begin{macrocode} +\def\frontmatter@thefootnote{% + \altaffilletter@sw{\@alph}{\@fnsymbol}{\csname c@\@mpfn\endcsname}% +}% +\@ifx{\altaffilletter@sw\@undefined}{\@booleantrue\altaffilletter@sw}{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@makefnmark} +% The default procedure for setting the footnote mark within the frontmatter. +% A client may override this procedure. +% \begin{macrocode} +\def\frontmatter@makefnmark{% + \@textsuperscript{% + \normalfont\@thefnmark + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@makefntext} +% This procedure is used when setting footnotes within the title block. +% +% Note that we are \classname{hyperref} friendly: we invoke \cmd\Hy@raisedlink\ +% so that this footnote becomes a hypertext anchor. If \classname{hyperref} is +% not loaded, then \classname{ltxutil} has our act covered via some stubs. +% +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \begin{macrocode} +\long\def\frontmatter@makefntext#1{% + \parindent 1em + \noindent + \Hy@raisedlink{\hyper@anchorstart{frontmatter.\expandafter\the\csname c@\@mpfn\endcsname}\hyper@anchorend}% + \@makefnmark + #1% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@setup} +% The default type specification for the title page. +% Clients will override this definition. +% \begin{macrocode} +\def\frontmatter@setup{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@RRAPformat} +% \begin{macro}{\punct@RRAP} +% \begin{macro}{\produce@RRAP} +% The procedure \cmd\frontmatter@RRAPformat\ is the formatting procedure +% for the ``Received, Revised, etc.'' block on the title page. +% The macro \cmd\punct@RRAP\ produces the punctuation between the entries. +% Clients will override these two definitions. +% +% The procedure \cmd\produce@RRAP\ is fairly general, and should be used by most +% journal substyles. +% +% The procedure \cmd\frontmatter@RRAP@format\ will be overridden by the journal. +% \begin{macrocode} +\def\frontmatter@RRAPformat#1{% + \removelastskip + \begingroup + \frontmatter@RRAP@format + #1\par + \endgroup +}% +\def\punct@RRAP{; }% +\def\produce@RRAP#1{% + \@if@empty{#1}{}{% + \@ifvmode{\leavevmode}{\unskip\punct@RRAP\ignorespaces}% + #1% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\frontmatter@authorformat} +% The default type specification for the author list. +% Clients will override this definition. +% For one alternative, see the \classname{revtex4} document class. +% \begin{macrocode} +\def\frontmatter@authorformat{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@above@affilgroup} +% The default amount of space above an affiliation group +% (in a \cmd\affils@present@group\ production). +% Clients will override this definition. +% \begin{macrocode} +\def\frontmatter@above@affilgroup{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@above@affiliation} +% \begin{macro}{\frontmatter@above@affiliation@script} +% The \cmd\frontmatter@above@affiliation\ is the amount of space above affiliations in the \classoption{groupedaddress} +% style, and \cmd\frontmatter@above@affiliation@script\ is that for \classoption{superscriptaddress}. +% Clients will override this definition. +% For one alternative, see the \classname{revtex4} document class. +% \begin{macrocode} +\def\frontmatter@above@affiliation{}% +\def\frontmatter@above@affiliation@script{}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\frontmatter@affiliationfont} +% The default type specification for the affiliation. +% Clients will override this definition. +% For one alternative, see the \classname{revtex4} document class, where +% several alternative definitions are made. +% \begin{macrocode} +\def\frontmatter@affiliationfont{\itshape\selectfont}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@RRAP@format} +% The default type specification for the dates. +% Clients will override this definition. +% \begin{macrocode} +\def\frontmatter@RRAP@format{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@PACS@format} +% Specify the formatting of the title page PACS statement. +% +% Journals will override. +% \begin{macrocode} +\def\frontmatter@PACS@format{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@keys@format} +% Specify the formatting of the title page keywords statement. +% +% Journals will override. +% \begin{macrocode} +\def\frontmatter@keys@format{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@finalspace} +% +% \begin{macrocode} +\def\frontmatter@finalspace{\addvspace{18\p@}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@addressnewline} +% \changes{4.0h}{1998/06/25}{new hook} +% The definition of \cmd\\\ for address handling. Default puts all the `lines' +% on a run-in line, separated by comma and space. +% DPC: was \newline space between lines of addresss. +% \begin{macrocode} +\def\frontmatter@addressnewline{% + \@ifhmode{\skip@\lastskip\unskip\unpenalty\break\hskip\skip@}{}% + % was: \vskip-.5ex +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\frontmatter@preabstractspace} +% \begin{macro}{\frontmatter@postabstractspace} +% Space above and space below abstract in title block +% \begin{macrocode} +\def\frontmatter@preabstractspace{5.5\p@} +\def\frontmatter@postabstractspace{6.5\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\aftermaketitle@chk} +% Error-checking code. +% \begin{macrocode} +\def\aftermaketitle@chk#1{% + \@ifx{\maketitle\relax}{% + \class@err{\protect#1 must be used before \protect\maketitle}% + }{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@titlepage} +% Default page style for title page. +% Journals will override this procedure. +% \begin{macrocode} +\def\ps@titlepage{\ps@empty}% +% \end{macrocode} +% \end{macro} +% +%FIXME: there is a limitation to the default meaning of +% \cmd\@startpage: the label ``FirstPage'' is only +% defined if the document has a \cmd\maketitle\ command. +% +% \begin{macrocode} +\def\volumeyear#1{\gdef\@volumeyear{#1}}% +\def\@volumeyear{}% +\def\volumenumber#1{\gdef\@volumenumber{#1}}% +\def\@volumenumber{}% +\def\issuenumber#1{\gdef\@issuenumber{#1}}% +\def\@issuenumber{}% +\def\eid#1{\gdef\@eid{#1}}% +\def\@eid{}% +% +\def\startpage#1{\gdef\@startpage{#1}\c@page#1\relax}% +\def\@startpage{\pageref{FirstPage}}% +\def\endpage#1{\gdef\@endpage{#1}}% +\def\@endpage{\pageref{LastPage}}% +% \end{macrocode} +% +% +% \subsection{Printing out the ``list-of'' elements}% +% +% FIXME: The \cmd\appendix@toc\ procedure should change the meaning +% of \cmd\l@section\ so that the \cmd\section s can be appropriately formatted, +% reflecting their status as appendices. +% +% \begin{macrocode} +\def\print@toc#1{% + \begingroup + \expandafter\section + \expandafter*% + \expandafter{% + \csname#1name\endcsname + }% + \let\appendix\appendix@toc + \@starttoc{#1}% + \endgroup +}% +\def\appendix@toc{}% +% \end{macrocode} +% +% \begin{macro}{\Dated@name} +% \begin{macro}{\Received@name} +% \begin{macro}{\Revised@name} +% \begin{macro}{\Accepted@name} +% \begin{macro}{\Published@name} +% These strings are used in the \cmd\date, et al. commands. +% \begin{macrocode} +\def\Dated@name{Dated }% +\def\Received@name{Received }% +\def\Revised@name{Revised }% +\def\Accepted@name{Accepted }% +\def\Published@name{Published }% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{4.1g}{2009/10/05}{(AO, 539) Robustify \cs{class@warn} against TOC processing}% +% Two commands require robustifying against harsh treatment when TOC entries are written out. +% Note that \cmd\class@warn\ is not user-level markup, but crops up when +% the \cmd\title\ command is missing from the document. +% \begin{macrocode} +\appdef\robustify@contents{% + \let\thanks\@gobble\let\class@warn\@gobble + \def\begin{\string\begin}\def\end{\string\end}% +}% +% \end{macrocode} +% +% \subsection{Syntax switch}% +% \changes{4.1b}{2008/08/02}{Make the syntax of this package switch optional}% +% +% Shall we take over the syntax of \LaTeX? +% By default, Yes, unless the Boolean below has already been defined. +% In the package version, this is controlled by an option; +% in the kernel version, the Boolean remains undefined. +% +% \cmd\maketitle\ presents a complication. If this code will execute under +% \classname{ltxgrid}, then its version of the procedure will do fine. +% +% As a package, under \classname{article}, things are different. +% In this case, what should be done depends upon \cmd\if@titlepage. +% If true, then just execute \cmd\maketitle\ as it stands. +% If false, then the \classname{article} class has defined its wrapper +% procedure, and we should take over the meaning of \cmd\@maketitle\ instead. +% +% Here is a list of the commands defined by this package that potentially override +% those of standard \LaTeX: +% \cmd\frontmatter@title, +% \cmd\frontmatter@author, +% \cmd\frontmatter@and, +% \cmd\frontmatter@thanks, +% \cmd\frontmatter@date, +% \env{frontmatter@abstract}, +% \env{frontmatter@titlepage}, +% \cmd\frontmatter@maketitle. +% +% The following code will perform that override, given the appropriate state of the Boolean. +% \begin{macrocode} +\@ifxundefined\frontmatter@syntax@sw{\@booleantrue\frontmatter@syntax@sw}{}% +\frontmatter@syntax@sw{% + \let\title \frontmatter@title + \let\author \frontmatter@author + \let\date \frontmatter@date + \@ifxundefined\@maketitle{% + \let\maketitle \frontmatter@maketitle + \@booleantrue \titlepage@sw + }{% + \let\@maketitle \frontmatter@maketitle + \prepdef\maketitle\@author@finish + }% + \let\noaffiliation \frontmatter@noaffiliation + \let\thanks@latex \thanks + \let\thanks \frontmatter@thanks + \let\and@latex \and + \let\and \frontmatter@and + \let@environment{titlepage}{frontmatter@titlepage}% + \let@environment{abstract}{frontmatter@abstract}% +}{% + \let\noaffiliation\@empty +}% +% \end{macrocode} +% +% \subsection{End of the \file{ltxfront} kernel} +% The kernel portion of the \classname{ltxfront} package is complete. +% \begin{macrocode} +%</kernel> +% \end{macrocode} +% +% \subsection{Remainder of the \classname{ltxfront} package} +% +% Include any code here that ought to be incorporated into the package, +% but should not be part of the kernel. +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macrocode} +% \end{macrocode} +% Define formatting as like as possible to the article class. +% Comands that prepare for \cmd\maketitle: \cmd\author, \cmd\title, \cmd\date. +% +% Argument of the above three may contain \cmd\\ and \cmd\thanks; argument of \cmd\author may contain \cmd\and. +% The \cmd\\ may still work fine; \cmd\and\ will be ignored (warning); +% \cmd\thanks\ even though it should not reside in the argument, will work. +% +% An explicit \cmd\footnote should be treated as if it were \cmd\thanks. +% +% \begin{verbatim} +% \@maketitle: \frontmatter@footnote@produce +% \end{verbatim} +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% +% \begin{macrocode} +\def\thanks@latex#1{% + \footnotemark + \expandafter\expandafter + \expandafter\gappdef + \expandafter\expandafter + \expandafter\@thanks + \expandafter\expandafter + \expandafter{% + \expandafter\expandafter + \expandafter\footnotetext + \expandafter\expandafter + \expandafter[% + \expandafter\the\csname c@\@mpfn\endcsname]{#1}}% +}% +\@booleanfalse\altaffilletter@sw +\@if@sw\if@titlepage\fi{\@booleantrue}{\@booleanfalse}\titlepage@sw +\def\frontmatter@title@above{\newpage\null\vskip2em\relax}% +\def\frontmatter@title@format{\centering\LARGE\let\thanks\thanks@latex}% +\def\frontmatter@title@below{\vskip1.5em\relax}% +\def\frontmatter@authorformat{\centering\large\advance\baselineskip\p@\parskip11.5\p@\let\thanks\thanks@latex\let\and\and@space}% +\def\frontmatter@authorbelow{\vskip 1em\relax}% +\def\frontmatter@above@affiliation{}% +\def\frontmatter@above@affiliation@script{}% +\def\frontmatter@affiliationfont{\centering\itshape}% +\def\frontmatter@RRAP@format{\centering\large}% +\def\frontmatter@preabstractspace{1.5em}% +% \end{macrocode} +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \begin{macrocode} +\long\def\frontmatter@footnotetext{% + \expandafter\expandafter + \expandafter\footnotetext + \expandafter\expandafter + \expandafter[% + \expandafter\the\csname c@\@mpfn\endcsname]% +}% +\def\and@space{\\}% +\def\andname{and}% +% \end{macrocode} +% Implement the feature of the article class whereby there is a default \cmd\@date, left over +% from the \LaTeX\ kernel. +% This package does not have a default date. The user must put in an explicit command, like +% \cmd\date\arg{\cmd\today}, which will retore \LaTeX's default behavior. +% +% What if the abstract environment falls after the \cmd\maketitle\ command? +% The environment will be undefined; the user will have to deal with this. +% \begin{macrocode} +% \end{macrocode} +% End of the package. +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \Finale +% %Here ends the programmer's documentation. +% \endinput +% +\endinput +%%EOF diff --git a/texmf/source/latex/revtex/ltxgrid.dtx b/texmf/source/latex/revtex/ltxgrid.dtx new file mode 100644 index 0000000..6d0c659 --- /dev/null +++ b/texmf/source/latex/revtex/ltxgrid.dtx @@ -0,0 +1,6849 @@ +% \iffalse meta-comment balanced on line 109 +% ltxgrid.dtx: package to change page grid, MVL. +% Copyright (c) 2009 Arthur Ogawa +% +% Disclaimer +% This file is distributed WITHOUT ANY WARRANTY; +% without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +% License +% You may distribute this file under the conditions of the +% LaTeX Project Public License 1.3c or later +% (http://www.latex-project.org/lppl.txt). +% ReadMe +% For the documentation and more detailed instructions for +% installation, typeset this document with \LaTeX. +% Maintenance Status +% This work has the LPPL maintenance status "maintained"; +% Current Maintainer of this work is Arthur Ogawa +% changes for version 4.2d and 4.2e by Phelype Oleinik. +% +% This work consists of the main source file ltxgrid.dtx +% and the derived files +% ltxgrid.sty, ltxgrid.pdf +% Distribution: +% CTAN:macros/latex/contrib/revtex/ +% +% Unpacking: +% tex ltxgrid.dtx +% +% Documentation: +% latex ltxgrid.dtx; ... +% +% Programm calls to get the documentation (example): +% pdflatex ltxgrid.dtx +% makeindex -s gind.ist ltxgrid +% makeindex -s gglo.ist -o ltxgrid.gls ltxgrid.glo +% pdflatex ltxgrid.dtx +% makeindex -s gind.ist ltxgrid.idx +% pdflatex ltxgrid.dtx +% +% Installation: +% TDS:doc/latex/revtex/ +% TDS:tex/latex/revtex/ +% TDS:source/latex/revtex/ +% +% Thanks, Heiko! +% This method of letting a single .dtx file serve as both +% documentation (via latex) and installer (via tex) follows +% the example of Heiko Oberdiek. Thanks! +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase + 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi + \relax +\else + \csname fi\endcsname +%</ignore> +%<*install> +%% This file will generate documentation and runtime files +%% from ltxgrid.dtx when run through LaTeX or TeX. +\input docstrip +\preamble + +This is a generated file; +altering it directly is inadvisable; +instead, modify the original source file. +See the URL in the file README-LTXGRID.tex. + +License + You may distribute this file under the conditions of the + LaTeX Project Public License 1.3c or later + (http://www.latex-project.org/lppl.txt). + + This file is distributed WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. + +\endpreamble +\askforoverwritefalse +\keepsilent + \generate{% + %{ignore} +% \usedir{tex/latex/revtex}% + \file{ltxgrid.sty}{% + \from{ltxgrid.dtx}{package,kernel}% + }% + }% +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation, please move} +\Msg{* ltxgrid.sty} +\Msg{* into a directory searched by TeX;} +\Msg{* in a TDS-compliant installation:} +\Msg{* texmf/tex/macros/latex/revtex/.} +\Msg{*} +\Msg{* To produce the documentation, + run ltxgrid.dtx through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% \fi +% +% \GetFileInfo{ltxgrid.dtx} +% +% \iffalse ltxdoc klootch +%<*package> +%%% @LaTeX-file{ +%%% filename = "ltxgrid.dtx", +%%% version = "4.2e", +%%% date = "2020/10/03", +%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net), +%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org), +%%% commissioned by the American Physical Society. +%%% ", +%%% copyright = "Copyright (C) 1999, 2009 Arthur Ogawa, +%%% distributed under the terms of the +%%% LaTeX Project Public License 1.3c, see +%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt +%%% ", +%%% address = "Arthur Ogawa, +%%% USA", +%%% telephone = "", +%%% FAX = "", +%%% email = "mailto colon arthur_ogawa at sbcglobal.net", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, page grid, main vertical list", +%%% supported = "yes", +%%% abstract = "package to change page grid, MVL", +%%% } +%</package> +% \fi +% +% \iffalse ltxdoc klootch +% The following references the \file{README-LTXGRID} file, +% which contains basic information about this package. +% The contents of this file are generated when +% you typeset the programmer's documentation. +% Search on "{filecontents*}{README-LTXGRID}" to locate it. +% \fi\input{README-LTXGRID}% +% +% \subsection{Bill of Materials} +% +% Following is a list of the files in this distribution arranged +% according to provenance. +% +% \subsubsection{Primary Source}% +% One single file generates all. +%\begin{verbatim} +%ltxgrid.dtx +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{latex ltxgrid.dtx}}% +% Typesetting the source file under \LaTeX\ +% generates the readme and the installer. +%\begin{verbatim} +%README-LTXGRID ltxgrid.ins +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{tex ltxgrid.ins}}% +% Typesetting the installer generates +% the package files. +%\begin{verbatim} +%ltxgrid.sty +%\end{verbatim} +% +% \subsubsection{Documentation}% +% The following are the online documentation: +% \begin{verbatim} +%ltxgrid.pdf +% \end{verbatim} +% +% \subsubsection{Auxiliary}% +% The following are auxiliary files generated +% in the course of running \LaTeX: +% \begin{verbatim} +%ltxgrid.aux ltxgrid.idx ltxgrid.ind ltxgrid.log ltxgrid.toc +% \end{verbatim} +% +% \section{Code common to all modules}% +% +% The following may look a bit klootchy, but we +% want to require only one place in this file +% where the version number is stated, +% and we also want to ensure that the version +% number is embedded into every generated file. +% +% Now we declare that +% these files can only be used with \LaTeXe. +% An appropriate message is displayed if +% a different \TeX{} format is used. +% \begin{macrocode} +%<*driver|package> +\NeedsTeXFormat{LaTeX2e}[1995/12/01]% +%</driver|package> +% \end{macrocode} +% As desired, the following modules all +% take common version information: +% \begin{macrocode} +%<kernel&!package&!doc>\typeout{% +%<*package|doc> +\ProvidesFile{% +%</package|doc> +%<*kernel|package|doc> +ltxgrid% +%</kernel|package|doc> +%<*doc> +.dtx% +%</doc> +%<package>.sty% +%<*package|doc> +}% +%</package|doc> +% \end{macrocode} +% +% The following line contains, for once and for all, +% the version and date information. +% By various means, this information is reproduced +% consistently in all generated files and in the +% typeset documentation. +% Give credit where due. +% \begin{macrocode} +%<*doc|package|kernel> +%<version> + [2020/10/03 4.2e page grid package (portions licensed from W. E. Baxter web at superscript.com)]% \fileversion +%</doc|package|kernel> +%<kernel&!package&!doc>}% +% \end{macrocode} +% +% +% \section{The driver module \texttt{doc}} +% +% This module, consisting of the present section, +% typesets the programmer's documentation, +% generating the \file{.ins} installer and \file{README-LTXGRID} as required. +% +% Because the only uncommented-out lines of code at the beginning of +% this file constitute the \file{doc} module itself, +% we can simply typeset the \file{.dtx} file directly, +% and there is thus rarely any need to +% generate the ``doc'' {\sc docstrip} module. +% Module delimiters are nonetheless required so that +% this code does not find its way into the other modules. +% +% The \enve{document} command concludes the typesetting run. +% +% \begin{macrocode} +%<*driver> +% \end{macrocode} +% +% \subsection{The Preamble} +% The programmers documentation is formatted +% with the \classname{ltxdoc} class with local customizations, +% and with the usual code line indexing. +% \begin{macrocode} +\documentclass{ltxdoc} +\RequirePackage{ltxdocext}% +\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}% +%\ifx\package@font\@undefined\else +% \expandafter\expandafter +% \expandafter\RequirePackage +% \expandafter\expandafter +% \expandafter{% +% \csname package@font\endcsname +% }% +%\fi +\CodelineIndex\EnableCrossrefs % makeindex -s gind.ist ltxgrid +\RecordChanges % makeindex -s gglo.ist -o ltxgrid.gls ltxgrid.glo +% \end{macrocode} +% +% \subsubsection{Docstrip and info directives} +% We use so many {\sc docstrip} modules that we set the +% \texttt{StandardModuleDepth} counter to 1. +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% The following command retrieves the date and version information +% from this file. +% \begin{macrocode} +\expandafter\GetFileInfo\expandafter{\jobname.dtx}% +% \end{macrocode} +% +% \subsection{The ``Read Me'' File} +% As promised above, here is the contents of the +% ``Read Me'' file. That file serves a double purpose, +% since it also constitutes the beginining of the +% programmer's documentation. What better thing, after +% all, to have appear at the beginning of the +% typeset documentation? +% +% A good discussion of how to write a ReadMe file can be found in +% Engst, Tonya, ``Writing a ReadMe File? Read This'' +% \emph{MacTech} October 1998, p. 58. +% +% Note the appearance of the +% \cmd\StopEventually\ command, which marks the +% dividing line between the user documentation +% and the programmer documentation. +% +% The usual user will not be asked to +% do a full build, not to speak +% of the bootstrap. +% Instructions for carrying these processes +% begin the programmer's manual. +% +% \begin{macrocode} +\begin{filecontents*}{README-LTXGRID} +\title{% + A \LaTeX\ Package for changing the page grid and MVL% + \thanks{% + This file has version number \fileversion, + last revised \filedate.% + }% + \thanks{% + Version \fileversion\ \copyright\ 2019--2020 American Physical Society + }% +}% +\author{% + Arthur Ogawa% + \thanks{\texttt{mailto:arthur\_ogawa at sbcglobal.net}}% +}% +%\iffalse +% For version number and date, +% search on "\fileversion" in the .dtx file, +% or see the end of the README-LTXGRID file. +%\fi +\maketitle + +This file embodies the \classname{ltxgrid} package, +the implementation and its user documentation. + +The distribution point for this work is +\url{journals.aps.org/revtex}, +which contains the REV\TeX\ package, and includes source and documentation for this package. + +The \classname{ltxgrid} package was commissioned by the American Physical Society +and is distributed under the terms of the \LaTeX\ Project Public License 1.3c, +the same license under which all the portions of \LaTeX\ itself is distributed. +Please see \url{http://ctan.tug.org/macros/latex/base/lppl.txt} for details. + +To use this document class, you must have a working +\TeX\ installation equipped with \LaTeXe\ +and possibly pdftex and Adobe Acrobat Reader or equivalent. + +To install, retrieve the distribution, +unpack it into a directory on the target computer, +into a location in your filesystem where it will be found by \LaTeX; +in a TDS-compliant installation this would be: +\file{texmf/tex/macros/latex/revtex/.} + +To use, read the user documentation \file{src/ltxgrid.pdf}. + +\tableofcontents + +\section{Processing Instructions} + +The package file \file{ltxgrid.sty} +is generated from this file, \file{ltxgrid.dtx}, +using the {\sc docstrip} facility of \LaTeX +via |tex ltxgrid.dtx|. +The typeset documentation that you are now reading is generated from +this same file by typesetting it with \LaTeX\ or pdftex +via |latex ltxgrid.dtx| or |pdflatex ltxgrid.dtx|. + +\subsection{Build Instructions} + +You may bootstrap this suite of files solely from \file{ltxgrid.dtx}. +Prepare by installing \LaTeXe\ (and either tex or pdftex) on your computer, +then carry out the following steps: +\begin{enumerate} +\item +Within an otherwise empty directory, +typeset \file{ltxgrid.dtx} with \TeX\ or pdftex; +thereby generating the package file \file{ltxgrid.sty}. + +\item +Now typeset \file{ltxgrid.dtx} with \LaTeX\ or pdflatex; +you will obtain the typeset documentation you are now reading, +along with the file \file{README-LTXGRID}. + +Note: you will have to run \LaTeX\ twice, then \file{makeindex}, then +\LaTeX\ again in order to obtain a valid index and table of contents. + +\item +Install the following files into indicated locations within your +TDS-compliant \texttt{texmf} tree (you may need root access): +\begin{itemize} +\item +\file{$TEXMF/}\file{tex/}\file{latex/}\file{revtex/}\classname{ltxgrid.sty} +\item +\file{$TEXMF/}\file{source/}\file{latex/}\file{revtex/}\classname{ltxgrid.dtx} +\item +\file{$TEXMF/}\file{doc/}\file{latex/}\file{revtex/}\classname{ltxgrid.pdf} +\end{itemize} +where \file{TEXMF/} stands for \file{texmf-local/}, or some other \texttt{texmf} tree in your installation. +\item +Run \texttt{mktexlsr} on directory \file{$TEXMF/} (you may need root access). +\item +Build and installation are now complete; +now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble! +(Note: \texttt{ltxgrid} requires package \texttt{ltxutil}.) +\end{enumerate} + +\subsection{Change Log} +\changes{4.0a}{2001/06/18}{Introduce \cs{marry@height} } +\changes{4.0a}{2001/06/18}{Introduce \cs{set@marry@height} } +\changes{4.0a}{2008/06/26 }{\cs{@yfloat}: de-fang \cs{set@footnotewidth} (see ltxutil.dtx): we have already done its job. } +\changes{4.1a}{2008/06/29}{Change \cs{LT@array@new}: restore \cs{@tabularcr} and \cs{@xtabularcr}} +\changes{4.1a}{2008/06/29}{Change \cs{LT@array@new}: set \cs{LT@LL@FM@cr} to \cs{@arraycr@array} instead of \cs{@arraycr}} +\changes{4.1a}{2008/06/29}{Repair error in \cs{endlongtable@new} involving \cs{@ifx}: argument not delimited.} +\changes{4.1b}{2008/08/04}{Get rid of the \cs{reserved@a} idiom} +\changes{4.1b}{2008/08/04}{Turn off the \cs{set@footnotewidth} mechanism; a float `knows' its proper typesetting context} +\changes{4.1b}{2008/08/04}{(AO, 452) Support length checking: show size of shipped out text.} +\changes{4.1b}{2008/08/04}{(AO, 456) Compatibility with other packages that override the output routine, following suggestion by David Kastrup.} +\changes{4.1b}{2008/08/04}{} +\changes{4.1b}{2008/08/04}{Box \cs{footbox} changed to box \cs{footsofar}} +\changes{4.1b}{2008/08/04}{Change \cs{@combinepage} to \cs{@combinepage} with argument} +\changes{4.1b}{2008/08/04}{Change \cs{@makecol} to \cs{@makecolumn} with argument} +\changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +\changes{4.1b}{2008/08/04}{New procedure \cs{@iffpsbit} replaces \cs{@getfpsbit}} +\changes{4.1b}{2008/08/04}{New procedure \cs{@output@combined@page}} +\changes{4.1b}{2008/08/04}{New procedure for showing a box contents, \cs{trace@box}} +\changes{4.1b}{2008/08/04}{Procedure \cs{@outputpage@head} headpatches \cs{@outputpage}}% +\changes{4.1b}{2008/08/04}{Procedure \cs{@outputpage@tail} tailpatches \cs{@outputpage}}% +\changes{4.1b}{2008/08/04}{Procedure \cs{balance@2} defined more transparently}% +\changes{4.1b}{2008/08/04}{Tally the height of the float} +\changes{4.1b}{2008/08/04}{Use \cs{document@inithook} instead of \cs{AtBeginDocument}} +\changes{4.1b}{2008/08/04}{Use \cs{trace@box} instead of \cs{showbox}} +\changes{4.1f}{2009/07/07}{(AO, 515) Prevent line numbering within a footnote} +\changes{4.1f}{2009/07/10}{(AO, 518) Tally register overflow when locument is long} +\changes{4.1f}{2009/07/14}{(AO, 519) \cs{footins} content must be preserved and reintegrated} +\changes{4.1f}{2009/07/15}{(AO, 519) Preserve footnotes that are in \cs{footsofar} across a page grid change} +\changes{4.1g}{2009/10/06}{(AO, 531) Fix package \classname{float} } +\changes{4.1n}{2009/12/02}{Restore the \cs{lastbox} if it is not a footnote} +\changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +\changes{4.1n}{2009/12/18}{(AO, 571) Deconstruct balanced footnotes when needed} +\changes{4.1n}{2010/01/02}{(AO, 571) Interface \cs{set@footnotewidth} for determining the set width of footnotes}% +\changes{4.1n}{2010/01/02}{(AO, 571) Footnotes, when columns are balanced or when they are composed with their column}% +\changes{4.1n}{2010/01/02}{(AO, 571) Abandon \cs{recover@footins} in favor of \cs{recover@column}}% +\changes{4.1n}{2010/01/02}{(AO, 571) Use procedures \cs{output@do@prep} and \cs{output@column@do} as dispatchers} +\changes{4.1n}{2010/01/02}{(AO, 571) coding convention: use \cs{bgroup}, \cs{egroup} (instead of braces) when a box is being built}% +\changes{4.1n}{2010/01/02}{(AO, 571) calling sequence of \cs{combine@foot@inserts} and \cs{grid@column} to expose box registers; that of \cs{append@column@} its column counters}% +\changes{4.1n}{2010/01/02}{(AO, 571) footnote rule is leaders, so that it may be removed by \cs{vsplit}; mechanism of \cs{kern} signals to indicate footnote height}% +\changes{4.1o}{2010/02/02}{(AO, 576) Allow \classname{lscape} to act on \cs{@outputbox} at the right time}% +\changes{4.1p}{2010/02/24}{(AO, 583) Provide setup code also for footnotes in a one-column document}% +\changes{4.2a}{2018/12/12}{(MD) Updated name of README file and use standard fonts when typesetting}% +\changes{4.2d}{2020/09/19}{(PHO) Adapt \cs{document} and \cs{enddocument} hooks to the 2020-10-01 \LaTeX{} release.}% +\changes{4.2d}{2020/09/30}{(PHO) Correct \cs{@normalcr} patch for \LaTeX{} 2020-02-02 and later.}% +\end{filecontents*} +% \end{macrocode} +% +% \subsection{The Document Body} +% +% Here is the document body, containing only a +% \cmd\DocInput\ directive---referring to this very file. +% This very cute self-reference is a common \classname{ltxdoc} idiom. +% \begin{macrocode} +\begin{document}% +\def\revtex{REV\TeX}% +\expandafter\DocInput\expandafter{\jobname.dtx}% +\end{document} +%</driver> +% \end{macrocode} +% +% \section{Using this package} +% Once this package is installed on your filesystem, you can employ it in +% adding functionality to \LaTeX\ by invoking it in your document or document class. +% +% \subsection{Invoking the package} +% In your document, you can simply call it up in your preamble: +% \begin{verbatim} +%\documentclass{book}% +%\usepackage{ltxgrid}% +%\begin{document} +%<your document here> +%\end{document} +% \end{verbatim} +% However, the preferred way is to invoke this package from within your +% customized document class: +% \begin{verbatim} +%\NeedsTeXFormat{LaTeX2e}[1995/12/01]% +%\ProvidesClass{myclass}% +%\LoadClass{book}% +%\RequirePackage{ltxgrid}% +%<class customization commands> +%\endinput +% \end{verbatim} +% +% Note that this package requires the features of the \classname{ltxutil} package, +% available at +% \url{publish.aps.org/revtex}. +% +% Once loaded, the package gives you acccess to certain procedures, +% usually to be invoked by a \LaTeX\ command or environment, but not at the document level. +% +% \subsection{Changing the page grid}% +% This package provides two procedures, \cmd\onecolumngrid, \cmd\twocolumngrid, +% that change the page grid (it can be extended to more columns and to other page grids). +% +% They differ from standard \LaTeX's \cmd\onecolumn\ and \cmd\twocolumn\ commands in that +% they do not force a page break. Also, upon leaving a multiple-column grid, the columns are balanced. +% In other respects they work same. +% +% They differ from the grid-changing commands of Frank Mittelbach's \classname{multicol} package +% in that they allow floats of all types (single- and double column floats, that is) and +% preserve compatability with the \classname{longtable} package. +% +% These commands must be issued in vertical mode (conceivably via a \cmd\vadjust) such that +% they are ultimately present in the MVL, where they can do their work. +% Because they do not work in \LaTeX's left-right mode, they are unsuitable at the +% document level. +% Furthermore, packaging a grid command in a \cmd\vadjust, although possible, will probably +% not acheive satisfactory page layout. +% +% Page grid commands are not intended to be issued unnecessarily: only the first of +% two successive \cmd\onecolumngrid\ commands is effective; the second will be silently ignored. +% +% \DescribeMacro\onecolumngrid +% You command \LaTeX\ to return to the one-column grid with the +% \cmd\onecolumngrid\ command. If you are already in the one-column grid, this +% is a no-op. The one-column grid is considered special of all page grids, in that +% no portion of the page is held back (in \cmd\pagesofar); all items that might go +% on the current page (with the exception of floats and footnotes) are on the MVL. +% +% \DescribeMacro\twocolumngrid +% You command \LaTeX\ to return to the two-column grid with the +% \cmd\twocolumngrid\ command. If you are already in the two-column grid, this +% is a no-op. +% +% These two commands should be issued by a macro procedure that can ensure that +% \TeX\ is in outer vertical mode. +% +% \subsection{Changing the MVL}% +% +% This package also provides commands to modify the main vertical list (MVL) in a safe way. +% The scheme here is to structure, insofar possible, \TeX's MVL as follows: +%\begin{quotation} +%box or boxes\\ +%penalty\\ +%glue +%\end{quotation} +% This should be a familiar sequence. It is the prototype sequence for a vertical list, +% and is followed when \TeX\ breaks paragraphs into lines, and when \TeX\ generates +% a display math equation. +% +% If you (as a macro programmer) wish to modify the value of the penalty or glue item, +% you can use one of the MVL-altering commands to do so. Certain operations are implemented +% here; you can make up your own. +% +% Note that these commands must be issued in vertical mode, perhaps via a \cmd\vadjust\ or a \cmd\noalign. +% They can work directly if you are in inner mode (say within a parbox or a minipage). +% +% \DescribeMacro\removestuff +% You instruct \LaTeX\ to remove both the penalty and the glue item with this command. +% +% \DescribeMacro\addstuff +% You issue the \cmd\addstuff\arg{penalty}\arg{glue} command to add a penalty, glue, or both. +% If you do not wish to add one or the other, the corresponding argument should be nil. +% Note that the effect of \cmd\addstuff\ is to stack the penalties and glue items. +% Therefore, the lesser of the two penalties takes effect, +% and the two glue items add together. +% +% \cmd\addstuff\ is limited because once applied, it cannot be applied again with correct results. +% +% \DescribeMacro\replacestuff +% The \cmd\replacestuff\ command is syntactically the same as \cmd\addstuff, but works +% differently: the existing penalty and glue are replaced or modified. +% +% The specified penalty is not inserted if the existing penalty is greater than 10000 +% (that is, in case of a \cmd\nobreak), otherwise, the lower (non-zero) of the two penalties is inserted. +% +% If the specified glue has a larger natural component than the existing glue, we replace the glue. +% However, if the specified glue's natural component is negative, then the existing glue's natural component is +% changed by that amount. +% +% \cmd\replacestuff\ can be applied mutiple times bceause it retains the list structure in the canonical form. +% +% Note that we treat two penalties specially (as does \TeX): a penalty of 10000 is considered +% a garbage value, to be replaced if found. This is the signal value that \TeX\ inserts on +% the MVL replacing the penalty that caused the page break (if the page break occurred at a penalty). +% Also, a penalty of zero is indistinguishable from no penalty at all, so it will always +% be replaced by the given value. +% +% Therefore, it is highly recommended to never set any of \TeX's penalty parameters to +% zero (a value of, say, 1, is practically the same), nor should a skip parameter be set to zero +% (instead, use, say, 1sp). Also, to prevent a pagebreak, do not use a penalty of 10000, use, say +% 10001 instead. +% +% You can define your own construct that modifies the MVL: +% Define a command, say, \cmd\myadjust, as follows: +%\begin{verbatim} +%\def\myadjust#1{\noexpand\do@main@vlist{\noexpand\@myadjust{#1}}\@tempa}% +%\end{verbatim} +% that is, \cmd\myadjust\ invokes \cmd\do@main@vlist, passing it the procedure name +% \cmd\@myadjust\ along with the arguments thereof pre-expanded. +% Next, define the procedure \cmd\@myadjust: +%\begin{verbatim} +%\def\@myadjust#1{<meddle with the MVL>}% +%\end{verbatim} +% when \cmd\@myadjust\ executes, you will be in the output routine (in inner vertical mode) +% and the MVL will be that very vertical list. +% +% +% +% +% \section{Compatability with \LaTeX's Required Packages} +% Certain packages, usually ones written by members of the +% \LaTeX\ Project itself, have been designated ``required'' and +% are distributed as part of standard \LaTeX. +% These packages have been placed in a priviledged position +% vis \'a vis the \LaTeX\ kernel in that they override the definitions of certain kernel macros. +% +% Compatability between \classname{ltxgrid} and these packages is complicated +% by a number of factors. First is that \classname{ltxgrid} alters the meaning of some of the same +% kernel macros as certain of the ``required'' packages. +% Second is that fact that certain of the ``required'' packages of \LaTeX\ are incompatible with +% each other. +% +% Examples of the first kind are the \classname{ftnright}, \classname{multicol}, and \classname{longtable} +% packages. +% The \classname{ltxgrid} package is not compatible with \classname{multicol}, +% but if you are using \classname{ltxgrid}, you do not need to use \classname{ftnright} or \classname{multicol} +% anyway. The \classname{ltxgrid} package does however attempt to be compatible with \classname{longtable}. +% +% Among the ``required'' packages that are mutually incompatible are \classname{multicol} and \classname{longtable}, +% the incompatibility arising because both packages replace \LaTeX's output routine: +% if one package is active, the other must not be so. +% This state of affairs has remained essentially unchanged since the introduction of the two as \LaTeX2.09 packages in the late 1980s. +% +% The reason that \classname{ltxgrid} can remain compatible with \classname{longtable} is due to the +% introduction of a more modern architecture, the ``output routine dispatcher'', which allows all macro packages access to the +% safe processing environment of the output routine, on an equal footing. +% The relevant portions of the \classname{longtable} package are reimplemented in \classname{ltxgrid} +% to take advantage of this mechanism. +% +% Timing is critical: +% the \classname{ltxgrid} package will be incompatible with any package that +% redefines any of the kernel macros that \classname{ltxgrid} patches---if that +% package is loaded \emph{after} \classname{ltxgrid}. +% +% Hereinafter follows some notes on specific \LaTeX\ packages. +% +% \subsection{ftnright} +% Frank Mittelbach's \classname{ftnright} package effects a change to \LaTeX's +% \cmd\twocolumn\ mode such that footnotes are set at the bottom of the right-hand +% column instead of at the foot of each of the two columns. +% +% Note that it overwrites three \LaTeX\ kernel macros: \cmd\@outputdblcol, \cmd\@startcolumn, and \cmd\@makecolumn. +% Fortunately none of the three are patched by \classname{ltxgrid}, so that compatability +% is not excluded on this basis. +% +% At the same time, it changes the meaning of \cmd\footnotesize, the macro that is automatically +% invoked when setting a document's footnote into type. +% One might well argue that it is an error for the meaning of \cmd\footnotesize\ to be determined by +% a package such as \classname{ftnright}, that indeed such a choice should be made in the +% document class, or in a file such as \file{bk10.clo}. +% +% To avoid being tripped up by this misfeature in \classname{ftnright}, it is only necessary to +% reassert our meaning for \cmd\footnotesize\ later on, after \classname{ftnright} has been loaded. +% +% Note that \classname{ftnright} inserts code that demands that \LaTeX's flag \cmd\if@twocolumn\ +% is true, that is, it will complain if deployed in a \cmd\onecolumn\ document. +% It is therefore necessary for any other multicolumn package to assert that flag in order to +% avoid this package's complaint. It is an interesting question exactly why this package has +% this limitation. After all, a one-column page grid is just a degenerate case of the +% two column. +% +% \subsection{longtable} +% David Carlisle's \classname{longtable} package sets tables that can be so long as to break over pages. +% According to its author, it uses the same override of \LaTeX's output routine as +% Frank Mittelbach's \classname{multicol} package. By implication, then, it has a hard +% incompatability with the latter. +% +% The \classname{longtable} package also performs a check of whether the document is in +% \cmd\twocolumn\ mode, and declines to work if this is the case. It is not clear, however, +% that there is any true incompatability present if so. It's just that David did not see any reason +% anyone would want to set such long tables in a multicolumn document, hence the check. +% +% There does not appear to be any indication that \classname{longtable} would work less +% well under \classname{ltxgrid} than under standard \LaTeX's \cmd\twocolumn\ mode. +% Therefore, this \classname{ltxgrid} patches \classname{longtable} (if loaded) so as to provide +% compatability. In the course of which, \classname{longtable} becomes more robust +% (\classname{longtable} has mumerous bugs and incompatabilities of long standing, +% some of which are repaired by \classname{ltxgrid}). +% +% One problem remains, namely that, if a \env{longtable} environment breaks over columns +% and thereby inserts its special headers and footers at that break, and those columms are then +% balanced (due to a return to the one-column page grid), then those inserted rows +% will remain, and may no longer fall at the column break. This will, of course look +% wrong. +% +% The only way to fix this problem is to avoid doing column balancing in the way +% I have implemented here; such an enhancement to this package is possible. +% +% \subsection{multicol} +% Frank Mittelbach's \classname{multicol} package provides a page grid with many columns, +% albeit denies the placement of floats in individual columns. +% +% It establishes its own \cmd\output\ routine, which is the reason it runs afoul of +% the \classname{longtable} package. On the other hand, \classname{ltxgrid} specifically +% allows for the case where a package installs its own \cmd\output\ routine, so +% there is no incompatability on that basis. +% +% Still, it is pointless to use \classname{multicol} if you are using \classname{ltxgrid}, +% since both packages provide multicolumn page layouts. +% Therefore, \classname{multicol} is not supported by \classname{ltxgrid}. +% +% \subsection{ltxgrid} +% It has been pointed out that one of the disadvantages of adopting the \classname{ltxgrid} package is that +% it does alter the \LaTeX\ kernel. +% Any package that itself alters the \LaTeX\ kernel may be incompatible with \classname{ltxgrid}, and new packages +% (destined perhaps to become part of the successor to \LaTeXe) may break \classname{ltxgrid}. +% +% The consequence is that packages introduced in future, and future changes to \LaTeX\ may be incompatible +% with \classname{ltxgrid}. +% This is, of course, true. +% The development plan for \classname{ltxgrid} is that when such packages and \LaTeX\ kernel changes come about, +% the burden will be on \classname{ltxgrid} to change in a way that provides for continued compatability with +% those packages and \LaTeX\ kernel changes. +% +% +% \section{How \classname{ltxgrid} places footnotes} +% +% In conventional multicolumn layouts, a footnote will appear at the bottom of the column in which it is called out. +% The \classname{ltxgrid} package implements this conventional layout choice by default. +% However, other choices are possible (a la \classname{ftnright}, whose compatability with \classname{ltxgrid} has not been tested). +% +% One unusual feature of \classname{ltxgrid}'s default implementation must be mentioned, though, +% namely the case in a two-column page grid, where a footnote is followed by a temporary change to the one-column page grid +% (e.g., for a wide equation). +% In such a case, the material above the wide material is split into two columns, and a footnote whose callout +% appears in the right-hand column will nonetheless be set at the base of the left column. +% +% This arrangement was chosen because it ensures that the footnotes at the bottom of any page will appear in +% numerical order. It can be argued that this choice is ``incorrect'', but be that as it may, +% the \classname{ltxgrid} package does not foreclose on other arrangements for the footnotes. +% The package can be adapted to accomodate any page design desired. +% +% \section{Limitations in \classname{ltxgrid}'s default column balancing method}% +% +% In a multicolumn page grid, when encountering a page that is not completely full, +% it is customary to set the material in balanced columns (typically with the last column no longer than any of the others). +% Such a case also crops up when temporarily interrupting the multicolumn grid to set material on the full width of the page: +% the material on the page above the break is customarily set in balanced columns. +% +% An awkward case arises when we have already set one or more complete columns of type before encountering the need to +% balance columns. In this subset of cases, the default in \classname{ltxgrid} is to +% do an operation I call ``re-balancing'': +% the material on the page so far is pasted back together into a single column, and new, balanced column breaks are +% calculated. +% +% This scheme typically works fine, but it has a significant vulnerability: +% any discardable items trimmed at the original column break are lost, never to be retrieved. +% Consequently, after re-balancing, an element like, say, a section head can fail to have the correct amount of whitespace above. +% +% This problem is due to an unfortunate optimization in \TeX, wherein a certain class of nodes is trimmed from the +% top of main vertical list upon returning from the output routine: +% any penalty, glue, or leader node falls in to this class of discardable nodes, +% and trimming proceeds until a non-discardable node (such as a box, or rule) is encountered. +% It gets better: a third class of nodes is transparent to this trimming process; +% they are neither discarded nor do they halt the process of trimming: +% mark nodes and all whatsits fall into this class of transparent nodes; +% they are quietly passed over during trimming. +% +% An alternative approach for \TeX\ to take would have been, +% rather than discarding the node entirely, to simply \emph{mark} it as discarded. +% (Implementors of extended \TeX, please note!) +% Then, upon shipping out, such nodes would not make it into the DVI. +% \TeX's optimization, driven by the small computer architectures current when it was developed, +% does save mem, but at the cost of revisiting page breaks in a reliable way. +% +% FIXME: how to fix a column break in the above case? Widetext? +% +%\StopEventually{} +% +% \section{Implementation of package} +% +% Special acknowledgment: this package uses concepts pioneered +% and first realized by William Baxter (mailto:web at superscript.com) +% in his SuperScript line of commercial typesetting tools, and +% which are used here with his permission. His thorough understanding +% of \TeX's output routine underpins the entire \classname{ltxgrid} +% package. +% +% \subsection{Beginning of the \file{ltxgrid} {\sc docstrip} module} +% Requires the underpinnings of the \classname{ltxkrnext} package. +% \begin{macrocode} +%<*package> +\def\package@name{ltxgrid}% +\expandafter\PackageInfo\expandafter{\package@name}{% + Page grid for \protect\LaTeXe, + by A. Ogawa (arthur_ogawa at sbcglobal.net)% +}% +\RequirePackage{ltxutil}% +%</package> +% \end{macrocode} +% +% \subsection{Banner}% +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% \subsection{Sundry}% +% Here are assorted macro definitions. +% \begin{macro}{\lineloop} +% \begin{macro}{\linefoot} +% The (document-level) command \cmd\lineloop\ sets numbered lines until the +% specified count is reached. +% The command \cmd\linefoot\ sets a single, automatically numbered line, but with a footnote (with the specified label); +% it automatically increments the line counter. +% These commands are typically used to construct test documents. +% +% Because the counter is globally advanced and never reset, successive +% calls to \cmd\lineloop\ should have an argument ever larger. +% The formatted output will have each line labeled with its ordinal number. +% \begin{macrocode} +\newcounter{linecount} +\def\loop@line#1#2{% + \par + \hb@xt@\hsize{% + \global\advance#1\@ne + \edef\@tempa{\@ifnum{100>#1}{0}{}\@ifnum{10>#1}{0}{}\number#1}% + \@tempa\edef\@tempa{\special{line:\@tempa}}\@tempa + \vrule depth2.5\p@#2\leaders\hrule\hfil + }% +}% +\def\lineloop#1{% + \loopwhile{\loop@line\c@linecount{}\@ifnum{#1>\c@linecount}}% +}% +\def\linefoot#1{% + \loop@line\c@linecount{% + \footnote{% + #1\special{foot:#1}\vrule depth2.5\p@\leaders\hrule\hfill + }% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Mark Components}% +% +% Override LaTeX's mark macros to allow more components. +% +% We remain bound by the weakness of LaTeX's scheme in that +% one cannot emulate the action of \TeX\ whereby +% material with marks can be inserted in the middle of +% a vertical list such that the marks are reliably calculated. +% If we did that, \cmd\@themark\ would no longer be utilized. +% +% A more robust scheme involves placing all marks (component and value) +% into a list (using global scoping, i.e., \cmd\gdef), +% and using \cmd\@@mark to place an index on that list into the MVL. +% Then, e.g., \cmd\@@botmark signifies the place where that list is to be cut, +% and the \cmd\botmark\ of any component is +% the value of the last element of the cut +% list having the given component. The \cmd\firstmark\ and \cmd\topmark\ +% can likewise be defined relative to \cmd\@@firstmark\ and \cmd\@@topmark, +% except in the latter case, we want the first following the cut instead of the last +% preceding the cut. +% +% The limitation of this scheme is its demands upon \TeX's mem. +% The list of marks would need to be trimmed back to, effectively, +% \cmd\topmark\ at the beginning of every page. +% +% This approach is not yet part of the extended LaTeX kernel. +% +% \begin{macro}{\@@mark} +% \begin{macro}{\@@topmark} +% \begin{macro}{\@@firstmark} +% \begin{macro}{\@@botmark} +% \begin{macro}{\@@splitfirstmark} +% \begin{macro}{\@@splitbotmark} +% Remember primitives under a new set of names. +% \begin{macrocode} +\let\@@mark\mark +\let\@@topmark\topmark +\let\@@firstmark\firstmark +\let\@@botmark\botmark +\let\@@splitfirstmark\splitfirstmark +\let\@@splitbotmark\splitbotmark +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Procedures that expose the component data structure}% +% This portion of the code exposes the internal representation of +% the mark components. If we wish to add more components, we will have to revise +% these macro definitions: +% \cmd\@themark, +% \cmd\nul@mark, +% \cmd\set@mark@netw@, +% \cmd\set@marktw@, +% \cmd\set@markthr@@, +% \cmd\get@mark@@ne, +% \cmd\get@mark@tw@, +% \cmd\get@mark@thr@@, +% \cmd\get@mark@f@ur. +% +% \begin{macro}{\@themark} +%FIXME: is it safer to eliminate \cmd\@themark\ in favor of a message that evaluates \cmd\@@botmark? +% +% Note: these definitions expose the data structure of mark components. +% \begin{macrocode} +\def\@themark{{}{}{}{}}% +\def\nul@mark{{}{}{}{}\@@nul}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@mark@netw@} +% \begin{macro}{\set@marktw@} +% \begin{macro}{\set@markthr@@} +% These procedures insert the new value of a particular mark component into the given argument. +% They expose the data structure of mark components. +% +% \begin{macrocode} +\def\set@mark@netw@#1#2#3#4#5#6#7{\gdef#1{{#6}{#7}{#4}{#5}}\do@mark}% +\def\set@marktw@#1#2#3#4#5#6{\gdef#1{{#2}{#6}{#4}{#5}}\do@mark}% +\def\set@markthr@@#1#2#3#4#5#6{\gdef#1{{#2}{#3}{#6}{#5}}\do@mark}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\get@mark@@ne} +% \begin{macro}{\get@mark@tw@} +% \begin{macro}{\get@mark@thr@@} +% \begin{macro}{\get@mark@f@ur} +% These procedures retreive the value of a particular mark component. +% They expose the data structure of mark components. +% \begin{macrocode} +\def\get@mark@@ne#1#2#3#4#5\@@nul{#1}% +\def\get@mark@tw@#1#2#3#4#5\@@nul{#2}% +\def\get@mark@thr@@#1#2#3#4#5\@@nul{#3}% +\def\get@mark@f@ur#1#2#3#4#5\@@nul{#4}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Procedures that do not expose the component data structure}% +% +% \begin{macro}{\mark@netw@} +% \begin{macro}{\marktw@} +% \begin{macro}{\markthr@@} +% These procedures insert the new value of a particular mark component into \cmd\@themark, +% then execute \cmd\do@mark. +% They constitute the implementation layer for mark components one, two, and three. +% An analogous procedure for component four could be defined; call it \cmd\markf@ur. +% +% \begin{macrocode} +\def\mark@netw@{\expandafter\set@mark@netw@\expandafter\@themark\@themark}% +\def\marktw@{\expandafter\set@marktw@\expandafter\@themark\@themark}% +\def\markthr@@{\expandafter\set@markthr@@\expandafter\@themark\@themark}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\do@mark} +% \begin{macro}{\do@@mark} +% Access procedures \cmd\mark (AKA \cmd\@@mark). +% The \cmd\do@mark\ procedure is used when a mark is being put down into the MVL; +% \cmd\do@@mark\ when this happens in the output routine. +% \begin{macrocode} +\def\do@mark{\do@@mark\@themark\nobreak@mark}% +\def\do@@mark#1{% + \begingroup + \let@mark + \@@mark{#1}% + \endgroup +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\let@mark} +% \begin{macro}{\nobreak@mark}% +% The procedure that makes \cmd\csname s robust within a mark. +% Use \cmd\appdef\ and \cmd\robust@\ to extend the list. +% \begin{macrocode} +\def\let@mark{% + \let\protect\@unexpandable@protect + \let\label\relax + \let\index\relax + \let\glossary\relax +}% +\def\nobreak@mark{% + \@if@sw\if@nobreak\fi{\@ifvmode{\nobreak}{}}{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Using mark components}% +% +% These procedures use the component mark mechanism to implement +% a mark component that remembers the current environment (used in page makeup) +% and the the two mark components left over from the original \LaTeX. +% The fourth component is presently unused. +% +% \begin{macro}{\mark@envir} +% The third mark component's access procedures. +% The \cmd\mark@envir\ and \cmd\bot@envir\ commands are a good model of how to write +% access procedures for a new mark component. +% \begin{macrocode} +\def\mark@envir{\markthr@@}% +\def\bot@envir{% + \expandafter\expandafter + \expandafter\get@mark@thr@@ + \expandafter\@@botmark + \nul@mark +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\markboth} +% \begin{macro}{\markright} +% \begin{macro}{\leftmark} +% \begin{macro}{\rightmark} +% Set procedures for legacy components. +% \begin{macrocode} +\def\markboth{\mark@netw@}% +\def\markright{\marktw@}% +% \end{macrocode} +% +% Retrieval procedures for legacy mark components. +% The procedure for retrieving the first component from \cmd\botmark\ +% and the second component from \cmd\firstmark have names in \LaTeX; +% they are called, respectively, \cmd\leftmark\ and \cmd\rightmark. +% +% It is possible to retrieve the components of \cmd\topmark\ +% as well: use \cmd\saved@@topmark. +% \begin{macrocode} +\def\leftmark{% + \expandafter\expandafter + \expandafter\get@mark@@ne + \expandafter\saved@@botmark + \nul@mark +}% +\def\rightmark{% + \expandafter\expandafter + \expandafter\get@mark@tw@ + \expandafter\saved@@firstmark + \nul@mark +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \subsection{Output Super-routine}% +% +% We want to change \LaTeX's output routine, but do not wish to remain vulnerable +% to interference from such ``required'' packages as +% \classname{multicol} (authored by Frank Mittelbach) +% and \classname{longtable} (authored by David P. Carlisle), which +% swap in their own output routines when the respective package is active. +% +% The better mechanism, used here, is due to William Baxter (web at superscript.com), +% who has allowed his several ideas to be used in this package. +% +% In what follows, we effectively wrap up the old \LaTeX\ output routine inside +% a new, more flexible ``super routine''. When the output routine is called, +% the ``super routine'' acts as a dispatcher. If the old routine is needed, it is called. +% +% If a package attempts to substitute in their own output routine, they will effectively +% be modifying a token register by the name of \cmd\output. +% The primitive \cmd\output\ is now known by a different name, which should no longer be +% necessary to use. +% +% Usage note: to make a visit to the output routine employing the dispatcher, enter +% with a value of \cmd\outputpenalty\ that corresponds to a macro. Defining as follows: +%\begin{verbatim} +%\@namedef{output@10000}{<your code here>}% +%\end{verbatim} +% by convention, your output routine should void out \cmd\box\cmd\@cclv. +% +% In rewriting \LaTeX's output dispatcher +% in a much simpler form, we also avoid the sin of multiple \cmd\shipout s +% within a single visit to the output routine. +% +% Conceptually, we divide visits to the output routine into two classes. +% The first involves natural page breaks +% (at a \cmd\newpage\ or when \cmd\pagetotal $>$ \cmd\pagegoal) +% and usually resulting in \cmd\box\cmd\@cclv\ either being shipped out or +% salted away (e.g., each column in a multicolumn layout). +% We might call this class the ``natural output routines''; the \cmd\outputpenalty\ +% will never be less than $-10000$. +% Furthermore, we ensure that \cmd\holdinginserts\ is cleared when +% calling such routines. +% +% The other class involves a forced visit to the output routine +% via a large negative penalty ($< -10000$). They do not generally +% result in a \cmd\shipout\ of \cmd\box\cmd\@cclv: they may be dead cycles. +% We provide a mechanism (call it a ``one-off'' output routine) that allows +% us to specify certain processing to be done when \TeX\ reaches +% the current position on the page. +% +% One-off output routines themselves fall into two divisions, ones +% that process \cmd\box\cmd\@cclv, and ones that work on the main vertical list (MVL). +% The former are typified by changes to the page grid, perhaps +% even column balancing. +% The latter involve the insertion of penalties or glue and the processing of floats. +% +% The natural output routine is a single procedure. We have not introduced multiple +% natural output routines based on the \cmd\outputpenalty\ because \TeX\ does not +% support such a thing: \TeX\ sometimes lays down a penalty whose value is the sum +% of other penalties. Because of this, we cannot depend on the value of \cmd\outputpenalty\ +% in such areas. +% +% We do introduce flexibility in the form of a mechanism for patching into the +% natural output routine. Three hooks are offered, allowing a procedure +% to prepare for the upcoming visit to the output routine, +% access to \cmd\box\cmd\@cclv, and after doing \cmd\shipout\ (or otherwise +% committing the material to the page). +% +% Environments, commands, and even packages can install their +% own procedures into these hooks. +% For instance, if the longtable package is loaded, it will install +% its procedures, but those procedures will punt if the page break +% being processed does not actually fall within a longtable environment. +% +% \begin{macro}{\primitive@output} +% Here we remember the \TeX\ primitive \cmd\output\ and its value, +% and then proceed to take over the \cmd\csname\ of \cmd\output, +% making it a \cmd\toks\ register and installing the old value of +% the output routine. +% \begin{macrocode} +\let\primitive@output\output +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\output@latex} +% \begin{macro}{\output} +% Grab the tokens in \cmd\the\cmd\output\ (but without the extra set of braces). +% The value of \cmd\toks@\ must remain untouched until loaded into the appropriate token +% register; this is done a few lines below. +% \begin{macrocode} +\long\def\@tempa#1\@@nil{#1}% + \toks@ +\expandafter\expandafter +\expandafter{% +\expandafter \@tempa + \the\primitive@output + \@@nil + }% +\newtoks\output@latex +\output@latex\expandafter{\the\toks@}% +\let\output\output@latex +% \end{macrocode} +% +% A comment on compatibility with other packages that co-opt the output routine. +% +% Somewhere on the LaTeX-L list, David Kastrup has urged macro writers to take over +% the output routine in such a way that others can do likewise. How is this to be +% accomplished? +% +% Consider what the \classname{lineno} package does when it loads. +% \begin{enumerate} +% \item +% It does \cmd\let\ cmd\@tempa\ \cmd\output. +% This has the effect of identifying \cmd\@tempa\ with the +% \cmd\toks\ register we created above to hold the old output routine of \LaTeX. +% Let us say that was \cmd\toks14. +% \item +% \classname{lineno} itself effectively does \cmd\newtoks\ \cmd\@LN@output, +% which assigns that \cmd\csname\ to \cmd\toks 15. +% \item +% It loads \cmd\@LN@output\ with the contents of \cmd\@tempa +% (that is, \cmd\toks14, our copy of \LaTeX's output routine). +% \item +% Then it loads \cmd\@tempa\ with its own desired procedure, +% to be executed at \cmd\output\ time, thereby taking over what it thinks is the output routine, +% but which is in reality the procedure \revtex\ executes when it wants to pass control +% to \LaTeX's original output routine. +% \item +% It then does \cmd\let\ \cmd\output\ \cmd\@LN@output, +% which now identifies \cmd\output\ with \cmd\toks15, the output routine of \classname{lineno}. +% \item +% When the \cmd\output\ routine is triggered, +% the primitive output routine \cmd\primitive@output\ is executed, and if +% appropriate, control is passed to \cmd\output@latex, which \revtex\ had loaded with the old +% \LaTeX\ output routine, but which is presently loaded with that of \classname{lineno}. +% \item +% The output routine of \classname{lineno} is executed, and if appropriate control is passed +% to \cmd\@LN@output, the old output routine of \LaTeX. +% \item +% Furthermore, the \cmd\csname\ \cmd\output\ now points to \cmd\@LN@output\ (\cmd\toks15). +% This means that someone coming in after \classname{lineno} to take over the output routine +% will actually get executed after that of \classname{lineno}, but before \LaTeX. +% \end{enumerate} +% As you can see, the process of taking over the output routine may continue until all of the +% \cmd\toks\ registers have been allocated. +% If, say, \classname{newpackage} would itself like to take over the output routine, +% and if it uses the above set of steps, then when the output routine is triggered, the order +% of execution is \revtex, then \classname{lineno}, then \classname{newpackage}, then \LaTeX. +% Each new package inserts itself on front of \LaTeX. +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dispatch@output} +% \changes{4.1b}{2008/08/04}{(AO, 456) Compatibility with other packages that override the output routine, following suggestion by David Kastrup.} +% We now install our own output routine in place of the original +% output routine of \LaTeX, which is still available as \cmd\the\ \cmd\output. +% +% The output routine is simply the procedure \cmd\dispatch@output. +% It either dispatches to a procedure based on a particular value of +% \cmd\outputpenalty\ or it executes \cmd\the\cmd\output@latex\ tokens. +% \begin{macrocode} +\primitive@output{\dispatch@output}% +\def\dispatch@output{% + \let\par\@@par +% \end{macrocode} +% Try to interpret \cmd\outputpenalty\ as a dispatcher to a message handler, +% its value is, e.g., \cmd\do@startpage@pen. +% \begin{macrocode} + \expandafter\let\expandafter\output@procedure\csname output@\the\outputpenalty\endcsname +% \end{macrocode} +% If we have failed to find a dispatcher, then settle for \cmd\output@latex. +% \begin{macrocode} + \@ifnotrelax\output@procedure{}{% + \expandafter\def\expandafter\output@procedure\expandafter{\the\output@latex}% + }% +% \end{macrocode} +% Now test if the dispatcher is the special case of \cmd\execute@message@pen, in which case execute the \cmd\@message@saved. +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \begin{macrocode} + \expandafter\@ifx\expandafter{\csname output@-\the\execute@message@pen\endcsname\output@procedure}{% + \let\output@procedure\@message@saved + }{}% + \ltxgrid@info@sw{\class@info{\string\dispatch@output}\say\output@procedure\saythe\holdinginserts}{}% + \outputdebug@sw{\output@debug}{}% + \output@procedure +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\set@output@procedure#1#2{% + \count@\outputpenalty\advance\count@-#2% + \expandafter\let\expandafter#1\csname output@\the\count@\endcsname +}% +% \end{macrocode} +% +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% The following procedure is executed at the beginning of each visit to the output routine, +% contingent on the level of diagnostics specified. +% However, it bails out when the visit is part of a tight sequence of visits to the output routine. +% \begin{macrocode} +\def\output@debug{% + \def\@tempa{\save@message}% + \@ifx{\output@procedure\@tempa}{% + \true@sw + }{% + \@ifnum{\outputpenalty=-\save@column@insert@pen}{% + \@ifnum{\holdinginserts>\z@}% + }{% + \false@sw + }% + }% + {}{\output@debug@}% +}% +\def\output@debug@{% +%<ignore> \saythe\inputlineno + \saythe\outputpenalty + \saythe\interlinepenalty + \saythe\brokenpenalty + \saythe\clubpenalty + \saythe\widowpenalty + \saythe\displaywidowpenalty + \saythe\predisplaypenalty + \saythe\interdisplaylinepenalty + \saythe\postdisplaypenalty + \saythe\badness + \say\thepagegrid + \saythe\pagegrid@col + \saythe\pagegrid@cur +%<ignore> \say\bot@envir + \saythe\insertpenalties +%<ignore> \say\@@topmark +%<ignore> \say\saved@@topmark +%<ignore> \say\@@firstmark +%<ignore> \say\saved@@firstmark + \say\@@botmark +%<ignore> \say\saved@@botmark + \saythe\pagegoal + \saythe\pagetotal + \saythe{\badness\@cclv}% + \say\@toplist + \say\@botlist + \say\@dbltoplist + \say\@deferlist + \trace@scroll{% + \showbox\@cclv + \showbox\@cclv@saved + \showbox\pagesofar +% \end{macrocode} +% Klootch! The following line provides only for two-column page grid; if debugging more columns, you must +% add more statements here. +% \begin{macrocode} + \showbox\csname col@1\endcsname + \showbox\footsofar + \showbox\footins + \showbox\footins@saved + \showlists + }% +}% +\@ifxundefined{\outputdebug@sw}{% + \@booleanfalse\outputdebug@sw +}{}% +\def\trace@scroll#1{\begingroup\showboxbreadth\maxdimen\showboxdepth\maxdimen\scrollmode#1\endgroup}% +\def\trace@box#1{\trace@scroll{\showbox#1}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@outputpage} +% \begin{macro}{\@outputpage@head} +% \begin{macro}{\@outputpage@tail} +% \changes{4.1b}{2008/08/04}{Procedure \cs{@outputpage@tail} tailpatches \cs{@outputpage}}% +% \changes{4.1b}{2008/08/04}{Procedure \cs{@outputpage@head} headpatches \cs{@outputpage}}% +% The procedure \cmd\@outputpage\ of standard \LaTeX\ is the sole place where a \cmd\shipout\ is carried out. +% The procedures that build \cmd\@outputbox\ just before a page is shipped out by \cmd\@outputpage\ are: +% \cmd\@makecolumn, +% \cmd\@combinepage, and +% \cmd\@combinedblfloats. +% +% We need to head- and tailpatch this procedure, so we perform here +% the only modifications to that procedure that are essential. +% Elsewhere, we will build up the meanings of \cmd\@outputpage@head\ and \cmd\@outputpage@tail. +% \begin{macrocode} +\prepdef\@outputpage{\@outputpage@head}% +\let\@outputpage@head\@empty +\appdef\@outputpage{\@outputpage@tail}% +\let\@outputpage@tail\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\show@box@size} +% \begin{macro}{\show@text@box@size} +% \begin{macro}{\show@pagesofar@size} +% \begin{macro}{\show@box@size@sw} +% \begin{macro}{\total@text} +% \changes{4.1b}{2008/08/04}{(AO, 452) Support length checking: show size of shipped out text.} +% Procedure \cmd\show@box@size\ is a diagnostic for the sizes of boxes; +% the boolean \cmd\show@box@size@sw\ turns it on and off. +% \begin{macrocode} +\def\show@box@size#1#2{% + \show@box@size@sw{% + \begingroup + \setbox\z@\vbox{\unvcopy#2\hrule}% + \class@info{Show box size: #1^^J% + (\the\ht\z@\space X \the\wd\z@) + \the\c@page\space\space\the\pagegrid@cur\space\the\pagegrid@col + }% + \endgroup + }{}% +}% +% \end{macrocode} +% Procedure \cmd\show@text@box@size\ tallies the size of the indicated column. +% If \cmd\box\ \cmd\pagesofar\ is a factor, then its height has been memorized +% in the depth of the tally box. +% +% \changes{4.1f}{2009/07/10}{(AO, 518) Tally register overflow when locument is long} +% \begin{macrocode} +\def\show@text@box@size{% + \show@box@size{Text column}\@outputbox + \tally@box@size@sw{% + \@ifdim{\wd\@outputbox>\z@}{% + \dimen@\ht\@outputbox\divide\dimen@\@twopowerfourteen + \advance\dimen@-\dp\csname box@size@\the\pagegrid@col\endcsname + \@ifdim{\dimen@>\z@}{% + \advance\dimen@ \ht\csname box@size@\the\pagegrid@col\endcsname + \global\ht\csname box@size@\the\pagegrid@col\endcsname\dimen@ + \show@box@size@sw{% + \class@info{Column: \the\dimen@}% + }{}% + }{}% + }{}% + \global\dp\csname box@size@\the\pagegrid@col\endcsname\z@ + }{}% +}% +% \end{macrocode} +% Take the height of \cmd\box\ \cmd\pagesofar\ into account. +% \begin{macrocode} +\def\show@pagesofar@size{% + \show@box@size{Page so far}\pagesofar + \dimen@\ht\pagesofar\divide\dimen@\@twopowerfourteen + \global\dp\csname box@size@1\endcsname\dimen@ + \show@box@size@sw{% + \class@info{Pagesofar: \the\dimen@}% + }{}% +}% +\@booleanfalse\tally@box@size@sw +\@booleanfalse\show@box@size@sw +\expandafter\newbox\csname box@size@1\endcsname +\expandafter\setbox\csname box@size@1\endcsname\hbox{}% +\expandafter\newbox\csname box@size@2\endcsname +\expandafter\setbox\csname box@size@2\endcsname\hbox{}% +\def\total@text{% + \@tempdima\the\ht\csname box@size@2\endcsname\divide\@tempdima\@twopowertwo\@tempcnta\@tempdima + \@tempdimb\the\ht\csname box@size@1\endcsname\divide\@tempdimb\@twopowertwo\@tempcntb\@tempdimb + \class@info{Total text: Column(\the\@tempcnta pt), Page(\the\@tempcntb pt)}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Further thoughts about inserts} +% +% The only safe way to deal with inserts is to either set \cmd\holdininserts\ or +% to commit to using whatever insert comes your way: you cannot change your mind +% once you see a non-void \cmd\box\cmd\footins, say. +% +% Therefore all output routine processing must proceed with \cmd\holdinginserts\ set +% until you are sure of the material to be committed to the page. At that point, you +% can clear \cmd\holdinginserts, spew \cmd\box\cmd\@cclv, put down the appropriate penalty, +% and exit, with the knowledge that \TeX\ will re-find the same pagebreak, this time +% visiting the output routine with everything, including inserts, in their proper +% place. +% This technique applies to split elements (screens, longtable, index) as well as to +% manufactured pages (float pages and clearpage pages). +% +% Therefore, the output routine must not make assumptions about whether \cmd\holdinginserts\ +% should be cleared; instead this must be left to the one-off output routines or the natural output routine. +% +% If we are manufacturing pages (``float page processing''), and if \cmd\pagegoal\ is not equal to +% \cmd\vsize, then inserts are at hand, and our criterion should take into account the insert +% material, even though we cannot measure its height based on the size of \cmd\box\cmd\footins\ +% (because \cmd\holdinginserts\ is set, you see). +% +% It would be better to take the complement of \cmd\floatpagefraction\ and use that +% as a standard for the looseness of the page. Since \cmd\pagegoal\ reflects the inserted material, +% the criterion becomes the difference of the aggregate height of the floats and the \cmd\pagegoal\ +% versus this "page looseness" standard. +% +% As a check, consider what happens if we bail out: \cmd\@deferlist\ has never been touched, so it +% requires no attention. Also, \cmd\holdinginserts\ has never been cleared, so inserts require +% no attention. So we only have to ensure that marks are preserved, which is already taken +% care of by the message handler mechanism. +% +% If we are doing ordinary page cutting, then the scheme would be to detect whether we are within +% a screen (or longtable as may be), do the adjustment to the page height, and return, but this time +% with \cmd\holdinginserts\ cleared. Upon reentering the output routine, we may or may not be within +% the screen environment, but we are now sure to have a final page break, and we can commit this +% material (by shipping out or by saving it out as a full column). +% +% In the above, the first of the two visits to the output routine is a dead cycle and requires +% propagation of marks, but nothing else. +% +% \subsection{The difference between inserts and floats} +% +% While revisiting this package in 2008, I needed to clarify under what circumstances inserts +% would be added to the \cmd\pagesofar. My conclusion is that I had been treating them +% exactly the same as floats, but that was a mistake. +% +% Floats can be committed at the top of a column, in the middle, or at the bottom. +% Footnotes (the only \cmd\insert\ that is used in \LaTeX) may only be committed at the bottom +% of a column. So, it was necessary to provide two versions of \cmd\@combinepage, one +% that committed \cmd\insert s, and the other that did not, the former used only when +% a column of text was committed. Note that even after a column is committed, we could change our minds: +% for instance if in multicolumn grid and we decide to balance the columns. +% +% +% \subsection{The natural output routine} +% +% Here is the portion of the output routine that fields cases not handled by +% the dispatcher. +% +% The default is to ship out a page and then look around for more material +% that might constitute a ``float page''. However, because \cmd\holdinginserts\ +% is normally set, this output routine must first have a dead cycle and +% come back again with \cmd\holdinginserts\ cleared. +% Then, after shipping out, it puts down a message that +% will manufacture zero or more float pages, finally terminating +% with a procedure that commits floats to a new unfinished page. +% +% To accomodate special processing, we execute hooks whose name is based +% on the value of the "envir" mark component. The default is "document", +% ensured by an initial mark of that value; the associated procedures +% are all nil. Any unknown envir value will "\cmd\relax\ out". +% +% The test made by \cmd\toggle@insert\ tells whether we are on our first visit to +% the output routine (with \cmd\holdinginserts\ still positive), or our second +% (with \cmd\holdinginserts\ zeroed). The output routine will toggle the setting. +% +% The commands \cmd\hold@insertions\ and \cmd\move@insertions\ respectively +% clear and set \cmd\holdinginserts, so this procedure effectively +% clears \cmd\holdinginserts\ just long enough to pick up the insertions. +% Important: any output routine that clears \cmd\holdinginserts\ +% must guarentee that it is restored on the subsequent visit to the output routine. +% Or, to put it another way, if an output routine detects that \cmd\holdinginserts\ +% is cleared, it should take it upon itself to restore it to a positive value before exiting. +% +% The branch with \cmd\holdinginserts\ set is executed first; the other +% branch follows on practically immediately thereafter. In the first branch, +% we simply execute the appropriate hook and then execute a dead cycle. +% +% In the branch with \cmd\holdinginserts\ cleared, the procedure +% builds up the current column, which is now complete, with \cmd\@makecolumn, then +% dispatches to the shipout routine associated with the current page grid, \cmd\output@column@. +% At the end, it triggers the execution of an output routine to prepare the next column (or page). +% +% \subsection{Natural output routine}% +% +% \begin{macro}{\natural@output} +% \begin{macro}{\output} +% Here is the output routine that handles natural pagebreaks: +% we now have page that needs to be shipped out or a portion of a page that is ready to be committed to the page grid. +% Processing is of necessity divided into phases, \cmd\output@holding\ is executed upon first encountering the natural page-breaking point, while inserts are being held. +% The second phase, \cmd\output@moving, is set in motion by the first: here the same material (in most cases) will be processed with \cmd\holdinginserts\ cleared, +% and the insertions (e.g., footnotes) are split off into their assigned box registers. +% \begin{macrocode} +\def\natural@output{\toggle@insert{\output@holding}{\output@moving}}% +\output@latex{\natural@output}% +% \end{macrocode} +% +% In accordance with the scheme suggested by David Kastrup for allowing another output routine +% to slip itself into ours, we use a token register called \cmd\output. +% However, we reserve the ability to restore things if we so desire. +% This we must do in the case of the \filename{lineno.sty} package, because its functionality +% is best served by being integrated into our own dispatcher-based output routine. +% +% To restore our own output routine, we can repeat the above assignment, +% \begin{verbatim} +%\output@latex{\natural@output}% +% \end{verbatim} +% some time before the document begins. +% \end{macro} +% \end{macro} +% +% \begin{macro}{\output@holding} +% \begin{macro}{\@if@exceed@pagegoal} +% The procedure \cmd\output@holding\ +% is our first cycle through the output routine; \cmd\holdinginserts\ is still set. +% We give the current environment a heads up +% (it is through this means that \classname{longtable} sets its running header and footer), +% then we execute a dead cycle, which should propagate marks. +% +% One corner case that can crop up is the presence of a single unbreakable chunk whose size is larger +% than \cmd\vsize. +% Doing a dead cycle under such circumstances will not find the same breakpoint as this time +% (remember we threw in a \cmd\mark\ node). +% Instead, we attempt to remove the excess height of the material, so we can continue to propagate marks. +% +% The corner case is at hand if the natural size of \cmd\box\cmd\@cclv\ exceeds \cmd\pagegoal\ and +% the contents cannot be shrunk to fit. +% +% \changes{4.1b}{2008/08/04}{New procedure for showing a box contents, \cs{trace@box}} +% \begin{macrocode} +\def\output@holding{% + \csname output@init@\bot@envir\endcsname + \@if@exceed@pagegoal{\unvcopy\@cclv}{% + \setbox\z@\vbox{\unvcopy\@cclv}% + \outputdebug@sw{\trace@box\z@}{}% + \dimen@\ht\@cclv\advance\dimen@-\ht\z@ + \dead@cycle@repair\dimen@ + }{% + \dead@cycle + }% +}% +\def\@if@exceed@pagegoal#1{% + \begingroup + \setbox\z@\vbox{#1}% + \dimen@\ht\z@\advance\dimen@\dp\z@ + \outputdebug@sw{\saythe\dimen@}{}% + \@ifdim{\dimen@>\pagegoal}{% + \setbox\z@\vbox{\@@mark{}\unvbox\z@}% + \splittopskip\topskip + \splitmaxdepth\maxdepth + \vbadness\@M + \vfuzz\maxdimen + \setbox\tw@\vsplit\z@ to\pagegoal + \outputdebug@sw{\trace@scroll{\showbox\tw@\showbox\z@}}{}% + \setbox\tw@\vbox{\unvbox\tw@}% + \@ifdim{\ht\tw@=\z@}{% + \ltxgrid@info{Found overly large chunk while preparing to move insertions. Attempting repairs}% + \aftergroup\true@sw + }{% + \aftergroup\false@sw + }% + }{% + \aftergroup\false@sw + }% + \endgroup +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\output@moving} +% \begin{macro}{\@cclv@nontrivial@sw} +% The procedure \cmd\output@moving\ +% is our second cycle through the output routine; \cmd\holdinginserts\ is now cleared, +% and \cmd\insert s will have been split off into their respective box registers, like \cmd\footins. +% +% \begin{enumerate} +% \item +% Set the values of \cmd\topmark\ and \cmd\firstmark. +% \item +% If we got here because of a \cmd\clearpage\ command, remove the protection box that this mechanism has left on the MVL. +% \item +% If the contents of \cmd\box\cmd\@cclv\ are non-trivial, commit it to the current page (as a column) or ship it out, as the case may call for. +% \item +% If not, discard it (we are at the end of \cmd\clearpage\ processing). +% \item +% Set various values, including the available space for setting type on the next column (\cmd\@colroom). +% \end{enumerate} +% +% The processing for a non-trivial \cmd\box\cmd\@cclv\ are: +% \begin{enumerate} +% \item +% Execute the head procedure for the current environment. +% \item +% Make up a column and ship it out (or commit it to the current page) via a procedure keyed to the current page grid. +% \item +% Put down an interrupt for \cmd\do@startcolumn@pen: this will force a visit to the output routine for the +% purpose of committing floats to the next column. +% \item +% Possibly put down an interrupt to continue \cmd\clearpage\ proccessing. +% \item +% Execute the tail procedure for the current environment. +% \end{enumerate} +% +% +% The processing for a trivial \cmd\box\cmd\@cclv\ are: +% \begin{enumerate} +% \item +% Void out \cmd\box\cmd\@cclv\ and give appropriate warning messages and diagnostics. +% \item +% Put down the same interrupts as for the non-trivial case above. +% \end{enumerate} +% +% This instance of \cmd\@makecolumn\ is followed by \cmd\output@column@, +% that is, it builds a column for \cmd\shipout\ rather than for adding to \cmd\pagesofar. +% +% We need to handle cases where the \cmd\output@pre@, \cmd\output@column@, or \cmd\output@post@\ +% dispatchers come up \cmd\relax ed out: the default is to execute the corresponding +% procedures from the \env{docuemnt} environment and the one-column grid respectively. +% +% One such case comes up with frequency: at the end of the document, where the \cmd\botmark\ is +% now empty. +% \changes{4.1b}{2008/08/04}{Change \cs{@makecol} to \cs{@makecolumn} with argument} +% \changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +% \changes{4.1n}{2010/01/02}{(AO, 571) Use procedures \cs{output@do@prep} and \cs{output@column@do} as dispatchers} +% \begin{macrocode} +\def\output@moving{% + \set@top@firstmark + \@ifnum{\outputpenalty=\do@newpage@pen}{% + \setbox\@cclv\vbox{% + \unvbox\@cclv + \remove@lastbox + \@ifdim{\ht\z@=\ht\@protection@box}{\box\lastbox}{\unskip}% + }% + }{}% + \@cclv@nontrivial@sw{% + \expandafter\output@do@prep\csname output@prep@\bot@envir \endcsname + \@makecolumn\true@sw + \expandafter\output@column@do\csname output@column@\thepagegrid\endcsname + \protect@penalty\do@startcolumn@pen + \clearpage@sw{% + \protect@penalty\do@endpage@pen + }{}% + \expandafter\let\expandafter\output@post@\csname output@post@\bot@envir \endcsname + \outputdebug@sw{\say\output@post@}{}% + \@ifx{\output@post@\relax}{\output@post@document}{\output@post@}% + }{% + \void@cclv + }% + \set@colht + \global\@mparbottom\z@ + \global\@textfloatsheight\z@ +}% +% \end{macrocode} +% Procedure \cmd\output@do@prep\ dispatches to the proper procedure to prepare page. +% \begin{macrocode} +\def\output@do@prep#1{% + \outputdebug@sw{\class@info{Prep: \string#1}}{}% + \@ifx{#1\relax}{\output@prep@document}{#1}% +}% +% \end{macrocode} +% Procedure \cmd\output@column@do\ dispatches to the proper procedure to output column or page. +% \begin{macrocode} +\def\output@column@do#1{% + \outputdebug@sw{\class@info{Output column: \string#1}}{}% + \@ifx{#1\relax}{\output@column@one}{#1}% +}% +\def\void@cclv{\begingroup\setbox\z@\box\@cclv\endgroup}% +\def\remove@lastbox{\setbox\z@\lastbox}% +% \end{macrocode} +% +% The procedure \cmd\@cclv@nontrivial@sw\ determines if this visit to \cmd\output@moving\ +% is a trivial one, which happens at the end of \cmd\clearpage\ processing and under some pathological circumstances. +% It emits a Boolean, so it is syntactically like \cmd\true@sw, albeit does not execute solely via expansion. +% +% Note: the case where \cmd\box\cmd\@cclv\ is void comes up at the very beginning of the job, when +% typesetting a (full-page-width) title block in a two-column layout. +% +% Note: the code that removes the last box and skip from the output is intended to detect the case +% where the output has whatsit nodes followed by topskip and a protection box. +% This is what happens under normal circumstances at the end of \cmd\clearpage\ processing. +% \changes{4.1b}{2008/08/04}{New procedure for showing a box contents, \cs{trace@box}} +% \begin{macrocode} +\def\@cclv@nontrivial@sw{% + \@ifx@empty\@toplist{% + \@ifx@empty\@botlist{% + \@ifvoid\footins{% + \@ifvoid\@cclv{% + \false@sw + }{% + \setbox\z@\vbox{\unvcopy\@cclv}% + \@ifdim{\ht\z@=\topskip}{% + \setbox\z@\vbox\bgroup + \unvbox\z@ + \remove@lastbox + \dimen@\lastskip\unskip + \@ifdim{\ht\z@=\ht\@protection@box}{% + \advance\dimen@\ht\z@ + \@ifdim{\dimen@=\topskip}{% + \aftergroup\true@sw + }{% + \aftergroup\false@sw + }% + }{% + \aftergroup\false@sw + }% +% \end{macrocode} +% End of \cmd\box\cmd\z@. +% \begin{macrocode} + \egroup + {% +% \end{macrocode} +% Normal for \clearpage +% \begin{macrocode} + \false@sw + }{% + \true@sw + }% + }{% + \@ifdim{\ht\z@=\z@}{% + \ltxgrid@info{Found trivial column. Discarding it}% + \outputdebug@sw{\trace@box\@cclv}{}% + \false@sw + }{% + \true@sw + }% + }% + }% + }{% + \true@sw + }% + }{% + \true@sw + }% + }{% + \true@sw + }% +}% +% \end{macrocode} +% +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\protect@penalty} +% The procedure \cmd\protect@penalty\ is the utility procedure for invoking a +% one-off output routine. Such a routine can expect to find the protection box +% above it in \cmd\box\cmd\@cclv: it should remove that box. +% +% Note that \cmd\execute@message\ does the same thing as \cmd\protect@penalty, but +% in a slightly different way. +% +% We create a specially formulated box that will be universally used when a protection box is needed. +% In this way, we can always recognize when \cmd\box\cmd\@cclv\ is trivial: +% it will consist of whatsits followed by \cmd\topskip\ glue and the \cmd\@protection@box. +% \begin{macrocode} +\def\protect@penalty#1{\protection@box\penalty-#1\relax}% +\newbox\@protection@box +\setbox\@protection@box\vbox to1986sp{\vfil}% +\def\protection@box{\nointerlineskip\copy\@protection@box}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dead@cycle} +% \begin{macro}{\dead@cycle@repair} +% The procedure \cmd\dead@cycle\ is defined separately as a utility which can be used by +% any output processing routine to emulate what takes place in the standard output routine. +% +% Here, we have entered the output routine with \cmd\holdinginserts\ enabled, which means that we +% are not yet ready to ship out material, because the \cmd\insert\ registers are being held. +% We want to clear \cmd\holdinginserts\ and come back here with the same page break as before, whereupon +% we may properly proceed with page makeup. +% +% To do this, we +% propagate marks, then spew the contents of \cmd\box\cmd\@cclv\ followed by the +% original output penalty that landed us here (but only if it is not 10000, +% the flag value for a pagebreak not at a penalty). +% +% However, the natural output routine should do this only if \cmd\box\cmd\@cclv\ is nontrivial. +% A pathological case exists wherein a box of height greater than \cmd\textheight\ would cause an infinite loop involving the output routine. +% The procedure \cmd\dead@cycle@repair, attempts to catch this case and avoid the loop. +% +% The test of the height of \cmd\box\cmd\@cclv\ is not the correct one, because this test will run afoul in +% the case where \cmd\box\cmd\@cclv\ contains nothing but an \cmd\insert\ node. What to do? +% +% It is possible that the pathological case can be detected by looking at \cmd\pagetotal. If that quantity is +% zero, then \cmd\box\cmd\@cclv\ really is trivial. +% +% In the procedure \cmd\dead@cycle@repair, if \cmd\box\cmd\@cclv\ is nontrivial, we execute \cmd\dead@cycle, +% otherwise it contains nothing but a mark, so we dispense with propagating marks +% and we simply spew out \cmd\box\cmd\@cclv\ without an accompanying mark. +% This has the effect of failing to propagate marks, but this problem is preferrable to the infinite loop, +% which in principle could crash even a robust operating system by filling up the file system. +% +% If a document has such a large chunk, it should be fixed, so we give a message in the log. +% +% You ask, ``In what way does this infinite loop come about?'' Good question! +% +% The setup is a chunk in the MVL that is taller than \cmd\textheight. +% (Yes, it's that simple.) +% As soon as the previous page ships out, the MVL will contain a mark (propagated from the previous page) followed +% by that large chunk (call it the `big bad box', albeit does not need to be a single box). +% The next visit to the output routine will be a natural page break, but +% \TeX\ will select the juncture between the mark and the big bad box as the least-cost page break. +% Unless the test in \cmd\dead@cycle\ is done, the cycle is perpetuated when the macro +% reinserts the mark. +% +% The crux matter is achieving, in a robust way, the goal of going from a \cmd\holdinginserts\ state to one +% where the insertions are moving. +% +% \begin{macrocode} +\def\dead@cycle@repair#1{% + \expandafter\do@@mark + \expandafter{% + \@@botmark + }% + \unvbox\@cclv + \nointerlineskip + \vbox to#1{\vss}% + \@ifnum{\outputpenalty<\@M}{\penalty\outputpenalty}{}% +}% +\def\dead@cycle@repair@protected#1{% + \expandafter\do@@mark + \expandafter{% + \@@botmark + }% + \begingroup + \unvbox\@cclv +% \end{macrocode} +% Remove the protection box +% \begin{macrocode} + \remove@lastbox + \nointerlineskip + \advance#1-\ht\@protection@box + \vbox to#1{\vss}% + \protection@box % Reinsert protection box + \@ifnum{\outputpenalty<\@M}{\penalty\outputpenalty}{}% + \endgroup +}% +\def\dead@cycle{% + \expandafter\do@@mark + \expandafter{% + \@@botmark + }% + \unvbox\@cclv + \@ifnum{\outputpenalty<\@M}{\penalty\outputpenalty}{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\output@init@document} +% \begin{macro}{\output@prep@document} +% \begin{macro}{\output@post@document} +% The default processing simply provides for insertion of held-over footnotes. +% At a natural page break, we are either at the bottom of a column or at the bottom +% of a page. In either case, the \cmd\output@init@\ processing adjusts for the height +% of the held-over footnotes and bails out. +% Upon our return, at \cmd\output@prep@\ time, the page break will accomodate the material; +% it is now actually inserted by concatenating it with the contents of \cmd\footins. +% The default processing for \cmd\output@post@\ is nil. +% \changes{4.1b}{2008/08/04}{Box \cs{footbox} changed to box \cs{footsofar}} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \begin{macrocode} +\def\output@init@document{% + \ltxgrid@info@sw{\class@info{\string\output@init@document}}{}% + \global\vsize\vsize +}% +% \end{macrocode} +% QUERY: the following procedure is very like \cmd\combine@foot@inserts. Should it be the same? +% Answer: no, the two differ: this procedure makes a local assignment of \cmd\footins; +% the latter makes a global assignment of \cmd\footsofar. +% +% Note: In a multicolumn document, footnotes must \emph{not} be balanced at this point. +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \begin{macrocode} +\def\output@prep@document{% + \ltxgrid@foot@info@sw{\class@info{\string\output@prep@document}\trace@scroll{\showbox\footins\showbox\footsofar}}{}% + \@ifvoid\footsofar{% + }{% + \global\setbox\footins\vbox\bgroup + \unvbox\footsofar + \@ifvoid\footins{}{% + \marry@baselines + \unvbox\footins + }% + \egroup + \ltxgrid@foot@info@sw{\trace@box\footins}{}% + }% +}% +\def\output@post@document{}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@opcol} +% The standard \LaTeX\ procedure \cmd\@opcol\ is now completely obsoleted. +% \begin{macrocode} +\let\@opcol\@undefined +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makecolumn} +% \changes{4.1b}{2008/08/04}{Change \cs{@makecol} to \cs{@makecolumn} with argument} +% The procedure \cmd\@makecolumn\ packages up a page along with all its insertions and floats. +% Therefore it is essential that it be executed with \cmd\holdininserts\ cleared. +% +% Note that there is a corner case when in a multi-column grid, where the change back to +% one-column grid occurs just after a complete page ships out. We want to detect when +% \cmd\@cclv\ contains nothing but a \cmd\mark, but this is a \TeX\ impossibility. +% +% Note on \cmd\@kludgeins: we have removed this mechanism from \LaTeX, because the implementation +% of \cmd\enlargethispage\ no longer requires it. +% Here, for consistency sake, we remove \cmd\@makespecialcolbox. +% +% The argument of \cmd\@makecolumn\ is a Boolean and determines if we combine the footnote material +% into the present column. If the procedure is building a column for shipping out, then we will +% combine the footnote material, if not, we return with the \cmd\footins\ box unchanged. +% +% \changes{4.1f}{2009/07/14}{(AO, 519) \cs{footins} content must be preserved and reintegrated} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \changes{4.1n}{2010/01/02}{(AO, 571) coding convention: use \cs{bgroup}, \cs{egroup} (instead of braces) when a box is being built}% +% \changes{4.1n}{2010/01/02}{(AO, 571) change calling sequence of \cs{combine@foot@inserts} to expose box registers}% +% I changed the behavior of this procedure in the case where the argument is \cmd\false@sw: +% send the unused footnote material to \cmd\footsofar. +% \begin{macrocode} +\def\@makecolumn#1{% + \ltxgrid@foot@info@sw{\class@info{\string\@makecolumn\string#1}}{}% + \setbox\@outputbox\vbox\bgroup + \boxmaxdepth\@maxdepth + \@tempdima\dp\@cclv + \unvbox\@cclv + \vskip-\@tempdima + \egroup + \xdef\@freelist{\@freelist\@midlist}\global\let\@midlist\@empty + \show@text@box@size + \@combinefloats + #1{% + \@combineinserts\@outputbox\footins + }{% + \combine@foot@inserts\footsofar\footins + }% + \set@adj@colht\dimen@ + \count@\vbadness + \vbadness\@M + \setbox\@outputbox\vbox to\dimen@\bgroup + \@texttop + \dimen@\dp\@outputbox + \unvbox\@outputbox + \vskip-\dimen@ + \@textbottom + \egroup + \vbadness\count@ + \global\maxdepth\@maxdepth +}% +\let\@makespecialcolbox\@undefined +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@combineinserts} +% The procedure to add the specified insertions to the packaged-up page. +% All other classes of insertions should also be dealt with at this time. +% +% Note that the second argument must be a \cmd\newinsert\ register: we access the \cmd\box\ along with the \cmd\skip. +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \changes{4.1n}{2010/01/02}{(AO, 571) coding convention: use \cs{bgroup}, \cs{egroup} (instead of braces) when a box is being built}% +% \changes{4.1n}{2010/01/02}{(AO, 571) footnote rule is leaders, so that it may be removed by \cs{vsplit}; mechanism of \cs{kern} signals to indicate footnote height}% +% \begin{macrocode} +\def\@combineinserts#1#2{% + \ltxgrid@foot@info@sw{\class@info{\string\@combineinserts\string#1\string#2}\trace@box#2}{}% + \setbox#1\vbox\bgroup + \unvbox#1% + \@ifvoid{#2}{}{% + \dimen@\ht#2\advance\dimen@\dp#2\advance\dimen@\skip#2% + \show@box@size{Combining inserts}#2% + \vskip\skip#2% +% \end{macrocode} +% The footnote rule is created as leaders, so that it may be removed automatically (via \cmd\vsplit) +% in the event the footnote is recovered from this column. +% Note that if \cmd\color@begingroup\ or \cmd\normalcolor\ produce marks, this technique will be confounded. +% \begin{macrocode} + \setbox\z@\vbox{\footnoterule}\dimen@i\ht\z@ + \color@begingroup + \normalcolor + \cleaders\box\z@\vskip\dimen@i\kern-\dimen@i + \csname combine@insert@\the\pagegrid@col\endcsname#2% + \color@endgroup +% \end{macrocode} +% The following tells \cmd\recover@column\ the size of the footnotes added here, including the skip glue above. +% \begin{macrocode} + \kern-\dimen@\kern\dimen@ + }% + \egroup + \ltxgrid@foot@info@sw{\trace@box#1}{}% +}% +% \end{macrocode} +% We provide for a layer of abstraction for the laying down of footnotes at the bottom of this column or page. +% \end{macro} +% +% \begin{macro}{\combine@insert@tw@} +% \begin{macro}{\combine@insert@@ne} +% \begin{macro}{\twocolumn@grid@setup} +% \begin{macro}{\onecolumn@grid@setup} +% \begin{macro}{\columngrid@setup} +% \changes{4.1p}{2010/02/24}{(AO, 583) Provide setup code also for footnotes in a one-column document}% +% The following two definitions cover the cases of a two-column document (with footnotes set on a single-column width), +% and a one-column document. +% However, the case of a two-column document with footnotes set on full text width is not covered. +% +% For a document in an overall two-column page grid, execute the commands +% \cmd\twocolumn@grid@setup\ followed by \cmd\open@twocolumn; +% if on the full page width (one-column grid), the command \cmd\onecolumn@grid@setup. +% +% The following is the way REVTeX does the initialization. +% The procedure \cmd\select@column@grid\ is executed at \cmd\AtBeginDocument\ time; +% the boolean \cmd\twocolumn@sw\ selects between the two alternatives. +% \begin{verbatim} +%\def\select@column@grid{% +% \twocolumn@sw{% +% \twocolumn@grid@setup +% \open@twocolumn +% }{% +% \onecolumn@grid@setup +% }% +%}% +%\appdef\class@documenthook{% +% \select@column@grid +%}% +% \end{verbatim} +% +% \begin{macrocode} +\def\combine@insert@tw@#1{% + \compose@footnotes@two#1\@ifvbox{#1}{\unvbox}{\box}#1% +}% +\def\combine@insert@@ne#1{% + \compose@footnotes@one#1\@ifvbox{#1}{\unvbox}{\box}#1% +}% +\def\twocolumn@grid@setup{% + \expandafter\let\csname combine@insert@1\endcsname\combine@insert@tw@ + \expandafter\let\csname combine@insert@2\endcsname\combine@insert@@ne +}% +\def\onecolumn@grid@setup{% + \expandafter\let\csname combine@insert@1\endcsname\combine@insert@@ne + \expandafter\let\csname combine@insert@2\endcsname\combine@insert@@ne +}% +\let\columngrid@setup\onecolumn@grid@setup +\columngrid@setup +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@floatplacement} +% In standard \LaTeX, someone (DPC?) makes the assumption that \cmd\@fpmin\ can be assigned +% locally. This is no longer true now that we ship no more than one page per visit to the output routine. +% We apply a bandaid. +% \begin{macrocode} +\appdef\@floatplacement{% + \global\@fpmin\@fpmin +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pagebreak@pen} +% While we are in the way of registering certain penalty values, +% let us register the smallest one that will force a visit to the output routine. +% However, this penalty will not have an assciated macro: we wish to execute the +% natural output routine instead. +% +% Note that this penalty is invoked by \cmd\clearpage\ and \cmd\newpage. +% \begin{macrocode} +\mathchardef\pagebreak@pen=\@M +\expandafter\let\csname output@-\the\pagebreak@pen\endcsname\relax +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Float placement}% +% +% \begin{macro}{\do@startcolumn@pen} +% The procedure \cmd\do@startcolumn@pen\ is executed as a one-off output routine +% just after a page is shipped out (or, in a multicolumn page grid, a column is salted away). +% +% Its job is to either generate a ``float page'' (in reality a column) for shipping out, +% or to commit deferred floats to the fresh column, concluding with a dead cycle. +% In the former case, we accomodate split footnotes and other insertions (by comparing \cmd\vsize\ and \cmd\pagegoal): +% the floats are spewed onto the page, whereupon \LaTeX's output routine will place the footnotes and ship out, +% iterating the process once again. +% +% Note that when this procedure is invoked, \cmd\box\cmd\@cclv\ still has within it the protection box, so we +% start by removing it. Note also that if there was a split insertion held over from the previous page, the +% insert node will be present in \cmd\box\cmd\@cclv, \emph{prior to} the protection box. For this reason, we cannot +% just throw away that box, as we might be tempted to do. +% +% FIXME: where else do we possibly inappropriately discard \cmd\box\cmd\@cclv? +% +% Note that, because a column or page page had previously just been completed, +% we can assume that there is nothing of importance on the page, +% and because no message is being passed, we can preserve marks in a simple way. +% +% A Note on terminology: +% In a single-column page grid, you might expect that we would execute the procedure \cmd\do@startpage. +% But this is not so. +% \LaTeX\ has a confustion of long standing, +% in which the procedures that handle full-page width floats in a two-column page grid all have in their names +% the string `dbl', which erroneously suggests having something to do with ``double''. It does not: +% when you see `dbl', think ``full page width''. +% \changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +% \begin{macrocode} +\mathchardef\do@startcolumn@pen=10005 +\@namedef{output@-\the\do@startcolumn@pen}{\do@startcolumn}% +\def\do@startcolumn{% + \setbox\@cclv\vbox{\unvbox\@cclv\remove@lastbox\unskip}% + \clearpage@sw{\@clearfloatplacement}{\@floatplacement}% + \set@colht + \@booleanfalse\pfloat@avail@sw + \begingroup + \@colht\@colroom + \@booleanfalse\float@avail@sw + \@tryfcolumn\test@colfloat + \float@avail@sw{\aftergroup\@booleantrue\aftergroup\pfloat@avail@sw}{}% + \endgroup + \fcolmade@sw{% + \setbox\@cclv\vbox{\unvbox\@outputbox\unvbox\@cclv}% +% \end{macrocode} +% Now ask for a return visit, this time with insertions and all. +% \begin{macrocode} + \outputpenalty-\pagebreak@pen + \dead@cycle + }{% + \begingroup + \let\@elt\@scolelt + \let\reserved@b\@deferlist\global\let\@deferlist\@empty\reserved@b + \endgroup + \clearpage@sw{% + \outputpenalty\@M + }{% + \outputpenalty\do@newpage@pen + }% + \dead@cycle + }% + \check@deferlist@stuck\do@startcolumn + \set@vsize +}% +\def\@scolelt#1{\def\@currbox{#1}\@addtonextcol}% +\def\test@colfloat#1{% + \csname @floatselect@sw@\thepagegrid\endcsname#1{}{\@testtrue}% + \@if@sw\if@test\fi{}{\aftergroup\@booleantrue\aftergroup\float@avail@sw}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addtonextcol} +% We must adjust \cmd\@addtonextcol\ to take held-over inserts into account. +% Now that all deferred floats are queued up together (in order), we must have a way of +% differentiating them; this is done by the page grid-dependent procedure \cmd\@floatselect@sw@. +% \begin{macrocode} +\def\@addtonextcol{% + \begingroup + \@insertfalse + \@setfloattypecounts + \csname @floatselect@sw@\thepagegrid\endcsname\@currbox{% + \@ifnum{\@fpstype=8 }{}{% + \@ifnum{\@fpstype=24 }{}{% + \@flsettextmin + \@reqcolroom \ht\@currbox + \advance \@reqcolroom \@textmin + \advance \@reqcolroom \vsize % take into account split insertions + \advance \@reqcolroom -\pagegoal + \@ifdim{\@colroom>\@reqcolroom}{% + \@flsetnum \@colnum + \@ifnum{\@colnum>\z@}{% + \@bitor\@currtype\@deferlist + \@if@sw\if@test\fi{}{% + \@addtotoporbot + }% + }{}% + }{}% + }% + }% + }{}% + \@if@sw\if@insert\fi{}{% + \@cons\@deferlist\@currbox + }% + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@startpage@pen} +% \begin{macro}{\forcefloats@sw} +% \begin{macro}{\@output@combined@page} +% \begin{macro}{\@sdblcolelt} +% \begin{macro}{\test@dblfloat} +% \begin{macro}{\@if@notdblfloat} +% Similar to \cmd\do@startcolumn, +% the procedure \cmd\do@startpage\ starts up a new page (not column) in a multi-column page grid. +% It is invoked after a page is shipped out in a multi-column page grid, and +% it commits full-page-width floats to the fresh page, possibly resulting in a float page. +% In implementation, it is similar to \cmd\do@startcolumn, except that +% it commits effectively via \cmd\@addtodblcol\ instead of \cmd\@addtonextcol. +% Note that this procedure will inevitably be followed by \cmd\do@startcolumn. +% +% Some details of the procedure: +% +% We begin by removing the protection box from \cmd\box\cmd\@cclv, then setting the values of the +% float placement parameters appropriately, and resetting \cmd\@colht, \cmd\@colroom, and \cmd\vsize\ to base values. +% +% Next we attempt to compose a float page, a page consisting entirely of floats. If successful, +% we ship out the float page and lay down an interrupt that will send us back here for another try. +% +% If no float page is formed, we attempt to commit full-page-width floats to the text page, and return with a dead cycle. +% We are now ready to compose columns of text. +% +% Note that all floats (both column floats and full-page-width floats) move through a single queue. +% To differentiate between the two, the width of the float is compared to \cmd\textwidth. +% This comparison is encapsulated in the macro \cmd\@if@notdblfloat, which should be used whenever +% such a determination must be made. This procedure returns a Boolean. +% +% \changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +% \begin{macrocode} +\mathchardef\do@startpage@pen=10006 +\@namedef{output@-\the\do@startpage@pen}{\do@startpage}% +\def\do@startpage{% + \setbox\@cclv\vbox{\unvbox\@cclv\remove@lastbox\unskip}% + \clearpage@sw{\@clearfloatplacement}{\@dblfloatplacement}% + \set@colht + \@booleanfalse\pfloat@avail@sw + \begingroup + \@booleanfalse\float@avail@sw + \@tryfcolumn\test@dblfloat + \float@avail@sw{\aftergroup\@booleantrue\aftergroup\pfloat@avail@sw}{}% + \endgroup + \fcolmade@sw{% + \global\setbox\pagesofar\vbox{\unvbox\pagesofar\unvbox\@outputbox}% + \@output@combined@page + }{% + \begingroup + \@booleanfalse\float@avail@sw + \let\@elt\@sdblcolelt + \let\reserved@b\@deferlist\global\let\@deferlist\@empty\reserved@b + \endgroup + \@ifdim{\@colht=\textheight}{% No luck... + \pfloat@avail@sw{% ...but a float *was* available! + \forcefloats@sw{% + \ltxgrid@warn{Forced dequeueing of floats stalled}% + }{% + \ltxgrid@warn{Dequeueing of floats stalled}% + }% + }{}% + }{}% + \outputpenalty\@M + \dead@cycle + }% + \check@deferlist@stuck\do@startpage + \set@colht +}% +% \end{macrocode} +% +% Procedure \cmd\@output@combined@page\ is a utility that ships out a page consisting of the +% result of \cmd\@combinepage\ and \cmd\@combinedblfloats, after which it prepares for +% the process to repeat. +% +% It is coincidentally identical to what needs to happen with +% a float page that has been built by \cmd\@tryfcolumn, in the multi-column page grid, +% and also handles the case where a page needs to be shipped out when in multicolumn mode. +% \changes{4.1b}{2008/08/04}{New procedure \cs{@output@combined@page}} +% \changes{4.1b}{2008/08/04}{Change \cs{@combinepage} to \cs{@combinepage} with argument} +% \begin{macrocode} +\def\@output@combined@page{% + \@combinepage\true@sw + \@combinedblfloats + \@outputpage + \global\pagegrid@cur\@ne + \protect@penalty\do@startpage@pen +}% +\def\@sdblcolelt#1{\def\@currbox{#1}\@addtodblcol}% +\def\test@dblfloat#1{% + \@if@notdblfloat{#1}{\@testtrue}{}% + \@if@sw\if@test\fi{}{\aftergroup\@booleantrue\aftergroup\float@avail@sw}% +}% +\def\@if@notdblfloat#1{\@ifdim{\wd#1<\textwidth}}% +\@booleanfalse\forcefloats@sw +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@addtodblcol} +% +% The procedure \cmd\@addtodblcol\ is called into play at the beginning of each fresh page +% and operates on each deferred float, in the hopes of placing one or more such floats +% at the top of the current page. +% +% We alter the procedure of standard \LaTeX\ by putting failed floats into +% \cmd\@deferlist\ instead of \cmd\@dbldeferlist. Having done so, we must have a means +% of differentiating full-page-width floats from column-width floats. +% We assume that the latter will always be narrower than \cmd\textwidth. +% +% In aid of detecting a stalled float flushing process, we set a Boolean if we encounter +% a qualified full-page-width float here. Any that qualify but fail the rest of the tests +% might still pass when reconsidered on an otherwise blank page. +% \begin{macrocode} +\def\@addtodblcol{% + \begingroup + \@if@notdblfloat{\@currbox}{% + \false@sw + }{% + \@setfloattypecounts + \@getfpsbit \tw@ + \@bitor \@currtype \@deferlist + \@if@sw\if@test\fi{% + \false@sw + }{% + \@ifodd\@tempcnta{% + \aftergroup\@booleantrue\aftergroup\float@avail@sw + \@flsetnum \@dbltopnum + \@ifnum{\@dbltopnum>\z@}{% + \@ifdim{\@dbltoproom>\ht\@currbox}{% + \true@sw + }{% + \@ifnum{\@fpstype<\sixt@@n}{% + \begingroup + \advance \@dbltoproom \@textmin + \@ifdim{\@dbltoproom>\ht\@currbox}{% + \endgroup\true@sw + }{% + \endgroup\false@sw + }% + }{% + \false@sw + }% + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }% + }% + {% + \@tempdima -\ht\@currbox + \advance\@tempdima + -\@ifx{\@dbltoplist\@empty}{\dbltextfloatsep}{\dblfloatsep}% + \global \advance \@dbltoproom \@tempdima + \global \advance \@colht \@tempdima + \global \advance \@dbltopnum \m@ne + \@cons \@dbltoplist \@currbox + }{% + \@cons \@deferlist \@currbox + }% + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tryfcolumn} +% \begin{macro}{\@wtryfc} +% \begin{macro}{\@xtryfc} +% \begin{macro}{\@ztryfc} +% Whenever a page is shipped out, \LaTeX\ automatically tries out a float column: +% a page containing nothing but floats (and, as we have added here, split footnotes). +% +% The following four procedures employ certain macros to communicate between each other: +% +% \cmd\fcolmade@sw, a boolean, says whether we were successful in making a float column. +% +% \cmd\if@test, a \cmd\newif\ switch, says a float has failed some test. +% +% \cmd\@deferlist, is the input to the process, a list, of deferred floats. +% +% \cmd\@trylist, a list, stores the deferred floats to be tried out on the float column. +% +% \cmd\@failedlist, a list of floats that have failed the selection for the float column. +% +% \cmd\@flfail, a list of floats that have failed the second selection for the float column. +% +% \cmd\@flsucceed, a list, the floats that have been successfully placed on the float column. +% +% \cmd\@freelist, a list, receives any freed floats. +% +% \cmd\@colht, a dimen, the available space for the column, including column floats and insertions (footnotes). +% +% \cmd\@fpmin, a dimen, the required minimum height for the float column. +% +% \cmd\@outputbox, a box, the output of the process. +% +% \cmd\@fptop, \cmd\@fpsep, \cmd\@fpbot, glue, placed above, between, and below floats on the float column. +% +% \cmd\@currtype, a count, used temporarily for the float's bits. +% +% \cmd\@tempcnta, a count, used temporarily for the float's bits. +% +% In \cmd\@tryfcolumn, we alter the criterion for a float page, because if footnotes are present at this point +% (presumably due to a split insertion) then \cmd\@fpmin is no longer the right threshold to apply. +% +% Note that we have changed \cmd\@tryfcolumn, \cmd\@xtryfc, and \cmd\@ztryfc\ syntactically so that the procedure +% to test for the float's being a column float versus a full-page-width float is passed in as an +% argument. +% +% \begin{macrocode} +\def\@tryfcolumn#1{% + \global\@booleanfalse\fcolmade@sw + \@ifx@empty\@deferlist{}{% + \global\let\@trylist\@deferlist + \global\let\@failedlist\@empty + \begingroup + \dimen@\vsize\advance\dimen@-\pagegoal\@ifdim{\dimen@>\z@}{% + \advance\@fpmin-\dimen@ + }{}% + \def\@elt{\@xtryfc#1}\@trylist + \endgroup + \fcolmade@sw{% + \global\setbox\@outputbox\vbox{\vskip \@fptop}% + \let \@elt \@wtryfc \@flsucceed + \global\setbox\@outputbox\vbox{\unvbox\@outputbox + \unskip \vskip \@fpbot + }% + \let \@elt \relax + \xdef\@deferlist{\@failedlist\@flfail}% + \xdef\@freelist{\@freelist\@flsucceed}% + }{}% + }% +}% +\def\@wtryfc #1{% + \global\setbox\@outputbox\vbox{\unvbox\@outputbox + \box #1\vskip\@fpsep + }% +}% +\def\@xtryfc#1#2{% + \@next\reserved@a\@trylist{}{}% trim \@trylist. Ugly! + \@currtype \count #2% + \divide\@currtype\@xxxii\multiply\@currtype\@xxxii + \@bitor \@currtype \@failedlist + \@testfp #2% + #1#2% + \@ifdim{\ht #2>\@colht }{\@testtrue}{}% + \@if@sw\if@test\fi{% + \@cons\@failedlist #2% + }{% + \begingroup + \gdef\@flsucceed{\@elt #2}% + \global\let\@flfail\@empty + \@tempdima\ht #2% + \def \@elt {\@ztryfc#1}\@trylist + \@ifdim{\@tempdima >\@fpmin}{% + \global\@booleantrue\fcolmade@sw + }{% + \@cons\@failedlist #2% + }% + \endgroup + \fcolmade@sw{% + \let \@elt \@gobble + }{}% + }% +}% +\def\@ztryfc #1#2{% + \@tempcnta \count#2% + \divide\@tempcnta\@xxxii\multiply\@tempcnta\@xxxii + \@bitor \@tempcnta {\@failedlist \@flfail}% + \@testfp #2% + #1#2% + \@tempdimb\@tempdima + \advance\@tempdimb \ht#2\advance\@tempdimb\@fpsep + \@ifdim{\@tempdimb >\@colht}{% + \@testtrue + }{}% + \@if@sw\if@test\fi{% + \@cons\@flfail #2% + }{% + \@cons\@flsucceed #2% + \@tempdima\@tempdimb + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Clearing pages}% +% +% Clearing the page is an elaboration of ending the page: it entails flushing all floats. +% +% This package might make number of float flushing algorithms available, +% a very simple one that does not try to produce excellent pages, +% another that tries to make the best use of space, +% and a more complex one that tries to balance columns. +% +% At the beginning of the page-clearing process, by definition all of the paragraph text involved is on the MVL and all floats have been encountered. +% There may be material in \cmd\pagesofar, and (in a multi-column page grid) any number of columns of the page have been composed. +% Also, there might be footnote material saved up in \cmd\footsofar. +% +% Because we did not want to perform multiple \cmd\shipout s per visit to the output routine, +% our multi-column page makeup will not compose multiple columns per visit. +% This implementation detail may not require alteration, but it is not a limitation that is truly necessary: +% it is only multiple \cmd\shipout s per visit that must be avoided. +% +% The crux matter is how to continue with flushing floats even after the material in the MVL is exhausted. +% At that point, we must, upon completion of the output routine, +% insert into the MVL an interrupt that triggers the next step in the processing. +% +% Therefore, after processing a \cmd\do@startcolumn\ interrupt, we must somehow force the completion of that column. +% This could be done by inserting a \cmd\do@newpage@pen\ interrupt. +% +% And after processing a \cmd\do@startpage@pen\ interrupt, that results in \cmd\@dbltopinsert s, +% we must ensure that the multiple columns on the page get completed, so that the page itself finally gets shipped out. +% This part will proceed automatically given that \cmd\do@startcolumn\ processing completes successfully. +% +% The process will not be complete until all deferred floats have been placed and shipped out, and all saved-up footnotes have been inserted. +% +% Full-page-width floats can get out of order of column floats. This problem can be remedied by holding them all in the same list. +% We therefore stop using \cmd\@dbldeferlist\ entirely, and all of the procedures that formerly used it have been rewritten to +% use \cmd\@deferlist\ instead. When traversing the list, we apply a selector on the given box that determines whether it is a column-width or page-width float. +% This selector is different depending on the page grid. +% +% When the \cmd\@deferlist\ is processed (by any means), we have to take care of the case where a float of one category is passed over but we are looking for a float of the other category. +% Here, we must terminate processing, to avoid disordering the floats. This we do by the usual means. +% +% The system has a Boolean that says we are clearing pages: \cmd\clearpage@sw; if it is true, +% then at the tail of \cmd\do@startcolumn\ processing, we should put down a (\cmd\vfil?) \cmd\do@newpage@pen\ interrupt. +% This is because the MVL is now empty, so we have to force the columns to complete. +% +% One potential very pathological case would be where there is one or more deferred floats that never successfully get placed: +% placing floats has stalled, and we will ship out blank pages indefinitely. How to detect this case? +% +% First, \cmd\do@startpage\ will evidently be stalled if the following are all true: +% a) \cmd\@tryfcolumn\ and \cmd\@sdblcolelt\ both fail, +% b) there are deferred floats available for page placement, and +% c) the \cmd\@colht=\cmd\textheight, that is, the full page height is available for placement of column floats. +% +% Second, \cmd\do@startcolumn\ will evidently be stalled if the following are all true: +% a) tryfcolumn fails, +% b) there are deferred floats available for column placement, and +% a) the \cmd\@colroom=\cmd\textheight, that is, the full page height is available for placement of column floats. +% +% +% \begin{macro}{\cleardoublepage} +% \begin{macro}{\clearpage} +% \begin{macro}{\newpage} +% \begin{macro}{\newpage@prep} +% The function of \cmd\clearpage\ is to end the current page with \cmd\newpage\ and then +% ship out additional pages until (\footins) inserts and (deferred) floats are exhausted. +% +% The method involves setting the float placement parameters to completely permissive values +% and kicking out the current page (using a non-discardable penalty). +% A possibly short page will be shipped out, followed +% by any number of float pages. However these float pages, because using permissive float placement, +% will exhaust all inserts and deferred floats. +% +% Bug Note: in the code for \cmd\clearpage, the first penalty we output is an unprotected \cmd\pagebreak@pen. +% I tried using a protected \cmd\do@newpage@pen, but that gave rise to a corner case where a blank page +% was output. +% +% At present, the \cmd\clearpage\ procedure does the same as \cmd\newpage, +% except that \cmd\clearpage@sw\ is turned on, +% and the (discardable) \cmd\newpage\ is inevitably followed by the same procedures +% that are executed if a page is shipped out. +% +% FIXME: it seems that better than \cmd\pagebreak@pen\ would be an unprotected penalty of a special value that would +% entail output routine processing consisting of the following steps: +% 3) \cmd\unvbox\cmd\@cclv, +% 1) set \cmd\clearpage@sw\ to \cmd\true@sw, +% 2) put down a protected \cmd\do@startcolumn@pen, +% 4) take a dead cycle. +% +% The effect would be to liberalize float placement options for the current column as well as further columns that may be output as part of \cmd\clearpage\ processing. +% Of course, it would still be necessary to set \cmd\clearpage@sw\ again via an interrupt. +% +% An optimization might be to clear \cmd\clearpage@sw\ as part of the same interrupt, +% but that would actually not work properly, because it is necessary for \cmd\do@endpage\ to +% possibly invoke further visits to the output routine before clearpage processing ceases. +% \begin{macrocode} +\def\newpage@prep{% + \if@noskipsec + \ifx \@nodocument\relax + \leavevmode + \global \@noskipsecfalse + \fi + \fi + \if@inlabel + \leavevmode + \global \@inlabelfalse + \fi + \if@nobreak \@nobreakfalse \everypar{}\fi + \par +}% +\def \newpage {% + \newpage@prep + \do@output@MVL{% + \vfil + \penalty-\pagebreak@pen + }% +}% +\def\clearpage{% + \newpage@prep + \do@output@MVL{% + \vfil + \penalty-\pagebreak@pen + \global\@booleantrue\clearpage@sw + \protect@penalty\do@startcolumn@pen + \protect@penalty\do@endpage@pen + }% + \do@output@MVL{% + \global\@booleanfalse\clearpage@sw + }% +}% +\def\cleardoublepage{% + \clearpage + \@if@sw\if@twoside\fi{% + \@ifodd\c@page{}{% + \null\clearpage + }% + }{}% +}% +\@booleanfalse\clearpage@sw +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\do@endpage@pen} +% The penalty \cmd\do@endpage@pen\ simply dispatches to the page grid procedure that forces an end page. +% That procedure should test whether there is anything to ship out (say committed floats), then act accordingly. +% Note that as part of this work, it should \cmd\unvbox\cmd\@cclv, which has been left boxed up so it can be +% measured. +% \begin{macrocode} +\mathchardef\do@endpage@pen=10007 +\@namedef{output@-\the\do@endpage@pen}{\csname end@column@\thepagegrid\endcsname}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@newpage@pen} +% The penalty \cmd\do@newpage@pen\ allows a ``non-discardable \cmd\newpage'' command: +% a \cmd\newpage\ command that will not disappear at a pagebreak. +% This visit to the output routine will not be dispatched to an interrupt, +% rather the natural output routine will be executed, where it +% will remove the protection box. +% +% Call this routine by executing \cmd\protect@penalty\cmd\do@newpage@pen. +% \begin{macrocode} +\mathchardef\do@newpage@pen=10001 +\expandafter\let\csname output@-\the\do@newpage@pen\endcsname\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@clearfloatplacement} +% The procedure \cmd\@clearfloatplacement\ sets the float placement parameters +% to completely permissive values (except for \cmd\@fpmin). The standard values are: +% +% \begin{tabular}{ll} +%\cmd\@topnum &\cmd\c@topnumber\\ +%\cmd\@toproom &\cmd\topfraction\cmd\@colht\\ +%\cmd\@botnum &\cmd\c@bottomnumber\\ +%\cmd\@botroom &\cmd\bottomfraction\cmd\@colht\\ +%\cmd\@colnum &\cmd\c@totalnumber\\ +%\cmd\@fpmin &\cmd\floatpagefraction\cmd\@colht\\ +%\cmd\@dbltopnum &\cmd\c@dbltopnumber\\ +%\cmd\@dbltoproom &\cmd\dbltopfraction\cmd\@colht\\ +%\cmd\@textmin &\cmd\@colht\cmd\advance\cmd\@textmin -\cmd\@dbltoproom\\ +%\cmd\@fpmin &\cmd\dblfloatpagefraction\cmd\textheight +% \end{tabular} +% \begin{macrocode} +\def\@clearfloatplacement{% + \global\@topnum \maxdimen + \global\@toproom \maxdimen + \global\@botnum \maxdimen + \global\@botroom \maxdimen + \global\@colnum \maxdimen + \global\@dbltopnum \maxdimen + \global\@dbltoproom \maxdimen + \global\@textmin \z@ + \global\@fpmin \z@ + \let\@testfp\@gobble + \appdef\@setfloattypecounts{\@fpstype16\advance\@fpstype\m@ne}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@doclearpage} +% \begin{macro}{\@makefcolumn} +% \begin{macro}{\@makecol} +% The \cmd\@doclearpage\ procedure is now obsoleted, as is \cmd\@makefcolumn, which it invoked. +% We also completely avoid using \cmd\@makecol\ (in favor of \cmd\@makecolumn). +% \begin{macrocode} +\let\@doclearpage\@undefined +\let\@makefcolumn\@undefined +\let\@makecol\@undefined +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\clr@top@firstmark} +% \begin{macro}{\set@top@firstmark} +% \begin{macro}{\@outputpage@tail} +% We want accurate values of \cmd\topmark\ and \cmd\firstmark, but we must deal with +% the fact that there are many different ways of contributing material +% to the page. Only upon the first contribution to the page is the value of \cmd\topmark\ +% accurate. However, with \cmd\firstmark\ we must potentially examine each contribution +% because the first mark on the page may happen to fall in the last piece of material contributed. +% +% To begin, we define the procedure that initializes the macros to appropriate flag values. +% \begin{macrocode} +\def\clr@top@firstmark{% + \global\let\saved@@topmark\@undefined + \global\let\saved@@firstmark\@empty + \global\let\saved@@botmark\@empty +}% +\clr@top@firstmark +% \end{macrocode} +% +% Note that the flag value for \cmd\saved@@topmark\ is \cmd\@undefined, just as one would +% expect. But that for \cmd\saved@@firstmark\ and \cmd\saved@@botmark\ is \cmd\@empty. +% +% Next, we define procedure \cmd\set@top@firstmark; it will be exercised everywhere material is contributed, +% capturing the mark values if appropriate. +% \begin{macrocode} +\def\set@top@firstmark{% + \@ifxundefined\saved@@topmark{\expandafter\gdef\expandafter\saved@@topmark\expandafter{\@@topmark}}{}% + \@if@empty\saved@@firstmark{\expandafter\gdef\expandafter\saved@@firstmark\expandafter{\@@firstmark}}{}% + \@if@empty\@@botmark{}{\expandafter\gdef\expandafter\saved@@botmark\expandafter{\@@botmark}}% +}% +% \end{macrocode} +% When should \cmd\set@top@firstmark\ be called? +% A good candidate for a universal procedure for handling contributed material is +% the natural output routine; are any other calls needed? +% +% Yes, in \cmd\save@column\ we must execute \cmd\set@top@firstmark\ because we are about to +% save away \cmd\box\cmd\@cclv, and we will never see its marks again (unless it is unboxed into the MVL), +% because \TeX\ lets one access a box's marks only within an output routine that has put that box into \cmd\box\cmd\@cclv. +% +% As soon as a page is shipped out, we initialize the two macros that +% hold the values of \cmd\topmark\ and \cmd\firstmark, respectively. +% \changes{4.1b}{2008/08/04}{Procedure \cs{@outputpage@tail} tailpatches \cs{@outputpage}}% +% \begin{macrocode} +\appdef\@outputpage@tail{% + \clr@top@firstmark +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Other interfaces to \LaTeX}% +% +% \begin{macro}{\@float} +% \begin{macro}{\@dblfloat} +% \begin{macro}{\@yfloat} +% \begin{macro}{\fps@} +% \begin{macro}{\fpsd@} +% The \LaTeX\ kernel procedures \cmd\@float\ and \cmd\@dblfloat\ are treated on an equal footing. +% Each now takes environment-specific float placement defaults. +% If none are defined for the calling environment, we apply a default. +% +% A parameter is passed that will set the width of text within the float, normally \cmd\columnwidth, +% and in the "dbl" version, \cmd\textwidth. However, an environment such as \env{turnpage} +% may change the meanings of these macros to allow turnpage floats. +% +% \changes{4.0a}{2008/06/26 }{\cs{@yfloat}: de-fang \cs{set@footnotewidth} (see ltxutil.dtx): we have already done its job. } +% +% Note on \cmd\@xfloat: the optional argument must come to it fully expanded, because the macro +% does a weird procedure on this argument, involving \cmd\@onelevel@sanitize, which I do not +% understand, and which does not work if not so expanded. +% \changes{4.1b}{2008/08/04}{Get rid of the \cs{reserved@a} idiom} +% \begin{macrocode} +\def\@float#1{% + \@ifnextchar[{% +% \end{macrocode} +% \verb+}]{+Brace-matching klootch +% \begin{macrocode} + \@yfloat\width@float{#1}% + }{% + \@ifxundefined@cs{fps@#1}{}{\expandafter\let\expandafter\fps@\csname fps@#1\endcsname}% + \expandafter\@argswap\expandafter{\expandafter[\fps@]}{\@yfloat\width@float{#1}}% + }% +}% +\def\@dblfloat#1{% + \@ifnum{\pagegrid@col=\@ne}{% + \@float{#1}% + }{% + \@ifnextchar[{% +% \end{macrocode} +% \verb+}]{+Brace-matching klootch +% \begin{macrocode} + \@yfloat\widthd@float{#1}% + }{% + \@ifxundefined@cs{fpsd@#1}{}{\expandafter\let\expandafter\fpsd@\csname fpsd@#1\endcsname}% + \expandafter\@argswap\expandafter{\expandafter[\fpsd@]}{\@yfloat\widthd@float{#1}}% + }% + }% +}% +% \end{macrocode} +% \changes{4.1b}{2008/08/04}{Turn off the \cs{set@footnotewidth} mechanism; a float `knows' its proper typesetting context} +% \changes{4.1n}{2010/01/02}{(AO, 571) Interface \cs{set@footnotewidth} for determining the set width of footnotes}% +% \cmd\@yfloat\ is the go-to procdure for creating the proper environment for the content of a float. +% Argument \verb+#1+ is the width of the float environment (we disable \cmd\set@footnotewidth), and +% we establish a self-contained (minipage) environment for footnotes. +% \begin{macrocode} +\def\@yfloat#1#2[#3]{% + \@xfloat{#2}[#3]% + \hsize#1\linewidth\hsize + \let\set@footnotewidth\@empty + \minipagefootnote@init +}% +\def\fps@{tbp}% +\def\fpsd@{tp}% +\def\width@float{\columnwidth}% +\def\widthd@float{\textwidth}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\end@float} +% \begin{macro}{\end@dblfloat} +% \begin{macro}{\end@@float} +% \begin{macro}{\check@currbox@count} +% \begin{macro}{\minipagefootnote@init} +% \begin{macro}{\minipagefootnote@here} +% \LaTeX\ kernel procedures \cmd\end@float\ and \cmd\end@dblfloat\ +% have been changed to work alike; in particular, floats of both classes +% are deferred into the same queue. +% This measure ensures that they will be placed in their original order, +% an aspect in which \LaTeX\ is broken. +% +% Note: when retrieving floats from the queues, we can differentiate those of the two categories +% by the width of the box. +% +% Floats are processed via an output routine message, and are checked for +% sanity in re the float placement options. In the case of full-page-width floats, +% we ensure that the h and b float placement options are never asserted, because they +% make no sense. +% +% Note that if we get to the end of the float box and still have pending +% footnotes, we put then out. +% +% LaTeX Bug note: if a user types \cmd\begin{table*}[h], the float will never succeed in being placed! +% we try to catch such cases. +% +% Note that the macro \cmd\check@currbox@count\ tries to catch cases where the float placement options +% are such that the float can never be placed. +% +% The calls to \cmd\@iffpsbit\ are part of a procedure to deny certain of the float placement +% parameters: ``h'' and ``b'' are not possible, the former because the \cmd\marginpar\ mechanism +% cannot place a full-page-width float within a multicolumn page grid, the latter because nobody +% has yet written the code to do so (pretty bad reason, I know). +% \changes{4.1b}{2008/08/04}{New procedure \cs{@iffpsbit} replaces \cs{@getfpsbit}} +% \begin{macrocode} +\def\end@float{% + \end@@float{% + \check@currbox@count + }% +}% +\def\end@dblfloat{% + \@ifnum{\pagegrid@col=\@ne}{% + \end@float + }{% + \end@@float{% + \@iffpsbit\@ne{\global\advance\count\@currbox\m@ne}{}% + \@iffpsbit\f@ur{\global\advance\count\@currbox-4\relax}{}% + \global\wd\@currbox\textwidth % Klootch + \check@currbox@count + }% + }% +}% +\def\end@@float#1{% + \minipagefootnote@here + \@endfloatbox + #1% + \@ifnum{\@floatpenalty <\z@}{% + \@largefloatcheck + \@cons\@currlist\@currbox + \@ifnum{\@floatpenalty <-\@Mii}{% + \do@output@cclv{\@add@float}% + }{% + \vadjust{\do@output@cclv{\@add@float}}% + \@Esphack + }% + }{}% +}% +% \end{macrocode} +% The \classname{float} package of Anselm Lingnau fails when used under \classname{ltxgrid}, but +% we can fix things. +% We also repair a bug in that package. +% +% \changes{4.1g}{2009/10/06}{(AO, 531) Fix package \classname{float} } +% \begin{macrocode} +\newcommand\float@end@float{% + \@endfloatbox + \global\setbox\@currbox\float@makebox\columnwidth + \let\@endfloatbox\relax + \end@float +}% +\newcommand\float@end@ltx{% + \end@@float{% + \global\setbox\@currbox\float@makebox\columnwidth + \check@currbox@count + }% +}% +\newcommand\newfloat@float[3]{% + \@namedef{ext@#1}{#3} %! + \let\float@do=\relax + \xdef\@tempa{\noexpand\float@exts{\the\float@exts \float@do{#3}}}% + \@tempa + \floatplacement{#1}{#2}% + \@ifundefined{fname@#1}{\floatname{#1}{#1}}{} %! + \expandafter\edef\csname ftype@#1\endcsname{\value{float@type}}% + \addtocounter{float@type}{\value{float@type}} %! + \restylefloat{#1}% + \expandafter\edef\csname fnum@#1\endcsname{% + \expandafter\noexpand\csname fname@#1\endcsname{} %! + \expandafter\noexpand\csname the#1\endcsname + } + \@ifnextchar[%] + {% + \float@newx{#1}% + }{% + \@ifundefined{c@#1}{\newcounter{#1}\@namedef{the#1}{\arabic{#1}}}{}% + }% +}% +\newcommand\newfloat@ltx[3]{% + \@namedef{ext@#1}{#3}% + \let\float@do=\relax + \xdef\@tempa{\noexpand\float@exts{\the\float@exts \float@do{#3}}}% + \@tempa + \floatplacement{#1}{#2}% + \@ifundefined{fname@#1}{\floatname{#1}{#1}}{}% + \expandafter\edef\csname ftype@#1\expandafter\endcsname\expandafter{\the\c@float@type}% + \addtocounter{float@type}{\value{float@type}}% + \restylefloat{#1}% + \expandafter\edef\csname fnum@#1\endcsname{% + \expandafter\noexpand\csname fname@#1\endcsname{}% + \expandafter\noexpand\csname the#1\endcsname + } + \@ifnextchar[%] + {% + \float@newx{#1}% + }{% + \@ifundefined{c@#1}{\newcounter{#1}\@namedef{the#1}{\arabic{#1}}}{}% + }% +}% +\appdef\document@inithook{% + \@ifxundefined\newfloat{}{% + \@ifx{\float@end\float@end@float}{% + \@ifx{\newfloat\newfloat@float}{\true@sw}{\false@sw}% + }{\false@sw}% + {% + \class@warn{Repair the float package}% + \let\float@end\float@end@ltx + \let\newfloat\newfloat@ltx + }{% + \class@warn{Failed to patch the float package}% + }% + }% +}% +% \end{macrocode} +% +% Boolean procedure \cmd\@iffpsbit\ is similar to the \cmd\@getfpsbit\ of \LaTeX, except +% that we do not expose the scratch count register or even change its value. +% \begin{macrocode} +\def\@iffpsbit#1{% + \begingroup + \@tempcnta\count\@currbox + \divide\@tempcnta#1\relax + \@ifodd\@tempcnta{\aftergroup\true@sw}{\aftergroup\false@sw}% + \endgroup +}% +% \end{macrocode} +% +% In procedure \cmd\check@currbox@count, we calculate the net float placement +% directive (encoded into \cmd\count\ \cmd\@currbox's least significant four bits). +% If zero, issue a warning. +% \changes{4.1b}{2008/08/04}{Tally the height of the float} +% \begin{macrocode} +\def\check@currbox@count{% + \@ifnum{\count\@currbox>\z@}{% + \count@\count\@currbox\divide\count@\sixt@@n\multiply\count@\sixt@@n + \@tempcnta\count\@currbox\advance\@tempcnta-\count@ + \@ifnum{\@tempcnta=\z@}{% + \ltxgrid@warn{Float cannot be placed}% + }{}% + \expandafter\tally@float\expandafter{\@captype}% + }{% +% \end{macrocode} +% In this case, the float is a \cmd\marginpar. +% \begin{macrocode} + }% +}% +\providecommand\minipagefootnote@init{}% +\providecommand\minipagefootnote@here{}% +\providecommand\tally@float[1]{}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@specialoutput} +% The \cmd\@add@float\ procedure used to reside in standard \LaTeX's \cmd\@specialoutput, +% which is no more. +% +% Historical Note: \cmd\@specialoutput\ and Lamport's method of an output routine dispatcher +% is the genesis of our more powerful and refined way of using \TeX's output routine to +% safely accomplish page makeup tasks. To it and to him we owe acknowledgement and thanks. +% \begin{macrocode} +\let\@specialoutput\@undefined +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@add@float} +% In the following, we do not need to execute \cmd\@reinserts, which was wrong anyway, as you cannot +% reliably recover insertions when they split (unless you have a way of reinserting the captured insertion +% ahead of the split-off part). +% +% Now that full-page-width floats are being processed the same as column floats, we +% have to nip in here and cause them always to be deferred. +% +% At the very end, the \cmd\vsize\ is adjusted for any newly committed float. +% \begin{macrocode} +\def\@add@float{% + \@pageht\ht\@cclv\@pagedp\dp\@cclv + \unvbox\@cclv + \@next\@currbox\@currlist{% + \csname @floatselect@sw@\thepagegrid\endcsname\@currbox{% + \@ifnum{\count\@currbox>\z@}{% + \advance \@pageht \@pagedp +% \end{macrocode} +% Do not assume \cmd\holdinginserts is cleared: +% \begin{macrocode} + \advance \@pageht \vsize \advance \@pageht -\pagegoal +% \end{macrocode} +% Commit an `h' float: +% \begin{macrocode} + \@addtocurcol + }{% + \@addmarginpar + }% + }{% + \@resethfps + \@cons\@deferlist\@currbox + }% + }{\@latexbug}% + \@ifnum{\outputpenalty<\z@}{% + \@if@sw\if@nobreak\fi{% + \nobreak + }{% + \addpenalty \interlinepenalty + }% + }{}% + \set@vsize +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@reinserts} +% The \cmd\@reinserts\ procedure of standard \LaTeX\ is now obsoleted (it had been erroneous anyway). +% \begin{macrocode} +\let\@reinserts\@undefined +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addtocurcol} +% We modify the \cmd\@addtocurcol\ procedure of standard \LaTeX\ +% so that a float placed ``here'' may break over pages. +% \begin{macrocode} +\def \@addtocurcol {% + \@insertfalse + \@setfloattypecounts + \ifnum \@fpstype=8 + \else + \ifnum \@fpstype=24 + \else + \@flsettextmin + \advance \@textmin \@textfloatsheight + \@reqcolroom \@pageht + \ifdim \@textmin>\@reqcolroom + \@reqcolroom \@textmin + \fi + \advance \@reqcolroom \ht\@currbox + \ifdim \@colroom>\@reqcolroom + \@flsetnum \@colnum + \ifnum \@colnum>\z@ + \@bitor\@currtype\@deferlist + \if@test + \else + \@bitor\@currtype\@botlist + \if@test + \@addtobot + \else + \ifodd \count\@currbox + \advance \@reqcolroom \intextsep + \ifdim \@colroom>\@reqcolroom + \global \advance \@colnum \m@ne + \global \advance \@textfloatsheight \ht\@currbox + \global \advance \@textfloatsheight 2\intextsep + \@cons \@midlist \@currbox + \if@nobreak + \nobreak + \@nobreakfalse + \everypar{}% + \else + \addpenalty \interlinepenalty + \fi + \vskip \intextsep + \unvbox\@currbox %AO + \penalty\interlinepenalty + \vskip\intextsep + \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi + \outputpenalty \z@ + \@inserttrue + \fi + \fi + \if@insert + \else + \@addtotoporbot + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \if@insert + \else + \@resethfps + \@cons\@deferlist\@currbox + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@twocolumn} +% The \cmd\newif\ switch \cmd\if@twocolumn\ is entirely unused. However its access words are invoked by +% \LaTeX's \cmd\document\ procedure, so we de-fang it. +% \begin{macrocode} +\@twocolumnfalse +\let\@twocolumntrue\@twocolumnfalse +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addmarginpar} +% The procedure \cmd\@addmarginpar\ used to access \cmd\if@twocolumn, but that switch is not reliable; +% the better way is to use \cmd\thepagegrid. We establish a convention for a page-grid-oriented +% procedure, e.g., \cmd\@addmarginpar@one, that emits a boolean, telling this procedure +% whether to set the marginpar on the left or right. +% \begin{macrocode} +\def\@addmarginpar{% + \@next\@marbox\@currlist{% + \@cons\@freelist\@marbox\@cons\@freelist\@currbox + }\@latexbug + \setbox\@marbox\hb@xt@\columnwidth{% + \csname @addmarginpar@\thepagegrid\endcsname{% + \hskip-\marginparsep\hskip-\marginparwidth + \box\@currbox + }{% + \hskip\columnwidth\hskip\marginparsep + \box\@marbox + }% + \hss + }% + \setbox\z@\box\@currbox + \@tempdima\@mparbottom + \advance\@tempdima -\@pageht + \advance\@tempdima\ht\@marbox + \@ifdim{\@tempdima >\z@}{% + \@latex@warning@no@line {Marginpar on page \thepage\space moved}% + }{% + \@tempdima\z@ + }% + \global\@mparbottom\@pageht + \global\advance\@mparbottom\@tempdima + \global\advance\@mparbottom\dp\@marbox + \global\advance\@mparbottom\marginparpush + \advance\@tempdima -\ht\@marbox + \global\setbox \@marbox + \vbox {\vskip \@tempdima + \box \@marbox}% + \global \ht\@marbox \z@ + \global \dp\@marbox \z@ + \kern -\@pagedp + \nointerlineskip + \box\@marbox + \nointerlineskip + \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{turnpage} +% Any float (viz., \env{figure} or \env{table}) within the scope of this environment +% will be a turnpage float: It will be assumed to occupy an entire page (constitute a float page), +% the width will be \cmd\textheight, the height \cmd\textwidth, and the entire float will be presented +% rotated 90 degrees. +% +% The implementation requires the services of the \cmd\rotatebox\ command, so we supply a dummy definition +% that explains things to the user. +% \begin{macrocode} +\newenvironment{turnpage}{% + \def\width@float{\textheight}% + \def\widthd@float{\textheight}% + \appdef\@endfloatbox{% + \@ifxundefined\@currbox{% + \ltxgrid@warn{Cannot rotate! Not a float}% + }{% + \setbox\@currbox\vbox to\textwidth{\vfil\unvbox\@currbox\vfil}% + \global\setbox\@currbox\vbox{\rotatebox{90}{\box\@currbox}}% + }% + }% +}{% +}% +\def\rotatebox@dummy#1#2{% + \ltxgrid@warn{You must load the graphics or graphicx package in order to use the turnpage environment}% + #2% +}% +% \end{macrocode} +% \changes{4.1b}{2008/08/04}{Use \cs{document@inithook} instead of \cs{AtBeginDocument}} +% \begin{macrocode} +\appdef\document@inithook{% + \@ifxundefined\rotatebox{\let\rotatebox\rotatebox@dummy}{}% +}% +% \end{macrocode} +% \end{environment} +% +% +% \subsection{One-off output routines} +% +% These procedures are executed in lieu of \cmd\the\cmd\output\ when the output penalty has the associated flag value. +% +% \begin{macro}{output@-1073741824} +% The first one-off output routine handles the end of the job, wherein +% \LaTeX\ executes \cmd\@@end, and breaks to the output with a penalty of +% $"40000000 = 2^{32}/4 = 1073741824$. +% We simply discard \cmd\box\cmd\@cclv\ and leave. +% This means that \LaTeX\ is obligated to do \cmd\clearpage\ as part of +% its \enve{document} processing, otherwise material will be lost. +% \begin{macrocode} +\@namedef{output@-1073741824}{% + \deadcycles\z@ +% \end{macrocode} +% \begin{verbatim} +%\showbox\@cclv +% \end{verbatim} +% \begin{macrocode} + \void@cclv +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\save@column@pen} +% The one-off output routine associated with \cmd\penalty\cmd\save@column@pen\ +% will be called within a sequence of three such routines by \cmd\execute@message +% or its companion routine \cmd\execute@message@insert. +% This procedure must save away any the current page and preserve marks. +% \begin{macrocode} +\mathchardef\save@column@pen=10016 +\@namedef{output@-\the\save@column@pen}{\save@column}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@cclv@saved} +% We take over the \cmd\@holdpg\ box register. Hereafter, +% we no longer use the \cmd\@holdpg\ box register, so let the world know. +% This should decisively break packages that assume standard \LaTeX. +% Breaking decisively is preferred to quietly proceeding erroneously. +% \begin{macrocode} +\let \@cclv@saved \@holdpg +\let \@holdpg \@undefined +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\save@column} +% The procedure \cmd\save@column\ does the actual work of saving away the material +% on the page. It is invoked both by \cmd\save@column@pen\ and by \cmd\save@column@insert@pen. +% We save \cmd\box\cmd\@cclv\ and the primitive \cmd\@@topmark. +% \begin{macrocode} +\def\save@column{% + \@ifvoid\@cclv@saved{% + \set@top@firstmark + \global\@topmark@saved\expandafter{\@@topmark}% + }{}% + \global\setbox\@cclv@saved\vbox{% + \@ifvoid\@cclv@saved{}{% + \unvbox\@cclv@saved + \marry@baselines + }% + \unvbox\@cclv + \lose@breaks + \remove@lastbox + }% +}% +\newtoks\@topmark@saved +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\prep@cclv} +% The procedure \cmd\prep@cclv\ is used by message handlers to set up their environment +% to ape that of the usual output routine, with the boxed-up page in \cmd\box\cmd\@cclv. +% Here, we retrieve the material from \cmd\@cclv@saved, where it was saved away by +% the one-off output routine associated with \cmd\save@column@pen. +% \begin{macrocode} +\def\prep@cclv{% + \void@cclv + \setbox\@cclv\box\@cclv@saved + \vbadness\@M +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\save@column@insert@pen} +% The one-off output routine associated with \cmd\penalty\cmd\save@column@insert@pen\ +% is similar to that of \cmd\save@column@pen\ augmented with the processing of insertions. +% It is called by \cmd\execute@message@insert\ (i.e., at a grid change) +% and saves away the current page and preserves marks. +% In addition, it saves away any insertions that fall on the current page. +% As with the natural output routine, it executes in two phases, +% first with \cmd\holdinginserts\ set, then cleared. +% \begin{macrocode} +\mathchardef\save@column@insert@pen=10017 +\@namedef{output@-\the\save@column@insert@pen}{\toggle@insert{\savecolumn@holding}{\savecolumn@moving}}% +% \end{macrocode} +% The procedure \cmd\savecolumn@holding\ is the first phase of saving a column with its inserts. +% This phase must detect and remedy the one circumstance that will confound our efforts to propagate marks. +% It is similar to \cmd\output@holding, except that we have to deal with the protection box, which must +% remain, because the messaging mechanism is being used. +% +% If it appears that we have the pathological ``Big Bad Box'' case at hand, we use the \cmd\dead@cycle@repair@protected\ +% procedure instead of \cmd\dead@cycle\ to do our dead cycle. +% \changes{4.1b}{2008/08/04}{Use \cs{trace@box} instead of \cs{showbox}} +% \begin{macrocode} +\def\savecolumn@holding{% + \@if@exceed@pagegoal{\unvcopy\@cclv\remove@lastbox}{% + \setbox\z@\vbox{\unvcopy\@cclv\remove@lastbox}% + \outputdebug@sw{\trace@box\z@}{}% + \dimen@\ht\@cclv\advance\dimen@-\ht\z@ + \dead@cycle@repair@protected\dimen@ + }{% + \dead@cycle + }% +}% +% \end{macrocode} +% \changes{4.1b}{2008/08/04}{New procedure for showing a box contents, \cs{trace@box}} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% The procedure \cmd\save@column@moving\ is the second phase of saving a column with its inserts. +% Now that \cmd\holdinginserts\ is cleared, we can look in the various \cmd\insert\ registers for +% our inserts (at present there is only one, \cmd\footins, along with \cmd\footins@saved). +% if anything is there, we save it away and ask for another cycle (because it may have split). +% +% Note that the message that is about to be executed had better deal properly with the contents of +% the \cmd\footins@saved\ box. +% +% \begin{macrocode} +\def\savecolumn@moving{% + \ltxgrid@info@sw{\class@info{\string\savecolumn@moving}}{}% + \@cclv@nontrivial@sw{% + \save@column + }{% + \void@cclv + }% + \@ifvoid\footins{}{% + \ltxgrid@foot@info@sw{\class@info{\string\savecolumn@moving}\trace@scroll{\showbox\footins@saved\showbox\footins}}{}% +% \end{macrocode} +% Save all away in \cmd\footins@saved. Note that if \cmd\footins\ is void, then \cmd\footins@saved\ remains untouched. +% \begin{macrocode} + \@ifvoid\footins@saved{% + \global\setbox\footins@saved\box\footins + }{% + \global\setbox\footins@saved\vbox\bgroup + \unvbox\footins@saved + \marry@baselines + \unvbox\footins + \egroup + }% + \ltxgrid@foot@info@sw{\trace@box\footins@saved}{}% + \protect@penalty\save@column@insert@pen + }% +}% +\newbox\footins@saved +\newbox\footins@recovered +\newbox\column@recovered +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\save@message@pen} +% The one-off output routine associated with \cmd\penalty\cmd\save@message@pen\ +% saves away the message that has been passed. +% This procedure is penultimate in a sequence of one-off output routine calls; +% earlier ones have saved away the MVL and preserved marks, the last executes the message. +% +% Note that we are passing tokens to \TeX's primitive \cmd\mark\ mechanism, so we must ensure +% that they are not inappropriately expanded. We use the same mechanism for all such cases, +% namely \cmd\let@mark. +% +% Note: we expect that \cmd\box\cmd\@cclv's contents are well known: +% \cmd\topskip, protection box, and a \cmd\mark, the latter containing the message. +% But if we came here via \cmd\penalty 10017, there might be an \cmd\insert\ node present as well, +% because a footnote may have split. +% Because this procedure simply voids out \cmd\box\cmd\@cclv, such material would be lost. +% Perhaps we can repair things by manipulating the \cmd\insert \ mechanism temporarily. +% \begin{macrocode} +\mathchardef\save@message@pen=10018 +\@namedef{output@-\the\save@message@pen}{\save@message}% +\def\save@message{% + \void@cclv +% \end{macrocode} +%FIXME: what if \cmd\box\cmd\@cclv is not empty? +% \begin{macrocode} + \toks@\expandafter{\@@firstmark}% + \expandafter\gdef\expandafter\@message@saved\expandafter{\the\toks@}% + \expandafter\do@@mark\expandafter{\the\@topmark@saved}% +}% +\gdef\@message@saved{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\execute@message@pen} +% The one-off output routine associated with \cmd\execute@message@pen\ +% simply executes the given message. It is last in a sequence of one-off output routine calls; +% earlier ones have saved all that require saving. +% \begin{macrocode} +\mathchardef\execute@message@pen=10019 +\@namedef{output@-\the\execute@message@pen}{\@message@saved}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Output messages} +% +% Message handlers are procedures that execute output messages, tokens that are passed to +% the output routine for execution in an environment appropriate to page makeup. +% +% How it works. We put down three large negative penalties, each of which will be handled by +% the output dispatcher (\emph{not} the natural output routine), each penalty being protected by +% a removable, non-discardable item (i.e., a box). +% Either three or four invocations of one-off output routines are involved per message. +% +% We make the last of the three protection boxes have a depth equal to the value of \cmd\prevdepth\ +% that was current when the procedure is called. This effectively restores \cmd\prevdepth. +% +% In each case, the one-off output routine will remove the extraneous box we have inserted. +% And the second and third one-off routines will simply void \cmd\box\cmd\@cclv, because its contents +% are entirely artificial. +% +% FIXME: not so! If \cmd\holdinginserts\ is cleared, that box may have an insert node; it must be preserved, too. +% +% The first routine saves away the current column contents and remembers the \cmd\topmark\ for later +% use. There is a variant routine that first clears \cmd\holdinginserts, so that the message can +% handle any inserts present in the boxed-up page; this of course entails yet another +% visit to the output routine. +% +% The penultimate routine saves away the tokens transmitted in via the \cmd\@@mark: the argument of +% the macro. These tokens are of course the very thing we wish to execute within the safety +% of the output routine. It also puts down a mark containing the \cmd\topmark\ tokens saved +% by the first routine. By this means, the mark, which we have clobbered, is restored. +% +% The last routine simply executes the given tokens. +% In the course of doing this, it must take care of \cmd\box\cmd\@cclv, either by shipping it out, +% or by \cmd\unvbox ing it onto the MVL. +% +% \begin{macro}{\execute@message} +% The procedure \cmd\execute@message\ simply calls the utility procedure \cmd\@execute@message\ +% with a penalty value for the standard treatment. +% \begin{macrocode} +\def\execute@message{% + \@execute@message\save@column@pen +% \end{macrocode} +% Implicit second argument +% \begin{macrocode} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\execute@message@insert} +% The procedure \cmd\execute@message@insert\ is like \cmd\execute@message\ in all respects +% except that the penalty value is \cmd\save@column@insert@pen, which arranges for the +% message handler involved to deal with the page's insertions. +% At the same time, we prepare the \cmd\footins\ box so that these insertions can be dealt with. +% +% Note: +% If more insertions are added to \LaTeX\ (presumably via \cmd\newinsert), then they +% must be dealt with in a way entirely analogous to \cmd\footins. +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \begin{macrocode} +\def\execute@message@insert#1{% + \@execute@message\save@column@insert@pen{% + \setbox \footins \box \footins@saved + \ltxgrid@foot@info@sw{\class@info{\string\execute@message@insert}\trace@box\footins}{}% + #1% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@execute@message} +% The utility procedure \cmd\@execute@message\ is called by \cmd\execute@message\ and \cmd\execute@message@insert. +% We prepare by creating a \cmd\vbox\ containing all the needed nodes and proceed by simply +% \cmd\unvbox ing that box onto the MVL. +% We ensure that \cmd\box\cmd\@cclv\ is properly set up for the output message handler +% by always inserting \cmd\prep@cclv\ in advance of the argument. +% +% Note that each one-off output routine is invoked effectively the same as +% \cmd\protect@penalty, except that the second invocation involves an additional +% \cmd\mark\ node, and the third a specially prepared protection box. +% +% Note also that \TeX's primitive \cmd\mark\ is called here without any expansion protection. +% This is the only place where it is called that way, but it's OK because those tokens +% have have been pre-expanded by procedures that call \cmd\execute@message. +% FIXME: all procedures calling \cmd\execute@message\ must pre-expand their tokens! +% \begin{macrocode} +\long\def\@execute@message#1#2{% + \begingroup + \dimen@\prevdepth\@ifdim{\dimen@<\z@}{\dimen@\z@}{}% + \setbox\z@\vbox{% + \protect@penalty#1% + \protection@box + \toks@{\prep@cclv#2}% + \@@mark{\the\toks@}% + \penalty-\save@message@pen +% \end{macrocode} +%\begin{verbatim} +% \hbox{\vrule\@height\z@\@width\z@\@depth\dimen@}% +%\end{verbatim} +% \begin{macrocode} + \setbox\z@\null\dp\z@\dimen@\ht\z@-\dimen@ + \nointerlineskip\box\z@ + \penalty-\execute@message@pen + }\unvbox\z@ + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@output@cclv} +% The procedure \cmd\do@output@cclv\ provides access to message handlers at their simplest. +% The message will execute in the usual environment of the output routine, with +% the boxed-up page in \cmd\box\cmd\@cclv, and we assume that \cmd\holdinginserts\ remains set. +% This procedure must be invoked within main vertical mode; +% it is the obligation of the macro writer to ensure that this is the case. +% \begin{macrocode} +\def\do@output@cclv{\execute@message}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@output@MVL} +% The procedure \cmd\do@output@MVL, like \cmd\do@output@cclv, is an interface for messages, +% but provides two additional services: the command may also be invoked in horizontal mode, and +% the message handler will execute with the MVL unboxed. +% \begin{macrocode} +\def\do@output@MVL#1{% + \@ifvmode{% + \begingroup\execute@message{\unvbox\@cclv#1}\endgroup + }{% + \@ifhmode{% + \vadjust{\execute@message{\unvbox\@cclv#1}}% + }{% + \@latexerr{\string\do@output@MVL\space cannot be executed in this mode!}\@eha + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lose@breaks} +% The purpose of this procedure is to get rid of all the extraneous +% \cmd\penalty\cmd\@M\ nodes that tend to build up in the MVL. +% \begin{macrocode} +\def\lose@breaks{% + \loopwhile{% + \count@\lastpenalty + \@ifnum{\count@=\@M}{% +% \end{macrocode} +% Note: 10000 is a TeX magic number! +% \begin{macrocode} + \unpenalty\true@sw + }{% + \false@sw + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\removestuff} +% \cmd\removestuff\ is a document-level command that removes the bottom skip glue item +% from the MVL. +% \begin{macrocode} +\def\removestuff{\do@output@MVL{\unskip\unpenalty}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\removephantombox} +% The procedure \cmd\removephantombox\ is a special-purpose message handler exclusively for +% preventing incorrect spacing above display math. It must be issued in +% horizontal mode within the phantom paragraph generated when display math starts up in +% vertical mode. +% \begin{macrocode} +\def\removephantombox{% + \vadjust{% + \execute@message{% + \unvbox\@cclv + \remove@lastbox + \unskip + \unskip + \unpenalty + \penalty\predisplaypenalty + \vskip\abovedisplayskip + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addstuff} +% \cmd\addstuff\ is a document-level command that adds penalty, glue, or both to the +% MVL. The penalty and glue items are rearranged so that all penalties nodes precede all the glue nodes, +% which is the canonical arrangement. +% \begin{macrocode} +\def\addstuff#1#2{\edef\@tempa{\noexpand\do@output@MVL{\noexpand\@addstuff{#1}{#2}}}\@tempa}% +\def\@addstuff#1#2{% + \skip@\lastskip\unskip + \count@\lastpenalty\unpenalty + \@if@empty{#1}{}{\penalty#1\relax}% + \@ifnum{\count@=\z@}{}{\penalty\count@}% + \vskip\skip@ + \@if@empty{#2}{}{\vskip#2\relax}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\replacestuff} +% \cmd\replacestuff\ is a document-level command similar to \cmd\addstuff; +% but it replaces penalty, glue, or both in the MVL. +% The penalty and glue items are rearranged so that all penalties nodes precede all the glue nodes, +% which is the canonical arrangement. +% \begin{macrocode} +\def\replacestuff#1#2{\edef\@tempa{\noexpand\do@output@MVL{\noexpand\@replacestuff{#1}{#2}}}\@tempa}% +\def\@replacestuff#1#2{% + \skip@\lastskip\unskip + \count@\lastpenalty\unpenalty + \@if@empty{#1}{}{% + \@ifnum{\count@>\@M}{}{% + \@ifnum{\count@=\z@}{\count@=#1\relax}{% + \@ifnum{\count@<#1\relax}{}{% + \count@=#1\relax + }% + }% + }% + }% + \@ifnum{\count@=\z@}{}{\penalty\count@}% + \@if@empty{#2}{}{% + \@tempskipa#2\relax + \@ifdim{\z@>\@tempskipa}{% + \advance\skip@-\@tempskipa + }{% + \@ifdim{\skip@>\@tempskipa}{}{% + \skip@\@tempskipa + }% + }% + }% + \vskip\skip@ +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\move@insertions} +% \begin{macro}{\hold@insertions} +% In order to avoid bolluxing up \cmd\insert\ registers by our one-off +% output routines, we set \cmd\holdinginserts\ to zero by default and only +% clear it (briefly) while we handle cases where we want inserts to show up. +% \begin{macrocode} +\def\move@insertions{\global\holdinginserts\z@}% +\def\hold@insertions{\global\holdinginserts\@ne}% +\hold@insertions +\def\toggle@insert#1#2{% + \@ifnum{\holdinginserts>\z@}{\move@insertions#1}{\hold@insertions#2}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Messages to alter the page grid}% +% +% Here is the implementation of the grid-switching procedures. +% We perform two checks when changing the page grid; first to ensure that +% the target page grid is known (defensive programming), second to ensure that +% the switch is a non-trivial one. The latter check must be performed within +% the safety of the output routine, so requires using an output message. +% Thus, a grid change requires two messages, for a total of six visits to the output routine. +% +% \begin{macro}{\do@columngrid} +% Utility procedure \cmd\do@columngrid\ changes the page grid. +% Note that this command forces an end to the current paragraph. This is necessary, because +% a page grid change makes no sense unless we can alter the \cmd\hsize\ before commencing to +% typeset the following paragraph. So the command should never be executed in horizontal mode +% anyway. +% \begin{macrocode} +\def\do@columngrid#1#2{% + \par + \expandafter\let\expandafter\@tempa\csname open@column@#1\endcsname + \@ifx{\relax\@tempa}{% + \ltxgrid@warn{Unknown page grid #1. No action taken}% + }{% + \do@output@MVL{\start@column{#1}{#2}}% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\start@column} +% Procedure \cmd\start@column\ lays down the interrupts to switch the page grid. +% If the change to the page grid would have been trivial, it bails out. +% It seems a reasonable tradeoff of processing versus security: once we commit +% to changing the page grid, we clear \cmd\holdinginserts, so there is no turning back. +% +% Note that the second argument to the macro allows us to pass an argument to the +% page grid that is starting up. This can be handy, because a single procedure can +% handle multiple page grids, differing only by the value of a parameter. +% +% FIXME: this means that you cannot switch between mlt page grids in a single step. +% But do we want to do this, at all, at all? +% \begin{macrocode} +\def\start@column#1#2{% + \def\@tempa{#1}\@ifx{\@tempa\thepagegrid}{% + \ltxgrid@info{Already in page grid \thepagegrid. No action taken}% + }{% + \expandafter\execute@message@insert + \expandafter{% + \csname shut@column@\thepagegrid\expandafter\endcsname + \csname open@column@#1\endcsname{#2}% + \set@vsize + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thepagegrid} +% The macro \cmd\thepagegrid\ tracks what kind of page grid we are in. +% +% Note: Access \cmd\thepagegrid\ only within the safety of the output routine. +% +% Warning: The page grid should be changed only within the safety of the output routine. +% People who write multicol page grid mechanisms appear not to understand the matter, so they +% should particularly heed this warning. Think about it: obviously Lamport did so, which is why +% his \cmd\twocolumn\ command forced a pagebreak, which is limiting, but safe. +% \begin{macrocode} +\def\thepagegrid{one}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Application Note: implementing a page grid} +% +% If you want to create a new page grid for \LaTeX, +% you must define five procedures with specific names: +% \cmd\open@column@ name, \cmd\shut@column@ name, \cmd\end@column@ name, +% \cmd\output@column@ name, and \cmd\@addmarginpar@ name, where ``name'' is the +% name of your page grid. +% +% The procedure \cmd\open@column@ name starts the new page grid. It should define \cmd\thepagegrid, +% deal with \cmd\box\cmd\pagesofar\ and \cmd\box\cmd\footsofar\ (perhaps by leaving them alone), +% and it should set the values of \LaTeX's page layout parameters for the column size and height. +% +% The procedure \cmd\shut@column@ name should expect to be called with \cmd\holdinginserts\ +% cleared (it can assume that \cmd\holdinginserts\ will automatically be restored). +% It should properly deal with insertions (like footnotes); calling \cmd\@makecolumn\ +% with an argument of \cmd\false@sw\ will do this. +% It should know that the page grid is being terminated +% in the middle of a page, so it should make arrangements to carry the footnotes down to the +% bottom of the column or page, and it should possibly salt away the material for later +% incorporation into the page. The box registers \cmd\footsofar\ and \cmd\pagesofar\ are customarily used +% for this purpose. +% +% The procedure \cmd\end@column@ name should kick out a possibly short page containing all the +% floats committed to the page. It will be invoked during \cmd\clearpage\ processing. +% After that, it should \cmd\unvbox\cmd\@cclv. +% +% The procedure \cmd\output@column@ name should ship out or commit the current \cmd\@outputbox. +% In a one-column layout, you ship out; in a multicolumn layout, you commit the box as the contents +% of a particular column, and if that column is the last, you ship out. +% +% The procedure \cmd\@addmarginpar@ name should return a boolean (either \cmd\true@sw\ or \cmd\false@sw\ or an equivalent) +% to tell the marginpar mechanism to place the marginal material to the right or left, respectively. +% +% You can use the existing page grids ``one'' and ``mlt'' as a point of departure for creating others. +% The former can be the basis for, say, a single-column page grid with a side column. +% +% \begin{macro}{\pagesofar} +% \begin{macro}{\footsofar} +% The box register \cmd\pagesofar\ holds the portion of the (full-width) page that is already composed into columns. +% This, plus the finished columns, each with its floats, plus \cmd\box255 constitute the full galley. +% +% The box register \cmd\footsofar\ holds all of the footnotes associated with \cmd\pagesofar. +% \begin{macrocode} +\newbox\pagesofar +\newbox\footsofar +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\combine@foot@inserts} +% \changes{4.1n}{2010/01/02}{(AO, 571) calling sequence of \cs{combine@foot@inserts} and \cs{grid@column} to expose box registers; that of \cs{append@column@} its column counters}% +% \changes{4.1n}{2010/01/02}{(AO, 571) coding convention: use \cs{bgroup}, \cs{egroup} (instead of braces) when a box is being built}% +% The procedure \cmd\combine@foot@inserts\ is for the purpose of merging +% the recently contributed footnotes (usually \cmd\box\cmd\footins) +% with those saved from earlier on the page (usually \cmd\box\cmd\footsofar). +% +% It is employed in a number of circumstances. +% +% \cmd\@makecolumn (when its argument is \cmd\false@sw): +% we are not shipping out, so we need to salt away any footnotes there may be. +% +% \cmd\shut@column@one: we are leaving the one-column page grid, so recover the footnotes from that material +% and combine them with those of \cmd\pagesofar. +% +% \expandafter\cmd\csname balance@2\endcsname: two columns of type have been balanced, so now balance the footnotes. +% The \cmd\combine@foot@inserts\ procedure is first used to gather footnotes from the columns balanced with those of \cmd\pagesofar. +% +% Bug 571 note: if balancing a two-column page grid, and there had been footnotes in the \cmd\pagesofar, +% those footnotes will have been balanced into a page-width box, \cmd\box\cmd\footsofar. +% We need to now re-cast them into a single, column-width galley, and only then +% combine them with those in \cmd\box\cmd\footins. +% +% \begin{macrocode} +\def\combine@foot@inserts#1#2{% + \ltxgrid@info@sw{\class@info{\string\combine@foot@inserts\string#1\string#2}}{}% + \@ifvoid#1{% + \ltxgrid@foot@info@sw{\trace@box#2}{}\global\setbox#1\box#2% + }{% + \global\setbox#1\vbox\bgroup + \ltxgrid@foot@info@sw{\trace@box#1}{}\unvbox#1% + \@ifvoid#2{}{% + \marry@baselines + \ltxgrid@foot@info@sw{\trace@box#2}{}\unvbox#2% + }% + \egroup + }% + \ltxgrid@foot@info@sw{\trace@scroll{\showbox#1\showbox#2}}{}% +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{One-column page grid} +% +% \begin{macro}{\onecolumngrid} +% \begin{macro}{\open@column@one} +% \begin{macro}{\shut@column@one} +% \begin{macro}{\float@column@one} +% \begin{macro}{\end@column@one} +% \begin{macro}{\output@column@one} +% \begin{macro}{\@addmarginpar@one} +% Here are all the procedures necessary for the standard page grid named ``one'': +% a single column layout. It is, of course, \LaTeX's familiar \cmd\onecolumn\ layout. +% We begin with the procedure exposed to the style writer. +% This is, however, not a \LaTeX\ command; users should not change the page grid. +% \begin{macrocode} +\newcommand\onecolumngrid{\do@columngrid{one}{\@ne}}% +% \end{macrocode} +% +% Note that a document class that issues the command \cmd\onecolumn\ will break. This includes +% \LaTeX's standard classes.dtx-based classes: if your class descends from one of these, you +% must expunge it of all such commands. +% \begin{macrocode} +\let\onecolumn\@undefined +% \end{macrocode} +% +% The procedure \cmd\open@column@one\ takes advantage of the special nature of the one-column +% page grid to deal with \cmd\box\cmd\pagesofar, therefore it must also reset \cmd\@colroom. +% \changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \begin{macrocode} +\def\open@column@one#1{% + \ltxgrid@info@sw{\class@info{\string\open@column@one\string#1}}{}% +% \end{macrocode} +% Throw the \cmd\pagesofar\ back onto the Main Vertical List. +% At this point, we must also \cmd\insert\ the footnotes back into the MVL. +% \changes{4.1n}{2010/01/02}{(AO, 571) coding convention: use \cs{bgroup}, \cs{egroup} (instead of braces) when a box is being built}% +% \begin{macrocode} + \unvbox\pagesofar + \@ifvoid{\footsofar}{}{% + \insert\footins\bgroup\unvbox\footsofar\egroup + \penalty\z@ + }% +% \end{macrocode} +% Record which page grid we are using. Then calculate the set width (\cmd\hsize) and the goal height (\cmd\vsize). +% +% Klootch: we set the \cmd\count\cmd\footins\ to a magic number. This is only correct in the case of a two-column document. +% \begin{macrocode} + \gdef\thepagegrid{one}% + \global\pagegrid@col#1% + \global\pagegrid@cur\@ne + \global\count\footins\@m + \global\divide\count\footins\tw@ + \set@column@hsize\pagegrid@col + \set@colht +}% +% \end{macrocode} +% +% The procedure \cmd\shut@column@one\ saves away the one-column material into the box register \cmd\pagesofar. +% Because it is called from a message handler, we are assured that marks are properly taken care of. +% +% This instance of \cmd\@makecolumn\ is building a column for saving into \cmd\pagesofar. +% \changes{4.1b}{2008/08/04}{Change \cs{@makecol} to \cs{@makecolumn} with argument} +% \changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +% \changes{4.1f}{2009/07/15}{(AO, 519) Preserve footnotes that are in \cs{footsofar} across a page grid change} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \changes{4.1n}{2010/01/02}{(AO, 571) calling sequence of \cs{combine@foot@inserts} and \cs{grid@column} to expose box registers; that of \cs{append@column@} its column counters}% +% We recover the footnotes into \cmd\footsofar\ (globally) and the column into \cmd\pagesofar\ (also globally), voiding \cmd\@outputbox\ by side effect. +% \begin{macrocode} +\def\shut@column@one{% + \ltxgrid@info@sw{\class@info{\string\shut@column@one}}{}% + \@makecolumn\false@sw +% \end{macrocode} +% Split text portion of \cmd\@outputbox\ into \cmd\pagesofar, +% and add its footnote portion to \cmd\footsofar. +% Then void out \cmd\@outputbox. +% \begin{macrocode} + \global\setbox\pagesofar\vbox\bgroup + \recover@column\@outputbox\footsofar\column@recovered\footins@recovered + \egroup + \begingroup\setbox\z@\box\@outputbox\endgroup +% \end{macrocode} +% FIXME: is \cmd\combine@foot@inserts\ needed? +% Also: if this procedure is immediately followed by \cmd\open@column@ \texttt{grid}, then \cmd\set@colht\ will be unneeded. +% \begin{macrocode} + \combine@foot@inserts\footsofar\footins + \set@colht +}% +% \end{macrocode} +% +%FIXME: the first line of a footnote should have an up-strut, and the last line a down-strut, so that they can marry baselines. +% The latter is the case; how about the former? +% +% The procedure \cmd\float@column@one\ takes care of a float column that has been built by +% \cmd\@tryfcolumn, in the single-column page grid. +% +% This instance of \cmd\@makecolumn\ is followed by \cmd\@outputpage: it is building +% a column for \cmd\shipout, rather than for saving into \cmd\pagesofar. +% \changes{4.1b}{2008/08/04}{Change \cs{@makecol} to \cs{@makecolumn} with argument} +% \begin{macrocode} +\def\float@column@one{% + \@makecolumn\true@sw + \@outputpage +}% +% \end{macrocode} +% +% The procedure \cmd\end@column@one\ is executed at the end of \cmd\clearpage\ processing, +% if we were in a one-column page grid, once all permissive float pages have been shipped out. +% At this point, one could perhaps +% assume that nothing more need be done, but let us anyway test for committed floats and force a shipout. +% +% FIXME: this procedure does the same as \cmd\end@column@mlt +% (except for the test of \cmd\@ifx@empty\cmd\@dbltoplist): +% the two could almost be the same procedure. +% +% I have changed this procedure to avoid the testing it once did: it simply puts down interrupts, +% upon which it relies to correctly do what \cmd\clearpage\ requires. +% \begin{macrocode} +\def\end@column@one{% + \unvbox\@cclv\remove@lastbox + \protect@penalty\do@newpage@pen +}% +% \end{macrocode} +% +% The procedure \cmd\output@column@one\ is dispatched from the output routine when +% we have completed a page (that is, a column in a one-column page grid); +% it ships out the page using the \cmd\@outputpage. +% It will be followed up with an output routine message to prepare a new column. +% +% Query: by what mechanism do the footnotes get placed onto such a page? +% \begin{macrocode} +\def\output@column@one{% + \@outputpage +}% +% \end{macrocode} +% +% The following procedure determines which side of the page a marginpar will appear. +% It reproduces the behavior of standard \LaTeX. +% \begin{macrocode} +\def\@addmarginpar@one{% + \@if@sw\if@mparswitch\fi{% + \@ifodd\c@page{\false@sw}{\true@sw}% + }{\false@sw}{% + \@if@sw\if@reversemargin\fi{\false@sw}{\true@sw}% + }{% + \@if@sw\if@reversemargin\fi{\true@sw}{\false@sw}% + }% +}% +% \end{macrocode} +% +% The following procedure yields a Boolean value; it determines whether a float in the deferred queue +% is appropriate for placing. In the one-column grid, all floats are so. +% \begin{macrocode} +\def\@floatselect@sw@one#1{\true@sw}% +% \end{macrocode} +% +% \begin{macrocode} +\def\onecolumngrid@push{% + \do@output@MVL{% + \@ifnum{\pagegrid@col=\@ne}{% + \global\let\restorecolumngrid\@empty + }{% + \xdef\restorecolumngrid{% + \noexpand\start@column{\thepagegrid}{\the\pagegrid@col}% + }% + \start@column{one}{\@ne}% + }% + }% +}% +\def\onecolumngrid@pop{% + \do@output@MVL{\restorecolumngrid}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Two-column page grid} +% +% \begin{macro}{\twocolumngrid} +% \begin{macro}{\open@column@mlt} +% \begin{macro}{\shut@column@mlt} +% \begin{macro}{\end@column@mlt} +% \begin{macro}{\output@column@mlt} +% \begin{macro}{\@addmarginpar@mlt} +% \begin{macro}{\set@footnotewidth@mlt} +% \begin{macro}{\set@footnotewidth@two} +% \begin{macro}{\compose@footnotes@two} +% Here are all the procedures necessary for the standard page grid named ``mlt'': +% the multi-column page grid. With an argument of "2", it is, +% of course, \LaTeX's familiar \cmd\twocolumn\ layout. +% +% We start with the procedure to switch to the two-column page grid. +% \begin{macrocode} +\newcommand\twocolumngrid{\do@columngrid{mlt}{\tw@}}% +% \end{macrocode} +% +% The corresponding command of \LaTeX\ is obsolete. +% \begin{macrocode} +\let\twocolumn\@undefined +% \end{macrocode} +% +% Of course, \cmd\@topnewpage\ is also obsolete. Just do +%\begin{quote} +% \cmd\clearpage\cmd\onecolumngrid<vertical mode material>\cmd\twocolumngrid. +%\end{quote} +% \begin{macrocode} +\let\@topnewpage\@undefined +% \end{macrocode} +% +% If your document class descends from one of \LaTeX's standard classes.dtx-derived +% classes, it will break. You must expunge from it all such commands. +% +% \changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +% +% Bug 571 note: it is not enough to have the \cmd\pagesofar, we must also deal with the \cmd\footsofar. +% At this juncture, we should treat the case where the document has an essentially two-column page grid, +% with occasional excursions into the one-column grid. +% If a footnote is set within the latter grid, its set width should be that of the two-column grid. +% +% When a page is shipped out, if we are currently in a one-column grid, we will compose the footnotes onto the page +% in the form of balanced columns. This is only one way to handle footnotes: \classname{multicol} +% appears to set footnotes on the full text width. +% \begin{macrocode} +\def\open@column@mlt#1{% + \ltxgrid@info@sw{\class@info{\string\open@column@mlt\string#1}}{}% +% \end{macrocode} +% At this point, we must \cmd\insert\ the footnotes back into the Main Vertical List. +% \changes{4.1n}{2010/01/02}{(AO, 571) coding convention: use \cs{bgroup}, \cs{egroup} (instead of braces) when a box is being built}% +% \begin{macrocode} + \@ifvoid{\footsofar}{}{% + \insert\footins\bgroup\unvbox\footsofar\egroup + }% +% \end{macrocode} +% Record which page grid we are using. Then calculate the set width (\cmd\hsize) and the goal height (\cmd\vsize). +% +% Klootch: we set the \cmd\count\cmd\footins\ to a magic number. This value is valid whether footnotes are being +% set on the column width or the full text width. +% \begin{macrocode} + \gdef\thepagegrid{mlt}% + \global\pagegrid@col#1% + \global\pagegrid@cur\@ne + \global\count\footins\@m + \set@column@hsize\pagegrid@col + \set@colht +}% +% \end{macrocode} +% +% The procedure \cmd\shut@column@mlt\ ends the current column, balances the columns, and +% salts away all in \cmd\pagesofar. Because it is called in a message handler, +% we are assured that marks are handled properly. +% Attention: because this procedure balances columns, all footnotes are +% held aside in \cmd\footsofar\ for placement at the bottom of the page. +% +% Bug note: the last macro executed by this procedure is \cmd\set@colht, +% but had been erroneously \cmd\set@colroom. +% I now believe that the latter should be changed pretty much everywhere to the former. +% +% This instance of \cmd\@makecolumn\ is building material for \cmd\pagesofar, rather than +% for \cmd\shipout. +% \changes{4.1b}{2008/08/04}{Change \cs{@makecol} to \cs{@makecolumn} with argument} +% \changes{4.1b}{2008/08/04}{Change \cs{@combinepage} to \cs{@combinepage} with argument} +% \changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \changes{4.1n}{2010/01/02}{(AO, 571) calling sequence of \cs{combine@foot@inserts} and \cs{grid@column} to expose box registers; that of \cs{append@column@} its column counters}% +% \begin{macrocode} +\def\shut@column@mlt{% + \ltxgrid@info@sw{\class@info{\string\shut@column@mlt}}{}% + \@cclv@nontrivial@sw{% + \@makecolumn\false@sw + \@ifnum{\pagegrid@cur<\pagegrid@col}{% + \expandafter\global\expandafter\setbox\csname col@\the\pagegrid@cur\endcsname\box\@outputbox + \global\advance\pagegrid@cur\@ne + }{}% + }{% + \void@cclv + }% + \@ifnum{\pagegrid@cur>\@ne}{% + \csname balance@\the\pagegrid@col\endcsname + \grid@column\@outputbox{}% + \@combinepage\false@sw + \@combinedblfloats + \global\setbox\pagesofar\box\@outputbox + \show@pagesofar@size + }{}% + \set@colht +}% +% \end{macrocode} +% +% The procedure \cmd\float@column@mlt\ takes care of a float page that has been built by \cmd\@tryfcolumn, +% in the multi-column page grid. It is coincidentally identical to what happens in +% \cmd\do@startpage\ when a page needs to be shipped out. +% \changes{4.1b}{2008/08/04}{New procedure \cs{@output@combined@page}} +% \begin{macrocode} +\def\float@column@mlt{% + \@output@combined@page +}% +% \end{macrocode} +% +% The procedure \cmd\end@column@mlt\ is executed at the end of \cmd\clearpage\ processing, +% if we were in a multi-column page grid, once all permissive float pages have been shipped out. +% If no floats are committed and if no columns are yet filled, we have nothing to do. +% Otherwise, we kick out a column and try again. +% +% Note that in our code to kick out a column, we must deal properly with the case where the column +% is trivial: it will have nothing but \cmd\topskip\ glue plus a protection box. We substitute an ordinary +% \cmd\null\ for the protection box. +% +% \begin{macrocode} +\def\end@column@mlt{% + \@ifx@empty\@toplist{% + \@ifx@empty\@botlist{% + \@ifx@empty\@dbltoplist{% + \@ifx@empty\@deferlist{% + \@ifnum{\pagegrid@cur=\@ne}{% + \false@sw + }{% + \true@sw + }% + }{% + \true@sw + }% + }{% + \true@sw + }% + }{% + \true@sw + }% + }{% + \true@sw + }% + % true = kick out a column and try again + {% + \@cclv@nontrivial@sw{% + \unvbox\@cclv\remove@lastbox + }{% + \unvbox\@cclv\remove@lastbox\unskip\null + }% + \protect@penalty\do@newpage@pen + \protect@penalty\do@endpage@pen + }{% + \unvbox\@cclv\remove@lastbox + }% +}% +% \end{macrocode} +% +% The procedure \cmd\output@column@mlt (cf. \cmd\output@column@one) +% is dispatched from the output routine when +% we have completed a column in a multi-column page grid). +% (It replaces the \cmd\@outputdblcol\ of standard \LaTeX.) +% If a complete set of columns is at hand, it ships out the page and +% lays down an interrupt for \cmd\do@startpage@pen, which will commit the +% full-page-width floats to the next page. +% Like \cmd\output@column@mlt, this is followed by +% an output routine message to prepare a new column. +% +% If a page needs to be shipped out, it uses the same mechanism as \cmd\do@startpage. +% \changes{4.1b}{2008/08/04}{New procedure \cs{@output@combined@page}} +% \changes{4.1n}{2010/01/02}{(AO, 571) calling sequence of \cs{combine@foot@inserts} and \cs{grid@column} to expose box registers; that of \cs{append@column@} its column counters}% +% \begin{macrocode} +\def\output@column@mlt{% + \@ifnum{\pagegrid@cur<\pagegrid@col}{% + \expandafter\global\expandafter\setbox\csname col@\the\pagegrid@cur\endcsname\box\@outputbox + \global\advance\pagegrid@cur\@ne + }{% + \set@adj@colht\dimen@ + \grid@column\@outputbox{}% + \@output@combined@page + }% +}% +% \end{macrocode} +% The procedure \cmd\output@column@mlt\ obsoletes \LaTeX's \cmd\@outputdblcol +% \begin{macrocode} +\let\@outputdblcol\@undefined +% \end{macrocode} +% +% The following procedure yields a Boolean value; it determines whether a float in the deferred queue +% is appropriate for placement in the column. In the multi-column grid, only those narrower than \cmd\textwidth\ are so. +% \begin{macrocode} +\def\@floatselect@sw@mlt#1{\@if@notdblfloat{#1}}% +% \end{macrocode} +% +% The following procedure determines which side of the page a marginpar will appear. +% It reproduces the behavior of standard \LaTeX. +% \begin{macrocode} +\def\@addmarginpar@mlt{% emits a boolean + \@ifnum{\pagegrid@cur=\@ne}% +}% +% \end{macrocode} +% +% \cmd\set@footnotewidth@one\ sets the width of type within footnotes to span the full text width; +% \cmd\set@footnotewidth@two\ to span a single column of the two-column grid, and +% more generally \cmd\set@footnotewidth@mlt\ for a multi-column page grid. +% \begin{macrocode} +\def\set@footnotewidth@one{% + \hsize\columnwidth + \linewidth\hsize +}% +\def\set@footnotewidth@two{\set@footnotewidth@mlt\tw@}% +\def\set@footnotewidth@mlt#1{% + \hsize\textwidth + \advance\hsize\columnsep + \divide\hsize#1% + \advance\hsize-\columnsep + \linewidth\hsize +}% +% \end{macrocode} +% +% \cmd\compose@footnotes\ is the procedure for arranging the footnotes for +% placement at the bottom of the page or column. +% In the former case, the material will be shipped out; in the latter, we must allow +% the column to possibly be balanced later on. +% +% \cmd\compose@footnotes@one\ is a no-op, because the footnotes require no rearrangement. +% In a scheme where footnotes are set on the full text width, this would be the procedure called. +% +% \cmd\compose@footnotes@two\ implements the case where a two-column document has been interrupted +% with full-page-width text (e.g., the widetext environment or the end of the document), +% and a natural page break appears. +% +% In either case, we assume that argument \verb+#1+ is an \cmd\insert\ register and must be assigned globally, +% so that when it is accessed with \cmd\box\ or \cmd\unvbox, it will be voided globally as well. +% +% To extend this scheme to a three-column page grid \cmd\compose@footnotes@thr@@\ would be created: +% it would balance the saved up footnotes into three columns. +% +% \begin{macrocode} +\def\compose@footnotes@one#1{% + \ltxgrid@foot@info@sw{\class@info{\string\compose@footnotes@one\string#1}\trace@box#1}{}% +}% +\let\compose@footnotes\compose@footnotes@one +\def\compose@footnotes@two#1{% + \ltxgrid@foot@info@sw{\class@info{\string\compose@footnotes@two\string#1}\trace@box#1}{}% + \setbox\z@\box\@tempboxa + \let\recover@column\recover@column@null + \let\marry@baselines\@empty + \balance@two#1\@tempboxa + \global\setbox#1\hbox to\textwidth{\box#1\hfil\box\@tempboxa}% + \ltxgrid@foot@info@sw{\trace@box#1}{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Page grid utility procedures} +% +% \begin{macro}{\pagegrid@cur} +% \begin{macro}{\pagegrid@col} +% \begin{macro}{\pagegrid@init} +% We take over \LaTeX's \cmd\col@number, and \cmd\@leftcolumn, which are obsolete (\cmd\@holdpg\ could also be taken over). +% We create two counters to hold the columns in the page grid and the current column within. +% We also create the first of a set of box registers to hold the committted columns. +% \begin{macrocode} +\let\pagegrid@cur\col@number +\let\col@number\@undefined +\newcount\pagegrid@col +\pagegrid@cur\@ne +\expandafter\let\csname col@\the\pagegrid@cur\endcsname\@leftcolumn +\let\@leftcolumn\@undefined +% \end{macrocode} +% +% The default is for maximum two columns. +% If your class will require more columns, assign that number to \cmd\pagegrid@col\ +% before \envb{document} time. +% \begin{macrocode} +\pagegrid@col\tw@ +% \end{macrocode} +% +% The procedure \cmd\pagegrid@init\ is a loop, exercising \cmd\newbox\ sufficiently to create the +% boxes for holding the columns in the page grid; these have names like \expandafter\cmd\csname col@1\endcsname, etc. +% \begin{macrocode} +\def\pagegrid@init{% + \advance\pagegrid@cur\@ne + \@ifnum{\pagegrid@cur<\pagegrid@col}{% + \csname newbox\expandafter\endcsname\csname col@\the\pagegrid@cur\endcsname + \pagegrid@init + }{% + }% +}% +\appdef\class@documenthook{% + \pagegrid@init +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\grid@column} +% \changes{4.1n}{2010/01/02}{(AO, 571) calling sequence of \cs{combine@foot@inserts} and \cs{grid@column} to expose box registers; that of \cs{append@column@} its column counters}% +% The procedure \cmd\grid@column\ knows how to lay up the columns in a multi-column page grid. +% It uses utility procedures \cmd\append@column@\ and \cmd\box@column. +% +% The first argument is the box register to create, usually \cmd\@outputbox, and provides both input and output. +% The second argument a dimension, allowing us to strut down the depth of the box we create. +% +% \begin{macrocode} +\def\grid@column#1#2{% + \ltxgrid@info@sw{\class@info{\string\grid@column\string#1}}{}% + \global\setbox#1\vbox\bgroup + \hb@xt@\textwidth\bgroup + \vrule\@height\z@\@width\z@\@if@empty{#2}{}{\@depth#2}% + \pagegrid@cur\@ne + \@ifnum{\pagegrid@cur<\pagegrid@col}{\loopwhile{\append@column@\pagegrid@cur\pagegrid@col}}{}% + \box@column#1% + \egroup +% \end{macrocode} +% FIXME: page depth! +% \begin{macrocode} + \vskip\z@skip + \egroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\append@column@} +% \begin{macro}{\box@column} +% \begin{macro}{\marry@baselines} +% The procedure \cmd\append@column@\ appends columns for \cmd\grid@column, +% \cmd\box@column\ builds the columns for \cmd\append@column@, +% and \cmd\marry@baselines\ pastes vertical things back together. +% \changes{4.0a}{2001/06/18}{Introduce \cs{marry@height} } +% +% Note that \cmd\box@column\ makes an attempt to prevent excessive \cmd\topskip\ +% or \cmd\baselineskip\ glue +% from being applied by \TeX\ when \cmd\@outputbox\ is contributed to the MVL. +% If this is not done, it is possible to get into an infinite loop in the corner case, +% wherein the page grid is changed to one column and the balanced-up columns are +% already sufficient to fill the page. +% +% Note (AO 0920): I have changed the dimension involved with \cmd\box@column\ from +% \cmd\vsize\ to \cmd\textheight, because the former is certainly not the correct value +% to use: it will change if floats have been placed in the last column of the page. +% I believe \cmd\textheight\ is the correct parameter to use here. +% +% A REVTeX4 user, Sergey Strelkov (strelkov@maik.rssi.ru), wants the option +% of ragged-bottom columns. Implementing this feature properly means reboxing the +% columns to their natural height only if \cmd\raggedcolumn@sw\ is true. +% Otherwise, they get reboxed to their common height (\cmd\@colht?). +% +% Note that the default has hereby changed from ragged to flush. +% It's not clear that anyone but Sergey will notice. +% +% The macro \cmd\marry@skip\ addresses (in a limited way) +% the fact that neither the value of \cmd\baselineskip\ nor that of \cmd\topskip\ +% can be relied upon for the purpose of marrying the baselines of two split columns. +% (Because there might have been a local change to their values at the point where +% the output routine got triggered.) +% +% For best results, your document class should call for grid changes only when in basal text +% settings. The \cmd\marry@baselines\ procedure will use the values appropriate to that point +% when attempting to put the columns back together. +% +% In any case, we are not attempting to solve the more general problem of how to marry baselines +% where the leading can change arbitrarily within the galley or where glue could have been trimmed +% at a page top. +% +% \changes{4.1n}{2010/01/02}{(AO, 571) calling sequence of \cs{combine@foot@inserts} and \cs{grid@column} to expose box registers; that of \cs{append@column@} its column counters}% +% Procedure \cmd\append@column@\ composes a column onto the horizontal list along with its \cmd\columnseprule. +% Its arguments are: \verb+#1+---\cmd\pagegrid@cur, and \verb+#2+---\cmd\pagegrid@col +% \begin{macrocode} +\def\append@column@#1#2{% + \expandafter\box@column\csname col@\the#1\endcsname + \hfil\vrule\@width\columnseprule\hfil + \advance#1\@ne +% \end{macrocode} +% This procedure is the argument of \cmd\loopwhile, so it must leave a Boolean (e.g., \cmd\true@sw) in \TeX's scanner. +% \begin{macrocode} + \@ifnum{#1<#2}% +}% +% \end{macrocode} +% \changes{4.1n}{2010/01/02}{(AO, 571) calling sequence of \cs{combine@foot@inserts} and \cs{grid@column} to expose box registers; that of \cs{append@column@} its column counters}% +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \changes{4.1n}{2010/01/02}{(AO, 571) coding convention: use \cs{bgroup}, \cs{egroup} (instead of braces) when a box is being built}% +% Procdure \cmd\box@column, used by \cmd\append@column@, puts down a box containing the specified column. +% Its height is adjusted down to \cmd\@colht, if needed; likewise, the width is set to \cmd\columnwidth. +% The rag at the bottom is controlled by \cmd\raggedcolumn@skip. +% \begin{macrocode} +\def\box@column#1{% + \ltxgrid@info@sw{\class@info{\string\box@column\string#1}}{}% + \raise\topskip + \hb@xt@\columnwidth\bgroup + \dimen@\ht#1\@ifdim{\dimen@>\@colht}{\dimen@\@colht}{}% + \count@\vbadness\vbadness\@M + \dimen@ii\vfuzz\vfuzz\maxdimen + \ltxgrid@info@sw{\saythe\@colht\saythe\dimen@}{}% + \vtop to\dimen@\bgroup + \hrule\@height\z@ + \unvbox#1% + \raggedcolumn@skip + \egroup + \vfuzz\dimen@ii + \vbadness\count@ + \hss + \egroup +}% +% \end{macrocode} +% The purpose of procedure \cmd\marry@baselines\ is to ensure that the baseline spacing is correct; +% it does this by making adjustments to the previous line, compensating for its depth, and by adding in +% skip glue in an amount that assumes the added material has \cmd\topskip\ glue above. +% \begin{macrocode} +\def\marry@baselines{% + \begingroup + \setbox\z@\lastbox + \@ifvoid{\z@}{% + \endgroup + }{% + \aftergroup\kern + \aftergroup-% + \expandafter\box\expandafter\z@\expandafter\endgroup\the\dp\z@\relax + }% + \vskip\marry@skip\relax +}% +\gdef\marry@skip{\z@skip}% +\def\set@marry@skip{% + \begingroup + \skip@\baselineskip\advance\skip@-\topskip + \@ifdim{\skip@>\z@}{% + \xdef\marry@skip{\the\skip@}% + }{}% + \endgroup +}% +% \end{macrocode} +% \changes{4.1b}{2008/08/04}{Use \cs{document@inithook} instead of \cs{AtBeginDocument}} +% \begin{macrocode} +\appdef\document@inithook{% + \@ifxundefined\raggedcolumn@sw{\@booleanfalse\raggedcolumn@sw}{}% +}% +\def\raggedcolumn@skip{% + \vskip\z@\raggedcolumn@sw{\@plus.0001fil\@minus.0001fil}{}\relax +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@combinepage} +% The procedure \cmd\@combinepage\ prepends the stored page (\cmd\pagesofar) to \cmd\@outputbox\ and +% employs \cmd\@combineinserts\ to lay down the footnotes. +% The next event will usually be shipping out the made-up page, but not always. +% Therefore the argument of \cmd\@combinepage, which must be a Boolean, determines +% if the footnotes are to be combined into this page. +% +% \changes{4.1b}{2008/08/04}{Change \cs{@combinepage} to \cs{@combinepage} with argument} +% \changes{4.1b}{2008/08/04}{(AO, 452) Support length checking: show size of shipped out text.} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% +% QUERY: In the following, if \cmd\box\cmd\footins\ is not void, its contents are lost. Can this ever happen? +% \begin{macrocode} +\def\@combinepage#1{% + \ltxgrid@foot@info@sw{\class@info{\string\@combinepage\string#1}}{}% + \@ifvoid\pagesofar{}{% + \setbox\@outputbox\vbox{% + \unvbox\pagesofar + \marry@baselines + \unvbox\@outputbox + }% + }% + #1{% + \@ifvoid\footsofar{}{% +% \end{macrocode} +% At this point, \cmd\footins\ is empty; all of the footnotes have been combined into \cmd\footsofar. +% \begin{macrocode} + \show@box@size{Combining page footnotes}\footsofar + \setbox\footins\box\footsofar +% \end{macrocode} +% Depending on the page grid, we compose the footnotes for placement on the page. +% \begin{macrocode} + \compose@footnotes + \@combineinserts\@outputbox\footins + }% + }{% +% \end{macrocode} +%QUERY: The following line was removed, probably to fix a bug. When was this done? +% \begin{verbatim} +% \global\setbox\footins\box\footsofar +% \end{verbatim} +% \begin{macrocode} + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@cflt} +% \begin{macro}{\@cflb} +% \changes{4.1b}{2008/08/04}{} +% We modify \LaTeX's \cmd\@cflt\ and \cmd\@cflb\ to remove the unwanted glue with \cmd\unskip. +% \begin{macrocode} +\def \@cflt{% + \let \@elt \@comflelt + \setbox\@tempboxa \vbox{}% + \@toplist + \setbox\@outputbox \vbox{% + \boxmaxdepth \maxdepth + \unvbox\@tempboxa\unskip + \topfigrule\vskip \textfloatsep + \unvbox\@outputbox + }% + \let\@elt\relax + \xdef\@freelist{\@freelist\@toplist}% + \global\let\@toplist\@empty +}% +\def \@cflb {% + \let\@elt\@comflelt + \setbox\@tempboxa \vbox{}% + \@botlist + \setbox\@outputbox \vbox{% + \unvbox\@outputbox + \vskip \textfloatsep\botfigrule + \unvbox\@tempboxa\unskip + }% + \let\@elt\relax + \xdef\@freelist{\@freelist\@botlist}% + \global \let \@botlist\@empty +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@combinedblfloats} +% We modify \LaTeX's \cmd\@combinedblfloats\ to be more appropriate for incremental page building: +% we \cmd\unvbox\ the \cmd\@outputbox. +% \begin{macrocode} +\def\@combinedblfloats{% + \@ifx@empty\@dbltoplist{}{% + \setbox\@tempboxa\vbox{}% + \let\@elt\@comdblflelt\@dbltoplist + \let\@elt\relax\xdef\@freelist{\@freelist\@dbltoplist}% + \global\let\@dbltoplist\@empty + \setbox\@outputbox\vbox{% + %\boxmaxdepth\maxdepth %% probably not needed, CAR + \unvbox\@tempboxa\unskip + \@ifnum{\@dbltopnum>\m@ne}{\dblfigrule}{}%FIXME: how is \@dbltopnum maintained? + \vskip\dbltextfloatsep + \unvbox\@outputbox + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@column@hsize}% +% The procedure \cmd\set@column@hsize\ takes care of setting up the horizontal dimensions +% for the current page grid. The present routine will certainly not be adequate for more +% complex page layouts (e.g., with a side column), but works for the common ones. +% \changes{4.0a}{2001/06/18}{Introduce \cs{set@marry@height} } +% \begin{macrocode} +\def\set@column@hsize#1{% + \pagegrid@col#1% + \global\columnwidth\textwidth + \global\advance\columnwidth\columnsep + \global\divide\columnwidth\pagegrid@col + \global\advance\columnwidth-\columnsep + \global\hsize\columnwidth + \global\linewidth\columnwidth + \skip@\baselineskip\advance\skip@-\topskip + \@ifnum{\pagegrid@col>\@ne}{\set@marry@skip}{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@colht}% +% \begin{macro}{\set@colroom}% +% \begin{macro}{\set@vsize}% +% \begin{macro}{\set@adj@colht}% +% The story of \cmd\textheight, \cmd\@colht, \cmd\@colroom, and \cmd\vsize. +% +% \cmd\textheight---height of the text column. Not a running parameter, however, each time a page is +% shipped out, the \cmd\textheight\ could in principle be altered. This must be done before +% +% \cmd\@colht---\cmd\textheight\ minus the height of any full-page-width floats. The latter are committed +% only just after shipping out, and only if we are in a multicolumn page grid. +% Therefore, \cmd\@colht\ should be set after a \cmd\shipout\ (by \cmd\@outputpage) and +% will be adjusted when full-page-width floats are committed to the fresh page by \cmd\do@startpage. +% +% \cmd\@colroom---\cmd\@colht\ (adjusted by \cmd\pagesofar) minus the height of any column-width floats. +% The latter are committed anywhere on the page, at which point \cmd\@colroom\ must be adjusted. +% Therefore, \cmd\@colroom\ should be set (by \cmd\set@colroom) whenever a column is prepared (by ). +%FIXME: committed (by \cmd\output@column@) and +% will be adjusted (by \cmd\@add@float\ or \cmd\do@startcolumn) whenever a float is committted to the column. +% +% \cmd\vsize---\cmd\@colroom. +% Therefore, \cmd\vsize\ should be set (by \cmd\set@vsize) whenever +% the \cmd\@colroom\ is set (by \cmd\set@colroom) or adjusted (by \cmd\@add@float\ or \cmd\do@startcolumn) +%FIXME: or when the \cmd\pagesofar\ box is changed (after invoking \cmd\open@column@). +% +% Question: what if there are committed floats? Footnotes? +% Answer: full-page-width floats are only committed at top, and they are already reckoned with in \cmd\@colht. +% Column-width committed floats are incorporated by \cmd\@makecolumn. +% +% As to footnotes, our scheme is to keep the \cmd\footins\ insert register up to date, and to use the insert mechanism +% to ensure room for footnotes. +% When a change is made to the page grid, the footnotes will need to be propagated back into the MVL. +% +% Note: FIXME: adjusting for \cmd\pagesofar\ is done at not quite the right time. I need to reexamine \cmd\set@colht, +% because \cmd\@dbltoplist\ and \cmd\pagesofar\ really should be on the same footing. +% Perhaps \cmd\@colht\ and \cmd\@colroom\ should both deal with their respective ``lists'' in the same way? +% +% These concerns will be particularly germane if we ever extend this package to deal with full-page-width floats +% placed at the bottom of the page, or committed on the same page as called out. +% +% It occurs to me that we should ditch \cmd\set@colroom\ and only ever execute \cmd\set@colht, +% which sets \cmd\@colroom\ as a side effect. +% If so, we can make \cmd\@colht\ take \cmd\pagesofar\ into account, as it should. Then \cmd\@colht\ will return to its +% original significance as the value that \cmd\@colroom\ is set to after a column is committed. +% +% On the other hand, why not simply forget all this caching and (re-)calculate \cmd\vsize\ as late as possible? +% Particularly, \cmd\@colht\ is an artifact of the old way of doing things, where once it was set, it would never change. +% +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \begin{macrocode} +\def\set@colht{% + \set@adj@textheight\@colht + \global\let\enlarge@colroom\@empty + \set@colroom +}% +\def\set@adj@textheight#1{% + \ltxgrid@info@sw{\class@info{\string\set@adj@textheight\string#1}\saythe\textheight}{}% + #1\textheight + \def\@elt{\adj@page#1}% + \@booleantrue\firsttime@sw\@dbltoplist + \let\@elt\relax + \global#1#1\relax + \ltxgrid@info@sw{\saythe#1}{}% +}% +\def\set@colroom{% + \ltxgrid@info@sw{\class@info{\string\set@colroom}}{}% + \set@adj@colht\@colroom + \@if@empty\enlarge@colroom{}{% + \global\advance\@colroom\enlarge@colroom\relax + \ltxgrid@info@sw{\saythe\@colroom}{}% + }% + \@ifdim{\@colroom>\topskip}{}{% + \ltxgrid@info{Not enough room: \string\@colroom=\the\@colroom; increasing to \the\topskip}% + \@colroom\topskip + }% + \global\@colroom\@colroom +%<ignore> \ltxgrid@info@sw{\class@info{\string\set@colroom\string\vsize=\string\colroom}\saythe\vsize}{}% + \set@vsize +}% +% +\def\set@vsize{% + \global\vsize\@colroom + \ltxgrid@info@sw{\class@info{\string\set@vsize\string\vsize=\string\colroom}\saythe\vsize}{}% +}% +% \end{macrocode} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \begin{macrocode} +\def\set@adj@colht#1{% + #1\@colht + \ltxgrid@info@sw{\class@info{\string\set@adj@colht\string#1-\string\pagesofar}\saythe#1}{}% + \@ifvoid\pagesofar{}{% + \advance#1-\ht\pagesofar\advance#1-\dp\pagesofar + \ltxgrid@info@sw{\class@info{\string\pagesofar}\saythe#1}{}% + }% + \def\@elt{\adj@column#1}% + \@booleantrue\firsttime@sw\@toplist + \@booleantrue\firsttime@sw\@botlist + \let\@elt\relax +}% +\def\adj@column#1#2{% + \advance#1-\ht#2% + \advance#1-\firsttime@sw{\textfloatsep\@booleanfalse\firsttime@sw}{\floatsep}% + \ltxgrid@info@sw{\class@info{\string\adj@column\string#1-\string#2}\saythe#1}{}% +}% +\def\adj@page#1#2{% + \advance#1-\ht#2% + \advance#1-\firsttime@sw{\dbltextfloatsep\@booleanfalse\firsttime@sw}{\dblfloatsep}% + \ltxgrid@info@sw{\class@info{\string\adj@page\string#1-\string#2}\saythe#1}{}% +}% +\def\set@adj@box#1#2{% + \@ifvoid#2{}{% + \advance#1-\ht#2\advance#1-\dp#2% + \@booleantrue\temp@sw + \ltxgrid@foot@info@sw{\class@info{\string\set@adj@box\string#2}\saythe#1}{}% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@outputpage@tail}% +% \changes{4.1b}{2008/08/04}{Procedure \cs{@outputpage@tail} tailpatches \cs{@outputpage}}% +% In \cmd\@outputpage@tail, we set \cmd\@colht\ and the float placement parameters +% (this is the one point where it is appropriate to set \cmd\@colht). +% At \cmd\do@startpage\ time, we adjust \cmd\@colht's value to reflect committed +% full-page-width floats. +% +% Note: with a correctly written output routine, a call to \cmd\@outputpage\ will inevitably be +% followed by a call to \cmd\do@startpage, so these procedure calls would be unneeded. +% \begin{macrocode} +\appdef\@outputpage@tail{% + \set@colht % FIXME: needed? + \@floatplacement % FIXME: needed? + \@dblfloatplacement % FIXME: needed? +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{balance@2} +% \changes{4.1b}{2008/08/04}{Procedure \cs{balance@2} defined more transparently}% +% We define procedures for balancing columns in a multicolumn layout. +% For now, we define only one: a procedure for the two-column grid. +% All others will simply \cmd\relax\ out. +% +% The following code defines \verb+\balance@2+ without all the clunky \cmd\csname\ commands +% in the replacement part, +% which appears on the right-hand side of the assignment to \cmd\toks@. +% +% The method is straightforward: balance the two columns of text, and balance the footnotes. +% Later on, \cmd\@combineinserts\ will be called to place the footnotes after the now-balanced columns. +% +% \changes{4.1f}{2009/07/14}{(AO, 519) \cs{footins} content must be preserved and reintegrated} +% It was necessary to deal with the case where \cmd\box\cmd\footsofar\ was not empty +% upon execution of this balancing code. We store it away in \cmd\box\cmd\footins\ and +% add it back in afterwards. +% +% Here is a conundrum: if we switch between single-, two-, and three-column page grids: +% On what measure should the footnotes be set? +% \begin{macrocode} +\begingroup + \catcode`\1=\cat@letter + \catcode`\2=\cat@letter +% \end{macrocode} +% \cmd\toks@\ contains the repacement part for an effective \cmd\def\cs{balance@2}. +% \begin{macrocode} + \toks@{% +% \end{macrocode} +% \cmd\balance@two, by side effect, strips footnotes into \cmd\box\cmd\footins. +% \begin{macrocode} + \setbox\footins\box\footsofar + \balance@two\col@1\@outputbox +% \end{macrocode} +% We ensure that the box assignments are global. +% \begin{macrocode} + \global\setbox\col@1\box\col@1 + \global\setbox\@outputbox\box\@outputbox +% \end{macrocode} +% The following line puts all footnotes into the footnote galley, \cmd\footsofar. +% \begin{macrocode} + \combine@foot@inserts\footsofar\footins + }% + \aftergroup\def\aftergroup\balance@2\expandafter +\endgroup\expandafter{\the\toks@}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\balance@two} +% The procedure \cmd\balance@two\ takes two columns and balances them; in the process it removes +% any footnotes that may be present to a place of safety \cmd\footsofar, +% for later placement at the foot of the shipped-out page. +% The box register \cmd\box\cmd\@ne\ is the aggregate of all columns. +% The box register \cmd\box\cmd \z@\ is the last column. +% The box register \cmd\box\cmd\tw@\ is the first column. +% The \cmd\dimen\ register \cmd\dimen@\ is the trial value to \cmd\vsplit\ to, +% initially half the height of \cmd\box\cmd\@ne. +% The \cmd\dimen\ register \cmd\dimen@i\ is the increment for the next trial; +% its initial value is equal to the initial value of \cmd\dimen@. +% The \cmd\dimen\ register \cmd\dimen@ii\ is the difference of the heights of the two columns. +% +% The procedure uses a binary search for that value of \cmd\dimen@\ which is stable to within .5\cmd\p@\ and which +% makes the last column be shorter than the others. +% +% This procedure can be extended to multiple columns simply by changing it to execute \cmd\vsplit\ multiple +% times (one less than the total number of columns in the page layout) and to calculating \cmd\dimen@ii\ +% to be the difference of the heights of last column and the \cmd\dimen@. +% Upon termination of the search, one would excute the \cmd\vsplit s once again, this time +% using the actual \cmd\col@\ box registers to store the +% balanced columns, thereby clobbering their former contents. +% +% Bug Note: +% as originally written, this macro had a bug, which is well worth avoiding under similar circumstances anywhere. +% So, learn from the mistakes of others, as they say. +% In trying to remove the depth of the boxes created via \cmd\vsplit\ within the \cmd\loopwhile\ control, +% I originally coded +% \cmd\unvbox +% \cmd\z@\ +% \cmd\setbox +% \cmd\z@ +% \cmd\lastbox\ +% \cmd\dimen@ +% \cmd\dp +% \cmd\z@\ +% \cmd\box +% \cmd\z@\ +% \cmd\vskip-% +% \cmd\dimen@. +% The error here is that the (horizontal) shift of the last box in the vertical list will be lost in the process. +% Simply put, \cmd\setbox\cmd\z@\cmd\lastbox\ fails to retain the shift of the box node in the vertical list, +% and when it is put down again via \cmd\box\cmd\z@, it will no longer have the correct shift. +% +% This bug affected things placed in the MVL with \cmd\moveleft, \cmd\moveright, \cmd\parshape, and +% \cmd\hangindent, as well as things shifted by \TeX's primitive mechanisms. +% +% A superior strategy for removing the depth of the last line of the list is more expensive, but safer: +% make a separate copy of the list, measure the depth of the last box as above, but then discard +% the list, retaining only the value of the dimension. +% +% Note that this procedure will not work if the material within is excessively chunky. +% A particular failure mode exists where none of the material is allocated to the last (right) column. +% We detect this case and revert to unbalanced columns. +% +% Another failure mode is where a large chunk occurs at the beginning of the composite box. +% In this case, the left column may fill up even when \cmd\dimen@\ is very small. +% If this configuration leaves the left column longer than the right, then we are done, +% but \cmd\dimen@\ by no means represents the height of either finished box. +% +% Therefore the last step in the process is to rebox the two columns to a common height determined +% independently of the balancing process. +% +% The dimension involved is checked against the current \cmd\@colroom\ to guard against the case where +% excessive material happens to fall in either column. +% \changes{4.1b}{2008/08/04}{Change \cs{set@colroom} to \cs{set@colht}} +% \changes{4.1n}{2009/12/02}{More diagnostics of column balancing} +% \changes{4.1n}{2010/01/02}{(AO, 571) coding convention: use \cs{bgroup}, \cs{egroup} (instead of braces) when a box is being built}% +% \changes{4.1n}{2010/01/02}{(AO, 571) Footnotes, when columns are balanced or when they are composed with their column}% +% \changes{4.1n}{2010/01/02}{(AO, 571) Change \cs{balance@two}'s balancing algorithm to more successfully balance extremely short columns.} +% \begin{macrocode} +\def\balance@two#1#2{% + \ltxgrid@info@sw{\class@info{\string\balance@two\string#1\string#2}}{}% + \outputdebug@sw{\trace@scroll{\showbox#1\showbox#2}}{}% +% \end{macrocode} +% The first step is to recover the footnotes from the bottoms of the two columns (globally, into \cmd\footsofar) +% and to combine the text into \cmd\box\cmd\@ne, but without voiding either of the argument boxes. +% \begin{macrocode} + \setbox\thr@@\copy\footsofar + \setbox\@ne\vbox\bgroup + \@ifvoid{#1}{}{% + \recover@column#1\footsofar\column@recovered\footins@recovered + \@ifvoid{#2}{}{\marry@baselines}% + }% + \@ifvoid{#2}{}{% + \recover@column#2\footsofar\column@recovered\footins@recovered + }% + \egroup + \outputdebug@sw{\trace@scroll{\showbox\@ne}}{}% + \ltxgrid@foot@info@sw{\trace@scroll{\showbox\footsofar}}{}% +% \end{macrocode} +% Hereunder, \cmd\dimen@\ is the split value. We adjust it until the step size is small enough, while the split is acceptable. +% Also, \cmd\dimen@i\ is the step size. Once this value is greater than a half point, we must iterate. +% \begin{macrocode} + \dimen@\ht\@ne\divide\dimen@\tw@ + \dimen@i\dimen@ + \vbadness\@M + \vfuzz\maxdimen + \splittopskip\topskip + \loopwhile{% + \setbox\z@\copy\@ne\setbox\tw@\vsplit\z@ to\dimen@ + \remove@depth\z@\remove@depth\tw@ +% \end{macrocode} +% The following line would provide a diagnostic of the iterations of column balancing, were we to use it. +% \begin{verbatim} +% \outputdebug@sw{\trace@scroll{\showbox\tw@\showbox\z@}}{}% +% \end{verbatim} +% Hereunder, \cmd\dimen@ii\ is used to reckon the difference in height between the left box and the right. +% \begin{macrocode} + \dimen@ii\ht\tw@\advance\dimen@ii-\ht\z@ + \dimen@i=.5\dimen@i + \ltxgrid@info@sw{\saythe\dimen@\saythe\dimen@i\saythe\dimen@ii}{}% +% \end{macrocode} +% If the columns are within a half-point of each other, +% \begin{macrocode} + \@ifdim{\dimen@ii<.5\p@}{% + \@ifdim{\dimen@ii>-.5\p@}% + }{% + \false@sw + }% +% \end{macrocode} +% The above results in a Boolean, which now chooses between the following two brace-delimited clauses. +% If the step size is less than a half-point, then terminate the loop. +% \begin{macrocode} + {% + \true@sw + }{% + \@ifdim{\dimen@i<.5\p@}% + }% +% \end{macrocode} +% The above results in a Boolean, which now chooses between the following two brace-delimited clauses. +% The true-part terminates the loop, otherwise iterate. +% \begin{macrocode} + {% + \false@sw + }% + {% +% \end{macrocode} +% For the next iteration, the candidate split dimension \cmd\dimen@\ will be one step larger +% if the height of the left box is less than that of the right box. +% Otherwise it will be one step smaller. +% \begin{macrocode} + \advance\dimen@\@ifdim{\dimen@ii<\z@}{}{-}\dimen@i + \true@sw + }% + }% +% \end{macrocode} +% The loop has terminated. +% \begin{macrocode} + \ltxgrid@info@sw{\saythe\dimen@\saythe\dimen@i\saythe\dimen@ii}{}% +% \end{macrocode} +% The algorithm has failed to find a satisfactory result if +% the left column is of non-zero height and the right column is of zero height. +% \begin{macrocode} + \@ifdim{\ht\z@=\z@}{% + \@ifdim{\ht\tw@=\z@}% + }{% + \true@sw + }% +% \end{macrocode} +% The \cmd\false@sw\ branch is executed if the algorithm has failed. +% We restore the original boxes. +% \begin{macrocode} + {% + }{% + \ltxgrid@info{Unsatifactorily balanced columns: giving up}% + \setbox\tw@\box#1% + \setbox\z@ \box#2% + \global\setbox\footsofar\box\thr@@ + }% + \setbox\tw@\vbox{\unvbox\tw@\vskip\z@skip}% + \setbox\z@ \vbox{\unvbox\z@ \vskip\z@skip}% + \set@colht + \dimen@\ht\z@\@ifdim{\dimen@<\ht\tw@}{\dimen@\ht\tw@}{}% + \@ifdim{\dimen@>\@colroom}{\dimen@\@colroom}{}% + \ltxgrid@info@sw{\saythe{\ht\z@}\saythe{\ht\tw@}\saythe\@colroom\saythe\dimen@}{}% + \setbox#1\vbox to\dimen@{\unvbox\tw@\unskip\raggedcolumn@skip}% + \setbox#2\vbox to\dimen@{\unvbox\z@ \unskip\raggedcolumn@skip}% + \outputdebug@sw{\trace@scroll{\showbox#1\showbox#2}}{}% +}% +% \end{macrocode} +% Procedure \cmd\remove@depth\ rearranges the given (vertical) box register so that it has zero depth. +% \begin{macrocode} +\def\remove@depth#1{% + \setbox#1\vbox\bgroup + \unvcopy#1% + \setbox\z@\vbox\bgroup + \unvbox#1% + \setbox\z@\lastbox + \aftergroup\kern\aftergroup-\expandafter + \egroup + \the\dp\z@\relax + \egroup +}% +% \end{macrocode} +% \end{macro} +% +% \changes{4.1n}{2010/01/02}{(AO, 571) Abandon \cs{recover@footins} in favor of \cs{recover@column}}% +% Procedure \cmd\recover@column\ is a utility to separate a column box into text and footnotes; +% the former being contributed to the current (vertical) list, the latter appended to the given register, usually \cmd\footsofar. +% +% Argument \verb+#1+ is the input: it should be a \cmd\vbox, and it remains unaltered. +% Argument \verb+#2+ is the box into which to (globally) add the footnotes, usually \cmd\footsofar. +% Arguments \verb+#3+ and \verb+#4+ are scratch box registers to use in this calculation. +% As a side effect, \verb+#3+ will be unboxed into whatever vertical mode we are in at the moment (should be a \cmd\vbox). +% \begin{macrocode} +\def\recover@column#1#2#3#4{% + \ltxgrid@info@sw{\class@info{\string\recover@column\string#1\string#2\string#3\string#4}}{}% + \setbox#4\vbox{\unvcopy#1}% + \ltxgrid@foot@info@sw{\trace@scroll{\showbox#4}}{}% + \dimen@\ht#4% + \ltxgrid@foot@info@sw{\saythe\dimen@}{}% + \setbox#4\vbox\bgroup + \unvbox#4\unskip +% \end{macrocode} +% We now strip the footnotes from the bottom of this box, adding them to \cmd\footsofar. +% The method relies on a signal, consisting of a complementary pair of kerns, placed at the bottom of the box by \cmd\@combineinserts. +% \begin{macrocode} + \dimen@i\lastkern\unkern\advance\dimen@i\lastkern + \@ifdim{\dimen@i=\z@}{% + \dimen@i\lastkern\unkern + \ltxgrid@foot@info@sw{\saythe\dimen@i}{}% + \aftergroup\dimen@i + \expandafter\egroup\the\dimen@i\relax + }{% + \egroup + }% +% \end{macrocode} +% Split the column into \verb+#3+ and the footnote into \verb+#4+. +% Append the footnote to \verb+#2+. +% \begin{macrocode} + \@ifdim{\dimen@i<\z@}{% + \advance\dimen@\dimen@i + \ltxgrid@foot@info@sw{\saythe\dimen@i\saythe\dimen@}{}% + \splittopskip\z@skip + \global\setbox#3\vsplit#4 to\dimen@ + \global\setbox#4\vbox{\unvbox#4}% + \ltxgrid@foot@info@sw{\trace@scroll{\showbox#1\showbox#2\showbox#3\showbox#4}}{}% + \global\setbox#2\vbox\bgroup\unvbox#2\vskip\z@skip\unvbox#4\egroup + }{% +% \end{macrocode} +% What if \cmd\dimen@i\ is zero? +% In that case, \cmd\setbox\#3\cmd\box\#4, and do not touch \cmd\box\#2. +% \begin{macrocode} + \setbox#3\box#4% + \ltxgrid@foot@info@sw{\trace@scroll{\showbox#1\showbox#2\showbox#3\showbox#4}}{}% + }% + \unvbox#3% + \loopwhile{\dimen@\lastskip\@ifdim{\dimen@>\z@}{\unskip\true@sw}{\false@sw}}% +}% +\def\recover@column@null#1#2#3#4{% + \unvcopy#1% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@begindocumenthook} +% Initialization: +% we initialize to the page grid named ``one''. +% If the class decides to initially set type in a different grid, it +% should execute these same commands, but changing the first to the appropriate procedure. +% +% Note that the point where this sequence is executed would be an excellent place to arrange for +% floats to be committed to the first page of a document. +% That is, we execute \cmd\do@startpage, which triggers \cmd\do@startcolumn. +% +% FIXME: it should be the job of the page grid to determine the procedure to execute at +% the start of the job. Make this a hook. +% \begin{macrocode} +\rvtx@ifformat@geq{2020-10-01}% + {% + \AddToHook{begindocument}{% + \open@column@one\@ne + \set@colht + \@floatplacement + \@dblfloatplacement + }% + }{% + \prepdef\@begindocumenthook{% + \open@column@one\@ne + \set@colht + \@floatplacement + \@dblfloatplacement + }% + } +% \end{macrocode} +% \end{macro} +% +% Comment: our technique of balancing columns is severely limited, because it cannot properly work +% with \env{longtable}, which places material at the bottom and top of the column break. +% +% The proper way to handle a grid change in the middle of the page is to accumulate all the material for +% an entire article (or chapter) and then assemble finished pages therefrom. This approach is fundamentally +% superior for complex layouts: it corresponds to real-world workflows. +% Such a scheme is an excellent subject for another \LaTeX\ package. +% +% +% \subsection{Patches for the longtable package}% +% +% \LaTeX's ``required'' package \classname{longtable} (written by David P. Carlilsle), +% which is part of /latex/required/tools, is incmpatible with both +% \LaTeX's ``required'' package \classname{multicol} and with +% \LaTeX's native \cmd\twocolumn\ capability. There is no essential reason +% for this incompatability, aside from implementation details, and the +% \classname{ltxgrid} package gives us the ability to lift them. +% +% Only four of \classname{longtable}'s procedures require rewriting: +% \cmd\longtable, +% \cmd\endlongtable, +% \cmd\LT@start, and +% \cmd\LT@end@hd@ft. +% The procedure \cmd\switch@longtable\ checks against their expected meanings +% and, if all is as expected, applies the patches. +% In the process, we simplify things considerably and also make them more +% secure. +% +% Why does \classname{longtable} need to access the output routine, anyway? +% What it comes down to, is what happens when a pagebreak falls within a +% long table. If this happens, we would like to append a row at the bottom of +% the broken table and add a row at the top of the next page. +% +% These things can be accomodated easily by the \classname{ltxgrid} output +% routine hooks. +% +% \begin{macro}{\longtable} +% \begin{macrocode} +\def\longtable@longtable{% + \par + \ifx\multicols\@undefined\else\ifnum\col@number>\@ne\@twocolumntrue\fi\fi + \if@twocolumn\LT@err{longtable not in 1-column mode}\@ehc\fi + \begingroup + \@ifnextchar[\LT@array{\LT@array[x]}% +}% +\def\longtable@new{% + \par + \@ifnextchar[\LT@array{\LT@array[x]}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endlongtable} +% \begin{macrocode} +\def\endlongtable@longtable{% + \crcr + \noalign{% + \let\LT@entry\LT@entry@chop + \xdef\LT@save@row{\LT@save@row}}% + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \if@filesw + {\let\LT@entry\LT@entry@write\immediate\write\@auxout{% + \gdef\expandafter\noexpand + \csname LT@\romannumeral\c@LT@tables\endcsname + {\LT@save@row}}}% + \fi + \ifx\LT@save@row\LT@@save@row + \else + \LT@warn{Column \@width s have changed\MessageBreak + in table \thetable}% + \LT@final@warn + \fi + \endgraf\penalty -\LT@end@pen + \endgroup + \global\@mparbottom\z@ + \pagegoal\vsize + \endgraf\penalty\z@\addvspace\LTpost + \ifvoid\footins\else\insert\footins{}\fi +}% +% \end{macrocode} +% \changes{4.1a}{2008/06/29}{Repair error in \cs{endlongtable@new} involving \cs{@ifx}: argument not delimited.} +% \begin{macrocode} +\def\endlongtable@new{% + \crcr + \noalign{% + \let\LT@entry\LT@entry@chop + \xdef\LT@save@row{\LT@save@row}% + }% + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \@if@sw\if@filesw\fi{% + {% + \let\LT@entry\LT@entry@write + \immediate\write\@auxout{% + \gdef\expandafter\noexpand\csname LT@\romannumeral\c@LT@tables\endcsname + {\LT@save@row}% + }% + }% + }{}% + \@ifx{\LT@save@row\LT@@save@row}{}{% + \LT@warn{% + Column \@width s have changed\MessageBreak in table \thetable + }\LT@final@warn + }% + \endgraf + \nobreak + \box\@ifvoid\LT@lastfoot{\LT@foot}{\LT@lastfoot}% + \global\@mparbottom\z@ + \endgraf + \LT@post +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LT@start} +% \begin{macrocode} +\def\LT@start@longtable{% + \let\LT@start\endgraf + \endgraf\penalty\z@\vskip\LTpre + \dimen@\pagetotal + \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \ht\LT@foot + \dimen@ii\vfuzz + \vfuzz\maxdimen + \setbox\tw@\copy\z@ + \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox + \setbox\tw@\vbox{\unvbox\tw@}% + \vfuzz\dimen@ii + \advance\dimen@ \ht + \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@\dp + \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@ -\pagegoal + \ifdim \dimen@>\z@\vfil\break\fi + \global\@colroom\@colht + \ifvoid\LT@foot\else + \advance\vsize-\ht\LT@foot + \global\advance\@colroom-\ht\LT@foot + \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ + \maxdepth\z@ + \fi + \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi +% \end{macrocode} +% At some point before version 4.11, the \cmd\nobreak\ was added. +% \begin{macrocode} +\nobreak +% \end{macrocode} +% +% \begin{macrocode} + \output{\LT@output}% +}% +\def\LT@start@new{% + \let\LT@start\endgraf + \endgraf + \markthr@@{}% + \LT@pre + \@ifvoid\LT@firsthead{\LT@top}{\box\LT@firsthead\nobreak}% + \mark@envir{longtable}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LT@end} +% \begin{macrocode} +\def\LT@end@hd@ft@longtable#1{% + \LT@echunk + \ifx\LT@start\endgraf + \LT@err{Longtable head or foot not at start of table}{Increase LTchunksize}% + \fi + \setbox#1\box\z@ + \LT@get@widths\LT@bchunk +}% +\def\LT@end@hd@ft@new#1{% + \LT@echunk + \@ifx{\LT@start\endgraf}{% + \LT@err{Longtable head or foot not at start of table}{Increase LTchunksize}% + }% + \global\setbox#1\box\z@ + \LT@get@widths + \LT@bchunk +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LT@array} +% +% +% \begin{macrocode} +\def\LT@array@longtable[#1]#2{% + \refstepcounter{table}\stepcounter{LT@tables}% + \if l#1% + \LTleft\z@ \LTright\fill + \else\if r#1% + \LTleft\fill \LTright\z@ + \else\if c#1% + \LTleft\fill \LTright\fill + \fi\fi\fi + \let\LT@mcol\multicolumn + \let\LT@@tabarray\@tabarray + \let\LT@@hl\hline + \def\@tabarray{% + \let\hline\LT@@hl + \LT@@tabarray}% + \let\\\LT@tabularcr\let\tabularnewline\\% + \def\newpage{\noalign{\break}}% + \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% + \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% + \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption + \@tempdima\ht\strutbox + \let\@endpbox\LT@endpbox + \ifx\extrarowheight\@undefined + \let\@acol\@tabacol + \let\@classz\@tabclassz \let\@classiv\@tabclassiv + \def\@startpbox{\vtop\LT@startpbox}% + \let\@@startpbox\@startpbox + \let\@@endpbox\@endpbox + \let\LT@LL@FM@cr\@tabularcr + \else + \advance\@tempdima\extrarowheight + \col@sep\tabcolsep + \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr + \fi + \setbox\@arstrutbox\hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \let\@sharp##\let\protect\relax + \begingroup + \@mkpream{#2}% + \xdef\LT@bchunk{% + \global\advance\c@LT@chunks\@ne + \global\LT@rows\z@\setbox\z@\vbox\bgroup + \LT@setprevdepth +% \end{macrocode} +% At some point before version 4.11, the \cmd\noexpand\ was added. +% We need not change our own version, because we did it right, back in 1998 (using \cmd\appdef). +% \begin{macrocode} + \tabskip\LTleft \noexpand\halign to\hsize\bgroup + \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}% + \endgroup + \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols + \LT@make@row + \m@th\let\par\@empty + \everycr{}\lineskip\z@\baselineskip\z@ + \LT@bchunk}% +\def\LT@LR@l{\LTleft\z@ \LTright\fill}% +\def\LT@LR@r{\LTleft\fill \LTright\z@ }% +\def\LT@LR@c{\LTleft\fill \LTright\fill}% +\def\LT@array@new[#1]#2{% + \refstepcounter{table}\stepcounter{LT@tables}% + \table@hook + \LTleft\fill \LTright\fill + \csname LT@LR@#1\endcsname + \let\LT@mcol\multicolumn + \let\LT@@hl\hline + \prepdef\@tabarray{\let\hline\LT@@hl}% + \let\\\LT@tabularcr + \let\tabularnewline\\% + \def\newpage{\noalign{\break}}% + \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% + \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% + \let\hline\LT@hline + \let\kill\LT@kill + \let\caption\LT@caption + \@tempdima\ht\strutbox + \let\@endpbox\LT@endpbox + \@ifxundefined\extrarowheight{% + \let\@acol\@tabacol + \let\@classz\@tabclassz + \let\@classiv\@tabclassiv + \def\@startpbox{\vtop\LT@startpbox}% + \let\@@startpbox\@startpbox + \let\@@endpbox\@endpbox +% \end{macrocode} +% Because \classname{ltxutil} patches \LaTeX's \cmd\@tabularcr and \cmd\@xtabularcr, +% we must restore these procedures in the scope of \env{longtable}. +% Ironically, the patches in \classname{ltxutil} were for the purpose of extending +% the \env{tabular} environment to prevent pagebreaks with the *-form of \cmd\\, +% just the same as is being done here. But the two mechanisms conflict. +% \changes{4.1a}{2008/06/29}{Change \cs{LT@array@new}: restore \cs{@tabularcr} and \cs{@xtabularcr}} +% \begin{macrocode} + \let\LT@LL@FM@cr\@tabularcr@LaTeX + \let\@xtabularcr\@xtabularcr@LaTeX + }{% + \advance\@tempdima\extrarowheight + \col@sep\tabcolsep + \let\@startpbox\LT@startpbox +% \end{macrocode} +% \changes{4.1a}{2008/06/29}{Change \cs{LT@array@new}: set \cs{LT@LL@FM@cr} to \cs{@arraycr@array} instead of \cs{@arraycr}} +% \begin{macrocode} + \let\LT@LL@FM@cr\@arraycr@array + }% +% + \let\@acoll\@tabacoll + \let\@acolr\@tabacolr + \let\@acol\@tabacol +% + \setbox\@arstrutbox\hbox{% + \vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@ + }% + \let\@sharp##% + \let\protect\relax + \begingroup + \@mkpream{#2}% + \@mkpream@relax + \edef\@preamble{\@preamble}% + \prepdef\@preamble{% + \global\advance\c@LT@chunks\@ne + \global\LT@rows\z@ + \setbox\z@\vbox\bgroup + \LT@setprevdepth + \tabskip\LTleft + \halign to\hsize\bgroup + \tabskip\z@ + \@arstrut + }% + \appdef\@preamble{% + \tabskip\LTright + \cr + }% + \global\let\LT@bchunk\@preamble + \endgroup + \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols + \LT@make@row + \m@th + \let\par\@empty + \everycr{}% + \lineskip\z@ + \baselineskip\z@ + \LT@bchunk +}% +\appdef\table@hook{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\switch@longtable} +% +% Here is the switch from standard \classname{longtable} to the new, \classname{ltxgrid}-compatible values. +% +% At this point, we extend \env{longtable} with a \env{longtable*} form, which signifies that we want to +% use the full page width for setting the table. +% You can think this way: \env{longtable*} is to \env{longtable} as \env{table*} is to \env{table}. +% +% \begin{macrocode} +\def\switch@longtable{% + \@ifpackageloaded{longtable}{% + \@ifx{\longtable\longtable@longtable}{% + \@ifx{\endlongtable\endlongtable@longtable}{% + \@ifx{\LT@start\LT@start@longtable}{% + \@ifx{\LT@end@hd@ft\LT@end@hd@ft@longtable}{% + \@ifx{\LT@array\LT@array@longtable}{% + \true@sw + }{\false@sw}% + }{\false@sw}% + }{\false@sw}% + }{\false@sw}% + }{\false@sw}% + {% + \class@info{Patching longtable package}% + }{% + \class@info{Patching unrecognized longtable package. (Proceeding with fingers crossed)}% + }% + \let\longtable\longtable@new + \let\endlongtable\endlongtable@new + \let\LT@start\LT@start@new + \let\LT@end@hd@ft\LT@end@hd@ft@new + \let\LT@array\LT@array@new + \newenvironment{longtable*}{% + \onecolumngrid@push + \longtable + }{% + \endlongtable + \onecolumngrid@pop + }% +% \end{macrocode} +% Removed obsolete code. +% \begin{macrocode} + }{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LT@pre} +% \begin{macro}{\LT@bot} +% \begin{macro}{\LT@top} +% \begin{macro}{\LT@post} +% \begin{macro}{\LT@adj} +% Note that at the end of the longtable environment, we reestablish the \cmd\mark@envir\ of the +% containing environment. We have left \cmd\curr@envir\ alone, so this will work. +% \begin{macrocode} +\def\LT@pre{\penalty\z@\vskip\LTpre}% +\def\LT@bot{\nobreak\copy\LT@foot\vfil}% +\def\LT@top{\copy\LT@head\nobreak}% +\def\LT@post{\penalty\z@\addvspace\LTpost\mark@envir{\curr@envir}}% +\def\LT@adj{% + \setbox\z@\vbox{\null}\dimen@-\ht\z@ + \setbox\z@\vbox{\unvbox\z@\LT@bot}\advance\dimen@\ht\z@ + \global\advance\vsize-\dimen@ +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{output@init} +% \begin{macro}{output@prep} +% \begin{macro}{output@post} +% \begin{macrocode} +\def\output@init@longtable{\LT@adj}% +\def\output@prep@longtable{\setbox\@cclv\vbox{\unvbox\@cclv\LT@bot}}% +\def\output@post@longtable{\LT@top}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Patches for index processing}% +% +% Another feature that uses the output routine hooks occurs within +% an index, where one wishes to apply a ``continue head'' when a +% column breaks within a primary index entry. +% Some book designs call for the continue head to only be applied +% at a turnpage break. +% +% In any case, it is easy enough for \cmd\output@post@theindex\ +% to do this in conjunction with component marks. +% Only the bare outlines are shown here. +% +% \begin{macro}{\output@init} +% \begin{macro}{\output@prep} +% \begin{macro}{\output@post} +% \begin{macrocode} +\let\output@init@theindex\@empty +\let\output@prep@theindex\@empty +\def\output@post@theindex{% + \@ifodd\c@page{}{% + \@ifnum{\pagegrid@cur=\@ne}{% +% \end{macrocode} +% We have the leftmost column of a verso page: +% Insert the current top-level continued head. +% \begin{macrocode} + }% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Checking the auxiliary file}% +% +% We relegate the checking of the auxiliary file to the output routine. +% This task must wait until the last page is shipped out, because otherwise +% the stream might get closed before the last page is shipped out. +% Obviously, we must use \cmd\do@output@MVL\ for the job. +% +% \begin{macro}{\check@aux} +% \begin{macrocode} +\def\check@aux{\do@output@MVL{\do@check@aux}}% +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{Dealing with stuck floats and stalled float dequeueing}% +% +% \LaTeX's float placement mechanism is fundamentally flawed, as evidenced by +% its warning message ``too many unprocessed floats'', which users understandably find frustrating. +% The \classname{ltxgrid} package provides tools for ameliorating the situation somewhat. +% +% Two cases require detection and rectification: +% \begin{enumerate} +% \item +% A float is ``stuck'' in the \cmd\@deferlist: for whatever reason, the float fails to be committed, +% even at the start of a fresh page. +% Once this condition prevails, following floats can never be committed, subsequently all of \LaTeX's +% float registers are used up. +% +% If this condition is detected, we reconsider float dequeueing under permissive (\cmd\clearpage-style) processing. +% +% \item +% The \cmd\@freelist\ is exhausted: +% a large concentration of floats, say, uses up all of \LaTeX's float registers all at once. +% This condition commonly occurs when the user collects floats at the end of the document, for some reason. +% +% When a float is encountered, \LaTeX\ uses a float register (allocated from a pool of free registers) to contain it until it can be placed. +% However, no further action is taken until the pagebuilder is visited, so floats can accumulate. +% Also, even after the pagebuilder is visited, deferred floats can accumulate, and these are not committed +% until a column (or page) of text is completed. +% +% Once the last free float register is used, action should be taken that will commit some of the deferred floats, +% even if this might require ending the page right where we are (resulting in a short page). +% +% Perhaps, committed floats should be stored using some mechanism other than a list, as is currently done. +% A feasible alternative storage method would be to use a \cmd\box\ register in place of +% \cmd\@toplist, +% \cmd\@botlist, and +% \cmd\@dbltoplist. +% This is probably just fine, since such committed floats are not reconsidered (I think). +% +% \end{enumerate} +% +% The emergency processing implemented here immediately ends the current page and begins to output float pages under (\cmd\clearpage-style) rules. +% It proceeds until all deferred floats have been flushed. +% +% Users should expect non-optimal page makeup under these circumstances. +% +% Note that there is a weakness in our approach that we have not attempted to repair: if floats are being +% added as part of a paragraph, we will not be able to take these remedial steps until the paragraph ends. +% This means that the approach implemented here cannot fix all \LaTeX\ documents. Users can still construct +% documents that exhaust \LaTeX's pool of float registers! +% +% \begin{macro}{\check@deferlist@stuck} +% \begin{macro}{\@outputpage@tail} +% \changes{4.1b}{2008/08/04}{Procedure \cs{@outputpage@tail} tailpatches \cs{@outputpage}}% +% We detect the case where, at the start of a fresh page, there are deferred floats, but none are +% committed. We memorize the \cmd\@deferlist\ at \cmd\shipout\ time, then examine it at the point where +% our efforts to commit floats to the new page are complete. +% If it has not changed, the first float must be stuck, and we +% attempt to fix things via \cmd\force@deferlist@stuck. +% +% This simple approach is comp[letely effective in for typical documents. +% +% Note that we try to avoid an infinite loop by examining the value of \cmd\clearpage@sw: +% if we come here with that boolean true, we are in a loop. +% \begin{macrocode} +\def\check@deferlist@stuck#1{% + \@ifx{\@deferlist@postshipout\@empty}{}{% + \@ifx{\@deferlist@postshipout\@deferlist}{% + \@fltstk + \clearpage@sw{% + \ltxgrid@warn{Deferred float stuck during \string\clearpage\space processing}% + }{% + \force@deferlist@stuck#1% + }% + }{% +% \end{macrocode} +% We have successfully committed float(s) +% \begin{macrocode} + }% + \global\let\@deferlist@postshipout\@empty + }% +}% +\def\@fltstk{% + \@latex@warning{A float is stuck (cannot be placed without \string\clearpage)}% +}% +\appdef\@outputpage@tail{% + \global\let\@deferlist@postshipout\@deferlist +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@next} +% \begin{macro}{\@xnext} +% We rewrite the \LaTeX\ kernel macros that dequeue float registers from, e.g., \cmd\@deferlist, +% providing a test for the condition where the pool of free registers is about to underflow. +% +% In this case, we attempt to fix things via \cmd\force@deferlist@empty. +% \begin{macrocode} +\def\@next#1#2{% + \@ifx{#2\@empty}{\false@sw}{% + \expandafter\@xnext#2\@@#1#2% + \true@sw + }% +}% +\def\@xnext\@elt#1#2\@@#3#4{% + \def#3{#1}% + \gdef#4{#2}% + \def\@tempa{#4}\def\@tempb{\@freelist}% + \@ifx{\@tempa\@tempb}{% + \@ifx{#4\@empty}{% + \force@deferlist@empty%{Float register pool exhausted}% + }{}% + }{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\force@deferlist@stuck} +% \begin{macro}{\force@deferlist@empty} +% \begin{macro}{\force@deferlist@sw} +% \begin{macro}{\do@forcecolumn@pen} +% \begin{macro}{\do@forcecolumn} +% The procedure \cmd\force@deferlist@empty\ is an attempt to rectify a situation where \LaTeX's float placement mechanism +% may fail (``too many unprocessed floats''). +% +% We put down interrupts that call for the float placement to be redone, but under permissive conditions, +% just the same as if \cmd\clearpage\ had been invoked. +% +% Note that the attempt to rectify the error is contingent on the setting of \cmd\force@deferlist@sw, +% default false. A document class using this package that wishes to enable this error recovery mechanism should +% set this boolean to true. +% +% The interrupt \cmd\do@forcecolumn@pen, which invokes the procedure \cmd\do@forcecolumn, +% does the same as \cmd\do@startcolumn, except under permissive conditions: +% we are trying to empty out the float registers completely. +% +% In order to properly with the case where there is material in \cmd\box\cmd\@cclv, +% \cmd\@toplist, \cmd\@botlist, \cmd\@dbltoplist, etc, +% we do what amounts to \cmd\newpage\ to get things rolling. +% +% In \cmd\force@deferlist@stuck, we take advantage of already being in the output routine: +% simply reinvoke \cmd\do@startcolumn\ under permissive conditions. +% +% \begin{macrocode} +\def\force@deferlist@stuck#1{% + \force@deferlist@sw{% + \@booleantrue\clearpage@sw + \@booleantrue\forcefloats@sw + #1% + }{% + }% +}% +\def\force@deferlist@empty{% + \force@deferlist@sw{% + \penalty-\pagebreak@pen + \protect@penalty\do@forcecolumn@pen + }{% + }% +}% +\@booleanfalse\force@deferlist@sw +\mathchardef\do@forcecolumn@pen=10009 +\@namedef{output@-\the\do@forcecolumn@pen}{\do@forcecolumn}% +\def\do@forcecolumn{% + \@booleantrue\clearpage@sw + \@booleantrue\forcefloats@sw +% \end{macrocode} +% \begin{verbatim} +%\unvbox\@cclv +%\vfil +%\penalty-\pagebreak@pen +% \end{verbatim} +% \begin{macrocode} + \do@startcolumn +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% A more thorough revision of \LaTeX's float placement mechanism would involve substituting a single \cmd\box\ +% register for the \cmd\@deferlist. This way, \LaTeX's ability to have latent floats would be limited by +% box memory alone. +% +% Because only the \cmd\box\ and \cmd\count\ components of the float box register are actually used by \LaTeX, +% our scheme can be accomplished if we can find a way to encode the information held in the \cmd\count\ component. +% +% A first-in, first-out mechanism exists, wherein a box-penalty pair is dequeued by \cmd\lastbox\cmd\lastpenalty\cmd\unpenalty\ and enqueued +% by \cmd\setbox\cmd\foo=\cmd\hbox\cmd\bgroup\cmd\penalty\cmd\floatpenalty\cmd\box\cmd\floatbox\cmd\unhbox\cmd\foo\cmd\egroup. +% +% Note that this scheme is made possible by our change to \LaTeX's float placement mechanism, +% wherein we consolidated the two \cmd\@deferlist s into one. +% +% \section{Support for legacy \LaTeX\ commands} +% +% We provide support for the \cmd\enlargethispage\ command. +% +% Note: using a command of this sort does not automatically enlarge both pages of a spread, which would be the convention in page composition. +% +% Timing Note: In a multicolumn page grid, the user should issue the \cmd\enlargethispage\ command +% while the first column of the page is being typeset. +% We provide a helpful message if the timing is wrong. +% +% This code can serve as a model for introducing commands that need to execute within the safety of the output routine. +% We ensure that the arguments are fully expanded, then execute \cmd\do@output@MVL\ to cause an output procedure, +% \cmd\@@enlargethispage, to execute. When it does execute, the MVL will be exposed. +% +% The \cmd\@@enlargethispage\ procedure simply adjusts the vertical dimensions of the page. +% The adjustment will persist until the column is committed, at which point the page dimension +% will revert to its standard value. +% \begin{macrocode} +\def\enlargethispage{% + \@ifstar{% + \@enlargethispage{}% + }{% + \@enlargethispage{}% + }% +}% +\def\@enlargethispage#1#2{% + \begingroup + \dimen@#2\relax + \edef\@tempa{#1}% + \edef\@tempa{\noexpand\@@enlargethispage{\@tempa}{\the\dimen@}}% + \expandafter\do@output@MVL\expandafter{\@tempa}% + \endgroup +}% +\def\@@enlargethispage#1#2{% + \def\@tempa{one}% + \@ifx{\thepagegrid\@tempa}{% + \true@sw + }{% + \def\@tempa{mlt}% + \@ifx{\thepagegrid\@tempa}{% + \@ifnum{\pagegrid@cur=\@ne}{% +% \end{macrocode} +% OK to adjust this page +% \begin{macrocode} + \gdef\enlarge@colroom{#2}% + \true@sw + }{% +% \end{macrocode} +% Can only adjust this column; give up +% \begin{macrocode} + \ltxgrid@warn{Too late to enlarge this page; move the command to the first column.}% + \false@sw + }% + }{% +% \end{macrocode} +% Unknown page grid +% \begin{macrocode} + \ltxgrid@warn{Unable to enlarge a page of this kind.}% + \false@sw + }% + }% + {% + \class@info{Enlarging page \thepage\space by #2}% + \global\advance\@colroom#2\relax + \set@vsize + }{% +% \end{macrocode} +% Could not adjust this page +% \begin{macrocode} + }% +}% +\let\enlarge@colroom\@empty +% \end{macrocode} +% The \cmd\@kludgeins\ insert register is now unneeded. +% Ensure that packages using this mechanism break (preferrable to subtle bugs). +% \begin{macrocode} +\let\@kludgeins\@undefined +% \end{macrocode} +% +% \subsubsection{Building the page for shipout} +% +% \begin{macro}{\@outputpage@head} +% We set \cmd\@outputpage@head\ to make the \cmd\@outputbox\ be of fixed height. +% \changes{4.1b}{2008/08/04}{Procedure \cs{@outputpage@head} headpatches \cs{@outputpage}}% +% \begin{macrocode} +\@booleantrue\textheight@sw +\prepdef\@outputpage@head{% + \textheight@sw{% + \count@\vbadness\vbadness\@M + \dimen@\vfuzz\vfuzz\maxdimen + \setbox\@outputbox\vbox to\textheight{\unvbox\@outputbox}% + \vfuzz\dimen@ + \vbadness\count@ + }{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@outputpage@head} +% For compatibility with David Carlisle's \classname{lscape} package, we need to allow the +% \cmd\LS@rot\ procedure to mung \cmd\@outputbox. +% +% Implementation note: the \classname{lscape} package effectively tailpatches two \LaTeX\ internals to accomplish its purpose, +% an approach that is not robust. It is more robust to headpatch \cmd\@outputpage, which is what we do here. +% \changes{4.1o}{2010/02/02}{(AO, 576) Allow \classname{lscape} to act on \cs{@outputbox} at the right time}% +% \begin{macrocode} +\appdef\@outputpage@head{% + \@ifx{\LS@rot\@undefined}{}{\LS@rot}% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Warning message} +% +% \begin{macro}{\ltxgrid@info} +% \begin{macro}{\ltxgrid@warn} +% Something has happened that the user might be interested in. +% Print a message to the log, but only if the user selected the verbose option. +% \begin{macrocode} +\def\ltxgrid@info{% + \ltxgrid@info@sw{\class@info}{\@gobble}% +}% +\@booleanfalse\ltxgrid@info@sw +\def\ltxgrid@warn{% + \ltxgrid@warn@sw{\class@warn}{\@gobble}% +}% +\@booleantrue\ltxgrid@warn@sw +\@booleanfalse\ltxgrid@foot@info@sw +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{Line-wise processing}% +% Sometimes we wish to process each line of type that will be placed into the galley, +% for example, applying line numbering to a document. +% To accomplish the task, we have to force a visit to the output routine after each such line, whereupon +% we can process it accordingly (in the case of line numbering, we could do as \filename{lineno.sty} and +% append an appropriately formed box to the MVL). +% +% In implementing such a scheme, we will have to instantiate interrupts for the following cases: +% \begin{description} +% +% \item[\cmd\interlinepenalty\ and friends] These include \cmd\clubpenalty, \cmd\widowpenalty, \cmd\displaywidowpenalty, and \cmd\brokenpenalty. +% +% +% \item[Display math penalties] Includes \cmd\predisplaypenalty, \cmd\postdisplaypenalty, and \cmd\interdisplaylinepenalty. +% +% +% \item[\cs{par}] The penalty following the last line of the paragraph. +% +% +% \item[\cmd\vadjust] A trap for any \cmd\vadjust\ command that falls in the paragraph. +% +% \end{description} +% +% \begin{macro}{\def@next@handler} +% \begin{macro}{\def@line@handler} +% Utility procedures \cmd\def@next@handler\ and \cmd\def@line@handler\ help in the creation of +% interrupt handlers. +% +% \cmd\def@next@handler\ increments the scratch count register (argument 1), +% using this value to \cmd\mathchardef\ its second argument +% as the negative of the flag value to be used as a penalty for exciting the interrupt (argument 3). +% As a byproduct, it leaves the given scratch counter incremented. +% \begin{macrocode} +\def\def@next@handler#1#2#3{% + \advance#1\@ne\mathchardef#2\the#1% + \expandafter\def\csname output@-\the#1\endcsname{#3}% +% \end{macrocode} +% The following line is for diagnostic purposes. +% \begin{verbatim} +% \typeout{\string#2(\expandafter\string\csname output@\the#1\endcsname:\expandafter\meaning\csname output@\the#1\endcsname)}% +% \end{verbatim} +% \begin{macrocode} +}% +% \end{macrocode} +% \cmd\def@line@handler\ uses \cmd\int@parpenalty\ as a base. +% The interrupt is the sum of that base with the first argument, +% and the handler is the second argument. +% \begin{macrocode} +\def\def@line@handler#1#2{% + \begingroup + \@tempcnta\int@parpenalty + \advance\@tempcnta-#1% +% \end{macrocode} +% The following line is for diagnostic purposes. +% \begin{verbatim} +% \typeout{Defining: \expandafter\string\csname output@\the\linenopenalty\endcsname}% +% \end{verbatim} +% \begin{macrocode} + \aftergroup\def + \expandafter\aftergroup\csname output@-\the\@tempcnta\endcsname + \endgroup{#2}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\int@parpenalty} +% \begin{macro}{\@handle@line@ltx} +% \begin{macro}{\@@handle@line@ltx} +% We first set \cmd\int@parpenalty\ to our chosen base value${}\le -11012$. +% We then define all the handlers for lines within a paragraph, of which there are 12 different cases. +% \begin{macrocode} +\mathchardef\int@parpenalty11012 +\def@line@handler\z@{\@handle@line@ltx{}{}{}}% +\def@line@handler\@ne{\@handle@line@ltx{}{}{\brokenpenalty@ltx}}% +\def@line@handler\tw@{\@handle@line@ltx{}{\clubpenalty@ltx}{}}% +\def@line@handler\thr@@{\@handle@line@ltx{\clubpenalty@ltx}{}{\brokenpenalty@ltx}}% +\def@line@handler\f@ur{\@handle@line@ltx{\widowpenalty@ltx}{}{}}% +\def@line@handler{5}{\@handle@line@ltx{\widowpenalty@ltx}{}{\brokenpenalty@ltx}}% +\def@line@handler{6}{\@handle@line@ltx{\widowpenalty@ltx}{\clubpenalty@ltx}{}}% +\def@line@handler{7}{\@handle@line@ltx{\widowpenalty@ltx}{\clubpenalty@ltx}{\brokenpenalty@ltx}}% +\def@line@handler{8}{\@handle@line@ltx{\displaywidowpenalty@ltx}{}{}}% +\def@line@handler{9}{\@handle@line@ltx{\displaywidowpenalty@ltx}{}{\brokenpenalty@ltx}}% +\def@line@handler{10}{\@handle@line@ltx{\displaywidowpenalty@ltx}{\clubpenalty@ltx}{}}% +\def@line@handler{11}{\@handle@line@ltx{\displaywidowpenalty@ltx}{\clubpenalty@ltx}{\brokenpenalty@ltx}}% +% \end{macrocode} +% +% The default handler for lines within a paragraph simply +% restores the value of the \cmd\penalty\ to the normal value. +% If something more useful needs to be done, we can change the definition of \cmd\@@handle@line@ltx. +% \begin{macrocode} +\def\@handle@line@ltx#1#2#3{% + \@@handle@line@ltx + \@tempcnta\lastpenalty + \@tempcntb\interlinepenalty@ltx\relax + \@if@empty{#1}{}{\advance\@tempcntb#1\relax}% + \@if@empty{#2}{}{\advance\@tempcntb#2\relax}% + \@if@empty{#3}{}{\advance\@tempcntb#3\relax}% + \penalty\@ifnum{\@tempcnta<\@tempcntb}{\@tempcntb}{\@tempcnta}% +}% +\let\@@handle@line@ltx\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\int@postparpenalty} +% \begin{macro}{\int@vadjustpenalty} +% \begin{macro}{\int@whatsitpenalty} +% \begin{macro}{\int@predisplaypenalty} +% \begin{macro}{\int@interdisplaylinepenalty} +% \begin{macro}{\int@postdisplaypenalty} +% \begin{macro}{\@handle@display@ltx} +% \begin{macro}{\@@handle@display@ltx} +% \begin{macro}{\handle@par@ltx} +% We herewith define all the handlers for cases relating to display math: +% last line before a display math, +% last line of a display math, and a line within a display math. +% We also handle the last line of a paragraph, a whatsit node, and a \cmd\vadjust. +% \begin{macrocode} +\@tempcnta\int@parpenalty +\def@next@handler\@tempcnta\int@postparpenalty{\reset@queues@ltx\handle@par@ltx}% +\def@next@handler\@tempcnta\int@vadjustpenalty{\handle@vadjust@ltx}% +\def@next@handler\@tempcnta\int@whatsitpenalty{\handle@whatsit@ltx}% +\def@next@handler\@tempcnta\int@predisplaypenalty{\reset@queues@ltx\@handle@display@ltx{\predisplaypenalty@ltx}}% +\def@next@handler\@tempcnta\int@interdisplaylinepenalty{\@handle@display@ltx{\interdisplaylinepenalty@ltx}}% +\def@next@handler\@tempcnta\int@postdisplaypenalty{\@handle@display@ltx{\postdisplaypenalty@ltx}}% +% \end{macrocode} +% The default handler for display math lines simply +% restores the value of the \cmd\penalty\ to the normal value. +% If something more useful needs to be done, we can change the definition of \cmd\@@handle@display@ltx. +% \begin{macrocode} +\def\@handle@display@ltx#1{% + \@@handle@display@ltx + \@tempcnta\lastpenalty + \@tempcntb#1% + \penalty\@ifnum{\@tempcnta<\@tempcntb}{\@tempcntb}{\@tempcnta}% +}% +\let\@@handle@display@ltx\@empty +% \end{macrocode} +% +% We provide stub definitions for the handlers for the last line of a paragraph, a \cmd\vadjust, and a whatsit node (e.g., \cmd\write, \cmd\special). +% There is no canonical penalty for such cases. +% \begin{macrocode} +\def\handle@par@ltx{}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Note that a whatsit needs to be handled differently from a \cmd\vadjust: +% a whatsit node does not affect the (crucial) depth of \cmd\box\cmd\@cclv, while the more +% general \cmd\vadjust\ may cause any kind of vertical mode material to be interposed just below the line +% we are trying to trap, in particular \cmd\vskip s and \cmd\penalty s. +% +% \begin{macro}{\set@linepenalties} +% \begin{macro}{\restore@linepenalties} +% \begin{macro}{\set@displaypenalties} +% Now we define utility procedures that set up for a paragraph to be broken into lines, +% restoring the penalties afterwards. +% +% Utility procedure \cmd\set@linepenalties\ systematically sets the penalties of paragraph breaking +% to flag values, meanwhile storing away the normal values for access by the output routine. +% \begin{macrocode} +\def\set@linepenalties{% + \expandafter\def\expandafter\interlinepenalty@ltx\expandafter{\the\interlinepenalty}% + \interlinepenalty-\int@parpenalty + \expandafter\def\expandafter\brokenpenalty@ltx\expandafter{\the\brokenpenalty}% + \brokenpenalty\@ne + \expandafter\def\expandafter\clubpenalty@ltx\expandafter{\the\clubpenalty}% + \clubpenalty\tw@ + \expandafter\def\expandafter\widowpenalty@ltx\expandafter{\the\widowpenalty}% + \widowpenalty\f@ur + \expandafter\def\expandafter\displaywidowpenalty@ltx\expandafter{\the\displaywidowpenalty}% + \displaywidowpenalty8\relax +}% +% \end{macrocode} +% +% Utility procedure \cmd\restore@linepenalties\ restores the values of the penalty parameters that were +% modified by \cmd\set@linepenalties. +% \begin{macrocode} +\def\restore@linepenalties{% + \interlinepenalty\interlinepenalty@ltx + \brokenpenalty\brokenpenalty@ltx + \clubpenalty\clubpenalty@ltx + \widowpenalty\widowpenalty@ltx + \displaywidowpenalty\displaywidowpenalty@ltx + \relax +}% +% \end{macrocode} +% +% In the following, the first argument should be a boolean (either \cmd\true@sw\ or \cmd\false@sw). +% \begin{macrocode} +\def\set@displaypenalties#1{% + \expandafter\def\expandafter\predisplaypenalty@ltx\expandafter{\the\predisplaypenalty}% + \expandafter\def\expandafter\interdisplaylinepenalty@ltx\expandafter{\the\interdisplaylinepenalty}% + \expandafter\def\expandafter\postdisplaypenalty@ltx\expandafter{\the\postdisplaypenalty}% + \@ifhmode{\predisplaypenalty-\int@predisplaypenalty\relax}{}% + #1{\interdisplaylinepenalty-\int@interdisplaylinepenalty\relax}{}% + #1{\postdisplaypenalty-\int@postdisplaypenalty\relax}{}% +}% +% \end{macrocode} +% We provide no procedure to restore the respective penalties, because they are altered within a group: +% \TeX 's context stack will automatically restore things. +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\enqueue@whatsit@ltx}% +% \begin{macro}{\handle@whatsit@ltx}% +% \begin{macro}{\do@whatsit}% +% \begin{macro}{\@g@pop@ltx}% +% Here is a facility for dealing with whatsit nodes while we are trapping paragraph lines. +% We simply enqueue a macro that will create the desired whatsit node, dequeueing it in the output routine. +% \begin{macrocode} +\def\enqueue@whatsit@ltx#1{% + \gappdef\g@whatsit@queue{{#1}}% + \vadjust{\penalty-\int@whatsitpenalty}% +}% +\def\handle@whatsit@ltx{% + \unvbox\@cclv + \g@pop@ltx\g@whatsit@queue\@tempa + \expandafter\do@whatsit\expandafter{\@tempa}% +}% +\def\do@whatsit#1{}% +\def\g@pop@ltx#1#2{% + \expandafter\@g@pop@ltx#1{}{}\@@#1#2% +}% +\def\@g@pop@ltx#1#2\@@#3#4{% + \gdef#3{#2}% + \def#4{#1}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\vspace}% +% \begin{macro}{\pagebreak}% +% \begin{macro}{\nopagebreak}% +% \begin{macro}{\\}% +% \begin{macro}{\@arrayparboxrestore}% +% We wish to prevent \filename{lineno.sty} from patching \cmd\vspace\ and \cmd\pagebreak, +% because that package does it through global assignments, which is prone to failure. +% +% We also wish to prevent that package from patching \cmd\@arrayparboxrestore, because +% it prevents us from \cmd\unvbox ing vertical mode material into the MVL and numbering those +% lines. +% +% We start by retaining the original definitions of these commands, so we can restore them +% if \filename{lineno.sty} does get loaded. +% \begin{macrocode} +\let\vspace@ltx\vspace +\let\pagebreak@ltx\pagebreak +\let\nopagebreak@ltx\nopagebreak +\let\endline@ltx\\ +\let\@arrayparboxrestore@ltx\@arrayparboxrestore +% \end{macrocode} +% +% Next, we provide for line-wise processing by patching the procedures associated with these same three commands. +% +% Depending on the running version of \LaTeX, these commands use \cs{vskip} (before 2020-10-01), or +% \cs{@vspace@calcify} to add \textsf{calc}-like support in the kernel. To avoid duplicating the tests, +% define a macro \cs{@tempa} that takes the right form of the primitive spacing command and defines \LaTeX's +% spacing macros accordingly. +% \begin{macrocode} +\def\@tempa#1{% +% \end{macrocode} +% +% There are exactly four core \LaTeX\ procedures that use \cmd\vadjust\ to insert vertical mode material +% into the main vertical list: \cmd\vspace, \cmd\pagebreak, \cmd\nopagebreak, and \cmd\\. +% Other commands may use \cmd\vadjust, but they are inserting an interrupt (via a penalty${}<10000$), +% and such a thing does not mask the depth of \cmd\box\cmd\@cclv, hence is permissible. +% +% In each case, we replace the core \LaTeX\ procedure with one that itself replaces \cmd\vadjust\ with +% \cmd\ex@vadjust@ltx. The meaning of this procedure can be left as \cmd\vadjust, or it can be changed to +% one that accomplishes the equivalent without masking the depth of \cmd\box\cmd\@cclv. +% +% The first procedure is \cmd\@vspace, here shown in original form and in the patched alternative form. +% This procedure and \cmd\@vspacer\ implement the \cmd\vspace\ command. +% +% \begin{macrocode} +\def\@vspace@org ##1{% + \ifvmode + #1% \vskip #1 + \vskip\z@skip + \else + \@bsphack + \vadjust{\@restorepar + #1% \vskip #1 + \vskip\z@skip + }% + \@esphack + \fi +}% +\def\@vspace@ltx##1{% + \@ifvmode{% + #1% \vskip #1 + \vskip\z@skip + }{% + \@bsphack + \ex@vadjust@ltx{% + \@restorepar + \nobreak + #1% \vskip #1 + \vskip\z@skip + }% + \@esphack + }% +}% +% \end{macrocode} +% +% The second procedure is \cmd\@vspacer. +% \begin{macrocode} +\def\@vspacer@org##1{% + \ifvmode + \dimen@\prevdepth + \hrule \@height\z@ + \nobreak + #1%\vskip #1 + \vskip\z@skip + \prevdepth\dimen@ + \else + \@bsphack + \vadjust{\@restorepar + \hrule \@height\z@ + \nobreak + #1%\vskip #1 + \vskip\z@skip}% + \@esphack +\fi +}% +\def\@vspacer@ltx##1{% + \@ifvmode{% + \dimen@\prevdepth + \hrule\@height\z@ + \nobreak + #1%\vskip#1 + \vskip\z@skip + \prevdepth\dimen@ + }{% + \@bsphack + \ex@vadjust@ltx{% + \@restorepar + \hrule\@height\z@ + \nobreak + #1%\vskip#1 + \vskip\z@skip + }% + \@esphack + }% +}% +% \end{macrocode} +% +% Now define the macros above conditionally depending on the \LaTeX version. +% \begin{macrocode} +} +\rvtx@ifformat@geq{2020/10/01}% + {\@tempa{\@vspace@calcify{#1}}}% + {\@tempa{\vskip #1 }}% +% \end{macrocode} +% +% The procedure \cmd\@no@pgbk\ implements both \cmd\pagebreak\ and \cmd\nopagebreak. +% \begin{macrocode} +\def\@no@pgbk@org #1[#2]{% + \ifvmode + \penalty #1\@getpen{#2}% + \else + \@bsphack + \vadjust{\penalty #1\@getpen{#2}}% + \@esphack + \fi +}% +\def\@no@pgbk@ltx#1[#2]{% + \@ifvmode{% + \penalty#1\@getpen{#2}% + }{% + \@bsphack + \ex@vadjust@ltx{% + \penalty#1\@getpen{#2}% + }% + \@esphack + }% +}% +% \end{macrocode} +% +% The command to end a line of type, \cmd\\, is defined via \cmd\DeclareRobustCommand, +% so we must proceed carefully: +% A procedure is defined whose \cmd\long\cmd\csname\ is contructed via the incantation: +% \cmd\csname\cmd\expandafter\cmd\@gobble\cmd\string\cmd\\ \cmd\endcsname. +% Note the non-trivial space character after the \cmd\\: it is incorporated into +% the \cmd\csname. +% +% Here is the original core \LaTeX\ definition for +% the procedure involved, along with our revised version. +% \changes{2020/09/30}{4.2d}{Conditionally use \cs{protected} or \cs{long} to track \LaTeX{} changes.} +% \begin{macrocode} +\rvtx@ifformat@geq{2020/02/02}% +{\protected}{\long}\def\end@line@org{% + \let\reserved@e\relax + \let\reserved@f\relax + \@ifstar{% + \let\reserved@e\vadjust + \let\reserved@f\nobreak + \@xnewline + }% + \@xnewline +}% +\rvtx@ifformat@geq{2020/02/02}% +{\protected}{\long}\def\end@line@ltx{% + \let\reserved@e\relax + \let\reserved@f\relax + \@ifstar{% + \let\reserved@e\ex@vadjust@ltx + \let\reserved@f\nobreak + \@xnewline + }{% + \@xnewline + }% +}% +% \end{macrocode} +% An additional procedure requiring patching has the following original core \LaTeX\ +% definition; we modify it correspondingly. +% \begin{macrocode} +\def\@tempa#1{% + \def\@newline@org[##1]{% + \let\reserved@e\vadjust + \@gnewline{#1}% \vskip#1 + }% + \def\@newline@ltx[##1]{% + \let\reserved@e\ex@vadjust@ltx + \@gnewline{#1}% \vskip#1 + }% +} +\rvtx@ifformat@geq{2020/10/01}% + {\@tempa{\@vspace@calcify{#1}}}% + {\@tempa{\vskip #1}}% +% \end{macrocode} +% We now install our patches. +% If some package overrides these macros, we will detect and complain. +% +% \begin{macrocode} + \@ifx{\@vspace\@vspace@org}{% + \@ifx{\@vspacer\@vspacer@org}{% + \@ifx{\@no@pgbk\@no@pgbk@org}{% + \@ifx{\@newline\@newline@org}{% + \expandafter\@ifx\expandafter{% + \csname\rvtx@ifformat@geq{2020/02/02}% + {\expandafter\@gobble\string\\}% + {\expandafter\@gobble\string\\ }\endcsname + \end@line@org + }{% + \true@sw + }{\false@sw}% + }{\false@sw}% + }{\false@sw}% + }{\false@sw}% + }{\false@sw}% + {% + \class@info{Overriding \string\@vspace, \string\@vspacer, \string\@no@pgbk, \string\@newline, and \string\\ }% + \let\@normalcr\end@line@ltx + \expandafter\let + \csname\rvtx@ifformat@geq{2020/02/02}% + {\expandafter\@gobble\string\\}% + {\expandafter\@gobble\string\\ }\endcsname\@normalcr + \let\@newline\@newline@ltx + \let\@vspace\@vspace@ltx + \let\@vspacer\@vspacer@ltx + \let\@no@pgbk\@no@pgbk@ltx + }{% + \class@warn{% + Failed to recognize \string\@vspace, \string\@vspacer, \string\@no@pgbk, \string\@newline, and \string\\; + no patches applied. Please get a more up-to-date class, + }% + }% +% \end{macrocode} +% Note that we have assigned the same meaning to \cmd\@normalcr, which is necessary to \LaTeX. +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ex@vadjust@ltx} +% \begin{macro}{\enqueue@vadjust@ltx} +% \begin{macro}{\handle@vadjust@ltx} +% \begin{macro}{\g@vadjust@line} +% \begin{macro}{\reset@queues@ltx} +% Here we give the default definition for \cmd\ex@vadjust@ltx\ along with +% the definitions for the alternative version and its the associated handler. +% \begin{macrocode} +\let\ex@vadjust@ltx\vadjust +\def\enqueue@vadjust@ltx#1{% + \gappdef\g@vadjust@queue{{#1}}% + \vadjust{\penalty-\int@vadjustpenalty}% +}% +\def\handle@vadjust@ltx{% + \unvbox\@cclv + \g@pop@ltx\g@vadjust@queue\@tempa + \expandafter\gappdef\expandafter\g@vadjust@line\expandafter{\@tempa}% +}% +\let\g@vadjust@line\@empty +% \end{macrocode} +% Procedure \cmd\reset@queues@ltx\ resets the whatsit queue and the \cmd\vadjust\ queues +% to their empty state. This should be done whenever we leave horizontal mode and +% complete the processing of these queues: upon executing, effectively, primitive \cmd\par\ +% or interrupting a paragraph with display math. +% \begin{macrocode} +\def\reset@queues@ltx{% + \global\let\g@whatsit@queue\@empty + \global\let\g@vadjust@queue\@empty +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{Patching the lineno.sty package} +% +% \filename{lineno.sty} is a \LaTeX\ package that applies line numbering to a document. +% The basic method is to give \cmd\interlinepenalty\ and like penalties such a value as +% to force a visit to the output routine, where the line of type is given its number. +% In order to properly measure the depth of \cmd\box\cmd\@cclv, it defers \cmd\vadjust\ +% commands that may insert \cmd\vskip\ or \cmd\penalty\ nodes. +% +% The implementation of that package, however, manipulates \cmd\holdinginserts\ in a dangerous +% way: outside the safety of the output routine. It also alters the meaning of \cmd\vadjust\ +% using global assignments. We patch its code to avoid these problems. The \filename{ltxgrid} +% package already has the needed mechanisms in place to do these jobs correctly. +% +% The methods we use can accomodate any values of penalties like \cmd\clubpenalty, etc: +% we do not make assumptions about the range of values these penalty parameters could take. +% +% +% \begin{macro}{\linenomathWithnumbers} +% \begin{macro}{\linenomathNonumbers} +% \begin{macro}{\endlinenomath} +% \begin{macro}{\linenumberpar} +% Here are the definitions of procedures in \filename{lineno.sty} +% that alter \cmd\holdinginserts. They are current as of version v4.41, 2005/11/02. +% We patch them to avoid doing this: in ltxgrid-based classes like REVTeX, the output routine properly manages \cmd\holdinginserts, so packages should not attempt to do so. +% Also, we will want \cmd\linenumberpar\ to set \cmd\interlinepenaly\ to dispatch to \cmd\MakeLineNo. +% +% \begin{macrocode} +\newcommand\linenomathWithnumbers@LN{% + \ifLineNumbers + \ifnum\interlinepenalty>-\linenopenaltypar + \global\holdinginserts\thr@@ + \advance\interlinepenalty \linenopenalty + \ifhmode + \advance\predisplaypenalty \linenopenalty + \fi + \advance\postdisplaypenalty \linenopenalty + \advance\interdisplaylinepenalty \linenopenalty + \fi + \fi + \ignorespaces +}% +\newcommand\linenomathNonumbers@LN{% + \ifLineNumbers + \ifnum\interlinepenalty>-\linenopenaltypar + \global\holdinginserts\thr@@ + \advance\interlinepenalty \linenopenalty + \ifhmode + \advance\predisplaypenalty \linenopenalty + \fi + \fi + \fi + \ignorespaces +}% +\def\endlinenomath@LN{% + \ifLineNumbers + \global\holdinginserts\@LN@outer@holdins + \fi + \global\@ignoretrue +} +\def\linenumberpar@LN{% + \ifvmode \@@@par \else + \ifinner \@@@par \else + \xdef\@LN@outer@holdins{\the\holdinginserts}% + \advance \interlinepenalty \linenopenalty + \linenoprevgraf \prevgraf + \global \holdinginserts \thr@@ + \@@@par + \ifnum\prevgraf>\linenoprevgraf + \penalty-\linenopenaltypar + \fi + \@LN@parpgbrk + \global\holdinginserts\@LN@outer@holdins + \advance\interlinepenalty -\linenopenalty + \fi + \fi +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\class@documenthook} +% We patch only if we recognize the definitions of all the procedures we are to patch. +% \begin{macrocode} +\appdef\class@documenthook{% + \@ifpackageloaded{lineno}{% + \@ifx{\linenomathWithnumbers\linenomathWithnumbers@LN}{% + \@ifx{\linenomathNonumbers\linenomathNonumbers@LN}{% + \@ifx{\endlinenomath\endlinenomath@LN}{% + \@ifx{\linenumberpar\linenumberpar@LN}{% + \true@sw + }{\false@sw}% + }{\false@sw}% + }{\false@sw}% + }{\false@sw}% + {% + \class@info{Overriding lineo.sty, restoring output routine,}% +% \end{macrocode} +% We commence overriding the procedures of \filename{lineno.sty}. +% \begin{macrocode} + \let\linenumberpar\linenumberpar@ltx + \let\endlinenomath\endlinenomath@ltx + \expandafter\let\csname endlinenomath*\endcsname\endlinenomath@ltx + \let\linenomathWithnumbers\linenomathWithnumbers@ltx + \let\linenomathNonumbers\linenomathNonumbers@ltx +% \end{macrocode} +% Override \filename{lineno.sty}'s equipment for \cmd\vadjust\ and \cmd\linelabel: +% we have existing interrupts and handlers for these purposes. +% \begin{macrocode} + \let\ex@vadjust@ltx\ex@vadjust@line + \let\@LN@postlabel\enqueue@whatsit@ltx + \let\do@whatsit\write@linelabel +% \end{macrocode} +% Redirect handlers to those provided by \filename{lineno.sty}, and +% give an appropriate meaning to the respective headpatch within the handlers. +% \begin{macrocode} + \let\handle@par@ltx\handle@par@LN + \let\@@handle@line@ltx\Make@LineNo@ltx + \let\@@handle@display@ltx\Make@LineNo@ltx +% \end{macrocode} +% Next, we undo the action taken by \filename{lineno.sty} wherein it +% took over the output routine. Instead, we service \filename{lineno.sty} +% existing equipment of \filename{ltxgrid}. +% We also revert the core \LaTeX\ definitions of +% \cmd\vspace, \cmd\pagebreak, \cmd\nopagebreak, and \cmd\\, +% which that package takes over (we have our own ways of doing these things). +% \begin{macrocode} + \output@latex{\natural@output}% + \let\vspace\vspace@ltx + \let\pagebreak\pagebreak@ltx + \let\nopagebreak\nopagebreak@ltx + \let\@arrayparboxrestore\@arrayparboxrestore@ltx + \let\\\endline@ltx +% \end{macrocode} +% \changes{4.1f}{2009/07/07}{(AO, 515) Prevent line numbering within a footnote} +% When line numbering is in effect, we must avoid any attempt to number the lines of a footnote. +% \begin{macrocode} + \appdef\set@footnotefont{% + \let\par\@@@par + \let\@@par\@@@par + }% +% \end{macrocode} +% At last, we detect if the \cmd\linenumbers\ command has already been given; +% if so, we do its assignments again, because we have changed the meaning of \cmd\linenumberpar. +% \begin{macrocode} + \@if@sw\ifLineNumbers\fi{% + \class@info{Reinvoke \string\linenumbers}% + \let\@@par\linenumberpar + \@ifx{\@par\linenumberpar@LN}{\let\@par\linenumberpar}{}% + \@ifx{\par\linenumberpar@LN}{\let\par\linenumberpar}{}% + }{% + \class@info{Line numbering not turned on yet}% + }% +% \end{macrocode} +% Here ends the ``true branch'' of the patch code. +% \begin{macrocode} + }{% +% \end{macrocode} +% If the \filename{lineno.sty} package is loaded, but we fail to patch it, notify the user. +% \begin{macrocode} + \class@warn{Failed to recognize lineno.sty procedures; no patches applied. Please get a more up-to-date class.}% + }% + }{% +% \end{macrocode} +% \filename{lineno.sty} is not loaded, so no patches are needed. +% \begin{macrocode} + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\linenumberpar} +% \begin{macro}{\@linenumberpar} +% Procedure \cmd\linenumberpar\ takes the place of \cmd\par\ when line numbering is in effect; +% It executes the \cmd\par\ primitive if we are in vertical mode. +% Otherwise we are in horizontal mode in the MVL and wish to end the current paragraph, +% or we have \cmd\unvbox ed material onto the MVL. +% +% \begin{macrocode} +\def\linenumberpar@ltx{\@ifvmode{\@@@par}{\@linenumberpar}}% +% \end{macrocode} +% +% Procedure \cmd\@linenumberpar +% \begin{macrocode} +\def\@linenumberpar{% +% \end{macrocode} +% Prepare for our trip into the output routine by +% saving away the current value of \cmd\prevgraf. +% \begin{macrocode} + \linenoprevgraf\prevgraf +% \end{macrocode} +% The following will be used in the output routine dispatcher +% to sense that we came from here. +% \begin{macrocode} + \set@linepenalties +% \end{macrocode} +% Finally, call primitive \cmd\par\ with the signal value of \cmd\interlinepenalty\ and friends. +% \begin{macrocode} + \@@@par +% \end{macrocode} +% We are now in vertical mode. +% If lines of type were contributed to the MVL (non-trivial paragraph), +% we must force another trip into the output routine to apply +% line numbering to the last line of the paragraph. +% \begin{macrocode} + \@ifnum{\prevgraf>\linenoprevgraf}{ + \penalty-\int@postparpenalty + }{}% +% \end{macrocode} +% Execute procedure \cmd\@LN@parpgbrk, which has been set up in the +% output routine for us to invoke here. +% +% \begin{macrocode} + \@LN@parpgbrk +% \end{macrocode} +% To wrap things up, we restore the original value of \cmd\interlinepenalty\ and friends. +% +% Query: why not employ \TeX's context stack to do the restore? +% Would there be something wrong with executing primitive \cmd\par\ within a group? +% \begin{macrocode} + \restore@linepenalties +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\linenomathWithnumbers} +% \begin{macro}{\linenomathNonumbers} +% Here are the patched definitions for the commands enabling +% line numbering in display math. +% \begin{macrocode} +\newcommand\linenomathWithnumbers@ltx{\@linenomathnumbers@ltx\true@sw}% +\newcommand\linenomathNonumbers@ltx{\@linenomathnumbers@ltx\false@sw}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@linenomathnumbers} +% \begin{macro}{\endlinenomath} +% We have just begun a display math, and any paragraph we are setting will now end. +% We set all relevant penalties to interrupt values; in the visit to the output routine, +% we will replace the penalty with its normal value. +% \begin{macrocode} +\def\@linenomathnumbers@ltx#1{% + \@if@sw\ifLineNumbers\fi{% + \set@linepenalties + \set@displaypenalties#1% + }{}% + \ignorespaces +}% +\def\endlinenomath@ltx{% + \global\@ignoretrue +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% We provide a handler for the last line of a paragraph. +% \begin{macrocode} +\def\handle@par@LN{% + \Make@LineNo@ltx +% \end{macrocode} +% After setting the line number, we arrange for an appropriate penalty to +% be laid down after this visit to the output routine ends. +% +% Query: why not contribute the penalty right here in the visit to the output routine? +% \begin{macrocode} + \@tempcnta\lastpenalty + \@ifnum{\@tempcnta=\z@}{}{% + \expandafter\gdef + \expandafter\@LN@parpgbrk + \expandafter{% + \expandafter\penalty + \the\@tempcnta +% \end{macrocode} +% When \cmd\@LN@parpgbrk\ is executed, it resets itself to the default value, +% \cmd\@LN@screenoff@pen. +% +% Query: \cmd\@LN@screenoff@pen\ appears to try to restore the depth of the last box: +% why is this being done outside the safety of the output routine? +% \begin{macrocode} + \global\let\@LN@parpgbrk\@LN@screenoff@pen + }% + }% +}% +% \end{macrocode} +% +% \begin{macro}{\Make@LineNo} +% The procedure \cmd\Make@LineNo\ sets the box containing the line number itself. +% \begin{macrocode} +\def\Make@LineNo@ltx{% + \@LN@maybe@normalLineNumber +% \end{macrocode} +% We measure the depth of \cmd\box\cmd\@cclv\ and unbox it. +% At this point, it is crucial that that box have the same depth as that of the last +% box within it. +% +% In the simple case, \cmd\box\cmd\@cclv\ is +% a \cmd\vbox\ containing as its last box the \cmd\hbox\ of the paragraph we are processing. +% +% Query: under what circumstances will this \emph{not} be the case? +% \begin{macrocode} + \boxmaxdepth\maxdimen\setbox\z@\vbox{\unvbox\@cclv}% + \@tempdima\dp\z@ + \unvbox\z@ +% \end{macrocode} +% Then we create the box with the line number, setting its height to zero. +% \begin{macrocode} + \sbox\@tempboxa{\hb@xt@\z@{\makeLineNumber}}% + \ht\@tempboxa\z@ +% \end{macrocode} +% With these preparations, we invoke \cmd\@LN@depthbox, which +% lays that box down (with its depth appropriately set): +% this procedure depends on our having set \cmd\@tempdima\ and \cmd\@tempboxa +% (kinda kludgy way of passing arguments, really). +% \begin{macrocode} + \@LN@depthbox +% \end{macrocode} +% Now increment the line number. I have relocated this token past \cmd\@LN@depthbox: +% this may induce a bug, but I am going to hereby force the issue: +% why split up the procedure that lays down boxes with a procedure that sets a register value? +% \begin{macrocode} + \stepLineNumber +% \end{macrocode} +% Finally, execute the \cmd\vadjust s that fell within the line that we just handled. +% +% Note that \cmd\enqueue@vadjust@ltx\ had queued up all the \cmd\vadjust\ commands for the paragraph +% into \cmd\g@vadjust@queue, laying down an (\cmd\int@vadjustpenalty) interrupt in each ones' place. +% The interrupts associated with this line of the paragraph have now moved the tokens to \cmd\g@vadjust@line, +% which we now expand and execute. +% \begin{macrocode} + \g@vadjust@line + \global\let\g@vadjust@line\@empty +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\write@linelabel#1{% + \protected@write\@auxout{}{% + \string\newlabel{#1}{{\theLineNumber}{\thepage}{}{}{}}% + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\ex@vadjust@line{% + \@if@sw\ifLineNumbers\fi{\enqueue@vadjust@ltx}{\vadjust}% +}% +% \end{macrocode} +% \end{macro} +% +% Note that the \cmd\linelabel\ commands use a mechanism different from \cmd\vadjust, +% embodied in the procedure \cmd\enqueue@vadjust@ltx, wherein the +% \cmd\write\ primitives are enqueued while the paragraph is being processed, each replaced with +% an interrupt, then dequeued and executed by the interrupt handler, leaving a \cmd\write\ node +% in place of the interrupt (just where the \cmd\vadjust 's vertical mode material would had been) +% just below the box containing the line of type. This \cmd\write, like all whatsits, +% does not affect the depth of \cmd\box\cmd\@cclv, unlike the case of general vertical mode material, +% which could have interfered. +% +% \section{End of the \file{ltxgrid} {\sc docstrip} module} +% Here ends the module. +% \begin{macrocode} +%</kernel> +% \end{macrocode} +% +% \Finale +% %Here ends the programmer's documentation. +% \endinput +% +\endinput +%%EOF diff --git a/texmf/source/latex/revtex/ltxutil.dtx b/texmf/source/latex/revtex/ltxutil.dtx new file mode 100644 index 0000000..4ce6464 --- /dev/null +++ b/texmf/source/latex/revtex/ltxutil.dtx @@ -0,0 +1,4449 @@ +% \iffalse meta-comment balanced on line 107 +% ltxutil.dtx: utilities package +% Copyright (c) 2009 Arthur Ogawa +% +% Disclaimer +% This file is distributed WITHOUT ANY WARRANTY; +% without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +% License +% You may distribute this file under the conditions of the +% LaTeX Project Public License 1.3c or later +% (http://www.latex-project.org/lppl.txt). +% ReadMe +% For the documentation and more detailed instructions for +% installation, typeset this document with \LaTeX. +% Maintenance Status +% This work has the LPPL maintenance status "maintained"; +% Current Maintainer of this work is Arthur Ogawa +% changes for version 4.2d and 4.2e by Phelype Oleinik. +% +% This work consists of the main source file ltxutil.dtx +% and the derived files +% ltxutil.sty, ltxutil.pdf +% Distribution: +% CTAN:macros/latex/contrib/revtex/ +% +% Unpacking: +% tex ltxutil.dtx +% +% Documentation: +% latex ltxutil.dtx; ... +% +% Program calls to get the documentation (example): +% pdflatex ltxutil.dtx +% makeindex -s gind.ist ltxutil.idx +% makeindex -s gglo.ist -o ltxutil.gls ltxutil.glo +% pdflatex ltxutil.dtx +% makeindex -s gind.ist ltxutil.idx +% pdflatex ltxutil.dtx +% +% Installation: +% TDS:doc/latex/revtex/ +% TDS:source/latex/revtex/ +% TDS:tex/latex/revtex/ +% +% Thanks, Heiko! +% This method of letting a single .dtx file serve as both +% documentation (via latex) and installer (via tex) follows +% the example of Heiko Oberdiek. Thanks! +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase + 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi + \relax +\else + \csname fi\endcsname +%</ignore> +%<*install> +\input docstrip +\preamble + +This is a generated file; +altering it directly is inadvisable; +instead, modify the original source file. +See the URL in the file README-LTXUTIL.tex. + +License + You may distribute this file under the conditions of the + LaTeX Project Public License 1.3c or later + (http://www.latex-project.org/lppl.txt). + + This file is distributed WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. + +\endpreamble +\askforoverwritefalse +\keepsilent + \generate{% + %{ignore} + \file{ltxutil.sty}{% + \from{ltxutil.dtx}{package,kernel}% + }% + \file{ltxutil.krn}{% + \from{ltxutil.dtx}{kernel}% + }% + }% +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation, please move} +\Msg{* ltxutil.sty} +\Msg{* into a directory searched by TeX;} +\Msg{* in a TDS-compliant installation:} +\Msg{* texmf/tex/macros/latex/revtex/.} +\Msg{*} +\Msg{* To produce the documentation, + run ltxutil.dtx through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% \fi +% +% \GetFileInfo{ltxutil.dtx} +% +% \iffalse ltxdoc klootch +%<*package> +%%% @LaTeX-file{ +%%% filename = "ltxutil.dtx", +%%% version = "4.2e", +%%% date = "2020/10/03", +%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net), +%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org), +%%% commissioned by the American Physical Society. Minor changes by Mark Doyle for version 4.2a-c. +%%% ", +%%% copyright = "Copyright (C) 1999, 2009 Arthur Ogawa, +%%% distributed under the terms of the +%%% LaTeX Project Public License 1.3c, see +%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt +%%% ", +%%% address = "Arthur Ogawa, +%%% USA", +%%% telephone = "", +%%% FAX = "", +%%% email = "mailto colon arthur_ogawa at sbcglobal.net", +%%% codetable = "ISO/ASCII", +%%% keywords = "latex, page grid, main vertical list", +%%% supported = "yes", +%%% abstract = "utilities package", +%%% } +%</package> +% \fi +% +% \iffalse ltxdoc klootch +% The following references the \file{README-LTXUTIL} file, +% which contains basic information about this package. +% The contents of this file are generated when +% you typeset the programmer's documentation. +% Search on "{filecontents*}{README-LTXUTIL}" to locate it. +% \fi\input{README-LTXUTIL}% +% +% \subsection{Bill of Materials} +% +% Following is a list of the files in this distribution arranged +% according to provenance. +% +% \subsubsection{Primary Source}% +% One single file generates all. +%\begin{verbatim} +%ltxutil.dtx +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{latex ltxutil.dtx}}% +% Typesetting the source file under pdflatex +% generates the readme and the documentation. +%\begin{verbatim} +%README-LTXUTIL ltxutil.pdf +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{tex ltxutil.dtx}}% +% Typesetting this file with \TeX\ generates +% the package file. +%\begin{verbatim} +%ltxutil.sty +%\end{verbatim} +% +% \subsubsection{Auxiliary}% +% The following are auxiliary files generated +% in the course of running \LaTeX: +% \begin{verbatim} +%ltxutil.aux ltxutil.idx ltxutil.ind ltxutil.log ltxutil.toc +% \end{verbatim} +% +% \section{Code common to all modules}% +% +% We want to require only one place in this file +% where the version number is stated, +% and we also want to ensure that the version +% number is embedded into every generated file. +% +% Now we declare that +% these files can only be used with \LaTeXe. +% An appropriate message is displayed if +% a different \TeX{} format is used. +% \begin{macrocode} +%<*doc|package> +\NeedsTeXFormat{LaTeX2e}[1995/12/01]% +%</doc|package> +% \end{macrocode} +% As desired, the following modules all +% take common version information: +% \begin{macrocode} +%<kernel&!package&!doc>\typeout{% +%<*package|doc> +\ProvidesFile{% +%</package|doc> +%<*kernel|package|doc> +ltxutil% +%</kernel|package|doc> +%<*doc> +.dtx% +%</doc> +%<package>.sty% +%<*package|doc> +}% +%</package|doc> +% \end{macrocode} +% +% The following line contains, for once and for all, +% the version and date information. +% By various means, this information is reproduced +% consistently in all generated files and in the +% typeset documentation. +% Give credit where due. +% \begin{macrocode} +%<*doc|package|kernel> +%<version> + [2020/10/03 4.2e utilities package (portions licensed from W. E. Baxter web at superscript.com)]% \fileversion +%</doc|package|kernel> +%<kernel&!package&!doc>}% +% \end{macrocode} +% +% +% \section{The driver module \texttt{doc}} +% +% This module, consisting of the present section, +% typesets the programmer's documentation, +% generating the \file{README-LTXUTIL} as required. +% +% Because the only uncommented-out lines of code at the beginning of +% this file constitute the \file{doc} module itself, +% we can simply typeset the \file{.dtx} file directly, +% and there is thus rarely any need to +% generate the ``doc'' {\sc docstrip} module. +% Module delimiters are nonetheless required so that +% this code does not find its way into the other modules. +% +% The \enve{document} command concludes the typesetting run. +% +% \begin{macrocode} +%<*doc> +% \end{macrocode} +% +% \subsection{The Preamble} +% The programmers documentation is formatted +% with the \classname{ltxdoc} class with local customizations, +% and with the usual code line indexing. +% \begin{macrocode} +\documentclass{ltxdoc} +\RequirePackage{ltxdocext}% +\let\url\undefined +\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}% +\pdfstringdefDisableCommands{% + \let\file\relax + \let\sc\relax +} +%\expandafter\ifx\csname package@font\endcsname\@undefined\else +% \expandafter\RequirePackage\expandafter{\csname package@font\endcsname}% +%\fi +\CodelineIndex\EnableCrossrefs % makeindex -s gind.ist ltxutil +\RecordChanges % makeindex -s gglo.ist -o ltxutil.gls ltxutil.glo +% \end{macrocode} +% +% \subsubsection{Docstrip and info directives} +% We use so many {\sc docstrip} modules that we set the +% \texttt{StandardModuleDepth} counter to 1. +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% The following command retrieves the date and version information +% from this file. +% \begin{macrocode} +\expandafter\GetFileInfo\expandafter{\jobname.dtx}% +% \end{macrocode} +% +% \subsection{The ``Read Me'' File} +% As promised above, here is the contents of the +% ``Read Me'' file. That file serves a double purpose, +% since it also constitutes the beginining of the +% programmer's documentation. What better thing, after +% all, to have appear at the beginning of the +% typeset documentation? +% +% A good discussion of how to write a ReadMe file can be found in +% Engst, Tonya, ``Writing a ReadMe File? Read This'' +% \emph{MacTech} October 1998, p. 58. +% +% Note the appearance of the +% \cmd\StopEventually\ command, which marks the +% dividing line between the user documentation +% and the programmer documentation. +% +% The usual user will not be asked to +% do a full build, not to speak +% of the bootstrap. +% Instructions for carrying out these procedures +% begin the programmer's manual. +% +% \begin{macrocode} +\begin{filecontents*}{README-LTXUTIL} +\title{% + A \LaTeX\ Package of utility macros% + \thanks{% + This file has version number \fileversion, + last revised \filedate.% + }% + \thanks{% + Version \fileversion\ \copyright\ 2019--2020 American Physical Society + }% +}% +\author{% + Arthur Ogawa% + \thanks{\texttt{mailto:arthur\_ogawa at sbcglobal.net}}% +}% +%\iffalse +% For version number and date, +% search on "\fileversion" in the .dtx file, +% or see the end of the README-LTXUTIL file. +%\fi +\maketitle + +This file embodies the \classname{ltxutil} package, +the implementation and its user documentation. + +The distribution point for this work is +\url{journals.aps.org/revtex}, +which contains prebuilt runtime files, documentation, and full source, +ready to add to a TDS-compliant \TeX\ installation. + +The \classname{ltxutil} package was commissioned by the American Physical Society +and is distributed under the terms of the \LaTeX\ Project Public License 1.3c, +the same license under which all the portions of \LaTeX\ itself are distributed. +Please see \url{http://ctan.tug.org/macros/latex/base/lppl.txt} for details. + +To use this document class, you must have a working +\TeX\ installation equipped with \LaTeXe\ +and possibly pdftex and Adobe Acrobat Reader or equivalent. + +To install, retrieve the distribution, +unpack it into a directory on the target computer, +and move the file \file{ltxutil.sty} +into a location in your filesystem where it will be found by \LaTeX. + +To use, read the user documentation \file{ltxutil.pdf}. + +\tableofcontents + +\section{Processing Instructions} + +The package file \file{ltxutil.sty} +is generated from this file, \file{ltxutil.dtx}, +using the {\sc docstrip} facility of \LaTeX +via |tex ltxutil.dtx| (Note: do \emph{not} use \LaTeX\ for this task). +The typeset documentation that you are now reading is generated from +the same file by typesetting it with \LaTeX\ or pdftex +via |latex ltxutil.dtx| or |pdflatex ltxutil.dtx|. + +\subsection{Build Instructions} + +You may bootstrap this suite of files solely from \file{ltxutil.dtx}. +Prepare by installing \LaTeXe\ (and either tex or pdftex) on your computer, +then carry out the following steps: +\begin{enumerate} +\item +Within an otherwise empty directory, +typeset \file{ltxutil.dtx} with \LaTeX\ or pdflatex; +you will obtain the typeset documentation you are now reading, +along with the file \file{README-LTXUTIL}. + +Note: you will have to run \LaTeX, then +\file{makeindex} \texttt{-s gind.ist ltxutil.idx}, then +\file{makeindex} \texttt{-s gglo.ist -o ltxutil.gls ltxutil.glo}, then +\LaTeX\ again in order to obtain a valid index and table of contents. +\item +Now typeset \file{ltxutil.dtx} with \TeX (not \LaTeX), +thereby generating the package file \file{ltxutil.sty}. +\item +Install the following files into indicated locations within your +TDS-compliant \texttt{texmf} tree (you may need root access): +\begin{itemize} +\item +\file{$TEXMF/}\file{tex/}\file{latex/}\file{revtex/}\classname{ltxutil.sty} +\item +\file{$TEXMF/}\file{source/}\file{latex/}\file{revtex/}\classname{ltxutil.dtx} +\item +\file{$TEXMF/}\file{doc/}\file{latex/}\file{revtex/}\classname{ltxutil.pdf} +\end{itemize} +where \file{$TEXMF/} stands for \file{texmf-local/}, or some other \texttt{texmf} tree +in your installation. +\item +Run \texttt{mktexlsr} on \file{$TEXMF/} (you may need root access). +\item +Build and installation are now complete; +now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble! +\end{enumerate} + +\subsection{Change Log} +\changes{4.0b}{1999/06/20}{AO: Fixed spurious \texttt{CR} and (return) characters in output file. Also, if the document did not have the \cs{end}\texttt{figure} on a line of its own, the macro wouldn't work. Fixed.} +\changes{4.0b}{1999/06/20}{AO: Removed superfluous \cs{def}s, changed to using \cs{floats@sw} as the flag. Also stopped using DPC's \cs{if@twocolumn} flag: using \cs{floats@sw} instead. Also added \cs{par}\cs{vskip}\cs{z@skip} after the \cs{minipagefootnotes} so that the float box would have zero depth like the kernel one. } +\changes{4.0b}{1999/06/20}{only execute if there really were floats of the given type} +\changes{4.0b}{1999/06/20}{Support the hack with \cs{prepdef}, and delay until \cs{AtBeginDocument} time, since \classname{hyperref} clobbers \cs{caption}.} +\changes{4.0c}{1999/11/13}{(AO, 110) Install hooks for endfloats processing} +\changes{4.0c}{1999/11/13}{(AO, 116) Hyperref compatibility} +\changes{4.0c}{1999/11/13}{(AO, 130) Interference from array package} +\changes{4.0c}{1999/11/13}{*-form mandates pagebreak at each float; only print section head if there is something there.} +\changes{4.0d}{2000/04/10}{(AO, 127) Floats placed [h] to allow page breaks} +\changes{4.0d}{2000/04/10}{(AO, 174) kernel fix} +\changes{4.0d}{2000/05/19}{(AO, 224) Hyperref compatibility.} +\changes{4.0d}{2000/05/23}{Allow things to break over pages by setting array@default.} +\changes{4.0e}{2000/11/16}{(AO, 221) Remove samepage command from @xfloat@prep: If the float can break over pages, we want better control.} +\changes{4.0f}{2001/07/13}{(AO, 404) Hyperref compatibility} +\changes{4.1a}{2008/01/19}{(AO, 459) do not assume \cs{class@name} is defined}% +\changes{4.1a}{2008/01/19}{(AO, 461) Change the csname from \cs{@dotsep} to \cs{ltxu@dotsep}. The former is understood in mu. (What we wanted was a dimension.)}% +\changes{4.1a}{2008/01/19}{(AO, 475) I had not properly reproduced the LaTeX macro \cs{eqnarray}.}% +\changes{4.1a}{2008/01/19}{(AO, 479) Per: Dylan Thurston<dpt at math.harvard.edu>}% +\changes{4.1a}{2008/06/30}{(AO) Make \cs{addtocontents} a \cs{long} \cs{def}; gobble up \cs{footnote}}% +\changes{4.1a}{2008/06/30}{(AO) Remove code that avoided changes to \cs{@xfootnotemark}}% +\changes{4.1a}{2008/06/30}{(AO, 438) Complete rewrite of footnote macros.} +\changes{4.1a}{2008/07/07}{\cs{@xfloat@prep} calls \cs{ltx@footnote@pop} to restore the original \cs{ltx@footmark} and \cs{ltx@foottext} procedures, in case footnote processing has switched.} +\changes{4.1a}{2008/08/12}{\cs{class@documenthook} is the last \cs{AtBeginDocument} token now} +\changes{4.1a}{2008/08/12}{Class extension mechanism \cs{@pushfilename@ltx} and \cs{@p@pfilename@ltx}.} +\changes{4.1a}{2008/08/12}{Class extension mechanism \cs{class@extension}, \cs{class@extensionfile}, and \cs{class@ext@hook}.} +\changes{4.1a}{2008/08/12}{Get rid of \cs{set@typesize@hook} \cs{set@pica@hook} and the \cs{normalsize} directive}% +\changes{4.1b}{2008/08/12}{(AO, 487) Support for video figures and the \cs{setfloatlink} command}% +\changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.} +\changes{4.1b}{2008/08/12}{Acquire \classname{hyperref} savoire} +\changes{4.1b}{2008/08/12}{Default assignment of \cs{float@sw} now, not at \cs{AtBeginDocument} time.}% +\changes{4.1b}{2008/08/12}{If class option \classoption{lengthcheck} is in effect, log the height of this float class.} +\changes{4.1b}{2008/08/12}{No need to protect against undefined \cs{float@sw}} +\changes{4.1b}{2008/08/12}{Patch the array package even later: after all package patches go in.} +\changes{4.1b}{2008/08/12}{Refine toc processing: provide default.}% +\changes{4.1b}{2008/08/12}{Tally and log the height of a float class} +\changes{4.1d}{2009/03/27}{(AO, 511) Compatability with lineno.sty's erroneous way of detecting fleqn.clo}% +\changes{4.1f}{2009/07/07}{(AO, 515) Hook for setting the font of a footnote} +\changes{4.1f}{2009/07/10}{(AO, 518) Tally register overflow when locument is long} +\changes{4.1g}{2009/10/06}{(AO, 532) Both arguments of \cs{href} get sanitized}% +\changes{4.1g}{2009/10/07}{(AO, 525) Remove phantom paragraph above display math that is given in vertical mode}% +\changes{4.1g}{2009/10/07}{(AO, 539) Use of double-backslash in argument of \cs{section} gives error. The \classname{textcase} package is involved.}% +\changes{4.1n}{2009/12/05}{(AO, 569) Use of \classname{hyperref} interferes with column balancing of last page}% +\changes{4.1n}{2009/12/06}{(AO) Incorporate change to ltmiscen.dtx v1.1i 2000/05/19}% +\changes{4.1n}{2009/12/09}{(AO, 569) execute \classname{atveryend}'s \cs{Call@AfterLastShipout} at the proper time}% +\changes{4.1n}{2009/12/13}{(AO, 574) protect against \classname{lineno.sty}, which forces a visit to the output routine, which appears to destroy the value of \cs{@tempdima}}% +\changes{4.1n}{2010/01/02}{(AO, 571) Interface \cs{set@footnotewidth} for determining the set width of footnotes}% +\changes{4.1n}{2010/01/02}{(AO, 571) allow split after last line of footnote}% +\changes{4.1n}{2010/01/06}{(AO, 572) title block footnotes numbered independently from body footnotes}% +\changes{4.1p}{2010/02/24}{(AO, 582) A patch of \classname{hyperref.sty} to provide backward compatibility to \TeX Live 2007's version 6.75r}% +\changes{4.2a}{2017/11/21}{(MD) Use updated best practice to use https and doi.org}% +\changes{4.2a}{2018/12/12}{(MD) Updated name of README file and use standard fonts when typesetting}% +\changes{4.2d}{2020/09/19}{(PHO) Adapt \cs{document} and \cs{enddocument} hooks to the 2020-10-01 \LaTeX{} release.}% + +\end{filecontents*} +% \end{macrocode} +% +% \subsection{The Document Body} +% +% Here is the document body, containing only a +% \cmd\DocInput\ directive---referring to this very file. +% This very cute self-reference is a common \classname{ltxdoc} idiom. +% \begin{macrocode} +\begin{document}% +\expandafter\DocInput\expandafter{\jobname.dtx}% +\end{document} +% \end{macrocode} +% +% \begin{macrocode} +%</doc> +% \end{macrocode} +% +% \section{Using this package} +% Once this package is installed on your filesystem, you can employ it in +% adding functionality to \LaTeX\ by invoking it in your document or document class. +% +% \subsection{Invoking the package} +% In your document, you can simply call it up in your preamble: +% \begin{verbatim} +%\documentclass{book}% +%\usepackage{ltxutil}% +%\begin{document} +%<your document here> +%\end{document}\end{verbatim} +% However, the preferred way is to invoke this package from within your +% customized document class: +% \begin{verbatim} +%\NeedsTeXFormat{LaTeX2e}[1995/12/01]% +%\ProvidesClass{myclass}% +%\RequirePackage{ltxutil}% +%\LoadClass{book}% +%<class customization commands> +%\endinput\end{verbatim} +% +% Once loaded, the package gives you acccess to certain procedures, +% usually to be invoked by a \LaTeX\ command or environment, but not at the document level. +% +% +% \section{Compatibility with \LaTeX's Required Packages} +% Certain packages, usually ones written by members of the +% \LaTeX\ Project itself, have been designated ``required'' and +% are distributed as part of standard \LaTeX. +% These packages have been placed in a priviledged position +% vis \'a vis the \LaTeX\ kernel in that they override the definitions of certain kernel macros. +% +% The \classname{ltxutil} package will be incompatible with any package that +% redefines any of the kernel macros that \classname{ltxutil} patches---if that +% package is loaded \emph{after} \classname{ltxutil}. This means that for +% greatest compatibility, \classname{ltxutil} should be loaded \emph{after}, +% say, \classname{ftnright}, which overwrites \LaTeX's kernel +% procedures \cmd\@outputdblcol, \cmd\@startcolumn, and \cmd\@makecol. +% +% Hereinafter follows some notes on specific \LaTeX\ packages. +% +% \subsection{array} +% This package alters the way tabular environments are done, +% therefore it could run afoul of the \LaTeX\ ``required'' package \classname{array} or any +% package that calls for it to be loaded. +% However, this package has provisions for remaining compatible with \classname{array}. +% So long as the version of \classname{array} that is used with this package has the appropriate +% meanings for the procedures it overwrites, all should be well. +% +% \subsection{longtable} +% David Carlisle's \classname{longtable} package modifies both the \LaTeX\ kernel and the +% \classname{array} package. This package must therefore alter \cmd\LT@array. +% For now, that job is handled by \classname{ltxgrid}. +% +% +%\StopEventually{} +% +% \section{Implementation of package} +% +% Special acknowledgment: this package uses concepts pioneered +% and first realized by William Baxter (mailto:web at superscript.com) +% in his SuperScript line of commercial typesetting tools, and +% which are used here with his permission. +% +% \subsection{Beginning of the \file{package} {\sc docstrip} module} +% \begin{macrocode} +%<*package> +\def\package@name{ltxutil}% +\expandafter\PackageInfo\expandafter{\package@name}{% + Utility macros for \protect\LaTeXe, + by A. Ogawa (arthur_ogawa at sbcglobal.net)% +}% +%</package> +% \end{macrocode} +% +% \subsection{Banner and beginning of the \file{kernel} {\sc docstrip} module}% +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% \subsection{Errors and warnings} +% +% \begin{macro}{\class@err} +% \begin{macro}{\class@warn} +% \begin{macro}{\class@info} +% A few shorthands for Class messages. +% Your document class should define \cmd\class@name. +% \begin{macrocode} +\def\class@err#1{\ClassError{\class@name}{#1}\@eha}% +\def\class@warn#1{\ClassWarningNoLine{\class@name}{#1}}% +\def\class@info#1{\ClassInfo{\class@name}{#1}}% +\def\obsolete@command#1{% + \class@warn@end{Command \string#1\space is obsolete.^^JPlease remove from your document}% + \global\let#1\@empty + #1% +}% +\def\replace@command#1#2{% + \class@warn@end{Command \string#1\space is obsolete;^^JUse \string#2\space instead}% + \global\let#1#2% + #1% +}% +\def\replace@environment#1#2{% + \class@warn@end{Environment #1 is obsolete;^^JUse #2 instead}% + \glet@environment{#1}{#2}% + \@nameuse{#1}% +}% +\def\incompatible@package#1{% + \@ifpackageloaded{#1}{% + \def\@tempa{I cannot continue. You must remove the \string\usepackage\ statement that caused that package to be loaded.}% + \ClassError{\class@name}{The #1 package cannot be used with \class@name}% + \@tempa\stop + }{% + \class@info{#1 was not loaded (OK!)}% + }% +}% +\def\class@warn@end#1{% + \gappdef\class@enddocumenthook{\class@warn{#1}}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{4.1a}{2008/01/19}{(AO, 459) do not assume \cs{class@name} is defined}% +% Give \cmd\class@name\ a meaning if it does not already have one. +% \begin{macrocode} +\ifx\undefined\class@name + \def\class@name{ltxutil}% + \class@warn{You should define the class name before reading in this package. Using default}% +\fi +% \end{macrocode} +% +% \subsection{New Tools}% +% +% \begin{macro}{\t@} +% \begin{macrocode} +\def\t@{to}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dimen@iii} +% \begin{macrocode} +\dimendef\dimen@iii\thr@@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\halignt@} +% \begin{macrocode} +\def\halignt@{\halign\t@}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\f@ur} +% Analogous to \cmd\@ne, \cmd\tw@, and \cmd\thr@@. +% \begin{macrocode} +\chardef\f@ur=4\relax +\chardef\cat@letter=11\relax +\chardef\other=12\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\let@environment} +% \begin{macro}{\glet@environment} +% The directive \cmd\let@environment\ takes care of a common programming +% idiom whereby one environment is made a synonym for another. +% \begin{macrocode} +\def\let@environment#1#2{% + \expandafter\let + \csname#1\expandafter\endcsname\csname#2\endcsname + \expandafter\let + \csname end#1\expandafter\endcsname\csname end#2\endcsname +}% +\def\glet@environment#1#2{% + \global\expandafter\let + \csname#1\expandafter\endcsname\csname#2\endcsname + \global\expandafter\let + \csname end#1\expandafter\endcsname\csname end#2\endcsname +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\tracingplain} +% The command \cmd\tracingplain\ causes \TeX's tracing parameters to +% return to the values set by default. This command is sometimes +% useful when you have said \cmd\tracingall\ somewhere and want to +% restore. +% The \cmd\traceoutput\ command causes \cmd\tracingoutput\ diagnostics +% upon \cmd\shipout. +% \begin{macrocode} +\newcommand\tracingplain{% + \tracingonline\z@\tracingcommands\z@\tracingstats\z@ + \tracingpages\z@\tracingoutput\z@\tracinglostchars\@ne + \tracingmacros\z@\tracingparagraphs\z@\tracingrestores\z@ + \showboxbreadth5\showboxdepth3\relax %\errorstopmode + }% +\newcommand\traceoutput{% + \appdef\@resetactivechars{\showoutput}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\say} +% \begin{macro}{\saythe} +% The commands \cmd\say\ and \cmd\saythe\ cause diagnostic messages in the +% \TeX\ log that give the value of a control sequence name or a register +% respectively. +% \begin{macrocode} +\newcommand\say[1]{\typeout{<\noexpand#1=\meaning#1>}}% +\newcommand\saythe[1]{\typeout{<\noexpand#1=\the#1>}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\fullinterlineskip} +% Resets the \cmd\prevdepth\ so that the full amount of \cmd\baselineskip\ glue will be inserted by +% the \cmd\baselinesklip\ mechanism. +% Can be invoked just after a \cmd\hrule\ to undo its default suppression of base line skip. +% \begin{macrocode} +\def\fullinterlineskip{\prevdepth\z@}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\count@i} +% \begin{macro}{\count@ii} +% +% \begin{macrocode} +\countdef\count@i\@ne +\countdef\count@ii\tw@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Boolean Control}% +% We introduce just enough of the Boolean calculus for \TeX. +% Alan Jeffrey was the pioneer here, with an article in TUGboat +% (Vol. 11, No. 2, page 237). +% This implementation owes a debt to +% William Baxter (web at superscript.com). +% See articles by Baxter and Ogawa in the proceedings of the +% 1994 TUG meeting, TUGboat Vol.~15, No.~3. +% +% \begin{macro}{\prepdef} +% \begin{macro}{\appdef} +% \begin{macro}{\gappdef} +% +% Provide the capability of performing head- and tail patches. +% The procedure \cmd\prepdef\ prepends to the given macro +% the tokens specified in its second argument. +% Likewise for \cmd\appdef, except that it appends. +% Note that the first 10 toks registers are utility registers, +% and we simply make a control sequence name, \cmd\toks@ii, for one of +% them. +% \begin{macrocode} +\long\def\prepdef#1#2{% + \@ifxundefined#1{\toks@{}}{\toks@\expandafter{#1}}% + \toks@ii{#2}% + \edef#1{\the\toks@ii\the\toks@}% +}% +\long\def\appdef#1#2{% + \@ifxundefined#1{\toks@{}}{\toks@\expandafter{#1}}% + \toks@ii{#2}% + \edef#1{\the\toks@\the\toks@ii}% +}% +\long\def\gappdef#1#2{% + \@ifxundefined#1{\toks@{}}{\toks@\expandafter{#1}}% + \toks@ii{#2}% + \global\edef#1{\the\toks@\the\toks@ii}% +}% +\long\def\appdef@val#1#2{% + \appdef#1{{#2}}% +}% +\long\def\appdef@e#1#2{% + \expandafter\appdef + \expandafter#1% + \expandafter{#2}% +}% +\long\def\appdef@eval#1#2{% + \expandafter\appdef@val + \expandafter#1% + \expandafter{#2}% +}% +\toksdef\toks@ii=\tw@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@ifxundefined} +% \begin{macro}{\@ifnotrelax} +% \begin{macro}{\@argswap} +% \begin{macro}{\@argswap@val} +% +% Certain utility procedures use \cmd\@ifxundefined, +% which is defined here in terms of \cmd\@ifx. +% Others use \cmd\@ifnotrelax, namely when +% the control sequence name is manufactured by +% the use of \cmd\csname. +% +% The procedures \cmd\@argswap and \cmd\@argswap@val +% are used to facilitate control of expansion. +% +% \begin{macrocode} +\long\def\@ifxundefined#1{\@ifx{\undefined#1}}% +\long\def\@ifnotrelax#1#2#3{\@ifx{\relax#1}{#3}{#2}}% +\long\def\@argswap#1#2{#2#1}% +\long\def\@argswap@val#1#2{#2{#1}}% +\def\@ifxundefined@cs#1{\expandafter\@ifx\expandafter{\csname#1\endcsname\relax}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\rvtx@ifformat@geq} +% Some changes in the \LaTeX{} kernel requires us to conditionally +% define some macros depending on the version of the kernel. +% \cmd\rvtx@ifformat@geq{} will check if the release date of the +% currently-running \LaTeXe{} kernel is greater or equal to the +% argument (the argument should be in the format \texttt{yyyy-mm-dd}). +% \changes{4.2d}{2020/09/17}{(PHO) Add \cs{rvtx@ifformat@geq}.}% +% \begin{macrocode} +\ifx\IfFormatAtLeastTF\undefined + \def\rvtx@ifformat@geq{\@ifl@t@r\fmtversion}% +\else + \let\rvtx@ifformat@geq\IfFormatAtLeastTF +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@boolean} +% \begin{macro}{\@boole@def} +% In order to define \cmd\@ifx, we first must create the +% ``defining word'' (term taken form our Forth vocabulary) +% \cmd\@boole@def, which employs \cmd\@boolean\ to do its job. +% \begin{macrocode} +\def\@boolean#1#2{% + \long\def#1{% + #2% \if<something> + \expandafter\true@sw + \else + \expandafter\false@sw + \fi + }% +}% +\def\@boole@def#1#{\@boolean{#1}}% Implicit #2 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@booleantrue} +% \begin{macro}{\@booleanfalse} +% The procedures \cmd\@booleantrue\ and +% \cmd\@booleanfalse\ are assignment operators +% for Boolean flags. +% \begin{macrocode} +\def\@booleantrue#1{\let#1\true@sw}% +\def\@booleanfalse#1{\let#1\false@sw}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@ifx} +% \begin{macro}{\@ifx@empty} +% \begin{macro}{\@if@empty} +% \begin{macro}{\@ifcat}% +% \begin{macro}{\@ifdim}% +% \begin{macro}{\@ifeof}% +% \begin{macro}{\@ifhbox}% +% \begin{macro}{\@ifhmode}% +% \begin{macro}{\@ifinner}% +% \begin{macro}{\@ifmmode}% +% \begin{macro}{\@ifnum}% +% \begin{macro}{\@ifodd}% +% \begin{macro}{\@ifvbox}% +% \begin{macro}{\@ifvmode}% +% \begin{macro}{\@ifvoid}% +% We can now invoke the defining word to create +% the procedures \cmd\@ifx\ and friends. +% +% Compatibility Note: earlier versions of this package +% defined a procedure \cmd\@ifempty. However, for compatibility with AMS\LaTeX, +% we must avoid the following three names: +% \cmd\@ifempty, \cmd\@xifempty, and \cmd\@ifnotempty. +% +% \begin{macrocode} +\@boole@def\@ifx#1{\ifx#1}% +\@boole@def\@ifx@empty#1{\ifx\@empty#1}% +\@boole@def\@if@empty#1{\if!#1!}% +%\@boole@def\@if@sw#1{\csname if#1\endcsname}% +\def\@if@sw#1#2{#1\expandafter\true@sw\else\expandafter\false@sw#2}% +\@boole@def\@ifdim#1{\ifdim#1}% +\@boole@def\@ifeof#1{\ifeof#1}% +\@boole@def\@ifhbox#1{\ifhbox#1}% +\@boole@def\@ifhmode{\ifhmode}% +\@boole@def\@ifinner{\ifinner}% +\@boole@def\@ifmmode{\ifmmode}% +\@boole@def\@ifnum#1{\ifnum#1}% +\@boole@def\@ifodd#1{\ifodd#1}% +\@boole@def\@ifvbox#1{\ifvbox#1}% +\@boole@def\@ifvmode{\ifvmode}% +\@boole@def\@ifvoid#1{\ifvoid#1}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\true@sw} +% \begin{macro}{\false@sw} +% +% Note that when a Boolean operator expands, it +% employs two macros that act as selectors, defined here. +% +% \begin{macrocode} +\long\def\true@sw#1#2{#1}% +\long\def\false@sw#1#2{#2}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\loopuntil} +% \begin{macro}{\loopwhile} +% +% Loop control using the Boolean idiom. +% Superior to \cmd\loop\dots\cmd\repeat\ because these can be nested. +% The tail of the argument must have a Boolean predicate. +% +% \begin{macrocode} +\long\def\loopuntil#1{#1{}{\loopuntil{#1}}}% +\long\def\loopwhile#1{#1{\loopwhile{#1}}{}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@provide} +% +% A defining word that refuses to clobber a prior meaning. +% +% \begin{macrocode} +\def\@provide#1{% + \@ifx{\undefined#1}{\true@sw}{\@ifx{\relax#1}{\true@sw}{\false@sw}}% + {\def#1}{\def\j@nk}% +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Begin Document Structure} +% The standard \LaTeX\ mechanism \cmd\AtBeginDocument\ +% is inadequate because the \cmd\vsize\ is bound much too early. +% We supply here a mechanism whereby decisions about the +% page layout can be deferred until \cmd\AtBeginDocument\ time. +% +% The problem we are working around is that the \cmd\AtBeginDocument\ +% hook in \cmd\document\ appears long after the calculation of +% \cmd\vsize\ and \cmd\hsize, that is, \LaTeX\ provides no mechanism +% for deferring the decision about the page grid until \cmd\AtBeginDocument\ time. +% We fix things by prepending a hook at the very beginning of \cmd\document. +% +% As it turns out, though, it appears feasible to simply invoke the desired +% column grid command at \cmd\AtBeginDocument\ time, since the MVL has nothing in it +% at that time that would be problematical. +% +% \begin{macro}{\document} +% We begin by installing hooks into \cmd\document\ that +% we will manage ourselves. +% +% The 2020-10-01 \LaTeX{} release got a new hook management system and +% several new hooks (several previously provided by \textsf{etoolbox}). +% The one we want here is \texttt{begindocument/before}, the first thing +% executed by \cmd\document{}, right after ending the group started by +% \cmd\begin{}. +% +% Thus, if the \LaTeX{} kernel date is 2020-10-01 we just add to that +% hook, otherwise resort to the old method, patching \cmd\document: +% end the group started by \cmd\begin, apply our hook, and +% conclude our shenanigans by absorbing +% the first token of the expansion of \cmd\document, which +% we assume to be \cmd\endgroup{} (true until the aforementioned release). +% \changes{4.1a}{2008/08/12}{Get rid of \cs{set@typesize@hook} \cs{set@pica@hook} and the \cs{normalsize} directive}% +% \changes{4.2d}{2020/09/17}{(PHO) Use \LaTeX's hook management system, if possible.}% +% \begin{macrocode} +\rvtx@ifformat@geq{2020-10-01}% + {% + \AddToHook{begindocument/before}{\document@inithook}% + }{% + \prepdef\document{% + \endgroup + \document@inithook + \true@sw{}% + }% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\document@inithook} +% To use, simply \cmd\appdef\cmd\document@inithook\arg{your tokens here}. +% \begin{macrocode} +\let\document@inithook\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\class@documenthook} +% \begin{macro}{\class@enddocumenthook} +% \changes{4.1a}{2008/08/12}{\cs{class@documenthook} is the last \cs{AtBeginDocument} token now} +% We install the last \cmd\AtBeginDocument\ hook, namely the +% procedure \cmd\class@documenthook. Within the document class, +% we will use this hook exclusively, so as to avoid interference from other packages. +% Similarly with \cmd\class@enddocumenthook, installed via \cmd\AtEndDocument. +% +% A document class using this package should do as this package does and just say, +% \cmd\appdef\ \cmd\class@documenthook\ instead of \cmd\AtBeginDocument, +% and \cmd\appdef\ \cmd\class@enddocumenthook\ instead of \cmd\AtEndDocument. +% \begin{macrocode} +\appdef\document@inithook{% + \AtBeginDocument{\class@documenthook}% +}% +\AtEndDocument{% + \class@enddocumenthook +}% +\let\class@documenthook\@empty +\let\class@enddocumenthook\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\enddocument} +% \begin{macro}{\check@aux} +% \begin{macro}{\do@check@aux} +% \changes{4.1n}{2009/12/05}{(AO, 569) Use of \classname{hyperref} interferes with column balancing of last page}% +% The standard \LaTeX\ \enve{document} processing is a potential problem, +% particularly when the output routine has been changed by \classname{ltxgrid}. +% We separate out the procedure that checks the auxiliary file at the end of +% the job so that later it can be called from the safety of the output +% routine. +% We will do this to ensure that the \cmd\@mainaux\ stream is not closed until +% the last page of the job is shipped out, and that can only be done by coordinating +% with the output routine. +% +% \changes{4.2d}{2020/09/17}{(PHO) Only redefine \cs{enddocument} in older versions.}% +% This approach, however, will only be done for older versions of the +% \LaTeX{} kernel: +% \begin{macrocode} +\rvtx@ifformat@geq{2020-10-01}{% + % <definitions for newer LaTeX later> +}{% + % <definitions for older LaTeX> +\def\enddocument{% +% \end{macrocode} +% \changes{4.1n}{2009/12/06}{(AO) Incorporate change to ltmiscen.dtx v1.1i 2000/05/19}% +% The following line from \filename{ltmiscen.dtx} `resets \cmd\AtEndDocument for latex/3060'. +% \begin{macrocode} + \let\AtEndDocument\@firstofone +% \end{macrocode} +% \begin{macrocode} + \@enddocumenthook + \@checkend{document}% +% \end{macrocode} +% The \cmd\clear@document\ statement ends the current page (we must guarantee no further shipouts), +% then executes all cleanup procedures that must occur only after the last shipout. +% Clients will queue up their procedures via \cmd\AfterLastShipout, if it exists, otherwise by doing \cmd\appdef\cmd\clear@document. +% \begin{macrocode} + \clear@document +% \end{macrocode} +% We are very close to ending the \TeX\ run, now. +% \begin{macrocode} + \check@aux + \deadcycles\z@ + \@@end +}% +\def\check@aux{\do@check@aux}% +\def\do@check@aux{% + \@if@sw\if@filesw\fi{% + \immediate\closeout\@mainaux + \let\@setckpt\@gobbletwo + \let\@newl@bel\@testdef + \@tempswafalse + \makeatletter + \input\jobname.aux\relax + }{}% + \@dofilelist + \@ifdim{\font@submax >\fontsubfuzz\relax}{% + \@font@warning{% + Size substitutions with differences\MessageBreak + up to \font@submax\space have occured.\@gobbletwo + }% + }{}% + \@defaultsubs + \@refundefined + \@if@sw\if@filesw\fi{% + \@ifx{\@multiplelabels\relax}{% + \@if@sw\if@tempswa\fi{% + \@latex@warning@no@line{% + Label(s) may have changed. + Rerun to get cross-references right% + }% + }{}% + }{% + \@multiplelabels + }% + }{}% +}% +} +% \end{macrocode} +% +% \changes{4.2d}{2020/09/17}{(PHO) Patch \cs{enddocument} at runtime in newer versions.}% +% \begin{macro}{\rvtx@enddocument@patch} +% For newer \LaTeX{} we'll try to be a bit more future-proof +% (no miracle though). The code for \cmd\enddocument{} +% (in pre-2020-10-01 \LaTeX) is roughly: +% \begin{verbatim} +% \def\enddocument{% +% <hooks and bookkeeping> +% \clearpage +% <read main .aux and final checks> +% \@@end +% } +% \end{verbatim} +% and the patches above replace the \cmd\clearpage{} by its own +% \cmd\clear@document, and \verb|<read main .aux and final checks>| by +% \cmd\do@check@aux, which it can later control the timing. +% +% Now we will apply the same changes, but this time without redefining +% \cmd\enddocument: we will instead replace tokens on-the-fly, when +% \cmd\enddocument{} is expanded. This will grant us a slightly safer +% approach that won't depend so much on the internals of +% \cmd\enddocument. +% +% This entire patch should work with the previous definition of +% \cmd\enddocument{} as well (except it cannot be used in the hook), +% but for now leave previous versions untouched. +% +% The entire patching will reside in the \texttt{enddocument} hook: +% \begin{macrocode} +\rvtx@ifformat@geq{2020-10-01}{% + \AddToHook{enddocument}{\rvtx@enddocument@patch{}}% +}{} +% \end{macrocode} +% +% This macro will be executed after \cmd\enddocument{} has expanded, +% so all its tokens are now exposed. Here we will assume that +% \cmd\enddocument{} contains the tokens \verb|\@checkend{document}| +% and \cmd\endgroup, and use them as delimiters: +% \begin{macrocode} +\protected\long\def\rvtx@enddocument@patch#1#2\@checkend#3{% + \begingroup + \edef\x{\detokenize{#3}}% + \edef\y{\detokenize{document}}% + \expandafter\endgroup + \ifx\x\y + \expandafter\rvtx@enddocument@patch@end + \else + \expandafter\rvtx@enddocument@patch@more + \fi + {#1#2}{#3}} +\def\rvtx@enddocument@patch@more#1#2{% + \rvtx@enddocument@patch{#1\@checkend{#2}}} +% \end{macrocode} +% +% When the \verb|\@checkend{document}| is reached, use \cmd\clearpage{} +% and \cmd\enddocument{} as delimiters for the +% \verb|<read main .aux and final checks>| part, and save it in +% \cmd\do@check@aux{}: +% \begin{macrocode} +\long\def\rvtx@enddocument@patch@end#1#2\clearpage#3\endgroup{% + \def\do@check@aux{#3\endgroup}% +% \end{macrocode} +% Then execute the code consumed in the previous step: +% \begin{macrocode} + #1% + \@checkend{#2}% +% \end{macrocode} +% Do \cmd\clear@document{} instead of \cmd\clearpage{} and +% \cmd\check@aux{} instead of the code grabbed. +% \begin{macrocode} + \clear@document + \check@aux} +\def\check@aux{\do@check@aux}% +% \end{macrocode} +% \end{macro} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\clear@document} +% \changes{4.1n}{2009/12/05}{(AO, 569) Use of \classname{hyperref} interferes with column balancing of last page}% +% The procedure \cmd\clear@document\ is responsible for flushing out the last page of the document, +% if not already done. +% The procedure then executes those procedures that must wait for execution until +% after the last page is shipped out. +% Clients of \classname{ltxutil}, such as \classname{ltxgrid} and \classname{revtex4} +% will queue these procedures up via \cmd\AfterLastShipout, if it exists, otherwise by doing \cmd\appdef\cmd\clear@document. +% +% The command \cmd\Call@AfterLastShipout\ is provided by Heiko Oberdiek's \classname{atveryend} package. +% This package is compatible with \classname{ltxutil}. +% +% Note on compatibility with \classname{atveryend}: +% we arrange for \cmd\Call@AfterLastShipout\ to be called from the safety of the output routine, +% thereby ensuring that all of the procedures queued up by that package's +% \cmd\AfterLastShipout\ are executed at the right time. +% We also ensure that \cmd\Call@AfterLastShipout\ has a default definition, in case the package was never loaded. +% \changes{4.1n}{2009/12/09}{(AO, 569) execute \classname{atveryend}'s \cs{Call@AfterLastShipout} at the proper time}% +% \begin{macrocode} +\def\clear@document{% + \clearpage + \do@output@cclv{% + \Call@AfterLastShipout + }% +}% +\appdef\class@documenthook{% + \providecommand\Call@AfterLastShipout{}% +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Class Extensions}% +% \changes{4.1a}{2008/08/12}{Class extension mechanism \cs{class@extension}, \cs{class@extensionfile}, and \cs{class@ext@hook}.} +% The \LaTeX\ procedure \cmd\@onefilewithoptions\ is the vehicle for reading in +% a \LaTeX\ class or package. +% The APS RevTeX class implements the use of what are called ``substyles'', +% actually extensions to the class itself. +% Any document class can do likewise. +% +% \begin{macro}{\class@extension} +% \begin{macro}{\class@extensionfile} +% \begin{macro}{\class@ext@hook} +% A procedure similar to \LaTeX's \cmd\@onefilewithoptions, but as an extension to the +% current document class. +% +% Read in the given file as if it were a document class file. +% Usage: \cmd\class@extensionfile\ \arg{class} \cmd\@extension, +% where \marg{class} is a file (similar to \file{aps.rtx}) and where \cmd\@extension\ is +% the file extension for \marg{class}. +% For instance, to read in the file \file{aps.rtx}, +% do \cmd\class@extensionfile\ \texttt{\{aps\}} \cmd\substyle@ext, +% where the latter has been define to expand to \file{.rtx}. +% +% Features supported include +% passing existing class options on to the class extension, +% \cmd\AtEndOfClass\ processing, +% a stack that restores \cmd\@currname, \cmd\@currext, \cmd\@clsextension, and the \cmd\catcode\ of `@', +% fall-back to a control sequence name (with leading `rtx@') if no file exists. +% +% Note that \cmd\LoadClass\ gives one the ability to write a class that calls in +% another class as a (sort of) module: this scheme is like \cmd\LoadClass, but +% turned inside out. +% \begin{macrocode} +\def\class@extension#1#2{% + \IfFileExists{#1.#2}{% + \expandafter\class@extensionfile\csname ver@\@currname.\@currext\endcsname{#1}#2% + }{% + \csname rtx@#1\endcsname + }% +}% +\def\class@extensionfile#1#2#3{% + \@pass@ptions#3\@unusedoptionlist{#2}% + \global\let\@unusedoptionlist\@empty + \expandafter\class@ext@hook\csname#2.#3-h@@k\endcsname#1{#2}#3% +}% +\def\class@ext@hook#1#2#3#4{% + \@pushfilename@ltx + \makeatletter + \let\CurrentOption\@empty + \@reset@ptions + \let#1\@empty + \xdef\@currname{#3}% + \global\let\@currext#4% + \global\let\@clsextension\@currext + \input{#3.#4}% + \@ifl@ter#4{#3}#2{% + \class@info{Class extension later than: #2}% + }{% + \class@info{Class extension earlier: #2}% + \@@end + }% + #1% + \let#1\@undefined + \expandafter\@p@pfilename@ltx\@currnamestack@ltx\@nil + \@reset@ptions +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@pushfilename} +% \begin{macro}{\@p@pfilename} +% \changes{4.1a}{2008/08/12}{Class extension mechanism \cs{@pushfilename@ltx} and \cs{@p@pfilename@ltx}.} +% But! \LaTeX\ does not provide for a class extension other than \file{.cls}, therefore we +% must extend \LaTeX's file name stack with the file extension of a class extension. +% This way, procedures like +% \cmd\ProvidesPackage, \cmd\OptionNotUsed, \cmd\ProcessOptions, \cmd\@reset@ptions\ +% will still work properly. +% \begin{macrocode} +\def\@pushfilename@ltx{% + \xdef\@currnamestack@ltx{% + {\@currname}% + {\@currext}% + {\@clsextension}% + {\the\catcode`\@}% + \@currnamestack@ltx + }% +}% +\def\@p@pfilename@ltx#1#2#3#4#5\@nil{% + \gdef\@currname{#1}% + \gdef\@currext{#2}% + \gdef\@clsextension{#3}% + \catcode`\@#4\relax + \gdef\@currnamestack@ltx{#5}% +}% +\global\let\@currnamestack@ltx\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% We carefully patch \LaTeX\ so that the current value of \cmd\@clsextension\ can be +% restored after reading in a class file. +% +% \subsection{Type Tools}% +% +% \begin{macro}{\flushing} +% Undoes \cmd\centering. Should also undo \cmd\raggedleft\ and \cmd\raggedright. +% \begin{macrocode} +\def\flushing{% + \let\\\@normalcr + \leftskip\z@skip + \rightskip\z@skip + \@rightskip\z@skip + \parfillskip\@flushglue +}% +% \end{macrocode} +% \end{macro} +% +% \changes{4.1g}{2009/10/07}{(AO, 539) Use of double-backslash in argument of \cs{section} gives error. The \classname{textcase} package is involved.}% +% \begin{macro}{\@centercr} +% The \cmd\@centercr\ command is the replacement for \cmd\@normalcr\ when setting type centered or ragged. +% Normally, the meaning of \cmd\\ is \cmd\@normalcr, which \LaTeX\ defines via \cmd\DeclareRobustCommand. +% In centered or ragged typesetting, the meaning of \cmd\\ is \cmd\@centercr, +% therefore it ought to to be defined via \cmd\DeclareRobustCommand\ (but unfortunately is not). +% The fact that it is not is yet another of \LaTeX's early failures that will never get fixed. +% +% The following exemplar fails under \LaTeX\ version 2005/12/01, package \classname{textcase} 2004/10/07 v0.07: +% \begin{verbatim} +%\documentclass{article}% +%\usepackage[overload]{textcase} +%\begin{document} +%\centering +%\section{\MakeTextUppercase{Section\\title}} +%Text +%\end{document} +% \end{verbatim} +% The solution is to promote \cmd\@centercr\ to a robust command, just the same as \cmd\\. +% We do that here without needing to know the meaning of the command. +% \begin{macrocode} +\expandafter\DeclareRobustCommand\expandafter\@centercr\expandafter{\@centercr}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Display Math}% +% +% \begin{macro}{\eqnarray@LaTeX} +% \begin{macro}{\eqnarray@fleqn@fixed} +% Team \LaTeX\ has stated they will never repair Leslie's broken definition of \env{eqnarray}. +% Let us be bold\dots. +% +% Note on \classname{hyperref} package compatibility: that package overrides +% \cmd\eqnarray\ by wrapping it up in a larger procedure, so its changes +% are compatible with this package's changes. +% +% \changes{4.1a}{2008/01/19}{(AO, 475) I had not properly reproduced the LaTeX macro \cs{eqnarray}.}% +% \begin{macrocode} +\def\eqnarray@LaTeX{% + \stepcounter{equation}% + \def\@currentlabel{\p@equation\theequation}% + \global\@eqnswtrue + \m@th + \global\@eqcnt\z@ + \tabskip\@centering + \let\\\@eqncr + $$\everycr{}\halign to\displaywidth\bgroup + \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel + &\global\@eqcnt\@ne\hskip \tw@\arraycolsep \hfil${##}$\hfil + &\global\@eqcnt\tw@ \hskip \tw@\arraycolsep + $\displaystyle{##}$\hfil\tabskip\@centering + &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup + \tabskip\z@skip + \cr +} +\long\def\eqnarray@fleqn@fixed{% + \stepcounter{equation}\def\@currentlabel{\p@equation\theequation}% + \global\@eqnswtrue\m@th\global\@eqcnt\z@ + \tabskip\ltx@mathindent + \let\\=\@eqncr + \setlength\abovedisplayskip{\topsep}% + \ifvmode\addtolength\abovedisplayskip{\partopsep}\fi + \addtolength\abovedisplayskip{\parskip}% + \setlength\belowdisplayskip{\abovedisplayskip}% + \setlength\belowdisplayshortskip{\abovedisplayskip}% + \setlength\abovedisplayshortskip{\abovedisplayskip}% + $$% + \everycr{}% + \halignt@\linewidth\bgroup + \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel + &\global\@eqcnt\@ne + \hskip\tw@\eqncolsep + \hfil${{}##{}}$\hfil + &\global\@eqcnt\tw@ + \hskip\tw@\eqncolsep + $\displaystyle{##}$\hfil\tabskip\@centering + &\global\@eqcnt\thr@@\hb@xt@\z@\bgroup\hss##\egroup + \tabskip\z@skip + \cr +}% +\@ifx{\eqnarray\eqnarray@LaTeX}{% + \class@info{Repairing broken LaTeX eqnarray}% + \let\eqnarray\eqnarray@fleqn@fixed + \newlength\eqncolsep + \setlength\eqncolsep\z@ + \let\eqnarray@LaTeX\relax + \let\eqnarray@fleqn@fixed\relax +}{}% +% \end{macrocode} +% The macro \cmd\ltx@mathindent\ is assigned to the \cmd\tabskip\ glue just +% before the alignment preamble is expanded, the value therefore applying at the +% left of the first column. +% +% The below value specifies the display math to be set centered, as is common practice. +% Alternatively, \cmd\tabskip\ can be set to a different glue value, accomplishing +% flush-left display math. +% +% Note that the \filename{fleqn.clo} package provides its own meaning for +% the eqnarray environment, which is also broken. We do not patch that package, however. +% +% \changes{4.1d}{2009/03/27}{(AO, 511) Compatability with lineno.sty's erroneous way of detecting fleqn.clo}% +% Bug note: The \filename{lineno.sty} package detects \filename{fleqn.clo} +% by testing whether \cmd\mathindent\ is defined, instead of using correct \LaTeXe\ means. +% Even though our eqnarray environment is modelled after \filename{fleqn.clo}, +% we must program defensively here. +% \begin{macrocode} +\def\ltx@mathindent{\@centering}% +\def\set@eqnarray@skips{}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{4.1g}{2009/10/07}{(AO, 525) Remove phantom paragraph above display math that is given in vertical mode}% +%\begin{macro}{\prep@math} +%\begin{macro}{\prep@math@patch} +% If we are in vertical mode when display math mode is entered (via \verb+$$+), +% \TeX\ will first enter horizontal mode, then display math mode; this results in a phantom paragraph +% containing a single \cmd\hbox\ consisting of the \cmd\parindent\ box followed by the \cmd\parskipfillskip\ glue. +% Of course, that \cmd\hbox\ is accompanied by \cmd\parskip\ glue and \cmd\baselineskip\ glue. +% +% The \cmd\prep@math\ procedure removes the \cmd\parindent\ box, thereby (magically) eliminating the phantom paragraph. +% The \cmd\prep@math@patch\ procedure headpatches the \env{equation} and \env{eqnarray} environments +% to accomplish this removal of the phantom paragraph. +% +% Note that there are three remaining ways to enter display math mode that we do not treat: +% the \env{displaymath} environment (equivalent to \cmd\[/\cmd\]), and the primitive the \verb+$$+ markup. +% I refrain from treating the first case because \env{displaymath} already detects the case +% where it is entered from vertical mode: I do not wish to engage in the dubious enterprise of attempting to correct a procedure that is ill conceived from the outset. +% As to the primitive \verb+$$+, there is no help for users who insist upon employing procedural markup in their documents. +% in their documents. +% \begin{macrocode} +\def\prep@math{% + \@ifvmode{\everypar{{\setbox\z@\lastbox}}}{}% +}% +\def\prep@math@patch{% + \prepdef\equation{\prep@math}% + \prepdef\eqnarray{\prep@math}% +}% +% \end{macrocode} +% A document class may invoke \cmd\prep@math@patch\ at any point it wishes to prevent the appearance +% of the phantom paragraph: it may be a global declaration or a local one. +% \end{macro} +% \end{macro} +% +% We fail to patch \cmd\[, \cmd\equation, however. +% +% \subsection{Footnotes} +% +% \changes{4.0d}{2000/04/10}{(AO, 174) kernel fix} +% +% \begin{macro}{\footnotemark} +% \begin{macro}{\footnotetest} +% \begin{macro}{\ltx@xfootnote} +% \begin{macro}{\ltx@footmark} +% \begin{macro}{\ltx@foottext} +% \begin{macro}{\ltx@make@current@footnote} +% We repair an error in the \LaTeX\ kernel (see \file{ltfloat.dtx}) involving footnotes. +% The symptom is that the \cmd\footnotemark\ command does not work properly within a \env{minipage} environment. +% The source of the problem is in the way the \cmd\footnotemark\ and \cmd\@xfootnotemark\ procedures are defined: +% they do not share the method, used by \cmd\footnote\ and other procedures, that allows a context switch to +% change the way footnotes behave within a minipage environment. +% This is a \LaTeX\ bug of long standing; our fix dates to 1987. +% +% While we are at it, we rewrite both the \cmd\footnote, \cmd\footnotemark\ and \cmd\footnotetext\ procedures, +% achieving a cleaner separation of syntax and semantics. +% Note that the \cmd\@footnotetext\ procedure is not involved in context switching; +% \classname{hyperref} will take over that procedure, substituting its own processing around +% its argument and passing this to \cmd\H@@footnotetext. +% We anticipate this, and do our context switching on \cmd\H@@footnotetext. +% +% The \cmd\@makefnmark\ continues as the method of formatting the footnote mark. +% +% A note about the context switch mentioned above: +% the \env{minipage} environment executes the following in order to alter the way footnotes +% behave:\begin{verbatim} +%\def\@mpfn{mpfootnote}% +%\def\thempfn{\thempfootnote}% +%\let\@footnotetext\@mpfootnotetext +%\let\@makefnmark\@mpmakefnmark +%\c@mpfootnote\z@\end{verbatim} +% This code changes the counter used in autonumbered footnotes, the choice of footnote marker, +% and the procedure used on the footnote text. Changing the counter is needed because minipage +% footnotes are in their own sequence, and the footnote marker is customarily different within +% a minipage. The procedure that works on the footnote text must be different because the footnotes +% are placed at the bottom of the minipage, not the bottom of the text column. +% +% Note that \LaTeX\ initially defines \cmd\@mpfn\ as \texttt{footnote} and \cmd\thempfn\ as \cmd\thefootnote, +% so we are initially doing general footnotes. +% +% Any procedure that establishes a minipage-like context (e.g., floats) can do the same as the mimipage context switch +% illustrated above. +% \changes{4.1a}{2008/06/30}{(AO, 438) Complete rewrite of footnote macros.} +% +% Three user-level command, \cmd\footnote, \cmd\footnotemark, and \cmd\footnotetext\ are defined (see the \LaTeX\ manual for user-level details). +% \begin{macro}{\footnote} +% The first user-level command is \cmd\footnote. +% A simple way to look at this command is to think of it as +% \cmd\footnotemark\ \oarg{number} \cmd\footnotetext\ \oarg{number} \arg{text}, +% where the optional argument is the same in both calls. +% We also define a syntactical helper procedure \cmd\ltx@xfootnote. +% +% We employ the procedures \cmd\ltx@stp@footproc\ and \cmd\ltx@def@footproc, +% passing in the procedure to execute, in this case \cmd\ltx@footmark, +% which sets the footnote mark. +% In any case, we end on the procedure \cmd\ltx@foottext, which sets the footnote text. +% \begin{macrocode} +\def\footnote{\@ifnextchar[\ltx@xfootnote\ltx@yfootnote}% +\def\ltx@xfootnote[#1]{% + \ltx@def@footproc\ltx@footmark[#1]% + \expandafter\ltx@foottext\expandafter{\the\csname c@\@mpfn\endcsname}% +}% +\def\ltx@yfootnote{% + \ltx@stp@footproc\ltx@footmark + \expandafter\ltx@foottext\expandafter{\the\csname c@\@mpfn\endcsname}% +}% +% \end{macrocode} +% The \cmd\footmark\ user-level command is next. +% Here we use the procedures \cmd\ltx@stp@footproc\ and \cmd\ltx@def@footproc\ again, +% but unlike \cmd\footnote, we do not set the footnote text. +% \begin{macrocode} +\def\footnotemark{\@ifnextchar[\ltx@xfootmark\ltx@yfootmark}% +\def\ltx@xfootmark{\ltx@def@footproc\ltx@footmark}% +\def\ltx@yfootmark{\ltx@stp@footproc\ltx@footmark}% +\def\ltx@footmark#1{% + \leavevmode + \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi + \begingroup + \expandafter\ltx@make@current@footnote\expandafter{\@mpfn}{#1}% + \expandafter\@argswap@val\expandafter{\Hy@footnote@currentHref}{\hyper@linkstart {link}}% + \@makefnmark + \hyper@linkend + \endgroup + \ifhmode\spacefactor\@x@sf\fi + \relax +}% +% \end{macrocode} +% The third user-level command is \cmd\footnotetext. +% As with \cmd\footnotemark, we use the procedures \cmd\ltx@stp@footproc\ and \cmd\ltx@def@footproc, +% this time passing in the procedure \cmd\ltx@foottext, which sets the footnote text. +% \begin{macrocode} +\def\footnotetext{\@ifnextchar[\ltx@xfoottext\ltx@yfoottext}% +\def\ltx@xfoottext{\ltx@def@footproc\ltx@foottext}% +\def\ltx@yfoottext{\ltx@stp@footproc\ltx@foottext}% +\long\def\ltx@foottext#1#2{% + \begingroup + \expandafter\ltx@make@current@footnote\expandafter{\@mpfn}{#1}% + \@footnotetext{#2}% + \endgroup +}% +% \end{macrocode} +% Here are the definitions of the procedures \cmd\ltx@stp@footproc\ and \cmd\ltx@def@footproc. +% The require argument is the procedure to execute afterwards, and +% \cmd\ltx@def@footproc\ parses a bracket-delimited argument (it is not optional). +% In each case the given procedure is executed with an argument prepared for it: +% the value of the footnote counter. +% \begin{macrocode} +\def\ltx@def@footproc#1[#2]{% + \begingroup + \csname c@\@mpfn\endcsname #2\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \expandafter\endgroup + \expandafter#1% + \expandafter{\the\csname c@\@mpfn\endcsname}% +}% +\def\ltx@stp@footproc#1{% + \expandafter\stepcounter\expandafter{\@mpfn}% + \protected@xdef\@thefnmark{\thempfn}% + \expandafter#1% + \expandafter{\the\csname c@\@mpfn\endcsname}% +}% +% \end{macrocode} +% Here we provide for our good friend \classname{hyperref} +% to enter in like a bull in a china shop. If it is not loaded, +% we do what it would have done, but gentlier and without hypertext functionality. +% \begin{macrocode} +\appdef\class@documenthook{% + \let\footnote@latex\footnote + \@ifpackageloaded{hyperref}{}{% + \let\H@@footnotetext\@footnotetext + \def\@footnotetext{\H@@footnotetext}% + \let\H@@mpfootnotetext\@mpfootnotetext + \def\@mpfootnotetext{\H@@mpfootnotetext}% + }% +}% +% \end{macrocode} +% In the following, we must use \LaTeX's rococco equipment in the form of \cmd\protected@edef, +% because of the presence of a font switch in the meaning of \cmd\thempfootnote. +% But, really, isn't this a sloppy conflation of semantics and presentation? +% \begin{macrocode} +\def\ltx@make@current@footnote#1#2{% + \csname c@#1\endcsname#2\relax + \protected@edef\Hy@footnote@currentHref{\@currentHref-#1.\csname the#1\endcsname}% +}% +\def\thempfootnote@latex{{\itshape \@alph \c@mpfootnote }}% +\def\ltx@thempfootnote{\@alph\c@mpfootnote}% +\@ifx{\thempfootnote\thempfootnote@latex}{% + \class@info{Repairing hyperref-unfriendly LaTeX definition of \string\mpfootnote}% + \let\thempfootnote\ltx@thempfootnote +}{}% +% \end{macrocode} +% +% Note on \classname{hyperref} compatibility: +% In its ``Automated \LaTeX\ hypertext cross-references'', +% the \classname{hyperref} package alters footnote processing, +% but it does nothing to address the several issues of concern to us. +% +% The \classname{hyperref} package takes over the \cmd\@mpfootnotetext\ and +% \cmd\@footnotetext\ procedures, wrapping the argument in its own code. +% It also rewrites \cmd\@footnotemark, making it a hyperlink, and +% \cmd\@xfootnotenext, removing from it all hypertext capabilities. +% +% However, if the \cmd\footnotemark\ command has been supplied with an optional argument, +% \classname{hyperref}'s changes do not apply: it punts in this case. +% +% At the same time, it attempts to turn off its changes during +% \cmd\maketitle\ processing, destroying one of the capabilities we desire. +% +% We make ourself \classname{hyperref} savvy: +% we re-implement footnote processing, using \classname{hyperref} capabilities if that +% package has been loaded. +% +% Any other package that rewrites \LaTeX's footnote macros will be incompatible +% with this package. +% \changes{4.1a}{2008/06/30}{(AO) Remove code that avoided changes to \cs{@xfootnotemark}}% +% +% Two thoughts about \classname{hyperref}: what for does it define \cmd\realfootnote? +% Apparently even SR himself cannot remember. +% +% Also: a document class that desires high hypertext capabilities might +% well wish to reimplement \cmd\maketitle\ so that footnotes called out from there +% are hypertext links: the \classname{hyperref} package's +% ``Automated \LaTeX\ hypertext cross-references'' +% does not do any of this: +%\begin{quotation} +% But the special footnotes in |\maketitle| are much too hard to deal with properly. +% Let them revert to plain behaviour. +%\end{quotation} +% Note that the document class, in reimplementing \cmd\maketitle, must ensure +% that the \classname{hyperref} package does not clobber its own definition! +% +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@footnotetext} +% \begin{macro}{\@mpfootnotetext} +% \begin{macro}{\@tpfootnotetext} +% \begin{macro}{\make@footnotetext} +% \begin{macro}{\set@footnotewidth} +% The two procedures \cmd\@footnotetext\ and \cmd\@mpfootnotetext\ share code. +% We make that explicit here. +% +% Note that the procedure calling \cmd\make@footnotetext\ will open a group +% with \cmd\bgroup\ which is then closed by \cmd\minipagefootnote@drop. +% +% Difference from \LaTeX: here we do not set \cmd\floatingpenalty\ to infinity. +% Doing this must date back to a time when \LaTeX\ could not accomodate split insertions (footnotes). +% I cannot think of any other reason to do have done this. +% At any rate, with the \classname{ltxgrid} package, split insertions are properly +% taken care of, so we allow it. +% +% We provide the hook \cmd\set@footnotewidth\ +% that sets the footnote on a particular measure. +% Some page grids are such as to set a footnote in a context where \cmd\columnwidth +% is not the right parameter to use for the set width of a footnote. +% In such a case, for the applicable scope, you should define +% \cmd\set@footnotewidth\ to perform this job correctly. +% +% If we are setting type on multiple page grids, we must still ensure that all footnotes that +% find their way into the \cmd\footins\ insert register are set on the same width. +% This implies the need for a document to have an ``overall'' page grid, which determines the set width of all footnotes +% with the exception of minipage footnotes. +% +% In general, remember that footnotes, like all insertions (including floats), +% are a step outside of the galley context, and all aspects of insertions need to be +% properly handled, including the set width. +% \begin{macrocode} +\def\@makefnmark{% + \hbox{% + \@textsuperscript{% + \normalfont\itshape\@thefnmark + }% + }% +}% +% \end{macrocode} +% \begin{macrocode} +\long\def\@footnotetext{% + \insert\footins\bgroup + \make@footnotetext +}% +% \end{macrocode} +% \begin{macrocode} +\long\def\@mpfootnotetext{% + \minipagefootnote@pick + \make@footnotetext +}% +% \end{macrocode} +% Procedure \cmd\make@footnotetext\ sets the footnote \verb+#1+ into type, with the proper +% font, color, leading, width, and label in effect. +% It also establishes a strut and null glue at the end of the last paragraph of the footnote; +% The strut helps compensate for the lack of \cmd\interlineskip\ glue between \cmd\insert s; +% the glue establishes a feasible \cmd\vsplit\ point between footnotes. +% +% Note that in the title block (\classname{ltxfront}), the alternative definition, under the name \cmd\frontmatter@footnotetext, is used. +% The only material difference there is the reference to \cmd\frontmatter@makefntext\ instead of \cmd\@makefntext. +% +% Dependency note: the \cmd\@makefntext\ procedure is used to further process the footnote text +% and to execute the \cmd\@makefnmark\ procedure to produce the footnote mark. +% The definition of the former is customarily found in the document class (hereunder that of \filename{article.cls}), +% the latter in \filename{latex.ltx}. They are as follows: +% \begin{verbatim} +%\newcommand\@makefntext[1]{% +% \parindent 1em\noindent +% \hb@xt@1.8em{\hss\@makefnmark}% +% #1% +%}% +%\def\@makefnmark{% +% \hbox{\@textsuperscript{\normalfont\@thefnmark}}% +%}% +% \end{verbatim} +% +% \changes{4.1n}{2010/01/06}{(AO, 572) title block footnotes numbered independently from body footnotes}% +% \begin{macrocode} +\long\def\make@footnotetext#1{% + \set@footnotefont +% \end{macrocode} +% As noted above, we do \emph{not} do \cmd\floatingpenalty\ \cmd\@MM, as in standard \LaTeX. +% \begin{macrocode} + \set@footnotewidth + \@parboxrestore + \protected@edef\@currentlabel{% +% \end{macrocode} +% Note that we employ \cmd\@mpfn\ as a level of redirection for the footnotecounter. +% \begin{macrocode} + \csname p@\@mpfn\endcsname\@thefnmark + }% + \color@begingroup + \@makefntext{% + \rule\z@\footnotesep\ignorespaces#1% +% \end{macrocode} +% \changes{4.1n}{2010/01/02}{(AO, 571) allow split after last line of footnote}% +% The following strut and glue are for spacing and splitting, as mentioned above. +% \begin{macrocode} + \@finalstrut\strutbox\vadjust{\vskip\z@skip}% + }% + \color@endgroup + \minipagefootnote@drop +}% +% \end{macrocode} +% \changes{4.1f}{2009/07/07}{(AO, 515) Hook for setting the font of a footnote} +% \cmd\set@footnotefont\ is the procedure for setting the font of a footnote. +% Other aspects of the environment may be set using this hook. +% \begin{macrocode} +\def\set@footnotefont{% + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth\dp\strutbox +}% +% \end{macrocode} +% \cmd\set@footnotewidth\ is the procedure for setting the width of a footnote. +% The default page grid, a single, full-width column, sets footnotes on the width of the text. +% \changes{4.1n}{2010/01/02}{(AO, 571) Interface \cs{set@footnotewidth} for determining the set width of footnotes}% +% \begin{macrocode} +\def\set@footnotewidth{\set@footnotewidth@one}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Floats} +% +% \subsubsection{Usage notes}% +% We extend the \LaTeX\ kernel for three purposes: +% \begin{enumerate} +% +% \item +% When the \cmd\footnote\ command is used within the +% scope of a float, we do as \env{minipage} does. +% +% \item +% We provide a mechanism to write floats out to an external +% stream for temporary storage (deferred floats). +% +% \item +% We provide mechanism for placing a float \texttt{here} +% invariably, that is, floats are unfloated. +% This mechanism is used to read the external stream mentioned above. +% +% \end{enumerate} +% +% To use these mechanisms, the document class should +% define a float, say, \env{figure} as per usual, and in addition: +% \begin{enumerate} +% +% \item +% Optionally define an alternative, say \env{figure@write} as follows: +% \begin{verbatim}\newenvironment{figure@write}{% +% \write@float{figure}% +%}{% +% \endwrite@float +%}\end{verbatim} +% That is, the alternative environment executes \cmd\write@float\ +% instead of \cmd\@float. +% Note that this step is not needed if the float environment +% is defined in the simple way of \file{classes.dtx}. +% However, an environment like \env{longtable} will require it. +% +% \item +% Install into \cmd\AtBeginDocument\ a call to \cmd\do@if@floats, +% with the float name and an appropriate file extension as its arguments. +% \begin{verbatim}\appdef\class@documenthook{\do@if@floats{figure}{.fgx}}\end{verbatim} +% +% \item +% Optionally define a text entity \cmd\figuresname\ that will +% be the text of the head that is set over the +% deferred floats. +% If not defined, there will be no head. +% +% \item +% Optionally define a user-level command to allow +% the document to determine where the figures are printed out +% (default is to print at end of document). E.g., +% \begin{verbatim}\newcommand\printfigures{\print@float{figure}}\end{verbatim} +% \item +% Install into \cmd\appdef\cmd\class@enddocumenthook\ a call to \cmd\printfigures, +% or, if the latter is not defined, as follows: +% \begin{verbatim}\appdef\class@enddocumenthook{\print@float{figure}}\end{verbatim} +% Note that installing this command into \cmd\AtBeginDocument +% is best done earlier than calls that assume the last page of +% the document is at hand. +% +% \end{enumerate} +% +% \subsubsection{Robustifying fragile commands}% +% Certain of \LaTeX's commands cannot be written out to a file or appear within a \cmd\mark\ command argument +% because they do calculations during expansion. +% We provide for a little help, but without changing the meanings of these commands. +% +% \begin{macro}{\addtocontents} +% \begin{macro}{\robustify@contents} +% +% \changes{4.1a}{2008/06/30}{(AO) Make \cs{addtocontents} a \cs{long} \cs{def}; gobble up \cs{footnote}}% +% \begin{macrocode} +\def\robustify@contents{% + \let \label \@gobble + \let \index \@gobble + \let \glossary \@gobble + \let\footnote \@gobble + \def\({\string\(}% + \def\){\string\)}% + \def\\{\string\\}% +}% +\long\def\addtocontents#1#2{% + \protected@write\@auxout{\robustify@contents}{\string \@writefile {#1}{#2}}% +}% +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \subsubsection{Preparing for the \classname{hyperref package}}% +% +% \begin{macro}{\addcontentsline} +% \begin{macro}{\label} +% \begin{macro}{\ltx@contentsline} +% \changes{4.1b}{2008/08/12}{Refine toc processing: provide default.}% +% The \classname{hyperref} package assumes that the \cmd\contentsline\ command will be given four arguments. +% Therefore it cannot successfully process a \filename{.toc} file that had been written by standard \LaTeX. +% We fix things up by always writing that fourth argument and by supplying a \cmd\contentsline\ command that +% can read them. +% +% We also give the \cmd\newlabel\ command's second argument five tokens. +% +% Finally, we wrap \LaTeX's \cmd\contentsline\ command with code to detect the case +% where the expected procedure is not defined, and we give it a syntax with no semantics. +% +% We switch over to this new definition only after \classname{hyperref} has loaded. +% \begin{macrocode} +\def\addcontentsline#1#2#3{% + \addtocontents{#1}{% + \protect\contentsline{#2}{#3}{\thepage}{}% + }% +}% +\def\label#1{% + \@bsphack + \protected@write\@auxout{}{% + \string\newlabel{#1}{{\@currentlabel}{\thepage}{}{}{}}% + }% + \@esphack +}% +\def\ltx@contentsline#1{% + \expandafter\@ifnotrelax\csname l@#1\endcsname{}{% + \expandafter\let\csname l@#1\endcsname\@gobbletwo + }% + \contentsline@latex{#1}% +}% +\appdef\document@inithook{% + \let\contentsline@latex\contentsline + \let\contentsline\ltx@contentsline +}% +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Footnotes within floats, unfloating floats, float font}% +% +% \begin{macro}{\caption} +% DPC: Er a bit of a hack, but seems best way of supporting normal +% \LaTeX\ syntax at this point: If a caption is used below a table, +% then put out the footnotes before the caption. +% \changes{4.0b}{1999/06/20}{Support the hack with \cs{prepdef}, and delay until \cs{AtBeginDocument} time, since \classname{hyperref} clobbers \cs{caption}.} +% \begin{macrocode} +\appdef\class@documenthook{% + \prepdef\caption{\minipagefootnote@here}% +}% +% \end{macrocode} +% +% Note on \classname{hyperref} compatibility: +% this change to the \cmd\caption\ command is compatible with the +% ``Automated \LaTeX\ hypertext cross-references'' patches of that package. +% +% All the same, I think Sebastian's changes to \cmd\caption\ and \cmd\@caption\ +% could bear with some improvement. +% The following implementation requires knowing only the pattern part of the +% \cmd\@caption\ macro: +%\begin{verbatim} +%\def\caption{% +% \H@refstepcounter\@captype +% \hyper@makecurrent{\@captype}% +% \@dblarg{\H@caption\@captype}% +%}% +%\def\H@caption#1[#2]#3{% +% \@caption{#1}[#2]{% +% \ifHy@nesting +% \hyper@@anchor{\@currentHref}{#3}% +% \else +% \hyper@@anchor{\@currentHref}{\relax}#3% +% \fi +% }% +%}\end{verbatim} +% +% \end{macro} +% +% \begin{macro}{\minipagefootnote@init} +% \begin{macro}{\minipagefootnote@here} +% \begin{macro}{\minipagefootnote@foot} +% \begin{macro}{\minipagefootnote@pick} +% \begin{macro}{\minipagefootnote@drop} +% Procedure to deal with footnotes accumulated within a minipage environment. +% These procedures encapsulate all uses of the \cmd\@mpfootins\ box. +% +% +% Note: \cmd\minipagefootnote@here\ must \emph{not} be executed within the MVL! +% \begin{macrocode} +\def\minipagefootnote@init{% + \setbox\@mpfootins\box\voidb@x +}% +\def\minipagefootnote@pick{% + \global\setbox\@mpfootins\vbox\bgroup + \unvbox\@mpfootins +}% +\def\minipagefootnote@drop{% + \egroup +}% +\def\minipagefootnote@here{% + \par + \@ifvoid\@mpfootins{}{% + \vskip\skip\@mpfootins + \fullinterlineskip + \@ifinner{% + \vtop{\unvcopy\@mpfootins}% + {\setbox\z@\lastbox}% + }{}% + \unvbox\@mpfootins + }% +}% +\def\minipagefootnote@foot{% + \@ifvoid\@mpfootins{}{% + \insert\footins\bgroup\unvbox\@mpfootins\egroup + }% +}% +\def\endminipage{% + \par + \unskip + \minipagefootnote@here + \@minipagefalse %% added 24 May 89 + \color@endgroup + \egroup + \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\floats@sw} +% \changes{4.1b}{2008/08/12}{Default assignment of \cs{float@sw} now, not at \cs{AtBeginDocument} time.}% +% The Boolean \cmd\floats@sw\ signifies that floats are to be floated; +% if false, that floats are to be deferred to the end of the document. +% Note that the assignment of this Boolean is to be overridden by +% the document class in response to user-selected options. +% \begin{macrocode} +\@booleantrue\floats@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xfloat} +% \begin{macro}{\@mpmakefntext} +% The float start-code is redefined to set up footnotes in the style of minipage. +% Also, the \cmd\floats@sw\ Boolean informs us that floats are to be +% all placed \texttt{here}. +% Note that, to protect against the Boolean being undefined +% at this late hour, we default it globally to true. +% +% \changes{4.0b}{1999/06/20}{AO: Removed superfluous \cs{def}s, changed to using \cs{floats@sw} as the flag. Also stopped using DPC's \cs{if@twocolumn} flag: using \cs{floats@sw} instead. Also added \cs{par}\cs{vskip}\cs{z@skip} after the \cs{minipagefootnotes} so that the float box would have zero depth like the kernel one. } +% \changes{4.0c}{1999/11/13}{(AO, 110) Install hooks for endfloats processing} +% \changes{4.0d}{2000/04/10}{(AO, 127) Floats placed [h] to allow page breaks} +% \changes{4.0d}{2000/05/19}{(AO, 224) Hyperref compatibility.} +% \changes{4.0e}{2000/11/16}{(AO, 221) Remove samepage command from @xfloat@prep: If the float can break over pages, we want better control.} +% \changes{4.1a}{2008/07/07}{\cs{@xfloat@prep} calls \cs{ltx@footnote@pop} to restore the original \cs{ltx@footmark} and \cs{ltx@foottext} procedures, in case footnote processing has switched.} +% \changes{4.1b}{2008/08/12}{No need to protect against undefined \cs{float@sw}} +% +% \begin{macrocode} +\let\@xfloat@LaTeX\@xfloat +\def\@xfloat#1[#2]{% + \@xfloat@prep + \@nameuse{fp@proc@#2}% + \floats@sw{\@xfloat@LaTeX{#1}[#2]}{\@xfloat@anchored{#1}[]}% +}% +\def\@xfloat@prep{% + \ltx@footnote@pop + \def\@mpfn{mpfootnote}% + \def\thempfn{\thempfootnote}% + \c@mpfootnote\z@ + \let\H@@footnotetext\H@@mpfootnotetext +}% +\let\ltx@footnote@pop\@empty +\def\@xfloat@anchored#1[#2]{% + \def\@captype{#1}% + \begin@float@pagebreak + \let\end@float\end@float@anchored + \let\end@dblfloat\end@float@anchored + \hsize\columnwidth + \@parboxrestore + \@floatboxreset + \minipagefootnote@init +}% +\def\end@float@anchored{% + \minipagefootnote@here + \par\vskip\z@skip + \par + \end@float@pagebreak +}% +\def\begin@float@pagebreak{\par\addvspace\intextsep}% +\def\end@float@pagebreak{\par\addvspace\intextsep}% +\def\@mpmakefntext#1{% + \parindent=1em + \noindent + \hb@xt@1em{\hss\@makefnmark}% + #1% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Writing floats out to a file}% +% +% \begin{macro}{\do@if@floats} +% \changes{4.1b}{2008/08/12}{No need to protect against undefined \cs{float@sw}} +% The procedure \cmd\do@if@floats\ should be executed at +% \cmd\class@documenthook\ time: it arranges to write out +% the floats of the given class to a temporary file, to be +% read back later (deferred floats), +% given that \cmd\floats@sw\ is false. +% Note that, to protect against the Boolean being undefined +% at this late hour, we default it globally to true. +% \begin{macrocode} +\def\do@if@floats#1#2{% + \floats@sw{}{% +% \end{macrocode} +% Open the stream to save out the document's floats of this class. +% \begin{macrocode} + \expandafter\newwrite + \csname#1write\endcsname + \expandafter\def + \csname#1@stream\endcsname{\jobname#2}% + \expandafter\immediate + \expandafter\openout + \csname#1write\endcsname + \csname#1@stream\endcsname\relax +% \end{macrocode} +% Swap environments. +% If the class writer has defined, e.g., \env{figure@write}, +% then we use this as the procedure to execute for writing +% the float out to the external stream. +% Otherwise, the replacement of \cmd\@float\ by \cmd\write@float\ +% should do the right thing for float environments defined +% in the simple way of \classname{classes.dtx}. +% \begin{macrocode} + \@ifxundefined\@float@LaTeX{% + \let\@float@LaTeX\@float + \let\@dblfloat@LaTeX\@dblfloat + \let\@float\write@float + \let\@dblfloat\write@floats + }{}% + \let@environment{#1@float}{#1}% + \let@environment{#1@floats}{#1*}% + \@ifxundefined@cs{#1@write}{}{% + \let@environment{#1}{#1@write}% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\print@float} +% The procedure \cmd\print@float\ prints out the +% deferred floats. +% \changes{4.0b}{1999/06/20}{only execute if there really were floats of the given type} +% \changes{4.0c}{1999/11/13}{*-form mandates pagebreak at each float; only print section head if there is something there.} +% \changes{4.0d}{2000/05/23}{Allow things to break over pages by setting array@default.} +% \changes{4.1b}{2008/08/12}{If class option \classoption{lengthcheck} is in effect, log the height of this float class.} +% +% Here, we make use of the \cmd\floats@sw\ Boolean to select +% the non-floating type of processing. +% \begin{macrocode} +\def\triggerpar{\leavevmode\@@par}% +\def\oneapage{\def\begin@float@pagebreak{\newpage}\def\end@float@pagebreak{\newpage}}% +\def\print@float#1#2{% + \lengthcheck@sw{% + \total@float{#1}% + }{}% + \@ifxundefined@cs{#1write}{}{% + \begingroup + \@booleanfalse\floats@sw + #2% + \raggedbottom + \def\array@default{v}% floats must + \let\@float\@float@LaTeX + \let\@dblfloat\@dblfloat@LaTeX + \let\trigger@float@par\triggerpar + \let@environment{#1}{#1@float}% + \let@environment{#1*}{#1@floats}% + \expandafter\prepdef\csname#1\endcsname{\trigger@float@par}% + \expandafter\prepdef\csname#1*\endcsname{\trigger@float@par}% + \@namedef{fps@#1}{h!}% + \expandafter\immediate + \expandafter\closeout + \csname#1write\endcsname + \everypar{% + \global\let\trigger@float@par\relax + \global\everypar{}\setbox\z@\lastbox + \@ifxundefined@cs{#1sname}{}{% + \begin@float@pagebreak + \expandafter\section + \expandafter*% + \expandafter{% + \csname#1sname\endcsname + }% + }% + }% + \input{\csname#1@stream\endcsname}% + \endgroup + \global\expandafter\let\csname#1write\endcsname\relax + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tally@float} +% \begin{macro}{\total@float} +% \changes{4.1b}{2008/08/12}{Tally and log the height of a float class} +% If we are tallying column inches, \cmd\tally@float\ tallies a contribution to \cmd\ftype@\ \cmd\@captype, +% depending upon the width of \cmd\@currbox. +% In effect, each float class is tallied in two sections, one for narrow, one for wide floats. +% +% If statistics are wanted, \cmd\total@float\ logs the tally for the given float class. +% \changes{4.1f}{2009/07/10}{(AO, 518) Tally register overflow when locument is long} +% The quantity \cmd\@twopowerfourteen\ is $2^{14}$, \cmd\@twopowertwo\ is $2^{2}$. +% \begin{macrocode} +\chardef\@xvi=16\relax +\mathchardef\@twopowerfourteen="4000 +\mathchardef\@twopowertwo="4 +\def\tally@float#1{% + \begingroup +% \end{macrocode} +% We strip all but the least significant 5 bits from \cmd\count\ \cmd\@currbox, +% and put them into \cmd\@tempcnta. We then subtract 16 from \cmd\count\ \cmd\@currbox +% (unless this would make it negative), effectively reversing the process +% carried out in \cmd\@float. +% \begin{macrocode} + \@tempcnta\count\@currbox + \divide\@tempcnta\@xxxii + \multiply\@tempcnta\@xxxii + \advance\count\@currbox-\@tempcnta + \divide\@tempcnta\@xxxii + \@ifnum{\count\@currbox>\@xvi}{% + \advance\count\@currbox-\@xvi\@booleantrue\@temp@sw + }{% + \@booleanfalse\@temp@sw + }% +% \end{macrocode} +% If so desired, we log the characteristics of this float object: +% float class and float placement parameters, height, depth, and width. +% \begin{macrocode} + \show@box@size@sw{% + \class@info{Float #1 + (\the\@tempcnta)[\@temp@sw{16+}{}\the\count\@currbox]^^J% + (\the\ht\@currbox+\the\dp\@currbox)X\the\wd\@currbox + }% + }{}% + \endgroup +% \end{macrocode} +% Here we tally the height of this float object. +% \begin{macrocode} + \expandafter\let + \expandafter\@tempa + \csname fbox@\csname ftype@#1\endcsname\endcsname + \@ifnotrelax\@tempa{% + \@ifhbox\@tempa{% + \setbox\@tempboxa\vbox{\unvcopy\@currbox\hrule}% + \dimen@\ht\@tempboxa + \divide\dimen@\@twopowerfourteen + \@ifdim{\wd\@tempboxa<\textwidth}{% + \advance\dimen@\ht\@tempa + \global\ht\@tempa\dimen@ + }{% + \advance\dimen@\dp\@tempa + \global\dp\@tempa\dimen@ + }% + }{}% + }{}% +}% +\def\total@float#1{% + \expandafter\let + \expandafter\@tempa + \csname fbox@\csname ftype@#1\endcsname\endcsname + \@ifnotrelax\@tempa{% + \@ifhbox\@tempa{% + \@tempdima\the\ht\@tempa\divide\@tempdima\@twopowertwo\@tempcnta\@tempdima + \@tempdimb\the\dp\@tempa\divide\@tempdimb\@twopowertwo\@tempcntb\@tempdimb + \class@info{Total #1: Column(\the\@tempcnta pt), Page(\the\@tempcnta pt)}% + }{}% + }{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\write@float} +% \begin{macro}{\write@floats} +% \begin{macro}{\write@@float} +% Handles the case where the name of the float is the same as +% that of the stream. Note that +% \env{longtable} does \emph{not} fit this case. +% Note also: \cmd\write@float\ is \emph{not} a user-level environment, +% therefore it is properly not defined with \cmd\newenvironment. +% \begin{macrocode} +\def\write@float#1{\write@@float{#1}{#1}}% +\def\endwrite@float{\@Esphack}% +\def\write@floats#1{\write@@float{#1*}{#1}}% +\def\endwrite@floats{\@Esphack}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\write@@float} +% \changes{4.0b}{1999/06/20}{AO: Fixed spurious \texttt{CR} and (return) characters in output file. Also, if the document did not have the \cs{end}\texttt{figure} on a line of its own, the macro wouldn't work. Fixed.} +% \begin{macrocode} +\def\write@@float#1#2{% + \ifhmode + \@bsphack + \fi + \chardef\@tempc\csname#2write\endcsname + \toks@{\begin{#1}}% + \def\@tempb{#1}% + \expandafter\let\csname end#1\endcsname\endwrite@float + \catcode`\^^M\active + \@makeother\{\@makeother\}\@makeother\% + \write@floatline +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\write@floatline} +% \begin{macro}{\@write@floatline} +% \begin{macro}{\float@end@tag} +% The procedure \cmd\write@floatline\ only parses; +% it passes its result to \cmd\@write@floatline, which +% writes the line to output, then tests the line +% for the \cmd\end\arg{float} tokens with +% aid of the \cmd\float@end@tag\ procedure. +% \begin{macrocode} +\begingroup + \catcode`\[\the\catcode`\{\catcode`\]\the\catcode`\}\@makeother\{\@makeother\}% + \gdef\float@end@tag#1\end{#2}#3\@nul[% + \def\@tempa[#2]% + \@ifx[\@tempa\@tempb][\end[#2]][\write@floatline]% + ]% + \obeylines% + \gdef\write@floatline#1^^M[% + \begingroup% + \newlinechar`\^^M% + \toks@\expandafter[\the\toks@#1]\immediate\write\@tempc[\the\toks@]% + \endgroup% + \toks@[]% + \float@end@tag#1\end{}\@nul% + ]% +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \subsection{Counters} +% The following definitions override those of the \LaTeX\ kernel, +% providing for a greater range of inputs. +% \begin{macrocode} +\def\@alph#1{\ifcase#1\or a\or b\or c\or d\else\@ialph{#1}\fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\@ialph#1{\ifcase#1\or \or \or \or \or e\or f\or g\or h\or i\or j\or + k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or + y\or z\or aa\or bb\or cc\or dd\or ee\or ff\or gg\or hh\or ii\or jj\or + kk\or ll\or mm\or nn\or oo\or pp\or qq\or rr\or ss\or tt\or uu\or + vv\or ww\or xx\or yy\or zz\else\@ctrerr\fi} +% \end{macrocode} +% +% +% \subsection{Customization of Sections}% +% +% Patch the standard \LaTeX\ sectioning procedure to: +%\begin{itemize} +%\item +% Allow a sectioning command to trigger the title page, or more generally +% to recognize that it is the first object in the document, +% so we headpatch \cmd\@startsection. +% +%\item +% Allow a tail command in |#6| to uppercase the title, so we retain +% DPC's braces. +% +%\item +% Allow each type of sectioning command to format its number differently, +% so we generalize \cmd\@seccntformat. +% +%\item +% Allow each type of sectioning command to format its argument differently, +% so we generalize \cmd\@hangfrom. +% +%\item +% Allow the starred form of the command to +% mark (the running head) and +% make an entry in the TOC, +% so we put \cmd\@ssect\ on the same footing as \cmd\@sect. +% +% Note that the tokens passed to the TOC now are \emph{not} +% the optional argument of the command, but the required. +% This means that the user can no longer use the former +% to put variant content in to the TOC as the Manual says. +% +% Instead, the optional argument is used to put an alternative +% title into the running headers, a better choice. +% +%\end{itemize} +% +% \begin{macro}{\@startsection} +% Patch a head hook into the basic sectioning command. +% Treat \cmd\@sect\ and \cmd\@ssect\ on an equal footing: +% now their pattern parts are identical. +% \begin{macrocode} +\def\@startsection#1#2#3#4#5#6{% + \@startsection@hook + \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 + \@ifstar + {\@dblarg{\@ssect@ltx{#1}{#2}{#3}{#4}{#5}{#6}}}% + {\@dblarg{\@sect@ltx {#1}{#2}{#3}{#4}{#5}{#6}}}% +}% +\def\@startsection@hook{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@sect} +% When defining \cmd\@svsec, do not expand \cmd\@seccntformat. +% Put brace characters back where they were before David Carlisle got at them +% (i.e., as if \cmd\@hangfrom\ had two arguments). +% Protect the mark mechanism from an undefined meaning. +% Pass |#8| to the TOC instead of |#7|. +% Remove \cmd\relax\ from the replacement part of \cmd\@svsec. +% +% The procedure \cmd\@hangfrom\ and \cmd\@runin@to\ can +% be used to process the argument of the head. +% The head can define, e.g., \cmd\@hangfrom@section, to +% do its own processing. +% +% In using \cmd\H@refstepcounter\ in place of \cmd\refstepcounter\ we rely on +% either loading before any package that patches the latter, or +% the convention that the former is the original \LaTeX\ procedure. +% +% \begin{macrocode} +\class@info{Repairing broken LateX \string\@sect}% +\def\@sect@ltx#1#2#3#4#5#6[#7]#8{% + \@ifnum{#2>\c@secnumdepth}{% + \def\H@svsec{\phantomsection}% + \let\@svsec\@empty + }{% + \H@refstepcounter{#1}% + \def\H@svsec{% + \phantomsection + }% + \protected@edef\@svsec{{#1}}% + \@ifundefined{@#1cntformat}{% + \prepdef\@svsec\@seccntformat + }{% + \expandafter\prepdef + \expandafter\@svsec + \csname @#1cntformat\endcsname + }% + }% + \@tempskipa #5\relax + \@ifdim{\@tempskipa>\z@}{% + \begingroup + \interlinepenalty \@M + #6{% + \@ifundefined{@hangfrom@#1}{\@hang@from}{\csname @hangfrom@#1\endcsname}% + {\hskip#3\relax\H@svsec}{\@svsec}{#8}% + }% + \@@par + \endgroup + \@ifundefined{#1mark}{\@gobble}{\csname #1mark\endcsname}{#7}% + \addcontentsline{toc}{#1}{% + \@ifnum{#2>\c@secnumdepth}{% + \protect\numberline{}% + }{% + \protect\numberline{\csname the#1\endcsname}% + }% + #8}% + }{% + \def\@svsechd{% + #6{% + \@ifundefined{@runin@to@#1}{\@runin@to}{\csname @runin@to@#1\endcsname}% + {\hskip#3\relax\H@svsec}{\@svsec}{#8}% + }% + \@ifundefined{#1mark}{\@gobble}{\csname #1mark\endcsname}{#7}% + \addcontentsline{toc}{#1}{% + \@ifnum{#2>\c@secnumdepth}{% + \protect\numberline{}% + }{% + \protect\numberline{\csname the#1\endcsname}% + }% + #8}% + }% + }% + \@xsect{#5}% +}% +\def\@hang@from#1#2#3{\@hangfrom{#1#2}#3}% +\def\@runin@to #1#2#3{#1#2#3}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ssect} +% Put brace characters back where they were before David Carlisle got at them +% (as if \cmd\@hangfrom\ has two arguments). +% Possibly set a mark. +% Make a TOC entry. +% +% Note that, for compatibility with the \classname{hyperref} package, we +% need to provide the interface required by that package +% (actually required by \file{pdfmark.def} and \file{nameref.sty}), +% namely +% the definition of \cmd\@currentlabelname\ (but now removed), +% the insertion of the procedure \cmd\Sectionformat\ (but why is this needed?), and +% the call to \cmd\phantomsection\ (which must precede the call to \cmd\addcontentsline). +% We also have to sidestep the patch to \cmd\@ssect\ in that same file, therefore +% we use a different control sequence name in the call from \cmd\@startsection. +% \changes{4.0c}{1999/11/13}{(AO, 116) Hyperref compatibility} +% \changes{4.0f}{2001/07/13}{(AO, 404) Hyperref compatibility} +% \begin{macrocode} +\def\@ssect@ltx#1#2#3#4#5#6[#7]#8{% +% \end{macrocode} +% Removed |\def\@currentlabelname{#8}| +% \begin{macrocode} + \def\H@svsec{\phantomsection}% + \@tempskipa #5\relax + \@ifdim{\@tempskipa>\z@}{% + \begingroup + \interlinepenalty \@M + #6{% + \@ifundefined{@hangfroms@#1}{\@hang@froms}{\csname @hangfroms@#1\endcsname}% +% \end{macrocode} +% Removed |{\hskip#3\relax\H@svsec}{\Sectionformat{#8}{#1}}| +% \begin{macrocode} + {\hskip#3\relax\H@svsec}{#8}% + }% + \@@par + \endgroup + \@ifundefined{#1smark}{\@gobble}{\csname #1smark\endcsname}{#7}% + \addcontentsline{toc}{#1}{\protect\numberline{}#8}% + }{% + \def\@svsechd{% + #6{% + \@ifundefined{@runin@tos@#1}{\@runin@tos}{\csname @runin@tos@#1\endcsname}% +% \end{macrocode} +% Removed |{\hskip#3\relax\H@svsec}{\Sectionformat{#8}{#1}}| +% \begin{macrocode} + {\hskip#3\relax\H@svsec}{#8}% + }% + \@ifundefined{#1smark}{\@gobble}{\csname #1smark\endcsname}{#7}% + \addcontentsline{toc}{#1}{\protect\numberline{}#8}% + }% + }% + \@xsect{#5}% +}% +\def\@hang@froms#1#2{#1#2}% +\def\@runin@tos #1#2{#1#2}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\init@hyperref} +% \changes{4.1b}{2008/08/12}{Acquire \classname{hyperref} savoire} +% Document classes that incorporate this package will be \classname{hyperref}-savvy. +% (To accomplish this, we ensure that \cmd\hyperanchor\ and \cmd\hyper@last\ are both defined.) +% Being \classname{hyperref}-savvy levels some requirements on us, but the benefits are many. +% +% One is that the TOC will not get amnesia and require a full set of three typesetting runs before its formatting is stable. +% Instead, only two runs are required: the first updates the auxiliary file, the second the TOC. +% However, the formatting of the document does not change. +% +% Another aspect of being \classname{hyperref}-savvy is that the syntax of commands in the \file{.aux} file will not change +% if \classname{hyperref} is turned on or off. +% +% Note that \cmd\hyper@anchorstart\ and \cmd\hyper@anchorend\ constitute the programming interface +% for a hypertext anchor (the target of a hypertext link); \cmd\hyper@linkstart\ and \cmd\hyper@linkend\ +% are the interface for a hypertext link. +% \begin{macrocode} +\def\init@hyperref{% + \providecommand\phantomsection{}% + \providecommand\hyper@makecurrent[1]{}% + \providecommand\Hy@raisedlink[1]{}% + \providecommand\hyper@anchorstart[1]{}% + \providecommand\hyper@anchorend{}% + \providecommand\hyper@linkstart[2]{}% + \providecommand\hyper@linkend{}% + \providecommand\@currentHref{}% +}% +\let\H@refstepcounter\refstepcounter +\appdef\document@inithook{% + \init@hyperref +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sec@upcase} +% Upper case for sections (optional upper case items). These are +% created so that some headings can be toggled between mixed case and +% upper case readily. +% Headings that might be changed can be wrapped in the style file in +% \cmd\sec@upcase\arg{text} constructs; +% the expansion of \cmd\sec@upcase\ is +% controlled here. It is \cmd\relax\ by default (mixed case heads), and +% can easily be changed to \cmd\uppercase\ if desired. +% If mixed-case headings are wanted by the editor, authors {\em must} +% supply mixed case text, although this is what authors should be doing +% anyway. +% (Mixed can be converted to upper, +% but the reverse transformation cannot be automated.) +% +% The following setting gives the \LaTeX\ default. +% \begin{macrocode} +\def\sec@upcase#1{\relax{#1}}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Patch the \env{tabular} and \env{array} Environments} +% +% \begin{macro}{\endtabular} +% \begin{macro}{\endarray} +% \changes{4.1b}{2008/08/12}{Patch the array package even later: after all package patches go in.} +% We headpatch the begin processing and tailpatch the end processing +% of the \env{tabular} and \env{array} environments. +% A document class can define these hooks as needed. +% +% We proceed with care to make further patches to +% support tabulars that break over pages. +% Our patches will not necessarily be effective for +% other packages that replace the \LaTeX\ \env{array} and \env{tabular} +% environments. I know of none that do so. +% \begin{macrocode} +\appdef\document@inithook{% + \@ifpackageloaded{array}{\switch@array}{\switch@tabular}% + \prepdef\endtabular{\endtabular@hook}% + \@provide\endtabular@hook{}% + \prepdef\endarray{\endarray@hook}% + \@provide\endarray@hook{}% + \providecommand\array@hook{}% +% \end{macrocode} +% Install, effectively, a head patch to \cmd\tabular. +% In order to avoid interference from, e.g., the \classname{array} package, +% we must perform this patch only \emph{after} packages load. +% \changes{4.0c}{1999/11/13}{(AO, 130) Interference from array package} +% \begin{macrocode} + \prepdef\@tabular{\tabular@hook}% + \@provide\tabular@hook{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\switch@tabular} +% \begin{macro}{\switch@array} +% The two procedures \cmd\switch@tabular\ and \cmd\switch@array\ +% apply needed patches to the various tabular procedures, +% the former applying to the \LaTeX\ kernel, the latter to the +% required \classname{array} package (and to the number of other +% required packages that load it). +% +% \begin{macrocode} +\def\switch@tabular{% + \let\@array@sw\@array@sw@array + \@ifx{\@array\@array@LaTeX}{% + \@ifx{\multicolumn\multicolumn@LaTeX}{% + \@ifx{\@tabular\@tabular@LaTeX}{% + \@ifx{\@tabarray\@tabarray@LaTeX}{% + \@ifx{\array\array@LaTeX}{% + \@ifx{\endarray\endarray@LaTeX}{% + \@ifx{\endtabular\endtabular@LaTeX}{% + \@ifx{\@mkpream\@mkpream@LaTeX}{% + \@ifx{\@addamp\@addamp@LaTeX}{% + \@ifx{\@arrayacol\@arrayacol@LaTeX}{% + \@ifx{\@tabacol\@tabacol@LaTeX}{% + \@ifx{\@arrayclassz\@arrayclassz@LaTeX}{% + \@ifx{\@tabclassiv\@tabclassiv@LaTeX}{% + \@ifx{\@arrayclassiv\@arrayclassiv@LaTeX}{% + \@ifx{\@tabclassz\@tabclassz@LaTeX}{% + \@ifx{\@classv\@classv@LaTeX}{% + \@ifx{\hline\hline@LaTeX}{% + \@ifx{\@tabularcr\@tabularcr@LaTeX}{% + \@ifx{\@xtabularcr\@xtabularcr@LaTeX}{% + \@ifx{\@xargarraycr\@xargarraycr@LaTeX}{% + \@ifx{\@yargarraycr\@yargarraycr@LaTeX}{% + \true@sw + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + {% + \class@info{Patching LaTeX tabular.}% + }{% + \class@info{Unrecognized LaTeX tabular. Please update this document class! (Proceeding with fingers crossed.)}% + }% + \let\@array\@array@ltx + \let\multicolumn\multicolumn@ltx + \let\@tabular\@tabular@ltx + \let\@tabarray\@tabarray@ltx + \let\array\array@ltx + \let\endarray\endarray@ltx + \let\endtabular\endtabular@ltx + \let\@mkpream\@mkpream@ltx + \let\@addamp\@addamp@ltx + \let\@arrayacol\@arrayacol@ltx + \let\@tabacol\@tabacol@ltx + \let\@arrayclassz\@arrayclassz@ltx + \let\@tabclassiv\@tabclassiv@ltx + \let\@arrayclassiv\@arrayclassiv@ltx + \let\@tabclassz\@tabclassz@ltx + \let\@classv\@classv@ltx + \let\hline\hline@ltx + \let\@tabularcr\@tabularcr@ltx + \let\@xtabularcr\@xtabularcr@ltx + \let\@xargarraycr\@xargarraycr@ltx + \let\@yargarraycr\@yargarraycr@ltx +}% +% \end{macrocode} +% \changes{4.1b}{2008/08/12}{(AO, 505) Try to accommodate \classname{colortbl}.} +% \begin{macrocode} +\def\switch@array{% + \@ifpackageloaded{colortbl}{\let\switch@array@info\colortbl@message}{\let\switch@array@info\array@message}% + \let\@array@sw\@array@sw@LaTeX + \@ifx{\@array\@array@array}{% + \@ifx{\@tabular\@tabular@array}{% + \@ifx{\@tabarray\@tabarray@array}{% + \@ifx{\array\array@array}{% + \@ifx{\endarray\endarray@array}{% + \@ifx{\endtabular\endtabular@array}{% + \@ifx{\@mkpream\@mkpream@array}{% + \@ifx{\@classx\@classx@array}{% + \@ifx{\insert@column\insert@column@array}{% + \@ifx{\@arraycr\@arraycr@array}{% + \@ifx{\@xarraycr\@xarraycr@array}{% + \@ifx{\@xargarraycr\@xargarraycr@array}{% + \@ifx{\@yargarraycr\@yargarraycr@array}{% + \true@sw + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }% + }{% + \false@sw + }{% + \class@info{Patching array package.}% + }{% + \switch@array@info + }% + \let\@array \@array@array@new + \let\@@array \@array % Cosi fan tutti + \let\@tabular \@tabular@array@new + \let\@tabarray \@tabarray@array@new + \let\array \array@array@new + \let\endarray \endarray@array@new + \let\endtabular\endtabular@array@new + \let\@mkpream \@mkpream@array@new + \let\@classx \@classx@array@new + \let\@arrayacol\@arrayacol@ltx + \let\@tabacol \@tabacol@ltx + \let\insert@column\insert@column@array@new + \expandafter\let\csname endtabular*\endcsname\endtabular % Cosi fan tutti + \let\@arraycr \@arraycr@new + \let\@xarraycr \@xarraycr@new + \let\@xargarraycr\@xargarraycr@new + \let\@yargarraycr\@yargarraycr@new +}% +\def\array@message{% + \class@info{Unrecognized array package. Please update this document class! (Proceeding with fingers crossed.)}% +}% +\def\colortbl@message{% + \class@info{colortbl package is loaded. (Proceeding with fingers crossed.)}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@array@sw} +% The Boolean \cmd\@array@sw\ must be different depending on +% whether the \classname{array} package is loaded. +% \begin{macrocode} +\def\@array@sw@LaTeX{\@ifx{\\\@tabularcr}}% +\def\@array@sw@array{\@ifx{\d@llarbegin\begingroup}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabular} +% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.} +% We provide the old versions of \cmd\@tabular\ along with the respective new versions. +% The change here is to avoid committing to LR mode. That will be done later (as late as possible, naturally). +% +% Compatibility note: I had done \cmd\let\ \cmd\col@sep\ \cmd\@undefined\ here, but +% this was not compatible with \classname{colortbl}. I have removed that statement. +% \begin{macrocode} +\def\@tabular@LaTeX{% + \leavevmode + \hbox\bgroup$% + \let\@acol\@tabacol + \let\@classz\@tabclassz + \let\@classiv\@tabclassiv + \let\\\@tabularcr + \@tabarray +}% +\def\@tabular@ltx{% + \let\@acoll\@tabacoll + \let\@acolr\@tabacolr + \let\@acol\@tabacol + \let\@classz\@tabclassz + \let\@classiv\@tabclassiv + \let\\\@tabularcr + \@tabarray +}% +\def\@tabular@array{% + \leavevmode + \hbox\bgroup$% + \col@sep\tabcolsep + \let\d@llarbegin\begingroup + \let\d@llarend\endgroup + \@tabarray +}% +\def\@tabular@array@new{% + \let\@acoll\@tabacoll + \let\@acolr\@tabacolr + \let\@acol\@tabacol +% \end{macrocode} +% \let\col@sep\@undefined +% \begin{macrocode} + \let\d@llarbegin\begingroup + \let\d@llarend\endgroup + \@tabarray +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabarray} +% Here we provide old and new versions of the \cmd\@tabarray\ procedure. +% The change here is to parametrize the default vertical alignment, +% which is 'c' in standard \LaTeX. +% Under some circumstances, we want to change this to, say, 'v'. +% +% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.} +% FIXME: must decouple \env{array} and \env{tabular}. Done (it seems). +% +% Note on \classname{colortbl}: this package head-patches \cmd\@tabarray +% with its own command \cmd\CT@start, and tails onto \cmd\endarray\ with \cmd\CT@end. +% It fortuitously does the former at \cmd\AtBeginDocument\ time, and, fortuitously, +% we do not patch \cmd\endarray, which it overwrites. +% \begin{macrocode} +\def\@tabarray@LaTeX{% + \m@th\@ifnextchar[\@array{\@array[c]}% +}% +\def\@tabarray@ltx{% + \m@th\@ifnextchar[\@array{\expandafter\@array\expandafter[\array@default]}% +}% +\def\@tabarray@array{% + \@ifnextchar[{\@@array}{\@@array[c]}% +}% +\def\@tabarray@array@new{% + \@ifnextchar[{\@@array}{\expandafter\@@array\expandafter[\array@default]}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabularcr} +% \begin{macro}{\@tbpen} +% \begin{macro}{\@tabularcr} +% \begin{macro}{\@xtabularcr} +% \begin{macro}{\@xargarraycr} +% \begin{macro}{\@yargarraycr} +% \begin{macro}{\@arraycr} +% \begin{macro}{\@xarraycr} +% We provide for the \cmd\\ command within \env{tabular} to provide control over page breaking, just the same as +% that of \env{eqnarray}. +% +% The count register \cmd\intertabularlinepenalty\ is similar to \cmd\interdisplaylinepenalty: it is the penalty +% associated with each row of a tabular. When it is set to \cmd\@M, the tabular will cleave together. +% +% The count register \cmd\@tbpen\ is similar to \cmd\@eqpen: it memorizes the penalty to use after the current tabular row. +% If the \cmd\\ command is in its star form, then \cmd\@eqpen\ is set to \cmd\@M. +% +% We append code to \cmd\samepage\ so that a tabular within its scope will cleave together. +% +% We keep the standard definition of \cmd\@tabularcr\ in \cmd\@tabularcr@LaTeX\ for reference, +% and provide a new definition that works like \cmd\@eqncr: it sets \cmd\@tbpen\ to \cmd\@M\ if the star was given. +% +% We also provide new versions of \cmd\@xtabularcr, \cmd\@xargarraycr, and \cmd\@yargarraycr, all of which invoke \cmd\@tbpen. +% +% The \cmd\switch@tabular\ procedure switches in the new definitions. +% \begin{macrocode} +\newcount\intertabularlinepenalty +\intertabularlinepenalty=100 +\newcount\@tbpen +\appdef\samepage{\intertabularlinepenalty\@M}% +\def\@tabularcr@LaTeX{{\ifnum 0=`}\fi \@ifstar \@xtabularcr \@xtabularcr}% +\def\@tabularcr@ltx{{\ifnum 0=`}\fi \@ifstar {\global \@tbpen \@M \@xtabularcr }{\global \@tbpen \intertabularlinepenalty \@xtabularcr }}% +\def\@xtabularcr@LaTeX{\@ifnextchar [\@argtabularcr {\ifnum 0=`{\fi }\cr }}% +\def\@xtabularcr@ltx{\@ifnextchar [\@argtabularcr {\ifnum 0=`{\fi }\cr \noalign {\penalty \@tbpen }}}% +\def\@xargarraycr@LaTeX#1{\@tempdima #1\advance \@tempdima \dp \@arstrutbox \vrule \@height \z@ \@depth \@tempdima \@width \z@ \cr}% +\def\@xargarraycr@ltx#1{\@tempdima #1\advance \@tempdima \dp \@arstrutbox \vrule \@height \z@ \@depth \@tempdima \@width \z@ \cr \noalign {\penalty \@tbpen }}% +\def\@yargarraycr@LaTeX#1{\cr \noalign {\vskip #1}}% +\def\@yargarraycr@ltx#1{\cr \noalign {\penalty \@tbpen \vskip #1}}% +% \end{macrocode} +% +% If the \classname{array} package has been loaded, we must alter the meanings of +% \cmd\@arraycr, \cmd\@xarraycr, \cmd\@xargarraycr, and \cmd\@yargarraycr. +% In this case, it is \cmd\switch@array\ that switches in the new definitions. +% \begin{macrocode} +\def\@arraycr@array{% + \relax + \iffalse{\fi\ifnum 0=`}\fi + \@ifstar \@xarraycr \@xarraycr +}% +\def\@arraycr@new{% + \relax + \iffalse{\fi\ifnum 0=`}\fi + \@ifstar {\global \@tbpen \@M \@xarraycr }{\global \@tbpen \intertabularlinepenalty \@xarraycr }% +}% +\def\@xarraycr@array{% + \@ifnextchar [%] + \@argarraycr {\ifnum 0=`{}\fi\cr}% +}% +\def\@xarraycr@new{% + \@ifnextchar [%] + \@argarraycr {\ifnum 0=`{}\fi\cr \noalign {\penalty \@tbpen }}% +}% +\def\@xargarraycr@array#1{% + \unskip + \@tempdima #1\advance\@tempdima \dp\@arstrutbox + \vrule \@depth\@tempdima \@width\z@ + \cr +}% +\def\@xargarraycr@new#1{% + \unskip + \@tempdima #1\advance\@tempdima \dp\@arstrutbox + \vrule \@depth\@tempdima \@width\z@ + \cr + \noalign {\penalty \@tbpen }% +}% +\def\@yargarraycr@array#1{% + \cr + \noalign{\vskip #1}% +}% +\def\@yargarraycr@new#1{% + \cr + \noalign{\penalty \@tbpen \vskip #1}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\array} +% We provide old and new versions of the \cmd\array\ procedure for both \LaTeX\ and the \classname{array} package. +% The change here is to accomodate the new procedures that will be called for the array boundaries, even +% though at present they are not special. +% A thought: here is where matrices can be readily accomodated. +% \begin{macrocode} +\def\array@LaTeX{% + \let\@acol\@arrayacol + \let\@classz\@arrayclassz + \let\@classiv\@arrayclassiv + \let\\\@arraycr + \let\@halignto\@empty + \@tabarray +}% +\def\array@ltx{% + \@ifmmode{}{\@badmath$}% + \let\@acoll\@arrayacol + \let\@acolr\@arrayacol + \let\@acol\@arrayacol + \let\@classz\@arrayclassz + \let\@classiv\@arrayclassiv + \let\\\@arraycr + \let\@halignto\@empty + \@tabarray +}% +\def\array@array{% + \col@sep\arraycolsep + \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\gdef\@halignto{}% + \@tabarray +} +\def\array@array@new{% + \@ifmmode{}{\@badmath$}% + \let\@acoll\@arrayacol + \let\@acolr\@arrayacol + \let\@acol\@arrayacol +% \end{macrocode} +% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.} +% Removed: \verb+\let\col@sep\@undefined+ +% \begin{macrocode} + \def\d@llarbegin{$}% + \let\d@llarend\d@llarbegin + \gdef\@halignto{}% + \@tabarray +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@array} +% Here we provide old and new versions of \cmd\@array. +% The change here is to provide a convenient, flexible, and extensible +% mechanism for new vertical alignment options. +% +% Instead of testing the optional argument with \cmd\if, we +% use a dispatcher based on \cmd\csname. +% +% We also refrain from using \cmd\ialign, which would set +% the \cmd\tabskip\ to the wrong value. +% +% Finally, the procedure to set the \cmd\@arstrutbox\ +% is broken out so that it can be patched. +% \begin{macrocode} +\def\@array@LaTeX[#1]#2{% + \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi + \bgroup + \setbox\@arstrutbox\hbox{% + \vrule \@height\arraystretch\ht\strutbox + \@depth\arraystretch \dp\strutbox + \@width\z@}% + \@mkpream{#2}% + \edef\@preamble{% + \ialign \noexpand\@halignto + \bgroup \@arstrut \@preamble \tabskip\z@skip \cr}% + \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox + \let\tabularnewline\\% + \let\par\@empty + \let\@sharp##% + \set@typeset@protect + \lineskip\z@skip\baselineskip\z@skip + \ifhmode \@preamerr\z@ \@@par\fi + \@preamble +}% +\def\@array@ltx[#1]#2{% + \@nameuse{@array@align@#1}% + \set@arstrutbox + \@mkpream{#2}% + \prepdef\@preamble{% + \tabskip\tabmid@skip + \@arstrut + }% + \appdef\@preamble{% + \tabskip\tabright@skip + \cr + \array@row@pre + }% +% \let\@startpbox\@@startpbox +% \let\@endpbox\@@endpbox + \let\tabularnewline\\% + \let\par\@empty + \let\@sharp##% + \set@typeset@protect + \lineskip\z@skip\baselineskip\z@skip + \tabskip\tableft@skip\relax + \ifhmode \@preamerr\z@ \@@par\fi + \everycr{}% + \expandafter\halign\expandafter\@halignto\expandafter\bgroup\@preamble +}% +% +\def\set@arstrutbox{% + \setbox\@arstrutbox\hbox{% + \vrule \@height\arraystretch\ht\strutbox + \@depth\arraystretch \dp\strutbox + \@width\z@ + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@array@array} +% +% \begin{macrocode} +\def\@array@array[#1]#2{% + \@tempdima \ht \strutbox + \advance \@tempdima by\extrarowheight + \setbox \@arstrutbox \hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \begingroup + \@mkpream{#2}% + \xdef\@preamble{\noexpand \ialign \@halignto + \bgroup \@arstrut \@preamble + \tabskip \z@ \cr}% + \endgroup + \@arrayleft + \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi + \bgroup + \let \@sharp ##\let \protect \relax + \lineskip \z@ + \baselineskip \z@ + \m@th + \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble +}% +\def\@array@array@new[#1]#2{% + \@tempdima\ht\strutbox + \advance\@tempdima by\extrarowheight + \setbox\@arstrutbox\hbox{% + \vrule \@height\arraystretch\@tempdima + \@depth \arraystretch\dp\strutbox + \@width \z@ + }% + \begingroup + \@mkpream{#2}% + \xdef\@preamble{\@preamble}% + \endgroup + \prepdef\@preamble{% + \tabskip\tabmid@skip + \@arstrut + }% + \appdef\@preamble{% + \tabskip\tabright@skip + \cr + \array@row@pre + }% + \@arrayleft + \@nameuse{@array@align@#1}% + \m@th + \let\\\@arraycr + \let\tabularnewline\\% + \let\par\@empty + \let\@sharp##% + \set@typeset@protect + \lineskip\z@\baselineskip\z@ + \tabskip\tableft@skip + \everycr{}% + \expandafter\halign\expandafter\@halignto\expandafter\bgroup\@preamble +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endarray} +% Here we provide old and new versions of \cmd\endarray. +% The change here is to use a single procedure to close +% out any array-like structure, namely \cmd\endarray@ltx. +% It merely closes out the \cmd\halign. +% \begin{macrocode} +\def\endarray@LaTeX{% + \crcr\egroup\egroup +}% +\def\endarray@ltx{% + \crcr\array@row@pst\egroup\egroup +}% +\def\endarray@array{% + \crcr \egroup \egroup \@arrayright \gdef\@preamble{}% +}% +\def\endarray@array@new{% + \crcr\array@row@pst\egroup\egroup % Same as \endarray@ltx + \@arrayright + \global\let\@preamble\@empty +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endtabular} +% +% \begin{macrocode} +\def\endtabular@LaTeX{% + \crcr\egroup\egroup $\egroup +}% +\def\endtabular@ltx{% + \endarray +}% +\def\endtabular@array{% + \endarray $\egroup +}% +\def\endtabular@array@new{% + \endarray +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{endtabular*} +% Here we provide a proper definition for the star-form of \enve{endtabular}. +% It is one of the enduring curiosities that the \LaTeX\ kernel continues to use +% dangerously and inappropriately ``optimized'' definitions for such commands. +% \begin{macrocode} +\@namedef{endtabular*}{\endtabular}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\multicolumn} +% +% \begin{macrocode} +\long\def\multicolumn@LaTeX#1#2#3{% + \multispan{#1}\begingroup + \@mkpream{#2}% + \def\@sharp{#3}\set@typeset@protect + \let\@startpbox\@@startpbox\let\@endpbox\@@endpbox + \@arstrut \@preamble\hbox{}\endgroup\ignorespaces +}% +\long\def\multicolumn@ltx#1#2#3{% + \multispan{#1}% + \begingroup + \@mkpream{#2}% + \def\@sharp{#3}% + \set@typeset@protect + %\let\@startpbox\@@startpbox\let\@endpbox\@@endpbox + \@arstrut + \@preamble + \hbox{}% + \endgroup + \ignorespaces +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@array@align@} +% \begin{macro}{\array@default} +% Here are the various procedures for the vertical alignment options. +% The change from standard \LaTeX\ is that we do not go into math mode +% in every case: only when required by \cmd\vcenter. +% Also, we use \cmd\aftergroup\ to close out the boxes and modes we have started. +% It requires only that each procedure issue exactly one unmatched \cmd\bgroup. +% +% We establish here the default vertical alignment. +% \begin{macrocode} +\def\@array@align@t{\leavevmode\vtop\bgroup}% +\def\@array@align@b{\leavevmode\vbox\bgroup}% +\def\@array@align@c{\leavevmode\@ifmmode{\vcenter\bgroup}{$\vcenter\bgroup\aftergroup$\aftergroup\relax}}% +\def\@array@align@v{% + \@ifmmode{% + \@badmath + \vcenter\bgroup + }{% + \@ifinner{% + $\vcenter\bgroup\aftergroup$ + }{% + \@@par\bgroup + }% + }% +}% +\def\array@default{c}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\array@row@pre} +% \begin{macro}{\array@row@pst} +% \begin{macro}{\array@row@rst} +% The procedure \cmd\array@row@rst\ reestablishes a default context for +% an alignment, so that they can be nested. +% Any environment or procedure that alters the way alignments are formatted +% must patch this procedure to restore from that alteration. +% To start things off, we equate \cmd\@array@align@v\ to \cmd\@array@align@c, +% because it does not make sense to do the former in any context other +% than the MVL or in a list that will be unboxed onto the MVL. +% \begin{macrocode} +\def\array@row@rst{% + \let\@array@align@v\@array@align@c +}% +\def\array@row@pre{}% +\def\array@row@pst{}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\toprule} +% \begin{macro}{\colrule} +% \begin{macro}{\botrule} +% Default definitions for \cmd\toprule, \cmd\colrule, \cmd\botrule +% \begin{macrocode} +\newcommand\toprule{\tab@rule{\column@font}{\column@fil}{\frstrut}}% +\newcommand\colrule{\unskip\lrstrut\\\tab@rule{\body@font}{}{\frstrut}}% +\newcommand\botrule{\unskip\lrstrut\\\noalign{\hline@rule}{}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\hline} +% \begin{macrocode} +\def\hline@LaTeX{% + \noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet + \reserved@a\@xhline +}% +\def\hline@ltx{% + \noalign{% + \ifnum0=`}\fi + \hline@rule + \futurelet\reserved@a\@xhline + % \noalign ended in \@xhline +}% +\def\@xhline@unneeded{% + \say\reserved@a + \ifx\reserved@a\hline + \vskip\doublerulesep + \vskip-\arrayrulewidth + \fi + \ifnum0=`{\fi}% +}% +\def\tab@rule#1#2#3{% + \crcr + \noalign{% + \hline@rule + \gdef\@arstrut@hook{% + \global\let\@arstrut@hook\@empty + #3% + }% + \gdef\cell@font{#1}% + \gdef\cell@fil{#2}% + }% +}% +\def\column@font{}% +\def\column@fil{}% +\def\body@font{}% +\def\cell@font{}% +\def\frstrut{}% +\def\lrstrut{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arstrut@hline} +% \begin{macro}{\@arstrut@org} +% \begin{macro}{\@arstrut@hook} +% \begin{macro}{\@arstrutbox@hline} +% \begin{macro}{\set@arstrutbox} +% \begin{macro}{\hline@rule} +% The procedure \cmd\@arstrut@hline\ is substantially the same as +% \cmd\@arstrut, except the strut copied in is \cmd\@arstrutbox@hline +% instead of \cmd\@arstrutbox. +% +% The procedure \cmd\@arstrut@hook\ is redefined in \cmd\tab@rule! +% +% The register \cmd\@arstrutbox@hline. +% +% We append to \cmd\set@arstrutbox\ the code necessary to set a strut following an \cmd\hline. +% +% The procedure \cmd\hline@rule\ lays down a rule, and changes the meaning of \cmd\@arstrut\ +% so that the next line will be correctly strutted. +% +% The \cmd\@arstrut@hline@clnc\ is a klootch, a magic number. +% \begin{macrocode} +\def\@arstrut@hline{% + \relax + \@ifmmode{\copy}{\unhcopy}\@arstrutbox@hline + \@arstrut@hook +}% +% +\let\@arstrut@org\@arstrut +\def\@arstrut@hook{% + \global\let\@arstrut\@arstrut@org +}% +% +\newbox\@arstrutbox@hline +\appdef\set@arstrutbox{% + \setbox\@arstrutbox@hline\hbox{% + \setbox\z@\hbox{$0^{0}_{}$}% + \dimen@\ht\z@\advance\dimen@\@arstrut@hline@clnc + \@ifdim{\dimen@<\arraystretch\ht\strutbox}{\dimen@=\arraystretch\ht\strutbox}{}% + \vrule \@height\dimen@ + \@depth\arraystretch \dp\strutbox + \@width\z@ + }% +}% +% +\def\hline@rule{% + \hrule \@height \arrayrulewidth + \global\let\@arstrut\@arstrut@hline +}% +\def\@arstrut@hline@clnc{2\p@}% % Klootch: magic number +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\tableft@skip} +% \begin{macrocode} +\def\tableft@skip{\z@skip}% +\def\tabmid@skip{\z@skip}%\@flushglue +\def\tabright@skip{\z@skip}% +\def\tableftsep{\tabcolsep}% +\def\tabmidsep{\tabcolsep}% +\def\tabrightsep{\tabcolsep}% +\def\cell@fil{}% +\def\pbox@hook{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arstrut} +% \begin{macrocode} +\appdef\@arstrut{\@arstrut@hook}% +\let\@arstrut@hook\@empty +\def\@addtopreamble{\appdef\@preamble}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@mkpream} +% \begin{macrocode} +\def\@mkpream@LaTeX#1{% + \@firstamptrue\@lastchclass6 + \let\@preamble\@empty + \let\protect\@unexpandable@protect + \let\@sharp\relax + \let\@startpbox\relax\let\@endpbox\relax + \@expast{#1}% + \expandafter\@tfor \expandafter + \@nextchar \expandafter:\expandafter=\reserved@a\do + {\@testpach\@nextchar + \ifcase \@chclass \@classz \or \@classi \or \@classii \or \@classiii + \or \@classiv \or\@classv \fi\@lastchclass\@chclass}% + \ifcase \@lastchclass \@acol + \or \or \@preamerr \@ne\or \@preamerr \tw@\or \or \@acol \fi +}% +\def\@mkpream@ltx#1{% + \@firstamptrue + \@lastchclass6 + \let\@preamble\@empty + \let\protect\@unexpandable@protect + \let\@sharp\relax +%\let\@startpbox\relax\let\@endpbox\relax + \@expast{#1}% + \expandafter\@tfor\expandafter\@nextchar\expandafter:\expandafter=\reserved@a + \do{% + \expandafter\@testpach\expandafter{\@nextchar}% + \ifcase\@chclass + \@classz + \or + \@classi + \or + \@classii + \or + \@classiii + \or + \@classiv + \or + \@classv + \fi + \@lastchclass\@chclass + }% + \ifcase\@lastchclass + \@acolr % right-hand column + \or + \or + \@preamerr\@ne + \or + \@preamerr\tw@ + \or + \or + \@acolr % right-hand column + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\insert@column} +% \begin{macrocode} +\def\insert@column@array{% + \the@toks \the \@tempcnta + \ignorespaces \@sharp \unskip + \the@toks \the \count@ \relax +}% +\def\insert@column@array@new{% + \the@toks\the\@tempcnta + \array@row@rst\cell@font + \ignorespaces\@sharp\unskip + \the@toks\the\count@ + \relax +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@mkpream@relax} +% The procedure \cmd\@mkpream@relax\ participates in a strange and wonderful +% method of binding the alignment procedure---but only certain parts thereof. +% +% Here is how it works: in \LaTeX, the \classname{array} package, and in the +% \classname{longtable} package alike, there is a need to create an alignment +% preamble (using \cmd\@mkpream) for use by the upcoming \cmd\halign. +% Then, in both \classname{array} and \classname{longtable}, \TeX's \cmd\edef\ +% is used to `compile in place' that alignment preamble. +% +% In the case of \classname{array}, +% the operation is done in order to pre-expand the use of \texttt{*}; +% in \classname{longtable}, it is to set the widths of the columns. +% +% Now, during this \cmd\edef, certain control sequence names must \emph{not} +% be expanded, and those are robustified by \cmd\@mkpream@relax. +% +% \begin{macrocode} +\def\@mkpream@relax{% + \let\tableftsep \relax + \let\tabmidsep \relax + \let\tabrightsep \relax + \let\array@row@rst\relax + \let\cell@font \relax + \let\@startpbox \relax +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@mkpream} +% We insert \cmd\@mkpream@relax\ at the head of the procedure. +% The robustifying of \cmd\@startpbox\ and \cmd\@endpbox\ is taken over by this mechanism. +% We also invoke \cmd\@acolr\ instead of \cmd\@acol\ when a right-hand column is at hand. +% +% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.} +% Note on \classname{colortbl}: this package head-patches \cmd\@mkpream\ to robustify +% a number of its commands during the construction of the alignment preamble. +% The best we can do is to supplement the \cmd\@mkpream@relax\ procedure to perform this action. +% \begin{macrocode} +\def\@mkpream@array#1{% + \gdef\@preamble{}\@lastchclass 4 \@firstamptrue + \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax + \@temptokena{#1}\@tempswatrue + \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}% + \count@\m@ne + \let\the@toks\relax + \prepnext@tok + \expandafter \@tfor \expandafter \@nextchar + \expandafter :\expandafter =\the\@temptokena \do + {\@testpach + \ifcase \@chclass \@classz \or \@classi \or \@classii + \or \save@decl \or \or \@classv \or \@classvi + \or \@classvii \or \@classviii + \or \@classx + \or \@classx \fi + \@lastchclass\@chclass}% + \ifcase\@lastchclass + \@acol \or + \or + \@acol \or + \@preamerr \thr@@ \or + \@preamerr \tw@ \@addtopreamble\@sharp \or + \or + \else \@preamerr \@ne \fi + \def\the@toks{\the\toks}% +}% +\def\@mkpream@array@new#1{% + \gdef\@preamble{}% + \@lastchclass\f@ur + \@firstamptrue + \let\@sharp\relax + \@mkpream@relax +%\let\@startpbox\relax\let\@endpbox\relax + \@temptokena{#1}\@tempswatrue + \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}% + \count@\m@ne + \let\the@toks\relax + \prepnext@tok + \expandafter\@tfor\expandafter\@nextchar\expandafter:\expandafter=\the\@temptokena + \do{% + \@testpach + \ifcase\@chclass + \@classz + \or + \@classi + \or + \@classii + \or + \save@decl + \or + \or + \@classv + \or + \@classvi + \or + \@classvii + \or + \@classviii + \or + \@classx + \or + \@classx + \fi + \@lastchclass\@chclass + }% + \ifcase\@lastchclass + \@acolr % right-hand column + \or + \or + \@acolr % right-hand column + \or + \@preamerr\thr@@ + \or + \@preamerr\tw@\@addtopreamble\@sharp + \or + \or + \else + \@preamerr\@ne + \fi + \def\the@toks{\the\toks}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@mkpream@relax} +% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.} +% David P. Carlisle's \classname{colortbl} package headpatches \cmd\@mkpream\ in place +% during package loading, so it does not know whom it is working on. +% Let us try to accomodate this package by doing what it would have liked to have done. +% +% Note: it would be far better to break out this mechanism in the \classname{array} package. +% \begin{macrocode} +\appdef\@mkpream@relax{% + \let\CT@setup \relax + \let\CT@color \relax + \let\CT@do@color \relax + \let\color \relax + \let\CT@column@color\relax + \let\CT@row@color \relax + \let\CT@cell@color \relax +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addamp} +% \begin{macrocode} +\def\@addamp@LaTeX{% + \if@firstamp\@firstampfalse\else\edef\@preamble{\@preamble &}\fi +}% +\def\@addamp@ltx{% + \if@firstamp\@firstampfalse\else\@addtopreamble{&}\fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arrayacol} +% \begin{macrocode} +\def\@arrayacol@LaTeX{% + \edef\@preamble{\@preamble \hskip \arraycolsep}% +}% +\def\@arrayacol@ltx{% + \@addtopreamble{\hskip\arraycolsep}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabacol} +% \begin{macrocode} +\def\@tabacoll{% + \@addtopreamble{\hskip\tableftsep\relax}% +}% +\def\@tabacol@LaTeX{% + \edef\@preamble{\@preamble \hskip \tabcolsep}% +}% +\def\@tabacol@ltx{% + \@addtopreamble{\hskip\tabmidsep\relax}% +}% +\def\@tabacolr{% + \@addtopreamble{\hskip\tabrightsep\relax}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arrayclassz} +% \begin{macrocode} +\def\@arrayclassz@LaTeX{% + \ifcase \@lastchclass \@acolampacol \or \@ampacol \or + \or \or \@addamp \or + \@acolampacol \or \@firstampfalse \@acol \fi + \edef\@preamble{\@preamble + \ifcase \@chnum + \hfil$\relax\@sharp$\hfil \or $\relax\@sharp$\hfil + \or \hfil$\relax\@sharp$\fi}% +}% +\def\@arrayclassz@ltx{% + \ifcase\@lastchclass + \@acolampacol + \or + \@ampacol + \or + \or + \or + \@addamp + \or + \@acolampacol + \or + \@firstampfalse\@acoll + \fi + \ifcase\@chnum + \@addtopreamble{% + \hfil\array@row@rst$\relax\@sharp$\hfil + }% + \or + \@addtopreamble{% + \array@row@rst$\relax\@sharp$\hfil + }% + \or + \@addtopreamble{% + \hfil\array@row@rst$\relax\@sharp$% + }% + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabclassz} +% \begin{macrocode} +\def\@tabclassz@LaTeX{% + \ifcase\@lastchclass + \@acolampacol + \or + \@ampacol + \or + \or + \or + \@addamp + \or + \@acolampacol + \or + \@firstampfalse\@acol + \fi + \edef\@preamble{% + \@preamble{% + \ifcase\@chnum + \hfil\ignorespaces\@sharp\unskip\hfil + \or + \hskip1sp\ignorespaces\@sharp\unskip\hfil + \or + \hfil\hskip1sp\ignorespaces\@sharp\unskip + \fi}}% +}% +\def\@tabclassz@ltx{% + \ifcase\@lastchclass + \@acolampacol + \or + \@ampacol + \or + \or + \or + \@addamp + \or + \@acolampacol + \or + \@firstampfalse\@acoll + \fi + \ifcase\@chnum + \@addtopreamble{% + {\hfil\array@row@rst\cell@font\ignorespaces\@sharp\unskip\hfil}% + }% + \or + \@addtopreamble{% + {\cell@fil\hskip1sp\array@row@rst\cell@font\ignorespaces\@sharp\unskip\hfil}% + }% + \or + \@addtopreamble{% + {\hfil\hskip1sp\array@row@rst\cell@font\ignorespaces\@sharp\unskip\cell@fil}% + }% + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabclassiv} +% \begin{macrocode} +\def\@tabclassiv@LaTeX{% + \@addtopreamble\@nextchar +}% +\def\@tabclassiv@ltx{% + \expandafter\@addtopreamble\expandafter{\@nextchar}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arrayclassiv} +% \begin{macrocode} +\def\@arrayclassiv@LaTeX{% + \@addtopreamble{$\@nextchar$}% +}% +\def\@arrayclassiv@ltx{% + \expandafter\@addtopreamble\expandafter{\expandafter$\@nextchar$}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@classv} +% \begin{macrocode} +\def\@classv@LaTeX{% + \@addtopreamble{\@startpbox{\@nextchar}\ignorespaces + \@sharp\@endpbox}% +}% +\def\@classv@ltx{% + \expandafter\@addtopreamble + \expandafter{% + \expandafter \@startpbox + \expandafter {\@nextchar}% + \pbox@hook\array@row@rst\cell@font\ignorespaces\@sharp\@endpbox + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@classx} +% \begin{macrocode} +\def\@classx@array{% + \ifcase \@lastchclass + \@acolampacol \or + \@addamp \@acol \or + \@acolampacol \or + \or + \@acol \@firstampfalse \or + \@addamp + \fi +}% +\def\@classx@array@new{% + \ifcase \@lastchclass + \@acolampacol + \or + \@addamp \@acol + \or + \@acolampacol + \or + \or + \@firstampfalse\@acoll + \or + \@addamp + \fi +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Repair other broken parts of \LaTeX} +% +% \begin{macro}{\@xbitor} +% Expansion part has extraneous space token. Removed. +% \begin{macrocode} +\def\@xbitor@LaTeX #1{\@tempcntb \count#1 + \ifnum \@tempcnta =\z@ + \else + \divide\@tempcntb\@tempcnta + \ifodd\@tempcntb \@testtrue\fi + \fi}% +\def\@xbitor@ltx#1{% + \@tempcntb\count#1\relax + \@ifnum{\@tempcnta=\z@}{}{% + \divide\@tempcntb\@tempcnta + \@ifodd\@tempcntb{\@testtrue}{}% + }% +}% +\@ifx{\@xbitor\@xbitor@LaTeX}{% + \class@info{Repairing broken LaTeX \string\@xbitor}% +}{% + \class@info{Unrecognized LaTeX \string\@xbitor. Please update this document class! (Proceeding with fingers crossed.)}% +}% +\let\@xbitor\@xbitor@ltx +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Syntax} +% \begin{macro}{\@gobble@opt@one} +% The \cmd\@gobble@opt@one\ command eats up an optional argument +% and one required argument. +% \begin{macrocode} +\newcommand*\@gobble@opt@one[2][]{}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Auto-indented Contents} +% Facility to automatically determine the proper indentation of +% the TOC entries. +% +% Note on \classname{hyperref} compatibility: +% We must respect that +% \cmd\contentsline\ now has a fourth argument. +% So, instead of trying to override the meaning of \cmd\contentsline, +% we use the aux file to remember max values from one run to the next. +% +% In this respect, this package retains compatibility with +% \classname{hyperref}. +% +% \begin{macro}{\@starttoc} +% Install hooks at beginning and end of the TOC processing. +% \begin{macrocode} +\def\@starttoc#1{% + \begingroup + \toc@pre + \makeatletter + \@input{\jobname.#1}% + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax + \fi + \@nobreakfalse + \toc@post + \endgroup +}% +\def\toc@pre{}% +\def\toc@post{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\toc@@font} +% Interface for setting the formatting characteristics of this part +% of the TOC. +% +% Note: \cmd\toc@@font\ is the common font for all auto-sizing toc commands, +% although this, too, could become a dispatcher. +% \changes{4.1a}{2008/01/19}{(AO, 461) Change the csname from \cs{@dotsep} to \cs{ltxu@dotsep}. The former is understood in mu. (What we wanted was a dimension.)}% +% \begin{macrocode} +\def\toc@@font{}% +\def\ltxu@dotsep{\z@}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@section} +% Interface for determining which TOC elements are automatically indented. +% +% All of the \cmd\l@\dots\ commands simply go through the +% utility procedure \cmd\l@@sections. The calling convention is +% to pass the name of self and the name of parent. +% If you want to exclude any of these from the indentation +% scheme, simply leave the \cmd\l@\dots\ command undefined. +% +% Note that the parent of ``section'' is nil, so we have to define a stub. +% \begin{verbatim}\def\l@section{\l@@sections{}{section}}% Implicit #3#4\end{verbatim} +% \begin{verbatim}\def\tocleft@{\z@}%\end{verbatim} +% \begin{verbatim}\def\l@subsection{\l@@sections{section}{subsection}}% Implicit #3#4\end{verbatim} +% \begin{verbatim}\def\l@subsubsection{\l@@sections{subsection}{subsubsection}}% Implicit #3#4\end{verbatim} +% \begin{verbatim}\def\l@paragraph{\l@@sections{subsubsection}{paragraph}}% Implicit #3#4\end{verbatim} +% \begin{verbatim}\def\l@subparagraph#1#2{\l@@sections{paragraph}{subparagraph}}% Implicit #3#4\end{verbatim} +% \end{macro} +% +% Glom some \cmd\dimen\ registers. +% \begin{macrocode} +\let\tocdim@section \leftmargini +\let\tocdim@subsection \leftmarginii +\let\tocdim@subsubsection \leftmarginiii +\let\tocdim@paragraph \leftmarginiv +\let\tocdim@appendix \leftmarginv +\let\tocdim@pagenum \leftmarginvi +% \end{macrocode} +% +% \begin{macro}{\toc@pre@auto} +% \begin{macro}{\toc@post@auto} +% We patch \cmd\@starttoc\ to: +% 1) before TOC processing, +% initialize the max registers and +% set the needed dimensions from +% the values stored in the auxiliary file, and +% 2) after TOC processing, +% store out those max register values into the auxiliary file. +% +% Note that the font is set here: all other TOC entries must +% override these font settings. +% +% To activate this override of the standard \LaTeX\ processing, +% the substyle does: \cmd\let\cmd\toc@pre\cmd\toc@pre@auto\ +% and \cmd\let\cmd\toc@post\cmd\toc@post@auto. +% \begin{macrocode} +\def\toc@pre@auto{% + \toc@@font + \@tempdima\z@ + \toc@setindent\@tempdima{section}% + \toc@setindent\@tempdima{subsection}% + \toc@setindent\@tempdima{subsubsection}% + \toc@setindent\@tempdima{paragraph}% + \toc@letdimen{appendix}% + \toc@letdimen{pagenum}% +}% +\def\toc@post@auto{% + \if@filesw + \begingroup + \toc@writedimen{section}% + \toc@writedimen{subsection}% + \toc@writedimen{subsubsection}% + \toc@writedimen{paragraph}% + \toc@writedimen{appendix}% + \toc@writedimen{pagenum}% + \endgroup + \fi +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\toc@setindent} +% \begin{macrocode} +\def\toc@setindent#1#2{% + \csname tocdim@#2\endcsname\tocdim@min\relax + \@ifundefined{tocmax@#2}{\@namedef{tocmax@#2}{\z@}}{}% + \advance#1\@nameuse{tocmax@#2}\relax + \expandafter\edef\csname tocleft@#2\endcsname{\the#1}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\toc@letdimen} +% \begin{macrocode} +\def\toc@letdimen#1{% + \csname tocdim@#1\endcsname\tocdim@min\relax + \@ifundefined{tocmax@#1}{\@namedef{tocmax@#1}{\z@}}{}% + \expandafter\let\csname tocleft@#1\expandafter\endcsname\csname tocmax@#1\endcsname +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\toc@writedimen} +% \begin{macrocode} +\def\toc@writedimen#1{% + \immediate\write\@auxout{% + \gdef\expandafter\string\csname tocmax@#1\endcsname{% + \expandafter\the\csname tocdim@#1\endcsname + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@@sections} +% The procedure for formatting the indented TOC entries. +% We use control sequence names such as \cmd\tocmax@section\ and +% \cmd\tocleft@section, the former being written to the auxiliary file +% and the latter only defined for the duration of the TOC processing. +% +% Note that the assignment of \cmd\box\cmd\@tempboxa\ by \cmd\set@tocdim@pagenum\ +% must endure over the invocation of |#3|: it contains the +% page number which will be set just before the \cmd\par. +% +% The arguments:\begin{enumerate} +% \item[\#1] superior section +% \item[\#2] this section +% \item[\#3] content, including possible \cmd\numberline +% \item[\#4] page number\end{enumerate} +% \begin{macrocode} +\def\l@@sections#1#2#3#4{% + \begingroup + \everypar{}% + \set@tocdim@pagenum\@tempboxa{#4}% + \global\@tempdima\csname tocdim@#2\endcsname + \leftskip\csname tocleft@#2\endcsname\relax + \dimen@\csname tocleft@#1\endcsname\relax + \parindent-\leftskip\advance\parindent\dimen@ + \rightskip\tocleft@pagenum plus 1fil\relax + \skip@\parfillskip\parfillskip\z@ + \let\numberline\numberline@@sections + \@nameuse{l@f@#2}% + \ignorespaces#3\unskip\nobreak\hskip\skip@ + \hb@xt@\rightskip{\hfil\unhbox\@tempboxa}\hskip-\rightskip\hskip\z@skip +% \end{macrocode} +% \changes{4.1n}{2009/12/13}{(AO, 574) protect against \classname{lineno.sty}, which forces a visit to the output routine, which appears to destroy the value of \cs{@tempdima}}% +% +% By side effect, set the value of, e.g., \cmd\tocdim@section. +% +% Note that the \cmd\par\ must not be executed before the value of \cmd\@tempdima\ is expanded (outside the current group). +% Otherwise, the \classname{lineno.sty} package may interfere (it unfortunately does a global assignment of \cmd\@tempdima). +% \begin{macrocode} + \expandafter\par + \expandafter\aftergroup\csname tocdim@#2% + \expandafter\endcsname + \expandafter\endgroup + \the\@tempdima\relax +}% +% \end{macrocode} +% \changes{4.1a}{2008/01/19}{(AO, 479) Per: Dylan Thurston<dpt at math.harvard.edu>}% +% In the call to \cmd\set@tocdim@pagenum, I am now exposing the use of the particular box register. +% \begin{macrocode} +\def\set@tocdim@pagenum#1#2{% + \setbox#1\hbox{\ignorespaces#2}% + \@ifdim{\tocdim@pagenum<\wd#1}{\global\tocdim@pagenum\wd#1}{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\numberline@@sections} +% \changes{4.1a}{2008/01/19}{(AO, 461) Change the csname from \cs{@dotsep} to \cs{ltxu@dotsep}. The former is understood in mu. (What we wanted was a dimension.)}% +% The utility procedure for all \cmd\numberline\ processing in indented TOC entries. +% The first argument is self. +% +% We use \cmd\@tempdima\ to pass a value around (via global assignment) because +% \cmd\numberline\ executes inside a group if the +% \classname{hyperref} package is loaded. +% Would that it were not so! +% \begin{macrocode} +\def\numberline@@sections#1{% + \leavevmode\hb@xt@-\parindent{% + \hfil + \@if@empty{#1}{}{% + \setbox\z@\hbox{#1.\kern\ltxu@dotsep}% + \@ifdim{\@tempdima<\wd\z@}{\global\@tempdima\wd\z@}{}% + \unhbox\z@ + }% + }% + \ignorespaces +}% +\def\tocdim@min{\z@}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Lists} +% \begin{macro}{\list} +% Using \cmd\parshape\ to implement lists was always suspect +% (can you get behind \cmd\parshape\cmd\@ne?) and we now see that +% it was a mistake all along. Why? Because \cmd\parshape, like +% \cmd\hangindent, achieves its effect via ``shifting'' the \cmd\hbox es +% in a paragraph +% instead of using \cmd\leftskip\ and \cmd\parindent, which is +% robust during column balancing. +% +% We introduce the alternative method with a hook into +% the \LaTeX\ kernel procedure \cmd\list, which is +% the implementation of all lists. +% +% \begin{macrocode} +\def\list#1#2{% + \ifnum \@listdepth >5\relax + \@toodeep + \else + \global\advance\@listdepth\@ne + \fi + \rightmargin\z@ + \listparindent\z@ + \itemindent\z@ + \csname @list\romannumeral\the\@listdepth\endcsname + \def\@itemlabel{#1}% + \let\makelabel\@mklab + \@nmbrlistfalse + #2\relax + \@trivlist + \parskip\parsep + \set@listindent + \ignorespaces +}% +\def\set@listindent@parshape{% + \parindent\listparindent + \advance\@totalleftmargin\leftmargin + \advance\linewidth-\rightmargin + \advance\linewidth-\leftmargin + \parshape\@ne\@totalleftmargin\linewidth +}% +\def\set@listindent@{% + \parindent\listparindent + \advance\@totalleftmargin\leftmargin + \advance\rightskip\rightmargin + \advance\leftskip\@totalleftmargin +}% +\let\set@listindent\set@listindent@parshape +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Hypertext capabilities} +% +% \begin{macro}{\href} +% \begin{macro}{\url} +% \begin{macro}{\URL@prefix} +% \begin{macro}{\doi} +% \begin{macro}{\doibase} +% \changes{4.1b}{2008/08/12}{(AO, 487) Support for video figures and the \cs{setfloatlink} command}% +% We provide support for the \cmd\href, \cmd\url, and \cmd\doi\ commands. +% Packages, like \classname{hyperref}, may override these definitions +% and provide better semantics. +% \changes{4.1g}{2009/10/06}{(AO, 532) Both arguments of \cs{href} get sanitized}% +% \changes{4.1j}{2009/10/24}{(AO, 545) Provide definition for \cs{doi} that does hypertext}% +% \begin{macrocode} +\providecommand\href[0]{\begingroup\@sanitize@url\@href}% +\def\@href#1{\@@startlink{#1}\endgroup\@@href}% +\def\@@href#1{#1\@@endlink}% +\providecommand \url [0]{\begingroup\@sanitize@url \@url }% +\def \@url #1{\endgroup\@href {#1}{\URL@prefix#1}}% +\providecommand \URL@prefix [0]{URL }% +\providecommand\doi[0]{\begingroup\@sanitize@url\@doi}% +\def\@doi#1{\endgroup\@@startlink{\doibase#1}doi:\discretionary {}{}{}#1\@@endlink }% +%changes{4.2a}{2017/11/21}{(MD) Use updated best practice to use https and doi.org}% +\providecommand \doibase [0]{https://doi.org/}% +\providecommand \@sanitize@url[0]{\chardef\cat@space\the\catcode`\ \@sanitize\catcode`\ \cat@space}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@startlink} +% \begin{macro}{\@@endlink} +% \begin{macro}{\pdfstartlink@attr} +% \begin{macro}{\hypertext@enable@ltx} +% How we define \cmd\@@startlink\ and \cmd\@@endlink\ will depend on +% whether we are running under \textsc{pdflatex}. +% If so, and if PDF output is requested, then we use its primitives +% to implement hypertext, +% breaking out the link attributes in \cmd\pdfstartlink@attr\ +% and using the \classname{hyperref} defaults; +% \cmd\pdfstartlink@attr\ can be redefined by a client package. +% Otherwise we fall back the Hyper\TeX\ standard and leave things to the DVI translator. +% \changes{4.1j}{2009/10/25}{(AO, 545) hypertext capabilities off by default; enable with \classoption{hypertext}} +% +% A class or package that wishes to employ hypertext capabilities should +% execute the \cmd\hypertext@enable@ltx\ procedure. +% \begin{macrocode} +\def\@@startlink#1{}% +\def\@@endlink{}% +\@ifxundefined \pdfoutput {\true@sw}{\@ifnum{\z@=\pdfoutput}{\true@sw}{\false@sw}}% +{% + \def\@@startlink@hypertext#1{\leavevmode\special{html:<a href="#1">}}% + \def\@@endlink@hypertext{\special{html:</a>}}% +}{% + \def\@@startlink@hypertext#1{% + \leavevmode + \pdfstartlink\pdfstartlink@attr + user{/Subtype/Link/A<</Type/Action/S/URI/URI(#1)>>}% + \relax + }% + \def\@@endlink@hypertext{\pdfendlink}% + \def\pdfstartlink@attr{attr{/Border[0 0 1 ]/H/I/C[0 1 1]}}% +}% +\def\hypertext@enable@ltx{% + \let\@@startlink\@@startlink@hypertext + \let\@@endlink\@@endlink@hypertext +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\href} +% \changes{4.1p}{2010/02/24}{(AO, 582) A patch of \classname{hyperref.sty} to provide backward compatibility to \TeX Live 2007's version 6.75r}% +% The \cmd\href\ command of \classname{hyperref} was extend somewhere +% between versions 6.75r and 6.80e. We apply a repair to the earlier +% version (if present) so that it works like the later version. +% +% The issue is the presence of whitespace, either following the \cmd\href\ token +% or following the first argument's closing brace character. +% +% \begin{macrocode} +\def\href@Hy{\hyper@normalise \href@ }% +\def\href@Hy@ltx{\@ifnextchar\bgroup\Hy@href{\hyper@normalise\href@}}% +\def\Hy@href#{\hyper@normalise\href@}% +\begingroup + \endlinechar=-1 % + \catcode`\^^A=14 % + \catcode`\^^M\active + \catcode`\%\active + \catcode`\#\active + \catcode`\_\active + \catcode`\$\active + \catcode`\&\active + \gdef\hyper@normalise@ltx{^^A + \begingroup + \catcode`\^^M\active + \def^^M{ }^^A + \catcode`\%\active + \let%\@percentchar + \let\%\@percentchar + \catcode`\#\active + \def#{\hyper@hash}^^A + \def\#{\hyper@hash}^^A + \@makeother\&^^A + \edef&{\string&}^^A + \edef\&{\string&}^^A + \edef\textunderscore{\string_}^^A + \let\_\textunderscore + \catcode`\_\active + \let_\textunderscore + \let~\hyper@tilde + \let\~\hyper@tilde + \let\textasciitilde\hyper@tilde + \let\\\@backslashchar + \edef${\string$}^^A + \Hy@safe@activestrue + \hyper@n@rmalise + }^^A + \catcode`\#=6 ^^A + \gdef\Hy@ActiveCarriageReturn@ltx{^^M}^^A + \gdef\hyper@n@rmalise@ltx#1#2{^^A + \def\Hy@tempa{#2}^^A + \ifx\Hy@tempa\Hy@ActiveCarriageReturn + \Hy@ReturnAfterElseFi{^^A + \hyper@@normalise{#1}^^A + }^^A + \else + \Hy@ReturnAfterFi{^^A + \hyper@@normalise{#1}{#2}^^A + }^^A + \fi + }^^A + \gdef\hyper@@normalise@ltx#1#2{^^A + \edef\Hy@tempa{^^A + \endgroup + \noexpand#1{\Hy@RemovePercentCr#2%^^M\@nil}^^A + }^^A + \Hy@tempa + }^^A + \gdef\Hy@RemovePercentCr@ltx#1%^^M#2\@nil{^^A + #1^^A + \ifx\limits#2\limits + \else + \Hy@ReturnAfterFi{^^A + \Hy@RemovePercentCr #2\@nil + }^^A + \fi + }^^A +\endgroup +\def\switch@hyperref@href{% + \expandafter\@ifx\expandafter{\csname href \endcsname\href@Hy}{ + \class@info{Repairing hyperref 6.75r \string\href}% + \let\hyper@normalise\hyper@normalise@ltx + \let\hyper@@normalise\hyper@@normalise@ltx + \let\hyper@n@rmalise\hyper@n@rmalise@ltx + \let\Hy@ActiveCarriageReturn\Hy@ActiveCarriageReturn@ltx + \let\Hy@RemovePercentCr\Hy@RemovePercentCr@ltx + \let\href\href@Hy@ltx + }{}% +}% +\appdef\document@inithook{\switch@hyperref@href}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\typeout} +% We make the \cmd\typeout\ procedure of \LaTeX\ be \cmd\long, +% because sometimes we are talking about \cmd\par. +% \begin{macrocode} +\def\typeout@org#1{% + \begingroup + \set@display@protect + \immediate\write\@unused{#1}% + \endgroup +}% +\long\def\typeout@ltx#1{% + \begingroup + \set@display@protect + \immediate\write\@unused{#1}% + \endgroup +}% +\@ifx{\typeout\typeout@org}{% + \let\typeout\typeout@ltx + \true@sw +}{% + \rvtx@ifformat@geq{2020-10-01}% + {\true@sw}{\false@sw}% +}% + {\class@info{Making \string\typeout\space \string\long}}% + {}% +% \end{macrocode} +% \end{macro} +% +% \subsection{End of the \file{kernel} {\sc docstrip} module} +% Here ends the module. +% \begin{macrocode} +%</kernel> +% \end{macrocode} +% +% \Finale +% \iffalse Here ends the programmer's documentation.\fi +% \endinput +% +\endinput +%%EOF diff --git a/texmf/source/latex/revtex/revtex-bst.dtx b/texmf/source/latex/revtex/revtex-bst.dtx new file mode 100644 index 0000000..1b5c843 --- /dev/null +++ b/texmf/source/latex/revtex/revtex-bst.dtx @@ -0,0 +1,3873 @@ +% \iffalse meta-comment balanced on line 122 +% revtex-bst.dtx: Package to extract .bst files for RevTeX +% Copyright (c) 2020 American Physical Society. +% https://journals.aps.org/revtex/ +% mailto:revtex@aps.org +% +% Disclaimer +% This file is distributed WITHOUT ANY WARRANTY; +% without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +% License +% You may distribute this file under the conditions of the +% LaTeX Project Public License 1.3c or later +% (http://www.latex-project.org/lppl.txt). +% ReadMe +% For the documentation and more detailed instructions for +% installation, typeset this document with \LaTeX. +% Maintenance Status +% This work has the LPPL maintenance status "maintained"; +% Current Maintainer of this work is Phelype Oleinik. +% +% This work consists of the main source file revtex-bst.dtx +% and the derived files +% aapmrev4-2.bst, aipauth4-2.bst, aipnum4-2.bst, apsrev4-2.bst, apsrmp4-2.bst +% Distribution: +% CTAN:macros/latex/contrib/revtex/ +% +% Unpacking: +% tex revtex-bst.dtx +% +% Installation: +% TDS:bibtex/bst/revtex/ +% +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase + 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi + \relax +\else + \csname fi\endcsname +%</ignore> +%<*install> +%% This file will generate documentation and runtime files +%% from revtex4-2.dtx when run through TeX. +\input docstrip +\nopreamble +\edef\defaultpostamble{% + \MetaPrefix\space End of customized bst file^^J% + \MetaPrefix ^^J% + \MetaPrefix\space End of file `\outFileName'.% +} +\askforoverwritefalse +\keepsilent +\generate{% + \file{aapmrev4-2.bst}{\from{revtex-bst.dtx}{aapmrev}}% + \file{aipauth4-2.bst}{\from{revtex-bst.dtx}{aipauth}}% + \file{aipnum4-2.bst}{\from{revtex-bst.dtx}{aipnum}}% + \file{apsrev4-2.bst}{\from{revtex-bst.dtx}{apsrev}}% + \file{apsrmp4-2.bst}{\from{revtex-bst.dtx}{apsrmp}}% +}% +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation, please move} +\Msg{* *.bst } +\Msg{* into a directory searched by TeX;} +\Msg{* in a TDS-compliant installation:} +\Msg{* texmf/bibtex/bst/revtex/.} +\Msg{*} +\Msg{* Happy BibTeXing} +\Msg{***********************************************************} +} +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% \fi +% +% \GetFileInfo{revtex-bst.dtx} +% +% \StopEventually{} +% \iffalse ltxdoc klootch +%<*package> +%%% @LaTeX-file{ +%%% filename = "revtex-bst.dtx", +%%% version = "4.2e", +%%% date = "2020/10/03", +%%% author = "Phelype Oleinik (mailto: phelype.oleinik at latex-project.org), +%%% commissioned by the American Physical Society. +%%% ", +%%% copyright = "Copyright (C) 2020 American Physical Society +%%% distributed under the terms of the +%%% LaTeX Project Public License 1.3c, see +%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt +%%% ", +%%% email = "mailto colon revtex at aps.org", +%%% codetable = "ISO/ASCII", +%%% keywords = "", +%%% supported = "yes", +%%% abstract = "", +%%% } +%</package> +% \fi +% +% \subsection{Bill of Materials} +% +% Following is a list of the files in this distribution arranged +% according to provenance. +% +% \subsubsection{Primary Source}% +% One single file generates all. +%\begin{verbatim} +%revtex-bst.dtx +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{tex revtex-bst.dtx}}% +% Typesetting ths file under \TeX\ itself runs the installer, +% which generates the bibliography style files. +%\begin{verbatim} +%aapmrev4-2.bst, aipauth4-2.bst, aipnum4-2.bst, +%apsrev4-2.bst, apsrmp4-2.bst +%\end{verbatim} +% +% \section{Code common to all modules}% +% +% \begin{macrocode} +%<*aapmrev|aipauth|aipnum|apsrev|apsrmp> +%% +%<aapmrev>%% This is file `aapmrev4-2.bst', and is a hand-edited version of aapmrev4-1.bst +%<aipauth>%% This is file `aipauth4-2.bst', and is a hand-edited version of aipauth4-1.bst +%<aipnum>%% This is file `aipnum4-2.bst', and is a hand-edited version of aipnum4-1.bst +%<apsrev>%% This is file `apsrev4-2.bst', and is a hand-edited version of apsrev4-1.bst +%<apsrmp>%% This is file `apsrmp4-2.bst', and is a hand-edited version of apsrmp4-1.bst + % =============================================================== + % IMPORTANT NOTICE: + % This file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % =============================================================== + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is an author-year citation style bibliography. As such, it is + % non-standard LaTeX, and requires a special package file to function properly. + % Such a package is natbib.sty by Patrick W. Daly + % The form of the \bibitem entries is + % \bibitem[Jones et al.(1990)]{key}... + % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... + % The essential feature is that the label (the part in brackets) consists + % of the author names, as they should appear in the citation, with the year + % in parentheses following. There must be no space before the opening + % parenthesis! + % With natbib v5.3, a full list of authors may also follow the year. + % In natbib.sty, it is possible to define the type of enclosures that is + % really wanted (brackets or parentheses), but in either case, there must + % be parentheses in the label. + % The \cite command functions as follows: + % \citet{key} ==>> Jones et al. (1990) + % \citet*{key} ==>> Jones, Baker, and Smith (1990) + % \citep{key} ==>> (Jones et al., 1990) + % \citep*{key} ==>> (Jones, Baker, and Smith, 1990) + % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) + % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990) + % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) + % \citeauthor{key} ==>> Jones et al. + % \citeauthor*{key} ==>> Jones, Baker, and Smith + % \citeyear{key} ==>> 1990 + %--------------------------------------------------------------------- +%</aapmrev|aipauth|aipnum|apsrev|apsrmp> +% +% \subsection{The Frontmatter File} +% As promised above, here is the contents of the frontmatter file. +% This file doesn't have any documentation, so just stop early. +% \begin{macrocode} +%<*ignore> +\stop +\changes{4.2e}{2020/10/03}{(PHO) Initial version---Put all .bst files in a single .dtx} +%</ignore> +% \end{macrocode} +% +% \begin{macrocode} +%<*aapmrev|aipauth|aipnum|apsrev|apsrmp> +% \end{macrocode} +% +% \begin{macrocode} + +%<aapmrev>FUNCTION {id.bst} {"aapmrev4-2.bst 2019-01-14 (MD) hand-edited version of aapmrev4-1.bst"} +%<aipauth>FUNCTION {id.bst} {"aipnauth4-2.bst 2018-12-27 (MD) hand-edited version of apsauth4-1.bst"} +%<aipnum>FUNCTION {id.bst} {"aipnum4-2.bst 2019-01-14 (MD) hand-edited version of apsrev4-1.bst"} +%<apsrev>FUNCTION {id.bst} {"apsrev4-2.bst 2019-01-14 (MD) hand-edited version of apsrev4-1.bst"} +%<apsrmp>FUNCTION {id.bst} {"apsrmp4-2.bst 2018-12-27 (MD) hand-edited version of apsrmp4-1.bst"} +ENTRY +{ + address + archive + archivePrefix + author + bookaddress + booktitle + chapter + collaboration + doi + edition + editor + eid + eprint + howpublished + institution + isbn + issn + journal + key + language + month + note + number + organization + pages + primaryClass + publisher + school + SLACcitation + series + title + translation + type + url + volume + year +}{ +}{ + label + extra.label sort.label + short.list +} + +INTEGERS +{ + output.state before.all + after.word after.punctuation + after.sentence after.block +} + +INTEGERS +{ + punctuation.state punctuation.no punctuation.space punctuation.yes +} + +STRINGS { bibfield output.bibfield } + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {non.stop} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +INTEGERS { arith.mulitplier arith.multiplicand } + +FUNCTION {multiply} +{ + 'arith.multiplicand := + 'arith.mulitplier := + #0 + { arith.mulitplier #0 > } + { arith.multiplicand + + arith.mulitplier #1 - 'arith.mulitplier := + } + while$ +} + +FUNCTION {chr.to.hex} +{ + chr.to.int$ + duplicate$ "0" chr.to.int$ - + duplicate$ duplicate$ #0 < swap$ #9 > or not + { swap$ pop$ } + { pop$ + duplicate$ "A" chr.to.int$ - + duplicate$ duplicate$ #0 < swap$ #5 > or not + { swap$ pop$ #10 + } + { pop$ + duplicate$ "a" chr.to.int$ - + duplicate$ duplicate$ #0 < swap$ #5 > or not + { swap$ pop$ #10 + } + { pop$ + pop$ #-1 + } + if$ + } + if$ + } + if$ +} + +INTEGERS { arith.accumulator } + +FUNCTION {str.to.hex} +{ #0 'arith.accumulator := + { duplicate$ empty$ not } + { duplicate$ #1 #1 substring$ chr.to.hex + duplicate$ #0 < + { pop$ pop$ "" + } + { arith.accumulator #16 multiply + 'arith.accumulator := + #2 global.max$ substring$ + } + if$ + } + while$ + pop$ arith.accumulator +} + +FUNCTION {diagn.cmntlog} +{ + duplicate$ top$ "%" swap$ * write$ newline$ +} + +INTEGERS { control.key control.author control.editor control.title control.pages control.eprint control.year } + +INTEGERS { control.author.jnrlst control.author.dotless control.author.nospace control.author.initials control.author.nocomma control.author.first control.author.reversed } + +FUNCTION { control.init } +{ + #0 + 'control.key := + #0 +%<aipauth> #1 + +%<apsrmp> #1 + +%<apsrmp> #2 + + #8 + +%<apsrev> #64 + +%<apsrmp> #64 + + 'control.author := +%<aapmrev> #0 +%<aipauth> #0 +%<aipnum> #0 +%<apsrev> #1 +%<apsrmp> #1 + 'control.author.jnrlst := + #0 + 'control.author.dotless := + #0 + 'control.author.nospace := + #1 + 'control.author.initials := + #0 + 'control.author.nocomma := +%<!apsrmp> #0 +%<apsrmp> #1 + 'control.author.first := +%<aapmrev> #0 +%<aipauth> #1 +%<aipnum> #0 +%<apsrev> #0 +%<apsrmp> #1 + 'control.author.reversed := +%<aapmrev> #1 +%<aipauth> #0 +%<aipnum> #1 +%<apsrev> #1 +%<apsrmp> #0 + 'control.editor := + #-1 + 'control.title := + #0 + 'control.pages := + #0 + 'control.eprint := + #1 + 'control.year := +} + +FUNCTION {warning.dependency} +{ + " (dependency: " * swap$ * ") set " * swap$ int.to.str$ * warning$ +} + +FUNCTION {control.check} +{ + control.editor + { + "editor formatted same as author" + control.author.reversed { + duplicate$ #0 swap$ "reversed" warning.dependency + #0 'control.author.reversed := + } 'skip$ if$ + control.author.first { + duplicate$ #0 swap$ "first" warning.dependency + #0 'control.author.first := + } 'skip$ if$ + control.author.nocomma { + duplicate$ #0 swap$ "nocomma" warning.dependency + #0 'control.author.nocomma := + } 'skip$ if$ + pop$ + } 'skip$ if$ + control.author.reversed 'skip$ + { + "not reversed" + control.author.nospace { + duplicate$ #0 swap$ "nospace" warning.dependency + #0 'control.author.nospace := + } 'skip$ if$ + control.author.jnrlst 'skip$ { + duplicate$ #1 swap$ "jnrlst" warning.dependency + #1 'control.author.jnrlst := + } if$ + control.author.initials { + duplicate$ ", initials" * + control.author.dotless { + duplicate$ #0 swap$ "dotless" warning.dependency + #0 'control.author.dotless := + } 'skip$ if$ + pop$ + } 'skip$ if$ + pop$ + } + if$ + control.author.initials 'skip$ { + "not initials" + control.author.nocomma { + duplicate$ #0 swap$ "nocomma" warning.dependency + #0 'control.author.nocomma := + } 'skip$ if$ + control.author.nospace { + duplicate$ #0 swap$ "nospace" warning.dependency + #0 'control.author.nospace := + } 'skip$ if$ + control.author.dotless 'skip$ { + duplicate$ #1 swap$ "dotless" warning.dependency + #1 'control.author.dotless := + } if$ + pop$ + } if$ +} + +FUNCTION {control.parse} +{ + duplicate$ duplicate$ missing$ + { + pop$ pop$ pop$ + } + { empty$ + { + pop$ #-1 + }{ + str.to.hex + } + if$ + swap$ := + } + if$ +} + +FUNCTION {control.dump} +{ + duplicate$ missing$ { pop$ "N/A" } 'skip$ if$ + "{" swap$ * "}, " * + * +} + +INTEGERS { decode.threshold } + +FUNCTION {control.decode} +{ + - duplicate$ + #0 < + { + skip$ pop$ swap$ #0 + } + { + swap$ pop$ swap$ #1 + } + if$ + swap$ := +} + +FUNCTION {control.author.decode} +{ + control.author + duplicate$ duplicate$ #0 < swap$ #128 < not or + { + int.to.str$ "(" swap$ * ")" * + "Control cannot interpret author " swap$ * + warning$ + }{ + 'control.author.jnrlst swap$ duplicate$ #64 control.decode + 'control.author.dotless swap$ duplicate$ #32 control.decode + 'control.author.nospace swap$ duplicate$ #16 control.decode + 'control.author.initials swap$ duplicate$ #8 control.decode + 'control.author.nocomma swap$ duplicate$ #4 control.decode + 'control.author.first swap$ duplicate$ #2 control.decode + 'control.author.reversed swap$ duplicate$ #1 control.decode + duplicate$ #0 = + 'skip$ + { + "Control: residue of author" + "(" swap$ * ")" * * + warning$ + } + if$ + pop$ + } + if$ +} + +FUNCTION {control.setup} +{ + type$ cite$ "{" swap$ * "}, " * * + "control.key" key control.dump * + "control.author" author control.dump * + "control.editor" editor control.dump * + "control.title" title control.dump * + "control.pages" pages control.dump * + "control.year" year control.dump * + "control.eprint" eprint control.dump * + top$ + 'control.key key control.parse + 'control.author author control.parse + 'control.editor editor control.parse + 'control.title title control.parse + 'control.pages pages control.parse + 'control.year year control.parse + 'control.eprint eprint control.parse + control.author.decode +} + +FUNCTION {control.pass} +{ type$ "control" = 'control.setup 'skip$ if$ +} + +FUNCTION {control.presort} +{ +} + +FUNCTION {control.forward} +{ +} + +FUNCTION {control.reverse} +{ +} + +FUNCTION {control.sort} +{ +} + +FUNCTION {control.longest.label} +{ +} + +FUNCTION {control.key.bib} +{ + "Control: key " + control.key + duplicate$ "(" swap$ int.to.str$ * ") " * swap$ + pop$ * + diagn.cmntlog +} + +FUNCTION {control.author.bib} +{ + "Control: author " + control.author "(" swap$ int.to.str$ * ")" * * + control.author.reversed { " reversed" * }{} if$ + control.author.first { " first" * }{} if$ + control.author.nocomma { " nocomma" * }{} if$ + control.author.initials { " initials" * }{} if$ + control.author.nospace { " nospace" * }{} if$ + control.author.dotless { " dotless" * }{} if$ + control.author.jnrlst { " jnrlst" * }{} if$ + diagn.cmntlog +} + +FUNCTION {control.editor.bib} +{ + "Control: editor formatted " + control.editor + duplicate$ "(" swap$ int.to.str$ * ") " * swap$ + duplicate$ #0 < { + pop$ + "disabled!" + } { + #0 > { + "identically to author" + } { + "differently from author" + } if$ + } if$ * * + diagn.cmntlog +} + +FUNCTION {control.title.bib} +{ + "Control: production of article title " + control.title + duplicate$ "(" swap$ int.to.str$ * ") " * swap$ + duplicate$ #0 < { + pop$ + "disabled" + } { + #0 > { + "required" + } { + "allowed" + } if$ + } if$ * * + diagn.cmntlog +} + +FUNCTION {control.pages.bib} +{ + "Control: page " + control.pages + duplicate$ "(" swap$ int.to.str$ * ") " * swap$ + duplicate$ #0 < { + pop$ + "none" + } { + #0 > { + "range" + } { + "single" + } if$ + } if$ * * + diagn.cmntlog +} + +FUNCTION {control.year.bib} +{ + "Control: year " + control.year + duplicate$ "(" swap$ int.to.str$ * ") " * swap$ + duplicate$ #0 < { + pop$ + "disabled!" + } { + #0 > { + "truncated" + } { + "verbatim" + } if$ + } if$ * * + diagn.cmntlog +} + +FUNCTION {control.eprint.bib} +{ + "Control: production of eprint " + control.eprint + duplicate$ "(" swap$ int.to.str$ * ") " * swap$ + #0 < { "disabled" } { "enabled" } if$ * * + diagn.cmntlog +} + +FUNCTION {control.bib} +{ + control.key.bib + control.author.bib + control.editor.bib + control.title.bib + control.pages.bib + control.year.bib + control.eprint.bib +} + +FUNCTION {init.state.consts} +{ + #0 'before.all := + #1 'after.word := + #2 'after.punctuation := + #3 'after.sentence := + #4 'after.block := + #0 'punctuation.no := + #1 'punctuation.space := + #2 'punctuation.yes := + "" 'bibfield := + "" 'output.bibfield := +} + +STRINGS { s t} +FUNCTION {block.punctuation} +{ "" + "," * +} + +FUNCTION {word.space} +{ + "\ " +} + +FUNCTION {show.stackstring.one}{ + "(" * + output.state int.to.str$ * + "," * punctuation.state int.to.str$ * + ")" * top$ + duplicate$ "1(" swap$ * ")" * top$ +} + +FUNCTION {show.stackstring.two}{ + "(" * + output.state int.to.str$ * + "," * punctuation.state int.to.str$ * + ")" * top$ + swap$ + duplicate$ "1(" swap$ * ")" * top$ + swap$ + duplicate$ "2(" swap$ * ")" * top$ +} + +FUNCTION {bibfield.command}{ "\bibfield "} + +FUNCTION {output.nonnull} +{ + swap$ + output.state after.word = + { + block.punctuation * + word.space * + } + { + output.state after.punctuation = + { + word.space * + } + { + output.state after.block = output.state after.sentence = or + { + add.period$ + "\EOS\ " * + }{ + } + if$ + } + if$ + } + if$ + output.bibfield duplicate$ empty$ 'pop$ + { + bibfield.command + " {" * swap$ * "} {" * swap$ * "}" * + } + if$ + write$ + bibfield 'output.bibfield := "" 'bibfield := + output.state after.block = + { + newline$ + "\newblock " write$ + } + 'skip$ + if$ + punctuation.state duplicate$ + punctuation.yes 'punctuation.state := + punctuation.no = + { pop$ before.all } + { punctuation.yes = { after.word }{ after.punctuation } if$ } + if$ + 'output.state := +} + +FUNCTION {output} +{ duplicate$ empty$ + { + pop$ + "" 'bibfield := + } + 'output.nonnull + if$ +} + +FUNCTION {output.nopunct} +{ + punctuation.no 'punctuation.state := + output.nonnull +} + +FUNCTION {output.check} +{ swap$ + duplicate$ empty$ + { pop$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ output.nonnull } + if$ +} + +FUNCTION {bbl.open} { "\BibitemOpen " } + +FUNCTION {bbl.shut} { "\BibitemShut " } + +FUNCTION {bibitem.shut.stop} { bbl.shut "{Stop}%" * } + +FUNCTION {bibitem.shut.nostop} { bbl.shut "{NoStop}%" * } + +FUNCTION {bibitem.shut} +{ + non.stop + { + bibitem.shut.nostop * + }{ + bibitem.shut.stop * + } + if$ +} + +FUNCTION {html.itag} { + "p" +} + +FUNCTION {html.ltag} { + "" +} + +FUNCTION {output.SLACcitation} +{ SLACcitation empty$ + 'skip$ + { + newline$ + SLACcitation write$ + } + if$ +} + +FUNCTION {fin.entry} +{ + bibitem.shut + write$ + output.SLACcitation +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.block.comma} +{ +} + +FUNCTION {new.sentence} +{ output.state after.block = output.state before.all = or + 'skip$ + { after.sentence 'output.state := } + if$ +} + +FUNCTION {new.sentence.comma} +{ +} + +FUNCTION {sentence.or.colon} +{ + new.sentence +} + +FUNCTION {add.blank} +{ + word.space * + before.all 'output.state := +} + +FUNCTION {no.blank.or.punct} +{ + "\hspace {0pt}" * + before.all 'output.state := +} + +FUNCTION {date.block} +{ + new.block.comma + skip$ +} + +STRINGS {z} +FUNCTION {remove.dots} +{ + control.author.dotless { + 'z := + "" + { z empty$ not } + { z #1 #1 substring$ + z #2 global.max$ substring$ 'z := + duplicate$ "." = 'pop$ + { * } + if$ + } + while$ + } 'skip$ if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ + duplicate$ empty$ + { pop$ "" } + { + "\emph {" swap$ * "}" * + } + if$ +} + +FUNCTION {bolden} +{ duplicate$ empty$ + { pop$ "" } + { "\textbf {" swap$ * "}" * } + if$ +} + +FUNCTION {bib.name.font} +{ + duplicate$ empty$ + { pop$ "" } + { + "\bibnamefont {" swap$ * "}" * + } + if$ +} + +FUNCTION {bib.fname.font} +{ + duplicate$ empty$ + { pop$ "" } + { + "\bibfnamefont {" swap$ * "}" * + } + if$ +} + +FUNCTION {cite.name.font} +{ + duplicate$ empty$ + { pop$ "" } + { + "\citenamefont {" swap$ * "}" * + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { word.space } + if$ + swap$ +} + +FUNCTION {capitalize} +{ + "u" change.case$ "t" change.case$ +} + +FUNCTION {space.word} +{ word.space swap$ * word.space * } + + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH + +FUNCTION {bbl.and} +{ + "and" +} + +FUNCTION {bbl.etal} +{ + "et~al." +} + +FUNCTION {bbl.editors} +{ + "eds." +} + +FUNCTION {bbl.editor} +{ + "ed." +} + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ + "ed." +} + +FUNCTION {bbl.volume} +{ + "vol." +} + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ + "no." +} + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ + "pp." +} + +FUNCTION {bbl.page} +{ + "p." +} + +FUNCTION {bbl.eidpp} +{ "pages" } + +FUNCTION {bbl.chapter} +{ + "chap." +} + +FUNCTION {bbl.techrep} +{ + "Tech. Rep." +} + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +FUNCTION {bbl.first} +{ + "1st" +} + +FUNCTION {bbl.second} +{ + "2nd" +} + +FUNCTION {bbl.third} +{ + "3rd" +} + +FUNCTION {bbl.fourth} +{ + "4th" +} + +FUNCTION {bbl.fifth} +{ + "5th" +} + +FUNCTION {bbl.st} +{ "st" } + +FUNCTION {bbl.nd} +{ "nd" } + +FUNCTION {bbl.rd} +{ "rd" } + +FUNCTION {bbl.th} +{ "th" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +FUNCTION {bbl.url.prefix} +{ + "\urlprefix " +} + +FUNCTION {eng.ord} +{ duplicate$ "1" swap$ * + #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ + duplicate$ "1" = + { pop$ bbl.st * } + { duplicate$ "2" = + { pop$ bbl.nd * } + { "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)] +MACRO {aa}{"Astron. \& Astrophys."} +MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."} +MACRO {aj} {"Astron. J."} +MACRO {aph} {"Acta Phys."} +MACRO {advp} {"Adv. Phys."} +MACRO {ajp} {"Amer. J. Phys."} +MACRO {ajm} {"Amer. J. Math."} +MACRO {amsci} {"Amer. Sci."} +MACRO {anofd} {"Ann. Fluid Dyn."} +MACRO {am} {"Ann. Math."} +MACRO {ap} {"Ann. Phys. (NY)"} +MACRO {adp} {"Ann. Phys. (Leipzig)"} +MACRO {ao} {"Appl. Opt."} +MACRO {apl} {"Appl. Phys. Lett."} +MACRO {app} {"Astroparticle Phys."} +MACRO {apj} {"Astrophys. J."} +MACRO {apjsup} {"Astrophys. J. Suppl."} +MACRO {apss} {"Astrophys. Space Sci."} +MACRO {araa} {"Ann. Rev. Astron. Astrophys."} +MACRO {baas} {"Bull. Amer. Astron. Soc."} +MACRO {baps} {"Bull. Amer. Phys. Soc."} +MACRO {cmp} {"Comm. Math. Phys."} +MACRO {cpam} {"Commun. Pure Appl. Math."} +MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"} +MACRO {cpc} {"Comp. Phys. Comm."} +MACRO {cqg} {"Class. Quant. Grav."} +MACRO {cra} {"C. R. Acad. Sci. A"} +MACRO {fed} {"Fusion Eng. \& Design"} +MACRO {ft} {"Fusion Tech."} +MACRO {grg} {"Gen. Relativ. Gravit."} +MACRO {ieeens} {"IEEE Trans. Nucl. Sci."} +MACRO {ieeeps} {"IEEE Trans. Plasma Sci."} +MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"} +MACRO {ip} {"Infrared Phys."} +MACRO {irp} {"Infrared Phys."} +MACRO {jap} {"J. Appl. Phys."} +MACRO {jasa} {"J. Acoust. Soc. America"} +MACRO {jcp} {"J. Comp. Phys."} +MACRO {jetp} {"Sov. Phys.--JETP"} +MACRO {jfe} {"J. Fusion Energy"} +MACRO {jfm} {"J. Fluid Mech."} +MACRO {jmp} {"J. Math. Phys."} +MACRO {jne} {"J. Nucl. Energy"} +MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."} +MACRO {jnm} {"J. Nucl. Mat."} +MACRO {jpc} {"J. Phys. Chem."} +MACRO {jpp} {"J. Plasma Phys."} +MACRO {jpsj} {"J. Phys. Soc. Japan"} +MACRO {jsi} {"J. Sci. Instrum."} +MACRO {jvst} {"J. Vac. Sci. \& Tech."} +MACRO {nat} {"Nature"} +MACRO {nature} {"Nature"} +MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"} +MACRO {nf} {"Nucl. Fusion"} +MACRO {nim} {"Nucl. Inst. \& Meth."} +MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."} +MACRO {np} {"Nucl. Phys."} +MACRO {npb} {"Nucl. Phys. B"} +MACRO {nt/f} {"Nucl. Tech./Fusion"} +MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"} +MACRO {inc} {"Nuovo Cimento"} +MACRO {nc} {"Nuovo Cimento"} +MACRO {pf} {"Phys. Fluids"} +MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."} +MACRO {pfb} {"Phys. Fluids B: Plasma Phys."} +MACRO {pl} {"Phys. Lett."} +MACRO {pla} {"Phys. Lett. A"} +MACRO {plb} {"Phys. Lett. B"} +MACRO {prep} {"Phys. Rep."} +MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"} +MACRO {pp} {"Phys. Plasmas"} +MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"} +MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"} +MACRO {prl} {"Phys. Rev. Lett."} +MACRO {pr} {"Phys. Rev."} +MACRO {physrev} {"Phys. Rev."} +MACRO {pra} {"Phys. Rev. A"} +MACRO {prb} {"Phys. Rev. B"} +MACRO {prc} {"Phys. Rev. C"} +MACRO {prd} {"Phys. Rev. D"} +MACRO {pre} {"Phys. Rev. E"} +MACRO {ps} {"Phys. Scripta"} +MACRO {procrsl} {"Proc. Roy. Soc. London"} +MACRO {rmp} {"Rev. Mod. Phys."} +MACRO {rsi} {"Rev. Sci. Inst."} +MACRO {science} {"Science"} +MACRO {sciam} {"Sci. Am."} +MACRO {sam} {"Stud. Appl. Math."} +MACRO {sjpp} {"Sov. J. Plasma Phys."} +MACRO {spd} {"Sov. Phys.--Doklady"} +MACRO {sptp} {"Sov. Phys.--Tech. Phys."} +MACRO {spu} {"Sov. Phys.--Uspeki"} +MACRO {st} {"Sky and Telesc."} + % End module: physjour.mbs + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{geojour.mbs}[2002/07/10 2.0h (PWD)] +MACRO {aisr} {"Adv. Space Res."} +MACRO {ag} {"Ann. Geophys."} +MACRO {anigeo} {"Ann. Geofis."} +MACRO {angl} {"Ann. Glaciol."} +MACRO {andmet} {"Ann. d. Meteor."} +MACRO {andgeo} {"Ann. d. Geophys."} +MACRO {andphy} {"Ann. Phys.-Paris"} +MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."} +MACRO {atph} {"Atm\'osphera"} +MACRO {aao} {"Atmos. Ocean"} +MACRO {ass}{"Astrophys. Space Sci."} +MACRO {atenv} {"Atmos. Environ."} +MACRO {aujag} {"Aust. J. Agr. Res."} +MACRO {aumet} {"Aust. Meteorol. Mag."} +MACRO {blmet} {"Bound.-Lay. Meteorol."} +MACRO {bams} {"Bull. Amer. Meteorol. Soc."} +MACRO {cch} {"Clim. Change"} +MACRO {cdyn} {"Clim. Dynam."} +MACRO {cbul} {"Climatol. Bull."} +MACRO {cap} {"Contrib. Atmos. Phys."} +MACRO {dsr} {"Deep-Sea Res."} +MACRO {dhz} {"Dtsch. Hydrogr. Z."} +MACRO {dao} {"Dynam. Atmos. Oceans"} +MACRO {eco} {"Ecology"} +MACRO {empl}{"Earth, Moon and Planets"} +MACRO {envres} {"Environ. Res."} +MACRO {envst} {"Environ. Sci. Technol."} +MACRO {ecms} {"Estuarine Coastal Mar. Sci."} +MACRO {expa}{"Exper. Astron."} +MACRO {geoint} {"Geofis. Int."} +MACRO {geopub} {"Geofys. Publ."} +MACRO {geogeo} {"Geol. Geofiz."} +MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."} +MACRO {gfd} {"Geophys. Fluid Dyn."} +MACRO {geomag} {"Geophys. Mag."} +MACRO {georl} {"Geophys. Res. Lett."} +MACRO {grl} {"Geophys. Res. Lett."} +MACRO {ga} {"Geophysica"} +MACRO {gs} {"Geophysics"} +MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."} +MACRO {ijawp} {"Int. J. Air Water Pollut."} +MACRO {ijc} {"Int. J. Climatol."} +MACRO {ijrs} {"Int. J. Remote Sens."} +MACRO {jam} {"J. Appl. Meteorol."} +MACRO {jaot} {"J. Atmos. Ocean. Technol."} +MACRO {jatp} {"J. Atmos. Terr. Phys."} +MACRO {jastp} {"J. Atmos. Solar-Terr. Phys."} +MACRO {jce} {"J. Climate"} +MACRO {jcam} {"J. Climate Appl. Meteor."} +MACRO {jcm} {"J. Climate Meteor."} +MACRO {jcy} {"J. Climatol."} +MACRO {jgr} {"J. Geophys. Res."} +MACRO {jga} {"J. Glaciol."} +MACRO {jh} {"J. Hydrol."} +MACRO {jmr} {"J. Mar. Res."} +MACRO {jmrj} {"J. Meteor. Res. Japan"} +MACRO {jm} {"J. Meteor."} +MACRO {jpo} {"J. Phys. Oceanogr."} +MACRO {jra} {"J. Rech. Atmos."} +MACRO {jaes} {"J. Aeronaut. Sci."} +MACRO {japca} {"J. Air Pollut. Control Assoc."} +MACRO {jas} {"J. Atmos. Sci."} +MACRO {jmts} {"J. Mar. Technol. Soc."} +MACRO {jmsj} {"J. Meteorol. Soc. Japan"} +MACRO {josj} {"J. Oceanogr. Soc. Japan"} +MACRO {jwm} {"J. Wea. Mod."} +MACRO {lao} {"Limnol. Oceanogr."} +MACRO {mwl} {"Mar. Wea. Log"} +MACRO {mau} {"Mausam"} +MACRO {meteor} {"``Meteor'' Forschungsergeb."} +MACRO {map} {"Meteorol. Atmos. Phys."} +MACRO {metmag} {"Meteor. Mag."} +MACRO {metmon} {"Meteor. Monogr."} +MACRO {metrun} {"Meteor. Rundsch."} +MACRO {metzeit} {"Meteor. Z."} +MACRO {metgid} {"Meteor. Gidrol."} +MACRO {mwr} {"Mon. Weather Rev."} +MACRO {nwd} {"Natl. Weather Dig."} +MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."} +MACRO {npg} {"Nonlin. Proc. Geophys."} +MACRO {om} {"Oceanogr. Meteorol."} +MACRO {ocac} {"Oceanol. Acta"} +MACRO {oceanus} {"Oceanus"} +MACRO {paleoc} {"Paleoceanography"} +MACRO {pce} {"Phys. Chem. Earth"} +MACRO {pmg} {"Pap. Meteor. Geophys."} +MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."} +MACRO {physzeit} {"Phys. Z."} +MACRO {pps} {"Planet. Space Sci."} +MACRO {pss} {"Planet. Space Sci."} +MACRO {pag} {"Pure Appl. Geophys."} +MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."} +MACRO {quatres} {"Quat. Res."} +MACRO {rsci} {"Radio Sci."} +MACRO {rse} {"Remote Sens. Environ."} +MACRO {rgeo} {"Rev. Geophys."} +MACRO {rgsp} {"Rev. Geophys. Space Phys."} +MACRO {rdgeo} {"Rev. Geofis."} +MACRO {revmeta} {"Rev. Meteorol."} +MACRO {sgp}{"Surveys in Geophys."} +MACRO {sp} {"Solar Phys."} +MACRO {ssr} {"Space Sci. Rev."} +MACRO {tellus} {"Tellus"} +MACRO {tac} {"Theor. Appl. Climatol."} +MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"} +MACRO {wrr} {"Water Resour. Res."} +MACRO {weather} {"Weather"} +MACRO {wafc} {"Weather Forecast."} +MACRO {ww} {"Weatherwise"} +MACRO {wmob} {"WMO Bull."} +MACRO {zeitmet} {"Z. Meteorol."} + % End module: geojour.mbs + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)] + +MACRO {appopt} {"Appl. Opt."} +MACRO {bell} {"Bell Syst. Tech. J."} +MACRO {ell} {"Electron. Lett."} +MACRO {jasp} {"J. Appl. Spectr."} +MACRO {jqe} {"IEEE J. Quantum Electron."} +MACRO {jlwt} {"J. Lightwave Technol."} +MACRO {jmo} {"J. Mod. Opt."} +MACRO {josa} {"J. Opt. Soc. America"} +MACRO {josaa} {"J. Opt. Soc. Amer.~A"} +MACRO {josab} {"J. Opt. Soc. Amer.~B"} +MACRO {jdp} {"J. Phys. (Paris)"} +MACRO {oc} {"Opt. Commun."} +MACRO {ol} {"Opt. Lett."} +MACRO {phtl} {"IEEE Photon. Technol. Lett."} +MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."} +MACRO {sse} {"Solid-State Electron."} +MACRO {sjot} {"Sov. J. Opt. Technol."} +MACRO {sjqe} {"Sov. J. Quantum Electron."} +MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."} +MACRO {stph} {"Sov. Phys.--Techn. Phys."} +MACRO {stphl} {"Sov. Techn. Phys. Lett."} +MACRO {vr} {"Vision Res."} +MACRO {zph} {"Z. f. Physik"} +MACRO {zphb} {"Z. f. Physik~B"} +MACRO {zphd} {"Z. f. Physik~D"} + +MACRO {CLEO} {"CLEO"} +MACRO {ASSL} {"Adv. Sol.-State Lasers"} +MACRO {OSA} {"OSA"} + % End module: photjour.mbs +%% Copyright 1994-2007 Patrick W Daly +MACRO {acmcs} {"ACM Comput. Surv."} +MACRO {acta} {"Acta Inf."} +MACRO {cacm} {"Commun. ACM"} +MACRO {ibmjrd} {"IBM J. Res. Dev."} +MACRO {ibmsj} {"IBM Syst.~J."} +MACRO {ieeese} {"IEEE Trans. Software Eng."} +MACRO {ieeetc} {"IEEE Trans. Comput."} +MACRO {ieeetcad} + {"IEEE Trans. Comput. Aid. Des."} +MACRO {ipl} {"Inf. Process. Lett."} +MACRO {jacm} {"J.~ACM"} +MACRO {jcss} {"J.~Comput. Syst. Sci."} +MACRO {scp} {"Sci. Comput. Program."} +MACRO {sicomp} {"SIAM J. Comput."} +MACRO {tocs} {"ACM Trans. Comput. Syst."} +MACRO {tods} {"ACM Trans. Database Syst."} +MACRO {tog} {"ACM Trans. Graphic."} +MACRO {toms} {"ACM Trans. Math. Software"} +MACRO {toois} {"ACM Trans. Office Inf. Syst."} +MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} +MACRO {tcs} {"Theor. Comput. Sci."} + +MACRO {jhep} {"J. High Energy Phys."} +MACRO {jcap} {"J. Cosmol. Astropart. Phys."} +MACRO {jinst} {"J. Instrum."} +MACRO {jstat} {"J. Stat. Mech.: Theory Exp."} + +FUNCTION {bibinfo.command} { "\bibinfo " } + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ + pop$ "" + }{ + duplicate$ empty$ + { + swap$ pop$ + }{ + swap$ + bibinfo.command "{" * swap$ * "} {" * swap$ * "}" * + } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + }{ + duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + }{ + swap$ + bibinfo.command " {" * swap$ * "} {" * swap$ * "}" * + } + if$ + } + if$ +} + +FUNCTION {archiv.base} +{ + "https://arxiv.org/abs" +} + +FUNCTION {archiv.prefix.base} +{ + "arXiv" +} + +FUNCTION {eprint.command} +{ + "\Eprint " +} + +FUNCTION {format.eprint.controlled} +{ + eprint duplicate$ empty$ + control.eprint #1 = + or + { pop$ "" } + { + duplicate$ + "" + archive duplicate$ empty$ { pop$ archiv.base } 'skip$ if$ * + "/" * + swap$ * + "{" swap$ * "} " * + swap$ + "" + archivePrefix duplicate$ empty$ { pop$ "" } { ":" * } if$ * + swap$ * + primaryClass duplicate$ empty$ { pop$ "" } { " [" swap$ * "]" * } if$ * + "{" swap$ * "} " * + * + eprint.command swap$ * + } + if$ +} + +FUNCTION {format.eprint} +{ + eprint duplicate$ empty$ + { pop$ "" } + { + duplicate$ + "" + archive duplicate$ empty$ { pop$ archiv.base } 'skip$ if$ * + "/" * + swap$ * + "{" swap$ * "} " * + swap$ + "" + archivePrefix duplicate$ empty$ { pop$ "" } { ":" * } if$ * + swap$ * + primaryClass duplicate$ empty$ { pop$ "" } { " [" swap$ * "]" * } if$ * + "{" swap$ * "} " * + * + eprint.command swap$ * + } + if$ +} + +FUNCTION {format.translation} +{ translation duplicate$ empty$ + 'skip$ + { "" + "\translation{" * swap$ * "}" * + punctuation.space 'punctuation.state := + } + if$ +} + +FUNCTION {format.url} +{ + url duplicate$ empty$ + { pop$ "" } + { + "\url " + "{" * swap$ * "}" * + } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {check.speaker} +{ key empty$ 'skip$ + { key nameptr int.to.str$ = + { + bolden + } + 'skip$ + if$ + } + if$ +} + +STRINGS { bibinfo} + +FUNCTION {format.names.fname} +{ + control.author.initials { + control.author.dotless { + control.author.nospace { + "f{}" + } { + "f{~}" + } if$ + } { + control.author.nospace { + "f{.}." + } { + "f." + } if$ + } if$ + } { + "ff" + } if$ +} + +FUNCTION {bracify} +{ + "{" swap$ * "}" * +} + +FUNCTION {name.comma} +{ + control.author.nocomma 'skip$ { "," swap$ * } if$ +} + +FUNCTION {format.names.format.onefont} +{ + "{vv~}{ll}" + nameptr #1 > + control.author.first + and + control.author.reversed not + or + { + control.author.initials { + "f" + control.author.dotless 'skip$ { + "." * + } if$ + "~" * + } { + "ff" + } if$ + bracify + swap$ + } { + format.names.fname + " " swap$ * + name.comma + bracify + } + if$ + "jj" + " " swap$ * + name.comma + bracify + control.author.jnrlst 'skip$ 'swap$ if$ + * * +} + +FUNCTION {format.names.onefont} +{ + s nameptr format.names.format.onefont format.name$ + remove.dots + bib.name.font +} + +FUNCTION {format.names.morfont} +{ s nameptr + "{vv~}{ll}" format.name$ bib.name.font + nameptr #1 > + control.author.first + and + control.author.reversed not + or + { + s nameptr + control.author.initials { + "f" % default: name + surname + comma junior + } { + "ff" + } if$ + control.author.dotless 'skip$ { + "." * % nm-init % Initials. + surname (J. F. Smith) control.author.initials + } if$ + bracify + format.name$ duplicate$ empty$ 'skip$ + { tie.or.space.prefix bib.fname.font swap$ * } + if$ + swap$ + * + s nameptr + "{jj}" format.name$ duplicate$ empty$ 'skip$ + { bib.fname.font ", " swap$ * } + if$ + } { + "," * + s nameptr + format.names.fname + "jj" + " " + name.comma + control.author.jnrlst { + swap$ * skip$ + } { + skip$ * swap$ + } if$ + bracify swap$ bracify swap$ + * + format.name$ + remove.dots + duplicate$ empty$ 'skip$ + { bib.fname.font " " swap$ * } + if$ + } if$ + * +} + +FUNCTION {names.punctuate} +{ + "," * + " " * +} +%<*!aipauth&!apsrmp> + +FUNCTION {names.comma} +{ + "," * +} +%</!aipauth&!apsrmp> + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ { pop$ "" } { + duplicate$ num.names$ + duplicate$ 'numnames := + 'namesleft := + 's := + #1 'nameptr := + "" + { namesleft #0 > } + { + format.names.morfont + bibinfo bibinfo.check + type$ "presentation" = + 'check.speaker + 'skip$ + if$ + 't := + nameptr #1 > not + { + t * + } { + namesleft #1 > + { + names.punctuate + t * + } { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ +%<*!apsrmp> + numnames #2 > +%<!aipauth> 'names.comma +%<aipauth> 'names.punctuate + 'skip$ + if$ +%</!apsrmp> +%<apsrmp> names.punctuate + t "others" = + { + " " * + bbl.etal + emphasize + * + } { + bbl.and +%<aapmrev> space.word * +%<aipauth> word.space * * +%<aipnum> space.word * +%<apsrev> space.word * +%<apsrmp> word.space * * + t * + } + if$ + } + if$ + } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + +FUNCTION {format.names.ed.onefont} +{ + s nameptr + control.author.initials { + control.author.dotless { + control.author.nospace { + "{f{}~}{vv~}{ll}{ jj}" % nm-rvx|nm-rvcx + } { + "{f{~}~}{vv~}{ll}{ jj}" % nm-rv + } if$ + } { + control.author.nospace { + "{f{.}.~}{vv~}{ll}{ jj}" % nm-rvv|nm-rvvc + }{ + "{f.~}{vv~}{ll}{, jj}" % nm-init|nm-rev|nm-rev1 + } if$ + } if$ + } { + "{ff~}{vv~}{ll}{, jj}" + } if$ + format.name$ + remove.dots + bib.name.font +} + +FUNCTION {format.names.ed.morfont} +{ + control.author.reversed { % + control.author.initials { % + control.author.dotless { % + s nameptr + control.author.nospace { % nm-rvx nm-rvcx + "{f{}}" + } { % nm-rv + "{f{~}}" + } if$ + format.name$ duplicate$ empty$ 'skip$ + { tie.or.space.prefix bib.fname.font swap$ * } + if$ + s nameptr + "{vv~}{ll}" format.name$ bib.name.font * + s nameptr + "{jj}" format.name$ + remove.dots + duplicate$ empty$ 'skip$ + { bib.fname.font " " swap$ * } + if$ + } { % !control.author.dotless + s nameptr + control.author.nospace { % nm-rvv + "{ff}" + } { % nm-rev nm-rev1 + "{f.}" + } if$ + format.name$ duplicate$ empty$ 'skip$ + { tie.or.space.prefix bib.fname.font swap$ * } + if$ + s nameptr + "{vv~}{ll}" format.name$ bib.name.font * + s nameptr + "{jj}" format.name$ + duplicate$ empty$ 'skip$ + { bib.fname.font ", " swap$ * } + if$ + } if$ + } { % Full names !control.author.initials nm-revf nm-revv1 + s nameptr + "{ff}" + format.name$ duplicate$ empty$ 'skip$ + { tie.or.space.prefix bib.fname.font swap$ * } + if$ + s nameptr + "{vv~}{ll}" format.name$ bib.name.font * + s nameptr + "{jj}" format.name$ + duplicate$ empty$ 'skip$ + { bib.fname.font ", " swap$ * } + if$ + } if$ + } { % !control.author.reversed nm-init + s nameptr + "{f.}" + format.name$ duplicate$ empty$ 'skip$ + { tie.or.space.prefix bib.fname.font swap$ * } + if$ + s nameptr + "{vv~}{ll}" format.name$ bib.name.font * + s nameptr + "{jj}" format.name$ + duplicate$ empty$ 'skip$ + { bib.fname.font ", " swap$ * } + if$ + } if$ + * +} + +FUNCTION {format.names.ed} +{ + control.editor #0 > { + format.names + } { + 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { + format.names.ed.morfont + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { + names.punctuate + t * + }{ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + numnames #2 > +%<aapmrev> 'names.comma +%<aipauth> 'names.punctuate +%<aipnum> 'names.comma +%<apsrev> 'names.comma +%<apsrmp> 'names.punctuate + 'skip$ + if$ + t "others" = + { + " " * bbl.etal emphasize * + }{ + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ + } if$ +} + +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +FUNCTION {format.authors} +{ author "author" format.names + duplicate$ empty$ 'skip$ + { collaboration "collaboration" bibinfo.check + duplicate$ empty$ 'skip$ + { " (" swap$ * ")" * } + if$ + * + } + if$ + "author" 'bibfield := +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ +} + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + "," * + word.space * + get.bbl.editor +%<apsrmp> capitalize + * + } + if$ +} + +FUNCTION {format.isbn.output} +{ +} + +FUNCTION {format.issn.output} +{ +} + +FUNCTION {doi.base} +{ + "https://doi.org/" +} + +FUNCTION {doi.base.command} +{ + "\doibase " +} + +FUNCTION {noop.command} +{ + "\href@noop " +} + +FUNCTION {href.command} +{ + "\href " +} + +FUNCTION {link.tag.open} +{ + doi duplicate$ empty$ + { + pop$ + url duplicate$ empty$ + { + pop$ "" noop.command + }{ + href.command + } + if$ + } + { + "https://doi.org/" swap$ * + href.command + } + if$ + "{" * swap$ * "} {" * +} + +FUNCTION {link.tag.shut} +{ + "}" +} + +FUNCTION {link.open} +{ + link.tag.open output.nopunct +} + +FUNCTION {link.shut} +{ + link.tag.shut * +} + +FUNCTION {add.doi} +{ + link.tag.open swap$ * link.tag.shut * +} + +FUNCTION {select.language} +{ duplicate$ empty$ + 'pop$ + { language empty$ + 'skip$ + { "{\selectlanguage {" language * "}" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { + output.state after.word = output.state after.punctuation = or + { "l" } + { "u" } + if$ change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {bbl.enquote} +{ + "\enquote " +} + +FUNCTION {string.enquote} +{ + punctuation.no 'punctuation.state := + non.stop { + block.punctuation + } { "" } if$ + swap$ pop$ + * + bbl.enquote "{" * swap$ * "}" * + word.space * +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ { "t" change.case$ } if$ + duplicate$ "title" bibinfo.check swap$ + duplicate$ empty$ 'pop$ + { + punctuation.yes 'punctuation.state := +%<!apsrev> string.enquote +%<apsrev> pop$ + select.language + } + if$ +} + +FUNCTION {end.quote.title} +{ title empty$ + 'skip$ + { before.all 'output.state := } + if$ +} + +FUNCTION {format.name.apply} +{ + s nameptr + "{vv~}{ll}" + format.name$ + cite.name.font +} + +FUNCTION {format.full.names} +{ + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { format.name.apply + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { + 't := + } + 'pop$ + if$ + t "others" = + { + " " * bbl.etal + emphasize * + }{ + numnames #2 > { "," * }{ skip$ } if$ + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {make.full.names} +{ + key editor author + type$ "proceedings" = + type$ "book" = + type$ "inbook" = + or { pop$ }{ { pop$ "" }{ swap$ pop$ "" swap$ } if$ } if$ + duplicate$ empty$ + { pop$ + duplicate$ empty$ + { pop$ + duplicate$ empty$ + { pop$ + cite$ #1 #3 substring$ + }{ + skip$ + } + if$ + } + { swap$ pop$ format.full.names } + if$ + } + { swap$ pop$ swap$ pop$ format.full.names } + if$ +} + +FUNCTION {year.bibitem} +{ + year duplicate$ empty$ + { pop$ "" +%<apsrmp> "????" * + }{ + skip$ + } if$ + extra.label * +} + +FUNCTION {output.bibitem} +{ + newline$ + "" + label + * ")" * + make.full.names duplicate$ short.list = + { pop$ }{ * } if$ + bracify + "[" swap$ * "]" * + cite$ bracify "%" * + * + "\bibitem " + swap$ * + write$ newline$ + " " + duplicate$ bbl.open * write$ newline$ + before.all 'output.state := + punctuation.yes 'punctuation.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + }{ + { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + }{ + t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ + bbl.in + word.space * +} + +%<!apsrev>FUNCTION {date.encapsulate} +%<apsrev>FUNCTION {parenthesize} +{ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + " (" swap$ * ")" * + } + if$ +} + +FUNCTION {format.date} +{ + year "year" bibinfo.check duplicate$ empty$ + { +%<*apsrmp> + "empty year in " cite$ * "; set to ????" * warning$ + pop$ "????" +%</apsrmp> + } + 'skip$ + if$ + extra.label * +%<!apsrev> date.encapsulate +%<apsrev> parenthesize +} + +FUNCTION {format.date.output.check} +{ + format.date + "year" output.check +} + +FUNCTION {format.date.output} +{ + format.date.output.check +} + +FUNCTION {format.btitle} +{ + booktitle duplicate$ empty$ { pop$ + title + } 'skip$ if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + emphasize + select.language + } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {editor.check.book} +{ editor empty$ 'skip$ + { + "can't use both author and editor fields in " cite$ * + ": try using @inbook instead" * + warning$ + } + if$ +} + +FUNCTION {format.bvolume} +{ volume duplicate$ empty$ + { pop$ "" } + { + "volume and number" number either.or.check + bbl.volume + capitalize + swap$ + tie.or.space.prefix "volume" bibinfo.check * * + series "series" bibinfo.check duplicate$ empty$ 'pop$ + { + ", " + * swap$ * + } + if$ + } + if$ +} + +FUNCTION {format.number} +{ + bbl.number + output.state after.word = output.state after.punctuation = or + #1 or + #0 and + 'skip$ + { capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { + series empty$ + { + number "number" bibinfo.check + }{ + format.number + series "series" bibinfo.check + word.space * swap$ * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +FUNCTION {convert.edition} +{ extract.num "l" change.case$ 's := + s "first" = s "1" = or + { bbl.first 't := } + { s "second" = s "2" = or + { bbl.second 't := } + { s "third" = s "3" = or + { bbl.third 't := } + { s "fourth" = s "4" = or + { bbl.fourth 't := } + { s "fifth" = s "5" = or + { bbl.fifth 't := } + { s #1 #1 substring$ is.num + { s + eng.ord + 't := } + { edition 't := } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + t +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + convert.edition + output.state after.word = output.state after.punctuation = or + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + word.space * bbl.edition * + } + if$ +} + +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages duplicate$ empty$ + 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + }{ + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} + +FUNCTION {first.page} +{ 't := + "" + { t empty$ not t #1 #1 substring$ "-" = not and } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + while$ +} + +FUNCTION {format.book.pages} +{ + pages duplicate$ empty$ 'skip$ + { + "pages" bibinfo.check word.space bbl.pages * * + } + if$ +} + +FUNCTION {volnum.punct} +{ + "," + word.space * +} + +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { volnum.punct * + swap$ + control.pages duplicate$ #0 < { + pop$ pop$ + }{ + #0 > + { + n.dashify + }{ + first.page + } if$ + } if$ + "pages" bibinfo.check + * + } + if$ + } + if$ +} + +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { volnum.punct * } + if$ + swap$ * + } + if$ +} + +FUNCTION {eid.or.pages} +{ + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ +} + +FUNCTION {format.ser.vol.num} +{ + series "series" bibinfo.check output + volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + bolden +%<*apsrmp> + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "~(" swap$ * ")" * + } + if$ * +%</apsrmp> +} + +%<*apsrev> +FUNCTION {format.vol.num} +{ + volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + bolden +} + +%</apsrev> +FUNCTION {format.chapter.pages} +{ chapter empty$ + { +%<!apsrmp> format.pages +%<apsrmp> "" + } + { type empty$ + { + bbl.chapter + capitalize + }{ + type + capitalize + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * +%<*!apsrmp> + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ +%</!apsrmp> + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle duplicate$ "booktitle" bibinfo.check swap$ + duplicate$ empty$ 'pop$ + { + punctuation.yes 'punctuation.state := + pop$ emphasize + select.language + } + if$ +} + +FUNCTION {format.editor.in} +{ + editor "editor" format.names.ed duplicate$ empty$ 'skip$ + { + bbl.edby + word.space * swap$ * + } + if$ +} + +FUNCTION {output.article.booktitle} +{ + format.booktitle + "booktitle" 'bibfield := + output + bookaddress "address" bibinfo.check duplicate$ empty$ 'pop$ + { + "address" 'bibfield := + output.nonnull after.punctuation 'output.state := + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ + format.booktitle duplicate$ empty$ 'pop$ + { + add.doi + word.in swap$ * output.nonnull + bookaddress "address" bibinfo.check output + format.number.series "series and number" bibinfo.check output + format.bvolume output + format.editor.in "editor" bibinfo.check output + } + if$ +} + +FUNCTION {format.in.ed.booktitle.inbook} +{ + format.booktitle duplicate$ empty$ 'pop$ + { + add.doi + word.in swap$ * output.nonnull + bookaddress "address" bibinfo.check output + format.number.series "series and number" bibinfo.check output + format.bvolume output + author empty$ 'skip$ + { format.editor.in "editor" bibinfo.check output } + if$ + } + if$ +} + +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} + +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} + +FUNCTION {format.article.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} + +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} + +FUNCTION {format.org.or.pub} +{ 't := + "" + address "address" bibinfo.check + duplicate$ empty$ + { pop$ t } + { t duplicate$ empty$ + { pop$ } + { + "," word.space * + * swap$ * + } + if$ + } + if$ + * +%<*!apsrmp> + year duplicate$ empty$ + { + "empty year in " cite$ * + warning$ + pop$ "" + } + 'skip$ + if$ + duplicate$ empty$ + { pop$ } + { + "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { + "," * + word.space * + swap$ * + } + if$ + } + if$ +%</!apsrmp> + duplicate$ empty$ 'skip$ { + "" + "(" * swap$ * ")" * + after.punctuation 'output.state := + punctuation.space 'punctuation.state := + } if$ +} + +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {format.organization.publisher.address} +{ + publisher empty$ + { format.organization.address } + { organization "organization" bibinfo.check output + format.publisher.address + } + if$ +} + +FUNCTION {format.school.address.output} +{ + school "school" bibinfo.warn + address "address" bibinfo.check + duplicate$ empty$ 'skip$ + { + swap$ + duplicate$ empty$ 'skip$ + { + ", " * + } + if$ + swap$ + } + if$ + * +%<apsrmp> duplicate$ empty$ 'skip$ { "(" swap$ * ")" * } if$ after.punctuation 'output.state := + output +} + +FUNCTION {article.title.produce} +{ + control.title duplicate$ #0 < + { pop$ + }{ + format.title + "title" 'bibfield := + swap$ #0 > + { + "title" output.check + }{ + output + } if$ + new.block.comma + } if$ +} + +FUNCTION {control} +{ +} + +FUNCTION {article} +{ output.bibitem + format.authors + booktitle empty$ { + "author" output.check + }{ output } if$ + author format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + article.title.produce + output.article.booktitle + crossref missing$ +%<apsrev>%% Handle special case of SISSA journals which require an issue number for unique citations and use volume/year interchangably + { +%<*!apsrev> + link.open + journal + "journal" bibinfo.warn + "journal" 'bibfield := + output + add.blank + format.ser.vol.num + output + eid.or.pages +%<!apsrmp> format.date.output.check + pages empty$ { + doi output + } 'skip$ if$ + link.shut +%</!apsrev> +%<*apsrev> + journal "J. High Energy Phys." = + journal "J. High Energ. Phys." = or + journal "JHEP" = or + journal "Journal of Cosmology and Astroparticle Physics" = or + journal "J. Cosmol. Astropart. Phys." = or + journal "JCAP" = or + journal "Journal of Instrumentation" = or + journal "J. Instrum." = or + journal "JINST" = or + journal "Journal of Statistical Mechanics" = or + journal "J. of Stat. Mech." = or + journal "J. Stat. Mech.: Theory Exp." = or + journal "JSTAT" = or + { + link.open + journal + "journal" bibinfo.warn + "journal" 'bibfield := + output + add.blank + format.vol.num output + number parenthesize + "number" bibinfo.warn + "number" 'bibfield := + output + eid.or.pages + link.shut + } + { + eid missing$ + pages missing$ and + doi missing$ not and + { + journal + "journal" bibinfo.warn + "journal" 'bibfield := + output + add.blank + format.ser.vol.num + output + link.open + doi output + link.shut + format.date.output.check + } + { + link.open + journal + "journal" bibinfo.warn + "journal" 'bibfield := + output + add.blank + format.ser.vol.num + output + eid.or.pages + format.date.output.check + link.shut + } if$ + } if$ +%</apsrev> + }{ + format.article.crossref output.nonnull +%<!apsrmp> format.pages output +%<apsrmp> eid.or.pages + } + if$ +%<!apsrev&!apsrmp> format.issn.output + new.block.comma + new.sentence.comma + format.note output + format.eprint.controlled output + format.translation output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { + format.editors "author and editor" output.check + editor format.key output + }{ + format.authors output.nonnull +%% crossref missing$ { editor.check.book } 'skip$ if$ + } + if$ +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + link.open + format.btitle + "title" output.check + link.shut + format.edition output + author empty$ + { + } + { + format.editor.in output + editor format.key output + } + if$ + format.number.series output + crossref missing$ + { + format.bvolume output + new.block.comma + format.publisher.address output + }{ + new.block.comma + format.book.crossref output.nonnull +%<!apsrmp> format.date.output.check + } + if$ + format.isbn.output + format.chapter.pages + output + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + author format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output date.block + link.open + format.title + "title" output.check + link.shut + new.block.comma + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output +%<!apsrmp> format.date.output + format.isbn.output + format.book.pages output + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {footnote} +{ output.bibitem + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { + format.editors "editor" output.check + editor format.key output + }{ + format.authors output.nonnull + author format.key output + } + if$ +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + + format.title output + new.block.comma + + crossref missing$ + { + format.in.ed.booktitle.inbook +%<!apsrmp> format.publisher.address output + format.chapter.pages +%<!apsrmp> "chapter and pages" +%<apsrmp> "chapter" + output.check + new.block.comma + format.edition output + new.block.comma +%<apsrmp> format.publisher.address output + }{ + format.chapter.pages +%<!apsrmp> "chapter and pages" +%<apsrmp> "chapter" + output.check + new.block.comma + format.book.crossref output.nonnull +%<!apsrmp> format.date.output.check + } + if$ + crossref missing$ + { format.isbn.output } + 'skip$ + if$ +%<apsrmp> format.pages "pages" output.check + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + author format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + article.title.produce + crossref missing$ + { + format.in.ed.booktitle +%<!apsrmp> format.publisher.address output + format.edition output + format.chapter.pages output +%<apsrmp> format.publisher.address output + format.isbn.output + }{ + format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ +%<apsrmp> format.pages "pages" output.check + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + author format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + article.title.produce + crossref missing$ + { + format.in.ed.booktitle + format.organization.publisher.address output +%<!apsrmp> format.chapter.pages output + format.isbn.output + format.issn.output + }{ + format.incoll.inproc.crossref output.nonnull +%<!apsrmp> format.chapter.pages output + } + if$ +%<apsrmp> format.chapter.pages "chapter and pages" output.check +%<apsrmp> format.pages "pages" output.check + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + format.authors output + author format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output date.block + link.open + format.btitle + "title" output.check + link.shut + organization "organization" bibinfo.check output + address "address" bibinfo.check output + format.edition output +%<!apsrmp> format.date.output + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + format.btitle + output + new.block.comma + link.open + bbl.mthesis + format.thesis.type + output.nonnull + link.shut + format.school.address.output +%<!apsrmp> format.date.output.check + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + author format.key output +%<apsrmp> format.date.output +%<!apsrmp> new.block.comma +%<apsrmp> date.block + link.open + format.title + output + link.shut + new.block.comma + howpublished "howpublished" bibinfo.check output +%<!apsrmp> format.date.output + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + format.btitle + output + new.block.comma + link.open + bbl.phdthesis + format.thesis.type + output.nonnull + link.shut + format.school.address.output +%<!apsrmp> format.date.output.check + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {presentation} +{ output.bibitem + format.authors output + author format.key output + new.block.comma + link.open + format.title + output + link.shut + new.block.comma + format.organization.address "organization and address" output.check + month "month" output.check + year "year" output.check + new.block.comma + new.sentence.comma + format.note output + new.sentence + type missing$ 'skip$ + {"(" type capitalize * ")" * output} + if$ + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + format.editors output + editor format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + link.open + format.btitle + "title" output.check + link.shut + bookaddress "address" bibinfo.check output + format.number.series output + format.bvolume output + format.organization.publisher.address output + format.isbn.output + format.issn.output + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + author format.key output +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output.check date.block + link.open +%<!apsrev&!apsrmp> format.title +%<apsrev|apsrmp> format.btitle + "title" output.check + link.shut + new.block.comma + format.tr.number + output.nonnull + institution "institution" bibinfo.warn + format.org.or.pub output + new.block.comma + new.sentence.comma + format.note output + format.eprint output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + author format.key output +%<*!apsrev> +%<!apsrmp> new.block.comma +%<apsrmp> format.date.output date.block + link.open + format.title + "title" output.check + link.shut +%</!apsrev> +%<*apsrev> + article.title.produce + format.eprint output +%</apsrev> +%<!apsrmp> format.date.output + new.block.comma + new.sentence.comma + format.note "note" output.check +%<!apsrev> format.eprint output + fin.entry +} + +FUNCTION {dataset} +{ + output.bibitem + format.authors "author" output.check + author format.key output +%<apsrmp> format.date.output date.block + article.title.produce + doi missing$ + url missing$ not and + { + link.open + url "url" output.check + link.shut + } + { + link.open + doi "doi" output.check + link.shut + } if$ +%<!apsrmp> format.date.output + format.note output + fin.entry +} + +FUNCTION {default.type} { misc } + +READ + +EXECUTE {control.init} + +ITERATE {control.pass} + +EXECUTE {control.check} + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {cite.name.font.apply} +{ + word.space * bbl.etal + emphasize + * +} + +%<*!apsrev&!apsrmp> +FUNCTION {format.lab.names} +{ 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { + format.name.apply + 't := + nameptr #1 > + { + nameptr + #2 + = + numnames + #3 + > and + { + "others" 't := + #1 'namesleft := + } + 'skip$ + if$ + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + cite.name.font.apply + }{ + numnames #2 > { "," * } 'skip$ if$ + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +%</!apsrev&!apsrmp> +%<*apsrev|apsrmp> +FUNCTION {format.lab.names} +{ 's := + "" 't := + #1 'nameptr := + format.name.apply + s num.names$ duplicate$ + #2 > + { pop$ + cite.name.font.apply + }{ + #2 < + 'skip$ + { + s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + cite.name.font.apply + }{ + bbl.and space.word * + s #2 "{vv~}{ll}" format.name$ + cite.name.font + * + } + if$ + } + if$ + } + if$ +} + +%</apsrev|apsrmp> +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.label + 'author.key.label + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ + calc.short.authors + short.list + year duplicate$ empty$ +%<apsrev|apsrmp> short.list key field.or.null = or + { + pop$ "" +%<apsrmp> "????" * + }{ + control.year #0 > { purify$ #-1 #4 substring$ } 'skip$ if$ + } + if$ + "(" swap$ * + * 'label := +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ll{ }}" + control.author.initials { + "{ f{ }}" * + }{ + "{ ff{ }}" * + } if$ + "{ jj{ }}" * + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" * } + { + t sortify * + } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {year.sort.key} +{ + year +} + +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} + +INTEGERS { seq.num } + +FUNCTION {init.seq} +{ #0 'seq.num :=} + +EXECUTE {init.seq} + +FUNCTION {int.to.fix} +{ "000000000" swap$ int.to.str$ * + #-1 #10 substring$ +} + +FUNCTION {label.presort} +{ + calc.label + label sortify + " " + * +%<*!aipauth&!apsrmp> + seq.num #1 + 'seq.num := + seq.num int.to.fix +%</!aipauth&!apsrmp> +%<*aipauth|apsrmp> + type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.sort + 'author.sort + if$ + } + if$ + #1 entry.max$ substring$ +%</aipauth|apsrmp> + 'sort.label := + sort.label + * + " " + * + title field.or.null sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +FUNCTION {presort.pass} +{ type$ "control" = 'control.presort 'label.presort if$ +} + +ITERATE {presort.pass} + +SORT + +STRINGS { last.label next.extra } + +INTEGERS { last.extra.num number.label } + +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := + #0 'number.label := +} + +FUNCTION {label.forward} +{ + last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} + +FUNCTION {label.reverse} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'next.extra := + extra.label + duplicate$ empty$ + 'skip$ + { "{\natexlab{" swap$ * "}}" * } + if$ + 'extra.label := + label extra.label * 'label := +} + +EXECUTE {initialize.extra.label.stuff} + +FUNCTION {forward.pass} +{ type$ "control" = 'control.forward 'label.forward if$ +} + +ITERATE {forward.pass} + +FUNCTION {reverse.pass} +{ type$ "control" = 'control.reverse 'label.reverse if$ +} + +REVERSE {reverse.pass} + +FUNCTION {sortkey.sort} +{ sort.label + " " + * + year.sort.key + field.or.null sortify + * + " " + * + title field.or.null sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +FUNCTION {bib.sort.pass} +{ type$ "control" = 'control.sort 'sortkey.sort if$ +} + +ITERATE {bib.sort.pass} + +SORT + +FUNCTION {init.bib.eprint} +{ + "\texttt {" + pop$ + "\providecommand \url [0]{\begingroup\@sanitize@url \@url }%" write$ newline$ + "\providecommand \@url [1]{\endgroup\@href {#1}{" "}}%" bbl.url.prefix swap$ * * write$ newline$ + "\providecommand " " [0]{URL }%" bbl.url.prefix swap$ * * write$ newline$ + eprint.command "\providecommand " swap$ * "[0]{\href }%" * write$ newline$ +} + +FUNCTION {init.bib.doi} +{ + "\providecommand \doibase [0]{" doi.base "}%" * * write$ newline$ +} + +FUNCTION {init.bib.hypertex} +{ + "\providecommand " noop.command "[0]{\@secondoftwo}%" * * write$ newline$ + "\providecommand " href.command "[0]{\begingroup \@sanitize@url \@href}%" * * write$ newline$ + "\providecommand \@href[1]{\@@startlink{#1}\@@href}%" write$ newline$ + "\providecommand \@@href[1]{\endgroup#1\@@endlink}%" write$ newline$ + "\providecommand \@sanitize@url [0]{\catcode `\\12\catcode `\$12\catcode `\&12\catcode `\#12\catcode `\^12\catcode `\_12\catcode `\%12\relax}%" write$ newline$ + "\providecommand \@@startlink[1]{}%" write$ newline$ + "\providecommand \@@endlink[0]{}%" write$ newline$ +} + +FUNCTION {init.bib.namefont} +{ + "\providecommand \bibnamefont [1]{#1}%" write$ newline$ + "\providecommand \bibfnamefont [1]{#1}%" write$ newline$ + "\providecommand \citenamefont [1]{#1}%" write$ newline$ +} + +FUNCTION {init.bib.quote} +{ + "\providecommand " bbl.enquote * " [1]{" * + "``" "''" + "#1" swap$ "}%" * * * * write$ newline$ +} + +FUNCTION {init.bib.ay} +{ + "\providecommand \natexlab [1]{#1}%" + write$ newline$ +} + +FUNCTION {init.bib.bibinfo} +{ + bibinfo.command "\providecommand " swap$ * " [0]{\@secondoftwo}%" * write$ newline$ + bibfield.command "\providecommand " swap$ * " [0]{\@secondoftwo}%" * write$ newline$ +} + +FUNCTION {init.bib.lang} +{ + "\providecommand \selectlanguage [0]{\@gobble}%" write$ newline$ +} + +FUNCTION {init.bib.endbibitem} +{ + "\providecommand " bbl.open * "[0]{}%" * write$ newline$ + "\providecommand \bibitemStop [0]{}%" write$ newline$ + "\providecommand \bibitemNoStop [0]{.\EOS\space}%" write$ newline$ + "\providecommand \EOS [0]{\spacefactor3000\relax}%" write$ newline$ +} + +FUNCTION {init.bib.translation} +{ + "\providecommand \translation [1]{[#1]}%" write$ newline$ +} + +FUNCTION {warn.bib} +{ +} + +FUNCTION {init.bib} +{ + warn.bib + "\makeatletter" write$ newline$ + "\providecommand \@ifxundefined [1]{%" write$ newline$ + " \@ifx{#1\undefined}" write$ newline$ + "}%" write$ newline$ + "\providecommand \@ifnum [1]{%" write$ newline$ + " \ifnum #1\expandafter \@firstoftwo" write$ newline$ + " \else \expandafter \@secondoftwo" write$ newline$ + " \fi" write$ newline$ + "}%" write$ newline$ + "\providecommand \@ifx [1]{%" write$ newline$ + " \ifx #1\expandafter \@firstoftwo" write$ newline$ + " \else \expandafter \@secondoftwo" write$ newline$ + " \fi" write$ newline$ + "}%" write$ newline$ + init.bib.ay + init.bib.quote + init.bib.namefont + init.bib.hypertex + init.bib.eprint + init.bib.doi + init.bib.lang + init.bib.bibinfo + init.bib.translation + init.bib.endbibitem + "\providecommand " bbl.shut * " [1]{\csname bibitem#1\endcsname}%" * write$ newline$ + "\let\auto@bib@innerbib\@empty" write$ newline$ + "%</preamble>" write$ +} + +FUNCTION {begin.bib} +{ + id.bst diagn.cmntlog + control.bib + preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" + number.label int.to.str$ + * "}%" * + write$ newline$ + init.bib +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}%" + write$ newline$ +} + +EXECUTE {end.bib} + +% \end{macrocode} +% +% \begin{macrocode} +%</aapmrev|aipauth|aipnum|apsrev|apsrmp> +% \end{macrocode} +% +% \endinput +% +% \Finale diff --git a/texmf/source/latex/revtex/revtex4-2.dtx b/texmf/source/latex/revtex/revtex4-2.dtx new file mode 100644 index 0000000..f6e0b1c --- /dev/null +++ b/texmf/source/latex/revtex/revtex4-2.dtx @@ -0,0 +1,8383 @@ +% \iffalse meta-comment balanced on line 122 +% revtex4-2.dtx: package to typeset APS, AIP, SOR, ASA, etc. journal articles +% Copyright (c) 2019 American Physical Society. +% https://journals.aps.org/revtex/ +% mailto:revtex@aps.org +% +% Disclaimer +% This file is distributed WITHOUT ANY WARRANTY; +% without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +% License +% You may distribute this file under the conditions of the +% LaTeX Project Public License 1.3c or later +% (http://www.latex-project.org/lppl.txt). +% ReadMe +% For the documentation and more detailed instructions for +% installation, typeset this document with \LaTeX. +% Maintenance Status +% This work has the LPPL maintenance status "maintained"; +% Current Maintainer of this work is Arthur Ogawa. +% +% This work consists of the main source file revtex4-2.dtx +% and the derived files +% revtex4-2.cls, revtex4-2.pdf +% Distribution: +% CTAN:macros/latex/contrib/revtex/ +% +% Unpacking: +% tex revtex4-2.dtx +% +% Documentation: +% latex revtex4-2.dtx; ... +% +% Programm calls to get the documentation (example): +% pdflatex revtex4-2.dtx +% makeindex -s gind.ist revtex4-2.idx +% makeindex -s gglo.ist -o revtex4-2.gls revtex4-2.glo +% pdflatex revtex4-2.dtx +% makeindex -s gind.ist revtex4-2.idx +% pdflatex revtex4-2.dtx +% +% Installation: +% TDS:bibtex/bst/revtex/ +% TDS:doc/latex/revtex/ +% TDS:tex/latex/revtex/ +% TDS:source/latex/revtex/ +% +% Thanks, Heiko! +% This method of letting a single .dtx file serve as both +% documentation (via latex) and installer (via tex) follows +% the example of Heiko Oberdiek. Thanks! +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase + 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi + \relax +\else + \csname fi\endcsname +%</ignore> +%<*install> +%% This file will generate documentation and runtime files +%% from revtex4-2.dtx when run through TeX. +\input docstrip +\preamble + +This file is part of the APS files in the REVTeX 4 distribution. +For the version number, search on the string %FileInfo + +Original version by David Carlisle +Modified by Arthur Ogawa (mailto:arthur_ogawa at sbcglobal dot net) + +Version (4.2a, unreleased) +Modified by Aptara on behalf of American Physical Society and American Institute of Physics + +Version (4.2b,4.2c) +Modified by Mark Doyle, American Physical Society (mailto:revtex at aps.org) + +Version (4.2d,4.2e) +Modified by Phelype Oleinik for the American Physical Society (mailto:phelype.oleinik at latex-project.org) + +Copyright (c) 2019--2020 American Physical Society. +https://journals.aps.org/revtex/ +mailto:revtex@aps.org + +See the REVTeX 4.2 README-REVTEX file for restrictions and more information. + +\endpreamble +\askforoverwritefalse +\keepsilent +\generate{% + \file{revtex4-2.cls}{% + \from{revtex4-2.dtx}{kernel}% + \from{ltxutil.dtx}{kernel}% + \from{ltxfront.dtx}{kernel}% + \from{ltxgrid.dtx}{kernel}% + \from{revtex4-2.dtx}{options}% + \from{ltxutil.dtx}{options}% + \from{ltxfront.dtx}{options}% + \from{ltxgrid.dtx}{options}% + \from{revtex4-2.dtx}{package}% + }% + \file{aps4-2.rtx}{\from{revtex4-2.dtx}{aps}}% + \file{apsrmp4-2.rtx}{\from{revtex4-2.dtx}{rmp}}% + \file{aps10pt4-2.rtx}{\from{revtex4-2.dtx}{10pt}}% + \file{aps11pt4-2.rtx}{\from{revtex4-2.dtx}{11pt}}% + \file{aps12pt4-2.rtx}{\from{revtex4-2.dtx}{12pt}}% + \file{revsymb4-2.sty}{\from{revtex4-2.dtx}{revsymb}}% +}% +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation, please move} +\Msg{* *.cls, *.rtx, and *.sty } +\Msg{* into a directory searched by TeX;} +\Msg{* in a TDS-compliant installation:} +\Msg{* texmf/tex/macros/latex/revtex/.} +\Msg{*} +\Msg{* To produce the documentation, + run revtex4-2.dtx through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% \fi +% +% \GetFileInfo{revtex4-2.dtx} +% +% \StopEventually{} +% \iffalse ltxdoc klootch +%<*package> +%%% @LaTeX-file{ +%%% filename = "revtex4-2.dtx", +%%% version = "4.2e", +%%% date = "2020/10/03", +%%% author = "Mark Doyle (mailto: revtex at aps.org), Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net), +%%% commissioned by the American Physical Society. +%%% ", +%%% copyright = "Copyright (C) 1999, 2009 Arthur Ogawa, Version 4.2 Copyright (C) 2019 American Physical Society +%%% distributed under the terms of the +%%% LaTeX Project Public License 1.3c, see +%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt +%%% ", +%%% address = "Mark Doyle, +%%% USA", +%%% telephone = "", +%%% FAX = "", +%%% email = "mailto colon revtex at aps.org", +%%% codetable = "ISO/ASCII", +%%% keywords = "", +%%% supported = "yes", +%%% abstract = "", +%%% } +%</package> +% \fi +% +% \iffalse ltxdoc klootch +% The following references the \file{README-REVTEX.tex} file, +% which contains the frontmatter for the programmer's docs. +% The contents of this file are generated when +% you typeset this file with LaTeX. +% Search on "{filecontents*}{README-REVTEX.tex}" to locate it. +% \fi\input{README-REVTEX.tex}% +% +% \subsection{Bill of Materials} +% +% Following is a list of the files in this distribution arranged +% according to provenance. +% +% \subsubsection{Primary Source}% +% One single file generates all. +%\begin{verbatim} +%revtex4-2.dtx +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{tex revtex4-2.dtx}}% +% Typesetting ths file under \TeX\ itself runs the installer, +% which generates the package files. +%\begin{verbatim} +%revtex4-2.cls, revtex4.ins, revtex4.drv, aps4-2.rtx, +%aps10pt4-2.rtx, aps11pt4-2.rtx, aps12pt4-2.rtx, revsymp.sty +%\end{verbatim} +% +% \subsubsection{Generated by \texttt{pdflatex revtex4-2.dtx}}% +% Typesetting the source file under \LaTeX\ +% generates the documentation. +%\begin{verbatim} +%revtex4.pdf, +%\end{verbatim} +% +% \subsubsection{Auxiliary}% +% The following are auxiliary files generated +% in the course of running \LaTeX: +% \begin{verbatim} +%revtex4.aux revtex4.idx revtex4.ind revtex4.log revtex4.toc +% \end{verbatim} +% +% \section{Code common to all modules}% +% +% The following may look a bit klootchy, but we +% want to require only one place in this file +% where the version number is stated, +% and we also want to ensure that the version +% number is embedded into every generated file. +% +% Now we declare that +% these files can only be used with \LaTeXe. +% An appropriate message is displayed if +% a different \TeX{} format is used. +% \begin{macrocode} +%<*doc|kernel|aps|rmp|revsymb> +\NeedsTeXFormat{LaTeX2e}[1996/12/01]% +%</doc|kernel|aps|rmp|revsymb> +%<kernel>\ProvidesClass{revtex4-2} +%<aps>\ProvidesFile{aps4-2} +%<rmp>\ProvidesFile{apsrmp4-2} +%<10pt>\ProvidesFile{aps10pt4-2} +%<11pt>\ProvidesFile{aps11pt4-2} +%<12pt>\ProvidesFile{aps12pt4-2} +%<revsymb>\ProvidesPackage{revsymb4-2} +%<*doc> +\ProvidesFile{revtex4-2.dtx} +%</doc> +%<*!package&!options> +%<version> + [2020/10/03 4.2e (https://journals.aps.org/revtex/ for documentation)]% \fileversion +%</!package&!options> +% \end{macrocode} +% The current class name is remembered in \cmd\class@name. +% This is something of a klootch, relying as it does on knowledge of the implementation of \cmd\ProvidesPackage. +% \begin{macrocode} +%<kernel>\let\class@name\@gtempa +% \end{macrocode} +% +% \section{The driver module \texttt{driver}} +% +% This module, consisting of the present section, +% typesets the programmer's documentation, +% generating the \file{README-REVTEX.txt} and sample document as needed. +% +% Because the only uncommented-out lines of code at the beginning of +% this file constitute the \file{driver} module itself, +% we can simply typeset the \file{.dtx} file directly, +% and there is thus rarely any need to +% generate the ``driver'' {\sc docstrip} module. +% Module delimiters are nonetheless required so that +% this code does not find its way into the other modules. +% +% The \enve{document} command concludes the typesetting run. +% +% \begin{macrocode} +%<*doc> +% \end{macrocode} +% The driver uses packages \file{ltxdoc.sty}, \file{ltxdocext.sty}, +% \file{hyperref.sty}, and whatever font package has been selected. +% \begin{macrocode} +\documentclass{ltxdoc} +\RequirePackage{ltxdocext}% +\let\url\undefined +\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}% +% \end{macrocode} +% We ask for the usual indices and glossaries. +% \begin{macrocode} +\CodelineIndex\EnableCrossrefs % makeindex -s gind.ist revtex4 +\RecordChanges % makeindex -s gglo.ist -o revtex4.gls revtex4.glo +% \end{macrocode} +% +% \subsubsection{Docstrip and info directives} +% We use so many {\sc docstrip} modules that we set the +% \texttt{StandardModuleDepth} counter to 1. +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% The following command retrieves the date and version information +% from this file. +% \begin{macrocode} +\expandafter\GetFileInfo\expandafter{\jobname.dtx}% +% \end{macrocode} +% +% \subsection{The Frontmatter File} +% As promised above, here is the contents of the frontmatter file. +% \begin{macrocode} +\begin{filecontents*}{README-REVTEX.tex} +\title{% + The \classname{revtex4-2} document class of the American Physical Society% + \protect\thanks{Work under hire to American Physical Society. Version \fileversion\ \copyright\ 2019 American Physical Society}% +}% +\author{Arthur Ogawa and Mark Doyle% + \protect\thanks{First revision of REV\TeX4.0 (unreleased) by David Carlisle, all released versions of 4.0 and 4.1 by Art Ogawa, 4.2a (unreleased) by Aptara, 4.2b,c by Mark Doyle}% +}% +\date{Version \fileversion, dated \filedate}% +\newcommand\revtex{REV\TeX} + +\maketitle + +This file embodies the implementation of the APS \revtex\ 4.2 document class +for electronic submissions to journals. + +The distribution point for this work is +\url{https://journals.aps.org/revtex/}, +which contains fully unpacked, prebuilt runtime files and documentation. + +\tableofcontents + +\section{Using \protect\revtex} + +The file \file{README} has retrieval and installation information. + +User documentation is presented separately in \file{auguide.tex}. + +The file \file{template.aps} is a boilerplate file. + +\changes{4.0a}{1998/01/16}{Initial version} +\changes{4.0a}{1998/01/31}{Move after process options, so \cs{clearpage} not in scope of twocolumn} +\changes{4.0a}{1998/01/31}{Rearrange the ordering so numerical ones come first. AO: David, what does this mean?} +\changes{4.0a}{1998/01/31}{use font-dependent spacing} +\changes{4.0a}{1998/01/31}{4.0d had twoside option setting twoside switch to false} +\changes{4.0a}{1998/01/31}{Move after process options, so the following test works} +\changes{4.0a}{1998/01/31}{print homepage} +\changes{4.0a}{1998/01/31}{protect against hyperref revtex kludges which are not needed now} +\changes{4.0a}{1998/06/10}{multiple preprint commands} +\changes{4.0a}{1998/06/10}{comma not space between email and homepage} +\changes{4.0a}{1998/06/10}{single space footnotes} +\changes{4.0b}{1999/06/20}{First modifications by Arthur Ogawa (mailto:arthur\_ogawa at sbcglobal dot net)} +\changes{4.0b}{1999/06/20}{Added localization of \cs{figuresname}} +\changes{4.0b}{1999/06/20}{Added localization of \cs{tablesname}} +\changes{4.0b}{1999/06/20}{AO: all code for \protect\classoption{10pt} is in this module.} +\changes{4.0b}{1999/06/20}{AO: all code for \protect\classoption{11pt} is in this module.} +\changes{4.0b}{1999/06/20}{AO: all code for \protect\classoption{12pt} is in this module.} +\changes{4.0b}{1999/06/20}{AO: made aps.rtx part of revtex4.dtx} +\changes{4.0b}{1999/06/20}{AO: remove duplicates} +\changes{4.0b}{1999/06/20}{call \cs{print@floats}} +\changes{4.0b}{1999/06/20}{Defer assignment until \cs{AtBeginDocument} time.} +\changes{4.0b}{1999/06/20}{Defer decision until \cs{AtBeginDocument} time} +\changes{4.0b}{1999/06/20}{Define three separate environments, defer assignment to \cs{AtBeginDocument} time.} +\changes{4.0b}{1999/06/20}{Frank Mittelbach, has stated in \protect\classname{multicol}: ``The kernel command \cs{@footnotetext} should not be modified.'' Thus, I have removed David Carlisle's redefinition of that command. Note, however, that later versions of \protect\classname{multicol} do not require this workaround. Belt and suspenders.}% +\changes{4.0b}{1999/06/20}{Move this ``complex'' option to the front, where it can be overridden by ``simple'' options.} +\changes{4.0b}{1999/06/20}{New option} +\changes{4.0b}{1999/06/20}{One-line caption sets flush left.} +\changes{4.0b}{1999/06/20}{only execute if appropriate} +\changes{4.0b}{1999/06/20}{Processing delayed to \cs{AtBeginDocument} time} +\changes{4.0b}{1999/06/20}{Removed invocation of nonexistent class option \protect\classoption{groupauthors} and all other class options that should only be invoked by the document. (Otherwise precedence of class options does not work.)} +\changes{4.0b}{1999/06/20}{Restore all media size class option of \protect\file{classes.dtx}} +\changes{4.0b}{1999/06/20}{Stack \cs{preprint} args flush right at right margin.} +\changes{4.0c}{1999/11/13}{(AO, 115) If three or more preprints specified, set on single line, with commas.} +\changes{4.0c}{1999/11/13}{(AO, 129) section* within appendix was producing appendixname} +\changes{4.0c}{1999/11/13}{*-form mandates pagebreak} +\changes{4.0c}{1999/11/13}{also spelled ``acknowledgements''.} +\changes{4.0c}{1999/11/13}{Do not put by REVTeX in every page foot} +\changes{4.0c}{1999/11/13}{grid changes via ltxgrid procedures} +\changes{4.0c}{1999/11/13}{grid changes with ltxgrid} +\changes{4.0c}{1999/11/13}{Insert procedure \cs{checkindate}} +\changes{4.0c}{1999/11/13}{Lose compatability mode.} +\changes{4.0c}{1999/11/13}{New ltxgrid-based code, other bug fixes} +\changes{4.0c}{1999/11/13}{New option ``checkin''} +\changes{4.0c}{1999/11/13}{Prevent an inner footnote from performing twice} +\changes{4.0d}{2000/04/10}{Also alter how lists get indented.} +\changes{4.0d}{2000/04/10}{eprint takes an optional argument, syntactical only in this case.} +\changes{4.0d}{2000/04/10}{New option} +\changes{4.0d}{2000/05/10}{More features and bug fixes: compatability with longtable and array packages. Now certainly incompatible with multicol.} +\changes{4.0d}{2000/05/17}{make longtable trigger the head, too} +\changes{4.0d}{2000/05/18}{But alternative spelling is deprecated.} +\changes{4.0e}{2000/09/20}{New option showkeys} +\changes{4.0e}{2000/11/14}{Bug fixes and minor new features: title block affiliations can have ancillary data, just like authors; clearpage processing revamped, with floats staying in order; widetext ornaments.} +\changes{4.0e}{2000/11/21}{adornments above and below.} +\changes{4.0f}{2001/02/13}{Last bug fixes before release.} +\changes{4.0rc1}{2001/06/17}{Running headers always as if two-sided} +\changes{4.0rc1}{2001/06/18}{grid changes with push and pop} +\changes{4.0rc1}{2001/06/18}{grid changes with push and pop} +\changes{4.0rc4}{2001/07/23}{hyperref is no longer loaded via class option: use a usepackage statement instead} +\changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +\changes{4.1a}{2008/01/18}{(AO, 451) ``Cannot have more than 256 cites in a document''}% +\changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +\changes{4.1a}{2008/01/18}{(AO, 460) ``Proper style is "FIG. 1. ..." (no colon)''}% +\changes{4.1a}{2008/01/18}{(AO, 478) \cs{ds@letterpaper}, so that ``letterpaper really is the default''}% +\changes{4.1a}{2008/01/18}{(AO, 488) Change processing of options to allow an unused option to specify society and journal}% +\changes{4.1a}{2008/01/19}{(AO, 461) Change the csname revtex uses from @dotsep to ltxu@dotsep. The former is understood in mu. (What we wanted was a dimension.)}% +\changes{4.1a}{2008/01/19}{For natbib versions before 8.21, \cs{NAT@sort} was consulted only as natbib was being read in. Now it is fully dynamic.} +\changes{4.1b}{2008/05/29}{The csname substyle@ext is now defined without a dot (.), to be compatible with \LaTeX usage (see @clsextension and @pkgextension).} +\changes{4.1b}{2008/06/01}{(AO) Implement bibnotes through \cs{frontmatter@footnote@produce} instead of \cs{bibnotes@sw}}% +\changes{4.1b}{2008/06/01}{Add option reprint, opposite of preprint, and preferred alternative to twocolumn} +\changes{4.1b}{2008/06/29}{(AO, 455) Be nice to a list within the abstract (assign \cs{@totalleftmargin}).} +\changes{4.1b}{2008/06/30}{(AO) Structure the Abstract using the \texttt{bibliography} environment} +\changes{4.1b}{2008/07/01}{(AO) coordinate \cs{if@twoside} with \cs{twoside@sw}} +\changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +\changes{4.1b}{2008/07/01}{(AO) No longer need to test \cs{chapter} as of \texttt{natbib} version 8.2} +\changes{4.1b}{2008/07/01}{(AO) No longer use \cs{secnumarabic@sw}, instead use \cs{setup@secnums}} +\changes{4.1b}{2008/07/01}{(AO) Provide more diagnostics when \cs{@society} is assigned.} +\changes{4.1b}{2008/07/01}{(AO) provide option longbibliography} +\changes{4.1b}{2008/07/01}{Add \cs{@hangfroms@section}} +\changes{4.1b}{2008/07/01}{Break out \cs{@caption@fignum@sep}} +\changes{4.1b}{2008/07/01}{Class option galley sets \cs{preprintsty@sw} to false} +\changes{4.1b}{2008/07/01}{Code relating to new syntax for frontmatter has been placed in \file{ltxfront.dtx}} +\changes{4.1b}{2008/07/01}{Package textcase is now simply a required package} +\changes{4.1b}{2008/07/01}{Procedures \cs{@parse@class@options@society} and \cs{@parse@class@options@journal} and friends} +\changes{4.1b}{2008/07/01}{Read in all required packages together} +\changes{4.1b}{2008/07/01}{Remove options newabstract and oldabstract} +\changes{4.1b}{2008/08/01}{Section numbering via procedures \cs{secnums@rtx} and \cs{secnums@arabic}.} +\changes{4.1b}{2008/08/04}{As with author formatting, rag the right more, and assign \cs{@totalleftmargin}. Also neutralize \cs{def@after@address}.}% +\changes{4.1b}{2008/08/04}{Rag the right even more: .8\cs{hsize}. Also, assign \cs{@totalleftmargin}.}% +\changes{4.1b}{2008/08/04}{The \texttt{rmp} journal substyle selects \texttt{groupedaddress} by default.}% +\changes{4.1b}{2008/08/04}{Use \cs{setup@hook} to initialize all.} +\changes{4.1c}{2008/08/15}{Document class option longbibliography via \cs{substyle@post}} +\changes{4.1d}{2009/03/27}{Definition of \cs{ @fnsymbol} follows fixltx2e.sty} +\changes{4.1e}{2008/06/29}{(AO, 455) be nice to a list within the abstract} +\changes{4.1f}{2009/07/07}{(AO, 513) Add class option linenumbers: number the lines a la \classname{lineno}} +\changes{4.1f}{2009/07/07}{(AO, 516) Merged references are separated with a semicolon} +\changes{4.1f}{2009/07/10}{(AO, 520) Automatically produce \cs{bibliography} command when needed}% +\changes{4.1f}{2009/07/11}{(AO, 521) Lonely bibliography head}% +\changes{4.1f}{2009/07/11}{(AO, 522) Warn if software is expired}% +\changes{4.1f}{2009/07/15}{(AO, 523) Add class option nomerge, to turn off new natbib 8.3 syntax} +\changes{4.1f}{2009/07/20}{(AO, 524) Makes no sense if citations are superscript numbers and so are footnotes} +\changes{4.1f}{2009/10/05}{(AO, 530) \cs{@fnsymbol}: Failed to import fixltx2e.sty technology. Return to LaTeX core.} +\changes{4.1g}{2009/10/07}{(AO, 525) Remove phantom paragraph above display math that is given in vertical mode}% +\changes{4.1g}{2009/10/07}{(AO, 538) \cs{MakeTextUppercase} inappropriately expands the double backslash} +\changes{4.1h}{2009/10/09}{(AO) Remove expiry code in the release software}% +\changes{4.1i}{2009/10/23}{(AO, 541) Defer assignment of \cs{cite} until after natbib loads} +\changes{4.1j}{2009/10/24}{(AO, 549) Repairing natbib's \cs{BibitemShut} and \cs{bibAnnote}} +\changes{4.1j}{2009/10/25}{(AO, 545) hypertext capabilities off by default; enable with \classoption{hypertext}} +\changes{4.1j}{2009/10/25}{(AO, 552) Repair spacing in \cs{onlinecite}} +\changes{4.1k}{2009/11/06}{(AO, 554) give the \cs{newlabel} command syntax appropriate to the hyperref package} +\changes{4.1n}{2009/11/06}{(AO, 565) restore 4.0 behavior: invoking class option preprint implies class option preprintnumbers} +\changes{4.1n}{2009/11/30}{(AO, 566) restore 4.0 behavior: flush column bottoms} +\changes{4.1n}{2009/12/05}{(AO, 569) Use of \classname{hyperref} interferes with column balancing of last page}% +\changes{4.1n}{2009/12/09}{(AO, 569) execute the after-last-shipout procedures from within the safety of the output routine}% +\changes{4.1n}{2010/01/02}{(AO, 571) Interface \cs{set@footnotewidth} for determining the set width of footnotes}% +\changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +\changes{4.1n}{2009/12/13}{(AO, 573) arrange to load \classname{lineno} after any other packages.}% +\changes{4.1n}{2010/01/04}{(AO, 575) the default for journal prstper is longbibliography}% +\changes{4.1n}{2010/01/04}{(AO, 576) In .bst files, remove support for the annote field}% +\changes{4.1n}{2010/01/02}{(AO) fine-tune spacing above and below widetext}% +\changes{4.1n}{2010/01/02}{(AO, 571) class file must set \cs{splittopskip}; fine tune \cs{skip}\cs{footins}; \cs{footnoterule} defined in terms of \cs{skip}\cs{footins}}% +\changes{4.1n}{2010/01/02}{(AO, 572) \cs{@makefntext} and \cs{frontmatter@makefntext} must be defined harmoniously}% +\changes{4.1o}{2010/02/02}{(AO, 575) Automatically incorporate the (Bib\TeX-generated) .bbl into an explicit \env{thebibliography}}% +\changes{4.1o}{2010/02/05}{(AO, 549) Remove patch to natbib, which is now at version 8.31a} +\changes{4.1o}{2010/02/07}{(AO, 578) accommodate the possible space character preceding \cs{BibitemShut}.} +\changes{4.1o}{2010/02/05}{(AO, 579) Endnote shall comprise their own Bib\TeX\ entry type: @FOOTNOTE.} +\changes{4.1o}{2010/02/10}{(AO, 580) Provide a document class option to turn off production of eprint field in bibliography.} +\changes{4.1o}{2010/02/12}{(AO, 580) Control .bst at run time.}% +\changes{4.1o}{2010/02/09}{(AO, 581) Handle case: merged references, with first ending in a stop character.} +\changes{4.1p}{2010/02/24}{(AO, 583) Provide interface to \classname{ltxgrid} \cs{onecolumn@grid@setup} and \cs{twocolumn@grid@setup}} +\changes{4.1p}{2010/02/24}{(AO, 584) Per MD, remove trailing space character from each journal abbreviation: it had caused an extraneous space in the .bbl} +\changes{4.1q}{2010/04/01}{(AO, 586) When .bbl is pasted into the document, prevent automatic bibliography inclusion.}% +\changes{4.1q}{2010/04/13}{(AO, 588) Only write \revtex-specific BibTeX .bib data if the .bst style is set by REVTeX.}% +\changes{4.1r}{2010/06/22}{(AO, 595) Provide \cs{lovname} along with other List of Videos definitions.}% +\changes{4.2a}{2014/12/31}{(Aptara, MD) Added initial support for SOR and AAPM journals, additional journals for APS, and additional journals and proceedings for AIP, unreleased.}% +\changes{4.2a}{2014/12/31}{(Aptara) Make prb style to follow other Phys. Rev. journals.}% +\changes{4.2a}{2014/12/31}{(Aptara) Corrected indentation for tableofcontents appearing along with listoffigure/listoftable.}% +\changes{4.2a}{2017/11/21}{(MD) Make long bibliography style the default now.}% +\changes{4.2a}{2017/11/28}{(MD) Add call to normalsize to be a good citizen and allow booktabs.sty to work properly}.% +\changes{4.2b}{2018/12/26}{(MD) Make titles in bibliography default, prb style to follow other Phys. Rev. journals, add a unified physrev option as well as prx and prapplied options. Corrected indentation for tableofcontents appearing along with listoffigure/listoftable.}% +\changes{4.2b}{2017/11/21}{(MD) Update options for new titles without "Special Topics" and make prper match style of other journal options}% +\changes{4.2b}{2017/11/21}{(MD) Add options for new APS journals and a generic physrev option for future-proofing}% +\changes{4.2b}{2017/11/22}{(MD) Change default to not use a title page - it seems antiquated}% +\changes{4.2b}{2017/11/22}{(MD) MD - not sure why these parameters were different previously. Made them match except for title.}% +\changes{4.2b}{2017/11/22}{(MD) PACS are obsolete altogether now}% +\changes{4.2b}{2018/12/26}{(MD) Improve control over display of e-print ids in bibliography.}% + +\end{filecontents*} +% \end{macrocode} +% +% \subsection{The Document Body} +% +% Here is the document body, containing only a +% \cmd\DocInput\ directive---referring to this very file. +% This very cute self-reference is a common \classname{ltxdoc} idiom. +% \begin{macrocode} +%%\newcommand\revtex{REV\TeX}% TeXSupport +\begin{document}% +\expandafter\DocInput\expandafter{\jobname.dtx}% +\PrintChanges +\end{document} +% \end{macrocode} +% And that is the end of the driver for the programmer's documentation. +% \begin{macrocode} +%</doc> +% \end{macrocode} +% +% \section{Overview}% +% \revtex\ is a \LaTeXe\ document class, somewhat like a hybrid of +% the standard \LaTeX\ \classname{book} and \classname{article} classes. +% +% Certain packages are (should be) loaded by this class in any case: +% \classname{amssymb}, \classname{amsmath}, \classname{bm}, \classname{natbib}. +% +% Certain packages are automatically loaded by this class +% when a corresponding class option has been invoked: +% +% \begin{tabular}{ll} +% \textbf{\revtex\ option}&\textbf{package}\\ +% \classoption{amsfonts}&\classname{amsfonts}\\ +% \classoption{amssymb}&\classname{amssymb}\\ +% \classoption{aps}&\classname{overcite}\\ +% \end{tabular} +% +% Certain other packages are to be loaded by the +% document through explicit use of \cmd\usepackage. +% Some mentioned in the user documentation are +% \classname{graphicx}, \classname{longtable}, \classname{hyperref}, +% and \classname{bm}. +% +% Certain commonly used packages are known to be incompatible with +% \revtex, among them \classname{multicol} and \classname{cite}. +% If such a package is found to be loaded, \revtex\ issues an error message +% and halts the job. +% Halting might be considered severe punishment for loading an incompatible +% package, but if we were to proceed, an even weirder error might be encountered +% further down the road. +% +% This document class implements the substyle: a set of mutually +% exclusive class options that, in this case, allow the +% document class to address multiple societies. +% It also implements a sub-substyle, giving the +% journal of the given society. +% Any society may create a substyle; +% this file generates one for \classoption{aps}. +% +% FIXME: should always load the \classname{graphicx} package. No, allow user to load whichever graphics package is desired. +% +% QUERY: since \classname{amsfonts} and \classname{amssymb} extend +% syntax, why not load them in any case? +% +% Certain processing occurs at the endgame for reading in \revtex, thereby establishing +% precedence for assignments to \LaTeX's (and \revtex's) parameters: +% \begin{enumerate} +% \item +% Figure out which society is operative and read in the indicated \file{.rtx} file. +% \item +% Figure out which journal option is operative and execute the indicated journal command. This may lead to reading in a journal substyle \file{.rtx} file. +% \item +% Figure out which pointsize is operative and execute the indicateded pointsize command. This may lead to reading in a pointsize \file{.rtx} file. +% \item +% Execute all of the document's options, in the order declared within the document. +% \item +% Read in all required packages (like \classname{natbib}, \classname{amsfonts}, \classname{amssymb}), that were determined by class, society, and journal. +% \item +% The last required package, if existing, is the document's style file, the \file{.rty} file. +% Note that the \file{.rty} file can override the assignments of \revtex, society, journal, and required packages, and even load its own packages. +% It can also, via appendations to \cmd\setup@hook, override the setup code itself. +% \item +% Execute all of the setup code accumulated. Such code can be queued by \revtex\ itself, by the society, by the journal, or by the pointsize. +% \item +% At this point, \revtex\ has completed the process of inputting itself, +% and \LaTeX\ will now execute the \cmd\AtEndOfClass\ procedures. +% \end{enumerate} +% +% \revtex\ will have enqueued code to execute at \cmd\AtBeginDocument\ time, +% in two different queues. +% \cmd\document@inithook\ executes immediately upon encountering the \cmd\begin\env{document} statement, +% \cmd\class@documenthook\ at the end of all the code enqueued via \cmd\AtBeginDocument. +% \begin{enumerate} +% \item +% Install procedures to execute at the very end of the class's +% \cmd\AtBeginDocument\ processing, such as +% \begin{enumerate} +% \item +% closing out the page grid +% \item +% putting out the LastPage label. +% \item +% issuing a \cmd\bibliographystyle\ command, based on the value set +% by the society substyle. +% \item +% setting default values for parameters used in the document. +%FIXME: differentiate between class's parameters that can wait until +% they are used in the document, and parameters that are used at \cmd\AtBeginDocument\ time. +% \end{enumerate} +% \item +% Install procedures to execute the very last at \cmd\AtEndDocument\ time, +% such as the \cmd\clearpage\ processing. +% \end{enumerate} +% +% Certain events are optionally scheduled for \cmd\AtBeginDocument\ time: +% \begin{enumerate} +% \item +% Setting default values for the Booleans and for other procedures used in formatting. +% \item +% In response to class options options, adjusting parameters and procedures used in formatting. +% \item +% Implementing the \classoption{eqsecnum} option, if required. +% \item +% Setting the state engine for data commands. +% \item +% Memorizing procedures for later use. +% \item +% Setting type size and area, for use by later calculations. +% \end{enumerate} +% +% Certain events are scheduled for \cmd\class@enddocumenthook\ time: +% \begin{enumerate} +% \item +% Print out the migrated floats or the end notes, if needed. +% \item +% Close out the page grid. +% \item +% Label the last page of the document +% \item +% (\classname{natbib}) prepare to read in the \file{.aux} file. +% \end{enumerate} +% +% \section{Writing journal-specifc extensions to \revtex} +% +% With this version of \revtex, we introduce a somewhat different +% scheme for adapting \revtex\ to the needs of a specific journal. +% +% To create a journal substyle, you create new class options in +% \revtex\ for the society, say \classoption{osa}, and any of that society's journals, +% one of which is, say, \classoption{josaa}, +% using the code for the APS as a guide. +% In particular, each of your new options should separately define \cmd\@society\ +% and \cmd\@journal. That for the former will be the same for +% all options relating to a particular society. +% +% Then, for the society, you create a corresponding \file{.rtx} +% file, in our case \file{osa.rtx}. +% Within that file, you override procedures and parameter assignments as you see fit. +% Ideally they will be generally applicable to all of that society's +% journals (see the file \file{aps.rtx} for a realization of this scheme). +% Also within that file, you include a +% section of code for each journal, that for josaa looks like: +% \begin{verbatim} +% \@ifx{\@journal\journal@josaa}{% +% <code specific to the josaa> +% }{}% +% \end{verbatim} +% +% Thus far, the scheme is similar to that used in \revtex\ 3.1. +% However, the new scheme does differ from the old in that +% the \file{.rtx} file should define no syntactical extensions +% to \revtex. +% +% \section{The \classname{revtex4} Document Class} +% Above, we took +% advantage of 1) the \LaTeX\ definition of \cmd\ProvidesPackage\ and +% 2) that the line of code immediately afterwards follows the \cmd\ProvidesClass\ statement above. +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% Print a banner in the log: +% \begin{macrocode} +\GenericInfo{}{\space + Copyright (c) 2019 American Physical Society.^^J + mailto:revtex@aps.org^^J + Licensed under the LPPL:^^Jhttp://www.ctan.org/tex-archive/macros/latex/base/lppl.txt^^J + Arthur Ogawa <arthur_ogawa at sbcglobal dot net>^^J + Based on work by David Carlisle <david at dcarlisle.demon.co.uk>^^J + Version (4.2d,4.2e): Modified by Mark Doyle and Phelype Oleinik^^J + \@gobble +}% +% \end{macrocode} +% +% \subsection{Compatibility Processing} +% +% If the document has \cmd\documentstyle|{revtex4}|, +% then, instead of attempting to run in compatability mode, +% just complain and exit. +% \changes{4.0c}{1999/11/13}{Lose compatability mode.} +% \begin{macrocode} +\if@compatibility + \edef\reserved@a{\errhelp{% + Change your \string\documentstyle\space statement to + \string\documentclass\space and rerun. + }}\reserved@a + \errmessage{You cannot run \class@name\space in compatability mode}% + \expandafter\@@end +\fi +% \end{macrocode} +% +% +% \section{Extensions to the \LaTeX\ Kernel} +% +% \begin{macrocode} +%</kernel> +% \end{macrocode} +% +% Here, we incorporate the utility, frontmatter, and page grid packages. +% The \classname{ltxutil}, \classname{ltxfront}, and \classname{ltxgrid} source are distributed with +% \revtex. +% +% Here begins the \file{options} \textsc{docstrip} module. +% \begin{macrocode} +%<*options> +% \end{macrocode} +% +% \subsection{Hooks} +% +% \begin{macro}{\setup@hook} +% The procedure +% \cmd\setup@hook\ +% serves as the vehicle for all code that +% gives values to the class's parameters once all the +% society, journal, options, and packages have been processed. +% +% Arrange for journal substyles to set their own default values. +% \begin{macrocode} +\let\setup@hook\@empty +% \end{macrocode} +% \end{macro} +% +% After preamble processing is complete, +% detect whether package \classname{longtable} has been loaded and patch it. +% \begin{macrocode} +\appdef\document@inithook{% + \switch@longtable + \let\LT@makecaption\LT@makecaption@rtx +}% +% \end{macrocode} +% +% \begin{macro}{\LT@makecaption} +% We override the caption processing method of the \classname{longtable} package: +% space below the caption is created via strut instead of whitespace. +% \begin{macrocode} +\def\LT@makecaption@rtx#1#2#3{% + \LT@mcol\LT@cols c{% + \hbox to\z@{% + \hss + \parbox[t]\LTcapwidth{% + \sbox\@tempboxa{#1{#2: }#3\unskip\nobreak\vrule\@width\z@\@height\z@\@depth .5\baselineskip}% + \ifdim\wd\@tempboxa>\hsize + #1{#2: }#3\unskip\nobreak\vrule\@width\z@\@height\z@\@depth .5\baselineskip + \else + \hbox to\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \endgraf + }% + \hss + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\robust@boldmath} +% Robustify the \cmd\boldmath command. +% If Team \LaTeX\ (or any package) ever gets around to fixing this problem, +% we will bow out. (This fix relates to bug \#394.) +% \begin{macrocode} +\def\protectdef@boldmath{% + \expandafter\@ifnotrelax\csname boldmath \endcsname{}{% + \class@info{Robustifying \string\LaTeX's \string\boldmath\space command}% + \expandafter\let\csname boldmath \endcsname\boldmath + \expandafter\def\expandafter\boldmath\expandafter{\expandafter\protect\csname boldmath \endcsname}% + }% +}% +\appdef\document@inithook{% + \protectdef@boldmath +}% +% \end{macrocode} +% \end{macro} +% +% \section{Compatability with the geometry package} +% +% The \classname{geometry} package of Hideo Umeki provides a way to +% specify the metrics of the media and page layout. +% We want to ensure that \revtex\ does not foreclose on the use of +% this or any other such package, nor to interfere with +% explicit assignments of such metric parameters within the +% document preamble. +% +% The \LaTeX\ parameters (resp. \TeX\ primitives) set by \classname{geometry} are: +% \cmd\paperwidth, \cmd\paperheight, +% \cmd\textwidth, \cmd\textheight, +% \cmd\topmargin, \cmd\headheight, \cmd\headsep, +% \cmd\footskip, \cmd\skip\cmd\footins, +% \cmd\marginparwidth, \cmd\marginparsep, +% \cmd\oddsidemargin, \cmd\evensidemargin, +% \cmd\columnsep, +% \cmd\hoffset, \cmd\voffset, \cmd\mag, +% \cmd\if@twocolumn, \cmd\if@twoside, \cmd\if@mparswitch, \cmd\if@reversemargin, +% +% \revtex's assignments can be overridden by +% any package or other statement in the document preamble, +% so it should be compatible. +% +%FIXME: one parameter is rendered semantically void (by \file{ltxgrid.dtx}): +% \cmd\if@twocolumn. +% +% \section{Options}\label{sec:options}% +% +% \subsection{Define Booleans Used in Options}% +% The following Booleans are used within the document class to +% allow the document or the substyle to make selections +% of formatting. +% An explicit document class option overrides an assignment made by a substyle. +% +% \subsection{Declare Options}% +% +% \subsubsection{Checkin: for Editorial Use}% +% A document class option declaring that the document is being processed by the +% editorial staff. +% +% This option should: +% \begin{itemize} +% \item +% put date in footer along with folio +% \item +% Have the effect of selecting the \classoption{preprint} class option. +% \item +% Have the effect of selecting the \classoption{showpacs} class option. +% \item +% specify that when a float is placed h or H, it will be allowed to break over pages. +% (Note: be sure that if the enclosed \env{tabular} has an optional argument, you change it to [v], or remove it entirely.) +% \end{itemize} +% \changes{4.0c}{1999/11/13}{New option ``checkin''} +% \begin{macrocode} +\DeclareOption{checkin}{% + \@booleantrue\dateinRH@sw + \@booleantrue\preprintsty@sw + \def\@pointsize{12}% + \@booleantrue\showPACS@sw + \@booleantrue\showKEYS@sw + \def\fp@proc@h{\allow@breaking@tables}% + \def\fp@proc@H{\allow@breaking@tables}% +}% +\@booleanfalse\dateinRH@sw +\def\checkindate{\dateinRH@sw{{\tiny(\today)}}{}}% +\def\allow@breaking@tables{% + \def\array@default{v}% tabular can break over pages + \@booleanfalse\floats@sw % table can break over pages +}% +% \end{macrocode} +% +% \subsubsection{Preprint Style}% +% +% \begin{macro}{\preprintsty@sw} +% The boolean \cmd\preprintsty@sw\ signifies that +% the document is to be formatted in preprint style. +% \changes{4.0a}{1998/01/31}{Rearrange the ordering so numerical ones come first. AO: David, what does this mean?} +% \changes{4.0a}{1998/06/10}{comma not space between email and homepage} +% \changes{4.0b}{1999/06/20}{Move this ``complex'' option to the front, where it can be overridden by ``simple'' options.} +% \changes{4.1b}{2008/06/01}{Add option reprint, opposite of preprint, and preferred alternative to twocolumn} +% \begin{macrocode} +\DeclareOption{preprint}{% + \@booleantrue\preprintsty@sw + \ExecuteOptions{12pt}% +}% +\DeclareOption{reprint}{% +\@booleanfalse\preprintsty@sw +\@booleantrue\twocolumn@sw + \ExecuteOptions{10pt}% +}% +\DeclareOption{manuscript}{% + \class@warn{Document class option manuscript is obsolete; use preprint instead}% + \ExecuteOptions{preprint}% +}% +\@booleanfalse\preprintsty@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\showPACS@sw} +% \begin{macro}{\showKEYS@sw} +% If \cmd\showPACS@sw\ is true, print the PACS information in the title block, +% otherwise not. +% Similarly for \cmd\showKEYS@sw\ and the keywords. +% \subsubsection{Showing PACS and keywords}% +% \changes{4.0b}{1999/06/20}{New option} +% \changes{4.0e}{2000/09/20}{New option showkeys} +% \begin{macrocode} +\DeclareOption{showpacs}{% + \@booleantrue\showPACS@sw +}% +\DeclareOption{noshowpacs}{% + \@booleanfalse\showPACS@sw +}% +\DeclareOption{showkeys}{% + \@booleantrue\showKEYS@sw +}% +\DeclareOption{noshowkeys}{% + \@booleanfalse\showKEYS@sw +}% +\@booleanfalse\showPACS@sw +\@booleanfalse\showKEYS@sw +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Balance the last page when in two-column page grid}% +% +% \begin{macro}{\balancelastpage@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% If we are in a two-column page grid, we may wish to balance the columns +% of the last page. This will be done automatically if the +% \classoption{twocolumn} document class option is chosen. +% This action will be turned off by the \classoption{nobalancelastpage}. +% A complementary class option, \classoption{balancelastpage} is also provided. +% \begin{macrocode} +\DeclareOption{balancelastpage}{% + \@booleantrue\balancelastpage@sw +}% +\DeclareOption{nobalancelastpage}{% + \@booleanfalse\balancelastpage@sw +}% +\@booleantrue\balancelastpage@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Showing preprint numbers}% +% +% \begin{macro}{\preprint@sw} +% \changes{4.0d}{2000/04/10}{New option} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% \changes{4.1n}{2009/11/06}{(AO, 565) restore 4.0 behavior: default value of \cs{preprint@sw} follows \cs{preprintsty@sw}} +% The boolean \cmd\preprint@sw\ signifies that +% the preprints (cf. \cmd\preprint) are to be formatted (usually on the title page). +% The option \classoption{preprintnumbers} declares to do so, +% \classoption{nopreprintnumbers} declares not to; +% the default is to follow \cmd\preprintsty@sw. +% \begin{macrocode} +\DeclareOption{nopreprintnumbers}{\@booleanfalse\preprint@sw}% +\DeclareOption{preprintnumbers}{\@booleantrue\preprint@sw}% +\appdef\setup@hook{% + \@ifxundefined\preprint@sw{\let\preprint@sw\preprintsty@sw}{}% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Hypertext Option}% +% +% \changes{4.0a}{1998/01/31}{protect against hyperref revtex kludges which are not needed now} +% \changes{4.0b}{1999/06/20}{Move this ``complex'' option to the front, where it can be overridden by ``simple'' options.} +% \changes{4.0rc4}{2001/07/23}{hyperref is no longer loaded via class option: use a usepackage statement instead} +% \begin{macrocode} +\DeclareOption{hyperref}{% +% \end{macrocode} +% The following code had been commented out, it is now truly a comment: +% \begin{verbatim} +%\AtEndOfClass{% +% \begingroup +% \edef\@tempa{% +% \let +% \noexpand\@clsextension +% \noexpand\@empty +% \noexpand\RequirePackage{hyperref}% +% \def\noexpand +% \@clsextension{\@clsextension}% +% }% +% \expandafter +% \endgroup +% \@tempa +%}% +% \def\@pointsize{10}% +% \end{verbatim} +% +% If you have a hyper-foo enabled browser you may prefer this format +% which does not print the URL for the home page, but just makes the +% name a link, but by default print it so it works on paper. +% \changes{4.0a}{1998/01/31}{print homepage} +% +% \begin{macrocode} + \class@warn{Class option "hyperref" is no longer supported.^^JEmploy \string\usepackage{hyperref} instead}% +}% +% \end{macrocode} +% +% \subsubsection{Type Size}% +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% Use \cmd\@pointsize|=10| rather than \cmd\@ptsize|=0| to allow easy extensions +% to 9pt or whatever. +% Note: the three alternatives are mutually exclusive. +% +% At this point, the parameter \cmd\@pointsize\ is set to \cmd\undefined: +% a society \emph{must} give it a definition. +% \begin{macrocode} +\DeclareOption{10pt}{\def\@pointsize{10}}% +\DeclareOption{11pt}{\def\@pointsize{11}}% +\DeclareOption{12pt}{\def\@pointsize{12}}% +\let\@pointsize\@undefined +% \end{macrocode} +% +% \subsubsection{Media Size}% +% +% \begin{macro}{\paperheight} +% \begin{macro}{\paperwidth} +% \changes{4.0b}{1999/06/20}{Restore all media size class option of \protect\file{classes.dtx}} +% \begin{macrocode} +\DeclareOption{a4paper}{% + \setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}% +}% +\DeclareOption{a5paper}{% + \setlength\paperheight {210mm}% + \setlength\paperwidth {148mm}% +}% +\DeclareOption{b5paper}{% + \setlength\paperheight {250mm}% + \setlength\paperwidth {176mm}% +}% +\DeclareOption{letterpaper}{% + \setlength\paperheight {11in}% + \setlength\paperwidth {8.5in}% +}% +\DeclareOption{legalpaper}{% + \setlength\paperheight {14in}% + \setlength\paperwidth {8.5in}% +}% +\DeclareOption{executivepaper}{% + \setlength\paperheight {10.5in}% + \setlength\paperwidth {7.25in}% +}% +\DeclareOption{landscape}{% + \setlength\@tempdima {\paperheight}% + \setlength\paperheight {\paperwidth}% + \setlength\paperwidth {\@tempdima}% +}% +% \end{macrocode} +% +% \changes{4.1a}{2008/01/18}{(AO, 478) \cs{ds@letterpaper}, so that ``letterpaper really is the default''}% +% Effectively select \classoption{letterpaper}. +% \begin{macrocode} +\ds@letterpaper +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Bibnotes}% +% +% \begin{macro}{\frontmatter@footnote@produce} +% Frontmatter footnotes result from frontmatter commands like +% \cmd\email, \cmd\homepage, \cmd\altaffiliation, and \cmd\thanks. +% The default for \cmd\frontmatter@footnote@produce\ is +% \cmd\frontmatter@footnote@produce@footnote, which formats the frontmatter footnotes +% at the foot of the title page. The \classoption{bibnotes} class option +% defers them to the bibliography. +% \changes{4.1b}{2008/06/01}{(AO) Implement bibnotes through \cs{frontmatter@footnote@produce} instead of \cs{bibnotes@sw}}% +% \begin{macrocode} +\DeclareOption{bibnotes}{\let\frontmatter@footnote@produce\frontmatter@footnote@produce@endnote}% +\DeclareOption{nobibnotes}{\let\frontmatter@footnote@produce\frontmatter@footnote@produce@footnote}% +\let\frontmatter@footnote@produce\frontmatter@footnote@produce@footnote +\appdef\class@enddocumenthook{\auto@bib}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Footinbib}% +% +% \begin{macro}{\footinbib@sw} +% The boolean \cmd\footinbib@sw\ signifies that +% text footnotes are to be set in the bibliography, as endnotes. +% +% The document may set the value one way or the other via +% the following two class options. +% \begin{macrocode} +\DeclareOption{footinbib}{\@booleantrue\footinbib@sw} +\DeclareOption{nofootinbib}{\@booleanfalse\footinbib@sw} +% \end{macrocode} +% The default value is \cmd\false@sw, and the society or journal +% may override the default. +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% \begin{macrocode} +\@booleanfalse\footinbib@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{altaffilletter}% +% +% \begin{macro}{\altaffilletter@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% Determine the procedure \cmd\thefootnote\ used in frontmatter: +% the footnote symbol used in titlepage footnotes. +% \begin{macrocode} +\DeclareOption{altaffilletter}{\@booleantrue\altaffilletter@sw}% +\DeclareOption{altaffilsymbol}{\@booleanfalse\altaffilletter@sw}% +\@booleanfalse\altaffilletter@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{superbib}% +% +% \begin{macro}{\place@bibnumber} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% The procedure \cmd\place@bibnumber\ produces the number +% at the head of the \cmd\bibitem, in the bibliography. +% By default, it has the \cmd\bibnumfmt\ meaning assigned by the \classname{natbib} package. +% It may be overridden by society, journal, or by the document options. +% +% \begin{macrocode} +\DeclareOption{superbib}{% + \let\place@bibnumber\place@bibnumber@sup +}% +\def\place@bibnumber{\NATx@bibnumfmt}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\place@bibnumber@sup} +% \begin{macro}{\place@bibnumber@inl} +% For producing the \cmd\bibitem\ device, +% we define two procedures to select from. +% +% Note that we could have used \classname{natbib}'s \cmd\ifNAT@super\ +% switch, but it does not allow for altering the meaning of \cmd\bibnumfmt. +% \begin{macrocode} +\def\place@bibnumber@sup#1{\textsuperscript{#1}}% +\def\place@bibnumber@inl#1{[#1]}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{citeautoscript}% +% \begin{macro}{\citeautoscript@sw} +% This class option allows you to automatically accomodate a change from non-superscripted, numbered references +% to superscripted, bunmbered references. +% +% Note: you should always mark up your document with the assumption that references are \emph{not} going to be superscripted. +% Otherwise this option has no hope of working properly. +% +% \begin{macrocode} +\DeclareOption{citeautoscript}{\@booleantrue\citeautoscript@sw}% +\@booleanfalse\citeautoscript@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Variants on the Bibliography Style}% +% \changes{4.1b}{2008/07/01}{(AO) provide option longbibliography} +% +% \revtex\ anticipates that a society or journal will provide two related Bib\TeX bibliography style variants, +% designating one as the default. +% A pair of document class options \classoption{longbibliography} and \classoption{nolongbibliography} +% allows the user to explicitly select between them. +% \begin{macro}{\longbibliography@sw} +% +%\changes{4.2a}{2017/11/21}{(MD) Make long bibliography style the default now.} +% \revtex's default for \cmd\longbibliography@sw\ is \cmd\true@sw. +% +% \begin{macrocode} +\DeclareOption{longbibliography}{\@booleantrue\longbibliography@sw}% +\DeclareOption{nolongbibliography}{\@booleanfalse\longbibliography@sw}% +\@booleantrue\longbibliography@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eprint@enable@sw} +% \changes{4.1o}{2010/02/10}{(AO, 580) Provide a document class option to turn off production of eprint field in bibliography.} +% +% The document class options \classoption{eprint} and \classoption{noeprint} +% give the user the ability to turn off production of the \texttt{eprint} field in the bibliography. +% \begin{macrocode} +\DeclareOption{eprint}{\@booleantrue\eprint@enable@sw}% +\DeclareOption{noeprint}{\@booleanfalse\eprint@enable@sw}% +\@booleantrue\eprint@enable@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Simplex/Duplex Pages}% +% +% \begin{macro}{\twoside@sw} +% \changes{4.1b}{2008/07/01}{(AO) coordinate \cs{if@twoside} with \cs{twoside@sw}} +% The flag \cmd\twoside@sw\ signifies that the document is to be +% formatted for duplex printing. +% After the preamble is processed, we align the value +% of the kernel \cmd\newif\ switch \cmd\if@twoside\ +% to that of \cmd\twoside@sw. +% \cmd\if@twoside\ itself is used in the kernel's +% \cmd\cleardoublepage\ and \cmd\@outputpage\ procedures. +% \begin{macrocode} +\@booleanfalse\twoside@sw +\appdef\document@inithook{% + \twoside@sw{\@twosidetrue}{\@twosidefalse}% +}% +% \end{macrocode} +% \changes{4.0a}{1998/01/31}{4.d had twoside option setting twoside switch to false} +% The complementary options \classoption{twoside} and \classoption{oneside} +% assert formatting for duplex or simplex printing, respectively. +% At the same time, we arrange for the selection of the page grid +% with respect to the marginal column: +% Because \cmd\if@reversemargin\ remains default (false), +% if duplex printing, this column will always be on the (right), +% if simplex printing, it will always be on the (outside). +% QUERY: correct choice? +%FIXME: assign \cmd\if@mparswitch\ later (and protect the assignment, too). +% \begin{macrocode} +\DeclareOption{twoside}{\@booleantrue \twoside@sw\@mparswitchfalse}% +\DeclareOption{oneside}{\@booleanfalse\twoside@sw\@mparswitchtrue}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Two-Column Page Grid}% +% +% \begin{macro}{\twocolumn@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% \changes{4.1p}{2010/02/24}{(AO, 583) Provide interface to \classname{ltxgrid} \cs{onecolumn@grid@setup} and \cs{twocolumn@grid@setup}} +% The flag \cmd\twocolumn@sw\ signifies that the document is to be +% formatted in the two-column page grid. +% +% If no options relating to page grid are invoked by +% \cmd\AtBeginDcoument\ time, we set default values. +% Up to that point, the class can check if \cmd\twocolumn@sw\ +% is \cmd\undefined\ to see if any related options have been invoked. +% +% \classoption{onecolumn} specifies one-column page grid. +% The \classoption{twocolumn} class option employs the standard mechanism for +% changing the column grid: the \classname{ltxgrid} package. +% \begin{macrocode} +\DeclareOption{onecolumn}{\@booleanfalse\twocolumn@sw}% +\DeclareOption{twocolumn}{\@booleantrue\twocolumn@sw}% +\@booleanfalse\twocolumn@sw +% \end{macrocode} +% The column grid is determined by the state of the switch \cmd\twocolumn@sw +% and is effected at \cmd\class@documenthook\ time. +% The society or journal file may re-define \cmd\select@column@grid\ +% to accomodate, e.g., more than two choices for the page grid. +% +% Note that \cmd\open@column@two\ adds items to the Main Vertical List, +% so constitutes the true beginning of the document. +% +% Note also that if the selected column grid is a one-column grid, +% there is nothing to do, because \classname{ltxgrid} has already +% set that up via \cmd\@begindocumenthook. +% \begin{macrocode} +\def\select@column@grid{% + \twocolumn@sw{% + \twocolumn@grid@setup + \open@twocolumn + }{% + \onecolumn@grid@setup +% \end{macrocode} +% \begin{verbatim} +% \open@onecolumn +% \end{verbatim} +% \begin{macrocode} + }% +}% +\appdef\class@documenthook{% + \select@column@grid +}% +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\clear@document} +% \changes{4.1n}{2009/12/05}{(AO, 569) Use of \classname{hyperref} interferes with column balancing of last page}% +% +% We install into \cmd\class@enddocumenthook\ +% a trap for the procedure \cmd\clearpage\ that attempts to end the current page. +% This procedure needs to be headpatched with \cmd\close@column\ to end the current page grid. +% +% This procedure is executed after all typesetting is complete +% i.e., after items like \cmd\printtables, as well as all commands queued up by \cmd\AtEndDocument. +% +% \begin{macrocode} +\appdef\setup@hook{% + \let\clearpage@ltx\clearpage + \prepdef\clear@document{\let\clearpage\clearpage@ltx\let\clear@document\@empty\close@column}% + \appdef\class@documenthook{% + \appdef\class@enddocumenthook{% + \let\clearpage\clear@document + }% + }% +}% +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\authoryear@sw} +% \changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +% The boolean \cmd\authoryear@sw\ signifies that we are to use author-year citations rather than numerical citations. +% +% The \classoption{author-year} class option selects ``'author-year'' citations; +% \classoption{numerical} selectes ``numerical'' citations. +% The former is the default. +% \begin{macrocode} +\DeclareOption{author-year}{\@booleantrue\authoryear@sw}% +\DeclareOption{numerical}{\@booleanfalse\authoryear@sw}% +\@booleanfalse\authoryear@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\galley@sw} +% The boolean \cmd\galley@sw\ signifies that +% the document is to be formatted in galley style. +% +% Asserting both \cmd\galley@sw\ and \cmd\preprintsty@sw\ +% may produce strange formatting results, but it is not illegal. +% However, it \emph{is} illegal to assert galley and any +% twocolumn option. +% \begin{macrocode} +% \end{macrocode} +% \classoption{galley} emulates setting the galleys of +% a two-column journal. +% CHANGED: this option should effectively set \cmd\preprintsty@sw\ false. +% NOTE: it makes no sense to assert both galley and twocolumn. +% \changes{4.1b}{2008/07/01}{Class option galley sets \cs{preprintsty@sw} to false} +% +% \begin{macrocode} +\DeclareOption{galley}{% + \ExecuteOptions{onecolumn}% + \@booleantrue\galley@sw + \@booleanfalse\preprintsty@sw + \appdef\setup@hook{% + \advance\textwidth-\columnsep + \textwidth.5\textwidth + }% +}% +\@booleanfalse\galley@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{raggedbottom or flushbottom}% +% \begin{macro}{\raggedcolumn@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% The class options \classoption{raggedbottom} and \classoption{flushbottom} determine whether the columns (page) +% are ragged bottom or flush bottom. +% Note that we do not select a default here; that is done by the journal substyle. +% \begin{macrocode} +\DeclareOption{raggedbottom}{\@booleantrue\raggedcolumn@sw} +\DeclareOption{flushbottom}{\@booleanfalse\raggedcolumn@sw} +\@booleanfalse\raggedcolumn@sw +\appdef\setup@hook{% + \raggedcolumn@sw{\raggedbottom}{\flushbottom}% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{tightenlines}% +% +% This class option specifies that standard leading +% is to be used to set the type. +% If lacking, the leading will be loose. +% +% \begin{macro}{\tightenlines@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% The boolean \cmd\tightenlines@sw\ signifies that +% the leading is to be made standard amount. +% If false, it means that the leading is to be set extra open. +% Has no effect on 10pt size option. +% +% \begin{macrocode} +\DeclareOption{tightenlines}{\@booleantrue\tightenlines@sw} +\@booleanfalse\tightenlines@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{lengthcheck}% +% +% \begin{macro}{\lengthcheck@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% The flag \cmd\lengthcheck@sw\ signifies that +% the length checking is in effect. +% It is up to the individual journal substyle +% to alter its formatting accordingly. +% \begin{macrocode} +\@booleanfalse\lengthcheck@sw +% \end{macrocode} +% This class option specifies that the formatted document +% should approach as closely as possible the +% formatting of an actual journal article +% to facilitate the author's performance of a length check. +% +%FIXME: society or journal may have its own definition of this option. +% \begin{macrocode} +\DeclareOption{lengthcheck}{% + \@booleantrue\lengthcheck@sw + \ExecuteOptions{reprint}% +}% +% \end{macrocode} +% In addition, if length checking is in effect, we will enable +% the tally of text length. +% \begin{macrocode} +\appdef\setup@hook{% + \lengthcheck@sw{\@booleantrue\tally@box@size@sw}{}% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Draft and Final}% +% +% \begin{macro}{\draft@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% The flag \cmd\draft@sw\ signifies that the document is to be +% formatted in draft mode. +% +% \begin{macrocode} +\appdef\setup@hook{% + \draft@sw{\overfullrule 5\p@}{\overfullrule\z@}% +}% +% \end{macrocode} +% +% Certain packages may pay attention to the +% class option \classoption{draft} that sets this Boolean. +% \begin{macrocode} +\DeclareOption{draft}{\@booleantrue\draft@sw}% +\DeclareOption{final}{\@booleanfalse\draft@sw}% +\@booleanfalse\draft@sw +% \end{macrocode} +% +% \end{macro} +% +% \subsubsection{eqsecnum}% +% +% \begin{macro}{\eqsecnum@sw} +% The flag \cmd\eqsecnum@sw\ signifies that equations are to be +% numbered with the section, e.g., ``Eq. (2.13)''. +% \begin{macrocode} +\appdef\setup@hook{% + \eqsecnum@sw{% + \@addtoreset{equation}{section}% + \def\theequation@prefix{\arabic{section}.}% + }{}% +}% +% \end{macrocode} +% +% The \classoption{eqsecnum} class option signifies that equations are +% to be numbered within sections. +% \begin{macrocode} +\DeclareOption{eqsecnum}{\@booleantrue\eqsecnum@sw}% +\@booleanfalse\eqsecnum@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{secnumarabic}% +% \changes{4.1b}{2008/07/01}{(AO) No longer use \cs{secnumarabic@sw}, instead use \cs{setup@secnums}} +% The \classoption{secnumarabic} class option signifies that sectioning commands are +% to be numbered arabic: +% the procedure \cmd\secnums@arabic\ is executed as the default. +% Otherwise, the procedure \cmd\secnums@rtx\ determines things. +% The society or journal may redefine either procedure, +% and may change the definition of \cmd\setup@secnums\ itself, +% thereby establishing a different default. +% \begin{macrocode} +\appdef\setup@hook{% + \setup@secnums +}% +\DeclareOption{secnumarabic}{% + \def\setup@secnums{\secnums@arabic}% +}% +\def\setup@secnums{\secnums@rtx}% +% \end{macrocode} +% The code that defines \cmd\secnums@rtx\ and \cmd\secnums@arabic\ appears +% in Section~\ref{sec:secnumarabic}. +% +% \begin{macro}{fleqn} +% FIXME: model fleqn after amsfonts. I no longer understand why I said this. +% \file{fleqn.clo} is not a package, so it can simply be \cmd\input. +% \begin{macrocode} +\DeclareOption{fleqn}{% + \input{fleqn.clo}% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{floats/endfloats}% +% +% \begin{macro}{\floats@sw} +% \begin{macro}{\floatp@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% The Boolean \cmd\floats@sw\ signifies that floats are to be floated; +% if false, that floats are to be deferred to the end of the document. +% By default, the former. +% Note that the state of this Boolean is to be changed by +% the document class in response to user-selected options. +% +% This boolean and the assignment of its default value is done by +% the \classname{ltxutil} package. +% +% The Boolean \cmd\floatp@sw\ signifies that endfloats are to be set one per page; +% if false, that endfloats are to be set with multiple floats per page permitted. +% By default, the latter. +% Note that the state of this Boolean is to be changed by +% the document class in response to user-selected options. +% The default is established here. +% +% These options control, via the Boolean \cmd\floats@sw, +% whether floats are to be migrated to the end of the document. +% \begin{macrocode} +\DeclareOption{floats}{\@booleantrue\floats@sw\@booleanfalse\floatp@sw} +\DeclareOption{endfloats}{\@booleanfalse\floats@sw\@booleanfalse\floatp@sw} +\DeclareOption{endfloats*}{\@booleanfalse\floats@sw\@booleantrue\floatp@sw} +\@booleantrue\floats@sw +\@booleantrue\floatp@sw +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{titlepage/notitlepage}% +% These options control, via \cmd\titlepage@sw, +% whether the title block is to be set on a separate page. +% +% \begin{macro}{\titlepage@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% The flag \cmd\titlepage@sw\ signifies that a forced +% page break is to follow the title page: the article +% title appears on a page by itself. +% +% \begin{macrocode} +\DeclareOption{titlepage}{\@booleantrue\titlepage@sw} +\DeclareOption{notitlepage}{\@booleanfalse\titlepage@sw} +\@booleanfalse\titlepage@sw +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Substyle and Sub-substyle}% +% +% \begin{macro}{\change@society} +% \begin{macro}{\change@journal} +% \changes{4.1b}{2008/07/01}{(AO) Provide more diagnostics when \cs{@society} is assigned.} +% If the society or, resp., journal has already been assigned, +% notify user whether it is being overridden. +% +% \begin{macrocode} +\def\change@society#1{% + \def\@tempa{#1}% + \@ifxundefined\@society{% + \class@info{Selecting society \@tempa}% + \let\@society\@tempa + }{% + \@ifx{\@tempa\@society}{}{% + \class@warn{Conflicting society \@tempa<>\@society; not selected}% + }% + }% +}% +\def\change@journal#1{% + \def\@tempa{#1}% + \@ifxundefined\@journal{% + \class@info{Selecting journal \@tempa}% + \let\@journal\@tempa + }{% + \@ifx{\@tempa\@journal}{}{% + \class@warn{Conflicting journal \@tempa<>\@journal; not selected}% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Here had been the class options relating to the APS. +% Now that all societies are on an equal footing, this code is in the +% respective \file{.rtx} file. +% \begin{macrocode} +% \end{macrocode} +% +% \subsubsection{Optical Society of America}% +% Here are the class options relating to the Optical Society of America. +% +% Note: as of 2008, the only OSA module being distributed by ctan is \file{osajnl.rtx}. +% The class options declared here are, I think, unused. +% \begin{macrocode} +\DeclareOption{osa}{\change@society{osa}\let\@journal\@undefined}% +\DeclareOption{osameet}{\change@society{osa}\def\@journal{osameet}}% +\DeclareOption{opex}{\change@society{osa}\def\@journal{opex}}% +\DeclareOption{tops}{\change@society{osa}\def\@journal{tops}}% +\DeclareOption{josa}{\change@society{osa}\def\@journal{josa}}% +% \end{macrocode} +% +% \begin{macro}{\rtx@require@packages} +% \changes{4.1b}{2008/07/01}{Read in all required packages together} +% The procedure \cmd\rtx@require@packages\ accumulates all \cmd\RequirePackage\ statements +% in the course of loading the document class. +% Carrying out these operations at that time is needed: +% \cmd\ProcessOptions\ must be executed first. +% \begin{macrocode} +\let\rtx@require@packages\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MakeUppercase} +% \begin{macro}{\MakeLowercase} +% \changes{4.1b}{2008/07/01}{Package textcase is now simply a required package} +% \changes{4.1b}{2008/07/01}{Read in all required packages together} +% \changes{4.1g}{2009/10/07}{(AO, 538) \cs{MakeTextUppercase} inappropriately expands the double backslash} +% We load the \classname{textcase} package of David Carlisle. +% Now that its bug of long standing has been repaired, we no longer need to doctor it up. +% And, because its loading has been deferred until \cmd\rtx@require@packages\ time, +% we no longer override \LaTeX\ here. Instead, the \classname{textcase} package +% will be asked to do that. +% \begin{macrocode} +\appdef\rtx@require@packages{% + \RequirePackage[overload]{textcase}% +}% +% \end{macrocode} +% The following code used to +% let the \classname{textcase} commands override those of \LaTeX: +% \begin{verbatim} +%\appdef\setup@hook{% +% \expandafter +% \let\csname MakeUppercase \expandafter\endcsname +% \csname MakeTextUppercase \endcsname +% \expandafter +% \let\csname MakeLowercase \expandafter\endcsname +% \csname MakeTextLowercase \endcsname +% }% +% \end{verbatim} +% \end{macro} +% \end{macro} +% +% \begin{macro}{amsfonts} +% \changes{4.1b}{2008/07/01}{Read in all required packages together} +% The class option \classoption{amsfonts} has the +% same effect as if the document preamble contained +% a \cmd\usepackage\verb${amsfonts}$ statement. +% \begin{macrocode} +\DeclareOption{amsfonts}{% + \def\class@amsfonts{\RequirePackage{amsfonts}}% +}% +\DeclareOption{noamsfonts}{% + \let\class@amsfonts\@empty +}% +\appdef\rtx@require@packages{% + \@ifxundefined\class@amsfonts{}{\class@amsfonts}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{amssymb} +% \changes{4.1b}{2008/07/01}{Read in all required packages together} +% The class option \classoption{amssymb} has the +% same effect as if the document preamble contained +% a \cmd\usepackage\verb${amssymb}$ statement. +% \begin{macrocode} +\DeclareOption{amssymb}{% + \def\class@amssymb{\RequirePackage{amssymb}}% +}% +\DeclareOption{noamssymb}{% + \let\class@amssymb\@empty +}% +\appdef\rtx@require@packages{% + \@ifxundefined\class@amssymb{}{\class@amssymb}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{amsmath} +% \changes{4.1b}{2008/07/01}{Read in all required packages together} +% The class option \classoption{amsmath} has the +% same effect as if the document preamble contained +% a \cmd\usepackage\verb${amsmath}$ statement. +% +% We require version 1.2 (datestamped 1997/03/20) or later. +% The \expandafter\cmd\csname ver@amsmath.sty\endcsname, will +% +% \LaTeX\ note: +% Certain \LaTeX\ procedures have an arbitrary and pointless restriction that they may be used only within the preamble. +% We get around this by preserving the procedures in private \cmd\csname s. +% +% FIXME note: it is difficult to ensure that an error summary will be printed on the console at the very end, +% but \classname{ltxgrid} allows accomplishing this via an interrupt, put down at \cmd\AtEndDocument\ time. +% +% \begin{macrocode} +\DeclareOption{amsmath}{% + \def\class@amsmath{\RequirePackage{amsmath}[\ver@amsmath@prefer]}% +}% +\DeclareOption{noamsmath}{% + \let\class@amsmath\@empty +}% +\appdef\rtx@require@packages{% + \preserve@LaTeX + \@ifxundefined\class@amsmath{}{\class@amsmath}% + \appdef\class@enddocumenthook{\test@amsmath@ver}% +}% +\appdef\preserve@LaTeX{% + \let\@ifl@aded@LaTeX\@ifl@aded + \let\@ifpackageloaded@LaTeX\@ifpackageloaded + \let\@pkgextension@LaTeX\@pkgextension + \let\@ifpackagelater@LaTeX\@ifpackagelater + \let\@ifl@ter@LaTeX\@ifl@ter + \let\@ifl@t@r@LaTeX\@ifl@t@r + \let\@parse@version@LaTeX\@parse@version +}% +\appdef\restore@LaTeX{% + \let\@ifl@aded\@ifl@aded@LaTeX + \let\@ifpackageloaded\@ifpackageloaded@LaTeX + \let\@pkgextension\@pkgextension@LaTeX + \let\@ifpackagelater\@ifpackagelater@LaTeX + \let\@ifl@ter\@ifl@ter@LaTeX + \let\@ifl@t@r\@ifl@t@r@LaTeX + \let\@parse@version\@parse@version@LaTeX +}% +\def\test@amsmath@ver{% + \begingroup + \restore@LaTeX + \@ifpackageloaded{amsmath}{% + \@ifpackagelater{amsmath}{\ver@amsmath@prefer}{}{% + \class@warn{% + You have loaded amsmath, version "\csname ver@amsmath.sty\endcsname",\MessageBreak + but this class requires version "\ver@amsmath@prefer", or later.\MessageBreak + Please update your LaTeX installation. + }% + }% + }{% + }% + \endgroup +}% +\def\ver@amsmath@prefer{2000/01/15 v2.05 AMS math features}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Presenting Authors and Their Affiliations}% +% \changes{4.1b}{2008/07/01}{Code relating to new syntax for frontmatter has been placed in \file{ltxfront.dtx}} +% Class options for presenting authors and their affiliations are now defined in +% \file{ltxfront.dtx}. +% +% \begin{macrocode} +% \end{macrocode} +% +% \subsubsection{Typeset by \revtex}% +% +% \begin{macro}{\byrevtex@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% The flag \cmd\byrevtex@sw\ signifies that the document should +% bear an imprint to the effect that it was formatted by this document class. +% +% The class option \classoption{byrevtex} signifies that you want the +% ``Typeset by \revtex'' byline to appear on your formatted output. +% By default, no such byline appears. +% \begin{macrocode} +\DeclareOption{byrevtex}{\@booleantrue\byrevtex@sw}% +\@booleanfalse\byrevtex@sw +% \end{macrocode} +% \end{macro} +% +% \subsection{Attempt to fix float placement failure}% +% +% \begin{macro}{\force@deferlist@sw} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% \revtex\ uses the \classname{ltxgrid} package, which provides the ability to attempt repairs when +% \LaTeX's float placement mechanism is about to fail, but that facility is turned off by default. +% Users should invoke the \classoption{floatfix} document class option to enable this \LaTeX\ extension. +% If not, a helpful message is printed in the log, indicating how to work around the difficulty. +% \begin{macrocode} +\DeclareOption{floatfix}{\@booleantrue\force@deferlist@sw}% +\DeclareOption{nofloatfix}{\@booleanfalse\force@deferlist@sw}% +\@booleanfalse\force@deferlist@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fltovf} +% \begin{macro}{\@fltstk} +% The \LaTeX\ kernel error message \cmd\@fltovf\ may now be a bit more helpful to the user; +% likewise for the \cmd\@fltstk\ message of \classname{ltxgrid}. +% \begin{macrocode} +\gdef\@fltovf{% + \@latex@error{% + Too many unprocessed floats% + \force@deferlist@sw{}{; try class option [floatfix]}% + }\@ehb +}% +\def\@fltstk{% + \@latex@warning{% + A float is stuck (cannot be placed)% + \force@deferlist@sw{}{; try class option [floatfix]}% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ltxgrid@info@sw} +% \begin{macro}{\outputdebug@sw} +% The two options \classoption{ltxgridinfo} and \classoption{outputdebug} turn on informative diagnostics within the +% package \classname{ltxgrid}. Only people who really want to see this output will select these class options. +% Consult documentation for the \classname{ltxgrid} package to see what output the related switches enable. +% \begin{macrocode} +\DeclareOption{ltxgridinfo}{% + \@booleantrue\ltxgrid@info@sw +%\@booleantrue\ltxgrid@foot@info@sw +}% +\DeclareOption{outputdebug}{% + \@booleantrue\outputdebug@sw + \@booleantrue\ltxgrid@info@sw + \@booleantrue\ltxgrid@foot@info@sw + \traceoutput +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Option to relax page height}% +% +% \begin{macro}{\textheight@sw} +% The \classname{ltxgrid} package can set text pages to their natural height or force them to the full +% text height; the latter is the default. +% If setting the pages with a variable length, +% the running foot will move up or down with the natural length of the text column. +% While I recommend against doing so, this option will turn that switch to the latter setting. +% \begin{macrocode} +\DeclareOption{raggedfooter}{\@booleanfalse\textheight@sw}% +\DeclareOption{noraggedfooter}{\@booleantrue\textheight@sw}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Selecting procedure for processing abstract}% +% \changes{4.1b}{2008/07/01}{Remove options newabstract and oldabstract} +% Code defining options \classoption{newabstract} and \classoption{oldabstract} has been removed. +% +% \subsection{Option to turn on diagnostics in the frontmatter}% +% +% \begin{macro}{\frontmatterverbose@sw} +% \changes{4.1b}{2008/07/01}{Code relating to new syntax for frontmatter has been placed in \file{ltxfront.dtx}} +% A diagnostic option, not for the average enduser, which reveals +% the workings of the frontmatter. +% This code interfaces to that of \file{ltxfront.dtx}. +% \begin{macrocode} +\DeclareOption{frontmatterverbose}{\@booleantrue\frontmatterverbose@sw}% +\@booleanfalse\frontmatterverbose@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\linenumbers@sw} +% \changes{4.1f}{2009/07/07}{(AO, 513) Add class option linenumbers: number the lines a la \classname{lineno}} +% \changes{4.1n}{2009/12/13}{(AO, 573) arrange to load \classname{lineno} after any other packages.}% +% An option to number the lines of type in the output in the manner of \classname{lineno}. +% +% At present, we use that very package to implement this functionality. +% This means that users may modify the workings of that package per its documentation (which see). +% +% However, compatibility with \classname{amsmath} requires that \classname{lineno} be loaded afterwards. +% Therefore, we defer loading of this package until after the preamble is completed. +% \begin{macrocode} +\DeclareOption{linenumbers}{% + \appdef + \class@documenthook{% + \RequirePackage{lineno}[2005/11/02 v4.41]% + \linenumbersep4pt\relax + \linenumbers\relax + }% +}% +% \end{macrocode} +% By default, line numbering is off. +% \end{macro} +% +% \begin{macro}{\NAT@merge} +% \changes{4.1f}{2009/07/15}{(AO, 523) Add class option nomerge, to turn off new natbib 8.3 syntax} +% Add class option nomerge, to turn off natbib 8.3 syntax for citation key. +% The default value of REVTeX 4.1 for \cmd\NAT@merge is \cmd\thr@@, which turns on +% the new syntax along with its semantics. +% Legacy documents that would be incompatible with the new syntax can be successfully processed +% with class option \classoption{nomerge}. +% \begin{macrocode} +\DeclareOption{nomerge}{% + \appdef\setup@hook{% + \@ifnum{\NAT@merge>\z@}{\let\NAT@merge\z@}{}% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Default Option, Society, Journal, and pointsize}% +% +% \changes{4.1a}{2008/01/18}{(AO, 488) Change processing of options to allow an unused option to specify society and journal}% +% This change will not break OSA documents because that society is still built in to revtex4. +% +% \begin{macro}{\@parse@class@options@society} +% \begin{macro}{\@parse@class@options@} +% \changes{4.1b}{2008/07/01}{Procedures \cs{@parse@class@options@society} and \cs{@parse@class@options@journal} and friends} +% The procedure \cmd\@parse@class@options@society\ parses the options passed to this document class +% for the \cmd\@society. +% It is like \cmd\ProcessOptions*\ in that it accesses +% \cmd\@ptionlist\{\cmd\@currname.\cmd\@currext\}. +% Any undefined option is considered: if there is a corresponding \file{.rtx} file, +% it will change the society accordingly +% and define a placeholder class option for the society thus found +% (thus preventing a spurious "option not found" message). +% +% The procedure \cmd\@parse@class@options@\ parses the document's options +% for any that set the \cmd\csname\ provided. +% \begin{macrocode} +\def\@parse@class@options@society{% + \edef\@tempa{\@ptionlist{\@currname.\@currext}}% + \expandafter\@for\expandafter\CurrentOption\expandafter:\expandafter=\@tempa\do{% + \expandafter\@ifnotrelax\csname ds@\CurrentOption\endcsname{}{% + \IfFileExists{\CurrentOption\substyle@post.\substyle@ext}{% + \expandafter\change@society\expandafter{\CurrentOption}% + \expandafter\let\csname ds@\CurrentOption\endcsname\@empty + }{}% + }% + }% +}% +\def\@parse@class@options@#1{% + \edef\@tempa{\@ptionlist{\@currname.\@currext}}% + \expandafter\@for\expandafter\CurrentOption\expandafter:\expandafter=\@tempa\do{% + \expandafter\@ifnotrelax\csname ds@\CurrentOption\endcsname{% + \begingroup\csname ds@\CurrentOption\endcsname + \@ifxundefined#1{% + \endgroup + }{% + \expandafter\endgroup\expandafter\def\expandafter#1\expandafter{#1}% + }% + }{}% + }% +}% +\def\@parse@class@options@journal{% + \edef\@tempa{\@ptionlist{\@currname.\@currext}}% + \expandafter\@for\expandafter\CurrentOption\expandafter:\expandafter=\@tempa\do{% + \expandafter\@ifnotrelax\csname ds@\CurrentOption\endcsname{% + \begingroup + \csname ds@\CurrentOption\endcsname + \@ifxundefined\@journal{% + \endgroup + }{% + \expandafter\endgroup\expandafter\def\expandafter\@journal\expandafter{\@journal}% + }% + }{}% + }% +}% +\def\@parse@class@options{% + \edef\@tempa{\@ptionlist{\@currname.\@currext}}% + \expandafter\@for\expandafter\CurrentOption\expandafter:\expandafter=\@tempa\do{% + \expandafter\@ifnotrelax\csname ds@\CurrentOption\endcsname{% + \begingroup + \csname ds@\CurrentOption\endcsname + \@ifxundefined\@pointsize{% + \endgroup + }{% + \expandafter\endgroup\expandafter\def\expandafter\@pointsize\expandafter{\@pointsize}% + }% + }{% + \IfFileExists{\CurrentOption\substyle@post.\substyle@ext}{% + \expandafter\change@society\expandafter{\CurrentOption}% + \expandafter\let\csname ds@\CurrentOption\endcsname\@empty + }{}% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{4.1j}{2009/10/25}{(AO, 545) hypertext capabilities off by default; enable with \classoption{hypertext}} +% The class option \classoption{hypertext} enables the built-in hypertext capabilities, +% which coincide with those of \classname{custom-bib}-generated BIBTeX styles +% using the guard code \texttt{hypertext}. +% +% Note that APS has these capabilities turned off by default; +% Loading the hyperref package turns them on. +% \begin{macrocode} +\DeclareOption{hypertext}{\hypertext@enable@ltx}% +\appdef\document@inithook{\@ifpackageloaded{hyperref}{\hypertext@enable@ltx}{}}% +% \end{macrocode} +% +% The default handling for a document class option depends upon whether the \cmd\@society\ is +% defined. +% +% If not, then hunt for a \file{.rtx} file with that name. +% If it exists, then we will take this option as the name of the society, +% otherwise, declare the option as not used. +% +% (This behavior is similar to the \LaTeX2.09 handling, where +% one looked for a \file{.sty} file, except that +% in this case, we must provide for journal substyles that may be +% defined in the society file, or have their own journal substyle file.) +% +% At the point where the class file is finished loading, +% we then read in the society file. +% That file can define further class options, such as the journal substyle. +% +% For users, this will mean that they can specify the society and journal simply +% by specifying first the former and then the latter among their document class options. +% The society \emph{must} have a corresponding \file{.rtx}. +% +% \changes{4.1b}{2008/05/29}{The csname substyle@ext is now defined without a dot (.), to be compatible with \LaTeX usage (see @clsextension and @pkgextension).} +% +% \begin{macrocode} +%</options> +% \end{macrocode} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macro}{\@process@society} +% \begin{macro}{\@process@journal} +% \begin{macro}{\@process@pointsize} +% \begin{macrocode} +\def\substyle@post{4-2}% +\def\substyle@ext{rtx}% +\DeclareOption*{\OptionNotUsed}% +% \end{macrocode} +% A society substyle may define its own options, via \cmd\DeclareOption. +% +% At the end of this document class, we process the society file, +% using \file{aps.rtx} if none has been specified in the document. +% \begin{macrocode} +\def\@process@society#1{% + \@ifxundefined\@society{% + \class@warn{No Society specified, using default society #1}% + \def\@society{#1}\let\@journal\@undefined + }{}% + \expandafter\input\expandafter{\@society\substyle@post.\substyle@ext}% +}% +% \end{macrocode} +% +% A society substyle can encompass any number of journal substyles; +% we use the following procedure to invoke the proper one. +% \begin{macrocode} +\def\@process@journal#1{% + \@ifxundefined\@journal{% + \class@warn{No journal specified, using default #1}% + \def\@journal{#1}% + }{}% + \expandafter\expandafter + \expandafter\rtx@do@substyle + \expandafter\expandafter + \expandafter{\expandafter\@society\@journal}% +}% +\def\rtx@do@substyle#1{% + \InputIfFileExists{#1\substyle@post.\substyle@ext}{}{\csname rtx@#1\endcsname}% +}% +% \end{macrocode} +% +% Document class options \classoption{10pt}, \classoption{11pt}, and \classoption{12pt} +% are implemented by \revtex\ itself and determine \cmd\@pointsize. +% These provide formatting settings appropriate to the society's journals. +% +% If not specified by the document, a value \cmd\@pointsize@default\ is used. +% This default can be set by the journal. Here, the society sets its default. +% \begin{macrocode} +\def\@process@pointsize#1{% + \@ifxundefined\@pointsize{% + \def\@pointsize{#1}% + \class@warn{No type size specified, using default \@pointsize}% + }{}% + \expandafter\expandafter + \expandafter\rtx@do@substyle + \expandafter\expandafter + \expandafter{\expandafter\@society\@pointsize pt}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Class-Asserted Options}% +% \changes{4.0b}{1999/06/20}{Removed invocation of nonexistent class option \protect\classoption{groupauthors} and all other class options that should only be invoked by the document. (Otherwise precedence of class options does not work.)} +% Here we establish the default document class options. +% Those of the document itself will override these. +% +% \section{Procedures Dependent Upon Options} +% +% Here we introduce \classname{classes.dtx} definitions for +% the page styles that people will expect to be able to use. +% \begin{macro}{\ps@headings} +% \begin{macro}{\ps@myheadings} +% \begin{macrocode} + \def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\thepage\hfil\slshape\leftmark}% + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\sectionmark##1{% + \markboth {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ + \thesection\quad + \fi + ##1}}{}}% + \def\subsectionmark##1{% + \markright {% + \ifnum \c@secnumdepth >\@ne + \thesubsection\quad + \fi + ##1}}}% +\def\ps@myheadings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\thepage\hfil\slshape\leftmark}% + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + }% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ps@article} +% \begin{macro}{\ps@article@final} +% \begin{macro}{\ps@preprint} +% \changes{4.0a}{1998/01/31}{Move after process options, so the following test works} +% \changes{4.0b}{1999/06/20}{Defer decision until \cs{AtBeginDocument} time} +% \changes{4.0c}{1999/11/13}{Insert procedure \cs{checkindate}} +% \changes{4.0rc1}{2001/06/17}{Running headers always as if two-sided} +% \begin{macrocode} +\def\ps@article{% + \def\@evenhead{\let\\\heading@cr\thepage\quad\checkindate\hfil{\leftmark}}% + \def\@oddhead{\let\\\heading@cr{\rightmark}\hfil\checkindate\quad\thepage}% + \def\@oddfoot{}% + \def\@evenfoot{}% + \let\@mkboth\markboth + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +\def\ps@article@final{% + \def\@evenhead{\let\\\heading@cr\thepage\quad\checkindate\hfil{\leftmark}}% + \def\@oddhead{\let\\\heading@cr{\rightmark}\hfil\checkindate\quad\thepage}% + \def\@oddfoot{}% + \def\@evenfoot{}% + \let\@mkboth\markboth + \def\sectionmark##1{% + \markboth{% + \MakeTextUppercase{% + \@ifnum{\c@secnumdepth >\z@}{\thesection\hskip 1em\relax}{}% + ##1% + }% + }{}% + }% + \def\subsectionmark##1{% + \markright {% + \@ifnum{\c@secnumdepth >\@ne}{\thesubsection\hskip 1em\relax}{}% + ##1% + }% + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\heading@cr{\unskip\space\ignorespaces}% +% \end{macrocode} +% +% \changes{4.0c}{1999/11/13}{Do not put by REVTeX in every page foot} +% \changes{4.0c}{1999/11/13}{Insert procedure \cs{checkindate}} +% \begin{macrocode} +\def\ps@preprint{% + \def\@oddfoot{\hfil\thepage\quad\checkindate\hfil}% + \def\@evenfoot{\hfil\thepage\quad\checkindate\hfil}% + \def\@oddhead{}% + \def\@evenhead{}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble +}% +% \end{macrocode} +% +% \begin{macrocode} +\let\@oddhead\@empty +\let\@evenhead\@empty +\let\@oddfoot\@empty +\let\@evenfoot\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lastpage@putlabel} +% Support the default meaning of \cmd\@endpage. +% \changes{4.0a}{1998/01/31}{Move after process options, so \cs{clearpage} not in scope of twocolumn} +% \changes{4.1k}{2009/11/06}{(AO, 554) give the \cs{newlabel} command syntax appropriate to the hyperref package} +% Name of this macro (and the \cmd\label\ key) taken from +% \url{CTAN:/macros/latex/contrib/other/lastpage}% +% with code optimised slightly. +% \begin{macrocode} +\def\lastpage@putlabel{% + \if@filesw + \begingroup + \advance\c@page\m@ne + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}{}{}{}}}% + \endgroup + \fi +}% +% \end{macrocode} +% Install a procedure into document endgame processing that +% labels the last page of the document. +% This is done just before the \file{.aux} file +% is closed, and does not require a \cmd\shipout, because it writes +% directly to the \file{.aux} file. +% Note that we assume no further \cmd\shipout s will be done past this point. +% \changes{4.1n}{2009/12/09}{(AO, 569) execute the after-last-shipout procedures from within the safety of the output routine}% +% \begin{macrocode} +\appdef\clear@document{% + \do@output@cclv{% + \lastpage@putlabel + \tally@box@size@sw{\total@text}{}% + }% +}% +\providecommand\write@column@totals{}% +% \end{macrocode} +% \end{macro} +% +% +% \section{Required Packages} +% \url{CTAN:macros/latex/contrib/other/misc/url.sty}% +% \begin{macrocode} +\appdef\rtx@require@packages{% + \RequirePackage{url}% +}% +% \end{macrocode} +% +% \section{Incompatible Packages} +% +% We wait until after the preamble is processed, then check for any packages +% that might have been loaded which we know to be incompatible with \revtex. +% +% The \classname{multicol} package is incompatible with \classname{ltxgrid}, which replaces it. +% The \classname{cite} package is incompatible with \classname{natbib}, which replaces its functionality. +% The functionality of the \classname{mcite} package is provided by \classname{natbib}. +% \begin{macrocode} +\appdef\document@inithook{% + \incompatible@package{cite}% + \incompatible@package{mcite}% + \incompatible@package{multicol}% +}% +% \end{macrocode} +% +% \section{Society- and Journal-Specific Code} +% +% \begin{macro}{\@journal} +% Journal test helper, used as +% \begin{verbatim} +%\@ifx{\@journal\journal@pra}{% +% <journal-specific setup> +%\fi +% \end{verbatim} +% Journal code might like to further specify (if as yet undefined) or distinguish on +% the following Booleans. +% +% Note: the journal substyle code should only alter the value of one of these Booleans if +% the Boolean is \cmd\undefined. This convention is what makes the document's +% options take precedence over the values set by the journal. +% +% FIXME: make this table an exhaustive listing of all the parameters set by +% the class options. +% +% \begin{tabular}{ll} +% \cmd\@pointsize &(10|11|12), depending on the type size\\ +% \cmd\footinbib@sw &true if footnotes are to be formatted in the bibliography\\ +% \cmd\preprintsty@sw &true for preprint and hyperpreprint\\ +% \cmd\eqsecnum@sw &true means that equations are numbered within sections\\ +% \cmd\groupauthors@sw &true means authors listed separately for each address\\ +% \cmd\preprint@sw &true means to produce the preprint numbers as part of the title block\\ +% \cmd\showPACS@sw &true means to produce the PACS as part of the title block\\ +% \cmd\showKEYS@sw &true means to produce the keywords as part of the title block\\ +% \cmd\@affils@sw &true means each affiliation is printed, for each author\\ +% \cmd\runinaddress@sw &true means author addresses are printed run-in\\ +% \cmd\draft@sw &true implies that PACS will be printed\\ +% \cmd\tightenlines@sw &true if preprint single spaced\\ +% \cmd\lengthcheck@sw &true if length checking is in effect\\ +% \cmd\byrevtex@sw &true means to announce ``typeset by \revtex''\\ +% \cmd\titlepage@sw &true for title is to be set on a separate page\\ +% \cmd\twocolumn@sw &true if two-column page grid\\ +% \cmd\twocolumn@sw &true if we are to automatically balance the columns of the last page\\ +% \cmd\twoside@sw &true means to format pages for duplex printing\\ +% \cmd\floats@sw &false means floats are migrated to end of document\\ +% \cmd\floatp@sw &true means endfloats are set one to a page\\ +% \cmd\class@amsfonts &if \cmd\@empty, means that \classname{amsfonts} will \emph{not} be loaded\\ +% \cmd\class@amssymb &if \cmd\@empty, means that \classname{amssymb} will \emph{not} be loaded\\ +% \cmd\frontmatter@footnote &if \cmd\undefined, means that the default (\cmd\footnote) will be used\\ +% \cmd\place@bibnumber &if \cmd\undefined, means that the default (inline) will be used\\ +% \end{tabular} +% +% Note: if \cmd\twocolumn@sw\ and \cmd\preprintsty@sw\ are both false, +% then `galley' style is in effect. The \classoption{galley} option invokes +% \classoption{onecolumn}, but does not affect the \cmd\preprintsty@sw. +% +% Note: \cmd\paperwidth\ and \cmd\paperheight\ are not integrated into this scheme, +% and should be selected by the document alone. +% \end{macro} +% +% \section{Body} +% +% \subsection{counters} +% The following definitions are probably identical to those in +% \file{classes.dtx}% +% \begin{macrocode} +\def\labelenumi{\theenumi.} +\def\theenumi{\arabic{enumi}} +% \end{macrocode} +% +% \begin{macrocode} +\def\labelenumii{(\theenumii)} +\def\theenumii{\alph{enumii}} +\def\p@enumii{\theenumi} +% \end{macrocode} +% +% \begin{macrocode} +\def\labelenumiii{\theenumiii.} +\def\theenumiii{\roman{enumiii}} +\def\p@enumiii{\theenumi(\theenumii)} +% \end{macrocode} +% +% \begin{macrocode} +\def\labelenumiv{\theenumiv.} +\def\theenumiv{\Alph{enumiv}} +\def\p@enumiv{\p@enumiii\theenumiii} +% \end{macrocode} +% +% \begin{macrocode} +\def\labelitemi{\textbullet} +\def\labelitemii{\normalfont\bfseries\textendash} +\def\labelitemiii{\textasteriskcentered} +\def\labelitemiv{\textperiodcentered} +% \end{macrocode} +% +% \begin{macrocode} +\pagenumbering{arabic} +% \end{macrocode} +% +% \subsection{float parameters} +% +% from the old aps.sty. (DPC: same as article I think) +% AO: here, \LaTeX's standard classes fail very poorly +% (the price of backward compatability): the values for +% \cmd\floatpagefraction\ and \cmd\dblfloatpagefraction\ +% need to be raised to avoid creating extremely short +% float pages. +% \begin{macrocode} +\setcounter{topnumber}{2} +\def\topfraction{.9} +\setcounter{bottomnumber}{1} +\def\bottomfraction{.9} +\setcounter{totalnumber}{3} +\def\textfraction{.1} +\def\floatpagefraction{.9} +\setcounter{dbltopnumber}{2} +\def\dbltopfraction{.9} +\def\dblfloatpagefraction{.9} +% \end{macrocode} +% +% \subsection{List Environments} +% +% \begin{macrocode} +\newenvironment{verse}{% + \let\\=\@centercr + \list{}{% + \itemsep\z@ \itemindent -1.5em\listparindent \itemindent + \rightmargin\leftmargin\advance\leftmargin 1.5em}\item[]% +}{% + \endlist +}% +% \end{macrocode} +% +% \begin{macrocode} +\newenvironment{quotation}{% + \list{}{% + \listparindent 1.5em + \itemindent\listparindent + \rightmargin\leftmargin \parsep \z@ \@plus\p@}\item[]% +}{% + \endlist +}% +% \end{macrocode} +% +% \begin{macrocode} +\newenvironment{quote}{% + \list{}{% + \rightmargin\leftmargin}\item[]% +}{% + \endlist +}% +% \end{macrocode} +% +% \changes{4.1b}{2008/06/30}{(AO) Structure the Abstract using the \texttt{bibliography} environment} +% \begin{macrocode} +\def\descriptionlabel#1{% + \hspace\labelsep \normalfont\bfseries #1\unskip:% +}% +% \end{macrocode} +% +% \begin{macrocode} +\newenvironment{description}{% + \list{}{% + \labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel + }% +}{% + \endlist +}% +% \end{macrocode} +% +% \subsection{Sectioning Commands\label{sec:secnumarabic}} +% +% \subsubsection{Sectioning Commands and Their Productions}% +% The following counters are defined by LaTeX's standard document classes. +% We do likewise, then assign flag values to the productions, awaiting +% overrides. +% \begin{macrocode} +\newcounter{part}% +\let\thepart\@undefined +\newcounter{section}% +\let\thesection\@undefined +\newcounter{subsection}[section]% +\let\thesubsection\@undefined +\newcounter{subsubsection}[subsection]% +\let\thesubsubsection\@undefined +\newcounter{paragraph}[subsubsection]% +\let\theparagraph\@undefined +\newcounter{subparagraph}[paragraph]% +\let\thesubparagraph\@undefined +% \end{macrocode} +% The procedure invoked by \cmd\setup@secnums\ provides meanings for these productions. +% +% \begin{macro}{\secnums@rtx} +% \begin{macro}{\secnums@arabic} +% These two procedures define the meanings of each of the productions +% of the counters of the sectioning commands, +% but only if nothing else has defined it. +% \begin{macrocode} +\def\secnums@rtx{% + \@ifxundefined\thepart{% + \def\thepart{\Roman{part}}% + }{}% + \@ifxundefined\thesection{% + \def\thesection {\Roman{section}}% + \def\p@section {}% + }{}% + \@ifxundefined\thesubsection{% + \def\thesubsection {\Alph{subsection}}% + \def\p@subsection {\thesection\,}% + }{}% + \@ifxundefined\thesubsubsection{% + \def\thesubsubsection {\arabic{subsubsection}}% + \def\p@subsubsection {\thesection\,\thesubsection\,}% + }{}% + \@ifxundefined\theparagraph{% + \def\theparagraph {\alph{paragraph}}% + \def\p@paragraph {\thesection\,\thesubsection\,\thesubsubsection\,}% + }{}% + \@ifxundefined\thesubparagraph{% + \def\thesubparagraph {\arabic{subparagraph}}% + \def\p@subparagraph {\thesection\,\thesubsection\,\thesubsubsection\,\theparagraph\,}% + }{}% +}% +\def\secnums@arabic{% + \@ifxundefined\thepart{% + \def\thepart {\Roman{part}}% + }{}% + \@ifxundefined\thesection{% + \def\thesection {\Roman{section}}% + \def\p@section {}% + }{}% + \@ifxundefined\thesubsection{% + \def\thesubsection {\thesection.\arabic{subsection}}% + \def\p@subsection {}% + }{}% + \@ifxundefined\thesubsubsection{% + \def\thesubsubsection {\thesubsection.\arabic{subsubsection}}% + \def\p@subsubsection {}% + }{}% + \@ifxundefined\theparagraph{% + \def\theparagraph {\thesubsubsection.\arabic{paragraph}}% + \def\p@paragraph {}% + }{}% + \@ifxundefined\thesubparagraph{% + \def\thesubparagraph {\theparagraph.\arabic{subparagraph}}% + \def\p@subparagraph {}% + }{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{The Acknowledgments Environment}% +% This user-level markup produces a head introducing +% the acknowledgments, and acts as a wrapper for the text. +% In this implementation, it is an unnumbered section, +% but appears within the toc. +% +% For compatiability's sake, we implement it under the alternative +% spelling \env{acknowledgements}. +% \changes{4.0c}{1999/11/13}{also spelled ``acknowledgements''.} +% \changes{4.0d}{2000/05/18}{But alternative spelling is deprecated.} +% \begin{macrocode} +\newenvironment{acknowledgments}{% + \acknowledgments@sw{% + \expandafter\section\expandafter*\expandafter{\acknowledgmentsname}% + }{% + \par + \phantomsection + \addcontentsline{toc}{section}{\protect\numberline{}\acknowledgmentsname}% + }% +}{% + \par +}% +\@booleantrue\acknowledgments@sw +\newenvironment{acknowledgements}{% + \replace@environment{acknowledgements}{acknowledgments}% +}{% + \endacknowledgments +}% +% \end{macrocode} +% +% \subsubsection{Part Opener}% +% section setup copied verbatim from revtex3 aps/osa. +% Does not explicitly depend on pointsize options. +% \begin{macrocode} +\def\part{\par + \addvspace{4ex}% + \@afterindentfalse + \secdef\@part\@spart}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@part[#1]#2{% + \@ifnum{\c@secnumdepth >\m@ne}{% + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% + }{% + \addcontentsline{toc}{part}{#1}% + }% + \begingroup + \parindent \z@ \raggedright + \interlinepenalty\@M + \@ifnum{\c@secnumdepth >\m@ne}{% + \Large \bf \partname~\thepart% + \par\nobreak + }{}% + \huge \bf + #2% + \markboth{}{}\par + \endgroup + \nobreak + \vskip 3ex + \@afterheading +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@spart#1{{\parindent \z@ \raggedright + \interlinepenalty\@M + \huge \bf + #1\par} + \nobreak + \vskip 3ex + \@afterheading} +% \end{macrocode} +% +% \subsubsection{Stacked Heads}% +% Here are the class default definitions for sectioning commands. +% A society or a journal substyle will likely override these definitions. +% +% In doing so, you can customize the formatting for a particular level by defining, +% e.g., \cmd\@hangfrom@section\ or \cmd\@subsectioncntformat. +% \begin{macrocode} +\def\section{% + \@startsection + {section}% + {1}% + {\z@}% + {0.8cm \@plus1ex \@minus .2ex}% + {0.5cm}% + {\normalfont\small\bfseries}% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\subsection{% + \@startsection + {subsection}% + {2}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {\normalfont\small\bfseries}% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\subsubsection{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {\normalfont\small\itshape}% +}% +% \end{macrocode} +% +% \subsubsection{Runin Heads}% +% \begin{macrocode} +\def\paragraph{% + \@startsection + {paragraph}% + {4}% + {\parindent}% + {\z@}% + {-1em}% + {\normalfont\normalsize\itshape}% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\subparagraph{% + \@startsection + {subparagraph}% + {5}% + {\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}% +}% +% \end{macrocode} +% +% +% \subsection{Math} +% +% \begin{macro}{\theequation} +% We change the production of the equation counter so that +% we can accomodate the \classoption{eqsecnum} option. +% \begin{macrocode} +\def\theequation{% + \theequation@prefix\arabic{equation}% +}% +\def\theequation@prefix{}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Type Size-Dependent Settings} +% +% \subsection{All Point Sizes} +% \begin{macrocode} +\setcounter{secnumdepth}{4} +% \end{macrocode} +% +% \begin{macrocode} +\lineskip 1pt +\normallineskip 1pt +\def\baselinestretch{1}% +% \end{macrocode} +% +% \begin{macrocode} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +% \end{macrocode} +% +% \begin{macrocode} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +% \end{macrocode} +% +% \begin{macrocode} +\arraycolsep 3pt +\tabcolsep 2pt +\arrayrulewidth .4pt +\doublerulesep 2pt +% \end{macrocode} +% +% \begin{macrocode} +\skip\@mpfootins = 0pt +% \end{macrocode} +% +% \begin{macrocode} +\fboxsep = 3.0pt +\fboxrule = 0.4pt +% \end{macrocode} +% +% \subsection{Figures} +% \changes{4.0b}{1999/06/20}{Processing delayed to \cs{AtBeginDocument} time} +% +% \begin{environment}{figure} +% We define the \env{figure} environment. +% Later, we will horse around with its meaning +% in order to accomodate \cmd\floats@sw. +% \begin{macrocode} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +% \end{macrocode} +% \end{environment} +% +% \begin{macrocode} +\def\listoffigures{\print@toc{lof}}% +\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}}% +% \end{macrocode} +% +% \begin{macro}{\@makecaption} +% If caption is one line long, to be centered; if lines turn, then set justified. +% \begin{macrocode} +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{2\p@} +% \end{macrocode} +% +% \changes{4.0b}{1999/06/20}{One-line caption sets flush left.} +% \changes{4.0c}{1999/11/13}{Prevent an inner footnote from performing twice} +% \changes{4.1a}{2008/01/18}{(AO, 460) ``Proper style is "FIG. 1. ..." (no colon)''}% +% There is a hook \cmd\@caption@fignum@sep\ for determining +% the separator following the float number, e.g., ``Fig.1''. +% Formerly, we had defined it to be ``: '', now the colon has been replace by a period (full stop). +% \begin{macrocode} +\long\def\@makecaption#1#2{% + \par +% \nobreak + \vskip\abovecaptionskip + \begingroup + \small\rmfamily + \sbox\@tempboxa{% + \let\\\heading@cr + \@make@capt@title{#1}{#2}% + }% + \@ifdim{\wd\@tempboxa >\hsize}{% + \begingroup + \samepage + \flushing + \let\footnote\@footnotemark@gobble + \@make@capt@title{#1}{#2}\par + \endgroup + }{% + \global \@minipagefalse + \hb@xt@\hsize{\hfil\unhbox\@tempboxa\hfil}% + }% + \endgroup + \vskip\belowcaptionskip +}% +\def\@make@capt@title#1#2{% + \@ifx@empty\float@link{\@firstofone}{\expandafter\href\expandafter{\float@link}}% + {#1}\@caption@fignum@sep#2% +}% +\def\@footnotemark@gobble{% + \@footnotemark + \@ifnextchar[{\@gobble@opt@i}{\@gobble}% +}% +\def\@gobble@opt@i[#1]#2{}% +\def\@mpmakefntext#1{% + \flushing + \parindent=1em + \noindent + \hb@xt@1em{\hss\@makefnmark}% + #1% +}% +\def\@caption@fignum@sep{. }% +\def\setfloatlink{\def\float@link}% +\let\float@link\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thefigure} +% The figure counter and float placement defaults. +% \begin{macrocode} +\newcounter{figure} +\renewcommand \thefigure {\@arabic\c@figure} +% \end{macrocode} +% Note that we give the `!' modifier by default. +% This is an effort to avoid the syndrome wherein +% a deferred float finds itself unqualified for +% placement, thereby getting carried until \cmd\clearpage. +% \begin{macrocode} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +% \end{macrocode} +% We allocate a box register for use in tallying the column inches of floats of this type. +% \begin{macrocode} +\expandafter\newbox\csname fbox@\ftype@figure\endcsname +\expandafter\setbox\csname fbox@\ftype@figure\endcsname\hbox{}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Deferring \env{figure} Floats}% +% +% We determine if figures are to float or be deferred until \cmd\printfigures\ time. +% If so, we open the stream that will receive the deferred document portions. +% \begin{macrocode} +\appdef\class@documenthook{% + \do@if@floats{figure}{.fgx}% +}% +\appdef\class@enddocumenthook{% + \printfigures\relax +}% +% \end{macrocode} +% +% \begin{macro}{\printfigures} +% The user-level command \cmd\printfigures\ determines +% where the figures are to appear in a document in which +% \cmd\floats@sw\ is false. +% If the user invokes the \classoption{endfloats} class option and fails to +% insert a \cmd\printfigures\ command, +% the figures will be printed at the end of the document. +% If the command is given, but floats are not being deferred, +% it amounts to a no-op. +% \changes{4.0b}{1999/06/20}{call \cs{print@floats}} +% \changes{4.0c}{1999/11/13}{*-form mandates pagebreak} +% \begin{macrocode} +\newcommand\printfigures{% + \@ifstar{\true@sw}{\floatp@sw{\true@sw}{\false@sw}}% + {% + \print@float{figure}{\oneapage}% + }{% + \print@float{figure}{}% + }% +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@xfloat@prep} +% We patch into the procedure \cmd\@xfloat@prep. +% This patch applies to all floats (not \env{figure} alone) +% and makes the type center. +% \begin{macrocode} +\appdef\@xfloat@prep{% + \appdef\@parboxrestore{\centering}% +%\let\@makefnmark\@makefnmark@latex +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Tables} +% \changes{4.0b}{1999/06/20}{Processing delayed to \cs{AtBeginDocument} time} +% +% DPC: More or less taken from \file{revtex2} \file{aps.sty}, +% but using dcolumn for decimal alignment. +% \begin{environment}{table} +% We define the \env{table} environment. +% Later, we will horse around with its meaning +% in order to accomodate \cmd\floats@sw. +% \begin{macrocode} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\thetable} +% Table counter and default float placement declarations. +% \begin{macrocode} +\newcounter{table} +\renewcommand\thetable{\@Roman\c@table} +% \end{macrocode} +% Note that we give the `!' modifier by default. +% This is an effort to avoid the syndrome wherein +% a deferred float finds itself unqualified for +% placement, thereby getting carried until \cmd\clearpage. +% \begin{macrocode} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +% \end{macrocode} +% We allocate a box register for use in tallying the column inches of floats of this type. +% \begin{macrocode} +\expandafter\newbox\csname fbox@\ftype@table\endcsname +\expandafter\setbox\csname fbox@\ftype@table\endcsname\hbox{}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\def\listoftables{\print@toc{lot}}% +\let\l@table\l@figure +% \end{macrocode} +% +% \begin{macro}{\table@hook} +% \begin{macro}{\squeezetable} +% Assign a meaning to the hook installed into float processing. +% +% By default floats are \cmd\small. The \cmd\squeezetable\ declaration +% makes them smaller (\cmd\scriptsize). In general you can locally +% redefine \cmd\table@hook\ to be whatever you like. +% (DPC: |\Huge\color{magenta}|\ldots?) +% \begin{macrocode} +\def\table@hook{\small}% +\def\squeezetable{\def\table@hook{\scriptsize}}% +\appdef\@floatboxreset{\table@hook}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Deferring \env{table} Floats}% +% +% After all packages are loaded, we decide +% if tables will float or will be deferred until \cmd\printtables\ time. +% +% We also deal with the possibility of \env{longtable} environments. +% +% \begin{macrocode} +\def\set@table@environments{% + \floats@sw{}{% + \let@environment{longtable@float}{longtable}% + \let@environment{longtable}{longtable@write}% + \let@environment{longtable*@float}{longtable*}% + \let@environment{longtable*}{longtable*@write}% + \let@environment{turnpage@float}{turnpage}% + \let@environment{turnpage}{turnpage@write}% + }% + \do@if@floats{table}{.tbx}% +}% +\appdef\document@inithook{% + \set@table@environments +}% +\appdef\class@enddocumenthook{% + \printtables\relax +}% +\newenvironment{longtable@write}{% + \write@@float{longtable}{table}% +}{% + \endwrite@float +}% +\newenvironment{longtable*@write}{% + \write@@float{longtable*}{table}% +}{% + \endwrite@float +}% +\newenvironment{turnpage@write}{% + \immediate\write\tablewrite{\string\begin{turnpage}}% +}{% + \immediate\write\tablewrite{\string\end{turnpage}}% +}% +% \end{macrocode} +% +% \begin{macro}{\printtables} +% The user-level command \cmd\printtables\ determines +% where the tables are to appear in a document in which +% \cmd\floats@sw\ is false. +% If the user invokes the \classoption{nofloats} and fails to +% insert a \cmd\printtables\ command, +% the tables will be printed at the end of the document. +% If the command is given, but floats are not being deferred, +% it amounts to a no-op. +% \changes{4.0b}{1999/06/20}{only execute if appropriate} +% \changes{4.0c}{1999/11/13}{*-form mandates pagebreak} +% \changes{4.0d}{2000/05/17}{make longtable trigger the head, too} +% \begin{macrocode} +\newcommand\printtables{% + \begingroup + \let@environment{longtable}{longtable@float}% + \let@environment{longtable*}{longtable*@float}% + \let@environment{turnpage}{turnpage@anchored}% + \prepdef\longtable{\trigger@float@par}% + \expandafter\prepdef\csname longtable*\endcsname{\trigger@float@par}% + \expandafter\prepdef\csname table@floats\endcsname{% + \onecolumngrid@push + }% + \expandafter\appdef\csname endtable@floats\endcsname{% + \onecolumngrid@pop + }% + \@ifstar{\true@sw}{\floatp@sw{\true@sw}{\false@sw}}% + {% + \print@float{table}{\oneapage}% + }{% + \print@float{table}{}% + }% + \endgroup +}% +\newenvironment{turnpage@anchored}{% + \onecolumngrid@push + \setbox\z@\vbox to\textwidth\bgroup + \columnwidth\textheight +}{% + \vfil + \egroup + \rotatebox{90}{\box\z@}% + \onecolumngrid@pop +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Videos} +%\changes{4.1r}{2010/06/22}{(AO, 595) Provide \cs{lovname} along with other List of Videos definitions.}% +% +% \begin{environment}{video} +% We define the \env{video} environment analogously to the +% \env{figure} and \env{table} environments; it is intended to contain a video. +% +% \begin{macrocode} +\newenvironment{video} + {\@float{video}} + {\end@float}% +\newenvironment{video*} + {\@dblfloat{video}} + {\end@dblfloat}% +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\thevideo} +% The video counter, float placement defaults, strings. +% \begin{macrocode} +\newcounter{video} +\renewcommand \thevideo {\@arabic\c@video} +% \end{macrocode} +% +% File extension and localizable strings. +% \begin{macrocode} +\def\ext@video{lov}% +\def\fname@video{Video}% +\def\lovname{List of Videos}% +% \end{macrocode} +% +% Float type and default placement. +% \begin{macrocode} +\def\fps@video{tbp}% +\def\ftype@video{4}% +\def\fnum@video{\fname@video~\thevideo}% +\appdef\document@inithook{% + \@ifxundefined\c@float@type{}{% + \global\setcounter{float@type}{8}% + }% +}% +% \end{macrocode} +% We allocate a box register for use in tallying the column inches of floats of this type. +% \begin{macrocode} +\expandafter\newbox\csname fbox@\ftype@video\endcsname +\expandafter\setbox\csname fbox@\ftype@video\endcsname\hbox{}% +% \end{macrocode} +% The documentation for the \classname{hyperref} package, \file{hyperref.dtx} states: +% ``classes or package which introduce new elements need to define +% an equivalent \verb+\theH<name>+ for every \verb+\the<name>+'' +% We do accordingly here. +% \begin{macrocode} +\let\theHvideo\thevideo +% \end{macrocode} +% But \file{hyperref.dtx} goes on to say, +% ``We do make a trap to make \verb+\theH<name>+ be the same as \verb+\arabic{<name>}+, +% if \verb+\theH<name>+ is not defined\ldots'' +% However, it's not doing that right now (as of 6.77u), +% and I cannot find any such code in there anymore. +% \end{macro} +% +% \begin{macrocode} +\def\listofvideos{\print@toc{lov}}% +\let\l@video\l@figure +% \end{macrocode} +% +% \subsubsection{Deferring \env{video} Floats}% +% +% We determine if videos are to float or be deferred until \cmd\printvideos\ time. +% If so, we open the stream that will receive the deferred document portions. +% \begin{macrocode} +\appdef\class@documenthook{% + \do@if@floats{video}{.vdx}% +}% +\appdef\class@enddocumenthook{% + \printvideos\relax +}% +% \end{macrocode} +% +% \begin{macro}{\printvideos} +% The user-level command \cmd\printvideos\ determines +% where the videos are to appear in a document in which +% \cmd\floats@sw\ is false. +% If the user invokes the \classoption{endfloats} class option and fails to +% insert a \cmd\printvideos\ command, +% the videos will be printed at the end of the document. +% If the command is given, but floats are not being deferred, +% it amounts to a no-op. +% \begin{macrocode} +\newcommand\printvideos{% + \@ifstar{\true@sw}{\floatp@sw{\true@sw}{\false@sw}}% + {% + \print@float{video}{\oneapage}% + }{% + \print@float{video}{}% + }% +}% +% \end{macrocode} +% \end{macro} +% +% +% \section{Tabular} +% Every APS tabular has a double (Scotch) rule above and below. +% The column specifier ``d'' is implemented using the \classname{dcolumn} +% package, if available. +% FIXME: always load dcolumn! +% \begin{macro}{\tabular@hook} +% \begin{macro}{\endtabular@hook} +% \begin{environment}{ruledtabular} +% \begin{macrocode} +\def\endtabular@hook{}% +% \end{macrocode} +% \begin{verbatim} +%\RequirePackage{dcolumn}% +% \end{verbatim} +% \begin{macrocode} +\appdef\document@inithook{% + \@ifpackageloaded{dcolumn}{% + \expandafter\@ifnotrelax\csname NC@find@d\endcsname{}{% + \newcolumntype{d}{D{.}{.}{-1}}% + }% + }{}% +}% +\def\toprule{\hline\hline}% +\def\colrule{\hline}% +\def\botrule{\hline\hline}% +\newenvironment{ruledtabular}{% + \def\array@default{v}% + \appdef\tabular@hook{\def\@halignto{to\hsize}}% + \let\tableft@skip@default\tableft@skip + \let\tableft@skip\tableft@skip@float + \let\tabmid@skip@default\tabmid@skip + \let\tabmid@skip\tabmid@skip@float + \let\tabright@skip@default\tabright@skip + \let\tabright@skip\tabright@skip@float + \let\array@row@pre@default\array@row@pre + \let\array@row@pre\array@row@pre@float + \let\array@row@pst@default\array@row@pst + \let\array@row@pst\array@row@pst@float + \appdef\array@row@rst{% + \let\array@row@pre\array@row@pre@default + \let\array@row@pst\array@row@pst@default + \let\tableft@skip\tableft@skip@default + \let\tabmid@skip\tabmid@skip@default + \let\tabright@skip\tabright@skip@default + \appdef\tabular@hook{\let\@halignto\@empty}% + }% +}{% +}% +% \end{macrocode} +% \end{environment} +% \end{macro} +% \end{macro} +% +% \section{Footnote Text} +% +% \changes{4.0a}{1998/06/10}{single space footnotes} +% \changes{4.0b}{1999/06/20}{Frank Mittelbach, has stated in \protect\classname{multicol}: ``The kernel command \cs{@footnotetext} should not be modified.'' Thus, I have removed David Carlisle's redefinition of that command. Note, however, that later versions of \protect\classname{multicol} do not require this workaround. Belt and suspenders.}% +% +% \begin{macro}{\@makefntext} +% \begin{macro}{\@makefnmark} +% We customize the presentation of the footnote mark: it will not be italic. +% \begin{macrocode} +\def\@makefntext#1{% + \def\baselinestretch{1}% + \parindent1em% + \noindent + \hb@xt@1.8em{% + \hss\@makefnmark + }% + #1% + \par +}% +\def\@makefnmark{% + \hbox{% + \@textsuperscript{% + \normalfont\@thefnmark + }% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Citations, Bibliography, Endnotes} +% +% \subsubsection{Bibliography} +% +% Load Patrick Daly's \classname{natbib} package, +% \url{ftp://ctan.tug.org/macros/latex/contrib/supported/natbib} +% +% Note that \classname{natbib} assumes that it loads +% over a document class, such as the \classname{article} class, +% that has already defined \env{thebibliography} and \cmd\@listi. +% +% Note also that \classname{natbib} also installs a command +% \cmd\NAT@set@cites\ into \cmd\AtBeginDocument\ which presumes +% that the proper \cmd\bibpunct\ command has been issued. +% +% Note that the macro \cmd\NAT@sort\ controls +% whether citations are left alone (\cmd\NAT@sort=0), sorted (\cmd\NAT@sort=1), or sorted and compressed (\cmd\NAT@sort=2). +% Since we give \classname{natbib} the \classoption{sort\&compress} option, +% if you prefer \classoption{sort}, you need only \cmd\let \cmd\NAT@sort\ to be \cmd\@ne. +% However, if you prefer the effect of having neither \classoption{sort} nor \classoption{sort\&compress}, +% you must \cmd\let \cmd\NAT@sort\ to be \cmd\z@ and you must also define +% \cmd\let\cmd\NAT@cmprs\ to be \cmd\z@. +% +% As of version 8.2, \classname{natbib} now no longer binds at the point where it is read in. +% This means that we can freely change \cmd\NAT@sort, \cmd\NAT@cmprs, and the new +% \cmd\NAT@merge. Henceforth, we require that this later version be used. +% +% For other \classname{natbib} customizations, you may proceed as if you were going to use +% the \file{natbib.cfg} file: anything that you can modify by this means is fair game. +% Once \revtex\ is finished loading, you can assert any definitions for \classname{natbib} that you wish. +% +% \begin{macro}{\rev@citet} +% \begin{macro}{\rev@citealp} +% \begin{macro}{\rev@citealpnum} +% We define variants on \classname{natbib}'s commands \cmd\citet, \cmd\citealp, and \cmd\citealpnum. +% \cmd\rev@citealpnum\ uses a numerical citation. +% \cmd\rev@citealp\ and \cmd\rev@citealpnum\ are the aliases of \cmd\onlinecite, +% \cmd\rev@citet\ that of \cmd\textcite. +% +% In each case, we invoke \cmd\rtx@swap@citea\ to effect different productions between +% multiple arguments to the \cmd\cite\ command. +% +% \cmd\rev@citealpnum\ provides textual citations where superscript citations are the default. +% These should be accessible via the \cmd\citet\ command. +% +% Therefore we remember how to do a numerical citation +% even when the superscript citation has been selected. +% \begin{macrocode} +\expandafter\DeclareRobustCommand +\expandafter\rev@citet +\expandafter{% + \expandafter\begingroup + \expandafter\rtx@swap@citea + \expandafter\g@bblefirsttoken + \csname citet \endcsname +}% +\expandafter\DeclareRobustCommand +\expandafter\rev@citealp +\expandafter{% + \expandafter\begingroup + \expandafter\rtx@swap@citea + \expandafter\g@bblefirsttoken + \csname citealp \endcsname +}% +\expandafter\DeclareRobustCommand +\expandafter\rev@citealpnum +\expandafter{% + \expandafter\begingroup + \expandafter\rtx@swap@citenum + \expandafter\g@bblefirsttoken + \csname citealp \endcsname +}% +\def\rtx@swap@citenum{% + \rtx@swap@citea + \let\@cite\NAT@citenum + \let\NAT@mbox\mbox + \let\citeyear\NAT@citeyear + \let\NAT@space\NAT@spacechar +}% +\def\g@bblefirsttoken{% + \expandafter\true@sw + \expandafter\@empty +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\rtx@citesuper} +% We prepare to redefine \classname{natbib}'s procedure \cmd\NAT@citesuper, +% which is executed when setting a superscript citation. +% The \cmd\hspace\ is removed: in any case, it +% should really be \cmd\hspace*, to prevent an unwanted pagebreak. +% \begin{macrocode} +\newcommand\rtx@citesuper[3]{% + \ifNAT@swa + \leavevmode + \unskip +% \hspace{1\p@}% + \textsuperscript{\normalfont#1}% + \if*#3*\else\ (#3)\fi + \else + #1% + \fi + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefnmark@cite} +% We define a procedure that will set a footnote mark the same way that +% a citation is set. If footnotes are put in the bibliography with +% \cmd\footinbib@sw, then the corresponding mark should look the same +% as the result of a \cmd\cite. This is how we do it. +% \begin{macrocode} +\def\@makefnmark@cite{\begingroup\NAT@swatrue\@cite{{\@thefnmark}}{}{}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rtx@bibsection} +% Prepare to override \classname{natbib}'s definition of \cmd\bibsection. +% \begin{macrocode} +\def\rtx@bibsection{% + \@ifx@empty\refname{% + \par + }{% +% \let\@hangfroms@section\@hang@froms + \expandafter\section\expandafter*\expandafter{\refname}% + \@nobreaktrue + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rtx@swap@citea} +% \begin{macro}{\rtx@def@citea} +% \begin{macro}{\rtx@def@citea@close} +% \begin{macro}{\rtx@def@citea@box} +% The procedures |\rtx@def@citea|, |\rtx@def@citea@close|, and |\rtx@def@citea@box| +% can take over the management of \classname{natbib}'s |\@citea| macro to effect more sophisticated +% behavior of the punctuation between textual citations. The switch is performed by \cmd\rtx@swap@citea. +% +% \changes{4.1j}{2009/10/25}{(AO, 552) Repair spacing in \cs{onlinecite}} +% In these procedures, we use \cmd\count@\ to count the number of arguments of the \cmd\cite\ command, +% and we use \cmd\c@NAT@ctr\ to keep track of which argument we are processing. +% The latter counter is created by \classname{natbib} and used there solely in bibliography processing, +% where it keeps track of the reference number. +% We take over its use in these macros, but only locally; therefore these procedures should work properly, even within the bibliography. +%FIXME: check whether this is true! +% +% Because we are using a scratch counter \cmd\count@, we are vulnerable to other \TeX\ programmers +% who patch in to \classname{natbib}'s processing and who might use that counter at the same time we are doing so. +% This is a potential source of trouble for us. +%FIXME: store the value of \cmd\count@\ in a private \cmd\csname! +% +% Note that \cmd\rtx@def@citea\ begins the same as \cmd\NAT@def@citea, which it replaces, +% then makes further decisions based on the values of the counters. +% +% Note also that, in \classname{natbib}, the replacement part of \cmd\NAT@def@citea@close\ could be rewritten as +% \cmd\NAT@def@citea\cmd\prepdef\cmd\@citea\verb+{+\cmd\NAT@@close\verb+}+, which +% would them obviate the need for us to override its meaning. +% +% Note, too, the effect of \cmd\rtx@def@citea@box, which replaces \cmd\NAT@def@citea@box, +% is almost the same as the latter, except the entire \cmd\@citea\ is given as the argument +% of \cmd\NAT@mbox. +% +% Finally, bear in mind that the English (and some American editors) do not place a comma +% before the ``and''; our procedures do (but they could be rewritten with that convention). +% \begin{macrocode} +\def\rtx@swap@citea{% + \let\NAT@def@citea\rtx@def@citea + \let\NAT@def@citea@close\rtx@def@citea@close + \let\NAT@def@citea@box\rtx@def@citea@box +}% +\def\rtx@def@citea{% + \def\@citea{\NAT@separator\NAT@space}% + \advance\c@NAT@ctr\@ne + \@ifnum{\count@>\tw@}{% + \@ifnum{\c@NAT@ctr=\count@}{\appdef\@citea{\NAT@conj\NAT@space}}{}% + }{% + \def\@citea{\NAT@space\NAT@conj\NAT@space}% + }% +}% +\def\rtx@def@citea@close{% + \rtx@def@citea + \prepdef\@citea{\NAT@@close}% +}% +\def\rtx@def@citea@box{% + \rtx@def@citea@close + \expandafter\def\expandafter\@citea\expandafter{\expandafter\NAT@mbox\expandafter{\@citea}}% +}% +\def\NAT@conj{and}% +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\BibitemShut} +% \begin{macro}{\bibAnnote} +% \changes{4.1j}{2009/10/24}{(AO, 549) Repairing natbib's \cs{BibitemShut} and \cs{bibAnnote}} +% \changes{4.1o}{2010/02/05}{(AO, 549) Remove patch to natbib, which is now at version 8.31a} +% \changes{4.1o}{2010/02/07}{(AO, 578) accommodate the possible space character preceding \cs{BibitemShut}.} +% We remember a temporary patch to \classname{natbib}'s definition of \cmd\BibitemShut. +% \begin{macrocode} +\def\NAT@BibitemShut#1{% + \def\@bibstop{#1}% + \let\bibitem@Stop\bibitemStop + \let\bibitem@NoStop\bibitemNoStop + \@ifx{\bibitemShut\relax}{\let\@bibitemShut\@empty}{% + \expandafter\def\expandafter\@bibitemShut\expandafter{\bibitemShut}% + }% +}% +% \end{macrocode} +% The following is a bug fix to \classname{natbib} version 8.31b. +% \begin{macrocode} +\def\BibitemShut@ltx#1{% + \unskip + \def\@bibstop{#1}% + \let\bibitem@Stop\bibitemStop + \let\bibitem@NoStop\bibitemNoStop + \@ifx{\bibitemShut\relax}{\let\@bibitemShut\@empty}{% + \expandafter\def\expandafter\@bibitemShut\expandafter{\bibitemShut}% + }% +}% +% \end{macrocode} +% +% \begin{verbatim} +%\providecommand{\bibAnnote}[3]{% +% \BibitemShut{#1}% +% \def\@tempa{#3}\@ifx{\@tempa\@empty}{}{% +% \begin{quotation}\noindent +% \textsc{Key:}\ #2\\\textsc{Annotation:}\ \@tempa +% \end{quotation}% +% }% +% \ignorespaces +%}% +%\def\@bibitemShut{}% +% \end{verbatim} +% \end{macro} +% \end{macro} +% +% +% \begin{macrocode} +\newenvironment{thebibliography}{}{}% +\let\@listi\@empty +\appdef\rtx@require@packages{% + \RequirePackage[sort&compress]{natbib}[2009/11/07 8.31a (PWD, AO)]% + \let@environment{NAT@thebibliography}{thebibliography}% + \let@environment{thebibliography}{rtx@thebibliography}% + \let\bibliographystyle@latex\bibliographystyle + \let\NAT@citesuper\rtx@citesuper +% \end{macrocode} +% +% \begin{macro}{\NAT@bibsetnum} +% \begin{macro}{\NAT@bibsetup} +% \begin{macro}{\bibpreamble} +% \begin{macro}{\newblock} +% \begin{macro}{\bibnumfmt} +% \begin{macro}{\NAT@merge} +% We define the sectioning command to use when starting the bibliography +% and gently coax \classname{natbib} into using +% the formatting procedures that \emph{we} want it to use. +% +% This way of setting up \env{thebibliography} +% automatically sets the label width based on +% the largest number used within the bibliography. +% This scheme will not work properly using the +% author/year style of bib entry, though. +% +% We define \cmd\bibnumfmt\ to be \cmd\place@bibnumber, which is a macro +% managed by \revtex. If the document defines \cmd\bibnumfmt, then that +% definition will be used instead, which is what the \classname{natbib} +% package gives as its programming interface. +% +% We set \cmd\NAT@merge\ to \cmd\tw@, which turns on \classname{natbib}'s +% \classname{mcite} capabilities. This is the default setting. +% If numerical citations are not to be used, then \cmd\NAT@merge\ +% should be set to \cmd\@ne\ (syntax is still enabled, but semantics are turned off). +% \begin{macrocode} +\let\bibsection\rtx@bibsection +\let\NATx@bibsetnum\NAT@bibsetnum +\def\NAT@bibsetnum#1{% + \setlength{\topsep}{\z@}% + \NATx@bibsetnum{\ref{LastBibItem}}% +}% +\let\NATx@bibsetup\NAT@bibsetup +\def\NAT@bibsetup{% + \setlength{\labelwidth}{\z@}% + \setlength{\labelsep}{\z@}% + \setlength{\itemindent}{\z@}% + \setlength{\listparindent}{\z@}% + \setlength{\topsep}{\z@}% + \setlength{\parsep}{\z@}% + \NATx@bibsetup +}% +\let\bibpreamble\@empty +\def\newblock{\ }% +\let\NATx@bibnumfmt\bibnumfmt +\def\bibnumfmt{\place@bibnumber}% +\let\NAT@merge\thr@@ +\let\NAT@citeyear\citeyear +\let\onlinecite\rev@citealp +\let\textcite\rev@citet +% \end{macrocode} +% The following is needed until \classname{natbib} is at 8.31b. +% \begin{macrocode} +\@ifx{\BibitemShut\NAT@BibitemShut}{% + \class@info{Repairing natbib's \string\BibitemShut}% + \let\BibitemShut\BibitemShut@ltx +}{}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bibliographystyle} +% \changes{4.1q}{2010/04/01}{(AO, 586) When .bbl is pasted into the document, prevent automatic bibliography inclusion.}% +% \changes{4.1q}{2010/04/13}{(AO, 588) Only write \revtex-specific BibTeX .bib data if the .bst style is set by REVTeX.}% +% We arrange for the selection of bibliography style +% to occur either due to the document's explicit +% \cmd\bibliographystyle\ statement or +% via the journal substyle. +% +% Note that \revtex\ is incompatible with +% any package that patches \cmd\bibliographystyle. +% Since \classname{natbib} does this, we need a fix. +% +% The Boolean \cmd\bibliographystyle@sw\ signifies that the document contains explicit +% \cmd\bibliographystyle\ markup. If, on the contrary, the bibliography style is set by +% the the society or the journal, then no explicit \cmd\bibliographystyle\ command appears in the document instance. +% In this case \cmd\bibliographystyle@sw\ will be \cmd\false@sw. +% \begin{macrocode} +\let\bibliographystyle@latex\bibliographystyle +\def\bibliographystyle{\@booleantrue\bibliographystyle@sw\def\@bibstyle}% +\@booleanfalse\bibliographystyle@sw +% \end{macrocode} +% \end{macro} +% +% \changes{4.1j}{2009/11/03}{(AO, 551) Punctuation at end of reference when optional arguments to the cite key are given.} +% The following had been bug fixes to \classname{natbib} version 8.31a. +% \begin{verbatim} +%\def\bibitemStop{\@bibitemShut}% +%\def\NAT@bibitem@cont{% +% \let\bibitem@Stop\bibitemContinue +% \let\bibitem@NoStop\bibitemContinue +%}% +% \end{verbatim} +% The following are alterations to \classname{natbib} version 8.31a to +% accommodate the possible space character preceding \cmd\BibitemShut, +% and to handle the case of merged references, where the first ends with a stop character. +% \changes{4.1o}{2010/02/07}{(AO, 578) accommodate the possible space character preceding \cs{BibitemShut}.} +% \changes{4.1o}{2010/02/09}{(AO, 581) Handle case: merged references, with first ending in a stop character.} +% \begin{macrocode} +\def\NAT@bibitem@cont{% + \let\bibitem@Stop\bibitemContinue@Stop + \let\bibitem@NoStop\bibitemContinue +}% +% \end{macrocode} +% \begin{macrocode} +\def\bibitemNoStop{% + \@ifx@empty\@bibitemShut{.\spacefactor\@mmm\space}{\@bibitemShut}% +}% +% \end{macrocode} +% \begin{macrocode} +\def\bibitemContinue{% + \@ifx@empty\@bibitemShut{;\spacefactor\@mmm\space}{\@bibitemShut}% +}% +% \end{macrocode} +% \begin{macrocode} +\def\bibitemContinue@Stop{% + \@ifx@empty\@bibitemShut{\spacefactor\@mmm\space}{\@bibitemShut}% +}% +% \end{macrocode} +% +% \changes{4.1k}{2009/11/11}{(AO, 561) remove dead code relating to \cs{bibitemContinue}} +% We used to customize one of the productions of \classname{natbib}, but no longer. +% \begin{verbatim} +%\let\bibitemContinue\bibitemContinue@rtx +% \end{verbatim} +% +% Here ends the code to be executed at \cmd\rtx@require@packages\ time. +% \begin{macrocode} +}% +% \end{macrocode} +% \changes{4.1f}{2009/07/07}{(AO, 516) Merged references are separated with a semicolon} +% Redefine a macro of \classname{natbib} so that merged references are separated with a semicolon. +% \changes{4.1k}{2009/11/11}{(AO, 561) remove dead code relating to \cs{bibitemContinue}} +% \begin{verbatim} +% \def\bibitemContinue@rtx{;\spacefactor\@mmm\space}% +% \end{verbatim} +% +% \begin{macro}{\onlinecite} +% \begin{macro}{\textcite} +% We extend \classname{natbib}'s syntax with two commands to set a citation +% on the baseline (as opposed to superscripted) and as text (rather than parenthetical), respectively. +% A journal substyle that makes citations be superscripted or parenthetical as the case may be, should ensure +% that the author has continued access to these two styles. +% +% Note that the society or journal substyle override the meanings of \cmd\@onlinecite\ or +% \cmd\@textcite\ given here. +% +% \begin{macrocode} +\DeclareRobustCommand\onlinecite{\@onlinecite}% +\DeclareRobustCommand\textcite{\@textcite}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bibliography} +% \changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +% Provide a hook for supplying Bib\TeX\ a bibliographic database that may contain, say, +% footnotes. +% +% Note that Bib\TeX\ chokes if the argument of the \cmd\bibdata\ command has null fields, +% hence these tests. +% \begin{macrocode} +\let\bibliography@latex\bibliography +\def\bibliography#1{% + \auto@bib@empty + \begingroup + \let\auto@bib@innerbib\@empty + \@ifx@empty{\pre@bibdata}{% + \bibliography@latex{#1}% + }{% + \@if@empty{#1}{% + \expandafter\bibliography@latex\expandafter{\pre@bibdata}% + }{% + \expandafter\bibliography@latex\expandafter{\pre@bibdata,#1}% + }% + }% + \endgroup +}% +\let\pre@bibdata\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{rtx@thebibliography}% +% \begin{macro}{\present@bibnote}% +% \changes{4.1f}{2009/07/11}{(AO, 521) Lonely bibliography head}% +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \changes{4.1o}{2010/02/02}{(AO, 575) Automatically incorporate the (Bib\TeX-generated) .bbl into an explicit \env{thebibliography}}% +% \changes{4.1q}{2010/04/01}{(AO, 586) When .bbl is pasted into the document, prevent automatic bibliography inclusion.}% +% We put a tail patch into \cmd\thebibliogrphy\ and +% a headpatch into \cmd\endthebibliography. +% +% Here we provide a default treatment for frontmatter notes +% deferred to the bibliography; a journal substyle +% might want to override the definition of \cmd\present@bibnote. +% +% We make provisions for the case where there are no \cmd\bibitem s +% for the bibliography: we produce no bibliography head at all. +% +% \begin{macrocode} +\newenvironment{rtx@thebibliography}[1]{% + \NAT@thebibliography{#1}% + \let\@TBN@opr\present@bibnote + \@FMN@list +}{% +% \end{macrocode} +% The following line was commented out: +% \begin{verbatim} +%\@endnotesinbib +% \end{verbatim} +% The \cmd\auto@bib@innerbib\ directive has been moved from the begin processing to the end processing. +% This means that the content of the \env{thebibliography} environment can itself prevent the +% automatic reading in of the .bbl file. This would be needed when the user has pasted in the +% content of the .bbl file into the document itself, something required by APS and AIP editorial direction. +% \begin{macrocode} + \auto@bib@innerbib + \edef\@currentlabel{\arabic{NAT@ctr}}% + \label{LastBibItem}% + \endNAT@thebibliography + \aftergroup\auto@bib@empty +}% +\def\present@bibnote#1#2{% + \item[% + \textsuperscript{% + \normalfont + \Hy@raisedlink{\hyper@anchorstart{frontmatter.#1}\hyper@anchorend}% + \begingroup + \csname c@\@mpfn\endcsname#1\relax + \frontmatter@thefootnote + \endgroup + }% + ]#2\par +% \end{macrocode} +% The following line was commented out: +% \begin{verbatim} +%\global\let\NAT@bibitem@first@sw\@secondoftwo +% \end{verbatim} +% \begin{macrocode} +}% +% \end{macrocode} +% \end{macro} +% \end{environment} +% +% \begin{macro}{write@bibliographystyle} +% \changes{4.1q}{2010/04/13}{(AO, 588) Only write \revtex-specific BibTeX .bib data if the .bst style is set by REVTeX.}% +% We wish to delay committing the \cmd\bibliographystyle\ until as late as possible. +% The journal substyle will define a default bibliography style, and +% the document's explicit \cmd\bibliographystyle\ command, if any, will override that default. +% +% The \cmd\bibstyle\ command is allowed appear quite late in the \file{.aux} file. +% We now delay the automatic writing of the \cmd\bibstyle\ command to the end of the job. +% +% The procedure \cmd\write@bibliographystyle\ tests whether a \cmd\bibliographystyle\ command has +% already been given. +% If not, it effectively executes the needed \cmd\bibliographystyle\ command, then neutralizes itself +% (we only need to do this once per job). +% +% If the document lacks explicit \cmd\bibliographystyle\ markup, we execute +% \cmd\@bibdataout@rev, a hook for \revtex-aware processing. +% \begin{macrocode} +\def\write@bibliographystyle{% + \@ifxundefined\@bibstyle{}{% + \expandafter\bibliographystyle@latex\expandafter{\@bibstyle}% + \bibliographystyle@sw{}{\@bibdataout@rev}% + }% + \global\let\write@bibliographystyle\relax +}% +\AtEndDocument{\write@bibliographystyle}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rtx@@citetp} +% \begin{macro}{\rtx@citex} +% \begin{macro}{\super@cite@let} +% \begin{macro}{\super@cite@end} +% \begin{macro}{\super@cite@swap} +% We wish to extend \classname{natbib} to move spaces and citations around +% a superscript-style citation, imitating Donald Arseneau's \classname{cite} package +% with the \classoption{super}. +% +% The \cmd\rtx@@citetp\ procedure is substituted for \cmd\NAT@@citetp; +% it then calls the \cmd\rtx@citex\ procedure and implements the features of the +% \classoption{citeautoscript} class option. +% In the end, \cmd\@citex\ is called with its customary parameters. +% +% The document should be marked up as if citations were \emph{not} superscripted, +% and then if you select a journal substyle that has superscripted citations, \revtex\ will do its best +% to alter the formatting of the \cmd\cite s to accomodate superscript style. +% +% Only citations set as superscript are affected by this procedure, +% because we check \cmd\@cite\ against \cmd\NAT@citesuper. +% +% Here's a subtle point: when is the argument of \cmd\super@cite@swap\ not the same as the token \cmd\@let@token? +% Answer: when the latter is \cmd\@sptoken! This case has to be handled separately. +% +% Note that whether a punctuation is movable is determined by the definition +% of a particular control sequence name. +% A society or journal can alter things: to remove a character from the set, +% do, say, \cmd\expandafter \cmd\let \cmd\csname \texttt{rtx@automove;} \cmd\endcsname \cmd\relax. +% To add a character to the set, do, say, \cmd\expandafter \cmd\let \cmd\csname \texttt{rtx@automove;} \cmd\endcsname \cmd\@empty. +% +% Implementation note: due to a \TeX\ peculiarity, we have to check for the case +% where \cmd\@let@token\ is a space token \emph{before} we parse forward. +% At issue is the corner case where an end of file is at hand. If we +% were to let \cmd\super@cite@swap\ parse forward, we would encounter a \TeX\ end-of-file +% error. Note that the test will be true in many distinct cases: +% the file ends, the next character is a line terminator, the next character is a space. +% \begin{macrocode} +\def\rtx@@citetp[#1]{\@ifnextchar[{\rtx@citex[#1]}{\rtx@citex[][#1]}}% +\def\rtx@citex[#1][#2]#3{% + \begingroup + \def\@tempa{[#1][#2]{#3}}% + \@ifx{\@cite\NAT@citesuper}{% + \leavevmode + \skip@\lastskip + \unskip + \super@cite@let + }{% + \super@cite@end + }% +}% +\def\super@cite@let{% + \futurelet\@let@token\super@cite@check +}% +\def\super@cite@end{% + \aftergroup\@citex\expandafter\endgroup\@tempa +}% +\def\super@cite@check{% + \@ifx{\@let@token\@sptoken}{% + \super@cite@end + }{% + \super@cite@swap + }% +}% +\long\def\super@cite@swap#1{% + \expandafter\@ifx\expandafter{\csname rtx@automove#1\endcsname\@empty}{% + #1% + \super@cite@let + }{% + \super@cite@end + #1% + }% +}% +\expandafter\let\csname rtx@automove.\endcsname\@empty +\expandafter\let\csname rtx@automove,\endcsname\@empty +\expandafter\let\csname rtx@automove:\endcsname\@empty +\expandafter\let\csname rtx@automove;\endcsname\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% The following must execute only after \classname{natbib} is loaded and has set +% up its parameters (which it does at \cmd\AtBeginDocument\ time). +% If superscript citations have been selected, and +% if the \classoption{citeautoscript} class option has been selected, +% we patch into \classname{natbib}'s mechanism to migrate punctuation around the +% citation, as in class \classname{cite} with the \classoption{superscript} option. +% \begin{macrocode} +\appdef\class@documenthook{% + \citeautoscript@sw{% + \@ifx{\@cite\NAT@citesuper}{% + \let\NAT@@citetp\rtx@@citetp + }{}% + }{}% +}% +% \end{macrocode} +% +% Resolve an incompatability between \classname{natbib} and \classname{listings}. +% The latter package tests \cmd\chapter (which has now been \cmd\let\ to \cmd\relax\ as a side effect \classname{natbib}'s use of \LaTeX's \cmd\@ifundefined). +% +% We couch our fix in such terms that will not be disruptive if \cmd\chapter\ is actually defined at this point. +% +% \changes{4.1b}{2008/07/01}{(AO) No longer need to test \cs{chapter} as of \texttt{natbib} version 8.2} +% \begin{verbatim} +%\@ifx{\chapter\relax}{\let\chapter\@undefined}{}% +% \end{verbatim} +% +% +% \subsubsection{\cs{endnote}s and \cs{rtx@bibnote}s} +% +% \begin{macro}{\mini@note} +% \begin{macro}{\save@note} +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% QUERY: how do footnotes get thrown to the bibliography. \cmd\footinbib@sw\ appears to be irrelevant. +% \begin{macrocode} +\def\mini@note{\save@note\mini@notes}%Implicit #2 +\def\save@note#1#2{% + \stepcounter\@mpfn + \protected@xdef\@thefnmark{\thempfn}% + \@footnotemark + \expandafter\g@addto@macro + \expandafter#1% + \expandafter{% + \expandafter \@@footnotetext + \expandafter {\@thefnmark}{#2}% + }% +}% +\long\def\@@footnotetext#1{\def\@thefnmark{#1}\@footnotetext}% +\let\mini@notes\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\endnote} +% A version of footnote that appears in the bibliography, or where \cmd\printendnotes\ appears. +% \begin{verbatim} +%\def\@endnote{% +% \begingroup +% \aftergroup\@footnotemark +% \aftergroup\@endnotetext +% \@ifnextchar[{% +% \@xendnote +% }{% +% \stepcounter{footnote}% +% \protected@xdef\@tempa{\thefootnote}% +% \expandafter\@xendnote\expandafter[\the\c@footnote]% +% }% +%}% +% \end{verbatim} +% \end{macro} +% +% \begin{macro}{\@xendnote} +% \changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +% \begin{verbatim} +%\def\unused@xendnote[#1]{% +% \begingroup +% \c@footnote#1\relax +% \end{macrocode} +% New for 4.1 +% \begin{macrocode} +% \unrestored@protected@xdef\@endnotelabel{Note\thefootnote}% +% \authoryear@sw{% +% \unrestored@protected@xdef\@thefnmark{\noexpand\ref{\@endnotelabel}}% +% }{% +% \unrestored@protected@xdef\@thefnmark{\@endnotelabel}% +% }% +% \end{macrocode} +% Was: +% \unrestored@protected@xdef\@thefnmark{endnote\thefootnote}% +% End 4.1 changes +% \begin{macrocode} +% \endgroup +% \endgroup +%}% +%\def\@endnotemark{% +% \expandafter\cite\expandafter{\@thefnmark}% +%}% +% \end{verbatim} +% \begin{macrocode} +\def\rev@citemark#1{% + \expandafter\cite\expandafter{\@thefnmark}% +}% +\def\rev@endtext#1{% + \let\@endnotelabel\@thefnmark + \@endnotetext +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endnote@ext} +% \begin{macro}{\bibdata@app} +% \begin{macro}{\bibdata@ext} +% The macro \cmd\endnote@ext\ is the file extension for the auxiliary file holding footnotes. +% The \cmd\bibdata@app\ and \cmd\bibdata@ext\ macros are used to form the name of a +% Bib\TeX\ database file holding footnotes. +% \begin{macrocode} +\def\endnote@ext{.end}% +\def\bibdata@app{Notes}% +\def\bibdata@ext{bib}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@endnotetext} +% \changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +% The procedure \cmd\@endnotetext\ writes a Bib\TeX\ .bib file for the purpose +% of insering a footnote into the (numbered, unsorted) bibliography. +% +% We need to define \cmd\pre@bibdata\ to be +% \cmd\jobname\cmd\endnote@ext, and we probably should define \cmd\endnote@ext\ to +% be something like ``Notes.bib''. +% +% In each case, the material to be written out requires robustification, provided by \cmd\endnote@relax. +% The commands \cmd\label, \cmd\index, and \cmd\glossary, +% which are robustified for \cmd\markright\ and \cmd\addcontentsline, +% are likewise robustified here. +% +% Procedure \cmd\@endnotetext@note\ is the alias for \cmd\@endnotetext\ when the endnotes are to be +% processed separately from the bibliography (generally true when citations are not sorted). +% \begin{verbatim} +%\long\def\unused@endnotetext@note#1{% +% \@ifxundefined\@endnoteout{% +% \newwrite\@endnoteout +% \gdef\endnote@stream{\jobname\endnote@ext}% +% \immediate\openout\@endnoteout\endnote@stream\relax +% }{}% +% \begingroup +% \endnote@relax +% \immediate\write\@endnoteout{\string\@doendnote{\@endnotelabel}{#1}}% +% \endgroup +%}% +% \end{verbatim} +% +% \cmd\@doendnote\ is obsolete. +% \begin{verbatim} +%\def\@doendnote#1#2{\bibitem{#1}#2}% +% \end{verbatim} +% +% \changes{4.1o}{2010/02/05}{(AO, 579) Endnote shall comprise their own Bib\TeX\ entry type: @FOOTNOTE.} +% Procedure \cmd\@endnotetext\ is the operative procedure\ when the endnotes are to be +% collated in with the other references, typically true when numerical citations are being used. +% The technique involves writing a .bib file (\cmd\@bibdataout) with each endnote typed as +% a \texttt{@FOOTNOTE} entry. +% +% Timing note: doing \cmd\openout\ should be deferred until the beginning of the document, +% as is done here. This allows one to make a format (\filename{.fmt}) file out of this class. +% \begin{macrocode} +\long\def\@endnotetext#1{% + \begingroup + \endnote@relax + \immediate\write\@bibdataout{% + @FOOTNOTE{% + \@endnotelabel,% +% \end{macrocode} +% The \texttt{key} field is recommended in cases where there is no author (see \filename{btxdoc}). +% \begin{macrocode} + key="\@endnotelabel",% +% \end{macrocode} +% The \texttt{note} field is simply the content of the footnote. +% \begin{macrocode} + note="#1"% + }% + }% + \endgroup +}% +\newwrite\@bibdataout +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endnote@relax} +% At \cmd\AtBeginDocument\ time, we open the job's \filename{.bib} file. +% +% Procedure \cmd\endnote@relax\ robustifies commands that ought not to be expanded when +% the endnote is written out. +% Note the similarity between \cmd\endnote@relax\ and \cmd\protected@write. +% \begin{macrocode} +\def\endnote@relax{% + \let\label\relax \let\index\relax \let\glossary\relax + \let\cite \relax \let\ref \relax \let\pageref \relax + \let\( \relax \let\) \relax \let\\ \relax + \let~\relax +% \end{macrocode} +% \begin{verbatim} +%\let\protect\noexpand +% \end{verbatim} +% \begin{macrocode} + \let \protect \@unexpandable@protect + \newlinechar`\^^M% +% \end{macrocode} +% \begin{verbatim} +%\newlinechar`\ % +% \end{verbatim} +% \begin{macrocode} + \let\begin\relax \let\end\relax +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@bibdataout@init} +% \begin{macro}{\@bibdataout@aps} +% \changes{4.1o}{2010/02/10}{(AO, 580) Provide a document class option to turn off production of eprint field in bibliography.} +% \changes{4.1o}{2010/02/12}{(AO, 580) Control .bst at run time.}% +% \changes{4.1q}{2010/04/13}{(AO, 588) Only write \revtex-specific BibTeX .bib data if the .bst style is set by REVTeX.}% +%\changes{4.2b}{2018/12/26}{(MD) Improve control over display of e-print ids in bibliography.}% +% At \cmd\AtBeginDocument\ time, we open the job's \filename{.bib} file. +% The hook is available for use by a society to place its own @CONTROL record in the \cmd\@bibdataout\ stream. +% \begin{macrocode} +\appdef\class@documenthook{\@bibdataout@init}% +\def\@bibdataout@init{% + \immediate\openout\@bibdataout\pre@bibdata.\bibdata@ext\relax +}% +\def\@bibdataout@rev{% + \immediate\write\@bibdataout{% +% \end{macrocode} +% The entry that controls processing of the \filename{.bst} file has entry type \texttt{@CONTROL}. +% The citation key (REVTEX42Control) is effectively a version number, +% which the \filename{.bst} can use to interpret the bib entry. +% \begin{macrocode} + @CONTROL{% + REVTEX42Control% +% \end{macrocode} +% Say if we want the \texttt{eprint} field disabled. Otherwise accept the default of the \filename{.bst}. +% \begin{macrocode} + \eprint@enable@sw{}{,eprint="1"}% + }% + }% +% \end{macrocode} +% Place a \cmd\citation\ into the auxiliary file corresponding to this entry. +% \begin{macrocode} + \if@filesw + \immediate\write\@auxout{\string\citation{REVTEX42Control}}% + \fi +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\printendnotes} +% \changes{4.1f}{2009/07/10}{(AO, 520) Automatically produce \cs{bibliography} command when needed}% +% We have removed the endnotes facility from REVTeX, so the \cmd\printendnotes\ command now does nothing. +% +% Moving footnotes to the bibliogrphy is now accomplished through +% the automatic generation of a job BiB\TeX\ database (called \cmd\pre@bibdata) containing the footnotes. +% \begin{macrocode} +\def\printendnotes{% + \class@warn{The \string\printendnotes\space command no longer serves any function. Please remove it from your document.}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@endnotesinbib} +% \begin{macro}{\@endnotesinbibliography} +% \changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +% We define a function \cmd\@endnotesinbib, +% and a variant \cmd\@endnotesinbibliography. +% The former is invoked at the start of +% the end processing for \enve{thebibliography}; +% the latter is a synonym. +% +% The procedure typesets the footnotes that are to +% appear in the bibliography; the default is to +% simply arrange for the footnote counter to be +% reset at the start of the document. +% +% Note that this code make the assumption that +% the counter used in \env{thebibliography} is \cmd\c@NAT@ctr. +% \changes{4.1f}{2009/07/10}{(AO, 520) Automatically produce \cs{bibliography} command when needed}% +% +% Here is the sole place where \cmd\footinbib@sw\ has an effect, other code simple assigning its value. +% If it is false, or \cmd\authoryear@sw\ is true, then footnotes are handled by the default mechanism. +% \begin{macrocode} +\def\make@footnote@endnote{% + \footinbib@sw{% + \authoryear@sw{}{% + \ltx@footnote@push + \def\thempfn{Note\thefootnote}% + \let\ltx@footmark\rev@citemark + \let\ltx@foottext\rev@endtext +% \end{macrocode} +% The endnotes facility has been removed. +% Also, there is no need to queue up \cmd\auto@bib\ here, since it is always queued up elsewhere. +% \changes{4.1f}{2009/07/10}{(AO, 520) Automatically produce \cs{bibliography} command when needed}% +% \begin{verbatim} +% \appdef\class@enddocumenthook{\auto@bib}% +% \let\printendnotes\relax +% \end{verbatim} +% \begin{macrocode} + }% + }{}% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\ltx@footnote@push{% + \let\ltx@footmark@latex\ltx@footmark + \let\ltx@foottext@latex\ltx@foottext + \let\thempfn@latex\thempfn + \def\ltx@footnote@pop{% + \let\ltx@footmark\ltx@footmark@latex + \let\ltx@foottext\ltx@foottext@latex + \let\thempfn\thempfn@latex + }% +}% +% \end{macrocode} +% +% The switchover to setting footnotes in the bibliography +% changes the meaning of \cmd\footnote\ and +% substitutes the synonym for \cmd\@endnotesinbib. +% +% We arrange for the procedure \cmd\make@footnote@endnote\ to be executed +% at \cmd\class@documenthook\ time (we mustn't do this earlier because +% the meaning of \cmd\@footnotemark\ must not be changed before then, +% for the sake of \file{ltxutil.dtx}). +% \begin{macrocode} +\appdef\class@documenthook{% + \make@footnote@endnote +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\auto@bib} +% \begin{macro}{\auto@bib@empty} +% \begin{macro}{\test@bbl@sw} +% \begin{macro}{\bibitem@set} +% \begin{macro}{\auto@bib@innerbib} +% \begin{macro}{\thebibliography@nogroup} +% \changes{4.1f}{2009/07/10}{(AO, 520) Automatically produce \cs{bibliography} command when needed}% +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \changes{4.1o}{2010/02/02}{(AO, 575) Automatically incorporate the (Bib\TeX-generated) .bbl into an explicit \env{thebibliography}}% +% Under some circumstances, we must typeset the bibliography automatically. +% If the document requires footnotes to be set in the bibliography (effectively, class option \texttt{footinbib}), +% or that frontmatter footnotes be set in the bibliography (effectively, class option \texttt{bibnotes}), +% but contains no explicit \cmd\bibliography\ statement. +% +% Note that this facility is not able to work more than once per document. +% If multiple bibliographys are required (e.g., per article), it will be the responsibility of the journal style +% to restore \cmd\auto@bib\ to its original meaning so it can be re-invoked. +% +% In procedure \cmd\auto@bib, we first test for the presence of frontmatter footnotes deferred to the bibliography. +% If none, we further test for the presence of \cmd\bibitem\ commands in the job's \filename{.bbl} file. +% If either condition is met, we ask for a bibliography. +% We know that the document itself lacks a \cmd\bibliography\ statement, +% so we know the argument of the \cmd\bibliography\ that we will issue. +% \begin{macrocode} +\def\auto@bib{% + \@ifx@empty\@FMN@list{% + \footinbib@sw{% + \@ifnum{\csname c@\@mpfn\endcsname>\z@}{% + \true@sw + }{% + \test@bbl@sw + }% + }{% + \test@bbl@sw + }% + }{% + \true@sw + }% + {% + \bibliography{}% + }{}% +}% +\def\auto@bib@empty{% + \let\auto@bib\@empty +}% +% \end{macrocode} +% Testing the \filename{.bbl} file involves defanging all expected commands +% and processing that file inside a box register (that will be simply discarded). +% We provide a new meaning for the \cmd\bibitem\ command: it queues a Boolean. +% \begin{macrocode} +\def\test@bbl@sw{% + \setbox\z@\vbox\bgroup + \let\providecommand\providecommand@j@nk + \let\bibfield\@gobbletwo + \let\bibinfo\@gobbletwo + \let\translation\@gobble + \let\BibitemOpen\@empty + \let\bibitemStop\@empty + \let\bibitemNoStop\@empty + \let\EOS\@empty + \let\BibitemShut\@gobble + \let\bibAnnoteFile\@gobbletwo + \let\bibAnnote\@gobblethree + \let\textbf\@gobble + \let\emph\@gobble + \@booleanfalse\bibitem@sw + \let\bibitem\bibitem@set + \auto@bib@innerbib + \bibitem@sw{\aftergroup\true@sw}{\aftergroup\false@sw}% + \egroup +}% +% \end{macrocode} +% The \cmd\bibitem@set\ is an alias for \cmd\bibitem\ for the purpose of detecting a non-trivial bibliography. +% \begin{macrocode} +\newcommand\bibitem@set[1][]{% + \bibitem@sw{}{% + \@booleantrue\bibitem@sw + \aftergroup\@booleantrue\aftergroup\bibitem@sw + }% +}% +% \end{macrocode} +% The \cmd\auto@bib@innerbib\ procedure reads in the \filename{.bbl} file (if it exists) +% within a context where its \env{thebibliography} environment does nothing, not even establishing a group. +% \begin{macrocode} +\def\auto@bib@innerbib{% + \begingroup + \let@environment{thebibliography}{thebibliography@nogroup}% + \bibliography{}% + \endgroup +}% +% \end{macrocode} +% Environment \env{thebibliography@nogroup} is an alias of the \env{thebibliography} environment that cancels itself. +% It assumes that it is called within a \env{thebibliography} environment. +% \begin{macrocode} +\def\thebibliography@nogroup#1{% + \endgroup + \def\@currenvir{thebibliography}% +}% +\def\endthebibliography@nogroup{\begingroup}% +% \end{macrocode} +% The following should be part of \filename{ltxutil}. +% \begin{macrocode} +\long\def \@gobblethree #1#2#3{}% +\def\providecommand@j@nk#1[#2]{% + \@ifnum{#2=\z@}{\def\j@nk}{% + \@ifnum{#2=\@ne}{\def\j@nk##1}{% + \@ifnum{#2=\tw@}{\def\j@nk##1##2}{% + \@ifnum{#2=\thr@@}{\def\j@nk##1##2##3}{% + }% + }% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{Initial setup} +% +% The standard LaTeX document classes execute certain commands +% that are best deferred until \cmd\class@documenthook\ time. +% Here, we effectively split \cmd\pagenumbering\ into two halves, +% with a default definition for \cmd\thepage +% and an initialization of \cmd\c@page\ at \cmd\class@documenthook\ time. +% +% The meaning of \cmd\thepage\ can be overridden by society, journal, or +% anywhere within the document pramble, and the counter itself will be +% preset at the beginning of the document. +% \begin{macrocode} +\def\thepage{\@arabic\c@page}% +% \end{macrocode} +% \changes{4.0b}{1999/06/20}{Defer assignment until \cs{AtBeginDocument} time.} +% Note that this code is executed at \cmd\setup@hook\ time +% to allow for the possibility of overrides by packages like \classname{geometry}. +% \begin{macrocode} +\appdef\setup@hook{% + \tabbingsep \labelsep + \leftmargin\leftmargini + \labelwidth\leftmargin\advance\labelwidth-\labelsep + \let\@listi\@listI + \@listi +}% +% \begin{macrocode} +% +% We ensure that the ``environment'' component mark (implemented by \file{ltxgrid.dtx}) +% is initialized properly (via a hook, itself defined via \file{ltxutil.dtx}). +% \begin{macrocode} +\appdef\class@documenthook{% + \global\c@page\@ne + \def\curr@envir{document}% + \mark@envir{\curr@envir}% +}% +% \end{macrocode} +% +% \begin{macro}{\open@onecolumn}% +% \begin{macro}{\open@column@two}% +% \changes{4.0c}{1999/11/13}{Grid changes with ltxgrid} +% \changes{4.0d}{2000/04/10}{Also alter how lists get indented.} +% When setting the column grid, we have to override the procedure +% for formatting lists. +% Because \cmd\twocolumngrid\ requires rebalancing columns at some points, +% typesetting must employ only the manipulation of +% \cmd\leftskip\ and \cmd\rightskip, and must avoid the use of +% \cmd\moveleft, \cmd\moveright, and \cmd\parshape. +% +% It is one of the stranger features of \TeX\ that these two separate +% mechanisms exist. The latter three have the effect of adding things to the +% Main Vertical List that cannot be removed and later added back with all their +% properties intact. +% +% In detail, \cmd\moveleft, say, adds a box to the MVL with +% its reference point shifted horizontally by some amount relative to the +% reference point of the enclosing list. If that box is removed from the +% MVL (via a \cmd\lastbox\ operation in the output routine), and later +% thrown back to the MVL, the shift of the box will have been ``forgotten'' by \TeX. +% This is a bug, but not one ``acceptible to D. E. Knuth'', so it will never be fixed. +% +% \begin{macrocode} +\def\open@onecolumn{% + \open@column@one\@ne + \set@colht + \@floatplacement + \@dblfloatplacement +}% +\def\open@twocolumn{% + \open@column@mlt\tw@ + \set@colht + \@floatplacement + \@dblfloatplacement + \sloppy + \let\set@listindent\set@listindent@ +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{\cs{appendix}} +% +% \begin{macrocode} +%\newif\ifappendixon +% \end{macrocode} +% Note that, within appendices, +% equations are numbered within sections (appendices). +% \begin{macrocode} +\def\appendix{% + \par +%\appendixontrue + \setcounter{section}\z@ + \setcounter{subsection}\z@ + \setcounter{subsubsection}\z@ + \def\thesubsection{\arabic{subsection}}% + \def\thesubsubsection{\alph{subsubsection}}% + \@addtoreset{equation}{section}% + \def\theequation@prefix{\thesection}% + \addtocontents{toc}{\protect\appendix}% + \@ifstar{% + \def\thesection{\unskip}% + \def\theequation@prefix{A.}% + }{% + \def\thesection{\Alph{section}}% + }% +}% +% \end{macrocode} +% +% \section{Changing the page grid} +% \changes{4.0b}{1999/06/20}{Define three separate environments, defer assignment to \cs{AtBeginDocument} time.} +% +% \subsection{Avoiding Grid Changes}% +% +% In preprint styles, ``wide text'' is a no-op, and the title page +% processing involves no grid change. +% +% \begin{macro}{\title@column}% +% \begin{macro}{\close@column}% +% Provide default meanings for \cmd\title@column\ and \cmd\close@column, +% in case they were never defined. +% Note that the society or journal substyle may define +% \cmd\title@column\ or \cmd\close@column: this code will not override. +% \begin{macrocode} +\def\title@column#1{% + \minipagefootnote@init + #1% + \minipagefootnote@foot +}% +\def\close@column{% + \newpage +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Galley Style: Margin Changes}% +% A variant of preprint processing. Emulate journal appearance somewhat. +% +% \begin{environment}{widetext@galley} +% DPC: We're in galley style so do a lob sided display environment. +% +% QUERY: How can we be sure that we are in galley style? +% ANSWER: as noted elsewhere, require that both \cmd\twocolumn@sw\ and \cmd\preprintsty@sw\ be false. +% \begin{macrocode} +\def\galley@outdent{\rightmargin-\columnwidth\advance\rightmargin-\columnsep}% +\let\widetext@outdent\@empty +\newenvironment{widetext@galley}{% + \list{}{% + \topsep \z@skip + \listparindent \parindent + \itemindent \parindent + \leftmargin \z@ + \parsep \z@\@plus\p@ + \widetext@outdent + \relax + }% + \item\relax +}{ + \endlist +}% +% \end{macrocode} +% \end{environment} +% +% +% \subsection{Grid Changing Via \classname{ltxgrid}}% +% +% In case \classoption{twocolumngrid} has been invoked, +% switch column grid using the column grid-changing commands. +% Supply stub definitions of those commands here. +% \changes{4.0c}{1999/11/13}{grid changes with ltxgrid} +% +% \begin{macro}{\title@column@grid}% +% \begin{macro}{\close@column@grid}% +% The title block always starts at the top of a new page. +% \changes{4.0c}{1999/11/13}{grid changes with ltxgrid} +% +% Note that, for the procedure \cmd\close@column@grid, +% we balance columns by switching to the one-column page grid. +% \begin{macrocode} +\def\title@column@grid#1{% + \minipagefootnote@init + \onecolumngrid + \begingroup + \let\@footnotetext\frontmatter@footnotetext +%<ignore> \let\set@footnotewidth\set@footnotewidth@two + \ltx@no@footnote + #1% + \endgroup + \twocolumngrid + \minipagefootnote@foot +}% +\def\close@column@grid{% + \balancelastpage@sw{% + \onecolumngrid +%<ignore> \twocolumngrid + }{}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{environment}{widetext@grid} +% \changes{4.0c}{1999/11/13}{grid changes via ltxgrid procedures} +% \changes{4.0e}{2000/11/21}{adornments above and below.} +% \changes{4.1g}{2009/10/07}{(AO, 525) Remove phantom paragraph above display math that is given in vertical mode}% +% We slip into the one-column page grid +% within the scope of this environment. +% +% Note that we set adornments above and below the \env{widettext}. +% These are set as leaders, so they will disappear at a page break. +% \changes{4.1n}{2010/01/02}{(AO) fine-tune spacing above and below widetext}% +% \begin{macrocode} +\newenvironment{widetext@grid}{% + \par\ignorespaces + \setbox\widetext@top\vbox{% +%<ignore> \vskip15\p@ + \hb@xt@\hsize{% + \leaders\hrule\hfil + \vrule\@height6\p@ + }% +%<ignore> \vskip6\p@ + }% + \setbox\widetext@bot\hb@xt@\hsize{% + \vrule\@depth6\p@ + \leaders\hrule\hfil + }% + \onecolumngrid + \vskip10\p@ + \dimen@\ht\widetext@top\advance\dimen@\dp\widetext@top + \cleaders\box\widetext@top\vskip\dimen@ +%<ignore> \let\set@footnotewidth\set@footnotewidth@two + \vskip6\p@ + \prep@math@patch +}{% + \par + \vskip6\p@ + \setbox\widetext@bot\vbox{% + \hb@xt@\hsize{\hfil\box\widetext@bot}% +%<ignore> \vskip14\p@ + }% + \dimen@\ht\widetext@bot\advance\dimen@\dp\widetext@bot + \cleaders\box\widetext@bot\vskip\dimen@ + \vskip8.5\p@ + \twocolumngrid\global\@ignoretrue + \@endpetrue +}% +\newbox\widetext@top +\newbox\widetext@bot +% \end{macrocode} +% \end{environment} +% +% +% Decide, finally, how the page grid is to be manipulated. +% \begin{macrocode} +\def\set@page@grid{% + \twocolumn@sw{% +% \end{macrocode} +% The following two assignments determine what procedures are to be executed when +% the footnote set width is calculated, and how footnotes are to be composed at the bottom of the page. +% A society or journal wishing to do otherwise will override this code. +% \begin{macrocode} + \let\set@footnotewidth\set@footnotewidth@two + \let\compose@footnotes\compose@footnotes@two + \let@environment{widetext}{widetext@grid}% + \let\title@column\title@column@grid + \let\close@column\close@column@grid + }{% + \let@environment{widetext}{widetext@galley}% + \preprintsty@sw{% +% \end{macrocode} +% Change the page grid not at all. +% \begin{macrocode} + }{% +% \end{macrocode} +% If we are galley style, change the page margin only. +% \begin{macrocode} + \galley@sw{% + \let\widetext@outdent\galley@outdent + }{}% + }% + }% +}% +\appdef\setup@hook{\set@page@grid}% +% \end{macrocode} +% +% \section{Old font commands} +% +% \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} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +% \end{macrocode} +% +% \section{English-Language Texts} +% As this class is just for English language journals, we +% could hardwire these texts, +% but to make it easier to use this as a +% basis for the code for similar journal styles, separate out all the +% fixed text strings into babel-style macros of the form +% |\|\ldots|name| +% +% Note: for babel compatability, use version 1999/05/05 v3.6x or later. +% +% Some of these might need changing in the society-specific code. +% +% \begin{macro}{\today} +% Procedure \cmd\today\ is used in the article class, but not in +% this document class. +% \begin{macrocode} +\def\today{\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} +% +% \begin{macro}{\notesname} +% Text entity \cmd\notesname\ had been used in \cmd\printendnotes. +% \changes{4.1f}{2009/07/10}{(AO, 520) Automatically produce \cs{bibliography} command when needed}% +% However, we have removed the endnotes facility from REVTeX. +% +% \begin{verbatim} +%\def\notesname{Notes} +% \end{verbatim} +% \end{macro} +% +% \begin{macro}{\partname} +% Text entity \cmd\partname\ is used in \cmd\@part. +% \begin{macrocode} +\def\partname{Part} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tocname} +% Text entity \cmd\tocname\ is used in \cmd\tableofcontents, +% as defined in the standard \LaTeX\ book class. +% \begin{macrocode} +\def\tocname{Contents} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lofname} +% Text entity \cmd\lofname\ is used in \cmd\listoffigures, +% as defined in the standard \LaTeX\ book class. +% \begin{macrocode} +\def\lofname{List of Figures} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lotname} +% Text entity \cmd\lotname\ is used in \cmd\listoftables, +% as defined in the standard \LaTeX\ book class. +% \begin{macrocode} +\def\lotname{List of Tables} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\refname} +% Text entity \cmd\refname\ is used in \env{thebibliography}. +% \begin{macrocode} +\def\refname{References} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\indexname} +% Text entity \cmd\indexname\ is used in \env{theindex}, +% as defined in the standard \LaTeX\ book class. +% \begin{macrocode} +\def\indexname{Index} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\figurename} +% \changes{4.0b}{1999/06/20}{Added localization of \cs{figuresname}} +% Text entity \cmd\figurename\ is used in \env{figure}, +% \cmd\figuresname\ in \cmd\printfigures. +% \begin{macrocode} +\def\figurename{FIG.} +\def\figuresname{Figures}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tablename} +% \changes{4.0b}{1999/06/20}{Added localization of \cs{tablesname}} +% Text entity \cmd\tablename\ is used in \env{table}, +% \cmd\tablesname\ in \cmd\printtables. +% \begin{macrocode} +\def\tablename{TABLE} +\def\tablesname{Tables}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\abstractname} +% Text entity \cmd\abstractname\ is used in \env{abstract}. +% \begin{macrocode} +\def\abstractname{Abstract} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\appendixesname} +% \begin{macro}{\appendixname} +% Text entity \cmd\appendixesname\ is used in TOC. +% \begin{macrocode} +\def\appendixesname{Appendixes}% +\def\appendixname{Appendix}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\acknowledgmentsname} +% Text entity \cmd\acknowledgmentsname\ is used in \env{acknowledgments}. +% \begin{macrocode} +\def\acknowledgmentsname{Acknowledgments} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\journalname} +% This should be set by the society journal options, eg `pra'. +% \begin{macrocode} +\def\journalname{??} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\copyrightname} +% Default layout does not assign copyright, but a journal that wants +% to might use this. +% \begin{macrocode} +\def\copyrightname{??} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\andname} +% The text string ``and'' for use in author lists. +% \begin{macrocode} +\def\andname{and} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@pacs@name} +% \begin{macro}{\@keys@name} +% The text string prepended to PACS numbers, resp. to keywords. +% \begin{macrocode} +\def\@pacs@name{PACS numbers: }% +\def\@keys@name{Keywords: }% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ppname} +% The text string ``pp'' for use in page ranges. +% \begin{macrocode} +\def\ppname{pp} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\numbername} +% The text string ``number'' for use in article reference. +% \begin{macrocode} +\def\numbername{number} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\volumename} +% The text string ``volume'' for use in article reference. +% \begin{macrocode} +\def\volumename{volume} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Dated@name} +% \begin{macro}{\Received@name} +% \begin{macro}{\Revised@name} +% \begin{macro}{\Accepted@name} +% \begin{macro}{\Published@name} +% These texts are used in the \cmd\date, et al. commands. +% \begin{macrocode} +\def\Dated@name{Dated: }% +\def\Received@name{Received }% +\def\Revised@name{Revised }% +\def\Accepted@name{Accepted }% +\def\Published@name{Published }% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{Legacy Commands} +% We define some commands left over from version 3.1, or give default meanings. +% Some definitions can be overridden +% in the document preamble or in included packages. +% +% Note on the namespace: command names like \cmd\REV@\emph{name} are used here, +% because it is not clear that any of this code is generally useful. +% \begin{macrocode} +\def\address{\replace@command\address\affiliation}% +\def\altaddress{\replace@command\altaddress\altaffiliation}% +\newenvironment{references}{% + \class@warn@end{The references environment is not supported; use thebibliography instead.} + \gdef\references{\thebibliography{}}\references +}{% + \endthebibliography +}% +\def\draft{% + \class@warn@end{Command \string\draft\space is obsolete;^^JInvoke option draft instead.}% + \@booleantrue\draft@sw +}% +\def\tighten{% + \class@warn@end{Command \string\tighten\space is obsolete;^^JInvoke option tightenlines instead.}% + \@booleantrue\tightenlines@sw +}% +\def\tableline{% + \noalign{% + \class@warn@end{Command \string\tableline\space is obsolete;^^JUse \string\colrule\space instead.}% + \global\let\tableline\colrule + }% + \tableline +}% +\def\case{\replace@command\case\frac}% +\def\slantfrac{\replace@command\slantfrac\frac}% +\def\tablenote{\replace@command\tablenote\footnote}% +\def\tablenotemark{\replace@command\tablenotemark\footnotemark}% +\def\tablenotetext{\replace@command\tablenotetext\footnotetext}% +% Lose the following definition: +\DeclareRobustCommand\REV@text[1]{% + \relax + \ifmmode + \mathchoice + {\hbox{{\everymath{\displaystyle }#1}}}% + {\hbox{{\everymath{\textstyle }#1}}}% + {\hbox{{\everymath{\scriptstyle }\let\f@size\sf@size\selectfont#1}}}% + {\hbox{{\everymath{\scriptscriptstyle}\let\f@size\ssf@size\selectfont#1}}}% + \glb@settings + \else + \mbox{#1}% + \fi +}% +% Lose the following definition: +\DeclareRobustCommand\REV@bbox[1]{% + \relax + \ifmmode + \mathchoice + {\hbox{{\everymath{\displaystyle }\boldmath$#1$}}}% + {\hbox{{\everymath{\textstyle }\boldmath$#1$}}}% + {\hbox{{\everymath{\scriptstyle }\boldmath$#1$}}}% + {\hbox{{\everymath{\scriptscriptstyle}\boldmath$#1$}}}% + \glb@settings + \else + \mbox{#1}% + \fi +}% +\DeclareRobustCommand\REV@bm[1]{% + \class@warn@end{To use \string\bm, please load the bm package!}% + \global\let\bm\relax +}% +\def\FL{\obsolete@command\FL}% +\def\FR{\obsolete@command\FR}% +\def\narrowtext{\obsolete@command\narrowtext}% +\def\mediumtext{\obsolete@command\mediumtext}% +\newenvironment{quasitable}{% + \let@environment{tabular}{longtable}% +}{% +}% +% \end{macrocode} +% +% \begin{macro}{\text} +% \begin{macro}{\bm} +% \begin{macro}{\bibinfo} +% \begin{macro}{\eprint} +% \begin{macro}{\url} +% +% If not otherwise defined, give default meanings to certain commands. +% \changes{4.0d}{2000/04/10}{eprint takes an optional argument, syntactical only in this case.} +%FIXME: \cmd\bibinfo? +% \begin{macrocode} +\let\text\REV@text +\let\bm\REV@bm +\appdef\setup@hook{% + \providecommand\bibinfo[2]{#2}% + \providecommand\eprint[2][]{#2}% +%\providecommand\url[1]{#1}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bbox} +% +% \begin{macrocode} +\def\bbox#1{% + \class@warn@end{\string\bbox\space is obsolete,^^Jload the bm package and use \string\bm\space instead.}% + \global\let\bbox\relax +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mathletters} +% +% \begin{macrocode} +\newenvironment{mathletters}{% + \class@warn@end{Environment {mathletters} is obsolete;^^Jload the amsmath package and use {subequations}!}% + \global\let\mathletters\@empty +}{% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eqnum} +% +% \begin{macrocode} +\def\eqnum#1{% + \class@warn@end{\string\eqnum\space is obsolete, load the amsmath package and use \string\tag!}% + \global\let\eqnum\@gobble +}% +% \end{macrocode} +% \end{macro} +% +% We read in the symbol definitions. +% \begin{macrocode} +\appdef\rtx@require@packages{% + \RequirePackage{revsymb4-2}% +}% +\appdef\class@documenthook{\revsymb@inithook}% +% \end{macrocode} +% +% +% \section{Corrected Indentation for \texttt{tableofcontents}} +% \changes{4.2a}{2014/12/31}{(MD, Aptara) Make titles in bibliography default, prb style to follow other Phys. Rev. journals, add a unified physrev option as well as prx, prapplied, prmaterials, prfluids, prab, and prper options. Corrected indentation for tableofcontents appearing along with listoffigure/listoftable.}% +% +% Corrected indentation for \texttt{tableofcontents}, when appearing with \texttt{listoffigure} or \texttt{listoftable}. +% +% \begin{macrocode} +%% +\def\@startflt#1{% + \begingroup + %\toc@pre + \makeatletter + \@input{\jobname.#1}% + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax + \fi + \@nobreakfalse + %\toc@post + \endgroup +}% +\def\att@TOC{toc}% +\def\print@toc#1{% + \begingroup + \expandafter\section + \expandafter*% + \expandafter{% + \csname#1name\endcsname + }% + \let\appendix\appendix@toc + \def\tempa{#1}% + \ifx\tempa\att@TOC%% + \@starttoc{#1}% + \else%% + \@startflt{#1}%% + \fi%% + \endgroup +}% +%% +% \end{macrocode} +% +% +% \section{Patches for lineno.sty} +% +% The \classname{lineno} package detects the case where the package has been loaded +% and the document invokes \cmd\linelabel, but the \cmd\linenumbers\ command has not been +% issued: it treats this case as an error. +% +% It is wrong for validity of document syntax to be dependent upon package semantics: +% we make the condition a warning rather than an error. +% +% \begin{macrocode} +\def\@LN@LLerror@org{% + \PackageError{lineno}{% + \string\linelabel\space without \string\linenumbers + }{% + Just see documentation. (New feature v4.11)% + }% + \@gobble +}% +\def\@LN@LLerror@ltx{% + \PackageWarning{lineno}{% + To make the \string\linelabel\space command work, you must issue the \string\linenumbers\ command + }% + \@gobble +}% +% \end{macrocode} +% +% If appropriate, enable line numbering within the abstract. +% +% This mechanism applies generally: +% Create the box in a context in which the meaning of \cmd\par\ has been patched by \classname{lineno}, +% then \cmd\unvbox\ the box in a context where \cmd\set@linepenalties\ has been executed, and +% follow up with \cmd\@linenumberpar, which forces a visit to the output routine just there. +% Note that here, we have to de-fang \cmd\@LN@parpgbrk, which would otherwise causes the appearance +% of a box with depth -1000 points. Go figure. +% \begin{macrocode} +\appdef\class@documenthook{% + \@ifx{\@LN@LLerror\@LN@LLerror@org}{% + \class@info{Overriding \string\@LN@LLerror}% + \let\@LN@LLerror\@LN@LLerror@ltx + }{}% + \@ifpackageloaded{lineno}{% + \@ifxundefined{\set@linepenalties}{}{% + \def\prep@absbox{\set@linepenalties}% + \def\post@absbox{\let\@LN@parpgbrk\@empty\@linenumberpar}% + }% + }{}% +}% +% \end{macrocode} +% +% One may well ask: how to obtain line numbering within an alignment in a float? +% This objective, along with line numbering within footnotes, would require extraordinary measures. +% The float would have to be thrown onto the MVL in order to acquire its line numbers, but +% that fragment of MVL would then have to be protected from being shipped out. +% The question of how to coordinate those lines' numbers with those of lines in the MVL would +% also require dealing with. +% +% \section{Endgame for the Document Class} +% +% We provide for a ``job macro package'' that can override +% definitions and assignments made by the class or any other packages it loads. +% +% \subsection{Job Macro Package} +% You can create a ``job macro package'' for your document +% that will be read in automatically every time +% your document is processed. +% Thus, if your job is a file called \file{myarticle.tex}, +% then the file \file{myarticle.rty} will be read in +% just the same as if you had placed a +% \cmd\usepackage|{myarticle.rty}| statement +% immediately following your \cmd\documentclass\ statement. +% +% Within your \file{.rty} file, +% you can define and use control sequence names that use the |@| character +% and you can override any of the definitions or assignments made +% by the \revtex\ document class or the selected journal substyle. +% That is, you have the power to really mess things up badly. +% +% If you choose to have a job macro package, you are well +% advised to read the \LaTeX\ guide to document classes, +% \file{clsguide.tex} or read up on the subject +% in a book like the \LaTeX\ Companion. +% +% The file \file{template.rty} contains a template for +% creating your own job macro package. +% +% \begin{macrocode} +\appdef\rtx@require@packages{% + \InputIfFileExists{\jobname.rty}{}{}% +}% +% \end{macrocode} +% +% \subsection{Endgame Processing for the Document Class} +% +% The remaining steps in processing the document class involve +% determining the needed society, journal, and pointsize from +% the document's class options and inputting the needed files or +% executing the indicated procedures. +% +% Note that the society file is expected to declare options that will +% allow us to determine the journal involved, and the society and journal +% themselves determine the which pointsize options are declared, along with +% their meanings. +% +% Note also that required packages are read in only after the document options +% have been processed, because the latter can affect the former. +% +% Finally, the setup code is executed: this is code that depends on the +% meanings of the switches we define and on the code within the packages we load. +% +% Note that there are other hooks in use: \cmd\document@inithook, which is +% executed right at the beginning of the document, and \cmd\class@documenthook, +% which serves as a vehicle for any \cmd\AtBeginDocument\ code we might wish to +% execute. +% +%FIXME: use \cmd\class@documenthook\ only for things that bear on the MVL; +% use \cmd\document@inithook\ for all patches to procedures defined within the preamble. +% +% Remember that \classname{natbib} changes its state at \cmd\AtBeginDocument\ time, +% so we have to install our own code at a later point in the processing. +% +% We determine the proper \cmd\@society\ by examining the document's class options. +% \begin{macrocode} +\@parse@class@options@society +% \end{macrocode} +% +% Then, we input the society's substyle +% (which may in turn lead to loading a journal substyle or a pointsize substyle). +% The substyle should not assume the value of any class option: +% instead, it should install code into \cmd\setup@hook. +% \begin{macrocode} +\@process@society{aps}% +% \end{macrocode} +% +% Now that the society has defined the class options relating to journals, +% and has defined \cmd\@journal@default, we can process the journal substyle. +% We parse the options for one that sets \cmd\@journal. +% \begin{macrocode} +\@parse@class@options@\@journal +% \end{macrocode} +% And we process the journal. +% Note that \emph{it is an error} for a society file to fail to define +% \cmd\@journal@default. +% +% \begin{macrocode} +\expandafter\@process@journal\expandafter{\@journal@default}% +% \end{macrocode} +% +% Now that the society and journal have finished defining any options relating to +% point size, we process the class options for any that set \cmd\@pointsize. +% \begin{macrocode} +\@parse@class@options@\@pointsize +% \end{macrocode} +% And we process the pointsize. +% Note that it is an error for the society and journal to leave \cmd\@pointsize@default\ +% undefined at this point, however, the journal may have overriden the assignment of the society. +% +% \begin{macrocode} +\expandafter\@process@pointsize\expandafter{\@pointsize@default}% +% \end{macrocode} +% +% Next, we process the class options for once and all. +% Doing so sets values for some of the Booleans that were introduced along with +% the \cmd\DeclareOption\ statements above. +% +%CHANGE: We process the options in the order declared in the document; this +% gives the document greater control. +% +% \begin{macrocode} +\@options +% \end{macrocode} +% +% Now that the class options have been processed, we can load all the +% packages that we know need loading. +% \begin{macrocode} +\rtx@require@packages +% \end{macrocode} +% +% At this point, the society substyle, the journal substyle, and the +% pointsize have all been processed, along with the document class options. +% Some of these have left things for later; we do these now. +% +% \begin{macro}{\setup@hook} +% +% This portion of the code for this class file +% \emph{must} appear at the very end: +% The procedure +% \cmd\setup@hook\ +% should be executed at the very end of the class file. +% Any code that relies on the value of any of the \texttt{@sw} switches +% or will patch the code of one of the required packages +% should be executed here. +%\changes{4.2a}{2017/11/28}{(MD) Add call to \normalsize to be a good citizen and allow booktabs.sty to work properly} +% +% \begin{macrocode} +\appdef\setup@hook{\normalsize}% +\setup@hook +% \end{macrocode} +% \end{macro} +% +% +% Warn if past maturation date. This code to be enabled only in beta software. +% \changes{4.1f}{2009/07/11}{(AO, 522) Warn if software is expired}% +% \changes{4.1h}{2009/10/09}{(AO) Remove expiry code in the release software}% +% \begin{macrocode} +%<*ignore> + \def\rtx@fin@year{2010}% + \def\rtx@fin@month{01}% + \def\rtx@fin@day{01}% + \def\rtx@fin@warn{% + \@ifnum{\rtx@fin@year>\the\year\relax}{\true@sw}{% + \@ifnum{\rtx@fin@month>\the\month\relax}{\true@sw}{% + \@ifnum{\rtx@fin@day>\the\day\relax}{\true@sw}{% + \false@sw + }% + }% + }% + {% + \class@info{Beta software expires \rtx@fin@year-\rtx@fin@month-\rtx@fin@day; updates available at https://journals.aps.org/revtex/}% + }{% + \class@warn{Outdated software expired \rtx@fin@year-\rtx@fin@month-\rtx@fin@day; please retrieve an update at https://journals.aps.org/revtex/}% + }% + }% +%</ignore> +% \end{macrocode} +% In shipping (non-beta) software, the following line should be commented out. +% \changes{4.1f}{2009/07/11}{(AO, 522) Warn if software is expired}% +% \begin{verbatim} +%\appdef\class@enddocumenthook{\rtx@fin@warn}% +% \end{verbatim} +% +% End of the class file. +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% +% \section{Symbols: the \texttt{revsymb} module} +% We immediately define a utility command: this module's warning. +% \begin{macrocode} +%<*revsymb> +\def\REVSYMB@warn#1{\PackageWarningNoLine{revsymb}{#1}}% +% \end{macrocode} +% +% \begin{macro}{\lambdabar} +% \begin{macrocode} +\DeclareRobustCommand\lambdabar{% + \bgroup + \def\@tempa{% + \hbox{% + \raise.73\ht\z@ + \hb@xt@\z@{% + \kern.25\wd\z@ + \vrule \@width.5\wd\z@\@height.1\p@\@depth.1\p@ + \hss + }% + \box\z@ + }% + }% + \mathchoice + {\setbox\z@\hbox{$\displaystyle \lambda$}\@tempa}% + {\setbox\z@\hbox{$\textstyle \lambda$}\@tempa}% + {\setbox\z@\hbox{$\scriptstyle \lambda$}\@tempa}% + {\setbox\z@\hbox{$\scriptscriptstyle\lambda$}\@tempa}% + \egroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\openone} +% DPC: Really should use a font that includes this glyph. +% Unfortunately not in AMS ones, but is in bbold, cmbb. +% (I think, must check), +% \changes{4.0a}{1998/01/31}{use font-dependent spacing} +% FIXME: check for bbold. +% \begin{macrocode} +\DeclareRobustCommand\openone{\leavevmode\hbox{\small1\normalsize\kern-.33em1}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\corresponds} +% \begin{macro}{\overdots} +% \begin{macro}{\overcirc} +% J\"org Knappen suggests the replacements: +% replace \cmd\corresponds\ with \cmd\triangleq, source \classname{amssymb}; +% replace \cmd\overcirc\ with \cmd\mathring, source \classname{latex2e}; +% replace \cmd\overdots\ with \cmd\dddot, source \classname{amsmath}. +% +% Any use of any of these commands will result in a warning message at the end +% of the log file. If the corresponding package is not loaded, a +% definition will quietly be provided. +% \begin{macrocode} +\DeclareRobustCommand\corresponds{\replace@command\corresponds\triangleq}% +\DeclareRobustCommand\overcirc{\replace@command\overcirc\mathring}% +\DeclareRobustCommand\overdots{\replace@command\overdots\dddot}% +\DeclareRobustCommand\REV@triangleq{% + {\lower.2ex\hbox{=}}{\kern-.75em^\triangle}% +}% +\DeclareRobustCommand\REV@dddot[1]{% + \@ontopof{#1}{\cdots}{1.0}\mathord{\box2}% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\succsim} +% \begin{macro}{\precsim} +% \begin{macro}{\lesssim} +% \begin{macro}{\gtrsim} +% \begin{macro}{\alt} +% \begin{macro}{\agt} +% These version 3.1 commands are always supplied, +% but the definitions in \classname{amssymb} are preferred. +% \begin{macrocode} +\DeclareRobustCommand\altsuccsim{\succ\kern-.9em_\sim\kern.3em}% +\DeclareRobustCommand\altprecsim{\prec\kern-1em_\sim\kern.3em}% +\let\REV@succsim\altsuccsim +\let\REV@precsim\altprecsim +\DeclareRobustCommand\REV@lesssim{\mathrel{\mathpalette\vereq{<}}}% +\DeclareRobustCommand\REV@gtrsim{\mathrel{\mathpalette\vereq{>}}}% +\DeclareRobustCommand\alt{\lesssim} +\DeclareRobustCommand\agt{\gtrsim} +\def\vereq#1#2{% + \lower3\p@\vbox{% + \baselineskip1.5\p@ + \lineskip1.5\p@ + \ialign{$\m@th#1\hfill##\hfil$\crcr#2\crcr\sim\crcr}% + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\tensor} +% \begin{macro}{\overstar} +% \begin{macro}{\loarrow} +% \begin{macro}{\roarrow} +% \changes{4.0b}{1999/06/20}{AO: remove duplicates} +% \begin{macrocode} +\DeclareRobustCommand\tensor[1]{\@ontopof{#1}{\leftrightarrow}{1.15}\mathord{\box2}} +\DeclareRobustCommand\overstar[1]{\@ontopof{#1}{\ast}{1.15}\mathord{\box2}} +\DeclareRobustCommand\loarrow[1]{\@ontopof{#1}{\leftarrow}{1.15}\mathord{\box2}} +\DeclareRobustCommand\roarrow[1]{\@ontopof{#1}{\rightarrow}{1.15}\mathord{\box2}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@ontopof} +% \begin{macrocode} +\def\@ontopof#1#2#3{% + {% + \mathchoice + {\@@ontopof{#1}{#2}{#3}\displaystyle \scriptstyle }% + {\@@ontopof{#1}{#2}{#3}\textstyle \scriptstyle }% + {\@@ontopof{#1}{#2}{#3}\scriptstyle \scriptscriptstyle}% + {\@@ontopof{#1}{#2}{#3}\scriptscriptstyle\scriptscriptstyle}% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@ontopof} +% Same as \revtex3, more or less. +% \begin{macrocode} +\def\@@ontopof#1#2#3#4#5{% + \setbox\z@\hbox{$#4#1$}% + \setbox\f@ur\hbox{$#5#2$}% + \setbox\tw@\null\ht\tw@\ht\z@ \dp\tw@\dp\z@ + \@ifdim{\wd\z@>\wd\f@ur}{% + \setbox\f@ur\hb@xt@\wd\z@{\hss\box\f@ur\hss}% + \mathord{\rlap{\raise#3\ht\z@\box\f@ur}\box\z@}% + }{% + \setbox\f@ur\hb@xt@.9\wd\f@ur{\hss\box\f@ur\hss}% + \setbox\z@\hb@xt@\wd\f@ur{\hss$#4\relax#1$\hss}% + \mathord{\rlap{\copy\z@}\raise#3\ht\z@\box\f@ur}% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frak} +% Deal with legacy \cmd\frak: +% if \classname{amsfonts} not loaded, defined in such a way as to ask for that package. +% Also, says to use \cmd\mathfrak\ instead. +% \begin{macrocode} +\DeclareRobustCommand\frak{% + \REVSYMB@warn{% + Command \string\frak\space unsupported:^^J% + please use \string\mathfrak\space instead.% + }% + \global\let\frak\mathfrak + \frak +}% +\DeclareRobustCommand\REV@mathfrak{% + \REVSYMB@warn{% + Command \string\mathfrak\space undefined:^^J% + please specify the amsfonts or amssymb option!% + }% + \global\let\mathfrak\@firstofone + \mathfrak +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Bbb} +% Deal with legacy \cmd\Bbb: +% if \classname{amsfonts} not loaded, defined in such a way as to ask for that package. +% Also, says to use \cmd\mathbb\ instead. +% \begin{macrocode} +\DeclareRobustCommand\Bbb{% + \REVSYMB@warn{% + Command \string\Bbb\space unsupported:^^J% + please use \string\mathbb\space instead.% + }% + \global\let\Bbb\mathbb + \Bbb +}% +\DeclareRobustCommand\REV@mathfrak{% + \REVSYMB@warn{% + Command \string\mathbb\space undefined:^^J% + please specify the amsfonts or amssymb option!% + }% + \global\let\mathbb\@firstofone + \mathbb +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Bigglb} +% Deal with legacy bold delimiters. +% Each of the following takes an implicit argument consisting of +% the delimiter to be made big and bold. +% FIXME: \cmd\DeclareBoldMathCommand\ is not the right tool! +% \begin{macrocode} +\def\Bigglb{\REV@boldopen \Bigg}% +\def\Biglb {\REV@boldopen \Big }% +\def\bigglb{\REV@boldopen \bigg}% +\def\biglb {\REV@boldopen \big }% +\def\Biggrb{\REV@boldclose\Bigg}% +\def\Bigrb {\REV@boldclose\Big }% +\def\biggrb{\REV@boldclose\bigg}% +\def\bigrb {\REV@boldclose\big }% +\def\REV@pmb#1{% + \hbox{% + \setbox\z@=\hbox{#1}% + \kern-.02em\copy\z@\kern-\wd\z@ + \kern .04em\copy\z@\kern-\wd\z@ + \kern-.02em + \raise.04em\copy\z@ + }% +}% +\def\REV@boldopen #1#2{\mathopen {\REV@pmb{$#1#2$}}}% +\def\REV@boldclose#1#2{\mathclose{\REV@pmb{$#1#2$}}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\revsymb@inithook} +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% Package dependencies are taken care of at \cmd\setup@hook\ time. +% \begin{macrocode} +\def\revsymb@inithook{% + \@ifxundefined\dddot{\let\dddot\REV@dddot}{}% + \@ifxundefined\triangleq{\let\triangleq\REV@triangleq}{}% + \@ifxundefined\succsim{\let\succsim\altsuccsim}{}% + \@ifxundefined\precsim{\let\precsim\altprecsim}{}% + \@ifxundefined\lesssim{\let\lesssim\REV@lesssim}{}% + \@ifxundefined\gtrsim {\let\gtrsim \REV@gtrsim }{}% + \@ifxundefined\mathfrak{\let\mathfrak\REV@mathfrak}{}% + \@ifxundefined\mathbb{\let\mathbb\REV@mathbb}{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</revsymb> +% \end{macrocode} +% +% \section{The \classoption{10pt} class option: the \texttt{10pt} module} +% \changes{4.0b}{1999/06/20}{AO: all code for \protect\classoption{10pt} is in this module.} +% The file \file{aps10pt.rtx} is read in by the \classname{revtex4} document class +% if \cmd\@pointsize\ has the value 10. +% +% \begin{macrocode} +%<*10pt> +% \end{macrocode} +% +% \subsection{Defend Against Forseeable Errors}% +% Protect this file from being read in by anything but \revtex. +% \begin{macrocode} +\ifx\undefined\substyle@ext + \def\@tempa{% + \endinput + \GenericWarning{I must be read in by REVTeX! (Bailing out)}% + }% + \expandafter\else + \def\@tempa{}% + \expandafter\fi\@tempa + \class@info{RevTeX pointsize 10pt selected}% +% \end{macrocode} +% +% \begin{macrocode} +\def\normalsize{% + \@setfontsize\normalsize\@xpt{11.5}% + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \abovedisplayskip + \belowdisplayshortskip \abovedisplayskip + \let\@listi\@listI +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\small{% + \@setfontsize\small\@ixpt{10.5}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{% + \leftmargin\leftmargini + \topsep 4\p@ \@plus2\p@ \@minus2\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\footnotesize{% + \@setfontsize\footnotesize\@viiipt{9.5pt}% + \abovedisplayskip 6\p@ \@plus2\p@ \@minus4\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \z@ \@plus\p@ + \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@ + \def\@listi{% + \leftmargin\leftmargini + \topsep 3\p@ \@plus\p@ \@minus\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\scriptsize{% + \@setfontsize\scriptsize\@viipt\@viiipt +}% +\def\tiny{% + \@setfontsize\tiny\@vpt\@vipt +}% +\def\large{% + \@setfontsize\large\@xiipt{14pt}% +}% +\def\Large{% + \@setfontsize\Large\@xivpt{18pt}% +}% +\def\LARGE{% + \@setfontsize\LARGE\@xviipt{22pt}% +}% +\def\huge{% + \@setfontsize\huge\@xxpt{25pt}% +}% +\def\Huge{% + \@setfontsize\Huge\@xxvpt{30pt}% +}% +% \end{macrocode} +% +% The values of these margin parameters are dependent upon +% \cmd\twoside@sw; any society or journal that +% has its own preferences should override these assignments +% by doing \cmd\appdef\cmd\setup@hook. +% \begin{macrocode} +\appdef\setup@hook{% + \twoside@sw{% +% \oddsidemargin -.1in +% \evensidemargin -.4in + \oddsidemargin -20pt + \evensidemargin -20pt + \marginparwidth 107pt + }{% + \oddsidemargin -.25in + \evensidemargin -.25in + \marginparwidth 30pt + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\marginparsep 6pt +% \end{macrocode} +% +% \begin{macrocode} +\topmargin -61pt +% \end{macrocode} +% +% \begin{macrocode} +\headheight 25pt +\headsep 16pt +% \end{macrocode} +% +% \changes{4.1n}{2010/01/02}{(AO, 571) class file must set \cs{splittopskip}; fine tune \cs{skip}\cs{footins}; \cs{footnoterule} defined in terms of \cs{skip}\cs{footins}}% +% \begin{macrocode} +\topskip 10pt +\splittopskip\topskip +% \end{macrocode} +% +% \begin{macrocode} +\footskip 30pt +% \end{macrocode} +% +% \begin{macrocode} + \textheight = 56pc +% \end{macrocode} +% +% \begin{macrocode} +\textwidth42.5pc +% \end{macrocode} +% +% \begin{macrocode} +\columnsep 1.5pc +\columnseprule 0pt +% \end{macrocode} +% +% \changes{4.1n}{2010/01/02}{(AO, 571) class file must set \cs{splittopskip}; fine tune \cs{skip}\cs{footins}; \cs{footnoterule} defined in terms of \cs{skip}\cs{footins}}% +% \begin{macrocode} +\footnotesep 1pt +\skip\footins 39pt plus 4pt minus 12pt +\def\footnoterule{% + \dimen@\skip\footins\divide\dimen@\tw@ + \kern-\dimen@\hrule width.5in\kern\dimen@ +}% +% \end{macrocode} +% +% \begin{macrocode} +\floatsep 12pt plus 2pt minus 2pt +\textfloatsep 20pt plus 2pt minus 4pt +\intextsep 12pt plus 2pt minus 2pt +% \end{macrocode} +% +% \begin{macrocode} +\dblfloatsep 12pt plus 2pt minus 2pt +\dbltextfloatsep 20pt plus 2pt minus 4pt +% \end{macrocode} +% +% \begin{macrocode} +\@fptop 0pt plus 1fil +\@fpsep 8pt plus 2fil +\@fpbot 0pt plus 1fil +\@dblfptop 0pt plus 1fil +\@dblfpsep 8pt plus 2fil +\@dblfpbot 0pt plus 1fil +% \end{macrocode} +% +% \begin{macrocode} +\marginparpush 5pt +% \end{macrocode} +% +% \begin{macrocode} +\parskip 0pt plus 1pt +\parindent 10pt +\emergencystretch8\p@ +% \end{macrocode} +% +% \begin{macrocode} +\partopsep 2pt plus 1pt minus 1pt +% \end{macrocode} +% +% \begin{macrocode} +\leftmargini 25pt +\leftmarginii 22pt +\leftmarginiii 18.7pt +\leftmarginiv 17pt +\leftmarginv 10pt +\leftmarginvi 10pt +% \end{macrocode} +% +% \begin{macrocode} +\def\@listI{% + \leftmargin\leftmargini + \parsep 4\p@ plus2\p@ minus\p@ + \topsep 8\p@ plus2\p@ minus4\p@ + \itemsep 4\p@ plus2\p@ minus\p@ +}% +% \end{macrocode} +% +% \begin{macrocode} +\labelsep 4pt +% \end{macrocode} +% +% \begin{macrocode} +\def\@listii{% + \leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep 4\p@ plus2\p@ minus\p@ + \parsep 2\p@ plus\p@ minus\p@ + \itemsep \parsep +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@listiii{% + \leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep 2\p@ plus\p@ minus\p@ + \parsep \z@ + \partopsep \p@ plus\z@ minus\p@ + \itemsep \topsep +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@listiv{% + \leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@listv{% + \leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@listvi{% + \leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep +}% +% \end{macrocode} +% +% \begin{macrocode} +%</10pt> +% \end{macrocode} +% +% \section{The \classoption{11pt} class option: the \texttt{11pt} module} +% \changes{4.0b}{1999/06/20}{AO: all code for \protect\classoption{11pt} is in this module.} +% The file \file{11pt.rtx} is read in by the \classname{revtex4} document class +% if \cmd\@pointsize\ has the value 11. +% +% \begin{macrocode} +%<*11pt> +% \end{macrocode} +% +% \subsection{Defend Against Forseeable Errors}% +% Protect this file from being read in by anything but \revtex. +% \begin{macrocode} +\ifx\undefined\substyle@ext + \def\@tempa{% + \endinput + \GenericWarning{I must be read in by REVTeX! (Bailing out)}% + }% + \expandafter\else + \def\@tempa{}% + \expandafter\fi\@tempa + \class@info{RevTeX pointsize 11pt selected}% +% \end{macrocode} +% +% \begin{macrocode} +\def\normalsize{% + \@setfontsize\normalsize\@xipt{13.6}% + \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \abovedisplayskip + \belowdisplayshortskip \abovedisplayskip + \let\@listi\@listI +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\small{% + \@setfontsize\small\@xpt\@xiipt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 6\p@ \@plus2\p@ \@minus2\p@ + \parsep 3\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep + }% + \belowdisplayskip \abovedisplayskip +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\footnotesize{% + \@setfontsize\footnotesize\@ixpt{11}% + \abovedisplayskip 8\p@ \@plus2\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 4\p@ \@plus2\p@ \@minus2\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep + }% + \belowdisplayskip \abovedisplayskip +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\scriptsize{% + \@setfontsize\scriptsize\@viiipt{9.5}% +}% +\def\tiny{% + \@setfontsize\tiny\@vipt\@viipt +}% +\def\large{% + \@setfontsize\large\@xiipt{14}% +}% +\def\Large{% + \@setfontsize\Large\@xivpt{18}% +}% +\def\LARGE{% + \@setfontsize\LARGE\@xviipt{22}% +}% +\def\huge{% + \@setfontsize\huge\@xxpt{25pt}% +}% +\def\Huge{% + \@setfontsize\Huge\@xxvpt{30pt}% +}% +% \end{macrocode} +% +% \begin{macrocode} +%</11pt> +% \end{macrocode} +% +% \section{The \classoption{12pt} class option: the \texttt{12pt} module} +% \changes{4.0b}{1999/06/20}{AO: all code for \protect\classoption{12pt} is in this module.} +% The file \file{12pt.rtx} is read in by the \classname{revtex4} document class +% if \cmd\@pointsize\ has the value 12. +% +% \begin{macrocode} +%<*12pt> +% \end{macrocode} +% +% \subsection{Defend Against Forseeable Errors}% +% Protect this file from being read in by anything but \revtex. +% \begin{macrocode} +\ifx\undefined\substyle@ext + \def\@tempa{% + \endinput + \GenericWarning{I must be read in by REVTeX! (Bailing out)}% + }% + \expandafter\else + \def\@tempa{}% + \expandafter\fi\@tempa + \class@info{RevTeX pointsize 12pt selected}% +% \end{macrocode} +% +% \begin{macrocode} +\def\normalsize{% + \@setfontsize\normalsize\@xiipt{14pt}% + \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \z@ plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ + \let\@listi\@listI +}% +% \end{macrocode} +% +% \begin{macrocode} + \def\small{% + \@setfontsize\small\@xipt{14.5pt}% + \abovedisplayskip 8\p@ \@plus3\p@ \@minus6\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ + \def\@listi{% + \leftmargin\leftmargini + \topsep 9\p@ \@plus3\p@ \@minus5\p@ + \parsep 4.5\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep + }% +}% +% \end{macrocode} +% +% Same baselineskip as \cmd\small\ ? +% \begin{macrocode} + \def\footnotesize{% + \@setfontsize\footnotesize\@xpt{14.5pt}% + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \def\@listi{% + \leftmargin\leftmargini + \topsep 6\p@ \@plus2\p@ \@minus2\p@ + \parsep 3\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\scriptsize{% + \@setfontsize\scriptsize\@viiipt{9.5pt}% +}% +\def\tiny{% + \@setfontsize\tiny\@vipt{7pt}% +}% +\def\large{% + \@setfontsize\large\@xivpt{18pt}% +}% +\def\Large{% + \@setfontsize\Large\@xviipt{22pt}% +}% +\def\LARGE{% + \@setfontsize\LARGE\@xxpt{25pt}% +}% +\def\huge{% + \@setfontsize\huge\@xxvpt{30pt}% +}% +\let\Huge=\huge +% \end{macrocode} +% +% \begin{macrocode} +%</12pt> +% \end{macrocode} +% +% \section{Page parameters}% +% This code is common to both \classoption{11pt} and \classoption{12pt}. +% +% \begin{macrocode} +%<*11pt|12pt> +% \end{macrocode} +% +% \begin{macrocode} +\appdef\setup@hook{% + \twoside@sw{% + \oddsidemargin 0pt + \evensidemargin 0pt + \marginparwidth 60pt + }{% + \oddsidemargin 0pt + \evensidemargin 0pt + \marginparwidth 44pt + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\marginparsep 10pt +% \end{macrocode} +% +% \begin{macrocode} +\topmargin -37pt +% \end{macrocode} +% +% \begin{macrocode} +\headheight 12pt +\headsep 25pt +% \end{macrocode} +% +% \changes{4.1n}{2010/01/02}{(AO, 571) class file must set \cs{splittopskip}; fine tune \cs{skip}\cs{footins}; \cs{footnoterule} defined in terms of \cs{skip}\cs{footins}}% +% \begin{macrocode} +\topskip 10pt +\splittopskip\topskip +% \end{macrocode} +% +% \begin{macrocode} +\footskip 30pt +% \end{macrocode} +% +% \begin{macrocode} +\textheight=665.5\p@ +% \end{macrocode} +% +% \begin{macrocode} +\appdef\setup@hook{% + \tightenlines@sw{% + \def\baselinestretch{1}% + }{% + \def\baselinestretch{1.5}% + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\textwidth 468pt +% \end{macrocode} +% +% \begin{macrocode} +\columnsep 10pt +\columnseprule 0pt +% \end{macrocode} +% +% \changes{4.1n}{2010/01/02}{(AO, 571) class file must set \cs{splittopskip}; fine tune \cs{skip}\cs{footins}; \cs{footnoterule} defined in terms of \cs{skip}\cs{footins}}% +% \begin{macrocode} +\footnotesep 1pt +\skip\footins 25.25pt plus 4pt minus 12pt +\def\footnoterule{% + \dimen@\skip\footins\divide\dimen@\f@ur + \kern-\dimen@\hrule width.5in\kern\dimen@ +}% +% \end{macrocode} +% +% \begin{macrocode} +\floatsep 14pt plus 2pt minus 4pt +\textfloatsep 20pt plus 2pt minus 4pt +\intextsep 14pt plus 4pt minus 4pt +% \end{macrocode} +% +% \begin{macrocode} +\dblfloatsep 14pt plus 2pt minus 4pt +\dbltextfloatsep 20pt plus 2pt minus 4pt +% \end{macrocode} +% +% \begin{macrocode} +\@fptop 0pt plus 1fil +\@fpsep 10pt plus 2fil +\@fpbot 0pt plus 1fil +\@dblfptop 0pt plus 1fil +\@dblfpsep 10pt plus 2fil% +\@dblfpbot 0pt plus 1fil +% \end{macrocode} +% +% \begin{macrocode} +\marginparpush 7pt +% \end{macrocode} +% +% \begin{macrocode} +\parskip 0pt plus 1pt +\parindent 15pt +\emergencystretch8\p@ +\partopsep 3pt plus 2pt minus 2pt +% \end{macrocode} +% +% \begin{macrocode} +\leftmargini 30pt +\leftmarginii 26pt +\leftmarginiii 22pt +\leftmarginiv 20pt +\leftmarginv 12pt +\leftmarginvi 12pt +% \end{macrocode} +% +% \begin{macrocode} +\def\@listI{\leftmargin\leftmargini \parsep 5\p@ plus2.5\p@ minus\p@ + \topsep 10\p@ plus4\p@ minus6\p@ + \itemsep 5\p@ plus2.5\p@ minus\p@ +}% +% \end{macrocode} +% +% \begin{macrocode} +\labelsep 6pt +% \end{macrocode} +% +% \begin{macrocode} +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth-\labelsep + \topsep 5\p@ plus2.5\p@ minus\p@ + \parsep 2.5\p@ plus\p@ minus\p@ + \itemsep \parsep +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii\advance\labelwidth-\labelsep + \topsep 2.5\p@ plus\p@ minus\p@ + \parsep \z@ \partopsep \p@ plus\z@ minus\p@ + \itemsep \topsep +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@listiv{\leftmargin\leftmarginiv + \labelwidth\leftmarginiv\advance\labelwidth-\labelsep +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@listv{\leftmargin\leftmarginv + \labelwidth\leftmarginv\advance\labelwidth-\labelsep +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@listvi{\leftmargin\leftmarginvi + \labelwidth\leftmarginvi\advance\labelwidth-\labelsep +}% +% \end{macrocode} +% +% \begin{macrocode} +%</11pt|12pt> +% \end{macrocode} +% +% \section{The \classoption{aps} class extension: the \texttt{aps} module} +% \changes{4.0b}{1999/06/20}{AO: made aps.rtx part of revtex4.dtx} +% The file \file{aps.rtx} is read in by the \classname{revtex4} document class +% if \cmd\@society\ has the value \classoption{aps}. +% +% Here, code specific to APS journals is separated out from the \revtex\ document class. +% (Other societies can customize \revtex\ by supplying their own \file{.rtx} file.) +% +% This class extension file is a model for a class extension you might write yourself. +% +% First, incorporate a \cmd\ProvidesFile\ command with an optional argument giving +% the version information, e.g., +% \begin{verbatim} +% \ProvidesFile{foo}[2001/09/11 v1.1 Docinfo]% +% \end{verbatim} +% +% Within the society substyle, there are two things we must do as well: +% define the default journal, +% \begin{verbatim} +% \def\@journal@default{pra}% +% \end{verbatim} +% And do likewise for the point size: +% \begin{verbatim} +% \def\@pointsize@default{10}% +% \end{verbatim} +% +% We first define some text entities (amounting to journal abbreviations), +% then some APS-specific initializations, +% then code for particular APS journals. +% In the latter case, the choice is +% keyed off the macro \cmd\@journal. +% +% \begin{macrocode} +%<*aps> +% \end{macrocode} +% +% \subsection{Defend Against Forseeable Errors}% +% Protect this file from being read in by anything but \revtex. +% \begin{macrocode} +\ifx\undefined\substyle@ext + \def\@tempa{% + \endinput + \GenericWarning{I must be read in by REVTeX! (Bailing out)}% + }% + \expandafter\else + \def\@tempa{}% + \expandafter\fi\@tempa + \class@info{RevTeX society APS selected}% +% \end{macrocode} +% +% Here are the class options relating to the APS: +% \begin{macrocode} +\DeclareOption{pra}{\change@journal{pra}}% +\DeclareOption{prb}{\change@journal{prb}}% +\DeclareOption{prc}{\change@journal{prc}}% +\DeclareOption{prd}{\change@journal{prd}}% +\DeclareOption{pre}{\change@journal{pre}}% +\DeclareOption{prl}{\change@journal{prl}}% +%\changes{4.2b}{2017/11/21}{(MD) Update options for new titles without "Special Topics" and make prper match style of other journal options} +\DeclareOption{prab}{\change@journal{prab}}% +\DeclareOption{prper}{\change@journal{prper}}% +\DeclareOption{rmp}{\change@journal{rmp}}% +%\changes{4.2b}{2017/11/21}{(MD) Add options for new APS journals and a generic physrev option for future-proofing} +\DeclareOption{prx}{\change@journal{prx}}% +\DeclareOption{prapplied}{\change@journal{prapplied}}% +\DeclareOption{prmaterials}{\change@journal{prmaterials}}% +\DeclareOption{prfluids}{\change@journal{prfluids}}% +\DeclareOption{physrev}{\change@journal{physrev}}% +% \end{macrocode} +% +% \subsection{Abbreviations}% +% \changes{4.1p}{2010/02/24}{(AO, 584) Per MD, remove trailing space character from each journal abbreviation: it had caused an extraneous space in the .bbl} +% The following macros constitute typing shortcuts for +% certain journal names. +% \begin{macrocode} +\def\adv{AIP Advances}% +\def\ao{Appl.\ Opt.}% +\def\ap{Appl.\ Phys.}% +\def\apl{Appl.\ Phys.\ Lett.}% +\def\apm{Appl.\ Phys.\ Lett.\ Mater.}% +\def\apj{Astrophys.\ J.}% +\def\bell{Bell Syst.\ Tech.\ J.}% +\def\bmf{Biomicrofluidics}% +\def\cha{Chaos}% +\def\jqe{IEEE J.\ Quantum Electron.}% +\def\assp{IEEE Trans.\ Acoust.\ Speech Signal Process.}% +\def\aprop{IEEE Trans.\ Antennas Propag.}% +\def\mtt{IEEE Trans.\ Microwave Theory Tech.}% +\def\iovs{Invest.\ Ophthalmol.\ Vis.\ Sci.}% +\def\jcp{J.\ Chem.\ Phys.}% +\def\jap{J.\ Appl.\ Phys.}% +\def\jmp{J.\ Math.\ Phys.}% +\def\jmo{J.\ Mod.\ Opt.}% +\def\josa{J.\ Opt.\ Soc.\ Am.}% +\def\josaa{J.\ Opt.\ Soc.\ Am.\ A}% +\def\josab{J.\ Opt.\ Soc.\ Am.\ B}% +\def\jpp{J.\ Phys.\ (Paris)}% +\def\jpr{J.\ Phys.\ Chem.\ Ref.\ Data}% +\def\ltp{Low.\ Temp.\ Phys.}% +\def\nat{Nature (London)}% +\def\oc{Opt.\ Commun.}% +\def\ol{Opt.\ Lett.}% +\def\pl{Phys.\ Lett.}% +\def\pop{Phys.\ Plasmas}% +\def\pof{Phys.\ Fluids}% +\def\pra{Phys.\ Rev.\ A}% +\def\prb{Phys.\ Rev.\ B}% +\def\prc{Phys.\ Rev.\ C}% +\def\prd{Phys.\ Rev.\ D}% +\def\pre{Phys.\ Rev.\ E}% +\def\prl{Phys.\ Rev.\ Lett.}% +\def\rmp{Rev.\ Mod.\ Phys.}% +\def\rsi{Rev.\ Sci.\ Instrum.}% +\def\rse{J.\ Renewable Sustainable Energy}% +\def\pspie{Proc.\ Soc.\ Photo-Opt.\ Instrum.\ Eng.}% +\def\sjqe{Sov.\ J.\ Quantum Electron.}% +\def\vr{Vision Res.}% +\def\sd{Structural\ Dynamics}% +\def\jor{J.\ Rheol.}% +\def\cp{AIP\ Conference\ Proceedings}% +% \end{macrocode} +% +% \subsection{APS Setup}% +% Here we define the default procedures for APS journals. +% Individual APS journals may override these definitions. +% +% \subsubsection{Title block}% +% +% The specifics of the title block. +% Apply to all APS journals; individual journals may override these settings. +% +% \begin{macro}{\@fnsymbol} +% The \LaTeX\ kernel definition of \cmd\@fnsymbol\ is overridden. +% The definition in \filename{fixltx2e.sty} serves as a guide to the new way to symbol, +% working in both text- and math modes. +% +% \filename{fixltx2e.sty} duplicates some features of \filename{ltxgrid} and \filename{ltxutil}, +% however, so it may be incompatible with \revtex. +% In case it is not loaded, we must provide a meaning for \cmd\TextOrMath, +% which that package makes robust. +% I believe that it is \cmd\@fnsymbol\ itself that ought to be robustified. +% e\TeX\ further complicates matters; we do not especially accomodate it. +% +% \changes{4.1d}{2009/03/27}{Definition of \cs{ @fnsymbol} follows fixltx2e.sty} +% +% Not! \cmd\TextOrMath\ must be made robust in any case (Bug 530). I return things to follow +% core \LaTeXe\ (\filename{latex.ltx}). +% \changes{4.1f}{2009/10/05}{(AO, 530) \cs{@fnsymbol}: Failed to import fixltx2e.sty technology. Return to LaTeX core.} +% \begin{macrocode} +\def\@fnsymbol#1{% + \ensuremath{% + \ifcase#1\or + *\or + \dagger\or + \ddagger\or + \mathsection\or + \mathparagraph\or +% \|\or + **\or + \dagger\dagger\or + \ddagger\ddagger\else + \mathsection\mathsection\or + \mathparagraph\mathparagraph\or + ***\or + \dagger\dagger\dagger\or + \ddagger\ddagger\ddagger\else + \mathsection\mathsection\mathsection\or + \mathparagraph\mathparagraph\mathparagraph\or +% + \@ctrerr + \fi + }% +}% +\appdef\document@inithook{% + \@ifxundefined\TextOrMath{% + \DeclareRobustCommand\TextOrMath{\@ifmmode{\false@sw}{\true@sw}}% + }{}% +}% +\let\thefootnote@latex\thefootnote +% \end{macrocode} +% \end{macro} +% +% We assign the default titlepage style for APS; a journal or document instance +% may override by invoking one of the other \cmd\clo@... procedures defined in \revtex. +% \begin{macrocode} +\clo@groupedaddress +% \end{macrocode} +% +% \begin{macro}{\titlepage} +% \begin{macrocode} +\renewenvironment{titlepage}{% + \let\wastwocol@sw\twocolumn@sw + \onecolumngrid + \newpage + \thispagestyle{titlepage}% + \c@page\z@ +% \end{macrocode} +% A comment: ``article.cls sets this to one not zero?'' +% \begin{macrocode} +}{% + \wastwocol@sw{\twocolumngrid}{\newpage}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractheading} +% APS Journals all set the abstract head the same way, with no head. +% However, if the user has specified the \classoption{preprint} class option, +% then the abstract will have a head. +% \begin{macrocode} +\def\frontmatter@abstractheading{% + \preprintsty@sw{% + \begingroup + \centering\large + \abstractname + \par + \endgroup + }{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractwidth} +% All APS journals set the abstract to the same width. +% \begin{macrocode} +\def\frontmatter@abstractwidth{400\p@}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractfont} +% All APS journals set the abstract body the same way. +% \changes{4.0c}{1999/11/13}{(AO, 123) add parskip to the abstract.} +% \changes{4.1e}{2008/06/29}{(AO, 455) be nice to a list within the abstract} +% \begin{macrocode} +\def\frontmatter@abstractfont{% + \small + \parindent1em\relax + \adjust@abstractwidth +}% +\def\adjust@abstractwidth{% + \dimen@\textwidth\advance\dimen@-\frontmatter@abstractwidth + \divide\dimen@\tw@ + \galley@sw{% + \advance\rightskip\tw@\dimen@ + }{% + \advance\leftskip\dimen@ + \advance\rightskip\dimen@ + }% + \@totalleftmargin\leftskip +}% +% \end{macrocode} +% \end{macro} +% +%\changes{4.2b}{2017/11/22}{(MD) Change default to not use a title page - it seems antiquated} +% All APS journal preprints use separate titlepage and full-width abstract. +% +% In effect, we establish a society default value for \cmd\preprintsty@sw, +% and for \cmd\titlepage@sw. +% \begin{macrocode} +\@booleanfalse\preprintsty@sw +\@booleanfalse\titlepage@sw +% \end{macrocode} +% +% We choose the page style for all APS journals. +% The journal may override by inserting its own code in \cmd\setup@hook. +% Users wishing to customize their documents will be able to invoke a \cmd\pagestyle\ +% command anywhere in the preamble; it will override the assignments here. +% +% Here is the big switch for APS preprints. Note that \cmd\preprintsty@sw +% is also consulted in various procedures, but we assume its value does +% not change after \cmd\setup@hook\ time. +% \begin{macrocode} +\appdef\setup@hook{% + \preprintsty@sw{% + \ps@preprint + \def\frontmatter@abstractwidth{\textwidth}% + \def\frontmatter@affiliationfont{\it}% + \let\section\section@preprintsty +% \end{macrocode} +% The following line of code had been commented out at this point. +% \begin{verbatim} +% \let\@hangfrom@section\@hangfrom@section@preprintsty +% \end{verbatim} +% \begin{macrocode} + \let\subsection\subsection@preprintsty + \let\subsubsection\subsubsection@preprintsty + }{% + \ps@article + }% +}% +% \end{macrocode} +% +% \begin{macro}{\frontmatter@authorformat} +% All APS journals set the author list the same. +% The leading is 11.5 points, and +% there is 11.5 points of extra space above the first author line +% (which amounts to the same thing as 11.5 points extra below the title) +% for a total of 23 points base-to-base. +% +% \begin{macrocode} +\def\frontmatter@authorformat{% + \skip@\@flushglue + \@flushglue\z@ plus.3\hsize\relax + \centering + \advance\baselineskip\p@ + \parskip11.5\p@\relax + \@flushglue\skip@ +% \end{macrocode} +% The following line of code had been commented out at this point. +% \begin{verbatim} +%\preprintsty@sw{}{% +% \addvspace{0\p@}% +%}% +% \end{verbatim} +% \begin{macrocode} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@above@affilgroup} +% The default amount of space above affiliation. +% APS Journals have 24 points b-b above an affiliation group. +% \begin{macrocode} +\def\frontmatter@above@affilgroup{% +% \end{macrocode} +% The following line of code had been commented out at this point. +% \begin{verbatim} +%\preprintsty@sw{}{% +% \addvspace{11\p@}% +%}% +% \end{verbatim} +% \begin{macrocode} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@above@affiliation} +% \begin{macro}{\frontmatter@above@affiliation@script} +% The default amount of space above affiliation. +% APS Journals have no extra space between author group down to common affiliation. +% \begin{macrocode} +\def\frontmatter@above@affiliation@script{% + \skip@\@flushglue + \@flushglue\z@ plus.3\hsize\relax + \centering + \@flushglue\skip@ + \addvspace{3.5\p@}% +}% +\def\frontmatter@above@affiliation{% + \preprintsty@sw{}{% +% \end{macrocode} +% The following line of code had been commented out at this point. +% \begin{verbatim} +% \addvspace{12\p@}% +% \end{verbatim} +% \begin{macrocode} + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\frontmatter@affiliationfont} +% All APS journals set the affiliation the same. +% \begin{macrocode} +\def\frontmatter@affiliationfont{% + \small\it +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@collaboration@above} +% PRL: 1.5 points extra: 13 points base-to-base above. +% \begin{macrocode} +\def\frontmatter@collaboration@above{% + \preprintsty@sw{% + }{% + \parskip1.5\p@\relax + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@setup} +% All APS journals set the title page using the same font and size. +% However, justification varies for the title block elements, so +% we assert none here. +% \begin{macrocode} +\def\frontmatter@setup{% + \normalfont +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@title@above} +% \begin{macro}{\frontmatter@title@format} +% \begin{macro}{\frontmatter@title@below} +% All APS journals set the article title the same. +% +% Note: Spacing from title to author is 23 points base-to-base. +% \begin{macrocode} +\def\frontmatter@title@above{\addvspace{6\p@}}% +\def\frontmatter@title@format{\large\bfseries\centering\parskip\z@skip}% +\def\frontmatter@title@below{}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\frontmatter@makefnmark} +% All APS journals share this procedure for setting the titlepage footnote text. +% \begin{macrocode} +\def\@author@parskip{3\p@}% +\def\frontmatter@makefnmark{% + \@textsuperscript{% + \normalfont\@thefnmark + }% +}% +\def\frontmatter@authorbelow{% + \addvspace{3\p@}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@RRAP@format} +% All APS journals use the same format for the ``Received, Revised, etc.'' block on the title page. +% +% Change note: 11.5 points b-b from author/affiliation down to date. +% \begin{macrocode} +\def\frontmatter@RRAP@format{% + \small + \centering +% \end{macrocode} +% The following line of code had been commented out at this point. +% \begin{verbatim} +% \preprintsty@sw{}{\parskip.5ex\relax}% +% \end{verbatim} +% \begin{macrocode} + \everypar{\hbox\bgroup(\@gobble@leavemode@uppercase}% + \def\par{\@ifvmode{}{\unskip)\egroup\@@par}}% +}% +\def\punct@RRAP{;\egroup\ \hbox\bgroup}% +\def\@gobble@leavemode@uppercase#1#2{\expandafter\MakeTextUppercase}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@PACS@format} +% +% \begin{macrocode} +\def\frontmatter@PACS@format{% + \addvspace{11\p@}% + \footnotesize + \adjust@abstractwidth + \parindent\z@ + \parskip\z@skip + \samepage +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@keys@format} +% +% \begin{macrocode} +\def\frontmatter@keys@format{% + \footnotesize + \adjust@abstractwidth + \parindent\z@ + \samepage +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@titlepage} +% \changes{4.0a}{1998/06/10}{multiple preprint commands} +% \changes{4.0b}{1999/06/20}{Stack \cs{preprint} args flush right at right margin.} +% Title page style. Currently empty except for preprint header, +% which consists of all the \cmd\preprint\ arguments, +% stacked flush right at the right margin. +% \changes{4.0c}{1999/11/13}{Insert procedure \cs{checkindate}} +% \begin{macrocode} +\def\ps@titlepage{% + \def\@oddhead{% + \hfill + \preprint@sw{% + \expandafter\produce@preprints\expandafter{\@preprint}% + }{}% + }% + \let\@evenhead\@oddhead + \def\@oddfoot{% + \hb@xt@\z@{\byrevtex\hss}% + \hfil + \preprintsty@sw{\thepage}{}% + \quad\checkindate + \hfil + }% + \let\@evenfoot\@oddfoot +}% +\def\byrevtex{\byrevtex@sw{Typeset by REV\TeX}{}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\produce@preprints} +% \changes{4.0c}{1999/11/13}{(AO, 115) If three or more preprints specified, set on single line, with commas.} +% \begin{macrocode} +\def\produce@preprints#1{% + \vtop to \z@{% + \def\baselinestretch{1}% + \small + \let\preprint\preprint@count + \count@\z@ + #1% + \@ifnum{\count@>\tw@}{% + \hbox{% + \let\preprint\preprint@hlist + #1% + \setbox\z@\lastbox + }% + }{% + \let\preprint\preprint@cr + \halign{\hfil##\cr#1\crcr}% + \par + \vss + }% + }% +}% +\def\preprint@cr#1{#1\cr}% +\def\preprint@count#1{\advance\count@\@ne}% +\def\preprint@hlist#1{#1\hbox{, }}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Stacked Heads}% +% All APS journals put a period (.), followed by quad space, after the section number. +% Also, no hanging section number. +% \begin{macrocode} +\def\@seccntformat#1{\csname the#1\endcsname.\quad}% +\def\@hang@from#1#2#3{#1#2#3}% +% \end{macrocode} +% +% Note that in the following, we wish to set the section head uppercase, so we use +% David Carlisle's \cmd\MakeTextUppercase. However, because this procedure effectively +% parses its argument (looking for things to \emph{not} translate), it has to be invoked +% in such a way that the argument of the \cmd\section\ command is passed to it as its +% own argument. +% +% To accomplish this, we use the \cmd\@hangfrom@\ hook, which was developed for this +% purpose. +% +% \begin{macrocode} +\def\section{% + \@startsection + {section}% + {1}% + {\z@}% + {0.8cm \@plus1ex \@minus .2ex}% + {0.5cm}% + {% + \normalfont\small\bfseries + \centering + }% +}% +\def\@hangfrom@section#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}% +\def\@hangfroms@section#1#2{#1\MakeTextUppercase{#2}}% +% \end{macrocode} +% +% \begin{macrocode} +\def\subsection{% + \@startsection + {subsection}% + {2}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont\small\bfseries + \centering + }% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\subsubsection{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont\small\itshape + \centering + }% +}% +% \end{macrocode} +% +% \subsubsection{Runin Heads}% +% \begin{macrocode} +\def\paragraph{% + \@startsection + {paragraph}% + {4}% + {\parindent}% + {\z@}% + {-1em}% + {\normalfont\normalsize\itshape}% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\subparagraph{% + \@startsection + {subparagraph}% + {5}% + {\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}% +}% +% \end{macrocode} +% +% +% +% \begin{macro}{\section@preprintsty} +% \begin{macro}{\subsection@preprintsty} +% \begin{macro}{\subsubsection@preprintsty} +% Here are the formatting procedures specific to the preprint style; +% the only difference is that the heads are flush left instead of centered. +% +% \begin{macrocode} +\def\section@preprintsty{% + \@startsection + {section}% + {1}% + {\z@}% + {0.8cm \@plus1ex \@minus .2ex}% + {0.5cm}% + {% + \normalfont\small\bfseries +% \centering + }% +}% +%\def\@hangfrom@section@preprintsty#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}% +% \end{macrocode} +% \begin{macrocode} +\def\subsection@preprintsty{% + \@startsection + {subsection}% + {2}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont\small\bfseries +% \centering + }% +}% +% \end{macrocode} +% \begin{macrocode} +\def\subsubsection@preprintsty{% + \@startsection + {subsubsection}% + {3}% + {\z@}% + {.8cm \@plus1ex \@minus .2ex}% + {.5cm}% + {% + \normalfont\small\itshape +% \centering + }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% By default, APS journals set titlepage notes as footnotes. +% \begin{verbatim} +\let\frontmatter@footnote@produce\frontmatter@footnote@produce@footnote +% \end{verbatim} +% +% \subsubsection{Table of Contents}% +% The toc will itself make an entry in the toc, +% but we temporarily turn off toc formatting for the duration. +% \changes{4.1a}{2008/01/19}{(AO, 461) Change the csname revtex uses from @dotsep to ltxu@dotsep. The former is understood in mu. (What we wanted was a dimension.)}% +% \begin{macrocode} +\def\@pnumwidth{1.55em}% +\def\@tocrmarg {2.55em}% +\def\@dotsep{2}% +\def\ltxu@dotsep{4.5pt}% +\setcounter{tocdepth}{3}% +% \end{macrocode} +% +% \begin{macrocode} +\def\tableofcontents{% + \addtocontents{toc}{\string\tocdepth@munge}% + \print@toc{toc}% + \addtocontents{toc}{\string\tocdepth@restore}% +}% +% \end{macrocode} +% +% \begin{macrocode} +\def\tocdepth@munge{% + \let\l@section@saved\l@section + \let\l@section\@gobble@tw@ +}% +\def\@gobble@tw@#1#2{}% +% \end{macrocode} +% +% \begin{macrocode} +\def\tocdepth@restore{% + \let\l@section\l@section@saved +}% +% \end{macrocode} +% +% The following definition of \cmd\l@part\ is a variant on +% the definition of \cmd\l@@sections\ in \file{ltxutil.dtx}. +% \begin{macrocode} +\def\l@part#1#2{\addpenalty{\@secpenalty}% + \begingroup + \set@tocdim@pagenum\@tempboxa{#2}% +% \@tempdima 3em % + \parindent \z@ + \rightskip\tocleft@pagenum plus 1fil\relax + \skip@\parfillskip\parfillskip\z@ + \addvspace{2.25em plus\p@}% + \large \bf % + \leavevmode\ignorespaces#1\unskip\nobreak\hskip\skip@ + \hb@xt@\rightskip{\hfil\unhbox\@tempboxa}\hskip-\rightskip\hskip\z@skip + \par + \nobreak % + \endgroup +}% +% \end{macrocode} +% +% \begin{macro}{\l@section} +% Determine which TOC elements are automatically indented. +% +% We set the TOC to the standard of RMP. +% If APS has its own specification, we will code it, and RMP must override. +% \begin{macrocode} +\def\tocleft@{\z@}% +\def\tocdim@min{5\p@}% +\def\l@section{% + \l@@sections{}{section}% Implicit #3#4 +}% +\def\l@f@section{% + \addpenalty{\@secpenalty}% + \addvspace{1.0em plus\p@}% + %\bf +}% +\def\l@subsection{% + \l@@sections{section}{subsection}% Implicit #3#4 +}% +\def\l@subsubsection{% + \l@@sections{subsection}{subsubsection}% Implicit #3#4 +}% +\def\l@paragraph#1#2{}% +\def\l@subparagraph#1#2{}% +% \end{macrocode} +% \end{macro} +% +% Activate the auto TOC processing. +% \begin{macrocode} +\let\toc@pre\toc@pre@auto +\let\toc@post\toc@post@auto +% \end{macrocode} +% +% \subsubsection{Default column bottom}% +% All APS journal styles have flush bottoms. +%\changes{4.1n}{2009/11/30}{(AO, 566) restore 4.0 behavior: flush column bottoms} +% \begin{macrocode} +\@booleanfalse\raggedcolumn@sw +% \end{macrocode} +% +% +% \subsubsection{Table alignment style}% +% +% \begin{macro}{\tableft@skip@float} +% \begin{macro}{\tabmid@skip@float} +% \begin{macro}{\tabright@skip@float} +% \begin{macro}{\array@row@pre@float} +% \begin{macro}{\array@row@pst@float} +% All APS publications have the same table specification: +% Scotch rules above and below, centered in column. +% \begin{macrocode} +\def\tableft@skip@float{\z@ plus\hsize}% +\def\tabmid@skip@float{\@flushglue}% +\def\tabright@skip@float{\z@ plus\hsize}% +\def\array@row@pre@float{\hline\hline\noalign{\vskip\doublerulesep}}% +\def\array@row@pst@float{\noalign{\vskip\doublerulesep}\hline\hline}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Footnote formatting}% +% \changes{4.1n}{2010/01/02}{(AO, 572) \cs{@makefntext} and \cs{frontmatter@makefntext} must be defined harmoniously}% +% We customize the formatting of footnotes for all APS journals. +% \begin{macro}{\@makefntext} +% \begin{macrocode} +\long\def\@makefntext#1{% + \def\baselinestretch{1}% + \leftskip1em% + \parindent1em% + \noindent + \nobreak\hskip-\leftskip + \hb@xt@\leftskip{% + \hss\@makefnmark\ % + }% + #1% + \par +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\frontmatter@makefntext} +% We ensure that frontmatter footnotes format similarly to body footnotes. +% But we provide our own hypertext anchor, otherwise not provided. +% \changes{4.1n}{2010/01/02}{(AO, 572) Independent footnote counter for title block. Abstract footnote counter shared with body.}% +% \begin{macrocode} +\long\def\frontmatter@makefntext#1{% + \def\baselinestretch{1}% + \leftskip1em% + \parindent1em% + \noindent + \nobreak\hskip-\leftskip + \Hy@raisedlink{\hyper@anchorstart{frontmatter.\expandafter\the\csname c@\@mpfn\endcsname}\hyper@anchorend}% + \hb@xt@\leftskip{% + \hss\@makefnmark\ % + }% + #1% + \par +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Appendix}% +% \begin{macro}{\appendix} +% \begin{macro}{\@hangfrom@appendix} +% \begin{macro}{\@hangfroms@appendix} +% \begin{macro}{\@appendixcntformat} +% \changes{4.0c}{1999/11/13}{(AO, 129) section* within appendix was producing appendixname} +% \begin{macrocode} +\prepdef\appendix{% + \par + \let\@hangfrom@section\@hangfrom@appendix +%\let\@hangfroms@section\@hangfroms@appendix + \let\@sectioncntformat\@appendixcntformat +}% +\def\@hangfrom@appendix#1#2#3{% + #1% + \@if@empty{#2}{% + #3% + }{% + #2\@if@empty{#3}{}{:\ #3}% + }% +}% +\def\@hangfroms@appendix#1#2{% + #1#2% +}% +\def\@appendixcntformat#1{\appendixname\ \csname the#1\endcsname}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Bibliography}% +% \changes{4.1n}{2010/01/04}{(AO, 576) In .bst files, remove support for the annote field}% +% +% Customize \revtex\ for the journal substyle; +% this task requires three components: +% the \BibTeX\ \file{apsrev.bst} and \file{apsrmp.bst} style files, and +% customizations of the \env{thebibliography} environment. +% +% \begin{macro}{\@bibstyle} +% Define the argument of the \cmd\bibliographystyle\ command +% (if the document does not do so). +% The user must have installed a \file{.bst} file of the corresponding name. +% This file will then be used by \BibTeX\ when compiling the document's \file{.bbl} file. +% +% To generate \file{apsrev.bst}, use \classname{custom-bib} version 4.21 or later. +% Run the \file{.bst} generator, \file{makebst.tex}, and +% accept all defaults, with the following exceptions: +% +% \def\QandA#1#2#3{\item#1: \textbf{#2}: \texttt{#3}---}% +% \def\CandE#1{\item\relax\texttt{#1}---}% +% \begin{enumerate} +% \QandA{LANGUAGE FIELD}{l}{lang}Use language field to switch hyphenation patterns for title +% \QandA{PRESENTATIONS}{b}{pres,pres-bf}Presentation, speaker bold face +% \QandA{ORDERING OF REFERENCES}{c}{seq-no}Citation order (unsorted, like unsrt.bst) +% \QandA{ORDER ON VON PART}{x}{vonx}Sort without von part (de la Maire after Mahone) +% \QandA{AUTHOR NAMES}{i}{nm-init,ed-au}Initials + surname (J. F. Smith) +% \QandA{POSITION OF JUNIOR}{*}{jnrlst}Junior comes last as Smith, John, Jr. +% \QandA{TYPEFACE FOR AUTHORS IN LIST OF REFERENCES}{u}{nmft,nmft-def}User defined author font (\cmd\bibnamefont) +% \QandA{FONT FOR FIRST NAMES}{u}{fnm-def}First names in user defined font (\cmd\bibfnamefont) +% \QandA{EDITOR NAMES IN INCOLLECTION ETC}{a}{nmfted}Editors incollection like authors font +% \QandA{FONT FOR `AND' IN LIST}{r}{nmand-rm}`And' in normal font (JONES and JAMES) +% \QandA{FONT OF CITATION LABELS IN TEXT}{u}{lab,lab-def}User defined citation font (\cmd\citenamefont) +% \QandA{FONT FOR `AND' IN CITATIONS}{r}{and-rm}Cited `and' in normal font +% \QandA{DATE FORMAT}{*}{yr-par}Date in parentheses as (May 1993) +% \QandA{DATE EMPTY}{-}{date-nil-x}If date is empty, then do not produce the surrounding punctuation (parens, brackets, colon, comma) +% \QandA{TITLE OF ARTICLE}{d}{tit-qq}Title and punctuation in double quotes (``Title,'' ..) +% \QandA{INPROCEEDINGS CHAPTER AND PAGES, LIKE INBOOK}{-}{inproceedings-chapter}produce pages after chapter, just as in InBook +% \QandA{TITLE PRESENT IN ARTICLE, INCOLLECTION, AND INPROCEEDINGS}{x}{jtit-x}Title is ignored +% \QandA{INPROCEEDINGS CHAPTER AND PAGES, LIKE INBOOK}{y}{inproceedings-chapter}produce pages after chapter, just as in InBook +% \QandA{ARTICLE BOOKTITLE PRESENT}{}{article-booktitle}format booktitle +% \QandA{ARTICLE SERIES PRESENT}{}{article-series}article can has series +% \QandA{JOURNAL NAME FONT}{r}{jttl-rm}Journal name normal font +% \QandA{JOURNAL NAME WITH ADDRESS}{y}{journal-address}Include address field (in parentheses) along with journal name +% \QandA{BOOK TITLE FIELDS}{y}{book-bt}Field `booktitle', or if absent field `title', is book title +% \QandA{THESIS TITLE OPTIONAL}{}{thesis-title-o}Title is optional: no warning issued if empty +% \QandA{TECHNICAL REPORT TITLE}{b}{trtit-b}Tech. report title like books +% \QandA{TECHNICAL REPORT INSTITUTION}{}{techreport-institution-par}format tech report institution like book publisher +% \QandA{JOURNAL VOLUME}{b}{vol-bf}Volume bold as {\bf vol}(num) +% \QandA{JOURNAL VOL AND NUMBER}{x}{vnum-x}Journal vol, without number as 34 +% \QandA{VOLUME PUNCTUATION}{c}{volp-com}Volume with comma as vol(num), ppp +% \QandA{PAGE NUMBERS}{f}{jpg-1}Only start page number +% \QandA{BOOK EDITOR W/O AUTHOR}{}{book-editor-booktitle}Book permits empty author, produces title before editor in this case +% \QandA{INBOOK PERMITS TITLE, BOOKTITLE, AUTHOR, EDITOR}{a}{inbook-editor-booktitle}Allow using both title/booktitle, both author/editor +% \QandA{CONFERENCE ADDRESS FOR BOOK, INBOOK, INCOLLECTION, INPROCEEDINGS, PROCEEDINGS}{a}{bookaddress}Italic booktitle followed by bookaddress in roman +% \QandA{NUMBER AND SERIES FOR BOOK, INBOOK, INCOLLECTION, INPROCEEDINGS, PROCEEDINGS}{*}{num-xser}Allows number without series and suppresses word "number" +% \QandA{WORD NUMBER CAPITALIZED FOR NUMBER AND SERIES}{c}{number-cap}Capitalize word `number' as: "Number 123" +% \QandA{WORD CHAPTER CAPITALIZED}{c}{chapter-cap}Capitalize word `chapter' as: `Chapter 42' +% \QandA{COMBINING NUMBER AND SERIES}{x}{series-number}Series number as: `Springer Lecture Notes No. 125' +% \QandA{POSITION OF NUMBER AND SERIES}{b}{numser-booktitle}After book title and conference address, and before editors +% \QandA{VOLUME AND SERIES FOR BOOKS/COLLECTIONS}{s}{ser-vol}Series, vol. 23 +% \QandA{VOLUME AND SERIES FORMATTING}{y}{ser-rm}format series roman , even when used with volume +% \QandA{WORD VOLUME CAPITALIZED FOR VOLUME AND SERIES}{y}{volume-cap}Capitalize word `volume', as: `Volume 7 in Lecture Series' +% \QandA{POSITION OF VOLUME AND SERIES FOR INCOLLECTION, INBOOK, AND INPROCEEDINGS}{e}{ser-ed}Series and volume after booktitle and before editors +% \QandA{JOURNAL NAME PUNCTUATION}{x}{jnm-x}Space after journal name +% \QandA{PAGES IN BOOK}{*}{pg-bk,book-chapter-pages}As chapter and page: chapter 42, page 345 +% \QandA{PUBLISHER IN PARENTHESES}{d}{pub-date}Publisher with address and date in parentheses (Oxford, 1994) +% \QandA{EMPTY PUBLISHER PARENTHESES}{y}{ay-empty-pub-parens-x}eliminate parentheses altogether if nothing inside +% \QandA{PUBLISHER POSITION}{}{pre-pub}Publisher before volume, chapter, pages +% \QandA{}{}{pre-edn}Edition before publisher +% \QandA{}{p}{pre-pub,pre-edn}Edition, publisher, volume, chapter, pages +% \QandA{ISBN NUMBER}{*}{isbn}Include ISBN for books, booklets, etc. +% \QandA{ISSN NUMBER}{*}{issn}Include ISSN for periodicals +% \QandA{DOI NUMBER}{a}{doi-link,doi}Doi forms a link to the publication, anchored to the volume or title +% \QandA{EDITOR IN COLLECTIONS}{b}{edby}In booktitle, edited by .. (where .. is names) +% \QandA{PUNCTUATION BETWEEN SECTIONS (BLOCKS)}{c}{blk-com}Comma between blocks +% \QandA{FINAL PUNCTUATION}{c}{fin-endbibitem}Command at end instead of period +% \QandA{ABBREVIATE WORD `PAGES'}{a}{pp}`Page' abbreviated as p. or pp. +% \QandA{ABBREVIATE WORD `EDITORS'}{a}{ed}`Editor' abbreviated as ed. or eds. +% \QandA{OTHER ABBREVIATIONS}{a}{abr}Abbreviations of such words +% \QandA{ABBREVIATION FOR `EDITION'}{a}{ednx}`Edition' abbreviated as `ed' +% \QandA{EDITION NUMBERS}{n}{ord}Numerical editions as 1st, 2nd, 3rd, etc +% \QandA{STORED JOURNAL NAMES}{a}{jabr}Abbreviated journal names +% \QandA{FONT OF `ET AL'}{i}{etal-it}Italic et al +% \QandA{ADDITIONAL REVTeX DATA FIELDS}{r}{revdata,eprint,url,url-blk,translation}Include REVTeX data fields collaboration, eid, eprint, archive, url, translation +% \QandA{SLACcitation FIELD}{}{SLACcitation}Produce SLACcitation field +% \QandA{NUMPAGES DATA FIELD}{*}{numpages-x}Do not include numpages field +% \QandA{URL ADDRESS}{*}{url,url-prefix-x}URL without prefix (default: `URL ') +% \QandA{REFERENCE COMPONENT TAGS}{b}{bibinfo}Reference component tags like \cmd\bibinfo in the content of \cmd\bibitem +% \QandA{ELEMENT TAGS}{b}{bibfield}Element tags like \cmd\bibfield in the content of \cmd\bibitem +% \QandA{COMPATIBILITY WITH PLAIN TEX}{*}{nfss}Use LaTeX commands which may not work with Plain TeX +% \end{enumerate} +% +% A file \file{apsrev.dbj} file equivalent to the following should result: +% \begin{verbatim} +%\input docstrip +%\preamble +%---------------------------------------- +%*** REVTeX-compatible Phys Rev 2010-02-12 *** +%\endpreamble +%\postamble +%End of customized bst file +%\endpostamble +%\keepsilent +%\askforoverwritefalse +%\def\MBopts{\from{merlin.mbs}{% +% head,\MBopta} +%\from{physjour.mbs}{\MBopta} +%\from{geojour.mbs}{\MBopta} +%\from{photjour.mbs}{\MBopta} +%\from{merlin.mbs}{tail,\MBopta}} +%\def\MBopta{% +% ay,%: Author-year with some non-standard interface +% nat,%: Natbib for use with natbib v5.3 or later +% lang,%: Use language field to switch hyphenation patterns for title +% pres,pres-bf,%: Presentation, speaker bold face +% seq-no,%: Citation order (unsorted, only meaningful for numericals) +% vonx,%: Sort without von part (de la Maire after Mahone) +% nm-init,ed-au,%: Initials + surname (J. F. Smith) +% jnrlst,%: Junior comes last as Smith, John, Jr. +% nmft,nmft-def,%: User defined author font (\bibnamefont) +% fnm-def,%: First names in user defined font (\bibfnamefont) +% nmfted,%: Editors incollection like authors font +% nmand-rm,%: `And' in normal font (JONES and JAMES) +% lab,lab-def,%: User defined citation font (\citenamefont) +% and-rm,%: Cited `and' in normal font +% keyxyr,%: Year blank when KEY replaces missing author (for natbib 7.0) +% blkyear,%: Missing date left blank +% yr-par,%: Year in parentheses as (1993) +% dtrev,%: Date as year month +% date-nil-x,%: If date is empty, then do not produce the surrounding punctuation (parens, brackets, colon, comma) +% tit-qq,%: Title and punctuation in double quotes (``Title,'' ..) +% inproceedings-chapter,%: produce pages after chapter, just as in InBook +% jtit-x,%: Title is ignored +% inproceedings-chapter,%: produce pages after chapter just as in InBook +% article-booktitle,%: format booktitle +% article-series,%: article can has series +% jttl-rm,%: Journal name normal font +% journal-address,%: Include address field (in parentheses) along with journal name +% book-bt,%: Field `booktitle', or if absent field `title', is book title +% thesis-title-o,%: Title is optional: no warning issued if empty +% trtit-b,%: Tech. report title like books +% techreport-institution-par,%: format tech report institution like book publisher +% vol-bf,%: Volume bold as {\bf vol}(num) +% vnum-x,%: Journal vol, without number as 34 +% volp-com,%: Volume with comma as vol(num), ppp +% jpg-1,%: Only start page number +% book-editor-booktitle,%: Book permits empty author, produces title before editor in this case +% inbook-editor-booktitle,%: Allow using both title/booktitle, both author/editor +% bookaddress,%: Italic booktitle followed by bookaddress in roman +% num-xser,%: Allows number without series and suppresses word "number" +% number-cap,%: Capitalize word `number' as: "Number 123" +% chapter-cap,%: Capitalize word `chapter' as: `Chapter 42' +% series-number,%: Series number as: `Springer Lecture Notes No. 125' +% numser-booktitle,%: After book title and conference address, and before editors +% ser-vol,%: Series, vol. 23 +% ser-rm,%: format series roman , even when used with volume +% volume-cap,%: Capitalize word `volume', as: `Volume 7 in Lecture Series' +% ser-ed,%: Series and volume after booktitle and before editors +% jnm-x,%: Space after journal name +% pg-bk,book-chapter-pages,%: As chapter and page: chapter 42, page 345 +% pub-date,%: Publisher with address and date in parentheses (Oxford, 1994) +% ay-empty-pub-parens-x,%: eliminate parentheses altogether if nothing inside +% pre-pub,pre-edn,%: Edition, publisher, volume, chapter, pages +% isbn,%: Include ISBN for books, booklets, etc. +% issn,%: Include ISSN for periodicals +% doi-link,doi,%: Doi forms a link to the publication, anchored to the volume or title +% edby,%: In booktitle, edited by .. (where .. is names) +% blk-com,%: Comma between blocks +% fin-endbibitem,%: Command at end instead of period +% pp,%: `Page' abbreviated as p. or pp. +% ed,%: `Editor' abbreviated as ed. or eds. +% abr,%: Abbreviations of such words +% ednx,%: `Edition' abbreviated as `ed' +% ord,%: Numerical editions as 1st, 2nd, 3rd, etc +% jabr,%: Abbreviated journal names +% etal-it,%: Italic et al +% revdata,eprint,url,url-blk,translation,%: Include REVTeX data fields collaboration, eid, eprint, archive, url, translation +% SLACcitation,%: Produce SLACcitation field +% numpages-x,%: Do not include numpages field +% url,url-prefix-x,%: URL without prefix (default: `URL ') +% bibinfo,%: Reference component tags like \bibinfo in the content of \bibitem +% bibfield,%: Element tags like \bibfield in the content of \bibitem +% nfss,%: Use LaTeX commands which may not work with Plain TeX +%,{% +% }} +%\generate{\file{apsrev4-2.bst}{\MBopts}} +%\endbatchfile +% \end{verbatim} +% +% \subsubsection{Comparing apsrev.bst and apsrmp.bst}\label{sec:CompRevRmp} +% These two bibliographic styles differ as follows: +% \file{apsrev.dbj} has the following guard codes, which \file{apsrmp.dbj} does not: +% \begin{itemize} +% \CandE{seq-no}% +% Citation order (unsorted, like unsrt.bst) +% \CandE{nm-init,ed-au}% +% Initials + surname (J. F. Smith) +% \CandE{blkyear}% +% Missing date left blank +% \CandE{date-nil-x}% +% If date is empty, then do not produce the surrounding punctuation (parens, brackets, colon, comma) +% \CandE{inproceedings-chapter}% +% produce pages after chapter, just as in InBook +% \CandE{techreport-institution-par}% +% format tech report institution like book publisher +% \CandE{vnum-x}% +% Journal vol, without number as `34' +% \CandE{pub-date}% +% Publisher with address and date in parentheses (Oxford, 1994) +% \CandE{pre-pub}% +% Edition, publisher, volume, chapter, pages. Note that both use guard code pre-edn. +% \end{itemize} +% +% \file{apsrmp.dbj} has the following guard codes, which \file{apsrev.dbj} does not: +% \begin{itemize} +% \CandE{nm-rev1}% +% Only first name reversed, initials (AGU style: Smith, J. F., H. K. Jones) +% \CandE{dt-beg}% +% Date after authors +% \CandE{vnum-sp}% +% Journal vol (num) as `34 (2)' +% \CandE{pp-last}% +% Pages at end, but before any notes +% \CandE{pub-par}% +% Publisher in parentheses +% \CandE{school-par}% +% School/address in parens: `(school, address)' +% \CandE{bkedcap}% +% `Name Editor,' as above, editor upper case +% \CandE{and-com}% +% Comma even with 2 authors as `Tom, and Harry' +% +% \end{itemize} +% +% We ensure that the journal substyle has the first word +% in the matter by installing the (default) APS code +% later on (see Section~\ref{sec:aps-defaults}). +% \end{macro} +% +% \begin{macro}{\authoryear@sw} +% \changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +% Numerical citations: default value of \cmd\authoryear@sw\ is false. +% \begin{macrocode} +\@booleanfalse\authoryear@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibpunct} +% The following commands effectively establish the style in which \cmd\cite\ commands are +% formatted. +% You can think of them as the second needed component for the bibliography. +% +% Set up for APS numerical citations (once the packages are loaded). +% The journal substyle can override these choices. +% +% Note that, prior to \classname{natbib} version 8.21, changing \cmd\NAT@sort\ at this late hour would not be totally effective; +% you would have to give \classname{natbib} the relevant options at load time. +% From version 8.21 on, \cmd\NAT@sort\ and \cmd\NAT@cmprs\ are not bound at all. +% \changes{4.1a}{2008/01/19}{For natbib versions before 8.21, \cs{NAT@sort} was consulted only as natbib was being read in. Now it is fully dynamic.} +% \begin{macrocode} +\appdef\setup@hook{% + \bibpunct{[}{]}{,}{n}{}{,}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pre@bibdata} +% +% Set up to write endnotes to a .bib file; its data will be incorporated into the bibliography. +% \begin{macrocode} + \def\pre@bibdata{\jobname\bibdata@app}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibsection} +% We define the sectioning command to use when starting the bibliography. +% +% \changes{4.0rc1}{2001/06/18}{grid changes with push and pop} +% \begin{macrocode} +\appdef\setup@hook{% + \def\bibsection{% + \par + \onecolumngrid@push + \begingroup + \baselineskip26\p@ + \bib@device{\textwidth}{245.5\p@}% + \endgroup + \nobreak\@nobreaktrue + \addvspace{19\p@}% + \par + \onecolumngrid@pop + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bib@device} +% \begin{macro}{\bibpreamble} +% \begin{macro}{\bibsep} +% \begin{macro}{\newblock} +% We define the sectioning command to use when starting the bibliography. +% \begin{macrocode} +\def\bib@device#1#2{% + \hb@xt@\z@{% + \hb@xt@#1{% + \hfil + \phantomsection + \addcontentsline {toc}{section}{\protect\numberline{}\refname}% +% \hyper@anchorstart {\@currentHref }% + \hb@xt@#2{% + \skip@\z@\@plus-1fil\relax + \leaders\hrule height.25 \p@ depth.25 \p@ \hskip\z@\@plus1fil + \hskip\skip@ + \hskip\z@\@plus0.125fil\leaders\hrule height.375\p@ depth.375\p@ \hskip\z@\@plus0.75fil \hskip\z@\@plus0.125fil + \hskip\skip@ + \hskip\z@\@plus0.25 fil\leaders\hrule height.5 \p@ depth.5 \p@ \hskip\z@\@plus0.5 fil \hskip\z@\@plus0.25 fil + \hskip\skip@ + \hskip\z@\@plus0.375fil\leaders\hrule height.625\p@ depth.625\p@ \hskip\z@\@plus0.25fil \hskip\z@\@plus0.375fil + % \hskip\skip@ + % \hfil + }% +% \hyper@anchorend + \hfil + }% + \hss + }% +}% +\appdef\setup@hook{% + \let\bibpreamble\@empty + \bibsep\z@\relax + \def\newblock{\ }% +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bibfont} +% We define the font switch that applies to the body of the bibliography. +% +% \begin{macrocode} +\appdef\setup@hook{% + \def\bibfont{% + \small + \@clubpenalty\clubpenalty + }% +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Index}% +% FIXME: the following call to \cmd\twocolumn\ appears wrong if we were in two-column grid. +% \changes{4.0c}{1999/11/13}{grid changes with ltxgrid} +% \changes{4.0rc1}{2001/06/18}{grid changes with push and pop} +% \begin{macrocode} +\newenvironment{theindex}{% + \columnseprule \z@ + \columnsep 35\p@ + \c@secnumdepth-\maxdimen + \onecolumngrid@push + \section{\indexname}% + \thispagestyle{plain}% + \parindent\z@ + \parskip\z@ plus.3\p@\relax + \let\item\@idxitem + \onecolumngrid@pop +}{% +%\onecolumngrid@pop +}% +% +\def\@idxitem{\par\hangindent 40\p@}% +% +\def\subitem{\par\hangindent 40\p@ \hspace*{20\p@}}% +% +\def\subsubitem{\par\hangindent 40\p@ \hspace*{30\p@}}% +% +\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax}% +% \end{macrocode} +% +% +% \subsection{Journal- and Pointsize-Specific Code}% +% +% After this substyle is read in, we will execute the code specific to the selected +% journal: execute the society/journal \file{.rtx} file if it exists, or +% execute the society/journal macro (if the latter is not defined, it will \cmd\relax\ out). +% Here we define the default journal. +% \begin{macrocode} +\def\@journal@default{pra}% +% \end{macrocode} +% +% \subsection{Typesize-Specific Code}% +% +% After this society file is read in, we will process the \cmd\@pointsize-specific +% code. Here we define the default. +% \begin{macrocode} +\def\@pointsize@default{10}% +% \end{macrocode} +% +% Note: the convention in \revtex\ and its substyles is that +% the substyle must not override any explicit class options +% declared by the document. +% This means that the various Booleans of Section~\ref{sec:options} +% may be assigned here only if they are still undefined at this point. +% +% For the APS, we supply code specific to journals PRA, PRB, PRC, PRD, PRE, PRL, PRX, PRAPPLIED, PRMATERIALS, PRFLUIDS, PRAB (was PRSTAB), PRPER (was PRSTPER), and RMP. +% At present, they are identical, +% with the exception of PRL and RMP. +% We also introduce a new generic physrev style now that all of the Phys. Rev. journals +% are identical +% In 4.2, we make the inclusion of titles in the bibliography the default +% +% For most all of the APS journals, the journal-dependent +% code is relatively meager and is therefore embedded in this file. +% However, the RMP code is sufficiently extensive that +% splitting it out into a separate file is more convenient. +% +% \subsubsection{\classoption{pra}}% +% There is no code specific to \classoption{pra}. +% \begin{macrocode} +\def\rtx@apspra{% + \class@info{APS journal PRA selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prb}}% +% There is no code specific to \classoption{prb}. +% \begin{macrocode} +\def\rtx@apsprb{% + \class@info{APS journal PRB selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prc}}% +% There is no code specific to \classoption{prc}. +% \begin{macrocode} +\def\rtx@apsprc{% + \class@info{APS journal PRC selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prd}}% +% There is no code specific to \classoption{prd}. +% \begin{macrocode} +\def\rtx@apsprd{% + \class@info{APS journal PRD selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{pre}}% +% There is no code specific to \classoption{pre}. +% \begin{macrocode} +\def\rtx@apspre{% + \class@info{APS journal PRE selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prl}}% +% \begin{macrocode} +\def\rtx@apsprl{% + \class@info{APS journal PRL selected}% +% \end{macrocode} +% In PRL, the default is the \classoption{bibnotes} option, +% and the Acknowledgments section has no head. +% +% The References head is a device that may be described as a lozenge centered on the baseline, +% 71 points wide by 2 points thick, with the ends tapering to a half point in thickness. +% Space above 26 points base to base, below 31 base to base. +%FIXME: this code may confound \classname{geometry} +% \begin{macrocode} + \let\frontmatter@footnote@produce\frontmatter@footnote@produce@endnote + \@booleanfalse\acknowledgments@sw + \appdef\setup@hook{% + \def\bibsection{% + \par + \begingroup + \baselineskip26\p@ + \bib@device{\hsize}{72\p@}% + \endgroup + \nobreak\@nobreaktrue + \addvspace{19\p@}% + }% + }% +% \end{macrocode} +% Implement length checking. +% Use the \classname{times} and \classname{mathtime} packages, +% plus whatever other processing is required +% to make the formatted output be true +% to the metrics of the journal. +% +% \begin{macrocode} +\appdef\setup@hook{% + \lengthcheck@sw{% + \RequirePackage{times}% +% \end{macrocode} +% Wait. Do not use mathtime after all. APS has their own way of doing math pi, involving +% Adobe Mathematical Pi and other fonts. +% \begin{verbatim} +% \RequirePackage{mathtime}% +% \end{verbatim} +% \begin{macrocode} + }{}% +}% +% \end{macrocode} +% A PRL does not have numbered sections. +% \begin{macrocode} + \c@secnumdepth=-\maxdimen +% \end{macrocode} +% Note: we defer this code until after type size file is read in. +% \begin{macrocode} + \appdef\setup@hook{% + \@ifnum{\@pointsize=10\relax}{% + \lengthcheck@sw{% + \def\large{% + \@setfontsize\large{12.5}{14\p@}% + }% + \def\normalsize{% + \@setfontsize\normalsize{10.5}\@xiipt + \abovedisplayskip 6\p@ \@plus6\p@ \@minus5\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \abovedisplayskip + \belowdisplayshortskip \abovedisplayskip + \let\@listi\@listI + }% + \def\small{% + \@setfontsize\small{9.5}\@xipt + \abovedisplayskip 5\p@ \@plus5\p@ \@minus4\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \abovedisplayskip + \belowdisplayshortskip \abovedisplayskip + \let\@listi\@listI + }% + \DeclareMathSizes{12.5}{12.5}{9}{6}% + \DeclareMathSizes{10.5}{10.5}{7.5}{5}% + \DeclareMathSizes{9.5}{9.5}{7.0}{5}% + }{% + \def\normalsize{% + \@setfontsize\normalsize\@xpt\@xiipt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \abovedisplayskip + \belowdisplayshortskip \abovedisplayskip + \let\@listi\@listI + }% + }% + }{}% + }% + \textheight = 694.0\p@ +% \end{macrocode} +% +% End of \classoption{prl} code. +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prper}}% +% There is no code specific to \classoption{prper} +% \begin{macrocode} +\def\rtx@apsprper{% + \class@info{APS journal PRPER selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prab}}% +% There is no code specific to \classoption{prab}. +% \begin{macrocode} +\def\rtx@apsprab{% + \class@info{APS journal PRAB selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prx}}% +% There is no code specific to \classoption{prx}. +% \begin{macrocode} +\def\rtx@apsprx{% + \class@info{APS journal PRX selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prapplied}}% +% There is no code specific to \classoption{prapplied}. +% \begin{macrocode} +\def\rtx@apsprapplied{% + \class@info{APS journal PRApplied selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prmaterials}}% +% There is no code specific to \classoption{prmaterials}. +% \begin{macrocode} +\def\rtx@apsprmaterials{% + \class@info{APS journal PRMaterials selected}% +}% +% \end{macrocode} +% +% \subsubsection{\classoption{prfluids}}% +% PRFluids uses a one-column format for journal format, but if authors want this, they should use the onecolumn option and not the reprint option. +% Parsing of documentclass options is rather involved and hard to control precisely enough to have the correct behavior using the reprint option. +% \begin{macrocode} +\def\rtx@apsprfluids{% + \class@info{APS journal PRFluids selected}% + \@booleanfalse\titlepage@sw +}% +% \end{macrocode} +% +% \subsubsection{\classoption{physrev}}% +% There is no code specific to \classoption{physrev}. +% \begin{macrocode} +\def\rtx@apsphysrev{% + \class@info{APS unified Physical Review journal style selected}% +% \begin{macrocode} +}% +% \end{macrocode} +% +% \subsubsection{\classoption{rmp}}% +% If this option has been selected, we will read in the needed code from the file \file{apsrmp.rtx}. +% +% \subsection{Establish APS Defaults}\label{sec:aps-defaults} +% +% \begin{macro}{\footinbib@sw} +% All APS journals except RMP effectively invoke the \classoption{footinbib} option. +% We rely on the RMP-specific code to override this assignment. +% \begin{macrocode} +\@booleantrue\footinbib@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@bibdataout@init} +% \begin{macro}{\@bibdataout@aps} +% \changes{4.1o}{2010/02/12}{(AO, 580) Control .bst at run time.}% +% Procedure \cmd\@bibdataout@aps\ has the job of writing the control record into the +% job's \cmd\jobname\filename{.bib} file, where it will adjust the options to \filename{.bst} processing. +% It is installed into the initialization procedure \cmd\@bibdataout@init, and its meaning +% is set by the society (APS) and journal. +% For all but RMP, we select the Physical Review style. +% For the latter case, we change the meaning, per the code in \file{apsrmp.rtx}. +% +% \begin{macrocode} +\appdef\@bibdataout@rev{\@bibdataout@aps}% +\def\@bibdataout@aps{% + \immediate\write\@bibdataout{% +% \end{macrocode} +% An entry that controls processing of the \filename{.bst} file has entry type \texttt{@CONTROL}. +% \begin{macrocode} + @CONTROL{% + apsrev42Control% +% \end{macrocode} +% Say whether we want long bibliography style (the default), or the abbreviated style. +% \changes{4.2b}{2017/11/22}{(MD) MD - not sure why these parameters were different previously. Made them match except for title.}% +% Use binary flags on control.* flags in bst file to set appropriate parameters +% author = 08 corresponds to initials, jrnlst +% editor = 1 corresponds to format identical to authors +% title = 0 means to include title in journal references if present; title ="" means omit the title even if present (this should be the only difference between long and short bib styles) +% year = 1 corresponds to truncate +% page = 0 corresponds to using single page number rather than a range +% \begin{macrocode} + \longbibliography@sw{% + ,author="08",editor="1",pages="0",title="0",year="1"% + }{% + ,author="08",editor="1",pages="0",title="",year="1"% + }% + }% + }% +% \end{macrocode} +% Place a \cmd\citation\ into the auxiliary file corresponding to this entry. +% \begin{macrocode} + \if@filesw + \immediate\write\@auxout{\string\citation{apsrev42Control}}% + \fi +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\place@bibnumber} +% \begin{macro}{\@bibstyle} +% We install code that will select the presentation for \cmd\bibitem s +% and govern the \BibTeX\ processing. +% \begin{macrocode} +\let\place@bibnumber\place@bibnumber@inl +\def\@bibstyle{apsrev\substyle@post}% +% \end{macrocode} +% \begin{verbatim} +%\appdef\setup@hook{% +% \longbibliography@sw{% +% \appdef\@bibstyle{long}% +% }{}% +%}% +% \end{verbatim} +% \end{macro} +% \end{macro} +% +% \subsection{APS Sanity Checking}\label{sec:aps-sanity} +% \changes{4.1f}{2009/07/20}{(AO, 524) Makes no sense if citations are superscript numbers and so are footnotes} +% +% Rule: if \cmd\place@bibnumber\ is \cmd\place@bibnumber@sup\ +% (citations are numbered and set superscript), +% then it makes no sense for \cmd\footinbib@sw\ to be \cmd\false@sw\ +% (footnotes set in the bibliography, as endnotes). +% If both conditions prevailed, then the document would have footnotes +% and citations both as superscript arabic numbers, but independently numbered, +% which would be confusing. +% +% Any society that provides for both superscript numbered citations as well as for +% numbered footnotes should check for this same condition, and deal with it. +% +% Note: an alternative would be for footnotes to use the same sequence of footnote devices +% that are used by the frontmatter footnotes +% (\cmd\frontmatter@thefootnote\ instead of arabic numbers). +% +% In this case, we would want to refrain from resetting \cmd\c@footnote\ at the end of +% the title page formatting. +% We would also want to treat body footnotes identically to frontmatter footnotes: +% the assignments in \cmd\titleblock@produce\ would persist throughout the document. +% +% But APS do not choose to go that route. +% \begin{macrocode} +\appdef\setup@hook{% + \@ifx{\place@bibnumber\place@bibnumber@sup}{% + \footinbib@sw{}{% + \class@warn{Citations are superscript numbers: footnotes must be endnotes; changing to that configuration}% + \@booleantrue\footinbib@sw + }% + }{}% +}% +% \end{macrocode} +% +% Here ends the substyle for society APS. +% \begin{macrocode} +%</aps> +% \end{macrocode} +% +% +% \section{The \classoption{rmp} journal substyle: the \texttt{rmp} module} +% +% The file \file{apsrmp.rtx} is read in by the \classname{revtex4} document class +% if \cmd\@society\ has the value \classoption{aps} +% and \cmd\@journal\ has the value \classoption{rmp}. +% +% It is read at the end of the \file{aps.rtx}, so all definitions +% and assignments in that file are operative unless overridden here. +% +% +% \begin{macrocode} +%<*rmp> +% \end{macrocode} +% +% Protect this file from being read in by anything but \revtex. +% \begin{macrocode} +\ifx\undefined\substyle@ext + \def\@tempa{% + \endinput + \GenericWarning{I must be read in by REVTeX! (Bailing out)}% + }% + \expandafter\else + \def\@tempa{}% + \expandafter\fi\@tempa +% \end{macrocode} +% +% Protect this file from being read in as a society instead of a journal. +% In such a case, \cmd\@journal\ will be undefined. +% \begin{macrocode} +\@ifxundefined\@journal{% +% \end{macrocode} +% One alternative: abort the document. +% Another alternative: try to recover: force load the aps society file +% \begin{macrocode} + \class@warn{Please specify the REVTeX options [aps,rmp]!}% + \@@end +}{}% +% \end{macrocode} +% Log the journal substyle. +% \begin{macrocode} + \class@info{APS journal RMP selected}% +% \end{macrocode} +% +% \subsection{Frontmatter}% +% +% We assign the titlepage style for RMP; a document instance +% may override by invoking one of the class options of \revtex. +% \begin{macrocode} +\clo@groupedaddress +% \end{macrocode} +% +% \begin{macro}{\frontmatter@setup} +% +% \begin{macrocode} +\def\frontmatter@setup{% + \normalfont\sffamily\raggedright +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PACS@warn} +% Per Mark Doyle, RMP never displays the PACS, so they don't want the `use showpacs' warning spit out. +%\changes{4.2b}{2017/11/22}{(MD) PACS are obsolete altogether now}% +% \begin{macrocode} +\def\PACS@warn{RMP documents do not display PACS and PACS are obsolete. Your \string\pacs\space will be ignored}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@title@above} +% \begin{macro}{\frontmatter@title@format} +% \begin{macro}{\frontmatter@title@below} +% +% \begin{macrocode} +\def\frontmatter@title@above{}% +\def\frontmatter@title@format{\Large\bfseries\raggedright}% HelveticaNeue-Medium(Italic) 14pt. +\def\frontmatter@title@below{\addvspace{12\p@}}% 24pt b-b down to first author +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\frontmatter@authorformat} +% \changes{4.1b}{2008/08/04}{Rag the right even more: .8\cs{hsize}. Also, assign \cs{@totalleftmargin}.}% +% \changes{4.1b}{2008/06/29}{(AO, 455) Be nice to a list within the abstract (assign \cs{@totalleftmargin}).} +% Set the rag to a milder value, because we want to do true ragged right +% typesetting, as opposed to the \LaTeX\ default, which gives very poor results. +% +% Note: author font is 9.8bp. 19.2bp/14.3bp above/below. +% \begin{macrocode} +\def\frontmatter@authorformat{% + \preprintsty@sw{\vskip0.5pc\relax}{}% + \@tempskipa\@flushglue + \@flushglue\z@ plus.8\hsize + \raggedright\advance\leftskip.5in\relax + \@flushglue\@tempskipa + \parskip\z@skip + \@totalleftmargin\leftskip +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@affiliationfont} +% \changes{4.1b}{2008/08/04}{As with author formatting, rag the right more, and assign \cs{@totalleftmargin}. Also neutralize \cs{def@after@address}.}% +% \changes{4.1b}{2008/06/29}{(AO, 455) Be nice to a list within the abstract (assign \cs{@totalleftmargin}).} +% The hook \cmd\frontmatter@affiliationfont\ controls the formatting of affiliations and affiliation groups. +% The hook \cmd\frontmatter@above@affilgroup\ is invoked just before proceeding with author/affiliation processing. +% The \cmd\frontmatter@above@affiliation\ is the amount of space above affiliations in the \classoption{groupedaddress} style, +% and \cmd\frontmatter@above@affiliation@script\ is that for \classoption{superscriptaddress}. +% +% Note: affiliation font is 9.03/10.4bp, 14.3bp/19.2bp b-b above/below +% \begin{macrocode} +\def\frontmatter@affiliationfont{% Helvetica 9/10.2 + \small\slshape\selectfont\baselineskip10.5\p@\relax + \@tempskipa\@flushglue + \@flushglue\z@ plus.8\hsize + \raggedright\advance\leftskip.5in\relax + \@flushglue\@tempskipa + \@totalleftmargin\leftskip + \let\def@after@address\def@after@address@empty +}% +\def\frontmatter@above@affilgroup{\addvspace{7.2\p@}}% additional leading above an author +\def\frontmatter@above@affiliation{\addvspace{5.3\p@}}% +\def\frontmatter@above@affiliation@script{}% +% \end{macrocode} +% \end{macro} +% +% Set up the default RMP style for title block authors and affiliations. +% We assign the titlepage style for RMP; a document instance +% may override by invoking one of the class options of \revtex. +% \changes{4.1b}{2008/08/04}{The \texttt{rmp} journal substyle selects \texttt{groupedaddress} by default.}% +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% +% This command should override the effect of the +% corresponding command in the society substyle, +% and any document class option bearing on same will in turn override. +% \begin{macrocode} +\clo@groupedaddress +% \end{macrocode} +% +% \begin{macro}{\frontmatter@RRAP@format} +% \changes{4.1b}{2008/06/29}{(AO, 455) Be nice to a list within the abstract (assign \cs{@totalleftmargin}).} +% Note: in RMP, if we are not in preprint mode, the date will not be produced. +% +% Note: Helvetica C/lc, 8.98bp, space above: 16.3bp b-b. +% \begin{macrocode} +\def\frontmatter@RRAP@format{% + \addvspace{7.3\p@}% + \small + \raggedright\advance\leftskip.5in\relax + \@totalleftmargin\leftskip +}% +\def\produce@RRAP#1{% + \@if@empty{#1}{}{% + \@ifvmode{\leavevmode}{}% + \unskip(\ignorespaces#1\unskip)\quad + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractheading} +% Space above 21.8bp b-b. +% \begin{macrocode} +\def\frontmatter@abstractheading{% + \preprintsty@sw{% + \begingroup + \centering\large + \abstractname + \par + \endgroup + \vspace{.5pc}% + }{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@abstractfont} +% TimesTen 8.93bp/9.6bp X 360bp, indented 36bp, with 21.9/37.6bp b-b above/below +% \changes{4.1b}{2008/06/29}{(AO, 455) Be nice to a list within the abstract (assign \cs{@totalleftmargin}).} +% \begin{macrocode} +\def\frontmatter@abstractfont{% + \footnotesize + \hsize360\p@ + \leftskip=0.5in + \parindent\z@ + \@totalleftmargin\leftskip +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frontmatter@preabstractspace} +% \begin{macro}{\frontmatter@postabstractspace} +% Space above and space below abstract in title block. +% Should be 22/36 points base-to-base. +% \begin{macrocode} +\def\frontmatter@preabstractspace{7.7\p@}% +\def\frontmatter@postabstractspace{24.6\p@}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% FIXME: Not done: PACS. +% FIXME: TOC: Head is same as \section: HelveticaNeue 8.98. 32/22bp b-b above/below, +% Body: TimesTen 8/10.5. +% +% \subsection{General Text}% +% +% \changes{4.1b}{2008/07/01}{(AO) make settings at class time instead of deferring them to later.} +% If not in preprint mode, RMP sets the type size to 10/12 point. Note: s/b 11.6bp leading +%FIXME: define \cmd\normalsize\ only if nobody else has done so. +% \begin{macrocode} + \appdef\setup@hook{% + \preprintsty@sw{}{% + \def\normalsize{% + \@setsize\normalsize{12pt}\xpt\@xpt + \abovedisplayskip 10\p@ plus2\p@ minus5\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip \abovedisplayskip + \belowdisplayshortskip \abovedisplayskip + \let\@listi\@listI + }% + }% + }% +% \end{macrocode} +% +% Footnote mods: +% \changes{4.1n}{2010/01/02}{(AO, 571) class file must set \cs{splittopskip}; fine tune \cs{skip}\cs{footins}; \cs{footnoterule} defined in terms of \cs{skip}\cs{footins}}% +% \begin{macrocode} + \footnotesep 9.25pt + \skip\footins 36pt plus 4pt minus 12pt + \def\footnoterule{% + \dimen@\skip\footins\divide\dimen@\thr@@ + \kern-\dimen@\hrule width.5in\kern\dimen@ + }% +% \end{macrocode} +% +% +% \subsection{Sectioning} +% \changes{4.1b}{2008/08/04}{Use \cs{setup@hook} to initialize all.} +% \changes{4.1b}{2008/08/01}{Section numbering via procedures \cs{secnums@rtx} and \cs{secnums@arabic}.} +% +% We override the meaning of \cmd\secnums@rtx. +% The class option \classoption{secnumarabic} will continue to work. +% \begin{macrocode} +\def\secnums@rtx{% + \@ifxundefined\thepart{% + \def\thepart{\Roman{part}}% + }{}% + \@ifxundefined\thesection{% + \def\thesection {\Roman{section}}% + \def\p@section {}% + }{}% + \@ifxundefined\thesubsection{% + \def\thesubsection {\Alph{subsection}}% + \def\p@subsection {\thesection.}% + }{}% + \@ifxundefined\thesubsubsection{% + \def\thesubsubsection {\arabic{subsubsection}}% + \def\p@subsubsection {\thesection.\thesubsection.}% + }{}% + \@ifxundefined\theparagraph{% + \def\theparagraph {\alph{paragraph}}% + \def\p@paragraph {\thesection.\thesubsection.\thesubsubsection.}% + }{}% + \@ifxundefined\thesubparagraph{% + \def\thesubparagraph {\arabic{subparagraph}}% + \def\p@subparagraph {\thesection.\thesubsection.\thesubsubsection.\theparagraph.}% + }{}% +}% +% \end{macrocode} +% +% In RMP, put a period (.), followed by `nut space', after the section number. +% Also, hang the section number (the \LaTeX\ default). +% \begin{macrocode} +\def\@seccntformat#1{\csname the#1\endcsname.\hskip0.5em\relax}% +% \end{macrocode} +% +% Note that we wish to set the section head uppercase, so we use +% David Carlisle's \cmd\MakeTextUppercase. However, because this procedure effectively +% parses its argument (looking for things to \emph{not} translate), it has to be invoked +% in such a way that the argument of the \cmd\section\ command is passed to it as its +% own argument. +% +% To accomplish this, we use the \cmd\@hangfrom@\ hook, which was developed for this +% purpose. +% \changes{4.1b}{2008/07/01}{Add \cs{@hangfroms@section}} +% \begin{macrocode} + \def\section{% + \@startsection{section}{1}{\z@}{0.8cm plus1ex minus.2ex}{0.4cm}% + {% + \small\sffamily\bfseries\selectfont + \raggedright + \parindent\z@ + }% + }% + \def\@hangfrom@section#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}% + \def\@hangfroms@section#1#2{#1\MakeTextUppercase{#2}}% + \def\subsection{% + \@startsection{subsection}{2}{\z@}{0.8cm plus1ex minus.2ex}{0.4cm}% + {% + \small\sffamily\bfseries + \raggedright + \parindent\z@ + }% + }% + \def\subsubsection{% + \@startsection{subsubsection}{3}{\z@}{.8cm plus1ex minus.2ex}{0.4cm}% + {% + \small\sffamily\selectfont + \raggedright + \parindent\z@ + }% + }% + \def\paragraph{% + \@startsection{paragraph}{4}{\z@}{.8cm plus1ex minus.2ex}{-1em}% + {% + \small\slshape\selectfont + \raggedright + \parindent\z@ + }% + }% + \def\subparagraph{% + \@startsection{subparagraph}{4}{\parindent}{3.25ex plus1ex minus.2ex}{-1em}% + {\normalsize\bfseries\selectfont}% + }% +% + \setcounter{tocdepth}{4}% FIXME: has no effect +% \end{macrocode} +% +% \begin{macro}{\appendix} +% \begin{macro}{\@hangfrom@appendix} +% \begin{macro}{\@hangfroms@appendix} +% \begin{macro}{\@appendixcntformat} +% \changes{4.1b}{2008/07/01}{Add \cs{@hangfroms@section}} +% \begin{macrocode} +\appdef\appendix{% + \let\@hangfrom@section\@hangfrom@appendix + \let\@sectioncntformat\@appendixcntformat +}% +\def\@hangfrom@appendix#1#2#3{% + #1% + \@if@empty{#2}{% + #3% + }{% + #2\@if@empty{#3}{}{:\ #3}% + }% +}% +\def\@hangfroms@appendix#1#2{% + #1\appendixname\@if@empty{#2}{}{:\ #2}% +}% +\def\@appendixcntformat#1{\appendixname\ \csname the#1\endcsname}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Figure and Table Caption Formatting} +% \begin{macro}{\@makecaption} +% \changes{4.1b}{2008/07/01}{Break out \cs{@caption@fignum@sep}} +% +% \begin{macrocode} +\setlength\belowcaptionskip{2\p@} +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip + \vbox{% + \flushing + \small\rmfamily + \noindent + #1\@caption@fignum@sep#2\par + }% + \vskip\belowcaptionskip +}% +\def\@caption@fignum@sep{\nobreak\hskip.5em plus.2em\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Citations and Bibliography}% +% +% Customize \revtex\ for the journal substyle; +% this task requires three components: +% a \BibTeX\ \file{.bst} style file, +% customizing code for \file{natbib}, and +% customizations of the \env{thebibliography} environment. +% +% \begin{macro}{\@bibstyle} +% Define the argument of the \cmd\bibliographystyle\ command +% (if the document does not do so). +% +% The user must have installed a \file{.bst} file of the corresponding name. +% This file will then be used by \BibTeX\ when compiling the document's \file{.bbl} file. +% +% To generate \file{apsrmp.bst}, use \classname{custom-bib} version 3.89d1 or later. +% Run the \file{.bst} generator, \file{makebst.tex}, with the following options: +% +% \def\QandA#1#2#3{\item#1: \textbf{#2}: \texttt{#3}---}% +% \def\CandE#1{\item\relax\texttt{#1}---}% +% \begin{enumerate} +% \QandA{STYLE OF CITATIONS}{a}{ay}Author-year with some non-standard interface +% \QandA{AUTHOR}{*}{nat}Natbib for use with natbib v5.3 or later +% \QandA{LANGUAGE FIELD}{l}{lang}Use language field to switch hyphenation patterns for title +% \QandA{PRESENTATIONS}{b}{pres,pres-bf}Presentation, speaker bold face +% \QandA{ORDER ON VON PART }{x}{vonx}Sort without von part (de la Maire after Mahone) +% \QandA{AUTHOR NAMES}{a}{nm-rev1}Only first name reversed, initials (AGU style: Smith, J. F., H. K. Jones) +% \QandA{POSITION OF JUNIOR }{*}{jnrlst}Junior comes last as Smith, John, Jr. +% \QandA{TYPEFACE FOR AUTHORS IN LIST OF REFERENCES}{u}{nmft,nmft-def}User defined author font (\cmd\bibnamefont) +% \QandA{FONT FOR FIRST NAMES }{u}{fnm-def}First names in user defined font (\cmd\bibfnamefont) +% \QandA{EDITOR NAMES IN INCOLLECTION ETC}{a}{nmfted}Editors incollection like authors font +% \QandA{FONT FOR `AND' IN LIST}{r}{nmand-rm}`And' in normal font (JONES and JAMES) +% \QandA{FONT OF CITATION LABELS IN TEXT }{u}{lab,lab-def}User defined citation font (\cmd\citenamefont) +% \QandA{FONT FOR `AND' IN CITATIONS }{r}{and-rm}Cited `and' in normal font +% \QandA{LABEL WHEN AUTHORS MISSING }{*}{keyxyr}Year blank when KEY replaces missing author (for natbib 7.0) +% \QandA{DATE POSITION}{b}{dt-beg}Date after authors +% \QandA{DATE FORMAT }{m}{yr-com}Date preceded by comma as `, 1993' +% \QandA{INCLUDE MONTHS}{m}{aymth}Include month in date +% \QandA{REVERSED DATE }{r}{dtrev}Date as year month +% \QandA{TRUNCATE YEAR }{*}{note-yr}Year text full as 1990--1993 or `in press' +% \QandA{TITLE OF ARTICLE}{d}{tit-qq}Title and punctuation in double quotes (``Title,'' ..) +% \QandA{TITLE PRESENT IN ARTICLE, INCOLLECTION, AND INPROCEEDINGS}{x}{jtit-x}Title is ignored +% \QandA{INPROCEEDINGS CHAPTER AND PAGES, LIKE INBOOK}{y}{inproceedings-chapter}produce pages after chapter just as in InBook +% \QandA{ARTICLE BOOKTITLE PRESENT}{?}{article-booktitle}format booktitle +% \QandA{ARTICLE SERIES PRESENT}{?}{article-series}article can has series +% \QandA{JOURNAL NAME FONT}{r}{jttl-rm}Journal name normal font +% \QandA{JOURNAL NAME WITH ADDRESS}{y}{journal-address}Include address field (in parentheses) along with journal name +% \QandA{BOOK TITLE FIELDS}{y}{book-bt}Field `booktitle', or if absent field `title', is book title +% \QandA{THESIS TITLE OPTIONAL}{?}{thesis-title-o}Title is optional: no warning issued if empty +% \QandA{TECHNICAL REPORT TITLE}{b}{trtit-b}Tech. report title like books +% \QandA{JOURNAL VOLUME}{b}{vol-bf}Volume bold as {\bf vol}(num) +% \QandA{JOURNAL VOL AND NUMBER}{s}{vnum-sp}Journal vol (num) as 34 (2) +% \QandA{VOLUME PUNCTUATION}{c}{volp-com}Volume with comma as vol(num), ppp +% \QandA{PAGE NUMBERS}{f}{jpg-1}Only start page number +% \QandA{POSITION OF PAGES}{e}{pp-last}Pages at end but before any notes +% \QandA{BOOK EDITOR W/O AUTHOR}{}{book-editor-booktitle}Book permits empty author, produces title before editor in this case +% \QandA{INBOOK PERMITS TITLE, BOOKTITLE, AUTHOR, EDITOR}{a}{inbook-editor-booktitle}Allow using both title/booktitle, both author/editor +% \QandA{CONFERENCE ADDRESS FOR BOOK, INBOOK, INCOLLECTION, INPROCEEDINGS, PROCEEDINGS}{a}{bookaddress}Italic booktitle followed by bookaddress in roman +% \QandA{NUMBER AND SERIES FOR BOOK, INBOOK, INCOLLECTION, INPROCEEDINGS, PROCEEDINGS}{*}{num-xser}Allows number without series and suppresses word "number" +% \QandA{WORD NUMBER CAPITALIZED FOR NUMBER AND SERIES}{c}{number-cap}Capitalize word `number' as: "Number 123" +% \QandA{WORD CHAPTER CAPITALIZED}{c}{chapter-cap}Capitalize word `chapter' as: `Chapter 42' +% \QandA{COMBINING NUMBER AND SERIES}{x}{series-number}Series number as: `Springer Lecture Notes No. 125' +% \QandA{POSITION OF NUMBER AND SERIES}{b}{numser-booktitle}After book title and conference address, and before editors +% \QandA{VOLUME AND SERIES FOR BOOKS}{s}{ser-vol}Series, vol. 23 +% \QandA{VOLUME AND SERIES FORMATTING}{y}{ser-rm}format series roman , even when used with volume +% \QandA{WORD VOLUME CAPITALIZED FOR VOLUME AND SERIES}{y}{volume-cap}Capitalize word `volume', as: `Volume 7 in Lecture Series' +% \QandA{POSITION OF VOLUME AND SERIES FOR INCOLLECTION, INBOOK, AND INPROCEEDINGS}{e}{ser-ed}Series and volume after booktitle and before editors +% \QandA{JOURNAL NAME PUNCTUATION}{x}{jnm-x}Space after journal name +% \QandA{PAGES IN BOOK}{*}{pg-bk,book-chapter-pages}As chapter and page: chapter 42, page 345 +% \QandA{PUBLISHER IN PARENTHESES}{p}{pub-par}Publisher in parentheses +% \QandA{EMPTY PUBLISHER PARENTHESES}{y}{ay-empty-pub-parens-x}eliminate parentheses altogether if nothing inside +% \QandA{PUBLISHER POSITION}{e}{pre-edn}Edition before publisher +% \QandA{SCHOOL}{p}{school-par}school/address in parens: `(school, address)' +% \QandA{ISBN NUMBER}{*}{isbn}Include ISBN for books, booklets, etc. +% \QandA{ISSN NUMBER}{*}{issn}Include ISSN for periodicals +% \QandA{DOI NUMBER}{a}{doi-link,doi}Doi forms a link to the publication, anchored to the volume or title +% \QandA{`EDITOR' AFTER NAMES}{a}{bkedcap}`Name Editor,' as above, editor upper case +% \QandA{EDITOR IN COLLECTIONS}{b}{edby}In booktitle, edited by .. (where .. is names) +% \QandA{PUNCTUATION BETWEEN SECTIONS }{c}{blk-com}Comma between blocks +% \QandA{FINAL PUNCTUATION}{c}{fin-endbibitem}Command at end instead of period +% \QandA{ABBREVIATE WORD `PAGES' }{a}{pp}`Page' abbreviated as p. or pp. +% \QandA{ABBREVIATE WORD `EDITORS'}{a}{ed}`Editor' abbreviated as ed. or eds. +% \QandA{OTHER ABBREVIATIONS}{a}{abr}Abbreviations of such words +% \QandA{ABBREVIATION FOR `EDITION' }{a}{ednx}`Edition' abbreviated as `ed' +% \QandA{EDITION NUMBERS}{n}{ord}Numerical editions as 1st, 2nd, 3rd, etc +% \QandA{STORED JOURNAL NAMES}{a}{jabr}Abbreviated journal names +% \QandA{COMMA BEFORE `AND'}{c}{and-com}Comma even with 2 authors as `Tom, and Harry' +% \QandA{FONT OF `ET AL'}{i}{etal-it}Italic et al +% \QandA{ADDITIONAL REVTeX DATA FIELDS}{r}{revdata,eprint,url,url-blk,translation}Include REVTeX data fields collaboration, eid, eprint, archive, url, translation +% \QandA{SLACcitation FIELD}{?}{SLACcitation}Produce SLACcitation field +% \QandA{NUMPAGES DATA FIELD}{*}{numpages-x}Do not include numpages field +% \QandA{REFERENCE COMPONENT TAGS}{b}{bibinfo}Reference component tags like \cmd\bibinfo\ in the content of \cmd\bibitem +% \QandA{ELEMENT TAGS}{b}{bibfield}Element tags like \cmd\bibfield\ in the content of \cmd\bibitem +% \QandA{COMPATIBILITY WITH PLAIN TEX}{*}{nfss}Use LaTeX commands which may not work with Plain TeX +% \end{enumerate} +% +% A file \file{apsrmp.dbj} file equivalent to the following should result: +% \begin{verbatim} +%\input docstrip +%\preamble +%---------------------------------------- +%*** REVTeX-compatible RMP 2010-02-12 *** +%\endpreamble +%\postamble +%End of customized bst file +%\endpostamble +%\keepsilent +%\askforoverwritefalse +%\def\MBopts{\from{merlin.mbs}{% +% head,\MBopta} +%\from{physjour.mbs}{\MBopta} +%\from{geojour.mbs}{\MBopta} +%\from{photjour.mbs}{\MBopta} +%\from{merlin.mbs}{tail,\MBopta}} +%\def\MBopta{% +% ay,%: Author-year with some non-standard interface +% nat,%: Natbib for use with natbib v5.3 or later +% lang,%: Use language field to switch hyphenation patterns for title +% pres,pres-bf,%: Presentation, speaker bold face +% vonx,%: Sort without von part (de la Maire after Mahone) +% nm-rev1,%: Only first name reversed, initials (AGU style: Smith, J. F., H. K. Jones) +% jnrlst,%: Junior comes last as Smith, John, Jr. +% nmft,nmft-def,%: User defined author font (\bibnamefont) +% fnm-def,%: First names in user defined font (\bibfnamefont) +% nmfted,%: Editors incollection like authors font +% nmand-rm,%: `And' in normal font (JONES and JAMES) +% lab,lab-def,%: User defined citation font (\citenamefont) +% and-rm,%: Cited `and' in normal font +% keyxyr,%: Year blank when KEY replaces missing author (for natbib 7.0) +% dt-beg,%: Date after authors +% yr-par,%: Year in parentheses as (1993) +% dtrev,%: Date as year month +% date-nil-x,%: If date is empty, then do not produce the surrounding punctuation (parens, brackets, colon, comma) +% tit-qq,%: Title and punctuation in double quotes (``Title,'' ..) +% inproceedings-chapter,%: produce pages after chapter, just as in InBook +% jtit-x,%: Title is ignored +% inproceedings-chapter,%: produce pages after chapter just as in InBook +% article-booktitle,%: format booktitle +% article-series,%: article can has series +% jttl-rm,%: Journal name normal font +% journal-address,%: Include address field (in parentheses) along with journal name +% book-bt,%: Field `booktitle', or if absent field `title', is book title +% thesis-title-o,%: Title is optional: no warning issued if empty +% trtit-b,%: Tech. report title like books +% techreport-institution-par,%: format tech report institution like book publisher +% vol-bf,%: Volume bold as {\bf vol}(num) +% vnum-sp,%: Journal vol (num) as 34 (2) +% volp-com,%: Volume with comma as vol(num), ppp +% jpg-1,%: Only start page number +% pp-last,%: Pages at end but before any notes +% book-editor-booktitle,%: Book permits empty author, produces title before editor in this case +% inbook-editor-booktitle,%: Allow using both title/booktitle, both author/editor +% bookaddress,%: Italic booktitle followed by bookaddress in roman +% num-xser,%: Allows number without series and suppresses word "number" +% number-cap,%: Capitalize word `number' as: "Number 123" +% chapter-cap,%: Capitalize word `chapter' as: `Chapter 42' +% series-number,%: Series number as: `Springer Lecture Notes No. 125' +% numser-booktitle,%: After book title and conference address, and before editors +% ser-vol,%: Series, vol. 23 +% ser-rm,%: format series roman , even when used with volume +% volume-cap,%: Capitalize word `volume', as: `Volume 7 in Lecture Series' +% ser-ed,%: Series and volume after booktitle and before editors +% jnm-x,%: Space after journal name +% pg-bk,book-chapter-pages,%: As chapter and page: chapter 42, page 345 +% pub-par,%: Publisher in parentheses +% ay-empty-pub-parens-x,%: eliminate parentheses altogether if nothing inside +% pre-edn,%: Edition before publisher +% school-par,%: school/address in parens: `(school, address)' +% isbn,%: Include ISBN for books, booklets, etc. +% issn,%: Include ISSN for periodicals +% doi-link,doi,%: Doi forms a link to the publication, anchored to the volume or title +% bkedcap,%: `Name Editor,' as above, editor upper case +% edby,%: In booktitle, edited by .. (where .. is names) +% blk-com,%: Comma between blocks +% fin-endbibitem,%: Command at end instead of period +% pp,%: `Page' abbreviated as p. or pp. +% ed,%: `Editor' abbreviated as ed. or eds. +% abr,%: Abbreviations of such words +% ednx,%: `Edition' abbreviated as `ed' +% ord,%: Numerical editions as 1st, 2nd, 3rd, etc +% jabr,%: Abbreviated journal names +% and-com,%: Comma even with 2 authors as `Tom, and Harry' +% etal-it,%: Italic et al +% revdata,eprint,url,url-blk,translation,%: Include REVTeX data fields collaboration, eid, eprint, archive, url, translation +% SLACcitation,%: Produce SLACcitation field +% numpages-x,%: Do not include numpages field +% url,url-prefix-x,%: URL without prefix (default: `URL ') +% bibinfo,%: Reference component tags like \bibinfo in the content of \bibitem +% bibfield,%: Element tags like \bibfield in the content of \bibitem +% nfss,%: Use LaTeX commands which may not work with Plain TeX +%,{% +% }} +%\generate{\file{apsrmp4-2.bst}{\MBopts}} +%\endbatchfile +% \end{verbatim} +% +% For a comparison between apsrmp.bst and apsrev.bst, see Section~\ref{sec:CompRevRmp}. +% +% \changes{4.1c}{2008/08/15}{Document class option longbibliography via \cs{substyle@post}} +% \begin{macrocode} +\def\@bibstyle{apsrmp\substyle@post}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\authoryear@sw} +% \changes{4.1a}{2008/01/18}{(AO, 457) Endnotes to be sorted in with numerical citations.}% +% Author-year citations: default value of \cmd\authoryear@sw\ is true. +% \begin{macrocode} +\@booleantrue\authoryear@sw +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@bibdataout@rmp} +% \changes{4.1o}{2010/02/12}{(AO, 580) Control .bst at run time.}% +% When the journal is RMP, the meaning of the procedure \cmd\@bibdataout@aps\ needs to be different +% because of the way the author names are formatted. In other respects, it is the same. +% \begin{macrocode} +\def\@bibdataout@aps{% + \immediate\write\@bibdataout{% +% \end{macrocode} +% An entry that controls processing of the \filename{.bst} file has entry type \texttt{@CONTROL}. +% This entry's cite key is \texttt{apsrmp41Control}, which serves as a version number. +% \begin{macrocode} + @CONTROL{% + apsrmp41Control% +% \end{macrocode} +% Say whether we want long bibliography style (the default), or the abbreviated style. +% \begin{macrocode} + \longbibliography@sw{% + ,author="03",editor="0",pages="1",title="0",year="0"% + }{% + ,author="0B",editor="0",pages="0",title="0",year="1"% TeXSupport + }% + }% + }% +% \end{macrocode} +% Place a \cmd\citation\ into the auxiliary file corresponding to this entry. +% \begin{macrocode} + \if@filesw + \immediate\write\@auxout{\string\citation{apsrmp41Control}}% + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibpunct} +% \begin{macro}{\bibsection} +% \begin{macro}{\bibpreamble} +% \begin{macro}{\newblock} +% \begin{macro}{\bibhang} +% \begin{macro}{\bibsep} +% \begin{macro}{\cite} +% The following commands effectively establish the style in which \cmd\cite\ commands are +% formatted. +% You can think of them as the second needed component for the bibliography. +% +% Set up for author-year citations: +% when \cmd\NAT@set@cites\ executes (at \envb{document} time), the \cmd\@biblabel\ will +% be set to \cmd\NAT@biblabel. +% +% Per Karie Friedman (friedman@phys.washington.edu), multiple citations are separated by semicolons, e.g., +% (Jones, 1999; Abbott and Smith, 2000; Wortley, 2001a), +% and +% multiple citations by the same author by commas, e.g., +% Abela et al. (1995, 1997a, 1997b). +% The third argument of \cmd\bibpunct\ handles the former. +% +% The fifth argument puts a comma after the author when the year is not in parens: +% (Lee et al., 1996). +% +% Incidently, this \cmd\bibpunct\ command specifies the \classname{natbib} default values. +% +% We define the sectioning command to use when starting the bibliography. +% +% We change \classname{natbib}'s \cmd\NAT@def@citea\ procedure to effect more elaborate +% punctuation for RMP: see item 473: +% \cmd\cite\ order punctuation: ``If possible, \cmd\textcite should put the word 'and' between two citations and before the last citation in a list of 3 or more.'' +% +% \begin{macrocode} +\appdef\setup@hook{% +% \end{macrocode} +% +% We define the punctuation to use in the \cmd\cite\ command's production. +% +% \begin{macrocode} + \bibpunct{(%) + }{%( + )}{;}{a}{,}{,}% +% \end{macrocode} +% +% We define the sectioning command to use when starting the bibliography. +% +% \begin{macrocode} + \def\bibsection{% + \expandafter\section\expandafter*\expandafter{\refname}% + \@nobreaktrue + }% + \let\bibpreamble\@empty + \def\newblock{\ }% + \bibhang10\p@ + \bibsep\z@ +% \end{macrocode} +% +% Per Mark Doyle, \cmd\cite\ is mapped to \cmd\citep\ in RMP. +% \changes{4.1i}{2009/10/23}{(AO, 541) Defer assignment of \cs{cite} until after natbib loads} +% \begin{macrocode} + \let\cite\citep +% \end{macrocode} +% +% End of code to be delayed until after \classname{natbib} loads. +% \begin{macrocode} +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\footinbib@sw} +% Footnotes in bibliography are consistent only with numbered citations, +% and are particularly nasty under \classname{natbib}: +% the packcage will automatically change to numbered references if +% any \cmd\bibitem\ commands lack the optional argument. +% Therefore, we must uninvoke it now, even if invoked by the document. +% The same is quietly done with +% \classname{natbib}'s \classoption{mcite} and \classoption{compress} options. +% +% \changes{4.1f}{2009/07/15}{(AO, 523) Add class option nomerge, to turn off new natbib 8.3 syntax} +% (AO 523) I changed the code that alters \cmd\NAT@merge\ so that it will not override +% when \cmd\NAT@merge\ has been set to \cmd\z@. +% \begin{macrocode} +\@booleanfalse\footinbib@sw +\appdef\setup@hook{% + \footinbib@sw{% + \class@warn{% + Footnotes in bibliography are incompatible with RMP.^^J% + Undoing the footinbib option. + }% + \@booleanfalse\footinbib@sw + }{}% + \@ifnum{\NAT@merge>\@ne}{\let\NAT@merge\@ne}{}% + \def\NAT@cmprs{\z@}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eprint} +% RMP requires the \cmd\eprint\ field in the bib entry to be set off with the word ``eprint''. +% \begin{macrocode} +\def\eprint#1{eprint #1}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Table of Contents} +% +% We set up for auto-sizing of certain TOC elements. +% +% To do this, we override the definitions for +% the default TOC font (\cmd\toc@@font), +% and define +% formatting for the needed elements (\cmd\l@\dots). +% Finally, we activate the autosizing by +% assigning \cmd\toc@pre\ and \cmd\toc@post. +% +% \begin{macro}{\toc@@font} +% \changes{4.1a}{2008/01/19}{(AO, 461) Change the csname revtex uses from @dotsep to ltxu@dotsep. The former is understood in mu. (What we wanted was a dimension.)}% +% Set the formatting characteristics of the auto-indenting part +% of the TOC. +% \begin{macrocode} +\def\toc@@font{% + \footnotesize\rmfamily + \def\\{\space\ignorespaces}% +}% +\def\ltxu@dotsep{5.5pt}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@section} +% Determine which TOC elements are automatically indented. +% \begin{macrocode} +\def\tocleft@{\z@}% +\def\tocdim@min{5\p@}% +\def\l@section{% + \l@@sections{}{section}% Implicit #3#4 +}% +\def\l@subsection{% + \l@@sections{section}{subsection}% Implicit #3#4 +}% +\def\l@subsubsection{% + \l@@sections{subsection}{subsubsection}% Implicit #3#4 +}% +%\def\l@subsubsection#1#2{}% +\def\l@paragraph#1#2{}% +\def\l@subparagraph#1#2{}% +% \end{macrocode} +% \end{macro} +% +% Activate the TOC processing. +% \begin{macrocode} +\let\toc@pre\toc@pre@auto +\let\toc@post\toc@post@auto +% \end{macrocode} +% +% +% \begin{macrocode} +%</rmp> +% \end{macrocode} +% +% +% \Finale +% %Here ends the programmer's documentation. +% \endinput +% +\endinput |