summaryrefslogtreecommitdiff
path: root/macros/latex/base/latexrelease.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/base/latexrelease.dtx
Initial commit
Diffstat (limited to 'macros/latex/base/latexrelease.dtx')
-rw-r--r--macros/latex/base/latexrelease.dtx1011
1 files changed, 1011 insertions, 0 deletions
diff --git a/macros/latex/base/latexrelease.dtx b/macros/latex/base/latexrelease.dtx
new file mode 100644
index 0000000000..02194cee11
--- /dev/null
+++ b/macros/latex/base/latexrelease.dtx
@@ -0,0 +1,1011 @@
+% \iffalse meta-comment
+%
+% Copyright 1993-2018
+% 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 2005/12/01 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