https://github.com/latex3/latex2e
Tip revision: d4c0442683ffb0f84313b5715f1538c5ee99545d authored by Joseph Wright on 06 February 2020, 17:58:41 UTC
Set pre-release level
Set pre-release level
Tip revision: d4c0442
latexrelease.dtx
% \iffalse meta-comment
%
% Copyright (C) 1993-2020
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
% This file is part of the LaTeX base system.
% -------------------------------------------
%
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
% The list of all files belonging to the LaTeX base distribution is
% given in the file `manifest.txt'. See also `legal.txt' for additional
% information.
%
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
%
% \fi
%
% \iffalse
%
%<*dtx>
\def\latexreleaseversion{<date only known in .sty file>}
\ProvidesFile{latexrelease.dtx}
%</dtx>
%<driver>\ProvidesFile{latexrelease.drv}
%<fixltx2e>\ProvidesPackage{fixltx2e}
%<fixltx2e> [2016/12/29 v2.1a fixes to LaTeX (obsolete)]
%<latexrelease>\ProvidesPackage{latexrelease}
%<*!fixltx2e>
% \fi
% \ProvidesFile{latexrelease.dtx}
[2018/05/08 v1.0k LaTeX release emulation and tests
(including releases up to \latexreleaseversion)]
% \iffalse
%</!fixltx2e>
%<*driver>
\documentclass{ltxdoc}
\newcommand\Lopt[1]{\textsf{#1}}
\let\Lpack\Lopt
\providecommand{\file}[1]{\texttt{#1}}
\providecommand{\MF}{\textsf{Metafont}}
\providecommand{\danger}{\marginpar[\hfill\protect\Huge!!]{\protect\Huge!!\hfill}}
\begin{document}
\DocInput{latexrelease.dtx}
\end{document}
%</driver>
% \fi
%
% \changes{v1.0i}{2017/12/17}{Add \cs{latexreleaseversion} info
% to \cs{ProvidesPackage} output}
%
%
% \let\package\textsf
%
%
% \GetFileInfo{latexrelease.dtx}
%
% \title{The \Lpack{latexrelease} package\thanks{This file
% has version number \fileversion, last
% revised \filedate.}}
% \author{The \LaTeX3 Project}
% \date{\filedate}
% \MaintainedByLaTeXTeam{latex}
% \maketitle
%
% \section{Introduction}
% Prior to the 2015 release of \LaTeX{}, essentially no changes had been
% made to the \LaTeX\ format code for some years, with all
% improvements being instead added to the package \Lpack{fixltx2e}.
%
% While this worked at a technical level it meant that you had to
% explicitly opt-in to bug fixes and improvements, and the vast
% majority of documents did not benefit.
%
% As described in \LaTeX\ News 22, a new policy is being implemented
% in which improvements will now be added to the format by default,
% and this \Lpack{latexrelease} package may be used to ensure
% stability where needed, either by making a new format use an older
% definition of some commands, or conversely may be used to supply the
% new definitions for use with an old format.
%
% The basic use is:
%\begin{verbatim}
% \RequirePackage[2015/01/01]{latexrelease}
% \documentclass{article}
% ....
%\end{verbatim}
%
% After such a declaration the document will use definitions current
% in the January 2015 \LaTeX{}, whether the actual format being used is
% older, or newer than that date. In the former case a copy of
% |latexrelease.sty| would need to be made available for use with the
% older format. This may be used, for example, to share a document
% between co-workers using different \LaTeX\ releases, or to protect a
% document from being affected by system updates. As well as the
% definitions within the format itself, individual packages may use
% the commands defined here to adjust their definitions to the
% specified date as described below.
%
% Note that the \Lpack{latexrelease} package is intended for use
% at the start of a \emph{document}. Package and class code should not
% include this package as loading a package should not normally globally
% reset the effective version of \LaTeX\ that is in force, so affecting all
% other packages used in the document.
%
%
% The bulk of this package, after some initial setup and option
% handling consists of a series of |\IncludeInRelease| commands
% which have been extracted from the main source files of the \LaTeX\
% format. These contain the old and new versions of any commands with
% modified definitions.
%
% \section{Package Options}
% \begin{itemize}
% \item \emph{yyyy/mm/dd} or \emph{yyyy-nn-dd}
% The package accepts any possible \LaTeX\ format date as argument,
% although dates in the future for which the current release of this
% package has no information will generate a warning. Dates
% earlier than 2015 will work but will roll back to some point in 2015
% when the method was introduced.
% |\IncludeInRelease| command is defined.
% The |\requestedLaTeXdate| is set to the normalized date argument
% so that package rollback defaults to the specified date.
%
% \item%
% |current| This is the default behaviour, it does not change the
% effective date of the format but does ensure that the
% |\IncludeInRelease| command is defined.
% the |\requestedLaTeXdate| is reset to 0 so that package rollback
% does not use the implicit date.
% |\IncludeInRelease| command is defined.
% The |\requestedLaTeXdate| macro is reset to 0 so that package rollback
% does not use the implicit date.
%
% \item
% |latest| sets the effective date of the format to the release date
% of this file, so in an older format applies all patches currently
% available.
% |\IncludeInRelease| command is defined.
% The |\requestedLaTeXdate| macro is reset to 0 so that package rollback
% does not use the implicit date.
% \end{itemize}
%
%
% \section{Release Specific Code}
%
% The |\IncludeInRelease| mechanism allows the kernel developer to
% associate code with a specific date to choose different versions of
% definitions depending on the date specified as an option to the
% \Lpack{latexrelease} package. Is also available for use by package
% authors (or even in a document if necessary).
%
% \medskip
%
% \noindent\DescribeMacro{\IncludeInRelease}
% \marg{code-date}^^A
% \oarg{format-date}%^^A
% \marg{label}^^A
% \marg{message}^^A
% \meta{code}^^A
% |\EndIncludeInRelease|
%
% \begin{description}
%
% \item[\marg{code-date}] This date is associated with the \marg{code}
% argument and will be compared to the requested date in the option to
% the \Lpack{latexrelease}.
%
% \item[\oarg{format-date}] This optional argument can be used to
% specify a format date with the code in addition to the mandatory
% \marg{code-date} argument. This can be useful for package developers
% as described below.
%
% \item[\marg{label}] The \marg{label} argument is an identifier
% (string) that within a given package must be a unique label for each
% related set of optional definitions. Per package at most one code
% block from all the |\IncludeInRelease| declarations with the same
% label will be executed.
%
% \item[\marg{message}]
% The \marg{message} is an informative string that is used in
% messages. It has no other function.
%
% \item[\meta{code}]
% Any \TeX\ code after the |\IncludeInRelease| arguments
% up until the and the following |\EndIncludeInRelease|
% is to be
% conditionally included depending on the date of the format as
% described below.
%
% \end{description}
%
% The |\IncludeInRelease| declarations with a given label should be in
% reverse chronological order in the file. The one chosen will depend
% on this order, the effective format version and the date options, as
% described below.
%
% If your package \Lpack{mypackage} defines a |\widget| command but
% has one definition using the features available in the 2015 \LaTeX\
% release, and a different definition is required for older formats
% then you can use:
%\begin{verbatim}
% \IncludeInRelease{2015/01/01}{\widget}{Widget Definition}
% \def\widget{new version}%
% \EndIncludeInRelease
%
% \IncludeInRelease{0000/00/00}{\widget}{Widget Definition}
% \def\widget{old version}%
% \EndIncludeInRelease
%\end{verbatim}
%
% If a document using this package is used with a format with
% effective release date of 2015/01/01 or later the new code will be
% used, otherwise the old code will be used. Note the \emph{effective
% release date} might be the original \LaTeX\ release date as shown at
% the start of every \LaTeX\ job, or it may be set by the
% \Lpack{latexrelease} package, so for example a document author who
% wants to ensure the new version is used could use
%\begin{verbatim}
% \RequirePackage[2015/01/01]{latexrelease}
% \documentclass{article}
% \usepackage{mypackage}
%\end{verbatim}
%
% If the document is used with a \LaTeX\ format from 2014 or before,
% then \Lpack{latexrelease} will not have been part of the original
% distribution, but it may be obtained from a later \LaTeX\ release or
% from CTAN and distributed with the document, it will make an older
% \LaTeX\ release act essentially like the 2015 release.
%
% \subsection{Intermediate Package Releases}
%
% The above example works well for testing against the latex format
% but is not always ideal for controlling code by the release date of
% the \emph{package}. Suppose \LaTeX\ is not updated but in March you
% update the \Lpack{mypackage} package and modify the definition of
% |\widget|. You could code the package as:
%\begin{verbatim}
% \IncludeInRelease{2015/03/01}{\widget}{Widget Definition}
% \def\widget{even newer improved March version}%
% \EndIncludeInRelease
%
% \IncludeInRelease{2015/01/01}{\widget}{Widget Definition}
% \def\widget{new version}%
% \EndIncludeInRelease
%
% \IncludeInRelease{0000/00/00}{\widget}{Widget Definition}
% \def\widget{old version}%
% \EndIncludeInRelease
%\end{verbatim}
%
% This would work and allow a document author to choose a date such as
%\begin{verbatim}
% \RequirePackage[2015/03/01]{latexrelease}
% \documentclass{article}
% \usepackage{mypackage}
%\end{verbatim}
%
% To use the latest version, however it would have disadvantage that
% until the next release of \LaTeX, by default, if the document does
% not use \Lpack{latexrelease} to specify a date, the new improved
% code will not be selected as the effective date will be 2015/01/01
% and so the first code block will be skipped.
%
% For this reason |\IncludeInRelease| has an optional argument that
% specifies an alternative date to use if a date option has not been
% specified to \Lpack{latexrelease}.
%\begin{verbatim}
% \IncludeInRelease{2015/03/01}[2015/01/01]{\widget}{Widget Definition}
% \def\widget{even newer improved March version}%
% \EndIncludeInRelease
%
% \IncludeInRelease{2015/01/01}{\widget}{Widget Definition}
% \def\widget{new version}%
% \EndIncludeInRelease
%
% \IncludeInRelease{0000/00/00}{\widget}{Widget Definition}
% \def\widget{old version}%
% \EndIncludeInRelease
%\end{verbatim}
%
% Now, by default on a 2015/01/01 \LaTeX\ format, the first code block
% will compare the format date to the optional argument 2015/01/01
% and so will execute the \emph{even newer improved} version. The
% remaining blocks using the |\widget| label argument will all then be
% skipped.
%
% If on the other hand the document requests an explicit release date
% using \Lpack{latexrelease} then this date will be used to decide what
% code block to include.
%
% \subsection{Using \cs{IncludeInRelease} in Packages}
%
% If |\IncludeInRelease| is used within a package then all such
% conditional code needs to be within such declarations, e.g., it is
% not possible in the above example to have the ``current'' definition
% of |\widget| somewhere in the main code and only the two older
% definitions inside |\IncludeInRelease| declarations. If you would do
% this then one of those |\IncludeInRelease| declarations would be
% included overwriting the even newer code in the main part of the
% package. As a result your package may get fragmented over time with
% various |\IncludeInRelease| declarations sprinkled throughout your
% code or you have to interrupt the reading flow by putting those
% declarations together but not necessarily in the place where they
% belong.
%
% To avoid this issue you can use the following coding
% strategy: place the current |\widget| definition in the main code
% where it correctly belongs.
% \begin{verbatim}
% ...
% \def\widget {even newer improved March version}
% \def\@widget{newly added helper command no defined in older releases}
% ...
%\end{verbatim}
% Then, near the end of your package place
% the following:
% \begin{verbatim}
% \IncludeInRelease{2015/03/01}[2015/01/01]{\widget}{Widget Definition}
% \EndIncludeInRelease
%
% \IncludeInRelease{2015/01/01}{\widget}{Widget Definition}
% \def\widget{new version}%
% \let\@widget\@undefined % this doesn't exist in earlier releases
% \EndIncludeInRelease
%
% \IncludeInRelease{0000/00/00}{\widget}{Widget Definition}
% \def\widget{old version}%
% \EndIncludeInRelease
%\end{verbatim}
% This way the empty code block hides the other |\IncludeInRelease|
% declarations unless there is an explicit request with a date
% 2015/01/01 or earlier.
%
% Now if you make a further change to |\widget| in the future you
% simply copy the current definition into the empty block and add a new
% empty declaration with todays date and the current format date. This
% way your main code stays readable and the old versions accumulate at
% the end of the package.\footnote{Of course there may be some cases
% in which the old code has to be in a specific place within the
% package as other code depends on it (e.g., if you
% \texttt{\string\let} something to it). In that case you have to
% place the code variations in the right place in your package rather
% than accumulating them at the very end.}
%
% The only other ``extra effort'' necessary when using this approach
% is that it may be advisable to undo new definitions in the code
% block for the previous release, e.g., in the above example we
% undefined |\@widget| as that isn't available in the 2015/01/01
% release but was defined in the main code. If all your conditional
% code is within |\IncludeInRelease| declarations that wouldn't been
% necessary as the new code only gets defined if that release is
% chosen.
%
% \section{fixltx2e}
%
% As noted above, prior to the 2015 \LaTeX\ release updates to the
% \LaTeX\ kernel were not made in the format source files but were
% made available in the \Lpack{fixltx2e} package. That package is no
% longer needed but we generate a small package from this source
% that just makes a warning message but otherwise does nothing.
%
%
%
%
%
% \StopEventually{}
%
% \section{Implementation}
%
% We require at least a somewhat sane version of \LaTeXe{}. Earlier
% ones where really quite different from one another.
% \begin{macrocode}
%<*latexrelease>
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
% \end{macrocode}
%
% \section{Setup}
%
% \begin{macro}{\IncludeInRelease}
% \begin{macro}{\EndIncludeInRelease}
% \begin{macrocode}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \changes{v1.0c}{2015/02/19}{Swap argument order}
% \changes{v1.0k}{2018/05/08}{reset \cs{\requestedLaTeXdate} for current and latest options, gitub issue 43}
% \begin{macrocode}
\DeclareOption*{%
\def\@IncludeInRelease#1[#2]{\@IncludeInRele@se{#1}}%
\let\requestedpatchdate\CurrentOption}
\DeclareOption{latest}{%
\let\requestedpatchdate\latexreleaseversion
\AtEndOfPackage{\def\requestedLaTeXdate{0}}}
\DeclareOption{current}{%
\let\requestedpatchdate\fmtversion
\AtEndOfPackage{\def\requestedLaTeXdate{0}}}
% \end{macrocode}
%
% \begin{macrocode}
\let\requestedpatchdate\fmtversion
\ProcessOptions\relax
% \end{macrocode}
%
% Sanity check options, it allows some non-legal dates but always
% ensures |requestedLaTeXdate| gets set to a number. Generate an
% error if there are any non digit tokens remaining after removing the
% |//|.
% \changes{v1.0j}{2018/01/30}{Explain both date formats in error message}
% \begin{macrocode}
\def\reserved@a{%
\edef\requestedLaTeXdate{\the\count@}%
\reserved@b}
\def\reserved@b#1\\{%
\def\reserved@b{#1}%
\ifx\reserved@b\@empty\else
\PackageError{latexrelease}%
{Unexpected option \requestedpatchdate}%
{The option must be of the form yyyy/mm/dd or yyyy-mm-dd}%
\fi}
\afterassignment\reserved@a
\count@\expandafter
\@parse@version\expandafter0\requestedpatchdate//00\@nil\\
% \end{macrocode}
%
% less precautions needed for |\fmtversion|
% \begin{macrocode}
\edef\currentLaTeXdate{%
\expandafter\@parse@version\fmtversion//00\@nil}
% \end{macrocode}
%
% \begin{macrocode}
\ifnum\requestedLaTeXdate=\currentLaTeXdate
\PackageWarningNoLine{latexrelease}{%
Current format date selected, no patches applied}
\expandafter\endinput
\fi
% \end{macrocode}
%
% A newer version of latexrelease should have been distributed with
% the later format.
% \begin{macrocode}
\ifnum\currentLaTeXdate
>\expandafter\@parse@version\latexreleaseversion//00\@nil
\PackageWarningNoLine{latexrelease}{%
The current package is for an older LaTeX format:\MessageBreak
LaTeX \latexreleaseversion\space\MessageBreak
Obtain a newer version of this package!}
\expandafter\endinput
\fi
% \end{macrocode}
% can't patch into the future, could make this an error
% but it has some uses to control package updates
% so allow for now.
% \begin{macrocode}
\ifnum\requestedLaTeXdate
>\expandafter\@parse@version\latexreleaseversion//00\@nil
\PackageWarningNoLine{latexrelease}{%
The current package is for LaTeX \latexreleaseversion:\MessageBreak
It has no patches beyond that date\MessageBreak
There may be an updated version\MessageBreak
of this package available from CTAN}
\expandafter\endinput
\fi
% \end{macrocode}
%
% Update the format version to the requested date.
% \begin{macrocode}
\let\fmtversion\requestedpatchdate
\let\currentLaTeXdate\requestedLaTeXdate
% \end{macrocode}
%
%
% \section{Individual Changes}
%
% The code for each change will be inserted at this point, extracted
% from the kernel source files.
%
% \begin{macrocode}
%</latexrelease>
% \end{macrocode}
%
% \section{fixltx2e}
%
% Generate a stub \Lpack{fixltx2e} package:
% \begin{macrocode}
%<*fixltx2e>
\IncludeInRelease{2015/01/01}{\fixltxe}{Old fixltx2e package}
\NeedsTeXFormat{LaTeX2e}
\PackageWarningNoLine{fixltx2e}{%
fixltx2e is not required with releases after 2015\MessageBreak
All fixes are now in the LaTeX kernel.\MessageBreak
See the latexrelease package for details}
\EndIncludeInRelease
\IncludeInRelease{0000/00/00}{\fixltxe}{Old fixltx2e package}
\def\@outputdblcol{%
\if@firstcolumn
\global\@firstcolumnfalse
\global\setbox\@leftcolumn\copy\@outputbox
\splitmaxdepth\maxdimen
\vbadness\maxdimen
\setbox\@outputbox\vbox{\unvbox\@outputbox\unskip}%
\setbox\@outputbox\vsplit\@outputbox to\maxdimen
\toks@\expandafter{\topmark}%
\xdef\@firstcoltopmark{\the\toks@}%
\toks@\expandafter{\splitfirstmark}%
\xdef\@firstcolfirstmark{\the\toks@}%
\ifx\@firstcolfirstmark\@empty
\global\let\@setmarks\relax
\else
\gdef\@setmarks{%
\let\firstmark\@firstcolfirstmark
\let\topmark\@firstcoltopmark}%
\fi
\else
\global\@firstcolumntrue
\setbox\@outputbox\vbox{%
\hb@xt@\textwidth{%
\hb@xt@\columnwidth{\box\@leftcolumn \hss}%
\hfil
{\normalcolor\vrule \@width\columnseprule}%
\hfil
\hb@xt@\columnwidth{\box\@outputbox \hss}}}%
\@combinedblfloats
\@setmarks
\@outputpage
\begingroup
\@dblfloatplacement
\@startdblcolumn
\@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}%
\endgroup
\fi}
\def\end@dblfloat{%
\if@twocolumn
\@endfloatbox
\ifnum\@floatpenalty <\z@
\@largefloatcheck
\global\dp\@currbox1sp %
\@cons\@currlist\@currbox
\ifnum\@floatpenalty <-\@Mii
\penalty -\@Miv
\@tempdima\prevdepth
\vbox{}%
\prevdepth\@tempdima
\penalty\@floatpenalty
\else
\vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack
\fi
\fi
\else
\end@float
\fi
}
\def\@testwrongwidth #1{%
\ifdim\dp#1=\f@depth
\else
\global\@testtrue
\fi}
\let\f@depth\z@
\def\@dblfloatplacement{\global\@dbltopnum\c@dbltopnumber
\global\@dbltoproom \dbltopfraction\@colht
\@textmin \@colht
\advance \@textmin -\@dbltoproom
\@fpmin \dblfloatpagefraction\textheight
\@fptop \@dblfptop
\@fpsep \@dblfpsep
\@fpbot \@dblfpbot
\def\f@depth{1sp}}
\def \@doclearpage {%
\ifvoid\footins
\setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa
\setbox\@tempboxa\box\@cclv
\xdef\@deferlist{\@toplist\@botlist\@deferlist}%
\global \let \@toplist \@empty
\global \let \@botlist \@empty
\global \@colroom \@colht
\ifx \@currlist\@empty
\else
\@latexerr{Float(s) lost}\@ehb
\global \let \@currlist \@empty
\fi
\@makefcolumn\@deferlist
\@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}%
\if@twocolumn
\if@firstcolumn
\xdef\@deferlist{\@dbltoplist\@deferlist}%
\global \let \@dbltoplist \@empty
\global \@colht \textheight
\begingroup
\@dblfloatplacement
\@makefcolumn\@deferlist
\@whilesw\if@fcolmade \fi{\@outputpage
\@makefcolumn\@deferlist}%
\endgroup
\else
\vbox{}\clearpage
\fi
\fi
\ifx\@deferlist\@empty \else\clearpage \fi
\else
\setbox\@cclv\vbox{\box\@cclv\vfil}%
\@makecol\@opcol
\clearpage
\fi
}
\def \@startdblcolumn {%
\@tryfcolumn \@deferlist
\if@fcolmade
\else
\begingroup
\let \reserved@b \@deferlist
\global \let \@deferlist \@empty
\let \@elt \@sdblcolelt
\reserved@b
\endgroup
\fi
}
\def\@addtonextcol{%
\begingroup
\@insertfalse
\@setfloattypecounts
\ifnum \@fpstype=8
\else
\ifnum \@fpstype=24
\else
\@flsettextmin
\@reqcolroom \ht\@currbox
\advance \@reqcolroom \@textmin
\ifdim \@colroom>\@reqcolroom
\@flsetnum \@colnum
\ifnum\@colnum>\z@
\@bitor\@currtype\@deferlist
\@testwrongwidth\@currbox
\if@test
\else
\@addtotoporbot
\fi
\fi
\fi
\fi
\fi
\if@insert
\else
\@cons\@deferlist\@currbox
\fi
\endgroup
}
\def\@addtodblcol{%
\begingroup
\@insertfalse
\@setfloattypecounts
\@getfpsbit \tw@
\ifodd\@tempcnta
\@flsetnum \@dbltopnum
\ifnum \@dbltopnum>\z@
\@tempswafalse
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\else
\ifnum \@fpstype<\sixt@@n
\advance \@dbltoproom \@textmin
\ifdim \@dbltoproom>\ht\@currbox
\@tempswatrue
\fi
\advance \@dbltoproom -\@textmin
\fi
\fi
\if@tempswa
\@bitor \@currtype \@deferlist
\@testwrongwidth\@currbox
\if@test
\else
\@tempdima -\ht\@currbox
\advance\@tempdima
-\ifx \@dbltoplist\@empty \dbltextfloatsep \else
\dblfloatsep \fi
\global \advance \@dbltoproom \@tempdima
\global \advance \@colht \@tempdima
\global \advance \@dbltopnum \m@ne
\@cons \@dbltoplist \@currbox
\@inserttrue
\fi
\fi
\fi
\fi
\if@insert
\else
\@cons\@deferlist\@currbox
\fi
\endgroup
}
\def \@addtocurcol {%
\@insertfalse
\@setfloattypecounts
\ifnum \@fpstype=8
\else
\ifnum \@fpstype=24
\else
\@flsettextmin
\advance \@textmin \@textfloatsheight
\@reqcolroom \@pageht
\ifdim \@textmin>\@reqcolroom
\@reqcolroom \@textmin
\fi
\advance \@reqcolroom \ht\@currbox
\ifdim \@colroom>\@reqcolroom
\@flsetnum \@colnum
\ifnum \@colnum>\z@
\@bitor\@currtype\@deferlist
\@testwrongwidth\@currbox
\if@test
\else
\@bitor\@currtype\@botlist
\if@test
\@addtobot
\else
\ifodd \count\@currbox
\advance \@reqcolroom \intextsep
\ifdim \@colroom>\@reqcolroom
\global \advance \@colnum \m@ne
\global \advance \@textfloatsheight \ht\@currbox
\global \advance \@textfloatsheight 2\intextsep
\@cons \@midlist \@currbox
\if@nobreak
\nobreak
\@nobreakfalse
\everypar{}%
\else
\addpenalty \interlinepenalty
\fi
\vskip \intextsep
\box\@currbox
\penalty\interlinepenalty
\vskip\intextsep
\ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
\outputpenalty \z@
\@inserttrue
\fi
\fi
\if@insert
\else
\@addtotoporbot
\fi
\fi
\fi
\fi
\fi
\fi
\fi
\if@insert
\else
\@resethfps
\@cons\@deferlist\@currbox
\fi
}
\def\@xtryfc #1{%
\@next\reserved@a\@trylist{}{}%
\@currtype \count #1%
\divide\@currtype\@xxxii
\multiply\@currtype\@xxxii
\@bitor \@currtype \@failedlist
\@testfp #1%
\@testwrongwidth #1%
\ifdim \ht #1>\@colht
\@testtrue
\fi
\if@test
\@cons\@failedlist #1%
\else
\@ytryfc #1%
\fi}
\def\@ztryfc #1{%
\@tempcnta\count #1%
\divide\@tempcnta\@xxxii
\multiply\@tempcnta\@xxxii
\@bitor \@tempcnta {\@failedlist \@flfail}%
\@testfp #1%
\@testwrongwidth #1%
\@tempdimb\@tempdima
\advance\@tempdimb\ht #1%
\advance\@tempdimb\@fpsep
\ifdim \@tempdimb >\@colht
\@testtrue
\fi
\if@test
\@cons\@flfail #1%
\else
\@cons\@flsucceed #1%
\@tempdima\@tempdimb
\fi}
\def\@{\spacefactor\@m{}}
\def\@tempa#1#2{#1#2\relax}
\ifx\setlength\@tempa
\def\setlength#1#2{#1 #2\relax}
\fi
\def\addpenalty#1{%
\ifvmode
\if@minipage
\else
\if@nobreak
\else
\ifdim\lastskip=\z@
\penalty#1\relax
\else
\@tempskipb\lastskip
\begingroup
\advance \@tempskipb
\ifdim\prevdepth>\maxdepth\maxdepth\else
\ifdim \prevdepth = -\@m\p@ \z@ \else \prevdepth \fi
\fi
\vskip -\@tempskipb
\penalty#1%
\vskip\@tempskipb
\endgroup
\vskip -\@tempskipb
\vskip \@tempskipb
\fi
\fi
\fi
\else
\@noitemerr
\fi}
\def\@fnsymbol#1{%
\ifcase#1\or \TextOrMath\textasteriskcentered *\or
\TextOrMath \textdagger \dagger\or
\TextOrMath \textdaggerdbl \ddagger \or
\TextOrMath \textsection \mathsection\or
\TextOrMath \textparagraph \mathparagraph\or
\TextOrMath \textbardbl \|\or
\TextOrMath {\textasteriskcentered\textasteriskcentered}{**}\or
\TextOrMath {\textdagger\textdagger}{\dagger\dagger}\or
\TextOrMath {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}\else
\@ctrerr \fi
}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname eTeXversion\endcsname\relax
\DeclareRobustCommand\TextOrMath{%
\ifmmode \expandafter\@secondoftwo
\else \expandafter\@firstoftwo \fi}
\protected@edef\TextOrMath#1#2{\TextOrMath{#1}{#2}}
\else
\protected\expandafter\def\csname TextOrMath\space\endcsname{%
\ifmmode \expandafter\@secondoftwo
\else \expandafter\@firstoftwo \fi}
\edef\TextOrMath#1#2{%
\expandafter\noexpand\csname TextOrMath\space\endcsname
{#1}{#2}}
\fi
\def\@esphack{%
\relax
\ifhmode
\spacefactor\@savsf
\ifdim\@savsk>\z@
\nobreak \hskip\z@skip % <------
\ignorespaces
\fi
\fi}
\def\@Esphack{%
\relax
\ifhmode
\spacefactor\@savsf
\ifdim\@savsk>\z@
\nobreak \hskip\z@skip % <------
\@ignoretrue
\ignorespaces
\fi
\fi}
\DeclareRobustCommand\em
{\@nomath\em \ifdim \fontdimen\@ne\font >\z@
\eminnershape \else \itshape \fi}
\def\eminnershape{\upshape}
\DeclareRobustCommand*\textsubscript[1]{%
\@textsubscript{\selectfont#1}}
\def\@textsubscript#1{%
{\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}
\def\@DeclareMathSizes #1#2#3#4#5{%
\@defaultunits\dimen@ #2pt\relax\@nnil
\if $#3$%
\expandafter\let\csname S@\strip@pt\dimen@\endcsname\math@fontsfalse
\else
\@defaultunits\dimen@ii #3pt\relax\@nnil
\@defaultunits\@tempdima #4pt\relax\@nnil
\@defaultunits\@tempdimb #5pt\relax\@nnil
\toks@{#1}%
\expandafter\xdef\csname S@\strip@pt\dimen@\endcsname{%
\gdef\noexpand\tf@size{\strip@pt\dimen@ii}%
\gdef\noexpand\sf@size{\strip@pt\@tempdima}%
\gdef\noexpand\ssf@size{\strip@pt\@tempdimb}%
\the\toks@
}%
\fi
}
\providecommand*\MakeRobust[1]{%
\@ifundefined{\expandafter\@gobble\string#1}{%
\@latex@error{The control sequence `\string#1' is undefined!%
\MessageBreak There is nothing here to make robust}%
\@eha
}%
{%
\@ifundefined{\expandafter\@gobble\string#1\space}%
{%
\expandafter\let\csname
\expandafter\@gobble\string#1\space\endcsname=#1%
\edef\reserved@a{\string#1}%
\def\reserved@b{#1}%
\edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}%
\edef#1{%
\ifx\reserved@a\reserved@b
\noexpand\x@protect\noexpand#1%
\fi
\noexpand\protect\expandafter\noexpand
\csname\expandafter\@gobble\string#1\space\endcsname}%
}%
{\@latex@info{The control sequence `\string#1' is already robust}}%
}%
}
\MakeRobust\(
\MakeRobust\)
\MakeRobust\[
\MakeRobust\]
\MakeRobust\makebox
\MakeRobust\savebox
\MakeRobust\framebox
\MakeRobust\parbox
\MakeRobust\rule
\MakeRobust\raisebox
\def\@xfloat #1[#2]{%
\@nodocument
\def \@captype {#1}%
\def \@fps {#2}%
\@onelevel@sanitize \@fps
\def \reserved@b {!}%
\ifx \reserved@b \@fps
\@fpsadddefault
\else
\ifx \@fps \@empty
\@fpsadddefault
\fi
\fi
\ifhmode
\@bsphack
\@floatpenalty -\@Mii
\else
\@floatpenalty-\@Miii
\fi
\ifinner
\@parmoderr\@floatpenalty\z@
\else
\@next\@currbox\@freelist
{%
\@tempcnta \sixt@@n
\expandafter \@tfor \expandafter \reserved@a
\expandafter :\expandafter =\@fps
\do
{%
\if \reserved@a h%
\ifodd \@tempcnta
\else
\advance \@tempcnta \@ne
\fi
\else\if \reserved@a t%
\@setfpsbit \tw@
\else\if \reserved@a b%
\@setfpsbit 4%
\else\if \reserved@a p%
\@setfpsbit 8%
\else\if \reserved@a !%
\ifnum \@tempcnta>15
\advance\@tempcnta -\sixt@@n\relax
\fi
\else
\@latex@error{Unknown float option `\reserved@a'}%
{Option `\reserved@a' ignored and `p' used.}%
\@setfpsbit 8%
\fi\fi\fi\fi\fi
}%
\@tempcntb \csname ftype@\@captype \endcsname
\multiply \@tempcntb \@xxxii
\advance \@tempcnta \@tempcntb
\global \count\@currbox \@tempcnta
}%
\@fltovf
\fi
\global \setbox\@currbox
\color@vbox
\normalcolor
\vbox \bgroup
\hsize\columnwidth
\@parboxrestore
\@floatboxreset
}
\def\@stpelt#1{\global\csname c@#1\endcsname \m@ne\stepcounter{#1}}
\EndIncludeInRelease
%</fixltx2e>
% \end{macrocode}
%
% \Finale
%
\endinput