4462 lines
144 KiBLFS
TeX
4462 lines
144 KiBLFS
TeX
% \iffalse meta-comment balanced on line 107
|
|
% ltxutil.dtx: utilities package
|
|
% Copyright (c) 2009 Arthur Ogawa
|
|
%
|
|
% Disclaimer
|
|
% This file is distributed WITHOUT ANY WARRANTY;
|
|
% without even the implied warranty of
|
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
% License
|
|
% You may distribute this file under the conditions of the
|
|
% LaTeX Project Public License 1.3c or later
|
|
% (http://www.latex-project.org/lppl.txt).
|
|
% ReadMe
|
|
% For the documentation and more detailed instructions for
|
|
% installation, typeset this document with \LaTeX.
|
|
% Maintenance Status
|
|
% This work has the LPPL maintenance status "maintained";
|
|
% Current Maintainer of this work is Arthur Ogawa
|
|
% changes for version 4.2d--4.2f by Phelype Oleinik.
|
|
%
|
|
% This work consists of the main source file ltxutil.dtx
|
|
% and the derived files
|
|
% ltxutil.sty, ltxutil.pdf
|
|
% Distribution:
|
|
% CTAN:macros/latex/contrib/revtex/
|
|
%
|
|
% Unpacking:
|
|
% tex ltxutil.dtx
|
|
%
|
|
% Documentation:
|
|
% latex ltxutil.dtx; ...
|
|
%
|
|
% Program calls to get the documentation (example):
|
|
% pdflatex ltxutil.dtx
|
|
% makeindex -s gind.ist ltxutil.idx
|
|
% makeindex -s gglo.ist -o ltxutil.gls ltxutil.glo
|
|
% pdflatex ltxutil.dtx
|
|
% makeindex -s gind.ist ltxutil.idx
|
|
% pdflatex ltxutil.dtx
|
|
%
|
|
% Installation:
|
|
% TDS:doc/latex/revtex/
|
|
% TDS:source/latex/revtex/
|
|
% TDS:tex/latex/revtex/
|
|
%
|
|
% Thanks, Heiko!
|
|
% This method of letting a single .dtx file serve as both
|
|
% documentation (via latex) and installer (via tex) follows
|
|
% the example of Heiko Oberdiek. Thanks!
|
|
%<*ignore>
|
|
\begingroup
|
|
\def\x{LaTeX2e}%
|
|
\expandafter\endgroup
|
|
\ifcase
|
|
0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi
|
|
\relax
|
|
\else
|
|
\csname fi\endcsname
|
|
%</ignore>
|
|
%<*install>
|
|
\input docstrip
|
|
\preamble
|
|
|
|
This is a generated file;
|
|
altering it directly is inadvisable;
|
|
instead, modify the original source file.
|
|
See the URL in the file README-LTXUTIL.tex.
|
|
|
|
License
|
|
You may distribute this file under the conditions of the
|
|
LaTeX Project Public License 1.3c or later
|
|
(http://www.latex-project.org/lppl.txt).
|
|
|
|
This file is distributed WITHOUT ANY WARRANTY;
|
|
without even the implied warranty of MERCHANTABILITY
|
|
or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
\endpreamble
|
|
\askforoverwritefalse
|
|
\keepsilent
|
|
\generate{%
|
|
%{ignore}
|
|
\file{ltxutil.sty}{%
|
|
\from{ltxutil.dtx}{package,kernel}%
|
|
}%
|
|
\file{ltxutil.krn}{%
|
|
\from{ltxutil.dtx}{kernel}%
|
|
}%
|
|
}%
|
|
\ifToplevel{
|
|
\Msg{***********************************************************}
|
|
\Msg{*}
|
|
\Msg{* To finish the installation, please move}
|
|
\Msg{* ltxutil.sty}
|
|
\Msg{* into a directory searched by TeX;}
|
|
\Msg{* in a TDS-compliant installation:}
|
|
\Msg{* texmf/tex/macros/latex/revtex/.}
|
|
\Msg{*}
|
|
\Msg{* To produce the documentation,
|
|
run ltxutil.dtx through LaTeX.}
|
|
\Msg{*}
|
|
\Msg{* Happy TeXing}
|
|
\Msg{***********************************************************}
|
|
}
|
|
\endbatchfile
|
|
%</install>
|
|
%<*ignore>
|
|
\fi
|
|
%</ignore>
|
|
% \fi
|
|
%
|
|
% \GetFileInfo{ltxutil.dtx}
|
|
%
|
|
% \iffalse ltxdoc klootch
|
|
%<*package>
|
|
%%% @LaTeX-file{
|
|
%%% filename = "ltxutil.dtx",
|
|
%%% version = "4.2f",
|
|
%%% date = "2022/06/05",
|
|
%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
|
|
%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org),
|
|
%%% commissioned by the American Physical Society. Minor changes by Mark Doyle for version 4.2a-c.
|
|
%%% ",
|
|
%%% copyright = "Copyright (C) 1999, 2009 Arthur Ogawa,
|
|
%%% distributed under the terms of the
|
|
%%% LaTeX Project Public License 1.3c, see
|
|
%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt
|
|
%%% ",
|
|
%%% address = "Arthur Ogawa,
|
|
%%% USA",
|
|
%%% telephone = "",
|
|
%%% FAX = "",
|
|
%%% email = "mailto colon arthur_ogawa at sbcglobal.net",
|
|
%%% codetable = "ISO/ASCII",
|
|
%%% keywords = "latex, page grid, main vertical list",
|
|
%%% supported = "yes",
|
|
%%% abstract = "utilities package",
|
|
%%% }
|
|
%</package>
|
|
% \fi
|
|
%
|
|
% \iffalse ltxdoc klootch
|
|
% The following references the \file{README-LTXUTIL} file,
|
|
% which contains basic information about this package.
|
|
% The contents of this file are generated when
|
|
% you typeset the programmer's documentation.
|
|
% Search on "{filecontents*}{README-LTXUTIL}" to locate it.
|
|
% \fi\input{README-LTXUTIL}%
|
|
%
|
|
% \subsection{Bill of Materials}
|
|
%
|
|
% Following is a list of the files in this distribution arranged
|
|
% according to provenance.
|
|
%
|
|
% \subsubsection{Primary Source}%
|
|
% One single file generates all.
|
|
%\begin{verbatim}
|
|
%ltxutil.dtx
|
|
%\end{verbatim}
|
|
%
|
|
% \subsubsection{Generated by \texttt{latex ltxutil.dtx}}%
|
|
% Typesetting the source file under pdflatex
|
|
% generates the readme and the documentation.
|
|
%\begin{verbatim}
|
|
%README-LTXUTIL ltxutil.pdf
|
|
%\end{verbatim}
|
|
%
|
|
% \subsubsection{Generated by \texttt{tex ltxutil.dtx}}%
|
|
% Typesetting this file with \TeX\ generates
|
|
% the package file.
|
|
%\begin{verbatim}
|
|
%ltxutil.sty
|
|
%\end{verbatim}
|
|
%
|
|
% \subsubsection{Auxiliary}%
|
|
% The following are auxiliary files generated
|
|
% in the course of running \LaTeX:
|
|
% \begin{verbatim}
|
|
%ltxutil.aux ltxutil.idx ltxutil.ind ltxutil.log ltxutil.toc
|
|
% \end{verbatim}
|
|
%
|
|
% \section{Code common to all modules}%
|
|
%
|
|
% We want to require only one place in this file
|
|
% where the version number is stated,
|
|
% and we also want to ensure that the version
|
|
% number is embedded into every generated file.
|
|
%
|
|
% Now we declare that
|
|
% these files can only be used with \LaTeXe.
|
|
% An appropriate message is displayed if
|
|
% a different \TeX{} format is used.
|
|
% \begin{macrocode}
|
|
%<*doc|package>
|
|
\NeedsTeXFormat{LaTeX2e}[1995/12/01]%
|
|
%</doc|package>
|
|
% \end{macrocode}
|
|
% As desired, the following modules all
|
|
% take common version information:
|
|
% \begin{macrocode}
|
|
%<kernel&!package&!doc>\typeout{%
|
|
%<*package|doc>
|
|
\ProvidesFile{%
|
|
%</package|doc>
|
|
%<*kernel|package|doc>
|
|
ltxutil%
|
|
%</kernel|package|doc>
|
|
%<*doc>
|
|
.dtx%
|
|
%</doc>
|
|
%<package>.sty%
|
|
%<*package|doc>
|
|
}%
|
|
%</package|doc>
|
|
% \end{macrocode}
|
|
%
|
|
% The following line contains, for once and for all,
|
|
% the version and date information.
|
|
% By various means, this information is reproduced
|
|
% consistently in all generated files and in the
|
|
% typeset documentation.
|
|
% Give credit where due.
|
|
% \begin{macrocode}
|
|
%<*doc|package|kernel>
|
|
%<version>
|
|
[2022/06/05 4.2f utilities package (portions licensed from W. E. Baxter web at superscript.com)]% \fileversion
|
|
%</doc|package|kernel>
|
|
%<kernel&!package&!doc>}%
|
|
% \end{macrocode}
|
|
%
|
|
%
|
|
% \section{The driver module \texttt{doc}}
|
|
%
|
|
% This module, consisting of the present section,
|
|
% typesets the programmer's documentation,
|
|
% generating the \file{README-LTXUTIL} as required.
|
|
%
|
|
% Because the only uncommented-out lines of code at the beginning of
|
|
% this file constitute the \file{doc} module itself,
|
|
% we can simply typeset the \file{.dtx} file directly,
|
|
% and there is thus rarely any need to
|
|
% generate the ``doc'' {\sc docstrip} module.
|
|
% Module delimiters are nonetheless required so that
|
|
% this code does not find its way into the other modules.
|
|
%
|
|
% The \enve{document} command concludes the typesetting run.
|
|
%
|
|
% \begin{macrocode}
|
|
%<*doc>
|
|
% \end{macrocode}
|
|
%
|
|
% \subsection{The Preamble}
|
|
% The programmers documentation is formatted
|
|
% with the \classname{ltxdoc} class with local customizations,
|
|
% and with the usual code line indexing.
|
|
% \begin{macrocode}
|
|
\documentclass{ltxdoc}
|
|
\RequirePackage{ltxdocext}%
|
|
\let\url\undefined
|
|
\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}%
|
|
\pdfstringdefDisableCommands{%
|
|
\let\file\relax
|
|
\let\sc\relax
|
|
}
|
|
%\expandafter\ifx\csname package@font\endcsname\@undefined\else
|
|
% \expandafter\RequirePackage\expandafter{\csname package@font\endcsname}%
|
|
%\fi
|
|
\CodelineIndex\EnableCrossrefs % makeindex -s gind.ist ltxutil
|
|
\RecordChanges % makeindex -s gglo.ist -o ltxutil.gls ltxutil.glo
|
|
% \end{macrocode}
|
|
%
|
|
% \subsubsection{Docstrip and info directives}
|
|
% We use so many {\sc docstrip} modules that we set the
|
|
% \texttt{StandardModuleDepth} counter to 1.
|
|
% \begin{macrocode}
|
|
\setcounter{StandardModuleDepth}{1}
|
|
% \end{macrocode}
|
|
% The following command retrieves the date and version information
|
|
% from this file.
|
|
% \begin{macrocode}
|
|
\expandafter\GetFileInfo\expandafter{\jobname.dtx}%
|
|
% \end{macrocode}
|
|
%
|
|
% \subsection{The ``Read Me'' File}
|
|
% As promised above, here is the contents of the
|
|
% ``Read Me'' file. That file serves a double purpose,
|
|
% since it also constitutes the beginining of the
|
|
% programmer's documentation. What better thing, after
|
|
% all, to have appear at the beginning of the
|
|
% typeset documentation?
|
|
%
|
|
% A good discussion of how to write a ReadMe file can be found in
|
|
% Engst, Tonya, ``Writing a ReadMe File? Read This''
|
|
% \emph{MacTech} October 1998, p. 58.
|
|
%
|
|
% Note the appearance of the
|
|
% \cmd\StopEventually\ command, which marks the
|
|
% dividing line between the user documentation
|
|
% and the programmer documentation.
|
|
%
|
|
% The usual user will not be asked to
|
|
% do a full build, not to speak
|
|
% of the bootstrap.
|
|
% Instructions for carrying out these procedures
|
|
% begin the programmer's manual.
|
|
%
|
|
% \begin{macrocode}
|
|
\begin{filecontents*}{README-LTXUTIL}
|
|
\title{%
|
|
A \LaTeX\ Package of utility macros%
|
|
\thanks{%
|
|
This file has version number \fileversion,
|
|
last revised \filedate.%
|
|
}%
|
|
\thanks{%
|
|
Version \fileversion\ \copyright\ 2019--2022 American Physical Society
|
|
}%
|
|
}%
|
|
\author{%
|
|
Arthur Ogawa%
|
|
\thanks{\texttt{mailto:arthur\_ogawa at sbcglobal.net}}%
|
|
}%
|
|
%\iffalse
|
|
% For version number and date,
|
|
% search on "\fileversion" in the .dtx file,
|
|
% or see the end of the README-LTXUTIL file.
|
|
%\fi
|
|
\maketitle
|
|
|
|
This file embodies the \classname{ltxutil} package,
|
|
the implementation and its user documentation.
|
|
|
|
The distribution point for this work is
|
|
\url{journals.aps.org/revtex},
|
|
which contains prebuilt runtime files, documentation, and full source,
|
|
ready to add to a TDS-compliant \TeX\ installation.
|
|
|
|
The \classname{ltxutil} package was commissioned by the American Physical Society
|
|
and is distributed under the terms of the \LaTeX\ Project Public License 1.3c,
|
|
the same license under which all the portions of \LaTeX\ itself are distributed.
|
|
Please see \url{http://ctan.tug.org/macros/latex/base/lppl.txt} for details.
|
|
|
|
To use this document class, you must have a working
|
|
\TeX\ installation equipped with \LaTeXe\
|
|
and possibly pdftex and Adobe Acrobat Reader or equivalent.
|
|
|
|
To install, retrieve the distribution,
|
|
unpack it into a directory on the target computer,
|
|
and move the file \file{ltxutil.sty}
|
|
into a location in your filesystem where it will be found by \LaTeX.
|
|
|
|
To use, read the user documentation \file{ltxutil.pdf}.
|
|
|
|
\tableofcontents
|
|
|
|
\section{Processing Instructions}
|
|
|
|
The package file \file{ltxutil.sty}
|
|
is generated from this file, \file{ltxutil.dtx},
|
|
using the {\sc docstrip} facility of \LaTeX
|
|
via |tex ltxutil.dtx| (Note: do \emph{not} use \LaTeX\ for this task).
|
|
The typeset documentation that you are now reading is generated from
|
|
the same file by typesetting it with \LaTeX\ or pdftex
|
|
via |latex ltxutil.dtx| or |pdflatex ltxutil.dtx|.
|
|
|
|
\subsection{Build Instructions}
|
|
|
|
You may bootstrap this suite of files solely from \file{ltxutil.dtx}.
|
|
Prepare by installing \LaTeXe\ (and either tex or pdftex) on your computer,
|
|
then carry out the following steps:
|
|
\begin{enumerate}
|
|
\item
|
|
Within an otherwise empty directory,
|
|
typeset \file{ltxutil.dtx} with \LaTeX\ or pdflatex;
|
|
you will obtain the typeset documentation you are now reading,
|
|
along with the file \file{README-LTXUTIL}.
|
|
|
|
Note: you will have to run \LaTeX, then
|
|
\file{makeindex} \texttt{-s gind.ist ltxutil.idx}, then
|
|
\file{makeindex} \texttt{-s gglo.ist -o ltxutil.gls ltxutil.glo}, then
|
|
\LaTeX\ again in order to obtain a valid index and table of contents.
|
|
\item
|
|
Now typeset \file{ltxutil.dtx} with \TeX (not \LaTeX),
|
|
thereby generating the package file \file{ltxutil.sty}.
|
|
\item
|
|
Install the following files into indicated locations within your
|
|
TDS-compliant \texttt{texmf} tree (you may need root access):
|
|
\begin{itemize}
|
|
\item
|
|
\file{$TEXMF/}\file{tex/}\file{latex/}\file{revtex/}\classname{ltxutil.sty}
|
|
\item
|
|
\file{$TEXMF/}\file{source/}\file{latex/}\file{revtex/}\classname{ltxutil.dtx}
|
|
\item
|
|
\file{$TEXMF/}\file{doc/}\file{latex/}\file{revtex/}\classname{ltxutil.pdf}
|
|
\end{itemize}
|
|
where \file{$TEXMF/} stands for \file{texmf-local/}, or some other \texttt{texmf} tree
|
|
in your installation.
|
|
\item
|
|
Run \texttt{mktexlsr} on \file{$TEXMF/} (you may need root access).
|
|
\item
|
|
Build and installation are now complete;
|
|
now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble!
|
|
\end{enumerate}
|
|
|
|
\subsection{Change Log}
|
|
\changes{4.0b}{1999/06/20}{AO: Fixed spurious \texttt{CR} and (return) characters in output file. Also, if the document did not have the \cs{end}\texttt{figure} on a line of its own, the macro wouldn't work. Fixed.}
|
|
\changes{4.0b}{1999/06/20}{AO: Removed superfluous \cs{def}s, changed to using \cs{floats@sw} as the flag. Also stopped using DPC's \cs{if@twocolumn} flag: using \cs{floats@sw} instead. Also added \cs{par}\cs{vskip}\cs{z@skip} after the \cs{minipagefootnotes} so that the float box would have zero depth like the kernel one. }
|
|
\changes{4.0b}{1999/06/20}{only execute if there really were floats of the given type}
|
|
\changes{4.0b}{1999/06/20}{Support the hack with \cs{prepdef}, and delay until \cs{AtBeginDocument} time, since \classname{hyperref} clobbers \cs{caption}.}
|
|
\changes{4.0c}{1999/11/13}{(AO, 110) Install hooks for endfloats processing}
|
|
\changes{4.0c}{1999/11/13}{(AO, 116) Hyperref compatibility}
|
|
\changes{4.0c}{1999/11/13}{(AO, 130) Interference from array package}
|
|
\changes{4.0c}{1999/11/13}{*-form mandates pagebreak at each float; only print section head if there is something there.}
|
|
\changes{4.0d}{2000/04/10}{(AO, 127) Floats placed [h] to allow page breaks}
|
|
\changes{4.0d}{2000/04/10}{(AO, 174) kernel fix}
|
|
\changes{4.0d}{2000/05/19}{(AO, 224) Hyperref compatibility.}
|
|
\changes{4.0d}{2000/05/23}{Allow things to break over pages by setting array@default.}
|
|
\changes{4.0e}{2000/11/16}{(AO, 221) Remove samepage command from @xfloat@prep: If the float can break over pages, we want better control.}
|
|
\changes{4.0f}{2001/07/13}{(AO, 404) Hyperref compatibility}
|
|
\changes{4.1a}{2008/01/19}{(AO, 459) do not assume \cs{class@name} is defined}%
|
|
\changes{4.1a}{2008/01/19}{(AO, 461) Change the csname from \cs{@dotsep} to \cs{ltxu@dotsep}. The former is understood in mu. (What we wanted was a dimension.)}%
|
|
\changes{4.1a}{2008/01/19}{(AO, 475) I had not properly reproduced the LaTeX macro \cs{eqnarray}.}%
|
|
\changes{4.1a}{2008/01/19}{(AO, 479) Per: Dylan Thurston<dpt at math.harvard.edu>}%
|
|
\changes{4.1a}{2008/06/30}{(AO) Make \cs{addtocontents} a \cs{long} \cs{def}; gobble up \cs{footnote}}%
|
|
\changes{4.1a}{2008/06/30}{(AO) Remove code that avoided changes to \cs{@xfootnotemark}}%
|
|
\changes{4.1a}{2008/06/30}{(AO, 438) Complete rewrite of footnote macros.}
|
|
\changes{4.1a}{2008/07/07}{\cs{@xfloat@prep} calls \cs{ltx@footnote@pop} to restore the original \cs{ltx@footmark} and \cs{ltx@foottext} procedures, in case footnote processing has switched.}
|
|
\changes{4.1a}{2008/08/12}{\cs{class@documenthook} is the last \cs{AtBeginDocument} token now}
|
|
\changes{4.1a}{2008/08/12}{Class extension mechanism \cs{@pushfilename@ltx} and \cs{@p@pfilename@ltx}.}
|
|
\changes{4.1a}{2008/08/12}{Class extension mechanism \cs{class@extension}, \cs{class@extensionfile}, and \cs{class@ext@hook}.}
|
|
\changes{4.1a}{2008/08/12}{Get rid of \cs{set@typesize@hook} \cs{set@pica@hook} and the \cs{normalsize} directive}%
|
|
\changes{4.1b}{2008/08/12}{(AO, 487) Support for video figures and the \cs{setfloatlink} command}%
|
|
\changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.}
|
|
\changes{4.1b}{2008/08/12}{Acquire \classname{hyperref} savoire}
|
|
\changes{4.1b}{2008/08/12}{Default assignment of \cs{float@sw} now, not at \cs{AtBeginDocument} time.}%
|
|
\changes{4.1b}{2008/08/12}{If class option \classoption{lengthcheck} is in effect, log the height of this float class.}
|
|
\changes{4.1b}{2008/08/12}{No need to protect against undefined \cs{float@sw}}
|
|
\changes{4.1b}{2008/08/12}{Patch the array package even later: after all package patches go in.}
|
|
\changes{4.1b}{2008/08/12}{Refine toc processing: provide default.}%
|
|
\changes{4.1b}{2008/08/12}{Tally and log the height of a float class}
|
|
\changes{4.1d}{2009/03/27}{(AO, 511) Compatability with lineno.sty's erroneous way of detecting fleqn.clo}%
|
|
\changes{4.1f}{2009/07/07}{(AO, 515) Hook for setting the font of a footnote}
|
|
\changes{4.1f}{2009/07/10}{(AO, 518) Tally register overflow when locument is long}
|
|
\changes{4.1g}{2009/10/06}{(AO, 532) Both arguments of \cs{href} get sanitized}%
|
|
\changes{4.1g}{2009/10/07}{(AO, 525) Remove phantom paragraph above display math that is given in vertical mode}%
|
|
\changes{4.1g}{2009/10/07}{(AO, 539) Use of double-backslash in argument of \cs{section} gives error. The \classname{textcase} package is involved.}%
|
|
\changes{4.1n}{2009/12/05}{(AO, 569) Use of \classname{hyperref} interferes with column balancing of last page}%
|
|
\changes{4.1n}{2009/12/06}{(AO) Incorporate change to ltmiscen.dtx v1.1i 2000/05/19}%
|
|
\changes{4.1n}{2009/12/09}{(AO, 569) execute \classname{atveryend}'s \cs{Call@AfterLastShipout} at the proper time}%
|
|
\changes{4.1n}{2009/12/13}{(AO, 574) protect against \classname{lineno.sty}, which forces a visit to the output routine, which appears to destroy the value of \cs{@tempdima}}%
|
|
\changes{4.1n}{2010/01/02}{(AO, 571) Interface \cs{set@footnotewidth} for determining the set width of footnotes}%
|
|
\changes{4.1n}{2010/01/02}{(AO, 571) allow split after last line of footnote}%
|
|
\changes{4.1n}{2010/01/06}{(AO, 572) title block footnotes numbered independently from body footnotes}%
|
|
\changes{4.1p}{2010/02/24}{(AO, 582) A patch of \classname{hyperref.sty} to provide backward compatibility to \TeX Live 2007's version 6.75r}%
|
|
\changes{4.2a}{2017/11/21}{(MD) Use updated best practice to use https and doi.org}%
|
|
\changes{4.2a}{2018/12/12}{(MD) Updated name of README file and use standard fonts when typesetting}%
|
|
\changes{4.2d}{2020/09/19}{(PHO) Adapt \cs{document} and \cs{enddocument} hooks to the 2020-10-01 \LaTeX{} release.}%
|
|
|
|
\end{filecontents*}
|
|
% \end{macrocode}
|
|
%
|
|
% \subsection{The Document Body}
|
|
%
|
|
% Here is the document body, containing only a
|
|
% \cmd\DocInput\ directive---referring to this very file.
|
|
% This very cute self-reference is a common \classname{ltxdoc} idiom.
|
|
% \begin{macrocode}
|
|
\begin{document}%
|
|
\expandafter\DocInput\expandafter{\jobname.dtx}%
|
|
\end{document}
|
|
% \end{macrocode}
|
|
%
|
|
% \begin{macrocode}
|
|
%</doc>
|
|
% \end{macrocode}
|
|
%
|
|
% \section{Using this package}
|
|
% Once this package is installed on your filesystem, you can employ it in
|
|
% adding functionality to \LaTeX\ by invoking it in your document or document class.
|
|
%
|
|
% \subsection{Invoking the package}
|
|
% In your document, you can simply call it up in your preamble:
|
|
% \begin{verbatim}
|
|
%\documentclass{book}%
|
|
%\usepackage{ltxutil}%
|
|
%\begin{document}
|
|
%<your document here>
|
|
%\end{document}\end{verbatim}
|
|
% However, the preferred way is to invoke this package from within your
|
|
% customized document class:
|
|
% \begin{verbatim}
|
|
%\NeedsTeXFormat{LaTeX2e}[1995/12/01]%
|
|
%\ProvidesClass{myclass}%
|
|
%\RequirePackage{ltxutil}%
|
|
%\LoadClass{book}%
|
|
%<class customization commands>
|
|
%\endinput\end{verbatim}
|
|
%
|
|
% Once loaded, the package gives you acccess to certain procedures,
|
|
% usually to be invoked by a \LaTeX\ command or environment, but not at the document level.
|
|
%
|
|
%
|
|
% \section{Compatibility with \LaTeX's Required Packages}
|
|
% Certain packages, usually ones written by members of the
|
|
% \LaTeX\ Project itself, have been designated ``required'' and
|
|
% are distributed as part of standard \LaTeX.
|
|
% These packages have been placed in a priviledged position
|
|
% vis \'a vis the \LaTeX\ kernel in that they override the definitions of certain kernel macros.
|
|
%
|
|
% The \classname{ltxutil} package will be incompatible with any package that
|
|
% redefines any of the kernel macros that \classname{ltxutil} patches---if that
|
|
% package is loaded \emph{after} \classname{ltxutil}. This means that for
|
|
% greatest compatibility, \classname{ltxutil} should be loaded \emph{after},
|
|
% say, \classname{ftnright}, which overwrites \LaTeX's kernel
|
|
% procedures \cmd\@outputdblcol, \cmd\@startcolumn, and \cmd\@makecol.
|
|
%
|
|
% Hereinafter follows some notes on specific \LaTeX\ packages.
|
|
%
|
|
% \subsection{array}
|
|
% This package alters the way tabular environments are done,
|
|
% therefore it could run afoul of the \LaTeX\ ``required'' package \classname{array} or any
|
|
% package that calls for it to be loaded.
|
|
% However, this package has provisions for remaining compatible with \classname{array}.
|
|
% So long as the version of \classname{array} that is used with this package has the appropriate
|
|
% meanings for the procedures it overwrites, all should be well.
|
|
%
|
|
% \subsection{longtable}
|
|
% David Carlisle's \classname{longtable} package modifies both the \LaTeX\ kernel and the
|
|
% \classname{array} package. This package must therefore alter \cmd\LT@array.
|
|
% For now, that job is handled by \classname{ltxgrid}.
|
|
%
|
|
%
|
|
%\StopEventually{}
|
|
%
|
|
% \section{Implementation of package}
|
|
%
|
|
% Special acknowledgment: this package uses concepts pioneered
|
|
% and first realized by William Baxter (mailto:web at superscript.com)
|
|
% in his SuperScript line of commercial typesetting tools, and
|
|
% which are used here with his permission.
|
|
%
|
|
% \subsection{Beginning of the \file{package} {\sc docstrip} module}
|
|
% \begin{macrocode}
|
|
%<*package>
|
|
\def\package@name{ltxutil}%
|
|
\expandafter\PackageInfo\expandafter{\package@name}{%
|
|
Utility macros for \protect\LaTeXe,
|
|
by A. Ogawa (arthur_ogawa at sbcglobal.net)%
|
|
}%
|
|
%</package>
|
|
% \end{macrocode}
|
|
%
|
|
% \subsection{Banner and beginning of the \file{kernel} {\sc docstrip} module}%
|
|
% \begin{macrocode}
|
|
%<*kernel>
|
|
% \end{macrocode}
|
|
%
|
|
% \subsection{Errors and warnings}
|
|
%
|
|
% \begin{macro}{\class@err}
|
|
% \begin{macro}{\class@warn}
|
|
% \begin{macro}{\class@info}
|
|
% A few shorthands for Class messages.
|
|
% Your document class should define \cmd\class@name.
|
|
% \begin{macrocode}
|
|
\def\class@err#1{\ClassError{\class@name}{#1}\@eha}%
|
|
\def\class@warn#1{\ClassWarningNoLine{\class@name}{#1}}%
|
|
\def\class@info#1{\ClassInfo{\class@name}{#1}}%
|
|
\def\obsolete@command#1{%
|
|
\class@warn@end{Command \string#1\space is obsolete.^^JPlease remove from your document}%
|
|
\global\let#1\@empty
|
|
#1%
|
|
}%
|
|
\def\replace@command#1#2{%
|
|
\class@warn@end{Command \string#1\space is obsolete;^^JUse \string#2\space instead}%
|
|
\global\let#1#2%
|
|
#1%
|
|
}%
|
|
\def\replace@environment#1#2{%
|
|
\class@warn@end{Environment #1 is obsolete;^^JUse #2 instead}%
|
|
\glet@environment{#1}{#2}%
|
|
\@nameuse{#1}%
|
|
}%
|
|
\def\incompatible@package#1{%
|
|
\@ifpackageloaded{#1}{%
|
|
\def\@tempa{I cannot continue. You must remove the \string\usepackage\ statement that caused that package to be loaded.}%
|
|
\ClassError{\class@name}{The #1 package cannot be used with \class@name}%
|
|
\@tempa\stop
|
|
}{%
|
|
\class@info{#1 was not loaded (OK!)}%
|
|
}%
|
|
}%
|
|
\def\class@warn@end#1{%
|
|
\gappdef\class@enddocumenthook{\class@warn{#1}}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \changes{4.1a}{2008/01/19}{(AO, 459) do not assume \cs{class@name} is defined}%
|
|
% Give \cmd\class@name\ a meaning if it does not already have one.
|
|
% \begin{macrocode}
|
|
\ifx\undefined\class@name
|
|
\def\class@name{ltxutil}%
|
|
\class@warn{You should define the class name before reading in this package. Using default}%
|
|
\fi
|
|
% \end{macrocode}
|
|
%
|
|
% \subsection{New Tools}%
|
|
%
|
|
% \begin{macro}{\t@}
|
|
% \begin{macrocode}
|
|
\def\t@{to}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\dimen@iii}
|
|
% \begin{macrocode}
|
|
\dimendef\dimen@iii\thr@@
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\halignt@}
|
|
% \begin{macrocode}
|
|
\def\halignt@{\halign\t@}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\f@ur}
|
|
% Analogous to \cmd\@ne, \cmd\tw@, and \cmd\thr@@.
|
|
% \begin{macrocode}
|
|
\chardef\f@ur=4\relax
|
|
\chardef\cat@letter=11\relax
|
|
\chardef\other=12\relax
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\let@environment}
|
|
% \begin{macro}{\glet@environment}
|
|
% The directive \cmd\let@environment\ takes care of a common programming
|
|
% idiom whereby one environment is made a synonym for another.
|
|
% \begin{macrocode}
|
|
\def\let@environment#1#2{%
|
|
\expandafter\let
|
|
\csname#1\expandafter\endcsname\csname#2\endcsname
|
|
\expandafter\let
|
|
\csname end#1\expandafter\endcsname\csname end#2\endcsname
|
|
}%
|
|
\def\glet@environment#1#2{%
|
|
\global\expandafter\let
|
|
\csname#1\expandafter\endcsname\csname#2\endcsname
|
|
\global\expandafter\let
|
|
\csname end#1\expandafter\endcsname\csname end#2\endcsname
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\tracingplain}
|
|
% The command \cmd\tracingplain\ causes \TeX's tracing parameters to
|
|
% return to the values set by default. This command is sometimes
|
|
% useful when you have said \cmd\tracingall\ somewhere and want to
|
|
% restore.
|
|
% The \cmd\traceoutput\ command causes \cmd\tracingoutput\ diagnostics
|
|
% upon \cmd\shipout.
|
|
% \begin{macrocode}
|
|
\newcommand\tracingplain{%
|
|
\tracingonline\z@\tracingcommands\z@\tracingstats\z@
|
|
\tracingpages\z@\tracingoutput\z@\tracinglostchars\@ne
|
|
\tracingmacros\z@\tracingparagraphs\z@\tracingrestores\z@
|
|
\showboxbreadth5\showboxdepth3\relax %\errorstopmode
|
|
}%
|
|
\newcommand\traceoutput{%
|
|
\appdef\@resetactivechars{\showoutput}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\say}
|
|
% \begin{macro}{\saythe}
|
|
% The commands \cmd\say\ and \cmd\saythe\ cause diagnostic messages in the
|
|
% \TeX\ log that give the value of a control sequence name or a register
|
|
% respectively.
|
|
% \begin{macrocode}
|
|
\newcommand\say[1]{\typeout{<\noexpand#1=\meaning#1>}}%
|
|
\newcommand\saythe[1]{\typeout{<\noexpand#1=\the#1>}}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\fullinterlineskip}
|
|
% Resets the \cmd\prevdepth\ so that the full amount of \cmd\baselineskip\ glue will be inserted by
|
|
% the \cmd\baselinesklip\ mechanism.
|
|
% Can be invoked just after a \cmd\hrule\ to undo its default suppression of base line skip.
|
|
% \begin{macrocode}
|
|
\def\fullinterlineskip{\prevdepth\z@}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\count@i}
|
|
% \begin{macro}{\count@ii}
|
|
%
|
|
% \begin{macrocode}
|
|
\countdef\count@i\@ne
|
|
\countdef\count@ii\tw@
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Boolean Control}%
|
|
% We introduce just enough of the Boolean calculus for \TeX.
|
|
% Alan Jeffrey was the pioneer here, with an article in TUGboat
|
|
% (Vol. 11, No. 2, page 237).
|
|
% This implementation owes a debt to
|
|
% William Baxter (web at superscript.com).
|
|
% See articles by Baxter and Ogawa in the proceedings of the
|
|
% 1994 TUG meeting, TUGboat Vol.~15, No.~3.
|
|
%
|
|
% \begin{macro}{\prepdef}
|
|
% \begin{macro}{\appdef}
|
|
% \begin{macro}{\gappdef}
|
|
%
|
|
% Provide the capability of performing head- and tail patches.
|
|
% The procedure \cmd\prepdef\ prepends to the given macro
|
|
% the tokens specified in its second argument.
|
|
% Likewise for \cmd\appdef, except that it appends.
|
|
% Note that the first 10 toks registers are utility registers,
|
|
% and we simply make a control sequence name, \cmd\toks@ii, for one of
|
|
% them.
|
|
% \begin{macrocode}
|
|
\long\def\prepdef#1#2{%
|
|
\@ifxundefined#1{\toks@{}}{\toks@\expandafter{#1}}%
|
|
\toks@ii{#2}%
|
|
\edef#1{\the\toks@ii\the\toks@}%
|
|
}%
|
|
\long\def\appdef#1#2{%
|
|
\@ifxundefined#1{\toks@{}}{\toks@\expandafter{#1}}%
|
|
\toks@ii{#2}%
|
|
\edef#1{\the\toks@\the\toks@ii}%
|
|
}%
|
|
\long\def\gappdef#1#2{%
|
|
\@ifxundefined#1{\toks@{}}{\toks@\expandafter{#1}}%
|
|
\toks@ii{#2}%
|
|
\global\edef#1{\the\toks@\the\toks@ii}%
|
|
}%
|
|
\long\def\appdef@val#1#2{%
|
|
\appdef#1{{#2}}%
|
|
}%
|
|
\long\def\appdef@e#1#2{%
|
|
\expandafter\appdef
|
|
\expandafter#1%
|
|
\expandafter{#2}%
|
|
}%
|
|
\long\def\appdef@eval#1#2{%
|
|
\expandafter\appdef@val
|
|
\expandafter#1%
|
|
\expandafter{#2}%
|
|
}%
|
|
\toksdef\toks@ii=\tw@
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@ifxundefined}
|
|
% \begin{macro}{\@ifnotrelax}
|
|
% \begin{macro}{\@argswap}
|
|
% \begin{macro}{\@argswap@val}
|
|
%
|
|
% Certain utility procedures use \cmd\@ifxundefined,
|
|
% which is defined here in terms of \cmd\@ifx.
|
|
% Others use \cmd\@ifnotrelax, namely when
|
|
% the control sequence name is manufactured by
|
|
% the use of \cmd\csname.
|
|
%
|
|
% The procedures \cmd\@argswap and \cmd\@argswap@val
|
|
% are used to facilitate control of expansion.
|
|
%
|
|
% \begin{macrocode}
|
|
\long\def\@ifxundefined#1{\@ifx{\undefined#1}}%
|
|
\long\def\@ifnotrelax#1#2#3{\@ifx{\relax#1}{#3}{#2}}%
|
|
\long\def\@argswap#1#2{#2#1}%
|
|
\long\def\@argswap@val#1#2{#2{#1}}%
|
|
\def\@ifxundefined@cs#1{\expandafter\@ifx\expandafter{\csname#1\endcsname\relax}}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\rvtx@ifformat@geq}
|
|
% Some changes in the \LaTeX{} kernel requires us to conditionally
|
|
% define some macros depending on the version of the kernel.
|
|
% \cmd\rvtx@ifformat@geq{} will check if the release date of the
|
|
% currently-running \LaTeXe{} kernel is greater or equal to the
|
|
% argument (the argument should be in the format \texttt{yyyy-mm-dd}).
|
|
% \changes{4.2d}{2020/09/17}{(PHO) Add \cs{rvtx@ifformat@geq}.}%
|
|
% \begin{macrocode}
|
|
\ifx\IfFormatAtLeastTF\undefined
|
|
\def\rvtx@ifformat@geq{\@ifl@t@r\fmtversion}%
|
|
\else
|
|
\let\rvtx@ifformat@geq\IfFormatAtLeastTF
|
|
\fi
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@boolean}
|
|
% \begin{macro}{\@boole@def}
|
|
% In order to define \cmd\@ifx, we first must create the
|
|
% ``defining word'' (term taken form our Forth vocabulary)
|
|
% \cmd\@boole@def, which employs \cmd\@boolean\ to do its job.
|
|
% \begin{macrocode}
|
|
\def\@boolean#1#2{%
|
|
\long\def#1{%
|
|
#2% \if<something>
|
|
\expandafter\true@sw
|
|
\else
|
|
\expandafter\false@sw
|
|
\fi
|
|
}%
|
|
}%
|
|
\def\@boole@def#1#{\@boolean{#1}}% Implicit #2
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@booleantrue}
|
|
% \begin{macro}{\@booleanfalse}
|
|
% The procedures \cmd\@booleantrue\ and
|
|
% \cmd\@booleanfalse\ are assignment operators
|
|
% for Boolean flags.
|
|
% \begin{macrocode}
|
|
\def\@booleantrue#1{\let#1\true@sw}%
|
|
\def\@booleanfalse#1{\let#1\false@sw}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@ifx}
|
|
% \begin{macro}{\@ifx@empty}
|
|
% \begin{macro}{\@if@empty}
|
|
% \begin{macro}{\@ifcat}%
|
|
% \begin{macro}{\@ifdim}%
|
|
% \begin{macro}{\@ifeof}%
|
|
% \begin{macro}{\@ifhbox}%
|
|
% \begin{macro}{\@ifhmode}%
|
|
% \begin{macro}{\@ifinner}%
|
|
% \begin{macro}{\@ifmmode}%
|
|
% \begin{macro}{\@ifnum}%
|
|
% \begin{macro}{\@ifodd}%
|
|
% \begin{macro}{\@ifvbox}%
|
|
% \begin{macro}{\@ifvmode}%
|
|
% \begin{macro}{\@ifvoid}%
|
|
% We can now invoke the defining word to create
|
|
% the procedures \cmd\@ifx\ and friends.
|
|
%
|
|
% Compatibility Note: earlier versions of this package
|
|
% defined a procedure \cmd\@ifempty. However, for compatibility with AMS\LaTeX,
|
|
% we must avoid the following three names:
|
|
% \cmd\@ifempty, \cmd\@xifempty, and \cmd\@ifnotempty.
|
|
%
|
|
% \begin{macrocode}
|
|
\@boole@def\@ifx#1{\ifx#1}%
|
|
\@boole@def\@ifx@empty#1{\ifx\@empty#1}%
|
|
\@boole@def\@if@empty#1{\if!#1!}%
|
|
%\@boole@def\@if@sw#1{\csname if#1\endcsname}%
|
|
\def\@if@sw#1#2{#1\expandafter\true@sw\else\expandafter\false@sw#2}%
|
|
\@boole@def\@ifdim#1{\ifdim#1}%
|
|
\@boole@def\@ifeof#1{\ifeof#1}%
|
|
\@boole@def\@ifhbox#1{\ifhbox#1}%
|
|
\@boole@def\@ifhmode{\ifhmode}%
|
|
\@boole@def\@ifinner{\ifinner}%
|
|
\@boole@def\@ifmmode{\ifmmode}%
|
|
\@boole@def\@ifnum#1{\ifnum#1}%
|
|
\@boole@def\@ifodd#1{\ifodd#1}%
|
|
\@boole@def\@ifvbox#1{\ifvbox#1}%
|
|
\@boole@def\@ifvmode{\ifvmode}%
|
|
\@boole@def\@ifvoid#1{\ifvoid#1}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\true@sw}
|
|
% \begin{macro}{\false@sw}
|
|
%
|
|
% Note that when a Boolean operator expands, it
|
|
% employs two macros that act as selectors, defined here.
|
|
%
|
|
% \begin{macrocode}
|
|
\long\def\true@sw#1#2{#1}%
|
|
\long\def\false@sw#1#2{#2}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\loopuntil}
|
|
% \begin{macro}{\loopwhile}
|
|
%
|
|
% Loop control using the Boolean idiom.
|
|
% Superior to \cmd\loop\dots\cmd\repeat\ because these can be nested.
|
|
% The tail of the argument must have a Boolean predicate.
|
|
%
|
|
% \begin{macrocode}
|
|
\long\def\loopuntil#1{#1{}{\loopuntil{#1}}}%
|
|
\long\def\loopwhile#1{#1{\loopwhile{#1}}{}}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@provide}
|
|
%
|
|
% A defining word that refuses to clobber a prior meaning.
|
|
%
|
|
% \begin{macrocode}
|
|
\def\@provide#1{%
|
|
\@ifx{\undefined#1}{\true@sw}{\@ifx{\relax#1}{\true@sw}{\false@sw}}%
|
|
{\def#1}{\def\j@nk}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Begin Document Structure}
|
|
% The standard \LaTeX\ mechanism \cmd\AtBeginDocument\
|
|
% is inadequate because the \cmd\vsize\ is bound much too early.
|
|
% We supply here a mechanism whereby decisions about the
|
|
% page layout can be deferred until \cmd\AtBeginDocument\ time.
|
|
%
|
|
% The problem we are working around is that the \cmd\AtBeginDocument\
|
|
% hook in \cmd\document\ appears long after the calculation of
|
|
% \cmd\vsize\ and \cmd\hsize, that is, \LaTeX\ provides no mechanism
|
|
% for deferring the decision about the page grid until \cmd\AtBeginDocument\ time.
|
|
% We fix things by prepending a hook at the very beginning of \cmd\document.
|
|
%
|
|
% As it turns out, though, it appears feasible to simply invoke the desired
|
|
% column grid command at \cmd\AtBeginDocument\ time, since the MVL has nothing in it
|
|
% at that time that would be problematical.
|
|
%
|
|
% \begin{macro}{\document}
|
|
% We begin by installing hooks into \cmd\document\ that
|
|
% we will manage ourselves.
|
|
%
|
|
% The 2020-10-01 \LaTeX{} release got a new hook management system and
|
|
% several new hooks (several previously provided by \textsf{etoolbox}).
|
|
% The one we want here is \texttt{begindocument/before}, the first thing
|
|
% executed by \cmd\document{}, right after ending the group started by
|
|
% \cmd\begin{}.
|
|
%
|
|
% Thus, if the \LaTeX{} kernel date is 2020-10-01 we just add to that
|
|
% hook, otherwise resort to the old method, patching \cmd\document:
|
|
% end the group started by \cmd\begin, apply our hook, and
|
|
% conclude our shenanigans by absorbing
|
|
% the first token of the expansion of \cmd\document, which
|
|
% we assume to be \cmd\endgroup{} (true until the aforementioned release).
|
|
% \changes{4.1a}{2008/08/12}{Get rid of \cs{set@typesize@hook} \cs{set@pica@hook} and the \cs{normalsize} directive}%
|
|
% \changes{4.2d}{2020/09/17}{(PHO) Use \LaTeX's hook management system, if possible.}%
|
|
% \begin{macrocode}
|
|
\rvtx@ifformat@geq{2020/10/01}%
|
|
{%
|
|
\AddToHook{begindocument/before}{\document@inithook}%
|
|
}{%
|
|
\prepdef\document{%
|
|
\endgroup
|
|
\document@inithook
|
|
\true@sw{}%
|
|
}%
|
|
}
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\document@inithook}
|
|
% To use, simply \cmd\appdef\cmd\document@inithook\arg{your tokens here}.
|
|
% \begin{macrocode}
|
|
\let\document@inithook\@empty
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\class@documenthook}
|
|
% \begin{macro}{\class@enddocumenthook}
|
|
% \changes{4.1a}{2008/08/12}{\cs{class@documenthook} is the last \cs{AtBeginDocument} token now}
|
|
% We install the last \cmd\AtBeginDocument\ hook, namely the
|
|
% procedure \cmd\class@documenthook. Within the document class,
|
|
% we will use this hook exclusively, so as to avoid interference from other packages.
|
|
% Similarly with \cmd\class@enddocumenthook, installed via \cmd\AtEndDocument.
|
|
%
|
|
% A document class using this package should do as this package does and just say,
|
|
% \cmd\appdef\ \cmd\class@documenthook\ instead of \cmd\AtBeginDocument,
|
|
% and \cmd\appdef\ \cmd\class@enddocumenthook\ instead of \cmd\AtEndDocument.
|
|
% \begin{macrocode}
|
|
\appdef\document@inithook{%
|
|
\AtBeginDocument{\class@documenthook}%
|
|
}%
|
|
\AtEndDocument{%
|
|
\class@enddocumenthook
|
|
}%
|
|
\let\class@documenthook\@empty
|
|
\let\class@enddocumenthook\@empty
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\enddocument}
|
|
% \begin{macro}{\check@aux}
|
|
% \begin{macro}{\do@check@aux}
|
|
% \changes{4.1n}{2009/12/05}{(AO, 569) Use of \classname{hyperref} interferes with column balancing of last page}%
|
|
% The standard \LaTeX\ \enve{document} processing is a potential problem,
|
|
% particularly when the output routine has been changed by \classname{ltxgrid}.
|
|
% We separate out the procedure that checks the auxiliary file at the end of
|
|
% the job so that later it can be called from the safety of the output
|
|
% routine.
|
|
% We will do this to ensure that the \cmd\@mainaux\ stream is not closed until
|
|
% the last page of the job is shipped out, and that can only be done by coordinating
|
|
% with the output routine.
|
|
%
|
|
% \changes{4.2d}{2020/09/17}{(PHO) Only redefine \cs{enddocument} in older versions.}%
|
|
% This approach, however, will only be done for older versions of the
|
|
% \LaTeX{} kernel:
|
|
% \begin{macrocode}
|
|
\rvtx@ifformat@geq{2020/10/01}{%
|
|
% <definitions for newer LaTeX later>
|
|
}{%
|
|
% <definitions for older LaTeX>
|
|
\def\enddocument{%
|
|
% \end{macrocode}
|
|
% \changes{4.1n}{2009/12/06}{(AO) Incorporate change to ltmiscen.dtx v1.1i 2000/05/19}%
|
|
% The following line from \filename{ltmiscen.dtx} `resets \cmd\AtEndDocument for latex/3060'.
|
|
% \begin{macrocode}
|
|
\let\AtEndDocument\@firstofone
|
|
% \end{macrocode}
|
|
% \begin{macrocode}
|
|
\@enddocumenthook
|
|
\@checkend{document}%
|
|
% \end{macrocode}
|
|
% The \cmd\clear@document\ statement ends the current page (we must guarantee no further shipouts),
|
|
% then executes all cleanup procedures that must occur only after the last shipout.
|
|
% Clients will queue up their procedures via \cmd\AfterLastShipout, if it exists, otherwise by doing \cmd\appdef\cmd\clear@document.
|
|
% \begin{macrocode}
|
|
\clear@document
|
|
% \end{macrocode}
|
|
% We are very close to ending the \TeX\ run, now.
|
|
% \begin{macrocode}
|
|
\check@aux
|
|
\deadcycles\z@
|
|
\@@end
|
|
}%
|
|
\def\check@aux{\do@check@aux}%
|
|
\def\do@check@aux{%
|
|
\@if@sw\if@filesw\fi{%
|
|
\immediate\closeout\@mainaux
|
|
\let\@setckpt\@gobbletwo
|
|
\let\@newl@bel\@testdef
|
|
\@tempswafalse
|
|
\makeatletter
|
|
\input\jobname.aux\relax
|
|
}{}%
|
|
\@dofilelist
|
|
\@ifdim{\font@submax >\fontsubfuzz\relax}{%
|
|
\@font@warning{%
|
|
Size substitutions with differences\MessageBreak
|
|
up to \font@submax\space have occured.\@gobbletwo
|
|
}%
|
|
}{}%
|
|
\@defaultsubs
|
|
\@refundefined
|
|
\@if@sw\if@filesw\fi{%
|
|
\@ifx{\@multiplelabels\relax}{%
|
|
\@if@sw\if@tempswa\fi{%
|
|
\@latex@warning@no@line{%
|
|
Label(s) may have changed.
|
|
Rerun to get cross-references right%
|
|
}%
|
|
}{}%
|
|
}{%
|
|
\@multiplelabels
|
|
}%
|
|
}{}%
|
|
}%
|
|
}
|
|
% \end{macrocode}
|
|
%
|
|
% \changes{4.2d}{2020/09/17}{(PHO) Patch \cs{enddocument} at runtime in newer versions.}%
|
|
% \begin{macro}{\rvtx@enddocument@patch}
|
|
% For newer \LaTeX{} we'll try to be a bit more future-proof
|
|
% (no miracle though). The code for \cmd\enddocument{}
|
|
% (in pre-2020-10-01 \LaTeX) is roughly:
|
|
% \begin{verbatim}
|
|
% \def\enddocument{%
|
|
% <hooks and bookkeeping>
|
|
% \clearpage
|
|
% <read main .aux and final checks>
|
|
% \@@end
|
|
% }
|
|
% \end{verbatim}
|
|
% and the patches above replace the \cmd\clearpage{} by its own
|
|
% \cmd\clear@document, and \verb|<read main .aux and final checks>| by
|
|
% \cmd\do@check@aux, which it can later control the timing.
|
|
%
|
|
% Now we will apply the same changes, but this time without redefining
|
|
% \cmd\enddocument: we will instead replace tokens on-the-fly, when
|
|
% \cmd\enddocument{} is expanded. This will grant us a slightly safer
|
|
% approach that won't depend so much on the internals of
|
|
% \cmd\enddocument.
|
|
%
|
|
% This entire patch should work with the previous definition of
|
|
% \cmd\enddocument{} as well (except it cannot be used in the hook),
|
|
% but for now leave previous versions untouched.
|
|
%
|
|
% The entire patching will reside in the \texttt{enddocument} hook:
|
|
% \begin{macrocode}
|
|
\rvtx@ifformat@geq{2020/10/01}{%
|
|
\AddToHook{enddocument}{\rvtx@enddocument@patch{}}%
|
|
}{}
|
|
% \end{macrocode}
|
|
%
|
|
% This macro will be executed after \cmd\enddocument{} has expanded,
|
|
% so all its tokens are now exposed. Here we will assume that
|
|
% \cmd\enddocument{} contains the tokens \verb|\@checkend{document}|
|
|
% and \cmd\endgroup, and use them as delimiters:
|
|
% \begin{macrocode}
|
|
\protected\long\def\rvtx@enddocument@patch#1#2\@checkend#3{%
|
|
\begingroup
|
|
\edef\x{\detokenize{#3}}%
|
|
\edef\y{\detokenize{document}}%
|
|
\expandafter\endgroup
|
|
\ifx\x\y
|
|
\expandafter\rvtx@enddocument@patch@end
|
|
\else
|
|
\expandafter\rvtx@enddocument@patch@more
|
|
\fi
|
|
{#1#2}{#3}}
|
|
\def\rvtx@enddocument@patch@more#1#2{%
|
|
\rvtx@enddocument@patch{#1\@checkend{#2}}}
|
|
% \end{macrocode}
|
|
%
|
|
% When the \verb|\@checkend{document}| is reached, use \cmd\clearpage{}
|
|
% and \cmd\enddocument{} as delimiters for the
|
|
% \verb|<read main .aux and final checks>| part, and save it in
|
|
% \cmd\do@check@aux{}:
|
|
% \begin{macrocode}
|
|
\long\def\rvtx@enddocument@patch@end#1#2\clearpage#3\endgroup{%
|
|
\def\do@check@aux{#3\endgroup}%
|
|
% \end{macrocode}
|
|
% Then execute the code consumed in the previous step:
|
|
% \begin{macrocode}
|
|
#1%
|
|
\@checkend{#2}%
|
|
% \end{macrocode}
|
|
% Do \cmd\clear@document{} instead of \cmd\clearpage{} and
|
|
% \cmd\check@aux{} instead of the code grabbed.
|
|
% \begin{macrocode}
|
|
\clear@document
|
|
\check@aux}
|
|
\def\check@aux{\do@check@aux}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\clear@document}
|
|
% \changes{4.1n}{2009/12/05}{(AO, 569) Use of \classname{hyperref} interferes with column balancing of last page}%
|
|
% The procedure \cmd\clear@document\ is responsible for flushing out the last page of the document,
|
|
% if not already done.
|
|
% The procedure then executes those procedures that must wait for execution until
|
|
% after the last page is shipped out.
|
|
% Clients of \classname{ltxutil}, such as \classname{ltxgrid} and \classname{revtex4}
|
|
% will queue these procedures up via \cmd\AfterLastShipout, if it exists, otherwise by doing \cmd\appdef\cmd\clear@document.
|
|
%
|
|
% The command \cmd\Call@AfterLastShipout\ is provided by Heiko Oberdiek's \classname{atveryend} package.
|
|
% This package is compatible with \classname{ltxutil}.
|
|
%
|
|
% Note on compatibility with \classname{atveryend}:
|
|
% we arrange for \cmd\Call@AfterLastShipout\ to be called from the safety of the output routine,
|
|
% thereby ensuring that all of the procedures queued up by that package's
|
|
% \cmd\AfterLastShipout\ are executed at the right time.
|
|
% We also ensure that \cmd\Call@AfterLastShipout\ has a default definition, in case the package was never loaded.
|
|
% \changes{4.1n}{2009/12/09}{(AO, 569) execute \classname{atveryend}'s \cs{Call@AfterLastShipout} at the proper time}%
|
|
% \begin{macrocode}
|
|
\def\clear@document{%
|
|
\clearpage
|
|
\do@output@cclv{%
|
|
\Call@AfterLastShipout
|
|
}%
|
|
}%
|
|
\appdef\class@documenthook{%
|
|
\providecommand\Call@AfterLastShipout{}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \subsection{Class Extensions}%
|
|
% \changes{4.1a}{2008/08/12}{Class extension mechanism \cs{class@extension}, \cs{class@extensionfile}, and \cs{class@ext@hook}.}
|
|
% The \LaTeX\ procedure \cmd\@onefilewithoptions\ is the vehicle for reading in
|
|
% a \LaTeX\ class or package.
|
|
% The APS RevTeX class implements the use of what are called ``substyles'',
|
|
% actually extensions to the class itself.
|
|
% Any document class can do likewise.
|
|
%
|
|
% \begin{macro}{\class@extension}
|
|
% \begin{macro}{\class@extensionfile}
|
|
% \begin{macro}{\class@ext@hook}
|
|
% A procedure similar to \LaTeX's \cmd\@onefilewithoptions, but as an extension to the
|
|
% current document class.
|
|
%
|
|
% Read in the given file as if it were a document class file.
|
|
% Usage: \cmd\class@extensionfile\ \arg{class} \cmd\@extension,
|
|
% where \marg{class} is a file (similar to \file{aps.rtx}) and where \cmd\@extension\ is
|
|
% the file extension for \marg{class}.
|
|
% For instance, to read in the file \file{aps.rtx},
|
|
% do \cmd\class@extensionfile\ \texttt{\{aps\}} \cmd\substyle@ext,
|
|
% where the latter has been define to expand to \file{.rtx}.
|
|
%
|
|
% Features supported include
|
|
% passing existing class options on to the class extension,
|
|
% \cmd\AtEndOfClass\ processing,
|
|
% a stack that restores \cmd\@currname, \cmd\@currext, \cmd\@clsextension, and the \cmd\catcode\ of `@',
|
|
% fall-back to a control sequence name (with leading `rtx@') if no file exists.
|
|
%
|
|
% Note that \cmd\LoadClass\ gives one the ability to write a class that calls in
|
|
% another class as a (sort of) module: this scheme is like \cmd\LoadClass, but
|
|
% turned inside out.
|
|
% \begin{macrocode}
|
|
\def\class@extension#1#2{%
|
|
\IfFileExists{#1.#2}{%
|
|
\expandafter\class@extensionfile\csname ver@\@currname.\@currext\endcsname{#1}#2%
|
|
}{%
|
|
\csname rtx@#1\endcsname
|
|
}%
|
|
}%
|
|
\def\class@extensionfile#1#2#3{%
|
|
\@pass@ptions#3\@unusedoptionlist{#2}%
|
|
\global\let\@unusedoptionlist\@empty
|
|
\expandafter\class@ext@hook\csname#2.#3-h@@k\endcsname#1{#2}#3%
|
|
}%
|
|
\def\class@ext@hook#1#2#3#4{%
|
|
\@pushfilename@ltx
|
|
\makeatletter
|
|
\let\CurrentOption\@empty
|
|
\@reset@ptions
|
|
\let#1\@empty
|
|
\xdef\@currname{#3}%
|
|
\global\let\@currext#4%
|
|
\global\let\@clsextension\@currext
|
|
\input{#3.#4}%
|
|
\@ifl@ter#4{#3}#2{%
|
|
\class@info{Class extension later than: #2}%
|
|
}{%
|
|
\class@info{Class extension earlier: #2}%
|
|
\@@end
|
|
}%
|
|
#1%
|
|
\let#1\@undefined
|
|
\expandafter\@p@pfilename@ltx\@currnamestack@ltx\@nil
|
|
\@reset@ptions
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@pushfilename}
|
|
% \begin{macro}{\@p@pfilename}
|
|
% \changes{4.1a}{2008/08/12}{Class extension mechanism \cs{@pushfilename@ltx} and \cs{@p@pfilename@ltx}.}
|
|
% But! \LaTeX\ does not provide for a class extension other than \file{.cls}, therefore we
|
|
% must extend \LaTeX's file name stack with the file extension of a class extension.
|
|
% This way, procedures like
|
|
% \cmd\ProvidesPackage, \cmd\OptionNotUsed, \cmd\ProcessOptions, \cmd\@reset@ptions\
|
|
% will still work properly.
|
|
% \begin{macrocode}
|
|
\def\@pushfilename@ltx{%
|
|
\xdef\@currnamestack@ltx{%
|
|
{\@currname}%
|
|
{\@currext}%
|
|
{\@clsextension}%
|
|
{\the\catcode`\@}%
|
|
\@currnamestack@ltx
|
|
}%
|
|
}%
|
|
\def\@p@pfilename@ltx#1#2#3#4#5\@nil{%
|
|
\gdef\@currname{#1}%
|
|
\gdef\@currext{#2}%
|
|
\gdef\@clsextension{#3}%
|
|
\catcode`\@#4\relax
|
|
\gdef\@currnamestack@ltx{#5}%
|
|
}%
|
|
\global\let\@currnamestack@ltx\@empty
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% We carefully patch \LaTeX\ so that the current value of \cmd\@clsextension\ can be
|
|
% restored after reading in a class file.
|
|
%
|
|
% \subsection{Type Tools}%
|
|
%
|
|
% \begin{macro}{\flushing}
|
|
% Undoes \cmd\centering. Should also undo \cmd\raggedleft\ and \cmd\raggedright.
|
|
% \begin{macrocode}
|
|
\def\flushing{%
|
|
\let\\\@normalcr
|
|
\leftskip\z@skip
|
|
\rightskip\z@skip
|
|
\@rightskip\z@skip
|
|
\parfillskip\@flushglue
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \changes{4.1g}{2009/10/07}{(AO, 539) Use of double-backslash in argument of \cs{section} gives error. The \classname{textcase} package is involved.}%
|
|
% \begin{macro}{\@centercr}
|
|
% The \cmd\@centercr\ command is the replacement for \cmd\@normalcr\ when setting type centered or ragged.
|
|
% Normally, the meaning of \cmd\\ is \cmd\@normalcr, which \LaTeX\ defines via \cmd\DeclareRobustCommand.
|
|
% In centered or ragged typesetting, the meaning of \cmd\\ is \cmd\@centercr,
|
|
% therefore it ought to to be defined via \cmd\DeclareRobustCommand\ (but unfortunately is not).
|
|
% The fact that it is not is yet another of \LaTeX's early failures that will never get fixed.
|
|
%
|
|
% The following exemplar fails under \LaTeX\ version 2005/12/01, package \classname{textcase} 2004/10/07 v0.07:
|
|
% \begin{verbatim}
|
|
%\documentclass{article}%
|
|
%\usepackage[overload]{textcase}
|
|
%\begin{document}
|
|
%\centering
|
|
%\section{\MakeTextUppercase{Section\\title}}
|
|
%Text
|
|
%\end{document}
|
|
% \end{verbatim}
|
|
% The solution is to promote \cmd\@centercr\ to a robust command, just the same as \cmd\\.
|
|
% We do that here without needing to know the meaning of the command.
|
|
% \begin{macrocode}
|
|
\expandafter\DeclareRobustCommand\expandafter\@centercr\expandafter{\@centercr}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Display Math}%
|
|
%
|
|
% \begin{macro}{\eqnarray@LaTeX}
|
|
% \begin{macro}{\eqnarray@fleqn@fixed}
|
|
% Team \LaTeX\ has stated they will never repair Leslie's broken definition of \env{eqnarray}.
|
|
% Let us be bold\dots.
|
|
%
|
|
% Note on \classname{hyperref} package compatibility: that package overrides
|
|
% \cmd\eqnarray\ by wrapping it up in a larger procedure, so its changes
|
|
% are compatible with this package's changes.
|
|
%
|
|
% \changes{4.1a}{2008/01/19}{(AO, 475) I had not properly reproduced the LaTeX macro \cs{eqnarray}.}%
|
|
% \changes{4.2f}{2022/06/05}{(PHO) Fix detection of \cs{eqnarray} in newer \LaTeX.}%
|
|
% \begin{macrocode}
|
|
\def\rvtx@tmpa#1{%
|
|
\def\eqnarray@LaTeX{%
|
|
\stepcounter{equation}%
|
|
\def\@currentlabel{\p@equation\theequation}%
|
|
#1% \def\@currentcounter{equation} on newer LaTeX
|
|
\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}%
|
|
#1% \def\@currentcounter{equation} on newer LaTeX
|
|
\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
|
|
}%
|
|
}
|
|
\rvtx@tmpa{}% older LaTeX
|
|
\@ifx{\eqnarray\eqnarray@LaTeX}{\@firstofone}
|
|
{%
|
|
\rvtx@tmpa{\def\@currentcounter{equation}}% newer LaTeX
|
|
\@ifx{\eqnarray\eqnarray@LaTeX}{\@firstofone}
|
|
{\@gobble}
|
|
}
|
|
{%
|
|
\class@info{Repairing broken LaTeX eqnarray}%
|
|
\let\eqnarray\eqnarray@fleqn@fixed
|
|
\newlength\eqncolsep
|
|
\setlength\eqncolsep\z@
|
|
\let\eqnarray@LaTeX\relax
|
|
\let\eqnarray@fleqn@fixed\relax
|
|
}%
|
|
% \end{macrocode}
|
|
% The macro \cmd\ltx@mathindent\ is assigned to the \cmd\tabskip\ glue just
|
|
% before the alignment preamble is expanded, the value therefore applying at the
|
|
% left of the first column.
|
|
%
|
|
% The below value specifies the display math to be set centered, as is common practice.
|
|
% Alternatively, \cmd\tabskip\ can be set to a different glue value, accomplishing
|
|
% flush-left display math.
|
|
%
|
|
% Note that the \filename{fleqn.clo} package provides its own meaning for
|
|
% the eqnarray environment, which is also broken. We do not patch that package, however.
|
|
%
|
|
% \changes{4.1d}{2009/03/27}{(AO, 511) Compatability with lineno.sty's erroneous way of detecting fleqn.clo}%
|
|
% Bug note: The \filename{lineno.sty} package detects \filename{fleqn.clo}
|
|
% by testing whether \cmd\mathindent\ is defined, instead of using correct \LaTeXe\ means.
|
|
% Even though our eqnarray environment is modelled after \filename{fleqn.clo},
|
|
% we must program defensively here.
|
|
% \begin{macrocode}
|
|
\def\ltx@mathindent{\@centering}%
|
|
\def\set@eqnarray@skips{}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \changes{4.1g}{2009/10/07}{(AO, 525) Remove phantom paragraph above display math that is given in vertical mode}%
|
|
%\begin{macro}{\prep@math}
|
|
%\begin{macro}{\prep@math@patch}
|
|
% If we are in vertical mode when display math mode is entered (via \verb+$$+),
|
|
% \TeX\ will first enter horizontal mode, then display math mode; this results in a phantom paragraph
|
|
% containing a single \cmd\hbox\ consisting of the \cmd\parindent\ box followed by the \cmd\parskipfillskip\ glue.
|
|
% Of course, that \cmd\hbox\ is accompanied by \cmd\parskip\ glue and \cmd\baselineskip\ glue.
|
|
%
|
|
% The \cmd\prep@math\ procedure removes the \cmd\parindent\ box, thereby (magically) eliminating the phantom paragraph.
|
|
% The \cmd\prep@math@patch\ procedure headpatches the \env{equation} and \env{eqnarray} environments
|
|
% to accomplish this removal of the phantom paragraph.
|
|
%
|
|
% Note that there are three remaining ways to enter display math mode that we do not treat:
|
|
% the \env{displaymath} environment (equivalent to \cmd\[/\cmd\]), and the primitive the \verb+$$+ markup.
|
|
% I refrain from treating the first case because \env{displaymath} already detects the case
|
|
% where it is entered from vertical mode: I do not wish to engage in the dubious enterprise of attempting to correct a procedure that is ill conceived from the outset.
|
|
% As to the primitive \verb+$$+, there is no help for users who insist upon employing procedural markup in their documents.
|
|
% in their documents.
|
|
% \begin{macrocode}
|
|
\def\prep@math{%
|
|
\@ifvmode{\everypar{{\setbox\z@\lastbox}}}{}%
|
|
}%
|
|
\def\prep@math@patch{%
|
|
\prepdef\equation{\prep@math}%
|
|
\prepdef\eqnarray{\prep@math}%
|
|
}%
|
|
% \end{macrocode}
|
|
% A document class may invoke \cmd\prep@math@patch\ at any point it wishes to prevent the appearance
|
|
% of the phantom paragraph: it may be a global declaration or a local one.
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% We fail to patch \cmd\[, \cmd\equation, however.
|
|
%
|
|
% \subsection{Footnotes}
|
|
%
|
|
% \changes{4.0d}{2000/04/10}{(AO, 174) kernel fix}
|
|
%
|
|
% \begin{macro}{\footnotemark}
|
|
% \begin{macro}{\footnotetest}
|
|
% \begin{macro}{\ltx@xfootnote}
|
|
% \begin{macro}{\ltx@footmark}
|
|
% \begin{macro}{\ltx@foottext}
|
|
% \begin{macro}{\ltx@make@current@footnote}
|
|
% We repair an error in the \LaTeX\ kernel (see \file{ltfloat.dtx}) involving footnotes.
|
|
% The symptom is that the \cmd\footnotemark\ command does not work properly within a \env{minipage} environment.
|
|
% The source of the problem is in the way the \cmd\footnotemark\ and \cmd\@xfootnotemark\ procedures are defined:
|
|
% they do not share the method, used by \cmd\footnote\ and other procedures, that allows a context switch to
|
|
% change the way footnotes behave within a minipage environment.
|
|
% This is a \LaTeX\ bug of long standing; our fix dates to 1987.
|
|
%
|
|
% While we are at it, we rewrite both the \cmd\footnote, \cmd\footnotemark\ and \cmd\footnotetext\ procedures,
|
|
% achieving a cleaner separation of syntax and semantics.
|
|
% Note that the \cmd\@footnotetext\ procedure is not involved in context switching;
|
|
% \classname{hyperref} will take over that procedure, substituting its own processing around
|
|
% its argument and passing this to \cmd\H@@footnotetext.
|
|
% We anticipate this, and do our context switching on \cmd\H@@footnotetext.
|
|
%
|
|
% The \cmd\@makefnmark\ continues as the method of formatting the footnote mark.
|
|
%
|
|
% A note about the context switch mentioned above:
|
|
% the \env{minipage} environment executes the following in order to alter the way footnotes
|
|
% behave:\begin{verbatim}
|
|
%\def\@mpfn{mpfootnote}%
|
|
%\def\thempfn{\thempfootnote}%
|
|
%\let\@footnotetext\@mpfootnotetext
|
|
%\let\@makefnmark\@mpmakefnmark
|
|
%\c@mpfootnote\z@\end{verbatim}
|
|
% This code changes the counter used in autonumbered footnotes, the choice of footnote marker,
|
|
% and the procedure used on the footnote text. Changing the counter is needed because minipage
|
|
% footnotes are in their own sequence, and the footnote marker is customarily different within
|
|
% a minipage. The procedure that works on the footnote text must be different because the footnotes
|
|
% are placed at the bottom of the minipage, not the bottom of the text column.
|
|
%
|
|
% Note that \LaTeX\ initially defines \cmd\@mpfn\ as \texttt{footnote} and \cmd\thempfn\ as \cmd\thefootnote,
|
|
% so we are initially doing general footnotes.
|
|
%
|
|
% Any procedure that establishes a minipage-like context (e.g., floats) can do the same as the mimipage context switch
|
|
% illustrated above.
|
|
% \changes{4.1a}{2008/06/30}{(AO, 438) Complete rewrite of footnote macros.}
|
|
%
|
|
% Three user-level command, \cmd\footnote, \cmd\footnotemark, and \cmd\footnotetext\ are defined (see the \LaTeX\ manual for user-level details).
|
|
% \begin{macro}{\footnote}
|
|
% The first user-level command is \cmd\footnote.
|
|
% A simple way to look at this command is to think of it as
|
|
% \cmd\footnotemark\ \oarg{number} \cmd\footnotetext\ \oarg{number} \arg{text},
|
|
% where the optional argument is the same in both calls.
|
|
% We also define a syntactical helper procedure \cmd\ltx@xfootnote.
|
|
%
|
|
% We employ the procedures \cmd\ltx@stp@footproc\ and \cmd\ltx@def@footproc,
|
|
% passing in the procedure to execute, in this case \cmd\ltx@footmark,
|
|
% which sets the footnote mark.
|
|
% In any case, we end on the procedure \cmd\ltx@foottext, which sets the footnote text.
|
|
% \begin{macrocode}
|
|
\def\footnote{\@ifnextchar[\ltx@xfootnote\ltx@yfootnote}%
|
|
\def\ltx@xfootnote[#1]{%
|
|
\ltx@def@footproc\ltx@footmark[#1]%
|
|
\expandafter\ltx@foottext\expandafter{\the\csname c@\@mpfn\endcsname}%
|
|
}%
|
|
\def\ltx@yfootnote{%
|
|
\ltx@stp@footproc\ltx@footmark
|
|
\expandafter\ltx@foottext\expandafter{\the\csname c@\@mpfn\endcsname}%
|
|
}%
|
|
% \end{macrocode}
|
|
% The \cmd\footmark\ user-level command is next.
|
|
% Here we use the procedures \cmd\ltx@stp@footproc\ and \cmd\ltx@def@footproc\ again,
|
|
% but unlike \cmd\footnote, we do not set the footnote text.
|
|
% \begin{macrocode}
|
|
\def\footnotemark{\@ifnextchar[\ltx@xfootmark\ltx@yfootmark}%
|
|
\def\ltx@xfootmark{\ltx@def@footproc\ltx@footmark}%
|
|
\def\ltx@yfootmark{\ltx@stp@footproc\ltx@footmark}%
|
|
\def\ltx@footmark#1{%
|
|
\leavevmode
|
|
\ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
|
|
\begingroup
|
|
\expandafter\ltx@make@current@footnote\expandafter{\@mpfn}{#1}%
|
|
\expandafter\@argswap@val\expandafter{\Hy@footnote@currentHref}{\hyper@linkstart {link}}%
|
|
\@makefnmark
|
|
\hyper@linkend
|
|
\endgroup
|
|
\ifhmode\spacefactor\@x@sf\fi
|
|
\relax
|
|
}%
|
|
% \end{macrocode}
|
|
% The third user-level command is \cmd\footnotetext.
|
|
% As with \cmd\footnotemark, we use the procedures \cmd\ltx@stp@footproc\ and \cmd\ltx@def@footproc,
|
|
% this time passing in the procedure \cmd\ltx@foottext, which sets the footnote text.
|
|
% \begin{macrocode}
|
|
\def\footnotetext{\@ifnextchar[\ltx@xfoottext\ltx@yfoottext}%
|
|
\def\ltx@xfoottext{\ltx@def@footproc\ltx@foottext}%
|
|
\def\ltx@yfoottext{\ltx@stp@footproc\ltx@foottext}%
|
|
\long\def\ltx@foottext#1#2{%
|
|
\begingroup
|
|
\expandafter\ltx@make@current@footnote\expandafter{\@mpfn}{#1}%
|
|
\@footnotetext{#2}%
|
|
\endgroup
|
|
}%
|
|
% \end{macrocode}
|
|
% Here are the definitions of the procedures \cmd\ltx@stp@footproc\ and \cmd\ltx@def@footproc.
|
|
% The require argument is the procedure to execute afterwards, and
|
|
% \cmd\ltx@def@footproc\ parses a bracket-delimited argument (it is not optional).
|
|
% In each case the given procedure is executed with an argument prepared for it:
|
|
% the value of the footnote counter.
|
|
% \begin{macrocode}
|
|
\def\ltx@def@footproc#1[#2]{%
|
|
\begingroup
|
|
\csname c@\@mpfn\endcsname #2\relax
|
|
\unrestored@protected@xdef\@thefnmark{\thempfn}%
|
|
\expandafter\endgroup
|
|
\expandafter#1%
|
|
\expandafter{\the\csname c@\@mpfn\endcsname}%
|
|
}%
|
|
\def\ltx@stp@footproc#1{%
|
|
\expandafter\stepcounter\expandafter{\@mpfn}%
|
|
\protected@xdef\@thefnmark{\thempfn}%
|
|
\expandafter#1%
|
|
\expandafter{\the\csname c@\@mpfn\endcsname}%
|
|
}%
|
|
% \end{macrocode}
|
|
% Here we provide for our good friend \classname{hyperref}
|
|
% to enter in like a bull in a china shop. If it is not loaded,
|
|
% we do what it would have done, but gentlier and without hypertext functionality.
|
|
% \begin{macrocode}
|
|
\appdef\class@documenthook{%
|
|
\let\footnote@latex\footnote
|
|
\@ifpackageloaded{hyperref}{}{%
|
|
\let\H@@footnotetext\@footnotetext
|
|
\def\@footnotetext{\H@@footnotetext}%
|
|
\let\H@@mpfootnotetext\@mpfootnotetext
|
|
\def\@mpfootnotetext{\H@@mpfootnotetext}%
|
|
}%
|
|
}%
|
|
% \end{macrocode}
|
|
% In the following, we must use \LaTeX's rococco equipment in the form of \cmd\protected@edef,
|
|
% because of the presence of a font switch in the meaning of \cmd\thempfootnote.
|
|
% But, really, isn't this a sloppy conflation of semantics and presentation?
|
|
% \begin{macrocode}
|
|
\def\ltx@make@current@footnote#1#2{%
|
|
\csname c@#1\endcsname#2\relax
|
|
\protected@edef\Hy@footnote@currentHref{\@currentHref-#1.\csname the#1\endcsname}%
|
|
}%
|
|
\def\thempfootnote@latex{{\itshape \@alph \c@mpfootnote }}%
|
|
\def\ltx@thempfootnote{\@alph\c@mpfootnote}%
|
|
\@ifx{\thempfootnote\thempfootnote@latex}{%
|
|
\class@info{Repairing hyperref-unfriendly LaTeX definition of \string\mpfootnote}%
|
|
\let\thempfootnote\ltx@thempfootnote
|
|
}{}%
|
|
% \end{macrocode}
|
|
%
|
|
% Note on \classname{hyperref} compatibility:
|
|
% In its ``Automated \LaTeX\ hypertext cross-references'',
|
|
% the \classname{hyperref} package alters footnote processing,
|
|
% but it does nothing to address the several issues of concern to us.
|
|
%
|
|
% The \classname{hyperref} package takes over the \cmd\@mpfootnotetext\ and
|
|
% \cmd\@footnotetext\ procedures, wrapping the argument in its own code.
|
|
% It also rewrites \cmd\@footnotemark, making it a hyperlink, and
|
|
% \cmd\@xfootnotenext, removing from it all hypertext capabilities.
|
|
%
|
|
% However, if the \cmd\footnotemark\ command has been supplied with an optional argument,
|
|
% \classname{hyperref}'s changes do not apply: it punts in this case.
|
|
%
|
|
% At the same time, it attempts to turn off its changes during
|
|
% \cmd\maketitle\ processing, destroying one of the capabilities we desire.
|
|
%
|
|
% We make ourself \classname{hyperref} savvy:
|
|
% we re-implement footnote processing, using \classname{hyperref} capabilities if that
|
|
% package has been loaded.
|
|
%
|
|
% Any other package that rewrites \LaTeX's footnote macros will be incompatible
|
|
% with this package.
|
|
% \changes{4.1a}{2008/06/30}{(AO) Remove code that avoided changes to \cs{@xfootnotemark}}%
|
|
%
|
|
% Two thoughts about \classname{hyperref}: what for does it define \cmd\realfootnote?
|
|
% Apparently even SR himself cannot remember.
|
|
%
|
|
% Also: a document class that desires high hypertext capabilities might
|
|
% well wish to reimplement \cmd\maketitle\ so that footnotes called out from there
|
|
% are hypertext links: the \classname{hyperref} package's
|
|
% ``Automated \LaTeX\ hypertext cross-references''
|
|
% does not do any of this:
|
|
%\begin{quotation}
|
|
% But the special footnotes in |\maketitle| are much too hard to deal with properly.
|
|
% Let them revert to plain behaviour.
|
|
%\end{quotation}
|
|
% Note that the document class, in reimplementing \cmd\maketitle, must ensure
|
|
% that the \classname{hyperref} package does not clobber its own definition!
|
|
%
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@footnotetext}
|
|
% \begin{macro}{\@mpfootnotetext}
|
|
% \begin{macro}{\@tpfootnotetext}
|
|
% \begin{macro}{\make@footnotetext}
|
|
% \begin{macro}{\set@footnotewidth}
|
|
% The two procedures \cmd\@footnotetext\ and \cmd\@mpfootnotetext\ share code.
|
|
% We make that explicit here.
|
|
%
|
|
% Note that the procedure calling \cmd\make@footnotetext\ will open a group
|
|
% with \cmd\bgroup\ which is then closed by \cmd\minipagefootnote@drop.
|
|
%
|
|
% Difference from \LaTeX: here we do not set \cmd\floatingpenalty\ to infinity.
|
|
% Doing this must date back to a time when \LaTeX\ could not accomodate split insertions (footnotes).
|
|
% I cannot think of any other reason to do have done this.
|
|
% At any rate, with the \classname{ltxgrid} package, split insertions are properly
|
|
% taken care of, so we allow it.
|
|
%
|
|
% We provide the hook \cmd\set@footnotewidth\
|
|
% that sets the footnote on a particular measure.
|
|
% Some page grids are such as to set a footnote in a context where \cmd\columnwidth
|
|
% is not the right parameter to use for the set width of a footnote.
|
|
% In such a case, for the applicable scope, you should define
|
|
% \cmd\set@footnotewidth\ to perform this job correctly.
|
|
%
|
|
% If we are setting type on multiple page grids, we must still ensure that all footnotes that
|
|
% find their way into the \cmd\footins\ insert register are set on the same width.
|
|
% This implies the need for a document to have an ``overall'' page grid, which determines the set width of all footnotes
|
|
% with the exception of minipage footnotes.
|
|
%
|
|
% In general, remember that footnotes, like all insertions (including floats),
|
|
% are a step outside of the galley context, and all aspects of insertions need to be
|
|
% properly handled, including the set width.
|
|
% \begin{macrocode}
|
|
\def\@makefnmark{%
|
|
\hbox{%
|
|
\@textsuperscript{%
|
|
\normalfont\itshape\@thefnmark
|
|
}%
|
|
}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \begin{macrocode}
|
|
\long\def\@footnotetext{%
|
|
\insert\footins\bgroup
|
|
\make@footnotetext
|
|
}%
|
|
% \end{macrocode}
|
|
% \begin{macrocode}
|
|
\long\def\@mpfootnotetext{%
|
|
\minipagefootnote@pick
|
|
\make@footnotetext
|
|
}%
|
|
% \end{macrocode}
|
|
% Procedure \cmd\make@footnotetext\ sets the footnote \verb+#1+ into type, with the proper
|
|
% font, color, leading, width, and label in effect.
|
|
% It also establishes a strut and null glue at the end of the last paragraph of the footnote;
|
|
% The strut helps compensate for the lack of \cmd\interlineskip\ glue between \cmd\insert s;
|
|
% the glue establishes a feasible \cmd\vsplit\ point between footnotes.
|
|
%
|
|
% Note that in the title block (\classname{ltxfront}), the alternative definition, under the name \cmd\frontmatter@footnotetext, is used.
|
|
% The only material difference there is the reference to \cmd\frontmatter@makefntext\ instead of \cmd\@makefntext.
|
|
%
|
|
% Dependency note: the \cmd\@makefntext\ procedure is used to further process the footnote text
|
|
% and to execute the \cmd\@makefnmark\ procedure to produce the footnote mark.
|
|
% The definition of the former is customarily found in the document class (hereunder that of \filename{article.cls}),
|
|
% the latter in \filename{latex.ltx}. They are as follows:
|
|
% \begin{verbatim}
|
|
%\newcommand\@makefntext[1]{%
|
|
% \parindent 1em\noindent
|
|
% \hb@xt@1.8em{\hss\@makefnmark}%
|
|
% #1%
|
|
%}%
|
|
%\def\@makefnmark{%
|
|
% \hbox{\@textsuperscript{\normalfont\@thefnmark}}%
|
|
%}%
|
|
% \end{verbatim}
|
|
%
|
|
% \changes{4.1n}{2010/01/06}{(AO, 572) title block footnotes numbered independently from body footnotes}%
|
|
% \begin{macrocode}
|
|
\long\def\make@footnotetext#1{%
|
|
\set@footnotefont
|
|
% \end{macrocode}
|
|
% As noted above, we do \emph{not} do \cmd\floatingpenalty\ \cmd\@MM, as in standard \LaTeX.
|
|
% \begin{macrocode}
|
|
\set@footnotewidth
|
|
\@parboxrestore
|
|
\protected@edef\@currentlabel{%
|
|
% \end{macrocode}
|
|
% Note that we employ \cmd\@mpfn\ as a level of redirection for the footnotecounter.
|
|
% \begin{macrocode}
|
|
\csname p@\@mpfn\endcsname\@thefnmark
|
|
}%
|
|
\color@begingroup
|
|
\@makefntext{%
|
|
\rule\z@\footnotesep\ignorespaces#1%
|
|
% \end{macrocode}
|
|
% \changes{4.1n}{2010/01/02}{(AO, 571) allow split after last line of footnote}%
|
|
% The following strut and glue are for spacing and splitting, as mentioned above.
|
|
% \begin{macrocode}
|
|
\@finalstrut\strutbox\vadjust{\vskip\z@skip}%
|
|
}%
|
|
\color@endgroup
|
|
\minipagefootnote@drop
|
|
}%
|
|
% \end{macrocode}
|
|
% \changes{4.1f}{2009/07/07}{(AO, 515) Hook for setting the font of a footnote}
|
|
% \cmd\set@footnotefont\ is the procedure for setting the font of a footnote.
|
|
% Other aspects of the environment may be set using this hook.
|
|
% \begin{macrocode}
|
|
\def\set@footnotefont{%
|
|
\reset@font\footnotesize
|
|
\interlinepenalty\interfootnotelinepenalty
|
|
\splittopskip\footnotesep
|
|
\splitmaxdepth\dp\strutbox
|
|
}%
|
|
% \end{macrocode}
|
|
% \cmd\set@footnotewidth\ is the procedure for setting the width of a footnote.
|
|
% The default page grid, a single, full-width column, sets footnotes on the width of the text.
|
|
% \changes{4.1n}{2010/01/02}{(AO, 571) Interface \cs{set@footnotewidth} for determining the set width of footnotes}%
|
|
% \begin{macrocode}
|
|
\def\set@footnotewidth{\set@footnotewidth@one}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Floats}
|
|
%
|
|
% \subsubsection{Usage notes}%
|
|
% We extend the \LaTeX\ kernel for three purposes:
|
|
% \begin{enumerate}
|
|
%
|
|
% \item
|
|
% When the \cmd\footnote\ command is used within the
|
|
% scope of a float, we do as \env{minipage} does.
|
|
%
|
|
% \item
|
|
% We provide a mechanism to write floats out to an external
|
|
% stream for temporary storage (deferred floats).
|
|
%
|
|
% \item
|
|
% We provide mechanism for placing a float \texttt{here}
|
|
% invariably, that is, floats are unfloated.
|
|
% This mechanism is used to read the external stream mentioned above.
|
|
%
|
|
% \end{enumerate}
|
|
%
|
|
% To use these mechanisms, the document class should
|
|
% define a float, say, \env{figure} as per usual, and in addition:
|
|
% \begin{enumerate}
|
|
%
|
|
% \item
|
|
% Optionally define an alternative, say \env{figure@write} as follows:
|
|
% \begin{verbatim}\newenvironment{figure@write}{%
|
|
% \write@float{figure}%
|
|
%}{%
|
|
% \endwrite@float
|
|
%}\end{verbatim}
|
|
% That is, the alternative environment executes \cmd\write@float\
|
|
% instead of \cmd\@float.
|
|
% Note that this step is not needed if the float environment
|
|
% is defined in the simple way of \file{classes.dtx}.
|
|
% However, an environment like \env{longtable} will require it.
|
|
%
|
|
% \item
|
|
% Install into \cmd\AtBeginDocument\ a call to \cmd\do@if@floats,
|
|
% with the float name and an appropriate file extension as its arguments.
|
|
% \begin{verbatim}\appdef\class@documenthook{\do@if@floats{figure}{.fgx}}\end{verbatim}
|
|
%
|
|
% \item
|
|
% Optionally define a text entity \cmd\figuresname\ that will
|
|
% be the text of the head that is set over the
|
|
% deferred floats.
|
|
% If not defined, there will be no head.
|
|
%
|
|
% \item
|
|
% Optionally define a user-level command to allow
|
|
% the document to determine where the figures are printed out
|
|
% (default is to print at end of document). E.g.,
|
|
% \begin{verbatim}\newcommand\printfigures{\print@float{figure}}\end{verbatim}
|
|
% \item
|
|
% Install into \cmd\appdef\cmd\class@enddocumenthook\ a call to \cmd\printfigures,
|
|
% or, if the latter is not defined, as follows:
|
|
% \begin{verbatim}\appdef\class@enddocumenthook{\print@float{figure}}\end{verbatim}
|
|
% Note that installing this command into \cmd\AtBeginDocument
|
|
% is best done earlier than calls that assume the last page of
|
|
% the document is at hand.
|
|
%
|
|
% \end{enumerate}
|
|
%
|
|
% \subsubsection{Robustifying fragile commands}%
|
|
% Certain of \LaTeX's commands cannot be written out to a file or appear within a \cmd\mark\ command argument
|
|
% because they do calculations during expansion.
|
|
% We provide for a little help, but without changing the meanings of these commands.
|
|
%
|
|
% \begin{macro}{\addtocontents}
|
|
% \begin{macro}{\robustify@contents}
|
|
%
|
|
% \changes{4.1a}{2008/06/30}{(AO) Make \cs{addtocontents} a \cs{long} \cs{def}; gobble up \cs{footnote}}%
|
|
% \begin{macrocode}
|
|
\def\robustify@contents{%
|
|
\let \label \@gobble
|
|
\let \index \@gobble
|
|
\let \glossary \@gobble
|
|
\let\footnote \@gobble
|
|
\def\({\string\(}%
|
|
\def\){\string\)}%
|
|
\def\\{\string\\}%
|
|
}%
|
|
\long\def\addtocontents#1#2{%
|
|
\protected@write\@auxout{\robustify@contents}{\string \@writefile {#1}{#2}}%
|
|
}%
|
|
% \end{macrocode}
|
|
%
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \subsubsection{Preparing for the \classname{hyperref package}}%
|
|
%
|
|
% \begin{macro}{\addcontentsline}
|
|
% \begin{macro}{\label}
|
|
% \begin{macro}{\ltx@contentsline}
|
|
% \changes{4.1b}{2008/08/12}{Refine toc processing: provide default.}%
|
|
% The \classname{hyperref} package assumes that the \cmd\contentsline\ command will be given four arguments.
|
|
% Therefore it cannot successfully process a \filename{.toc} file that had been written by standard \LaTeX.
|
|
% We fix things up by always writing that fourth argument and by supplying a \cmd\contentsline\ command that
|
|
% can read them.
|
|
%
|
|
% We also give the \cmd\newlabel\ command's second argument five tokens.
|
|
%
|
|
% Finally, we wrap \LaTeX's \cmd\contentsline\ command with code to detect the case
|
|
% where the expected procedure is not defined, and we give it a syntax with no semantics.
|
|
%
|
|
% We switch over to this new definition only after \classname{hyperref} has loaded.
|
|
% \begin{macrocode}
|
|
\def\addcontentsline#1#2#3{%
|
|
\addtocontents{#1}{%
|
|
\protect\contentsline{#2}{#3}{\thepage}{}%
|
|
}%
|
|
}%
|
|
\def\label#1{%
|
|
\@bsphack
|
|
\protected@write\@auxout{}{%
|
|
\string\newlabel{#1}{{\@currentlabel}{\thepage}{}{}{}}%
|
|
}%
|
|
\@esphack
|
|
}%
|
|
\def\ltx@contentsline#1{%
|
|
\expandafter\@ifnotrelax\csname l@#1\endcsname{}{%
|
|
\expandafter\let\csname l@#1\endcsname\@gobbletwo
|
|
}%
|
|
\contentsline@latex{#1}%
|
|
}%
|
|
\appdef\document@inithook{%
|
|
\let\contentsline@latex\contentsline
|
|
\let\contentsline\ltx@contentsline
|
|
}%
|
|
% \end{macrocode}
|
|
%
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \subsubsection{Footnotes within floats, unfloating floats, float font}%
|
|
%
|
|
% \begin{macro}{\caption}
|
|
% DPC: Er a bit of a hack, but seems best way of supporting normal
|
|
% \LaTeX\ syntax at this point: If a caption is used below a table,
|
|
% then put out the footnotes before the caption.
|
|
% \changes{4.0b}{1999/06/20}{Support the hack with \cs{prepdef}, and delay until \cs{AtBeginDocument} time, since \classname{hyperref} clobbers \cs{caption}.}
|
|
% \begin{macrocode}
|
|
\appdef\class@documenthook{%
|
|
\prepdef\caption{\minipagefootnote@here}%
|
|
}%
|
|
% \end{macrocode}
|
|
%
|
|
% Note on \classname{hyperref} compatibility:
|
|
% this change to the \cmd\caption\ command is compatible with the
|
|
% ``Automated \LaTeX\ hypertext cross-references'' patches of that package.
|
|
%
|
|
% All the same, I think Sebastian's changes to \cmd\caption\ and \cmd\@caption\
|
|
% could bear with some improvement.
|
|
% The following implementation requires knowing only the pattern part of the
|
|
% \cmd\@caption\ macro:
|
|
%\begin{verbatim}
|
|
%\def\caption{%
|
|
% \H@refstepcounter\@captype
|
|
% \hyper@makecurrent{\@captype}%
|
|
% \@dblarg{\H@caption\@captype}%
|
|
%}%
|
|
%\def\H@caption#1[#2]#3{%
|
|
% \@caption{#1}[#2]{%
|
|
% \ifHy@nesting
|
|
% \hyper@@anchor{\@currentHref}{#3}%
|
|
% \else
|
|
% \hyper@@anchor{\@currentHref}{\relax}#3%
|
|
% \fi
|
|
% }%
|
|
%}\end{verbatim}
|
|
%
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\minipagefootnote@init}
|
|
% \begin{macro}{\minipagefootnote@here}
|
|
% \begin{macro}{\minipagefootnote@foot}
|
|
% \begin{macro}{\minipagefootnote@pick}
|
|
% \begin{macro}{\minipagefootnote@drop}
|
|
% Procedure to deal with footnotes accumulated within a minipage environment.
|
|
% These procedures encapsulate all uses of the \cmd\@mpfootins\ box.
|
|
%
|
|
%
|
|
% Note: \cmd\minipagefootnote@here\ must \emph{not} be executed within the MVL!
|
|
% \begin{macrocode}
|
|
\def\minipagefootnote@init{%
|
|
\setbox\@mpfootins\box\voidb@x
|
|
}%
|
|
\def\minipagefootnote@pick{%
|
|
\global\setbox\@mpfootins\vbox\bgroup
|
|
\unvbox\@mpfootins
|
|
}%
|
|
\def\minipagefootnote@drop{%
|
|
\egroup
|
|
}%
|
|
\def\minipagefootnote@here{%
|
|
\par
|
|
\@ifvoid\@mpfootins{}{%
|
|
\vskip\skip\@mpfootins
|
|
\fullinterlineskip
|
|
\@ifinner{%
|
|
\vtop{\unvcopy\@mpfootins}%
|
|
{\setbox\z@\lastbox}%
|
|
}{}%
|
|
\unvbox\@mpfootins
|
|
}%
|
|
}%
|
|
\def\minipagefootnote@foot{%
|
|
\@ifvoid\@mpfootins{}{%
|
|
\insert\footins\bgroup\unvbox\@mpfootins\egroup
|
|
}%
|
|
}%
|
|
\def\endminipage{%
|
|
\par
|
|
\unskip
|
|
\minipagefootnote@here
|
|
\@minipagefalse %% added 24 May 89
|
|
\color@endgroup
|
|
\egroup
|
|
\expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\floats@sw}
|
|
% \changes{4.1b}{2008/08/12}{Default assignment of \cs{float@sw} now, not at \cs{AtBeginDocument} time.}%
|
|
% The Boolean \cmd\floats@sw\ signifies that floats are to be floated;
|
|
% if false, that floats are to be deferred to the end of the document.
|
|
% Note that the assignment of this Boolean is to be overridden by
|
|
% the document class in response to user-selected options.
|
|
% \begin{macrocode}
|
|
\@booleantrue\floats@sw
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@xfloat}
|
|
% \begin{macro}{\@mpmakefntext}
|
|
% The float start-code is redefined to set up footnotes in the style of minipage.
|
|
% Also, the \cmd\floats@sw\ Boolean informs us that floats are to be
|
|
% all placed \texttt{here}.
|
|
% Note that, to protect against the Boolean being undefined
|
|
% at this late hour, we default it globally to true.
|
|
%
|
|
% \changes{4.0b}{1999/06/20}{AO: Removed superfluous \cs{def}s, changed to using \cs{floats@sw} as the flag. Also stopped using DPC's \cs{if@twocolumn} flag: using \cs{floats@sw} instead. Also added \cs{par}\cs{vskip}\cs{z@skip} after the \cs{minipagefootnotes} so that the float box would have zero depth like the kernel one. }
|
|
% \changes{4.0c}{1999/11/13}{(AO, 110) Install hooks for endfloats processing}
|
|
% \changes{4.0d}{2000/04/10}{(AO, 127) Floats placed [h] to allow page breaks}
|
|
% \changes{4.0d}{2000/05/19}{(AO, 224) Hyperref compatibility.}
|
|
% \changes{4.0e}{2000/11/16}{(AO, 221) Remove samepage command from @xfloat@prep: If the float can break over pages, we want better control.}
|
|
% \changes{4.1a}{2008/07/07}{\cs{@xfloat@prep} calls \cs{ltx@footnote@pop} to restore the original \cs{ltx@footmark} and \cs{ltx@foottext} procedures, in case footnote processing has switched.}
|
|
% \changes{4.1b}{2008/08/12}{No need to protect against undefined \cs{float@sw}}
|
|
%
|
|
% \begin{macrocode}
|
|
\let\@xfloat@LaTeX\@xfloat
|
|
\def\@xfloat#1[#2]{%
|
|
\@xfloat@prep
|
|
\@nameuse{fp@proc@#2}%
|
|
\floats@sw{\@xfloat@LaTeX{#1}[#2]}{\@xfloat@anchored{#1}[]}%
|
|
}%
|
|
\def\@xfloat@prep{%
|
|
\ltx@footnote@pop
|
|
\def\@mpfn{mpfootnote}%
|
|
\def\thempfn{\thempfootnote}%
|
|
\c@mpfootnote\z@
|
|
\let\H@@footnotetext\H@@mpfootnotetext
|
|
}%
|
|
\let\ltx@footnote@pop\@empty
|
|
\def\@xfloat@anchored#1[#2]{%
|
|
\def\@captype{#1}%
|
|
\begin@float@pagebreak
|
|
\let\end@float\end@float@anchored
|
|
\let\end@dblfloat\end@float@anchored
|
|
\hsize\columnwidth
|
|
\@parboxrestore
|
|
\@floatboxreset
|
|
\minipagefootnote@init
|
|
}%
|
|
\def\end@float@anchored{%
|
|
\minipagefootnote@here
|
|
\par\vskip\z@skip
|
|
\par
|
|
\end@float@pagebreak
|
|
}%
|
|
\def\begin@float@pagebreak{\par\addvspace\intextsep}%
|
|
\def\end@float@pagebreak{\par\addvspace\intextsep}%
|
|
\def\@mpmakefntext#1{%
|
|
\parindent=1em
|
|
\noindent
|
|
\hb@xt@1em{\hss\@makefnmark}%
|
|
#1%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsubsection{Writing floats out to a file}%
|
|
%
|
|
% \begin{macro}{\do@if@floats}
|
|
% \changes{4.1b}{2008/08/12}{No need to protect against undefined \cs{float@sw}}
|
|
% The procedure \cmd\do@if@floats\ should be executed at
|
|
% \cmd\class@documenthook\ time: it arranges to write out
|
|
% the floats of the given class to a temporary file, to be
|
|
% read back later (deferred floats),
|
|
% given that \cmd\floats@sw\ is false.
|
|
% Note that, to protect against the Boolean being undefined
|
|
% at this late hour, we default it globally to true.
|
|
% \begin{macrocode}
|
|
\def\do@if@floats#1#2{%
|
|
\floats@sw{}{%
|
|
% \end{macrocode}
|
|
% Open the stream to save out the document's floats of this class.
|
|
% \begin{macrocode}
|
|
\expandafter\newwrite
|
|
\csname#1write\endcsname
|
|
\expandafter\def
|
|
\csname#1@stream\endcsname{\jobname#2}%
|
|
\expandafter\immediate
|
|
\expandafter\openout
|
|
\csname#1write\endcsname
|
|
\csname#1@stream\endcsname\relax
|
|
% \end{macrocode}
|
|
% Swap environments.
|
|
% If the class writer has defined, e.g., \env{figure@write},
|
|
% then we use this as the procedure to execute for writing
|
|
% the float out to the external stream.
|
|
% Otherwise, the replacement of \cmd\@float\ by \cmd\write@float\
|
|
% should do the right thing for float environments defined
|
|
% in the simple way of \classname{classes.dtx}.
|
|
% \begin{macrocode}
|
|
\@ifxundefined\@float@LaTeX{%
|
|
\let\@float@LaTeX\@float
|
|
\let\@dblfloat@LaTeX\@dblfloat
|
|
\let\@float\write@float
|
|
\let\@dblfloat\write@floats
|
|
}{}%
|
|
\let@environment{#1@float}{#1}%
|
|
\let@environment{#1@floats}{#1*}%
|
|
\@ifxundefined@cs{#1@write}{}{%
|
|
\let@environment{#1}{#1@write}%
|
|
}%
|
|
}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\print@float}
|
|
% The procedure \cmd\print@float\ prints out the
|
|
% deferred floats.
|
|
% \changes{4.0b}{1999/06/20}{only execute if there really were floats of the given type}
|
|
% \changes{4.0c}{1999/11/13}{*-form mandates pagebreak at each float; only print section head if there is something there.}
|
|
% \changes{4.0d}{2000/05/23}{Allow things to break over pages by setting array@default.}
|
|
% \changes{4.1b}{2008/08/12}{If class option \classoption{lengthcheck} is in effect, log the height of this float class.}
|
|
%
|
|
% Here, we make use of the \cmd\floats@sw\ Boolean to select
|
|
% the non-floating type of processing.
|
|
% \begin{macrocode}
|
|
\def\triggerpar{\leavevmode\@@par}%
|
|
\def\oneapage{\def\begin@float@pagebreak{\newpage}\def\end@float@pagebreak{\newpage}}%
|
|
\def\print@float#1#2{%
|
|
\lengthcheck@sw{%
|
|
\total@float{#1}%
|
|
}{}%
|
|
\@ifxundefined@cs{#1write}{}{%
|
|
\begingroup
|
|
\@booleanfalse\floats@sw
|
|
#2%
|
|
\raggedbottom
|
|
\def\array@default{v}% floats must
|
|
\let\@float\@float@LaTeX
|
|
\let\@dblfloat\@dblfloat@LaTeX
|
|
\let\trigger@float@par\triggerpar
|
|
\let@environment{#1}{#1@float}%
|
|
\let@environment{#1*}{#1@floats}%
|
|
\expandafter\prepdef\csname#1\endcsname{\trigger@float@par}%
|
|
\expandafter\prepdef\csname#1*\endcsname{\trigger@float@par}%
|
|
\@namedef{fps@#1}{h!}%
|
|
\expandafter\immediate
|
|
\expandafter\closeout
|
|
\csname#1write\endcsname
|
|
\everypar{%
|
|
\global\let\trigger@float@par\relax
|
|
\global\everypar{}\setbox\z@\lastbox
|
|
\@ifxundefined@cs{#1sname}{}{%
|
|
\begin@float@pagebreak
|
|
\expandafter\section
|
|
\expandafter*%
|
|
\expandafter{%
|
|
\csname#1sname\endcsname
|
|
}%
|
|
}%
|
|
}%
|
|
\input{\csname#1@stream\endcsname}%
|
|
\endgroup
|
|
\global\expandafter\let\csname#1write\endcsname\relax
|
|
}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\tally@float}
|
|
% \begin{macro}{\total@float}
|
|
% \changes{4.1b}{2008/08/12}{Tally and log the height of a float class}
|
|
% If we are tallying column inches, \cmd\tally@float\ tallies a contribution to \cmd\ftype@\ \cmd\@captype,
|
|
% depending upon the width of \cmd\@currbox.
|
|
% In effect, each float class is tallied in two sections, one for narrow, one for wide floats.
|
|
%
|
|
% If statistics are wanted, \cmd\total@float\ logs the tally for the given float class.
|
|
% \changes{4.1f}{2009/07/10}{(AO, 518) Tally register overflow when locument is long}
|
|
% The quantity \cmd\@twopowerfourteen\ is $2^{14}$, \cmd\@twopowertwo\ is $2^{2}$.
|
|
% \begin{macrocode}
|
|
\chardef\@xvi=16\relax
|
|
\mathchardef\@twopowerfourteen="4000
|
|
\mathchardef\@twopowertwo="4
|
|
\def\tally@float#1{%
|
|
\begingroup
|
|
% \end{macrocode}
|
|
% We strip all but the least significant 5 bits from \cmd\count\ \cmd\@currbox,
|
|
% and put them into \cmd\@tempcnta. We then subtract 16 from \cmd\count\ \cmd\@currbox
|
|
% (unless this would make it negative), effectively reversing the process
|
|
% carried out in \cmd\@float.
|
|
% \begin{macrocode}
|
|
\@tempcnta\count\@currbox
|
|
\divide\@tempcnta\@xxxii
|
|
\multiply\@tempcnta\@xxxii
|
|
\advance\count\@currbox-\@tempcnta
|
|
\divide\@tempcnta\@xxxii
|
|
\@ifnum{\count\@currbox>\@xvi}{%
|
|
\advance\count\@currbox-\@xvi\@booleantrue\@temp@sw
|
|
}{%
|
|
\@booleanfalse\@temp@sw
|
|
}%
|
|
% \end{macrocode}
|
|
% If so desired, we log the characteristics of this float object:
|
|
% float class and float placement parameters, height, depth, and width.
|
|
% \begin{macrocode}
|
|
\show@box@size@sw{%
|
|
\class@info{Float #1
|
|
(\the\@tempcnta)[\@temp@sw{16+}{}\the\count\@currbox]^^J%
|
|
(\the\ht\@currbox+\the\dp\@currbox)X\the\wd\@currbox
|
|
}%
|
|
}{}%
|
|
\endgroup
|
|
% \end{macrocode}
|
|
% Here we tally the height of this float object.
|
|
% \begin{macrocode}
|
|
\expandafter\let
|
|
\expandafter\@tempa
|
|
\csname fbox@\csname ftype@#1\endcsname\endcsname
|
|
\@ifnotrelax\@tempa{%
|
|
\@ifhbox\@tempa{%
|
|
\setbox\@tempboxa\vbox{\unvcopy\@currbox\hrule}%
|
|
\dimen@\ht\@tempboxa
|
|
\divide\dimen@\@twopowerfourteen
|
|
\@ifdim{\wd\@tempboxa<\textwidth}{%
|
|
\advance\dimen@\ht\@tempa
|
|
\global\ht\@tempa\dimen@
|
|
}{%
|
|
\advance\dimen@\dp\@tempa
|
|
\global\dp\@tempa\dimen@
|
|
}%
|
|
}{}%
|
|
}{}%
|
|
}%
|
|
\def\total@float#1{%
|
|
\expandafter\let
|
|
\expandafter\@tempa
|
|
\csname fbox@\csname ftype@#1\endcsname\endcsname
|
|
\@ifnotrelax\@tempa{%
|
|
\@ifhbox\@tempa{%
|
|
\@tempdima\the\ht\@tempa\divide\@tempdima\@twopowertwo\@tempcnta\@tempdima
|
|
\@tempdimb\the\dp\@tempa\divide\@tempdimb\@twopowertwo\@tempcntb\@tempdimb
|
|
\class@info{Total #1: Column(\the\@tempcnta pt), Page(\the\@tempcnta pt)}%
|
|
}{}%
|
|
}{}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\write@float}
|
|
% \begin{macro}{\write@floats}
|
|
% \begin{macro}{\write@@float}
|
|
% Handles the case where the name of the float is the same as
|
|
% that of the stream. Note that
|
|
% \env{longtable} does \emph{not} fit this case.
|
|
% Note also: \cmd\write@float\ is \emph{not} a user-level environment,
|
|
% therefore it is properly not defined with \cmd\newenvironment.
|
|
% \begin{macrocode}
|
|
\def\write@float#1{\write@@float{#1}{#1}}%
|
|
\def\endwrite@float{\@Esphack}%
|
|
\def\write@floats#1{\write@@float{#1*}{#1}}%
|
|
\def\endwrite@floats{\@Esphack}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\write@@float}
|
|
% \changes{4.0b}{1999/06/20}{AO: Fixed spurious \texttt{CR} and (return) characters in output file. Also, if the document did not have the \cs{end}\texttt{figure} on a line of its own, the macro wouldn't work. Fixed.}
|
|
% \begin{macrocode}
|
|
\def\write@@float#1#2{%
|
|
\ifhmode
|
|
\@bsphack
|
|
\fi
|
|
\chardef\@tempc\csname#2write\endcsname
|
|
\toks@{\begin{#1}}%
|
|
\def\@tempb{#1}%
|
|
\expandafter\let\csname end#1\endcsname\endwrite@float
|
|
\catcode`\^^M\active
|
|
\@makeother\{\@makeother\}\@makeother\%
|
|
\write@floatline
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\write@floatline}
|
|
% \begin{macro}{\@write@floatline}
|
|
% \begin{macro}{\float@end@tag}
|
|
% The procedure \cmd\write@floatline\ only parses;
|
|
% it passes its result to \cmd\@write@floatline, which
|
|
% writes the line to output, then tests the line
|
|
% for the \cmd\end\arg{float} tokens with
|
|
% aid of the \cmd\float@end@tag\ procedure.
|
|
% \begin{macrocode}
|
|
\begingroup
|
|
\catcode`\[\the\catcode`\{\catcode`\]\the\catcode`\}\@makeother\{\@makeother\}%
|
|
\gdef\float@end@tag#1\end{#2}#3\@nul[%
|
|
\def\@tempa[#2]%
|
|
\@ifx[\@tempa\@tempb][\end[#2]][\write@floatline]%
|
|
]%
|
|
\obeylines%
|
|
\gdef\write@floatline#1^^M[%
|
|
\begingroup%
|
|
\newlinechar`\^^M%
|
|
\toks@\expandafter[\the\toks@#1]\immediate\write\@tempc[\the\toks@]%
|
|
\endgroup%
|
|
\toks@[]%
|
|
\float@end@tag#1\end{}\@nul%
|
|
]%
|
|
\endgroup
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
%
|
|
% \subsection{Counters}
|
|
% The following definitions override those of the \LaTeX\ kernel,
|
|
% providing for a greater range of inputs.
|
|
% \begin{macrocode}
|
|
\def\@alph#1{\ifcase#1\or a\or b\or c\or d\else\@ialph{#1}\fi}
|
|
% \end{macrocode}
|
|
%
|
|
% \begin{macrocode}
|
|
\def\@ialph#1{\ifcase#1\or \or \or \or \or e\or f\or g\or h\or i\or j\or
|
|
k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or
|
|
y\or z\or aa\or bb\or cc\or dd\or ee\or ff\or gg\or hh\or ii\or jj\or
|
|
kk\or ll\or mm\or nn\or oo\or pp\or qq\or rr\or ss\or tt\or uu\or
|
|
vv\or ww\or xx\or yy\or zz\else\@ctrerr\fi}
|
|
% \end{macrocode}
|
|
%
|
|
%
|
|
% \subsection{Customization of Sections}%
|
|
%
|
|
% Patch the standard \LaTeX\ sectioning procedure to:
|
|
%\begin{itemize}
|
|
%\item
|
|
% Allow a sectioning command to trigger the title page, or more generally
|
|
% to recognize that it is the first object in the document,
|
|
% so we headpatch \cmd\@startsection.
|
|
%
|
|
%\item
|
|
% Allow a tail command in |#6| to uppercase the title, so we retain
|
|
% DPC's braces.
|
|
%
|
|
%\item
|
|
% Allow each type of sectioning command to format its number differently,
|
|
% so we generalize \cmd\@seccntformat.
|
|
%
|
|
%\item
|
|
% Allow each type of sectioning command to format its argument differently,
|
|
% so we generalize \cmd\@hangfrom.
|
|
%
|
|
%\item
|
|
% Allow the starred form of the command to
|
|
% mark (the running head) and
|
|
% make an entry in the TOC,
|
|
% so we put \cmd\@ssect\ on the same footing as \cmd\@sect.
|
|
%
|
|
% Note that the tokens passed to the TOC now are \emph{not}
|
|
% the optional argument of the command, but the required.
|
|
% This means that the user can no longer use the former
|
|
% to put variant content in to the TOC as the Manual says.
|
|
%
|
|
% Instead, the optional argument is used to put an alternative
|
|
% title into the running headers, a better choice.
|
|
%
|
|
%\end{itemize}
|
|
%
|
|
% \begin{macro}{\@startsection}
|
|
% Patch a head hook into the basic sectioning command.
|
|
% Treat \cmd\@sect\ and \cmd\@ssect\ on an equal footing:
|
|
% now their pattern parts are identical.
|
|
% \begin{macrocode}
|
|
\def\@startsection#1#2#3#4#5#6{%
|
|
\@startsection@hook
|
|
\if@noskipsec \leavevmode \fi
|
|
\par
|
|
\@tempskipa #4\relax
|
|
\@afterindenttrue
|
|
\ifdim \@tempskipa <\z@
|
|
\@tempskipa -\@tempskipa \@afterindentfalse
|
|
\fi
|
|
\if@nobreak
|
|
\everypar{}%
|
|
\else
|
|
\addpenalty\@secpenalty\addvspace\@tempskipa
|
|
\fi
|
|
\@ifstar
|
|
{\@dblarg{\@ssect@ltx{#1}{#2}{#3}{#4}{#5}{#6}}}%
|
|
{\@dblarg{\@sect@ltx {#1}{#2}{#3}{#4}{#5}{#6}}}%
|
|
}%
|
|
\def\@startsection@hook{}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@sect}
|
|
% When defining \cmd\@svsec, do not expand \cmd\@seccntformat.
|
|
% Put brace characters back where they were before David Carlisle got at them
|
|
% (i.e., as if \cmd\@hangfrom\ had two arguments).
|
|
% Protect the mark mechanism from an undefined meaning.
|
|
% Pass |#8| to the TOC instead of |#7|.
|
|
% Remove \cmd\relax\ from the replacement part of \cmd\@svsec.
|
|
%
|
|
% The procedure \cmd\@hangfrom\ and \cmd\@runin@to\ can
|
|
% be used to process the argument of the head.
|
|
% The head can define, e.g., \cmd\@hangfrom@section, to
|
|
% do its own processing.
|
|
%
|
|
% In using \cmd\H@refstepcounter\ in place of \cmd\refstepcounter\ we rely on
|
|
% either loading before any package that patches the latter, or
|
|
% the convention that the former is the original \LaTeX\ procedure.
|
|
%
|
|
% \begin{macrocode}
|
|
\class@info{Repairing broken LateX \string\@sect}%
|
|
\def\@sect@ltx#1#2#3#4#5#6[#7]#8{%
|
|
\@ifnum{#2>\c@secnumdepth}{%
|
|
\def\H@svsec{\phantomsection}%
|
|
\let\@svsec\@empty
|
|
}{%
|
|
\H@refstepcounter{#1}%
|
|
\def\H@svsec{%
|
|
\phantomsection
|
|
}%
|
|
\protected@edef\@svsec{{#1}}%
|
|
\@ifundefined{@#1cntformat}{%
|
|
\prepdef\@svsec\@seccntformat
|
|
}{%
|
|
\expandafter\prepdef
|
|
\expandafter\@svsec
|
|
\csname @#1cntformat\endcsname
|
|
}%
|
|
}%
|
|
\@tempskipa #5\relax
|
|
\@ifdim{\@tempskipa>\z@}{%
|
|
\begingroup
|
|
\interlinepenalty \@M
|
|
#6{%
|
|
\@ifundefined{@hangfrom@#1}{\@hang@from}{\csname @hangfrom@#1\endcsname}%
|
|
{\hskip#3\relax\H@svsec}{\@svsec}{#8}%
|
|
}%
|
|
\@@par
|
|
\endgroup
|
|
\@ifundefined{#1mark}{\@gobble}{\csname #1mark\endcsname}{#7}%
|
|
\addcontentsline{toc}{#1}{%
|
|
\@ifnum{#2>\c@secnumdepth}{%
|
|
\protect\numberline{}%
|
|
}{%
|
|
\protect\numberline{\csname the#1\endcsname}%
|
|
}%
|
|
#8}%
|
|
}{%
|
|
\def\@svsechd{%
|
|
#6{%
|
|
\@ifundefined{@runin@to@#1}{\@runin@to}{\csname @runin@to@#1\endcsname}%
|
|
{\hskip#3\relax\H@svsec}{\@svsec}{#8}%
|
|
}%
|
|
\@ifundefined{#1mark}{\@gobble}{\csname #1mark\endcsname}{#7}%
|
|
\addcontentsline{toc}{#1}{%
|
|
\@ifnum{#2>\c@secnumdepth}{%
|
|
\protect\numberline{}%
|
|
}{%
|
|
\protect\numberline{\csname the#1\endcsname}%
|
|
}%
|
|
#8}%
|
|
}%
|
|
}%
|
|
\@xsect{#5}%
|
|
}%
|
|
\def\@hang@from#1#2#3{\@hangfrom{#1#2}#3}%
|
|
\def\@runin@to #1#2#3{#1#2#3}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@ssect}
|
|
% Put brace characters back where they were before David Carlisle got at them
|
|
% (as if \cmd\@hangfrom\ has two arguments).
|
|
% Possibly set a mark.
|
|
% Make a TOC entry.
|
|
%
|
|
% Note that, for compatibility with the \classname{hyperref} package, we
|
|
% need to provide the interface required by that package
|
|
% (actually required by \file{pdfmark.def} and \file{nameref.sty}),
|
|
% namely
|
|
% the definition of \cmd\@currentlabelname\ (but now removed),
|
|
% the insertion of the procedure \cmd\Sectionformat\ (but why is this needed?), and
|
|
% the call to \cmd\phantomsection\ (which must precede the call to \cmd\addcontentsline).
|
|
% We also have to sidestep the patch to \cmd\@ssect\ in that same file, therefore
|
|
% we use a different control sequence name in the call from \cmd\@startsection.
|
|
% \changes{4.0c}{1999/11/13}{(AO, 116) Hyperref compatibility}
|
|
% \changes{4.0f}{2001/07/13}{(AO, 404) Hyperref compatibility}
|
|
% \begin{macrocode}
|
|
\def\@ssect@ltx#1#2#3#4#5#6[#7]#8{%
|
|
% \end{macrocode}
|
|
% Removed |\def\@currentlabelname{#8}|
|
|
% \begin{macrocode}
|
|
\def\H@svsec{\phantomsection}%
|
|
\@tempskipa #5\relax
|
|
\@ifdim{\@tempskipa>\z@}{%
|
|
\begingroup
|
|
\interlinepenalty \@M
|
|
#6{%
|
|
\@ifundefined{@hangfroms@#1}{\@hang@froms}{\csname @hangfroms@#1\endcsname}%
|
|
% \end{macrocode}
|
|
% Removed |{\hskip#3\relax\H@svsec}{\Sectionformat{#8}{#1}}|
|
|
% \begin{macrocode}
|
|
{\hskip#3\relax\H@svsec}{#8}%
|
|
}%
|
|
\@@par
|
|
\endgroup
|
|
\@ifundefined{#1smark}{\@gobble}{\csname #1smark\endcsname}{#7}%
|
|
\addcontentsline{toc}{#1}{\protect\numberline{}#8}%
|
|
}{%
|
|
\def\@svsechd{%
|
|
#6{%
|
|
\@ifundefined{@runin@tos@#1}{\@runin@tos}{\csname @runin@tos@#1\endcsname}%
|
|
% \end{macrocode}
|
|
% Removed |{\hskip#3\relax\H@svsec}{\Sectionformat{#8}{#1}}|
|
|
% \begin{macrocode}
|
|
{\hskip#3\relax\H@svsec}{#8}%
|
|
}%
|
|
\@ifundefined{#1smark}{\@gobble}{\csname #1smark\endcsname}{#7}%
|
|
\addcontentsline{toc}{#1}{\protect\numberline{}#8}%
|
|
}%
|
|
}%
|
|
\@xsect{#5}%
|
|
}%
|
|
\def\@hang@froms#1#2{#1#2}%
|
|
\def\@runin@tos #1#2{#1#2}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\init@hyperref}
|
|
% \changes{4.1b}{2008/08/12}{Acquire \classname{hyperref} savoire}
|
|
% Document classes that incorporate this package will be \classname{hyperref}-savvy.
|
|
% (To accomplish this, we ensure that \cmd\hyperanchor\ and \cmd\hyper@last\ are both defined.)
|
|
% Being \classname{hyperref}-savvy levels some requirements on us, but the benefits are many.
|
|
%
|
|
% One is that the TOC will not get amnesia and require a full set of three typesetting runs before its formatting is stable.
|
|
% Instead, only two runs are required: the first updates the auxiliary file, the second the TOC.
|
|
% However, the formatting of the document does not change.
|
|
%
|
|
% Another aspect of being \classname{hyperref}-savvy is that the syntax of commands in the \file{.aux} file will not change
|
|
% if \classname{hyperref} is turned on or off.
|
|
%
|
|
% Note that \cmd\hyper@anchorstart\ and \cmd\hyper@anchorend\ constitute the programming interface
|
|
% for a hypertext anchor (the target of a hypertext link); \cmd\hyper@linkstart\ and \cmd\hyper@linkend\
|
|
% are the interface for a hypertext link.
|
|
% \begin{macrocode}
|
|
\def\init@hyperref{%
|
|
\providecommand\phantomsection{}%
|
|
\providecommand\hyper@makecurrent[1]{}%
|
|
\providecommand\Hy@raisedlink[1]{}%
|
|
\providecommand\hyper@anchorstart[1]{}%
|
|
\providecommand\hyper@anchorend{}%
|
|
\providecommand\hyper@linkstart[2]{}%
|
|
\providecommand\hyper@linkend{}%
|
|
\providecommand\@currentHref{}%
|
|
}%
|
|
\let\H@refstepcounter\refstepcounter
|
|
\appdef\document@inithook{%
|
|
\init@hyperref
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\sec@upcase}
|
|
% Upper case for sections (optional upper case items). These are
|
|
% created so that some headings can be toggled between mixed case and
|
|
% upper case readily.
|
|
% Headings that might be changed can be wrapped in the style file in
|
|
% \cmd\sec@upcase\arg{text} constructs;
|
|
% the expansion of \cmd\sec@upcase\ is
|
|
% controlled here. It is \cmd\relax\ by default (mixed case heads), and
|
|
% can easily be changed to \cmd\uppercase\ if desired.
|
|
% If mixed-case headings are wanted by the editor, authors {\em must}
|
|
% supply mixed case text, although this is what authors should be doing
|
|
% anyway.
|
|
% (Mixed can be converted to upper,
|
|
% but the reverse transformation cannot be automated.)
|
|
%
|
|
% The following setting gives the \LaTeX\ default.
|
|
% \begin{macrocode}
|
|
\def\sec@upcase#1{\relax{#1}}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Patch the \env{tabular} and \env{array} Environments}
|
|
%
|
|
% \begin{macro}{\endtabular}
|
|
% \begin{macro}{\endarray}
|
|
% \changes{4.1b}{2008/08/12}{Patch the array package even later: after all package patches go in.}
|
|
% We headpatch the begin processing and tailpatch the end processing
|
|
% of the \env{tabular} and \env{array} environments.
|
|
% A document class can define these hooks as needed.
|
|
%
|
|
% We proceed with care to make further patches to
|
|
% support tabulars that break over pages.
|
|
% Our patches will not necessarily be effective for
|
|
% other packages that replace the \LaTeX\ \env{array} and \env{tabular}
|
|
% environments. I know of none that do so.
|
|
% \begin{macrocode}
|
|
\appdef\document@inithook{%
|
|
\@ifpackageloaded{array}{\switch@array}{\switch@tabular}%
|
|
\prepdef\endtabular{\endtabular@hook}%
|
|
\@provide\endtabular@hook{}%
|
|
\prepdef\endarray{\endarray@hook}%
|
|
\@provide\endarray@hook{}%
|
|
\providecommand\array@hook{}%
|
|
% \end{macrocode}
|
|
% Install, effectively, a head patch to \cmd\tabular.
|
|
% In order to avoid interference from, e.g., the \classname{array} package,
|
|
% we must perform this patch only \emph{after} packages load.
|
|
% \changes{4.0c}{1999/11/13}{(AO, 130) Interference from array package}
|
|
% \begin{macrocode}
|
|
\prepdef\@tabular{\tabular@hook}%
|
|
\@provide\tabular@hook{}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\switch@tabular}
|
|
% \begin{macro}{\switch@array}
|
|
% The two procedures \cmd\switch@tabular\ and \cmd\switch@array\
|
|
% apply needed patches to the various tabular procedures,
|
|
% the former applying to the \LaTeX\ kernel, the latter to the
|
|
% required \classname{array} package (and to the number of other
|
|
% required packages that load it).
|
|
%
|
|
% \begin{macrocode}
|
|
\def\switch@tabular{%
|
|
\let\@array@sw\@array@sw@array
|
|
\@ifx{\@array\@array@LaTeX}{%
|
|
\@ifx{\multicolumn\multicolumn@LaTeX}{%
|
|
\@ifx{\@tabular\@tabular@LaTeX}{%
|
|
\@ifx{\@tabarray\@tabarray@LaTeX}{%
|
|
\@ifx{\array\array@LaTeX}{%
|
|
\@ifx{\endarray\endarray@LaTeX}{%
|
|
\@ifx{\endtabular\endtabular@LaTeX}{%
|
|
\@ifx{\@mkpream\@mkpream@LaTeX}{%
|
|
\@ifx{\@addamp\@addamp@LaTeX}{%
|
|
\@ifx{\@arrayacol\@arrayacol@LaTeX}{%
|
|
\@ifx{\@tabacol\@tabacol@LaTeX}{%
|
|
\@ifx{\@arrayclassz\@arrayclassz@LaTeX}{%
|
|
\@ifx{\@tabclassiv\@tabclassiv@LaTeX}{%
|
|
\@ifx{\@arrayclassiv\@arrayclassiv@LaTeX}{%
|
|
\@ifx{\@tabclassz\@tabclassz@LaTeX}{%
|
|
\@ifx{\@classv\@classv@LaTeX}{%
|
|
\@ifx{\hline\hline@LaTeX}{%
|
|
\@ifx{\@tabularcr\@tabularcr@LaTeX}{%
|
|
\@ifx{\@xtabularcr\@xtabularcr@LaTeX}{%
|
|
\@ifx{\@xargarraycr\@xargarraycr@LaTeX}{%
|
|
\@ifx{\@yargarraycr\@yargarraycr@LaTeX}{%
|
|
\true@sw
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
{%
|
|
\class@info{Patching LaTeX tabular.}%
|
|
}{%
|
|
\class@info{Unrecognized LaTeX tabular. Please update this document class! (Proceeding with fingers crossed.)}%
|
|
}%
|
|
\let\@array\@array@ltx
|
|
\let\multicolumn\multicolumn@ltx
|
|
\let\@tabular\@tabular@ltx
|
|
\let\@tabarray\@tabarray@ltx
|
|
\let\array\array@ltx
|
|
\let\endarray\endarray@ltx
|
|
\let\endtabular\endtabular@ltx
|
|
\let\@mkpream\@mkpream@ltx
|
|
\let\@addamp\@addamp@ltx
|
|
\let\@arrayacol\@arrayacol@ltx
|
|
\let\@tabacol\@tabacol@ltx
|
|
\let\@arrayclassz\@arrayclassz@ltx
|
|
\let\@tabclassiv\@tabclassiv@ltx
|
|
\let\@arrayclassiv\@arrayclassiv@ltx
|
|
\let\@tabclassz\@tabclassz@ltx
|
|
\let\@classv\@classv@ltx
|
|
\let\hline\hline@ltx
|
|
\let\@tabularcr\@tabularcr@ltx
|
|
\let\@xtabularcr\@xtabularcr@ltx
|
|
\let\@xargarraycr\@xargarraycr@ltx
|
|
\let\@yargarraycr\@yargarraycr@ltx
|
|
}%
|
|
% \end{macrocode}
|
|
% \changes{4.1b}{2008/08/12}{(AO, 505) Try to accommodate \classname{colortbl}.}
|
|
% \begin{macrocode}
|
|
\def\switch@array{%
|
|
\@ifpackageloaded{colortbl}{\let\switch@array@info\colortbl@message}{\let\switch@array@info\array@message}%
|
|
\let\@array@sw\@array@sw@LaTeX
|
|
\@ifx{\@array\@array@array}{%
|
|
\@ifx{\@tabular\@tabular@array}{%
|
|
\@ifx{\@tabarray\@tabarray@array}{%
|
|
\@ifx{\array\array@array}{%
|
|
\@ifx{\endarray\endarray@array}{%
|
|
\@ifx{\endtabular\endtabular@array}{%
|
|
\@ifx{\@mkpream\@mkpream@array}{%
|
|
\@ifx{\@classx\@classx@array}{%
|
|
\@ifx{\insert@column\insert@column@array}{%
|
|
\@ifx{\@arraycr\@arraycr@array}{%
|
|
\@ifx{\@xarraycr\@xarraycr@array}{%
|
|
\@ifx{\@xargarraycr\@xargarraycr@array}{%
|
|
\@ifx{\@yargarraycr\@yargarraycr@array}{%
|
|
\true@sw
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}%
|
|
}{%
|
|
\false@sw
|
|
}{%
|
|
\class@info{Patching array package.}%
|
|
}{%
|
|
\switch@array@info
|
|
}%
|
|
\let\@array \@array@array@new
|
|
\let\@@array \@array % Cosi fan tutti
|
|
\let\@tabular \@tabular@array@new
|
|
\let\@tabarray \@tabarray@array@new
|
|
\let\array \array@array@new
|
|
\let\endarray \endarray@array@new
|
|
\let\endtabular\endtabular@array@new
|
|
\let\@mkpream \@mkpream@array@new
|
|
\let\@classx \@classx@array@new
|
|
\let\@arrayacol\@arrayacol@ltx
|
|
\let\@tabacol \@tabacol@ltx
|
|
\let\insert@column\insert@column@array@new
|
|
\expandafter\let\csname endtabular*\endcsname\endtabular % Cosi fan tutti
|
|
\let\@arraycr \@arraycr@new
|
|
\let\@xarraycr \@xarraycr@new
|
|
\let\@xargarraycr\@xargarraycr@new
|
|
\let\@yargarraycr\@yargarraycr@new
|
|
}%
|
|
\def\array@message{%
|
|
\class@info{Unrecognized array package. Please update this document class! (Proceeding with fingers crossed.)}%
|
|
}%
|
|
\def\colortbl@message{%
|
|
\class@info{colortbl package is loaded. (Proceeding with fingers crossed.)}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@array@sw}
|
|
% The Boolean \cmd\@array@sw\ must be different depending on
|
|
% whether the \classname{array} package is loaded.
|
|
% \begin{macrocode}
|
|
\def\@array@sw@LaTeX{\@ifx{\\\@tabularcr}}%
|
|
\def\@array@sw@array{\@ifx{\d@llarbegin\begingroup}}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@tabular}
|
|
% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.}
|
|
% We provide the old versions of \cmd\@tabular\ along with the respective new versions.
|
|
% The change here is to avoid committing to LR mode. That will be done later (as late as possible, naturally).
|
|
%
|
|
% Compatibility note: I had done \cmd\let\ \cmd\col@sep\ \cmd\@undefined\ here, but
|
|
% this was not compatible with \classname{colortbl}. I have removed that statement.
|
|
% \begin{macrocode}
|
|
\def\@tabular@LaTeX{%
|
|
\leavevmode
|
|
\hbox\bgroup$%
|
|
\let\@acol\@tabacol
|
|
\let\@classz\@tabclassz
|
|
\let\@classiv\@tabclassiv
|
|
\let\\\@tabularcr
|
|
\@tabarray
|
|
}%
|
|
\def\@tabular@ltx{%
|
|
\let\@acoll\@tabacoll
|
|
\let\@acolr\@tabacolr
|
|
\let\@acol\@tabacol
|
|
\let\@classz\@tabclassz
|
|
\let\@classiv\@tabclassiv
|
|
\let\\\@tabularcr
|
|
\@tabarray
|
|
}%
|
|
\def\@tabular@array{%
|
|
\leavevmode
|
|
\hbox\bgroup$%
|
|
\col@sep\tabcolsep
|
|
\let\d@llarbegin\begingroup
|
|
\let\d@llarend\endgroup
|
|
\@tabarray
|
|
}%
|
|
\def\@tabular@array@new{%
|
|
\let\@acoll\@tabacoll
|
|
\let\@acolr\@tabacolr
|
|
\let\@acol\@tabacol
|
|
% \end{macrocode}
|
|
% \let\col@sep\@undefined
|
|
% \begin{macrocode}
|
|
\let\d@llarbegin\begingroup
|
|
\let\d@llarend\endgroup
|
|
\@tabarray
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@tabarray}
|
|
% Here we provide old and new versions of the \cmd\@tabarray\ procedure.
|
|
% The change here is to parametrize the default vertical alignment,
|
|
% which is 'c' in standard \LaTeX.
|
|
% Under some circumstances, we want to change this to, say, 'v'.
|
|
%
|
|
% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.}
|
|
% FIXME: must decouple \env{array} and \env{tabular}. Done (it seems).
|
|
%
|
|
% Note on \classname{colortbl}: this package head-patches \cmd\@tabarray
|
|
% with its own command \cmd\CT@start, and tails onto \cmd\endarray\ with \cmd\CT@end.
|
|
% It fortuitously does the former at \cmd\AtBeginDocument\ time, and, fortuitously,
|
|
% we do not patch \cmd\endarray, which it overwrites.
|
|
% \begin{macrocode}
|
|
\def\@tabarray@LaTeX{%
|
|
\m@th\@ifnextchar[\@array{\@array[c]}%
|
|
}%
|
|
\def\@tabarray@ltx{%
|
|
\m@th\@ifnextchar[\@array{\expandafter\@array\expandafter[\array@default]}%
|
|
}%
|
|
\def\@tabarray@array{%
|
|
\@ifnextchar[{\@@array}{\@@array[c]}%
|
|
}%
|
|
\def\@tabarray@array@new{%
|
|
\@ifnextchar[{\@@array}{\expandafter\@@array\expandafter[\array@default]}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@tabularcr}
|
|
% \begin{macro}{\@tbpen}
|
|
% \begin{macro}{\@tabularcr}
|
|
% \begin{macro}{\@xtabularcr}
|
|
% \begin{macro}{\@xargarraycr}
|
|
% \begin{macro}{\@yargarraycr}
|
|
% \begin{macro}{\@arraycr}
|
|
% \begin{macro}{\@xarraycr}
|
|
% We provide for the \cmd\\ command within \env{tabular} to provide control over page breaking, just the same as
|
|
% that of \env{eqnarray}.
|
|
%
|
|
% The count register \cmd\intertabularlinepenalty\ is similar to \cmd\interdisplaylinepenalty: it is the penalty
|
|
% associated with each row of a tabular. When it is set to \cmd\@M, the tabular will cleave together.
|
|
%
|
|
% The count register \cmd\@tbpen\ is similar to \cmd\@eqpen: it memorizes the penalty to use after the current tabular row.
|
|
% If the \cmd\\ command is in its star form, then \cmd\@eqpen\ is set to \cmd\@M.
|
|
%
|
|
% We append code to \cmd\samepage\ so that a tabular within its scope will cleave together.
|
|
%
|
|
% We keep the standard definition of \cmd\@tabularcr\ in \cmd\@tabularcr@LaTeX\ for reference,
|
|
% and provide a new definition that works like \cmd\@eqncr: it sets \cmd\@tbpen\ to \cmd\@M\ if the star was given.
|
|
%
|
|
% We also provide new versions of \cmd\@xtabularcr, \cmd\@xargarraycr, and \cmd\@yargarraycr, all of which invoke \cmd\@tbpen.
|
|
%
|
|
% The \cmd\switch@tabular\ procedure switches in the new definitions.
|
|
% \begin{macrocode}
|
|
\newcount\intertabularlinepenalty
|
|
\intertabularlinepenalty=100
|
|
\newcount\@tbpen
|
|
\appdef\samepage{\intertabularlinepenalty\@M}%
|
|
\def\@tabularcr@LaTeX{{\ifnum 0=`}\fi \@ifstar \@xtabularcr \@xtabularcr}%
|
|
\def\@tabularcr@ltx{{\ifnum 0=`}\fi \@ifstar {\global \@tbpen \@M \@xtabularcr }{\global \@tbpen \intertabularlinepenalty \@xtabularcr }}%
|
|
\def\@xtabularcr@LaTeX{\@ifnextchar [\@argtabularcr {\ifnum 0=`{\fi }\cr }}%
|
|
\def\@xtabularcr@ltx{\@ifnextchar [\@argtabularcr {\ifnum 0=`{\fi }\cr \noalign {\penalty \@tbpen }}}%
|
|
\def\@xargarraycr@LaTeX#1{\@tempdima #1\advance \@tempdima \dp \@arstrutbox \vrule \@height \z@ \@depth \@tempdima \@width \z@ \cr}%
|
|
\def\@xargarraycr@ltx#1{\@tempdima #1\advance \@tempdima \dp \@arstrutbox \vrule \@height \z@ \@depth \@tempdima \@width \z@ \cr \noalign {\penalty \@tbpen }}%
|
|
\def\@yargarraycr@LaTeX#1{\cr \noalign {\vskip #1}}%
|
|
\def\@yargarraycr@ltx#1{\cr \noalign {\penalty \@tbpen \vskip #1}}%
|
|
% \end{macrocode}
|
|
%
|
|
% If the \classname{array} package has been loaded, we must alter the meanings of
|
|
% \cmd\@arraycr, \cmd\@xarraycr, \cmd\@xargarraycr, and \cmd\@yargarraycr.
|
|
% In this case, it is \cmd\switch@array\ that switches in the new definitions.
|
|
% \begin{macrocode}
|
|
\def\@arraycr@array{%
|
|
\relax
|
|
\iffalse{\fi\ifnum 0=`}\fi
|
|
\@ifstar \@xarraycr \@xarraycr
|
|
}%
|
|
\def\@arraycr@new{%
|
|
\relax
|
|
\iffalse{\fi\ifnum 0=`}\fi
|
|
\@ifstar {\global \@tbpen \@M \@xarraycr }{\global \@tbpen \intertabularlinepenalty \@xarraycr }%
|
|
}%
|
|
\def\@xarraycr@array{%
|
|
\@ifnextchar [%]
|
|
\@argarraycr {\ifnum 0=`{}\fi\cr}%
|
|
}%
|
|
\def\@xarraycr@new{%
|
|
\@ifnextchar [%]
|
|
\@argarraycr {\ifnum 0=`{}\fi\cr \noalign {\penalty \@tbpen }}%
|
|
}%
|
|
\def\@xargarraycr@array#1{%
|
|
\unskip
|
|
\@tempdima #1\advance\@tempdima \dp\@arstrutbox
|
|
\vrule \@depth\@tempdima \@width\z@
|
|
\cr
|
|
}%
|
|
\def\@xargarraycr@new#1{%
|
|
\unskip
|
|
\@tempdima #1\advance\@tempdima \dp\@arstrutbox
|
|
\vrule \@depth\@tempdima \@width\z@
|
|
\cr
|
|
\noalign {\penalty \@tbpen }%
|
|
}%
|
|
\def\@yargarraycr@array#1{%
|
|
\cr
|
|
\noalign{\vskip #1}%
|
|
}%
|
|
\def\@yargarraycr@new#1{%
|
|
\cr
|
|
\noalign{\penalty \@tbpen \vskip #1}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\array}
|
|
% We provide old and new versions of the \cmd\array\ procedure for both \LaTeX\ and the \classname{array} package.
|
|
% The change here is to accomodate the new procedures that will be called for the array boundaries, even
|
|
% though at present they are not special.
|
|
% A thought: here is where matrices can be readily accomodated.
|
|
% \begin{macrocode}
|
|
\def\array@LaTeX{%
|
|
\let\@acol\@arrayacol
|
|
\let\@classz\@arrayclassz
|
|
\let\@classiv\@arrayclassiv
|
|
\let\\\@arraycr
|
|
\let\@halignto\@empty
|
|
\@tabarray
|
|
}%
|
|
\def\array@ltx{%
|
|
\@ifmmode{}{\@badmath$}%
|
|
\let\@acoll\@arrayacol
|
|
\let\@acolr\@arrayacol
|
|
\let\@acol\@arrayacol
|
|
\let\@classz\@arrayclassz
|
|
\let\@classiv\@arrayclassiv
|
|
\let\\\@arraycr
|
|
\let\@halignto\@empty
|
|
\@tabarray
|
|
}%
|
|
\def\array@array{%
|
|
\col@sep\arraycolsep
|
|
\def\d@llarbegin{$}\let\d@llarend\d@llarbegin\gdef\@halignto{}%
|
|
\@tabarray
|
|
}
|
|
\def\array@array@new{%
|
|
\@ifmmode{}{\@badmath$}%
|
|
\let\@acoll\@arrayacol
|
|
\let\@acolr\@arrayacol
|
|
\let\@acol\@arrayacol
|
|
% \end{macrocode}
|
|
% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.}
|
|
% Removed: \verb+\let\col@sep\@undefined+
|
|
% \begin{macrocode}
|
|
\def\d@llarbegin{$}%
|
|
\let\d@llarend\d@llarbegin
|
|
\gdef\@halignto{}%
|
|
\@tabarray
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@array}
|
|
% Here we provide old and new versions of \cmd\@array.
|
|
% The change here is to provide a convenient, flexible, and extensible
|
|
% mechanism for new vertical alignment options.
|
|
%
|
|
% Instead of testing the optional argument with \cmd\if, we
|
|
% use a dispatcher based on \cmd\csname.
|
|
%
|
|
% We also refrain from using \cmd\ialign, which would set
|
|
% the \cmd\tabskip\ to the wrong value.
|
|
%
|
|
% Finally, the procedure to set the \cmd\@arstrutbox\
|
|
% is broken out so that it can be patched.
|
|
% \begin{macrocode}
|
|
\def\@array@LaTeX[#1]#2{%
|
|
\if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
|
|
\bgroup
|
|
\setbox\@arstrutbox\hbox{%
|
|
\vrule \@height\arraystretch\ht\strutbox
|
|
\@depth\arraystretch \dp\strutbox
|
|
\@width\z@}%
|
|
\@mkpream{#2}%
|
|
\edef\@preamble{%
|
|
\ialign \noexpand\@halignto
|
|
\bgroup \@arstrut \@preamble \tabskip\z@skip \cr}%
|
|
\let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
|
|
\let\tabularnewline\\%
|
|
\let\par\@empty
|
|
\let\@sharp##%
|
|
\set@typeset@protect
|
|
\lineskip\z@skip\baselineskip\z@skip
|
|
\ifhmode \@preamerr\z@ \@@par\fi
|
|
\@preamble
|
|
}%
|
|
\def\@array@ltx[#1]#2{%
|
|
\@nameuse{@array@align@#1}%
|
|
\set@arstrutbox
|
|
\@mkpream{#2}%
|
|
\prepdef\@preamble{%
|
|
\tabskip\tabmid@skip
|
|
\@arstrut
|
|
}%
|
|
\appdef\@preamble{%
|
|
\tabskip\tabright@skip
|
|
\cr
|
|
\array@row@pre
|
|
}%
|
|
% \let\@startpbox\@@startpbox
|
|
% \let\@endpbox\@@endpbox
|
|
\let\tabularnewline\\%
|
|
\let\par\@empty
|
|
\let\@sharp##%
|
|
\set@typeset@protect
|
|
\lineskip\z@skip\baselineskip\z@skip
|
|
\tabskip\tableft@skip\relax
|
|
\ifhmode \@preamerr\z@ \@@par\fi
|
|
\everycr{}%
|
|
\expandafter\halign\expandafter\@halignto\expandafter\bgroup\@preamble
|
|
}%
|
|
%
|
|
\def\set@arstrutbox{%
|
|
\setbox\@arstrutbox\hbox{%
|
|
\vrule \@height\arraystretch\ht\strutbox
|
|
\@depth\arraystretch \dp\strutbox
|
|
\@width\z@
|
|
}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@array@array}
|
|
%
|
|
% \begin{macrocode}
|
|
\def\@array@array[#1]#2{%
|
|
\@tempdima \ht \strutbox
|
|
\advance \@tempdima by\extrarowheight
|
|
\setbox \@arstrutbox \hbox{\vrule
|
|
\@height \arraystretch \@tempdima
|
|
\@depth \arraystretch \dp \strutbox
|
|
\@width \z@}%
|
|
\begingroup
|
|
\@mkpream{#2}%
|
|
\xdef\@preamble{\noexpand \ialign \@halignto
|
|
\bgroup \@arstrut \@preamble
|
|
\tabskip \z@ \cr}%
|
|
\endgroup
|
|
\@arrayleft
|
|
\if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi
|
|
\bgroup
|
|
\let \@sharp ##\let \protect \relax
|
|
\lineskip \z@
|
|
\baselineskip \z@
|
|
\m@th
|
|
\let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble
|
|
}%
|
|
\def\@array@array@new[#1]#2{%
|
|
\@tempdima\ht\strutbox
|
|
\advance\@tempdima by\extrarowheight
|
|
\setbox\@arstrutbox\hbox{%
|
|
\vrule \@height\arraystretch\@tempdima
|
|
\@depth \arraystretch\dp\strutbox
|
|
\@width \z@
|
|
}%
|
|
\begingroup
|
|
\@mkpream{#2}%
|
|
\xdef\@preamble{\@preamble}%
|
|
\endgroup
|
|
\prepdef\@preamble{%
|
|
\tabskip\tabmid@skip
|
|
\@arstrut
|
|
}%
|
|
\appdef\@preamble{%
|
|
\tabskip\tabright@skip
|
|
\cr
|
|
\array@row@pre
|
|
}%
|
|
\@arrayleft
|
|
\@nameuse{@array@align@#1}%
|
|
\m@th
|
|
\let\\\@arraycr
|
|
\let\tabularnewline\\%
|
|
\let\par\@empty
|
|
\let\@sharp##%
|
|
\set@typeset@protect
|
|
\lineskip\z@\baselineskip\z@
|
|
\tabskip\tableft@skip
|
|
\everycr{}%
|
|
\expandafter\halign\expandafter\@halignto\expandafter\bgroup\@preamble
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\endarray}
|
|
% Here we provide old and new versions of \cmd\endarray.
|
|
% The change here is to use a single procedure to close
|
|
% out any array-like structure, namely \cmd\endarray@ltx.
|
|
% It merely closes out the \cmd\halign.
|
|
% \begin{macrocode}
|
|
\def\endarray@LaTeX{%
|
|
\crcr\egroup\egroup
|
|
}%
|
|
\def\endarray@ltx{%
|
|
\crcr\array@row@pst\egroup\egroup
|
|
}%
|
|
\def\endarray@array{%
|
|
\crcr \egroup \egroup \@arrayright \gdef\@preamble{}%
|
|
}%
|
|
\def\endarray@array@new{%
|
|
\crcr\array@row@pst\egroup\egroup % Same as \endarray@ltx
|
|
\@arrayright
|
|
\global\let\@preamble\@empty
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\endtabular}
|
|
%
|
|
% \begin{macrocode}
|
|
\def\endtabular@LaTeX{%
|
|
\crcr\egroup\egroup $\egroup
|
|
}%
|
|
\def\endtabular@ltx{%
|
|
\endarray
|
|
}%
|
|
\def\endtabular@array{%
|
|
\endarray $\egroup
|
|
}%
|
|
\def\endtabular@array@new{%
|
|
\endarray
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{endtabular*}
|
|
% Here we provide a proper definition for the star-form of \enve{endtabular}.
|
|
% It is one of the enduring curiosities that the \LaTeX\ kernel continues to use
|
|
% dangerously and inappropriately ``optimized'' definitions for such commands.
|
|
% \begin{macrocode}
|
|
\@namedef{endtabular*}{\endtabular}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\multicolumn}
|
|
%
|
|
% \begin{macrocode}
|
|
\long\def\multicolumn@LaTeX#1#2#3{%
|
|
\multispan{#1}\begingroup
|
|
\@mkpream{#2}%
|
|
\def\@sharp{#3}\set@typeset@protect
|
|
\let\@startpbox\@@startpbox\let\@endpbox\@@endpbox
|
|
\@arstrut \@preamble\hbox{}\endgroup\ignorespaces
|
|
}%
|
|
\long\def\multicolumn@ltx#1#2#3{%
|
|
\multispan{#1}%
|
|
\begingroup
|
|
\@mkpream{#2}%
|
|
\def\@sharp{#3}%
|
|
\set@typeset@protect
|
|
%\let\@startpbox\@@startpbox\let\@endpbox\@@endpbox
|
|
\@arstrut
|
|
\@preamble
|
|
\hbox{}%
|
|
\endgroup
|
|
\ignorespaces
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@array@align@}
|
|
% \begin{macro}{\array@default}
|
|
% Here are the various procedures for the vertical alignment options.
|
|
% The change from standard \LaTeX\ is that we do not go into math mode
|
|
% in every case: only when required by \cmd\vcenter.
|
|
% Also, we use \cmd\aftergroup\ to close out the boxes and modes we have started.
|
|
% It requires only that each procedure issue exactly one unmatched \cmd\bgroup.
|
|
%
|
|
% We establish here the default vertical alignment.
|
|
% \begin{macrocode}
|
|
\def\@array@align@t{\leavevmode\vtop\bgroup}%
|
|
\def\@array@align@b{\leavevmode\vbox\bgroup}%
|
|
\def\@array@align@c{\leavevmode\@ifmmode{\vcenter\bgroup}{$\vcenter\bgroup\aftergroup$\aftergroup\relax}}%
|
|
\def\@array@align@v{%
|
|
\@ifmmode{%
|
|
\@badmath
|
|
\vcenter\bgroup
|
|
}{%
|
|
\@ifinner{%
|
|
$\vcenter\bgroup\aftergroup$
|
|
}{%
|
|
\@@par\bgroup
|
|
}%
|
|
}%
|
|
}%
|
|
\def\array@default{c}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\array@row@pre}
|
|
% \begin{macro}{\array@row@pst}
|
|
% \begin{macro}{\array@row@rst}
|
|
% The procedure \cmd\array@row@rst\ reestablishes a default context for
|
|
% an alignment, so that they can be nested.
|
|
% Any environment or procedure that alters the way alignments are formatted
|
|
% must patch this procedure to restore from that alteration.
|
|
% To start things off, we equate \cmd\@array@align@v\ to \cmd\@array@align@c,
|
|
% because it does not make sense to do the former in any context other
|
|
% than the MVL or in a list that will be unboxed onto the MVL.
|
|
% \begin{macrocode}
|
|
\def\array@row@rst{%
|
|
\let\@array@align@v\@array@align@c
|
|
}%
|
|
\def\array@row@pre{}%
|
|
\def\array@row@pst{}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\toprule}
|
|
% \begin{macro}{\colrule}
|
|
% \begin{macro}{\botrule}
|
|
% Default definitions for \cmd\toprule, \cmd\colrule, \cmd\botrule
|
|
% \begin{macrocode}
|
|
\newcommand\toprule{\tab@rule{\column@font}{\column@fil}{\frstrut}}%
|
|
\newcommand\colrule{\unskip\lrstrut\\\tab@rule{\body@font}{}{\frstrut}}%
|
|
\newcommand\botrule{\unskip\lrstrut\\\noalign{\hline@rule}{}}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\hline}
|
|
% \begin{macrocode}
|
|
\def\hline@LaTeX{%
|
|
\noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet
|
|
\reserved@a\@xhline
|
|
}%
|
|
\def\hline@ltx{%
|
|
\noalign{%
|
|
\ifnum0=`}\fi
|
|
\hline@rule
|
|
\futurelet\reserved@a\@xhline
|
|
% \noalign ended in \@xhline
|
|
}%
|
|
\def\@xhline@unneeded{%
|
|
\say\reserved@a
|
|
\ifx\reserved@a\hline
|
|
\vskip\doublerulesep
|
|
\vskip-\arrayrulewidth
|
|
\fi
|
|
\ifnum0=`{\fi}%
|
|
}%
|
|
\def\tab@rule#1#2#3{%
|
|
\crcr
|
|
\noalign{%
|
|
\hline@rule
|
|
\gdef\@arstrut@hook{%
|
|
\global\let\@arstrut@hook\@empty
|
|
#3%
|
|
}%
|
|
\gdef\cell@font{#1}%
|
|
\gdef\cell@fil{#2}%
|
|
}%
|
|
}%
|
|
\def\column@font{}%
|
|
\def\column@fil{}%
|
|
\def\body@font{}%
|
|
\def\cell@font{}%
|
|
\def\frstrut{}%
|
|
\def\lrstrut{}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@arstrut@hline}
|
|
% \begin{macro}{\@arstrut@org}
|
|
% \begin{macro}{\@arstrut@hook}
|
|
% \begin{macro}{\@arstrutbox@hline}
|
|
% \begin{macro}{\set@arstrutbox}
|
|
% \begin{macro}{\hline@rule}
|
|
% The procedure \cmd\@arstrut@hline\ is substantially the same as
|
|
% \cmd\@arstrut, except the strut copied in is \cmd\@arstrutbox@hline
|
|
% instead of \cmd\@arstrutbox.
|
|
%
|
|
% The procedure \cmd\@arstrut@hook\ is redefined in \cmd\tab@rule!
|
|
%
|
|
% The register \cmd\@arstrutbox@hline.
|
|
%
|
|
% We append to \cmd\set@arstrutbox\ the code necessary to set a strut following an \cmd\hline.
|
|
%
|
|
% The procedure \cmd\hline@rule\ lays down a rule, and changes the meaning of \cmd\@arstrut\
|
|
% so that the next line will be correctly strutted.
|
|
%
|
|
% The \cmd\@arstrut@hline@clnc\ is a klootch, a magic number.
|
|
% \begin{macrocode}
|
|
\def\@arstrut@hline{%
|
|
\relax
|
|
\@ifmmode{\copy}{\unhcopy}\@arstrutbox@hline
|
|
\@arstrut@hook
|
|
}%
|
|
%
|
|
\let\@arstrut@org\@arstrut
|
|
\def\@arstrut@hook{%
|
|
\global\let\@arstrut\@arstrut@org
|
|
}%
|
|
%
|
|
\newbox\@arstrutbox@hline
|
|
\appdef\set@arstrutbox{%
|
|
\setbox\@arstrutbox@hline\hbox{%
|
|
\setbox\z@\hbox{$0^{0}_{}$}%
|
|
\dimen@\ht\z@\advance\dimen@\@arstrut@hline@clnc
|
|
\@ifdim{\dimen@<\arraystretch\ht\strutbox}{\dimen@=\arraystretch\ht\strutbox}{}%
|
|
\vrule \@height\dimen@
|
|
\@depth\arraystretch \dp\strutbox
|
|
\@width\z@
|
|
}%
|
|
}%
|
|
%
|
|
\def\hline@rule{%
|
|
\hrule \@height \arrayrulewidth
|
|
\global\let\@arstrut\@arstrut@hline
|
|
}%
|
|
\def\@arstrut@hline@clnc{2\p@}% % Klootch: magic number
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\tableft@skip}
|
|
% \begin{macrocode}
|
|
\def\tableft@skip{\z@skip}%
|
|
\def\tabmid@skip{\z@skip}%\@flushglue
|
|
\def\tabright@skip{\z@skip}%
|
|
\def\tableftsep{\tabcolsep}%
|
|
\def\tabmidsep{\tabcolsep}%
|
|
\def\tabrightsep{\tabcolsep}%
|
|
\def\cell@fil{}%
|
|
\def\pbox@hook{}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@arstrut}
|
|
% \begin{macrocode}
|
|
\appdef\@arstrut{\@arstrut@hook}%
|
|
\let\@arstrut@hook\@empty
|
|
\def\@addtopreamble{\appdef\@preamble}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@mkpream}
|
|
% \begin{macrocode}
|
|
\def\@mkpream@LaTeX#1{%
|
|
\@firstamptrue\@lastchclass6
|
|
\let\@preamble\@empty
|
|
\let\protect\@unexpandable@protect
|
|
\let\@sharp\relax
|
|
\let\@startpbox\relax\let\@endpbox\relax
|
|
\@expast{#1}%
|
|
\expandafter\@tfor \expandafter
|
|
\@nextchar \expandafter:\expandafter=\reserved@a\do
|
|
{\@testpach\@nextchar
|
|
\ifcase \@chclass \@classz \or \@classi \or \@classii \or \@classiii
|
|
\or \@classiv \or\@classv \fi\@lastchclass\@chclass}%
|
|
\ifcase \@lastchclass \@acol
|
|
\or \or \@preamerr \@ne\or \@preamerr \tw@\or \or \@acol \fi
|
|
}%
|
|
\def\@mkpream@ltx#1{%
|
|
\@firstamptrue
|
|
\@lastchclass6
|
|
\let\@preamble\@empty
|
|
\let\protect\@unexpandable@protect
|
|
\let\@sharp\relax
|
|
%\let\@startpbox\relax\let\@endpbox\relax
|
|
\@expast{#1}%
|
|
\expandafter\@tfor\expandafter\@nextchar\expandafter:\expandafter=\reserved@a
|
|
\do{%
|
|
\expandafter\@testpach\expandafter{\@nextchar}%
|
|
\ifcase\@chclass
|
|
\@classz
|
|
\or
|
|
\@classi
|
|
\or
|
|
\@classii
|
|
\or
|
|
\@classiii
|
|
\or
|
|
\@classiv
|
|
\or
|
|
\@classv
|
|
\fi
|
|
\@lastchclass\@chclass
|
|
}%
|
|
\ifcase\@lastchclass
|
|
\@acolr % right-hand column
|
|
\or
|
|
\or
|
|
\@preamerr\@ne
|
|
\or
|
|
\@preamerr\tw@
|
|
\or
|
|
\or
|
|
\@acolr % right-hand column
|
|
\fi
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\insert@column}
|
|
% \begin{macrocode}
|
|
\def\insert@column@array{%
|
|
\the@toks \the \@tempcnta
|
|
\ignorespaces \@sharp \unskip
|
|
\the@toks \the \count@ \relax
|
|
}%
|
|
\def\insert@column@array@new{%
|
|
\the@toks\the\@tempcnta
|
|
\array@row@rst\cell@font
|
|
\ignorespaces\@sharp\unskip
|
|
\the@toks\the\count@
|
|
\relax
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@mkpream@relax}
|
|
% The procedure \cmd\@mkpream@relax\ participates in a strange and wonderful
|
|
% method of binding the alignment procedure---but only certain parts thereof.
|
|
%
|
|
% Here is how it works: in \LaTeX, the \classname{array} package, and in the
|
|
% \classname{longtable} package alike, there is a need to create an alignment
|
|
% preamble (using \cmd\@mkpream) for use by the upcoming \cmd\halign.
|
|
% Then, in both \classname{array} and \classname{longtable}, \TeX's \cmd\edef\
|
|
% is used to `compile in place' that alignment preamble.
|
|
%
|
|
% In the case of \classname{array},
|
|
% the operation is done in order to pre-expand the use of \texttt{*};
|
|
% in \classname{longtable}, it is to set the widths of the columns.
|
|
%
|
|
% Now, during this \cmd\edef, certain control sequence names must \emph{not}
|
|
% be expanded, and those are robustified by \cmd\@mkpream@relax.
|
|
%
|
|
% \begin{macrocode}
|
|
\def\@mkpream@relax{%
|
|
\let\tableftsep \relax
|
|
\let\tabmidsep \relax
|
|
\let\tabrightsep \relax
|
|
\let\array@row@rst\relax
|
|
\let\cell@font \relax
|
|
\let\@startpbox \relax
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@mkpream}
|
|
% We insert \cmd\@mkpream@relax\ at the head of the procedure.
|
|
% The robustifying of \cmd\@startpbox\ and \cmd\@endpbox\ is taken over by this mechanism.
|
|
% We also invoke \cmd\@acolr\ instead of \cmd\@acol\ when a right-hand column is at hand.
|
|
%
|
|
% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.}
|
|
% Note on \classname{colortbl}: this package head-patches \cmd\@mkpream\ to robustify
|
|
% a number of its commands during the construction of the alignment preamble.
|
|
% The best we can do is to supplement the \cmd\@mkpream@relax\ procedure to perform this action.
|
|
% \begin{macrocode}
|
|
\def\@mkpream@array#1{%
|
|
\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
|
|
\let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
|
|
\@temptokena{#1}\@tempswatrue
|
|
\@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
|
|
\count@\m@ne
|
|
\let\the@toks\relax
|
|
\prepnext@tok
|
|
\expandafter \@tfor \expandafter \@nextchar
|
|
\expandafter :\expandafter =\the\@temptokena \do
|
|
{\@testpach
|
|
\ifcase \@chclass \@classz \or \@classi \or \@classii
|
|
\or \save@decl \or \or \@classv \or \@classvi
|
|
\or \@classvii \or \@classviii
|
|
\or \@classx
|
|
\or \@classx \fi
|
|
\@lastchclass\@chclass}%
|
|
\ifcase\@lastchclass
|
|
\@acol \or
|
|
\or
|
|
\@acol \or
|
|
\@preamerr \thr@@ \or
|
|
\@preamerr \tw@ \@addtopreamble\@sharp \or
|
|
\or
|
|
\else \@preamerr \@ne \fi
|
|
\def\the@toks{\the\toks}%
|
|
}%
|
|
\def\@mkpream@array@new#1{%
|
|
\gdef\@preamble{}%
|
|
\@lastchclass\f@ur
|
|
\@firstamptrue
|
|
\let\@sharp\relax
|
|
\@mkpream@relax
|
|
%\let\@startpbox\relax\let\@endpbox\relax
|
|
\@temptokena{#1}\@tempswatrue
|
|
\@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
|
|
\count@\m@ne
|
|
\let\the@toks\relax
|
|
\prepnext@tok
|
|
\expandafter\@tfor\expandafter\@nextchar\expandafter:\expandafter=\the\@temptokena
|
|
\do{%
|
|
\@testpach
|
|
\ifcase\@chclass
|
|
\@classz
|
|
\or
|
|
\@classi
|
|
\or
|
|
\@classii
|
|
\or
|
|
\save@decl
|
|
\or
|
|
\or
|
|
\@classv
|
|
\or
|
|
\@classvi
|
|
\or
|
|
\@classvii
|
|
\or
|
|
\@classviii
|
|
\or
|
|
\@classx
|
|
\or
|
|
\@classx
|
|
\fi
|
|
\@lastchclass\@chclass
|
|
}%
|
|
\ifcase\@lastchclass
|
|
\@acolr % right-hand column
|
|
\or
|
|
\or
|
|
\@acolr % right-hand column
|
|
\or
|
|
\@preamerr\thr@@
|
|
\or
|
|
\@preamerr\tw@\@addtopreamble\@sharp
|
|
\or
|
|
\or
|
|
\else
|
|
\@preamerr\@ne
|
|
\fi
|
|
\def\the@toks{\the\toks}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@mkpream@relax}
|
|
% \changes{4.1b}{2008/08/12}{(AO, 505) try to accommodate \classname{colortbl}.}
|
|
% David P. Carlisle's \classname{colortbl} package headpatches \cmd\@mkpream\ in place
|
|
% during package loading, so it does not know whom it is working on.
|
|
% Let us try to accomodate this package by doing what it would have liked to have done.
|
|
%
|
|
% Note: it would be far better to break out this mechanism in the \classname{array} package.
|
|
% \begin{macrocode}
|
|
\appdef\@mkpream@relax{%
|
|
\let\CT@setup \relax
|
|
\let\CT@color \relax
|
|
\let\CT@do@color \relax
|
|
\let\color \relax
|
|
\let\CT@column@color\relax
|
|
\let\CT@row@color \relax
|
|
\let\CT@cell@color \relax
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@addamp}
|
|
% \begin{macrocode}
|
|
\def\@addamp@LaTeX{%
|
|
\if@firstamp\@firstampfalse\else\edef\@preamble{\@preamble &}\fi
|
|
}%
|
|
\def\@addamp@ltx{%
|
|
\if@firstamp\@firstampfalse\else\@addtopreamble{&}\fi
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@arrayacol}
|
|
% \begin{macrocode}
|
|
\def\@arrayacol@LaTeX{%
|
|
\edef\@preamble{\@preamble \hskip \arraycolsep}%
|
|
}%
|
|
\def\@arrayacol@ltx{%
|
|
\@addtopreamble{\hskip\arraycolsep}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@tabacol}
|
|
% \begin{macrocode}
|
|
\def\@tabacoll{%
|
|
\@addtopreamble{\hskip\tableftsep\relax}%
|
|
}%
|
|
\def\@tabacol@LaTeX{%
|
|
\edef\@preamble{\@preamble \hskip \tabcolsep}%
|
|
}%
|
|
\def\@tabacol@ltx{%
|
|
\@addtopreamble{\hskip\tabmidsep\relax}%
|
|
}%
|
|
\def\@tabacolr{%
|
|
\@addtopreamble{\hskip\tabrightsep\relax}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@arrayclassz}
|
|
% \begin{macrocode}
|
|
\def\@arrayclassz@LaTeX{%
|
|
\ifcase \@lastchclass \@acolampacol \or \@ampacol \or
|
|
\or \or \@addamp \or
|
|
\@acolampacol \or \@firstampfalse \@acol \fi
|
|
\edef\@preamble{\@preamble
|
|
\ifcase \@chnum
|
|
\hfil$\relax\@sharp$\hfil \or $\relax\@sharp$\hfil
|
|
\or \hfil$\relax\@sharp$\fi}%
|
|
}%
|
|
\def\@arrayclassz@ltx{%
|
|
\ifcase\@lastchclass
|
|
\@acolampacol
|
|
\or
|
|
\@ampacol
|
|
\or
|
|
\or
|
|
\or
|
|
\@addamp
|
|
\or
|
|
\@acolampacol
|
|
\or
|
|
\@firstampfalse\@acoll
|
|
\fi
|
|
\ifcase\@chnum
|
|
\@addtopreamble{%
|
|
\hfil\array@row@rst$\relax\@sharp$\hfil
|
|
}%
|
|
\or
|
|
\@addtopreamble{%
|
|
\array@row@rst$\relax\@sharp$\hfil
|
|
}%
|
|
\or
|
|
\@addtopreamble{%
|
|
\hfil\array@row@rst$\relax\@sharp$%
|
|
}%
|
|
\fi
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@tabclassz}
|
|
% \begin{macrocode}
|
|
\def\@tabclassz@LaTeX{%
|
|
\ifcase\@lastchclass
|
|
\@acolampacol
|
|
\or
|
|
\@ampacol
|
|
\or
|
|
\or
|
|
\or
|
|
\@addamp
|
|
\or
|
|
\@acolampacol
|
|
\or
|
|
\@firstampfalse\@acol
|
|
\fi
|
|
\edef\@preamble{%
|
|
\@preamble{%
|
|
\ifcase\@chnum
|
|
\hfil\ignorespaces\@sharp\unskip\hfil
|
|
\or
|
|
\hskip1sp\ignorespaces\@sharp\unskip\hfil
|
|
\or
|
|
\hfil\hskip1sp\ignorespaces\@sharp\unskip
|
|
\fi}}%
|
|
}%
|
|
\def\@tabclassz@ltx{%
|
|
\ifcase\@lastchclass
|
|
\@acolampacol
|
|
\or
|
|
\@ampacol
|
|
\or
|
|
\or
|
|
\or
|
|
\@addamp
|
|
\or
|
|
\@acolampacol
|
|
\or
|
|
\@firstampfalse\@acoll
|
|
\fi
|
|
\ifcase\@chnum
|
|
\@addtopreamble{%
|
|
{\hfil\array@row@rst\cell@font\ignorespaces\@sharp\unskip\hfil}%
|
|
}%
|
|
\or
|
|
\@addtopreamble{%
|
|
{\cell@fil\hskip1sp\array@row@rst\cell@font\ignorespaces\@sharp\unskip\hfil}%
|
|
}%
|
|
\or
|
|
\@addtopreamble{%
|
|
{\hfil\hskip1sp\array@row@rst\cell@font\ignorespaces\@sharp\unskip\cell@fil}%
|
|
}%
|
|
\fi
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@tabclassiv}
|
|
% \begin{macrocode}
|
|
\def\@tabclassiv@LaTeX{%
|
|
\@addtopreamble\@nextchar
|
|
}%
|
|
\def\@tabclassiv@ltx{%
|
|
\expandafter\@addtopreamble\expandafter{\@nextchar}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@arrayclassiv}
|
|
% \begin{macrocode}
|
|
\def\@arrayclassiv@LaTeX{%
|
|
\@addtopreamble{$\@nextchar$}%
|
|
}%
|
|
\def\@arrayclassiv@ltx{%
|
|
\expandafter\@addtopreamble\expandafter{\expandafter$\@nextchar$}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@classv}
|
|
% \begin{macrocode}
|
|
\def\@classv@LaTeX{%
|
|
\@addtopreamble{\@startpbox{\@nextchar}\ignorespaces
|
|
\@sharp\@endpbox}%
|
|
}%
|
|
\def\@classv@ltx{%
|
|
\expandafter\@addtopreamble
|
|
\expandafter{%
|
|
\expandafter \@startpbox
|
|
\expandafter {\@nextchar}%
|
|
\pbox@hook\array@row@rst\cell@font\ignorespaces\@sharp\@endpbox
|
|
}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@classx}
|
|
% \begin{macrocode}
|
|
\def\@classx@array{%
|
|
\ifcase \@lastchclass
|
|
\@acolampacol \or
|
|
\@addamp \@acol \or
|
|
\@acolampacol \or
|
|
\or
|
|
\@acol \@firstampfalse \or
|
|
\@addamp
|
|
\fi
|
|
}%
|
|
\def\@classx@array@new{%
|
|
\ifcase \@lastchclass
|
|
\@acolampacol
|
|
\or
|
|
\@addamp \@acol
|
|
\or
|
|
\@acolampacol
|
|
\or
|
|
\or
|
|
\@firstampfalse\@acoll
|
|
\or
|
|
\@addamp
|
|
\fi
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Repair other broken parts of \LaTeX}
|
|
%
|
|
% \begin{macro}{\@xbitor}
|
|
% Expansion part has extraneous space token. Removed.
|
|
% \begin{macrocode}
|
|
\def\@xbitor@LaTeX #1{\@tempcntb \count#1
|
|
\ifnum \@tempcnta =\z@
|
|
\else
|
|
\divide\@tempcntb\@tempcnta
|
|
\ifodd\@tempcntb \@testtrue\fi
|
|
\fi}%
|
|
\def\@xbitor@ltx#1{%
|
|
\@tempcntb\count#1\relax
|
|
\@ifnum{\@tempcnta=\z@}{}{%
|
|
\divide\@tempcntb\@tempcnta
|
|
\@ifodd\@tempcntb{\@testtrue}{}%
|
|
}%
|
|
}%
|
|
\@ifx{\@xbitor\@xbitor@LaTeX}{%
|
|
\class@info{Repairing broken LaTeX \string\@xbitor}%
|
|
}{%
|
|
\class@info{Unrecognized LaTeX \string\@xbitor. Please update this document class! (Proceeding with fingers crossed.)}%
|
|
}%
|
|
\let\@xbitor\@xbitor@ltx
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Syntax}
|
|
% \begin{macro}{\@gobble@opt@one}
|
|
% The \cmd\@gobble@opt@one\ command eats up an optional argument
|
|
% and one required argument.
|
|
% \begin{macrocode}
|
|
\newcommand*\@gobble@opt@one[2][]{}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \subsection{Auto-indented Contents}
|
|
% Facility to automatically determine the proper indentation of
|
|
% the TOC entries.
|
|
%
|
|
% Note on \classname{hyperref} compatibility:
|
|
% We must respect that
|
|
% \cmd\contentsline\ now has a fourth argument.
|
|
% So, instead of trying to override the meaning of \cmd\contentsline,
|
|
% we use the aux file to remember max values from one run to the next.
|
|
%
|
|
% In this respect, this package retains compatibility with
|
|
% \classname{hyperref}.
|
|
%
|
|
% \begin{macro}{\@starttoc}
|
|
% Install hooks at beginning and end of the TOC processing.
|
|
% \begin{macrocode}
|
|
\def\@starttoc#1{%
|
|
\begingroup
|
|
\toc@pre
|
|
\makeatletter
|
|
\@input{\jobname.#1}%
|
|
\if@filesw
|
|
\expandafter\newwrite\csname tf@#1\endcsname
|
|
\immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
|
|
\fi
|
|
\@nobreakfalse
|
|
\toc@post
|
|
\endgroup
|
|
}%
|
|
\def\toc@pre{}%
|
|
\def\toc@post{}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\toc@@font}
|
|
% Interface for setting the formatting characteristics of this part
|
|
% of the TOC.
|
|
%
|
|
% Note: \cmd\toc@@font\ is the common font for all auto-sizing toc commands,
|
|
% although this, too, could become a dispatcher.
|
|
% \changes{4.1a}{2008/01/19}{(AO, 461) Change the csname from \cs{@dotsep} to \cs{ltxu@dotsep}. The former is understood in mu. (What we wanted was a dimension.)}%
|
|
% \begin{macrocode}
|
|
\def\toc@@font{}%
|
|
\def\ltxu@dotsep{\z@}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\l@section}
|
|
% Interface for determining which TOC elements are automatically indented.
|
|
%
|
|
% All of the \cmd\l@\dots\ commands simply go through the
|
|
% utility procedure \cmd\l@@sections. The calling convention is
|
|
% to pass the name of self and the name of parent.
|
|
% If you want to exclude any of these from the indentation
|
|
% scheme, simply leave the \cmd\l@\dots\ command undefined.
|
|
%
|
|
% Note that the parent of ``section'' is nil, so we have to define a stub.
|
|
% \begin{verbatim}\def\l@section{\l@@sections{}{section}}% Implicit #3#4\end{verbatim}
|
|
% \begin{verbatim}\def\tocleft@{\z@}%\end{verbatim}
|
|
% \begin{verbatim}\def\l@subsection{\l@@sections{section}{subsection}}% Implicit #3#4\end{verbatim}
|
|
% \begin{verbatim}\def\l@subsubsection{\l@@sections{subsection}{subsubsection}}% Implicit #3#4\end{verbatim}
|
|
% \begin{verbatim}\def\l@paragraph{\l@@sections{subsubsection}{paragraph}}% Implicit #3#4\end{verbatim}
|
|
% \begin{verbatim}\def\l@subparagraph#1#2{\l@@sections{paragraph}{subparagraph}}% Implicit #3#4\end{verbatim}
|
|
% \end{macro}
|
|
%
|
|
% Glom some \cmd\dimen\ registers.
|
|
% \begin{macrocode}
|
|
\let\tocdim@section \leftmargini
|
|
\let\tocdim@subsection \leftmarginii
|
|
\let\tocdim@subsubsection \leftmarginiii
|
|
\let\tocdim@paragraph \leftmarginiv
|
|
\let\tocdim@appendix \leftmarginv
|
|
\let\tocdim@pagenum \leftmarginvi
|
|
% \end{macrocode}
|
|
%
|
|
% \begin{macro}{\toc@pre@auto}
|
|
% \begin{macro}{\toc@post@auto}
|
|
% We patch \cmd\@starttoc\ to:
|
|
% 1) before TOC processing,
|
|
% initialize the max registers and
|
|
% set the needed dimensions from
|
|
% the values stored in the auxiliary file, and
|
|
% 2) after TOC processing,
|
|
% store out those max register values into the auxiliary file.
|
|
%
|
|
% Note that the font is set here: all other TOC entries must
|
|
% override these font settings.
|
|
%
|
|
% To activate this override of the standard \LaTeX\ processing,
|
|
% the substyle does: \cmd\let\cmd\toc@pre\cmd\toc@pre@auto\
|
|
% and \cmd\let\cmd\toc@post\cmd\toc@post@auto.
|
|
% \begin{macrocode}
|
|
\def\toc@pre@auto{%
|
|
\toc@@font
|
|
\@tempdima\z@
|
|
\toc@setindent\@tempdima{section}%
|
|
\toc@setindent\@tempdima{subsection}%
|
|
\toc@setindent\@tempdima{subsubsection}%
|
|
\toc@setindent\@tempdima{paragraph}%
|
|
\toc@letdimen{appendix}%
|
|
\toc@letdimen{pagenum}%
|
|
}%
|
|
\def\toc@post@auto{%
|
|
\if@filesw
|
|
\begingroup
|
|
\toc@writedimen{section}%
|
|
\toc@writedimen{subsection}%
|
|
\toc@writedimen{subsubsection}%
|
|
\toc@writedimen{paragraph}%
|
|
\toc@writedimen{appendix}%
|
|
\toc@writedimen{pagenum}%
|
|
\endgroup
|
|
\fi
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\toc@setindent}
|
|
% \begin{macrocode}
|
|
\def\toc@setindent#1#2{%
|
|
\csname tocdim@#2\endcsname\tocdim@min\relax
|
|
\@ifundefined{tocmax@#2}{\@namedef{tocmax@#2}{\z@}}{}%
|
|
\advance#1\@nameuse{tocmax@#2}\relax
|
|
\expandafter\edef\csname tocleft@#2\endcsname{\the#1}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\toc@letdimen}
|
|
% \begin{macrocode}
|
|
\def\toc@letdimen#1{%
|
|
\csname tocdim@#1\endcsname\tocdim@min\relax
|
|
\@ifundefined{tocmax@#1}{\@namedef{tocmax@#1}{\z@}}{}%
|
|
\expandafter\let\csname tocleft@#1\expandafter\endcsname\csname tocmax@#1\endcsname
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\toc@writedimen}
|
|
% \begin{macrocode}
|
|
\def\toc@writedimen#1{%
|
|
\immediate\write\@auxout{%
|
|
\gdef\expandafter\string\csname tocmax@#1\endcsname{%
|
|
\expandafter\the\csname tocdim@#1\endcsname
|
|
}%
|
|
}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\l@@sections}
|
|
% The procedure for formatting the indented TOC entries.
|
|
% We use control sequence names such as \cmd\tocmax@section\ and
|
|
% \cmd\tocleft@section, the former being written to the auxiliary file
|
|
% and the latter only defined for the duration of the TOC processing.
|
|
%
|
|
% Note that the assignment of \cmd\box\cmd\@tempboxa\ by \cmd\set@tocdim@pagenum\
|
|
% must endure over the invocation of |#3|: it contains the
|
|
% page number which will be set just before the \cmd\par.
|
|
%
|
|
% The arguments:\begin{enumerate}
|
|
% \item[\#1] superior section
|
|
% \item[\#2] this section
|
|
% \item[\#3] content, including possible \cmd\numberline
|
|
% \item[\#4] page number\end{enumerate}
|
|
% \begin{macrocode}
|
|
\def\l@@sections#1#2#3#4{%
|
|
\begingroup
|
|
\everypar{}%
|
|
\set@tocdim@pagenum\@tempboxa{#4}%
|
|
\global\@tempdima\csname tocdim@#2\endcsname
|
|
\leftskip\csname tocleft@#2\endcsname\relax
|
|
\dimen@\csname tocleft@#1\endcsname\relax
|
|
\parindent-\leftskip\advance\parindent\dimen@
|
|
\rightskip\tocleft@pagenum plus 1fil\relax
|
|
\skip@\parfillskip\parfillskip\z@
|
|
\let\numberline\numberline@@sections
|
|
\@nameuse{l@f@#2}%
|
|
\ignorespaces#3\unskip\nobreak\hskip\skip@
|
|
\hb@xt@\rightskip{\hfil\unhbox\@tempboxa}\hskip-\rightskip\hskip\z@skip
|
|
% \end{macrocode}
|
|
% \changes{4.1n}{2009/12/13}{(AO, 574) protect against \classname{lineno.sty}, which forces a visit to the output routine, which appears to destroy the value of \cs{@tempdima}}%
|
|
%
|
|
% By side effect, set the value of, e.g., \cmd\tocdim@section.
|
|
%
|
|
% Note that the \cmd\par\ must not be executed before the value of \cmd\@tempdima\ is expanded (outside the current group).
|
|
% Otherwise, the \classname{lineno.sty} package may interfere (it unfortunately does a global assignment of \cmd\@tempdima).
|
|
% \begin{macrocode}
|
|
\expandafter\par
|
|
\expandafter\aftergroup\csname tocdim@#2%
|
|
\expandafter\endcsname
|
|
\expandafter\endgroup
|
|
\the\@tempdima\relax
|
|
}%
|
|
% \end{macrocode}
|
|
% \changes{4.1a}{2008/01/19}{(AO, 479) Per: Dylan Thurston<dpt at math.harvard.edu>}%
|
|
% In the call to \cmd\set@tocdim@pagenum, I am now exposing the use of the particular box register.
|
|
% \begin{macrocode}
|
|
\def\set@tocdim@pagenum#1#2{%
|
|
\setbox#1\hbox{\ignorespaces#2}%
|
|
\@ifdim{\tocdim@pagenum<\wd#1}{\global\tocdim@pagenum\wd#1}{}%
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\numberline@@sections}
|
|
% \changes{4.1a}{2008/01/19}{(AO, 461) Change the csname from \cs{@dotsep} to \cs{ltxu@dotsep}. The former is understood in mu. (What we wanted was a dimension.)}%
|
|
% The utility procedure for all \cmd\numberline\ processing in indented TOC entries.
|
|
% The first argument is self.
|
|
%
|
|
% We use \cmd\@tempdima\ to pass a value around (via global assignment) because
|
|
% \cmd\numberline\ executes inside a group if the
|
|
% \classname{hyperref} package is loaded.
|
|
% Would that it were not so!
|
|
% \begin{macrocode}
|
|
\def\numberline@@sections#1{%
|
|
\leavevmode\hb@xt@-\parindent{%
|
|
\hfil
|
|
\@if@empty{#1}{}{%
|
|
\setbox\z@\hbox{#1.\kern\ltxu@dotsep}%
|
|
\@ifdim{\@tempdima<\wd\z@}{\global\@tempdima\wd\z@}{}%
|
|
\unhbox\z@
|
|
}%
|
|
}%
|
|
\ignorespaces
|
|
}%
|
|
\def\tocdim@min{\z@}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Lists}
|
|
% \begin{macro}{\list}
|
|
% Using \cmd\parshape\ to implement lists was always suspect
|
|
% (can you get behind \cmd\parshape\cmd\@ne?) and we now see that
|
|
% it was a mistake all along. Why? Because \cmd\parshape, like
|
|
% \cmd\hangindent, achieves its effect via ``shifting'' the \cmd\hbox es
|
|
% in a paragraph
|
|
% instead of using \cmd\leftskip\ and \cmd\parindent, which is
|
|
% robust during column balancing.
|
|
%
|
|
% We introduce the alternative method with a hook into
|
|
% the \LaTeX\ kernel procedure \cmd\list, which is
|
|
% the implementation of all lists.
|
|
%
|
|
% \begin{macrocode}
|
|
\def\list#1#2{%
|
|
\ifnum \@listdepth >5\relax
|
|
\@toodeep
|
|
\else
|
|
\global\advance\@listdepth\@ne
|
|
\fi
|
|
\rightmargin\z@
|
|
\listparindent\z@
|
|
\itemindent\z@
|
|
\csname @list\romannumeral\the\@listdepth\endcsname
|
|
\def\@itemlabel{#1}%
|
|
\let\makelabel\@mklab
|
|
\@nmbrlistfalse
|
|
#2\relax
|
|
\@trivlist
|
|
\parskip\parsep
|
|
\set@listindent
|
|
\ignorespaces
|
|
}%
|
|
\def\set@listindent@parshape{%
|
|
\parindent\listparindent
|
|
\advance\@totalleftmargin\leftmargin
|
|
\advance\linewidth-\rightmargin
|
|
\advance\linewidth-\leftmargin
|
|
\parshape\@ne\@totalleftmargin\linewidth
|
|
}%
|
|
\def\set@listindent@{%
|
|
\parindent\listparindent
|
|
\advance\@totalleftmargin\leftmargin
|
|
\advance\rightskip\rightmargin
|
|
\advance\leftskip\@totalleftmargin
|
|
}%
|
|
\let\set@listindent\set@listindent@parshape
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \subsection{Hypertext capabilities}
|
|
%
|
|
% \begin{macro}{\href}
|
|
% \begin{macro}{\url}
|
|
% \begin{macro}{\URL@prefix}
|
|
% \begin{macro}{\doi}
|
|
% \begin{macro}{\doibase}
|
|
% \changes{4.1b}{2008/08/12}{(AO, 487) Support for video figures and the \cs{setfloatlink} command}%
|
|
% We provide support for the \cmd\href, \cmd\url, and \cmd\doi\ commands.
|
|
% Packages, like \classname{hyperref}, may override these definitions
|
|
% and provide better semantics.
|
|
% \changes{4.1g}{2009/10/06}{(AO, 532) Both arguments of \cs{href} get sanitized}%
|
|
% \changes{4.1j}{2009/10/24}{(AO, 545) Provide definition for \cs{doi} that does hypertext}%
|
|
% \begin{macrocode}
|
|
\providecommand\href[0]{\begingroup\@sanitize@url\@href}%
|
|
\def\@href#1{\@@startlink{#1}\endgroup\@@href}%
|
|
\def\@@href#1{#1\@@endlink}%
|
|
\providecommand \url [0]{\begingroup\@sanitize@url \@url }%
|
|
\def \@url #1{\endgroup\@href {#1}{\URL@prefix#1}}%
|
|
\providecommand \URL@prefix [0]{URL }%
|
|
\providecommand\doi[0]{\begingroup\@sanitize@url\@doi}%
|
|
\def\@doi#1{\endgroup\@@startlink{\doibase#1}doi:\discretionary {}{}{}#1\@@endlink }%
|
|
%changes{4.2a}{2017/11/21}{(MD) Use updated best practice to use https and doi.org}%
|
|
\providecommand \doibase [0]{https://doi.org/}%
|
|
\providecommand \@sanitize@url[0]{\chardef\cat@space\the\catcode`\ \@sanitize\catcode`\ \cat@space}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\@@startlink}
|
|
% \begin{macro}{\@@endlink}
|
|
% \begin{macro}{\pdfstartlink@attr}
|
|
% \begin{macro}{\hypertext@enable@ltx}
|
|
% How we define \cmd\@@startlink\ and \cmd\@@endlink\ will depend on
|
|
% whether we are running under \textsc{pdflatex}.
|
|
% If so, and if PDF output is requested, then we use its primitives
|
|
% to implement hypertext,
|
|
% breaking out the link attributes in \cmd\pdfstartlink@attr\
|
|
% and using the \classname{hyperref} defaults;
|
|
% \cmd\pdfstartlink@attr\ can be redefined by a client package.
|
|
% Otherwise we fall back the Hyper\TeX\ standard and leave things to the DVI translator.
|
|
% \changes{4.1j}{2009/10/25}{(AO, 545) hypertext capabilities off by default; enable with \classoption{hypertext}}
|
|
%
|
|
% A class or package that wishes to employ hypertext capabilities should
|
|
% execute the \cmd\hypertext@enable@ltx\ procedure.
|
|
% \begin{macrocode}
|
|
\def\@@startlink#1{}%
|
|
\def\@@endlink{}%
|
|
\@ifxundefined \pdfoutput {\true@sw}{\@ifnum{\z@=\pdfoutput}{\true@sw}{\false@sw}}%
|
|
{%
|
|
\def\@@startlink@hypertext#1{\leavevmode\special{html:<a href="#1">}}%
|
|
\def\@@endlink@hypertext{\special{html:</a>}}%
|
|
}{%
|
|
\def\@@startlink@hypertext#1{%
|
|
\leavevmode
|
|
\pdfstartlink\pdfstartlink@attr
|
|
user{/Subtype/Link/A<</Type/Action/S/URI/URI(#1)>>}%
|
|
\relax
|
|
}%
|
|
\def\@@endlink@hypertext{\pdfendlink}%
|
|
\def\pdfstartlink@attr{attr{/Border[0 0 1 ]/H/I/C[0 1 1]}}%
|
|
}%
|
|
\def\hypertext@enable@ltx{%
|
|
\let\@@startlink\@@startlink@hypertext
|
|
\let\@@endlink\@@endlink@hypertext
|
|
}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
% \end{macro}
|
|
%
|
|
% \begin{macro}{\href}
|
|
% \changes{4.1p}{2010/02/24}{(AO, 582) A patch of \classname{hyperref.sty} to provide backward compatibility to \TeX Live 2007's version 6.75r}%
|
|
% The \cmd\href\ command of \classname{hyperref} was extend somewhere
|
|
% between versions 6.75r and 6.80e. We apply a repair to the earlier
|
|
% version (if present) so that it works like the later version.
|
|
%
|
|
% The issue is the presence of whitespace, either following the \cmd\href\ token
|
|
% or following the first argument's closing brace character.
|
|
%
|
|
% \begin{macrocode}
|
|
\def\href@Hy{\hyper@normalise \href@ }%
|
|
\def\href@Hy@ltx{\@ifnextchar\bgroup\Hy@href{\hyper@normalise\href@}}%
|
|
\def\Hy@href#{\hyper@normalise\href@}%
|
|
\begingroup
|
|
\endlinechar=-1 %
|
|
\catcode`\^^A=14 %
|
|
\catcode`\^^M\active
|
|
\catcode`\%\active
|
|
\catcode`\#\active
|
|
\catcode`\_\active
|
|
\catcode`\$\active
|
|
\catcode`\&\active
|
|
\gdef\hyper@normalise@ltx{^^A
|
|
\begingroup
|
|
\catcode`\^^M\active
|
|
\def^^M{ }^^A
|
|
\catcode`\%\active
|
|
\let%\@percentchar
|
|
\let\%\@percentchar
|
|
\catcode`\#\active
|
|
\def#{\hyper@hash}^^A
|
|
\def\#{\hyper@hash}^^A
|
|
\@makeother\&^^A
|
|
\edef&{\string&}^^A
|
|
\edef\&{\string&}^^A
|
|
\edef\textunderscore{\string_}^^A
|
|
\let\_\textunderscore
|
|
\catcode`\_\active
|
|
\let_\textunderscore
|
|
\let~\hyper@tilde
|
|
\let\~\hyper@tilde
|
|
\let\textasciitilde\hyper@tilde
|
|
\let\\\@backslashchar
|
|
\edef${\string$}^^A
|
|
\Hy@safe@activestrue
|
|
\hyper@n@rmalise
|
|
}^^A
|
|
\catcode`\#=6 ^^A
|
|
\gdef\Hy@ActiveCarriageReturn@ltx{^^M}^^A
|
|
\gdef\hyper@n@rmalise@ltx#1#2{^^A
|
|
\def\Hy@tempa{#2}^^A
|
|
\ifx\Hy@tempa\Hy@ActiveCarriageReturn
|
|
\Hy@ReturnAfterElseFi{^^A
|
|
\hyper@@normalise{#1}^^A
|
|
}^^A
|
|
\else
|
|
\Hy@ReturnAfterFi{^^A
|
|
\hyper@@normalise{#1}{#2}^^A
|
|
}^^A
|
|
\fi
|
|
}^^A
|
|
\gdef\hyper@@normalise@ltx#1#2{^^A
|
|
\edef\Hy@tempa{^^A
|
|
\endgroup
|
|
\noexpand#1{\Hy@RemovePercentCr#2%^^M\@nil}^^A
|
|
}^^A
|
|
\Hy@tempa
|
|
}^^A
|
|
\gdef\Hy@RemovePercentCr@ltx#1%^^M#2\@nil{^^A
|
|
#1^^A
|
|
\ifx\limits#2\limits
|
|
\else
|
|
\Hy@ReturnAfterFi{^^A
|
|
\Hy@RemovePercentCr #2\@nil
|
|
}^^A
|
|
\fi
|
|
}^^A
|
|
\endgroup
|
|
\def\switch@hyperref@href{%
|
|
\expandafter\@ifx\expandafter{\csname href \endcsname\href@Hy}{
|
|
\class@info{Repairing hyperref 6.75r \string\href}%
|
|
\let\hyper@normalise\hyper@normalise@ltx
|
|
\let\hyper@@normalise\hyper@@normalise@ltx
|
|
\let\hyper@n@rmalise\hyper@n@rmalise@ltx
|
|
\let\Hy@ActiveCarriageReturn\Hy@ActiveCarriageReturn@ltx
|
|
\let\Hy@RemovePercentCr\Hy@RemovePercentCr@ltx
|
|
\let\href\href@Hy@ltx
|
|
}{}%
|
|
}%
|
|
\appdef\document@inithook{\switch@hyperref@href}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
%
|
|
% \begin{macro}{\typeout}
|
|
% We make the \cmd\typeout\ procedure of \LaTeX\ be \cmd\long,
|
|
% because sometimes we are talking about \cmd\par.
|
|
% \begin{macrocode}
|
|
\def\typeout@org#1{%
|
|
\begingroup
|
|
\set@display@protect
|
|
\immediate\write\@unused{#1}%
|
|
\endgroup
|
|
}%
|
|
\long\def\typeout@ltx#1{%
|
|
\begingroup
|
|
\set@display@protect
|
|
\immediate\write\@unused{#1}%
|
|
\endgroup
|
|
}%
|
|
\@ifx{\typeout\typeout@org}{%
|
|
\let\typeout\typeout@ltx
|
|
\true@sw
|
|
}{%
|
|
\rvtx@ifformat@geq{2020/10/01}%
|
|
{\true@sw}{\false@sw}%
|
|
}%
|
|
{\class@info{Making \string\typeout\space \string\long}}%
|
|
{}%
|
|
% \end{macrocode}
|
|
% \end{macro}
|
|
%
|
|
% \subsection{End of the \file{kernel} {\sc docstrip} module}
|
|
% Here ends the module.
|
|
% \begin{macrocode}
|
|
%</kernel>
|
|
% \end{macrocode}
|
|
%
|
|
% \Finale
|
|
% \iffalse Here ends the programmer's documentation.\fi
|
|
% \endinput
|
|
%
|
|
\endinput
|
|
%%EOF
|