diff options
Diffstat (limited to 'macros/latex/contrib/revtex/source/ltxutil.dtx')
-rw-r--r-- | macros/latex/contrib/revtex/source/ltxutil.dtx | 4328 |
1 files changed, 4328 insertions, 0 deletions
diff --git a/macros/latex/contrib/revtex/source/ltxutil.dtx b/macros/latex/contrib/revtex/source/ltxutil.dtx new file mode 100644 index 0000000000..1ca98f82cc --- /dev/null +++ b/macros/latex/contrib/revtex/source/ltxutil.dtx @@ -0,0 +1,4328 @@ +% \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. +% +% 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}\CheckSum{4291} +% +% \iffalse ltxdoc klootch +%<*package> +%%% @LaTeX-file{ +%%% filename = "ltxutil.dtx", +%%% version = "4.2c", +%%% date = "2019/01/18", +%%% time = "14:29:48 UT-5", +%%% checksum = "4291", +%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net), +%%% 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", +%%% docstring = "The checksum field above generated by ltxdoc", +%%% } +%</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> + [2019/01/18/14:29:48 4.2c 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}% +%\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 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}% + +\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}{\@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. +% +% The facility depends on the stability of this part +% of \LaTeX's kernel code (the first token of \cmd\document), +% which could change, you see. But considering that \LaTeX\ is +% at this point essentially stagnant once more, we risk it. +% +% \begin{macro}{\document} +% We begin by installing hooks into \cmd\document\ that +% we will manage ourselves. +% First, we do as \cmd\document\ does: end the group +% begun by \cmd\begin. Last, we conclude our shenanigans by absorbing +% the first token of the expansion of \cmd\document, which +% we assume to be \cmd\endgroup. +% \changes{4.1a}{2008/08/12}{Get rid of \cs{set@typesize@hook} \cs{set@pica@hook} and the \cs{normalsize} directive}% +% \begin{macrocode} +\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. +% \begin{macrocode} +\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} +% \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}{% + \class@info{Making \string\typeout\space \string\long}% + \let\typeout\typeout@ltx +}{}% +% \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 |