Update LuaTeX testfiles for ^@ change
[latex2e.git] / trunk / base / latexrelease.dtx
blob15be21a45ccd785fb05452195ccb4d19c0799976
1 % \iffalse meta-comment
3 % Copyright 1993-2016
4 % The LaTeX3 Project and any individual authors listed elsewhere
5 % in this file.
7 % This file is part of the LaTeX base system.
8 % -------------------------------------------
10 % It may be distributed and/or modified under the
11 % conditions of the LaTeX Project Public License, either version 1.3c
12 % of this license or (at your option) any later version.
13 % The latest version of this license is in
14 %    http://www.latex-project.org/lppl.txt
15 % and version 1.3c or later is part of all distributions of LaTeX
16 % version 2005/12/01 or later.
18 % This file has the LPPL maintenance status "maintained".
20 % The list of all files belonging to the LaTeX base distribution is
21 % given in the file `manifest.txt'. See also `legal.txt' for additional
22 % information.
24 % The list of derived (unpacked) files belonging to the distribution
25 % and covered by LPPL is defined by the unpacking scripts (with
26 % extension .ins) which are part of the distribution.
28 % \fi
30 % \iffalse
32 %<*dtx>
33           \ProvidesFile{latexrelease.dtx}
34 %</dtx>
35 %<driver>\ProvidesFile{latexrelease.drv}
36 %<fixltx2e>\ProvidesPackage{fixltx2e}
37 %<fixltx2e>   [2016/12/29 v2.1a fixes to LaTeX (obsolete)]
38 %<latexrelease>\ProvidesPackage{latexrelease}
39 %<*!fixltx2e>
40 % \fi
41 %         \ProvidesFile{latexrelease.dtx}
42           [2016/12/29 v1.0h LaTeX release emulation and tests]
43 % \iffalse
44 %</!fixltx2e>
45 %<*driver>
46  \documentclass{ltxdoc}
47  \newcommand\Lopt[1]{\textsf{#1}}
48  \let\Lpack\Lopt
49  \providecommand{\file}[1]{\texttt{#1}}
50  \providecommand{\MF}{\textsf{Metafont}}
51  \providecommand{\danger}{\marginpar[\hfill\protect\Huge!!]{\protect\Huge!!\hfill}}
52  \begin{document}
53  \DocInput{latexrelease.dtx}
54  \end{document}
55 %</driver>
56 % \fi
60 % \let\package\textsf
63 % \GetFileInfo{latexrelease.dtx}
65 % \title{The \Lpack{latexrelease} package\thanks{This file
66 %         has version number \fileversion, last
67 %         revised \filedate.}}
68 % \author{The \LaTeX3 Project}
69 % \date{\filedate}
70 % \MaintainedByLaTeXTeam{latex}
71 %  \maketitle
73 % \section{Introduction}
74 % Prior to the 2015 release of \LaTeX{}, essentially no changes had been
75 % made to the \LaTeX\ format code for some years, with all
76 % improvements being instead added to the package \Lpack{fixltx2e}.
78 % While this worked at a technical level it meant that you had to
79 % explicitly opt-in to bug fixes and improvements, and the vast
80 % majority of documents did not benefit.
82 % As described in \LaTeX\ News 22, a new policy is being implemented 
83 % in which improvements will now be added to the format by default,
84 % and this \Lpack{latexrelease} package may be used to ensure
85 % stability where needed, either by making a new format use an older
86 % definition of some commands, or conversely may be used to supply the
87 % new definitions for use with an old format.
89 % The basic use is:
90 %\begin{verbatim}
91 % \RequirePackage[2015/01/01]{latexrelease}
92 % \documentclass{article}
93 % ....
94 %\end{verbatim}
96 % After such a declaration the document will use definitions current
97 % in the January 2015 \LaTeX{}, whether the actual format being used is
98 % older, or newer than that date. In the former case a copy of
99 % |latexrelease.sty| would need to be made available for use with the
100 % older format.  This may be used, for example, to share a document
101 % between co-workers using different \LaTeX\ releases, or to protect a
102 % document from being affected by system updates. As well as the
103 % definitions within the format itself, individual packages may use
104 % the commands defined here to  adjust their definitions to the
105 % specified date as described below.
108 % The bulk of this package, after some initial setup and option
109 % handling consists of a series of |\IncludeInRelease| commands
110 % which have been extracted from the main source files of the \LaTeX\
111 % format. These contain the old and new versions of any commands with
112 % modified definitions.
114 % \section{Package Options}
115 % \begin{itemize}
116 % \item \emph{yyyy/mm/dd}
117 % The package accepts any \LaTeX\ format date as argument,% 
118 % although dates in the future for which the current release of this
119 % package has no information will generate a warning.
121 % \item%
122 % |current| This is the default behaviour, it does not change the
123 % effective date of the format but does ensure that the
124 % |\IncludeInRelease| command is defined.
126 % \item
127 % |latest| sets the effective date of the format to the release date
128 % of this file, so in an older format applies all patches currently
129 % available.
130 % \end{itemize}
133 % \section{Release Specific Code}
135 % The |\IncludeInRelease| mechanism allows the kernel developer to
136 % associate code with a specific date to choose different versions of
137 % definitions depending on the date specified as an option to the
138 % \Lpack{latexrelease} package. Is also available for use by package
139 % authors (or even in a document if necessary).
141 % \medskip
143 % \noindent\DescribeMacro{\IncludeInRelease}
144 % \marg{code-date}^^A
145 % \oarg{format-date}%^^A
146 % \marg{label}^^A
147 % \marg{message}^^A
148 % \meta{code}^^A
149 % |\EndIncludeInRelease|
151 % \begin{description}
153 % \item[\marg{code-date}] This date is associated with the \marg{code}
154 % argument and will be compared to the requested date in the option to
155 % the \Lpack{latexrelease}.
157 % \item[\oarg{format-date}] This optional argument can be used to
158 % specify a format date with the code in addition to the mandatory
159 % \marg{code-date} argument. This can be useful for package developers
160 % as described below.
162 % \item[\marg{label}] The \marg{label} argument is an identifier
163 % (string) that within a given package must be a unique label for each
164 % related set of optional definitions. Per package at most one code
165 % block from all the |\IncludeInRelease| declarations with the same
166 % label will be executed.
168 % \item[\marg{message}]
169 % The \marg{message} is an informative string that is used in
170 % messages. It has no other function.
172 % \item[\meta{code}]
173 % Any \TeX\ code after the |\IncludeInRelease| arguments
174 % up until the and the following |\EndIncludeInRelease|
175 % is to be
176 % conditionally included depending on the date of the format as
177 % described below.
179 % \end{description}
181 % The |\IncludeInRelease| declarations with a given label should be in
182 % reverse chronological order in the file. The one chosen will depend
183 % on this order, the effective format version and the date options, as
184 % described below.
186 % If your package \Lpack{mypackage} defines a |\widget| command but
187 % has one definition using the features available in the 2015 \LaTeX\
188 % release, and a different definition is required for older formats
189 % then you can use:
190 %\begin{verbatim}
191 % \IncludeInRelease{2015/01/01}{\widget}{Widget Definition}
192 %  \def\widget{new version}%
193 % \EndIncludeInRelease
195 % \IncludeInRelease{0000/00/00}{\widget}{Widget Definition}
196 %  \def\widget{old version}%
197 % \EndIncludeInRelease
198 %\end{verbatim}
200 % If a document using this package is used with a format with
201 % effective release date of 2015/01/01 or later the new code will be
202 % used, otherwise the old code will be used. Note the \emph{effective
203 % release date} might be the original \LaTeX\ release date as shown at
204 % the start of every \LaTeX\ job, or it may be set by the
205 % \Lpack{latexrelease} package, so for example a document author who
206 % wants to ensure the new version is used could use
207 %\begin{verbatim}
208 % \RequirePackage[2015/01/01]{latexrelease}
209 % \documentclass{article}
210 % \usepackage{mypackage}
211 %\end{verbatim}
213 % If the document  is used with a \LaTeX\ format from 2014 or before,
214 % then \Lpack{latexrelease} will not have been part of the original
215 % distribution, but it may be obtained from a later \LaTeX\ release or
216 % from CTAN and distributed with the document, it will make an older
217 % \LaTeX\ release act essentially like the 2015 release.
219 % \subsection{Intermediate Package Releases}
221 % The above example works well for testing against the latex format
222 % but is not always ideal for controlling code by the release date of
223 % the \emph{package}. Suppose \LaTeX\ is not updated but in March you
224 % update the \Lpack{mypackage} package and modify the definition of
225 % |\widget|. You could code the package as:
226 %\begin{verbatim}
227 % \IncludeInRelease{2015/03/01}{\widget}{Widget Definition}
228 %  \def\widget{even newer improved March version}%
229 % \EndIncludeInRelease
231 % \IncludeInRelease{2015/01/01}{\widget}{Widget Definition}
232 %  \def\widget{new version}%
233 % \EndIncludeInRelease
235 % \IncludeInRelease{0000/00/00}{\widget}{Widget Definition}
236 %  \def\widget{old version}%
237 % \EndIncludeInRelease
238 %\end{verbatim}
240 % This would work and allow a document author to choose a date such as
241 %\begin{verbatim}
242 % \RequirePackage[2015/03/01]{latexrelease}
243 % \documentclass{article}
244 % \usepackage{mypackage}
245 %\end{verbatim}
247 % To use the latest version, however it would have disadvantage that
248 % until the next release of \LaTeX, by default, if the document does 
249 % not use \Lpack{latexrelease} to specify a date, the new improved
250 % code will not be selected as the effective date will be 2015/01/01
251 % and so the first code block will be skipped.
253 % For this reason |\IncludeInRelease| has an optional argument that
254 % specifies an alternative date to use if a date option has not been
255 % specified to \Lpack{latexrelease}.
256 %\begin{verbatim}
257 % \IncludeInRelease{2015/03/01}[2015/01/01]{\widget}{Widget Definition}
258 %  \def\widget{even newer improved March version}%
259 % \EndIncludeInRelease
261 % \IncludeInRelease{2015/01/01}{\widget}{Widget Definition}
262 %  \def\widget{new version}%
263 % \EndIncludeInRelease
265 % \IncludeInRelease{0000/00/00}{\widget}{Widget Definition}
266 %  \def\widget{old version}%
267 % \EndIncludeInRelease
268 %\end{verbatim}
270 % Now, by default on a 2015/01/01 \LaTeX\ format, the first code block
271 % will compare the format date to the optional argument 2015/01/01
272 % and so will execute the \emph{even newer improved} version. The
273 % remaining blocks using the |\widget| label argument will all then be
274 % skipped.
276 % If on the other hand the document requests an explicit release date
277 % using \Lpack{latexrelease} then this date will be used to decide what 
278 % code block to include.
280 % \subsection{Using \cs{IncludeInRelease} in Packages}
282 % If |\IncludeInRelease| is used within a package then all such
283 % conditional code needs to be within such declarations, e.g., it is
284 % not possible in the above example to have the ``current'' definition
285 % of |\widget| somewhere in the main code and only the two older
286 % definitions inside |\IncludeInRelease| declarations. If you would do
287 % this then one of those |\IncludeInRelease| declarations would be
288 % included overwriting the even newer code in the main part of the
289 % package. As a result your package may get fragmented over time with
290 % various |\IncludeInRelease| declarations sprinkled throughout your
291 % code or you have to interrupt the reading flow by putting those
292 % declarations together but not necessarily in the place where they
293 % belong.
295 % To avoid this issue you can use the following coding
296 % strategy: place the current |\widget| definition in the main code
297 % where it correctly belongs. 
298 % \begin{verbatim}
299 %   ...
300 %  \def\widget {even newer improved March version}
301 %  \def\@widget{newly added helper command no defined in older releases}
302 %   ...
303 %\end{verbatim}
304 % Then, near the end of your package place
305 % the following:
306 %  \begin{verbatim}
307 % \IncludeInRelease{2015/03/01}[2015/01/01]{\widget}{Widget Definition}
308 % \EndIncludeInRelease
310 % \IncludeInRelease{2015/01/01}{\widget}{Widget Definition}
311 %  \def\widget{new version}%
312 %  \let\@widget\@undefined % this doesn't exist in earlier releases
313 % \EndIncludeInRelease
315 % \IncludeInRelease{0000/00/00}{\widget}{Widget Definition}
316 %  \def\widget{old version}%
317 % \EndIncludeInRelease
318 %\end{verbatim}
319 % This way the empty code block hides the other |\IncludeInRelease|
320 % declarations unless there is an explicit request with a date
321 % 2015/01/01 or earlier.
323 % Now if you make a further change to |\widget| in the future you
324 % simply copy the current definition into the empty block and add a new
325 % empty declaration with todays date and the current format date. This
326 % way your main code stays readable and the old versions accumulate at
327 % the end of the package.\footnote{Of course there may be some cases
328 % in which the old code has to be in a specific place within the
329 % package as other code depends on it (e.g., if you
330 % \texttt{\string\let} something to it). In that case you have to
331 % place the code variations in the right place in your package rather
332 % than accumulating them at the very end.}
334 % The only other ``extra effort'' necessary when using this approach
335 % is that it may be advisable to undo new definitions in the code
336 % block for the previous release, e.g., in the above example we
337 % undefined |\@widget| as that isn't available in the 2015/01/01
338 % release but was defined in the main code. If all your conditional
339 % code is within |\IncludeInRelease| declarations that wouldn't been
340 % necessary as the new code only gets defined if that release is
341 % chosen.
343 % \section{fixltx2e}
345 % As noted above, prior to the 2015 \LaTeX\ release updates to the
346 % \LaTeX\ kernel were not made in the format source files but were 
347 % made available in the \Lpack{fixltx2e} package. That package is no
348 % longer needed but we generate a small package from this source
349 % that just makes a warning message but otherwise does nothing.
355 % \StopEventually{}
357 % \section{Implementation}
359 % We require at least a somewhat sane version of \LaTeXe{}. Earlier
360 % ones where really quite different from one another.
361 %    \begin{macrocode}
362 %<*latexrelease>
363 \NeedsTeXFormat{LaTeX2e}[1996/06/01]
364 %    \end{macrocode}
366 % \section{Setup}
368 % \begin{macro}{\IncludeInRelease}
369 % \begin{macro}{\EndIncludeInRelease}
370 %    \begin{macrocode}
371 %    \end{macrocode}
372 % \end{macro}
373 % \end{macro}
375 % \changes{v1.0c}{2015/02/19}{Swap argument order}
376 %    \begin{macrocode}
377 \DeclareOption*{%
378   \def\@IncludeInRelease#1[#2]{\@IncludeInRele@se{#1}}%
379   \let\requestedpatchdate\CurrentOption}
380 \DeclareOption{latest}{%
381   \let\requestedpatchdate\latexreleaseversion}
382 \DeclareOption{current}{%
383   \let\requestedpatchdate\fmtversion}
384 %    \end{macrocode}
386 %    \begin{macrocode}
387 \ExecuteOptions{current}
388 \ProcessOptions\relax
389 %    \end{macrocode}
391 % Sanity check options, it allows some non-legal dates but always
392 % ensures |requestedLaTeXdate| gets set to a number.  Generate an
393 % error if there are any non digit tokens remaining after removing the
394 % |//|.
395 %    \begin{macrocode}
396 \def\reserved@a{%
397 \edef\requestedLaTeXdate{\the\count@}%
398 \reserved@b}
399 \def\reserved@b#1\\{%
400 \def\reserved@b{#1}%
401 \ifx\reserved@b\@empty\else
402 \PackageError{latexrelease}%
403              {Unexpected option \requestedpatchdate}%
404              {The option must be of the form yyyy/mm/dd}%
405 \fi}
406 \afterassignment\reserved@a
407 \count@\expandafter
408   \@parse@version\expandafter0\requestedpatchdate//00\@nil\\
409 %    \end{macrocode}
411 % less precautions needed for |\fmtversion|
412 %    \begin{macrocode}
413 \edef\currentLaTeXdate{%
414    \expandafter\@parse@version\fmtversion//00\@nil}
415 %    \end{macrocode}
417 %    \begin{macrocode}
418 \ifnum\requestedLaTeXdate=\currentLaTeXdate
419 \PackageWarningNoLine{latexrelease}{%
420   Current format date selected, no patches applied.}
421 \expandafter\endinput
423 %    \end{macrocode}
425 % A newer version of latexrelease should have been distributed with
426 % the later format.
427 %    \begin{macrocode}
428 \ifnum\currentLaTeXdate
429   >\expandafter\@parse@version\latexreleaseversion//00\@nil
430 \PackageWarningNoLine{latexrelease}{%
431 The current package is for an older LaTeX format:\MessageBreak
432 LaTeX \latexreleaseversion\space\MessageBreak
433 Obtain a newer version of this package!}
434 \expandafter\endinput
436 %    \end{macrocode}
437 % can't patch into the future, could make this an error
438 % but it has some uses to control package updates
439 % so allow for now.
440 %    \begin{macrocode}
441 \ifnum\requestedLaTeXdate
442   >\expandafter\@parse@version\latexreleaseversion//00\@nil
443 \PackageWarningNoLine{latexrelease}{%
444 The current package is for LaTeX \latexreleaseversion:\MessageBreak
445 It has no patches beyond that date\MessageBreak
446 There may be an updated version\MessageBreak
447 of this package available from CTAN}
448 \expandafter\endinput
450 %    \end{macrocode}
452 % Update the format version to the requested date.
453 %    \begin{macrocode}
454 \let\fmtversion\requestedpatchdate
455 \let\currentLaTeXdate\requestedLaTeXdate
456 %    \end{macrocode}
459 % \section{Individual  Changes}
461 % The code for each change will be inserted at this point, extracted
462 % from the kernel source files.
463 %    
464 %    \begin{macrocode}
465 %</latexrelease>
466 %    \end{macrocode}
468 % \section{fixltx2e}
470 % Generate a stub \Lpack{fixltx2e} package:
471 %    \begin{macrocode}
472 %<*fixltx2e>
473 \IncludeInRelease{2015/01/01}{\fixltxe}{Old fixltx2e package}
474 \NeedsTeXFormat{LaTeX2e}
475 \PackageWarningNoLine{fixltx2e}{%
476 fixltx2e is not required with releases after 2015\MessageBreak
477 All fixes are now in the LaTeX kernel.\MessageBreak
478 See the latexrelease package for details}
479 \EndIncludeInRelease
480 \IncludeInRelease{0000/00/00}{\fixltxe}{Old fixltx2e package}
481 \def\@outputdblcol{%
482   \if@firstcolumn
483     \global\@firstcolumnfalse
484     \global\setbox\@leftcolumn\copy\@outputbox
485     \splitmaxdepth\maxdimen
486     \vbadness\maxdimen
487      \setbox\@outputbox\vbox{\unvbox\@outputbox\unskip}%
488      \setbox\@outputbox\vsplit\@outputbox to\maxdimen
489     \toks@\expandafter{\topmark}%
490     \xdef\@firstcoltopmark{\the\toks@}%
491     \toks@\expandafter{\splitfirstmark}%
492     \xdef\@firstcolfirstmark{\the\toks@}%
493     \ifx\@firstcolfirstmark\@empty
494       \global\let\@setmarks\relax
495     \else
496       \gdef\@setmarks{%
497         \let\firstmark\@firstcolfirstmark
498         \let\topmark\@firstcoltopmark}%
499     \fi
500   \else
501     \global\@firstcolumntrue
502     \setbox\@outputbox\vbox{%
503      \hb@xt@\textwidth{%
504         \hb@xt@\columnwidth{\box\@leftcolumn \hss}%
505         \hfil
506         {\normalcolor\vrule \@width\columnseprule}%
507         \hfil
508        \hb@xt@\columnwidth{\box\@outputbox \hss}}}%
509   \@combinedblfloats
510     \@setmarks
511     \@outputpage
512     \begingroup
513       \@dblfloatplacement
514       \@startdblcolumn
515       \@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}%
516     \endgroup
517   \fi}
518 \def\end@dblfloat{%
519   \if@twocolumn
520     \@endfloatbox
521     \ifnum\@floatpenalty <\z@
522       \@largefloatcheck
523       \global\dp\@currbox1sp %
524       \@cons\@currlist\@currbox
525       \ifnum\@floatpenalty <-\@Mii
526         \penalty -\@Miv
527         \@tempdima\prevdepth
528         \vbox{}%
529         \prevdepth\@tempdima
530         \penalty\@floatpenalty
531       \else
532         \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack
533       \fi
534     \fi
535   \else
536     \end@float
537   \fi
539 \def\@testwrongwidth #1{%
540   \ifdim\dp#1=\f@depth
541   \else
542     \global\@testtrue
543   \fi}
544 \let\f@depth\z@
545 \def\@dblfloatplacement{\global\@dbltopnum\c@dbltopnumber
546    \global\@dbltoproom \dbltopfraction\@colht
547    \@textmin \@colht
548    \advance \@textmin -\@dbltoproom
549    \@fpmin \dblfloatpagefraction\textheight
550    \@fptop \@dblfptop
551    \@fpsep \@dblfpsep
552    \@fpbot \@dblfpbot
553    \def\f@depth{1sp}}
554 \def \@doclearpage {%
555      \ifvoid\footins
556        \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa
557        \setbox\@tempboxa\box\@cclv
558        \xdef\@deferlist{\@toplist\@botlist\@deferlist}%
559        \global \let \@toplist \@empty
560        \global \let \@botlist \@empty
561        \global \@colroom \@colht
562        \ifx \@currlist\@empty
563        \else
564           \@latexerr{Float(s) lost}\@ehb
565           \global \let \@currlist \@empty
566        \fi
567        \@makefcolumn\@deferlist
568        \@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}%
569        \if@twocolumn
570          \if@firstcolumn
571            \xdef\@deferlist{\@dbltoplist\@deferlist}%
572            \global \let \@dbltoplist \@empty
573            \global \@colht \textheight
574            \begingroup
575               \@dblfloatplacement
576               \@makefcolumn\@deferlist
577               \@whilesw\if@fcolmade \fi{\@outputpage
578                                         \@makefcolumn\@deferlist}%
579            \endgroup
580          \else
581            \vbox{}\clearpage
582          \fi
583        \fi
584        \ifx\@deferlist\@empty \else\clearpage \fi
585      \else
586        \setbox\@cclv\vbox{\box\@cclv\vfil}%
587        \@makecol\@opcol
588        \clearpage
589      \fi
591 \def \@startdblcolumn {%
592   \@tryfcolumn \@deferlist
593   \if@fcolmade
594   \else
595     \begingroup
596       \let \reserved@b \@deferlist
597       \global \let \@deferlist \@empty
598       \let \@elt \@sdblcolelt
599       \reserved@b
600     \endgroup
601   \fi
603 \def\@addtonextcol{%
604   \begingroup
605    \@insertfalse
606    \@setfloattypecounts
607    \ifnum \@fpstype=8
608    \else
609      \ifnum \@fpstype=24
610      \else
611        \@flsettextmin
612        \@reqcolroom \ht\@currbox
613        \advance \@reqcolroom \@textmin
614        \ifdim \@colroom>\@reqcolroom
615          \@flsetnum \@colnum
616          \ifnum\@colnum>\z@
617             \@bitor\@currtype\@deferlist
618             \@testwrongwidth\@currbox
619             \if@test
620             \else
621               \@addtotoporbot
622             \fi
623          \fi
624        \fi
625      \fi
626    \fi
627    \if@insert
628    \else
629      \@cons\@deferlist\@currbox
630    \fi
631   \endgroup
633 \def\@addtodblcol{%
634   \begingroup
635    \@insertfalse
636    \@setfloattypecounts
637    \@getfpsbit \tw@
638    \ifodd\@tempcnta
639      \@flsetnum \@dbltopnum
640      \ifnum \@dbltopnum>\z@
641        \@tempswafalse
642        \ifdim \@dbltoproom>\ht\@currbox
643          \@tempswatrue
644        \else
645          \ifnum \@fpstype<\sixt@@n
646            \advance \@dbltoproom \@textmin
647            \ifdim \@dbltoproom>\ht\@currbox
648              \@tempswatrue
649            \fi
650            \advance \@dbltoproom -\@textmin
651          \fi
652        \fi
653        \if@tempswa
654            \@bitor \@currtype \@deferlist
655           \@testwrongwidth\@currbox
656            \if@test
657            \else
658               \@tempdima -\ht\@currbox
659               \advance\@tempdima
660                 -\ifx \@dbltoplist\@empty \dbltextfloatsep \else
661                                           \dblfloatsep \fi
662               \global \advance \@dbltoproom \@tempdima
663               \global \advance \@colht \@tempdima
664               \global \advance \@dbltopnum \m@ne
665               \@cons \@dbltoplist \@currbox
666               \@inserttrue
667            \fi
668        \fi
669      \fi
670    \fi
671    \if@insert
672    \else
673      \@cons\@deferlist\@currbox
674    \fi
675   \endgroup
677 \def \@addtocurcol {%
678    \@insertfalse
679    \@setfloattypecounts
680    \ifnum \@fpstype=8
681    \else
682      \ifnum \@fpstype=24
683      \else
684        \@flsettextmin
685        \advance \@textmin \@textfloatsheight
686        \@reqcolroom \@pageht
687        \ifdim \@textmin>\@reqcolroom
688          \@reqcolroom \@textmin
689        \fi
690        \advance \@reqcolroom \ht\@currbox
691        \ifdim \@colroom>\@reqcolroom
692          \@flsetnum \@colnum
693          \ifnum \@colnum>\z@
694            \@bitor\@currtype\@deferlist
695           \@testwrongwidth\@currbox
696            \if@test
697            \else
698              \@bitor\@currtype\@botlist
699              \if@test
700                \@addtobot
701              \else
702                \ifodd \count\@currbox
703                  \advance \@reqcolroom \intextsep
704                  \ifdim \@colroom>\@reqcolroom
705                    \global \advance \@colnum \m@ne
706                    \global \advance \@textfloatsheight \ht\@currbox
707                    \global \advance \@textfloatsheight 2\intextsep
708                    \@cons \@midlist \@currbox
709                    \if@nobreak
710                      \nobreak
711                      \@nobreakfalse
712                      \everypar{}%
713                    \else
714                      \addpenalty \interlinepenalty
715                    \fi
716                    \vskip \intextsep
717                    \box\@currbox
718                    \penalty\interlinepenalty
719                    \vskip\intextsep
720                    \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
721                    \outputpenalty \z@
722                    \@inserttrue
723                  \fi
724                \fi
725                \if@insert
726                \else
727                  \@addtotoporbot
728                \fi
729              \fi
730            \fi
731          \fi
732        \fi
733      \fi
734    \fi
735    \if@insert
736    \else
737      \@resethfps
738      \@cons\@deferlist\@currbox
739    \fi
741 \def\@xtryfc #1{%
742   \@next\reserved@a\@trylist{}{}%
743   \@currtype \count #1%
744   \divide\@currtype\@xxxii
745   \multiply\@currtype\@xxxii
746   \@bitor \@currtype \@failedlist
747   \@testfp #1%
748   \@testwrongwidth #1%
749   \ifdim \ht #1>\@colht
750      \@testtrue
751   \fi
752   \if@test
753     \@cons\@failedlist #1%
754   \else
755     \@ytryfc #1%
756   \fi}
757 \def\@ztryfc #1{%
758   \@tempcnta\count #1%
759   \divide\@tempcnta\@xxxii
760   \multiply\@tempcnta\@xxxii
761   \@bitor \@tempcnta {\@failedlist \@flfail}%
762   \@testfp #1%
763   \@testwrongwidth #1%
764   \@tempdimb\@tempdima
765   \advance\@tempdimb\ht #1%
766   \advance\@tempdimb\@fpsep
767   \ifdim \@tempdimb >\@colht
768     \@testtrue
769   \fi
770   \if@test
771     \@cons\@flfail #1%
772   \else
773     \@cons\@flsucceed #1%
774     \@tempdima\@tempdimb
775   \fi}
776 \def\@{\spacefactor\@m{}}
777 \def\@tempa#1#2{#1#2\relax}
778 \ifx\setlength\@tempa
779   \def\setlength#1#2{#1 #2\relax}
781 \def\addpenalty#1{%
782   \ifvmode
783     \if@minipage
784     \else
785       \if@nobreak
786       \else
787         \ifdim\lastskip=\z@
788           \penalty#1\relax
789         \else
790           \@tempskipb\lastskip
791           \begingroup
792             \advance \@tempskipb
793               \ifdim\prevdepth>\maxdepth\maxdepth\else
794                  \ifdim \prevdepth = -\@m\p@ \z@ \else \prevdepth \fi
795                \fi
796              \vskip -\@tempskipb
797              \penalty#1%
798              \vskip\@tempskipb
799           \endgroup
800           \vskip -\@tempskipb
801           \vskip \@tempskipb
802         \fi
803       \fi
804     \fi
805   \else
806     \@noitemerr
807   \fi}
808 \def\@fnsymbol#1{%
809    \ifcase#1\or \TextOrMath\textasteriskcentered *\or
810    \TextOrMath \textdagger \dagger\or
811    \TextOrMath \textdaggerdbl \ddagger \or
812    \TextOrMath \textsection  \mathsection\or
813    \TextOrMath \textparagraph \mathparagraph\or
814    \TextOrMath \textbardbl \|\or
815    \TextOrMath {\textasteriskcentered\textasteriskcentered}{**}\or
816    \TextOrMath {\textdagger\textdagger}{\dagger\dagger}\or
817    \TextOrMath {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}\else
818    \@ctrerr \fi
820 \begingroup\expandafter\expandafter\expandafter\endgroup
821 \expandafter\ifx\csname eTeXversion\endcsname\relax
822 \DeclareRobustCommand\TextOrMath{%
823   \ifmmode  \expandafter\@secondoftwo
824   \else     \expandafter\@firstoftwo  \fi}
825 \protected@edef\TextOrMath#1#2{\TextOrMath{#1}{#2}}
826 \else
827 \protected\expandafter\def\csname TextOrMath\space\endcsname{%
828   \ifmmode  \expandafter\@secondoftwo
829   \else     \expandafter\@firstoftwo  \fi}
830 \edef\TextOrMath#1#2{%
831   \expandafter\noexpand\csname TextOrMath\space\endcsname
832   {#1}{#2}}
834 \def\@esphack{%
835   \relax
836   \ifhmode
837     \spacefactor\@savsf
838     \ifdim\@savsk>\z@
839       \nobreak \hskip\z@skip  % <------
840       \ignorespaces
841     \fi
842   \fi}
843 \def\@Esphack{%
844   \relax
845   \ifhmode
846     \spacefactor\@savsf
847     \ifdim\@savsk>\z@
848       \nobreak \hskip\z@skip  % <------
849       \@ignoretrue
850       \ignorespaces
851     \fi
852    \fi}
853 \DeclareRobustCommand\em
854         {\@nomath\em \ifdim \fontdimen\@ne\font >\z@
855                        \eminnershape \else \itshape \fi}
856 \def\eminnershape{\upshape}
857 \DeclareRobustCommand*\textsubscript[1]{%
858   \@textsubscript{\selectfont#1}}
859 \def\@textsubscript#1{%
860   {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}
861 \def\@DeclareMathSizes #1#2#3#4#5{%
862   \@defaultunits\dimen@ #2pt\relax\@nnil
863   \if $#3$%
864     \expandafter\let\csname S@\strip@pt\dimen@\endcsname\math@fontsfalse
865   \else
866     \@defaultunits\dimen@ii #3pt\relax\@nnil
867     \@defaultunits\@tempdima #4pt\relax\@nnil
868     \@defaultunits\@tempdimb #5pt\relax\@nnil
869     \toks@{#1}%
870     \expandafter\xdef\csname S@\strip@pt\dimen@\endcsname{%
871       \gdef\noexpand\tf@size{\strip@pt\dimen@ii}%
872       \gdef\noexpand\sf@size{\strip@pt\@tempdima}%
873       \gdef\noexpand\ssf@size{\strip@pt\@tempdimb}%
874       \the\toks@
875     }%
876   \fi
878 \providecommand*\MakeRobust[1]{%
879   \@ifundefined{\expandafter\@gobble\string#1}{%
880     \@latex@error{The control sequence `\string#1' is undefined!%
881       \MessageBreak There is nothing here to make robust}%
882     \@eha
883   }%
884   {%
885     \@ifundefined{\expandafter\@gobble\string#1\space}%
886     {%
887       \expandafter\let\csname
888       \expandafter\@gobble\string#1\space\endcsname=#1%
889       \edef\reserved@a{\string#1}%
890       \def\reserved@b{#1}%
891       \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}%
892       \edef#1{%
893         \ifx\reserved@a\reserved@b
894           \noexpand\x@protect\noexpand#1%
895         \fi
896         \noexpand\protect\expandafter\noexpand
897         \csname\expandafter\@gobble\string#1\space\endcsname}%
898     }%
899     {\@latex@info{The control sequence `\string#1' is already robust}}%
900    }%
902 \MakeRobust\(
903 \MakeRobust\)
904 \MakeRobust\[
905 \MakeRobust\]
906 \MakeRobust\makebox
907 \MakeRobust\savebox
908 \MakeRobust\framebox
909 \MakeRobust\parbox
910 \MakeRobust\rule
911 \MakeRobust\raisebox
912 \def\@xfloat #1[#2]{%
913   \@nodocument
914   \def \@captype {#1}%
915    \def \@fps {#2}%
916    \@onelevel@sanitize \@fps
917    \def \reserved@b {!}%
918    \ifx \reserved@b \@fps
919      \@fpsadddefault
920    \else
921      \ifx \@fps \@empty
922        \@fpsadddefault
923      \fi
924    \fi
925    \ifhmode
926      \@bsphack
927      \@floatpenalty -\@Mii
928    \else
929      \@floatpenalty-\@Miii
930    \fi
931   \ifinner
932      \@parmoderr\@floatpenalty\z@
933   \else
934     \@next\@currbox\@freelist
935       {%
936        \@tempcnta \sixt@@n
937        \expandafter \@tfor \expandafter \reserved@a
938          \expandafter :\expandafter =\@fps
939          \do
940           {%
941            \if \reserved@a h%
942              \ifodd \@tempcnta
943              \else
944                \advance \@tempcnta \@ne
945              \fi
946            \else\if \reserved@a t%
947              \@setfpsbit \tw@
948            \else\if \reserved@a b%
949              \@setfpsbit 4%
950            \else\if \reserved@a p%
951              \@setfpsbit 8%
952            \else\if \reserved@a !%
953              \ifnum \@tempcnta>15
954                \advance\@tempcnta -\sixt@@n\relax
955              \fi
956            \else
957              \@latex@error{Unknown float option `\reserved@a'}%
958              {Option `\reserved@a' ignored and `p' used.}%
959              \@setfpsbit 8%
960            \fi\fi\fi\fi\fi
961            }%
962        \@tempcntb \csname ftype@\@captype \endcsname
963        \multiply \@tempcntb \@xxxii
964        \advance \@tempcnta \@tempcntb
965        \global \count\@currbox \@tempcnta
966        }%
967     \@fltovf
968   \fi
969   \global \setbox\@currbox
970     \color@vbox
971       \normalcolor
972       \vbox \bgroup
973         \hsize\columnwidth
974         \@parboxrestore
975         \@floatboxreset
977  \def\@stpelt#1{\global\csname c@#1\endcsname \m@ne\stepcounter{#1}}
978 \EndIncludeInRelease
979 %</fixltx2e>
980 %    \end{macrocode}
982 % \Finale
984 \endinput