% \iffalse meta-comment
%
% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
% 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
%    http://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>
          \ProvidesFile{fixltx2e.dtx}
%</dtx>
%<fixltx2e,fix-cm>\NeedsTeXFormat{LaTeX2e}
%<fixltx2e>\ProvidesPackage{fixltx2e}
%<fix-cm>\ProvidesPackage{fix-cm}
%<driver>\ProvidesFile{fixltx2e.drv}
% \fi
%         \ProvidesFile{fixltx2e.dtx}
          [2006/09/13 v1.1m fixes to LaTeX]
%
% \iffalse
%<*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{fixltx2e.dtx}
 \end{document}
%</driver>
% \fi
%
% \CheckSum{1078}
%
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%
%
%
% \let\package\textsf
%
%
% \GetFileInfo{fixltx2e.dtx}
%
% \title{The \Lpack{fixltx2e} and \Lpack{fix-cm} packages\thanks{This file
%         has version number \fileversion, last
%         revised \filedate.}}
% \author{Frank Mittelbach, David Carlisle, Chris Rowley, Walter
%         Schmidt\thanks{Walter wrote \Lpack{fix-cm}}}
% \date{\filedate}
%  \maketitle
%
% \begin{abstract}
%    These packages provides fixes to \LaTeXe{} which are desirable
%    but cannot be integrated into the \LaTeXe{} kernel or the 
%    font definition files directly as they would produce a version 
%    incompatible to earlier releases (either in formatting or 
%    functionality).
%
%    By providing these fixes in the form of packages, users can benefit
%    from them without the danger that their documents will fail or
%    produce unexpected results at other sites since the documents
%    contain a clear indication (the |\usepackage| line, preferably
%    with a required date) that the fixes are needed.
% \end{abstract}
%
% \tableofcontents
%
% \newpage
%
% \section{Introduction}
%
% In the newsletter \texttt{ltnews07.tex}, which accompanied the
% \LaTeXe{} maintenance release of June 1997, we wrote:
% \begin{quote}
%    Many of the problem reports we receive concerning the standard
%    classes are not concerned with bugs but are suggesting, more or
%    less politely, that the design decisions embodied in them are
%    `not optimal' and asking us to modify them.
%    
%    There are several reasons why we have decided not to make such
%    changes to these files.
%    \begin{itemize}
%    \item However misguided, the current behaviour is clearly what
%    was intended when these classes were designed.  \item It is not
%    good practice to change such aspects of `standard classes'
%    because many people will be relying on them.
%    \end{itemize}
%    
%    We have therefore decided not to even consider making such
%    modifications, nor to spend time justifying that decision.  This
%    does not mean that we do not agree that there are many
%    deficiencies in the design of these classes, but we have many
%    tasks with higher priority than continually explaining why the
%    standard classes for \LaTeX{} cannot be changed.
% \end{quote}
%
% Back then we probably should have said that this decision also
% covers changes to the \LaTeX{} kernel and font definitions,
% if the change results in
% noticeable differences in the formatting of documents or otherwise
% produces severe incompatibilities between releases. The important
% point to stress here is that ``people rely on the fact that a
% document formatted at one site produces identical output at a
% different site''. By fixing a certain problem in version
% \meta{date}, people making use of the fix will get incorrectly
% formatted documents if they send them to others who still run on a
% version prior to \meta{date}.
%
% In theory one could get around this by adding a line like
% \begin{quote}
% |\NeedsTeXFormat{latex2e}[|\meta{date}|]| 
% \end{quote}
% on top of the document. However, this fails for two reasons. Firstly,
% most people will not be aware that they make use of a feature or fix
% that is only available in their version of \LaTeX{}; and thus do not
% add such a line in their documents. Secondly, even if there is such a
% line the receiving site might not be able to upgrade their \LaTeX{}
% in time to process the document properly (the latter is a sad fact
% of life).
%
% By providing the \Lpack{fixltx2e} and \Lpack{fix-cm} packages 
% we hope to help people in this respect since, when they
% are used, a document will contain a clear
% indication that special features/fixes are needed and if the
% receiving site does not have the packages available (or not available
% with the right version) it is far easier to download and install them
% from some archive than to upgrade \LaTeX{} in a rush.
%
% The packages are independent from each other and deal with different 
% subjects:
% \Lpack{fixltx2e} provides general changes to the \LaTeX{} kernel,
% while \Lpack{fix-cm} improves the definitions of the Computer Modern 
% font families.
%
% We will try to maintain the packages in such a way that they can be used
% with all maintenance releases of \LaTeXe{} so that, if urgently
% needed, people can simply add them to the current directory in case
% they cannot upgrade their \LaTeX{} for whatever reason.
%
% The packages are \textbf{NOT} provided so that people can stop
% upgrading their \LaTeX{} system. They will contain only fixes of a
% certain nature, others will still go into the kernel and extensions
% in form of packages, and support files will still be added to the
% base system at regular intervals.
%
%
% \subsection{Using \Lpack{fixltx2e}}
%
% To use the \Lpack{fixltx2e} package include the line
% \begin{quote}
%   |\usepackage{fixltx2e}[|\meta{date}|]|
% \end{quote}
% into the preamble of your document, where \meta{date} is the date of
% the \Lpack{fixltx2e} package that you are using. 
% This way your document will produce a warning if processed at a site
% that only has an older version of of this package.
%
% \subsection{Using \Lpack{fix-cm}}
%
% \begin{sloppypar}
% To use the \Lpack{fix-cm} package, 
% load \danger it \emph{before} \cmd{\documentclass},
% and use the command \cmd{\RequirePackage} to do so, rather than the
% normal \cmd{\usepackage}:
% \end{sloppypar}
% \begin{verse}
%   |\RequirePackage{fix-cm}|\\
%   |\documentclass| \dots
% \end{verse}
% \textbf{Do not to load any other package before the document class}, 
% unless you have a thorough understanding of the \LaTeX{} internals 
% and know exactly what you are doing!
%
%
% \section{Fixes added}
%
% This section describes all the fixes/features that have been added
% to the initial release of the package. If applicable the bug report
% info (see \texttt{bugs.txt}) is given.
%
%
%
%
% \subsection{2-col: 1-col fig can come before earlier 2-col fig 
%            (pr/2346)}
%
%\begin{verbatim}
% >Number:         2346
% >Category:       latex
% >Synopsis:       2-col: 1-col fig can come before earlier 2-col fig
% >Arrival-Date:   Wed Dec 18 15:41:07 1996
% >Originator:     w.l.kleb@larc.nasa.gov (bil kleb)
% >Description:
% as documented in lamport's book, p. 198, concerning figure
% placement, "a figure will not be printed before an earlier
% figure, and a table will not be printed before an earlier
% table."  however, there is a footnote stating, "However,
% in two-column page style, a single-column figure can come before
% an earlier double-column figure, and vice versa."
% 
% this twocolumn behavior is undesireable---at least by me and
% most professional organizations i publish in.  ed snyzter developed
% a hack fix for 2.09 several years ago which links the two
% counters, but i have not run across a similar "fix" for 2e...
% \end{verbatim}
%
% Originally fixed in package \Lpack{fix2col} which was merged into
% this package. Documentation and code from this package have been
% merged into this file.
%
% \subsubsection{Notes on the Implementation Strategy}
%
% The standard output routine maintains two lists of floats that have
% been `deferred' for later consideration. One list for single column
% floats, and one for double column floats (which are always
% immediately put onto their deferred list). This mechanism means
% that \LaTeX\ `knows' which type of float is contained in each box
% by the list that it is processing, but having two lists means
% that there is no mechanism for preserving the order between the
% floats in each list.
%
% The solution to this problem consists of two small changes to
% the output routine.
%
% Firstly, abandon the `double column float list' |\@dbldeferlist|
% and change every command where it is used so that instead the
% same |\@deferlist| is used as for single column floats.
% That one change ensures that double and single column floats
% stay in the same sequence, but as \LaTeX\ no longer `knows'
% whether a float is double or single column, it will happily
% insert a double float into a single column, overprinting the
% other column, or the margin.
%
% The second change is to provide an alternative mechanism for
% recording the two column floats. \LaTeX\ already has a compact
% mechanism for recording float information, an integer count register
% assigned to each float records information about the `type' of float
% `figure', `table' and the position information `htp' etc.
%
% The type information is stored in the `high' bits, one bit position
% (above `32') allocated to each float type. The `low' bits store
% information about the allowed positions, one bit each allocated for
% |h t b p|.  In the \LaTeX2.09 system, the bit corresponding to `16'
% formed a `boundary' between these two sets of information, and it
% was never actually used by the system. Ed Sznyter's
% \package{fixfloats} package not unreasonably used this position to
% store the double column information, setting the bit for double
% column floats. Then at each point in the output routine at which a
% float is committed to a certain region, an additional check must be
% made to check that the float is (or is not) double column. If it
% spans the wrong number of columns it is deferred rather than being
% added. 
%
% Unfortunately the bit `16' is not available in \LaTeXe. It is used
% to encode the extra float position possibility `|!|' that was added
% in that system. It would be possible to use position `32' and to
% move the flags for `table', `figure',\ldots\ up one position, to
% start at 64, but this would mean that in principle one less float
% type would be supported, and more importantly is likely to break
% any other packages that assume anything about the output routine
% internals. So here I instead use another mechanism for flagging
% double column floats: By default all floats have depth 0pt.
% This package arranges that double column ones have depth 1sp.
% This information may then be used in the same manner as in
% the \package{fixfloats} package, to defer any floats that are not of
% the correct column spanning type.
%
%
%
% \subsection{Wrong header for twocolumn (pr/2613)}
%
%\begin{verbatim}
% >Number:         2613
% >Category:       latex
% >Synopsis:       wrong headline for twocolumn
% >Arrival-Date:   Mon Sep 22 16:41:09 1997
% >Originator:     daniel@cs.uni-bonn.de (Daniel Reischert)
% >Description:
% When setting the document in two columns
% the headline shows the top mark of the second column,
% but it should show the top mark of the first column.
% \end{verbatim}
%
% Originally fixed in package \Lpack{fix2col} which was merged into
% this package. Documentation and code from this package have been
% merged into this file.
%
% \subsubsection{Notes on the Implementation Strategy}
%
% The standard \LaTeX\ twocolumn system works internally by making
% each column a separate `page' that is passed independently to \TeX's
% pagebreaker. (Unlike say the \package{multicol} package, where all
% columns are gathered together and then split into columns later,
% using |\vsplit|.) This means that the primitive \TeX\ marks that are
% normally used for header information, are globally reset after the
% first column. By default \LaTeX\ does nothing about this.
% A good solution is provided by Piet van Oostrum (building on earlier
% work of Joe Pallas) in his \package{fixmarks} package.
%
% After the first column box has been collected the mark information
% for that box is saved, so that any |\firstmark| can be
% `artificially' used to set the page-level marks after the second
% column has been collected. (The second column |\firstmark| is not
% normally required.) Unfortunately \TeX\ does not provide a direct
% way of knowing if any marks are in the page, |\firstmark| always has a
% value from previous pages, even if there is no mark in this page.
% The solution is to make a copy of the box and then |\vsplit| it
% so that any marks show up as |\splitfirstmark|.
%
% The use of |\vsplit| does mean that the output routine will globally
% change the value of |\splitfirstmark| and
% |\splitbotmark|. The \package{fixmarks} package goes to some trouble
% to save and restore these values so that the output routine does
% \emph{not} change the values. This part of \package{fixmarks} is not
% copied here as it is quite costly (having to be run on every page) and
% there is no reason why anyone writing code using |\vsplit| should
% allow the output routine to be triggered before the split marks have
% been accessed.
%
%
% \subsection{\texttt{\textbackslash @} discards spaces when moving
%             (pr/3039)}
%
%\begin{verbatim}
% >Number:         3039
% >Category:       latex
% >Synopsis:       \@ discards spaces when moving
% >Arrival-Date:   Sat May 22 09:01:06 1999
% >Originator:     asnd@triumf.ca (Donald Arseneau)
% >Description:
% The \@ command expands to \spacefactor\@m in auxiliary files,
% which then ignores following spaces when it is reprocessed.
%\end{verbatim}
%
% \subsection{\texttt{\textbackslash setlength} produces error if
%   used with registers like \texttt{\textbackslash dimen0} (pr/3066)}
%
%\begin{verbatim}
% >Number:         3066
% >Category:       latex
% >Synopsis:       \setlength{\dimen0}{10pt}
% >Arrival-Date:   Tue Jul  6 15:01:06 1999
% >Originator:     oberdiek@ruf.uni-freiburg.de (Heiko Oberdiek)
% >Description:
% The current implementation of \setlength causes an error,
% because the length specification isn't terminated properly.
% More safe:
% \def\setlength#1#2{#1=#2\relax}
%\end{verbatim}
%
% \subsection{\texttt{\textbackslash addpenalty} ruins flush-bottom (pr/3073)}
%
%\begin{verbatim}
% >Number:         3073
% >Category:       latex
% >Synopsis:       \addpenalty ruins flush-bottom
% >Arrival-Date:   Sat Jul 17 05:11:05 1999
% >Originator:     asnd@triumf.ca (Donald Arseneau)
% >Description:
% Just to keep in mind for further development eh?
% A page break at an \addpenalty after \vspace does *not*
% give a flush-bottom page.  (The intent of \addpenalty is
% apparently just to preserve the flush bottom by putting
% the breakpoint `above' the skip.)
%\end{verbatim}
%
%
%
% \section{Fixes added for 2003/06/01}
%
% \subsection{\texttt{\textbackslash fnsymbol} should use text symbols 
%    if possible (pr/3400)}
%
%\begin{verbatim}
% >Number:         3400
% >Category:       latex
% >Synopsis:       \fnsymbol should use text symbols if possible
% >Arrival-Date:   Fri Jan 04 20:41:00 CET 2002
% >Originator:     was@VR-Web.de  ( Walter Schmidt )
%
% The \fnsymbol command can be used in both text and math
% mode.  The symbols produced are, however, always taken from
% the math fonts.  As a result, they may not match the text
% fonts, even if the symbols are actually available, for
% instance from the TS1 encoding.  Since \fnsymbol is
% primarily used for footnotes in text, this should be fixed,
% IMO.
%\end{verbatim}
%
%
% \subsection{No hyphenation in first word after float environment (pr/3498)}
%
%\begin{verbatim}
% >Number:         3498
% >Category:       latex
% >Synopsis:       No hyphenation in first word after float environment
% >Arrival-Date:   Thu Jan 30 13:21:00 CET 2003
% >Originator:     h.harders@tu-bs.de (Harald Harders)
% 
% If a float environment (figure, table) is written within a paragraph,
% the first word after the environment is not hyphenated.
%\end{verbatim}
%
%
%
% \subsection{Allowing \texttt{\textbackslash emph} to produce small
%             caps, etc}
%
%    By default |\em| or |\emph| switches to roman in an italic
%    context but some designers prefer a switch to small caps in that
%    case. This can be achieved by setting |\eminnershape|, e.g.,
%
%\begin{verbatim}
%\renewcommand\eminnershape{\scshape}
%\end{verbatim}
%
%
% \subsection{Using EC fonts (T1 encoding) makes my documents look
%             bl**dy horrible (from c.t.t.)\\
%             I can't use arbitrary sizes with CM fonts (from c.t.t.)}
%
% No I'm not trying to collect any cites from the news group
% discussion on this topic. In a nutshell, if one adds
%\begin{verbatim}
%\usepackage[T1]{fontenc}
%\end{verbatim}
% to a document that uses the Computer Modern typefaces, 
% then not only the T1 encoding is used but the fonts
% used in the document look noticeably different. This is due to the fact
% that the EC fonts have more font series designs, e.g.\ a 14.4\,pt bold
% etc and those get used in the standard \texttt{.fd} files, while
% with Computer Modern (in OT1 encoding) such sizes were scaled
% versions of smaller sizes---with a noticeable different look and
% feel.
%
% So we provide a package \Lpack{fix-cm} to ensure that comparable
% definitions are used. In addition to that, the package
% \Lpack{fix-cm} also enables continuous scaling of the CM fonts.
% This package was written by Walter Schmidt.
%
%
%
%^^A \section{The macro package \textsf{fix-cm} for \LaTeXe}
%
%^^A The documentation in this section was prepared by Walter Schmidt.
%
%
%
% \subsubsection{What \Lpack{fix-cm} does} 
%
% ^^A Are you bothered by the T1 and TS1 encoded Computer Modern fonts,
% ^^A which look partially worse than the traditional ones?  Would you
% ^^A like to use the CM fonts with arbitrary sizes?  If so, the macro
% ^^A package \Lpack{fix-cm} can help you.
%
% Loading the package \Lpack{fix-cm} changes the font definitions of the 
% Computer Modern fonts, in order to achieve the following effects:
% \begin{itemize}
%   \item
%   The appearance of the T1 and TS1 encoded CM fonts (aka `EC') is
%   made as similar as possible to the traditional (OT1 encoded) ones.
%   Particularly, a number of broken or ugly design sizes are no
%   longer used, the look of the bold sans serif typeface at large
%   sizes is considerably improved, and mismatches between the text
%   fonts and the corresponding math fonts are avoided.  As a side
%   effect, PostScript and PDF documents may become smaller, because
%   fewer fonts need to be embedded.
%   \item
%   The Computer Modern fonts are made available with arbitrary sizes.
%   \item
%   Only those design sizes of the fonts will be used, that are
%   normally available in Type1 format, too.  You need not load the
%   extra package \Lpack{cmmib57} for this purpose.
% \end{itemize}
% The package acts on the following font families:
% \begin{itemize}
%   \item
%   The text font families \file{cmr}, \file{cmss}, \file{cmtt} and 
%   \file{cmvtt} with OT1, T1 and TS1 encoding.
%   \item 
%   The default math fonts used by \LaTeX, i.e., the font families 
%   \file{cmm} with encoding OML and \file{cms} with encoding OMS.
%   \item
%   The symbols used by the package \Lpack{latexsym}, i.e., the font
%   family \file{lasy}.
% \end{itemize}
% Note that the package does \emph{not} act on:
% \begin{itemize}
% \item Font families such as CM~Fibonacci, CM~Dunhill etc.,
%   which are provided for experimental purposes or for fun only.
% \item
%   CM text fonts with character sets other than Latin, e.g.,
%   Cyrillic.  Loading of the required font and encoding definitions
%   while the fonts are not actually used, would not be a good idea.
%   This should be addressed by particular packages or by changing the
%   standard FDs of these fonts.
% \item
%   Extra math fonts such as the AMS symbol fonts.  While
%   they match the style of Computer Modern, they are frequently used
%   in conjunction with other font families, too.  Thus,
%   \Lpack{fix-cm} is obviously not the right place to make sure that
%   they can be scaled continuously.  Ask the maintainers of these
%   fonts to provide this feature, which is badly needed!
% \item
%   The math extension font \file{cmex}.  Whether or not this font
%   should be scaled is a question of its own, and there are other
%   packages (\Lpack{exscale}, \Lpack{amsmath}, \Lpack{amsfonts}) to
%   take care of it.
% \end{itemize}
%
% \subsubsection{How to load the package}
% \begin{sloppypar}
% The package should be loaded \danger \emph{before} \cmd{\documentclass},
% using the command |\RequirePackage{fix-cm}|, rather than the
% normal \cmd{\usepackage}.
% Rationale:  
% If the package is loaded in the preamble, a preceding package or
% even the code of the document class may have used any of the CM
% fonts already.  However, the definitions of those fonts, that are
% already in use, cannot be changed any more.
% \end{sloppypar}
%
% \subsubsection{Usage notes}
% In contrast to what you may expect, \Lpack{fix-cm} does \emph{not}
% ensure that line and page breaks stay the same, when you switch an
% existing document from OT1 to T1 encoding.  The package does not
% turn off all of the additional design sizes in the EC fonts
% collection: Those, that contribute considerably to the typographical
% quality and do not conflict with the math fonts,
% are---indeed---used.
%
% Be careful when using arbitrary, non-standard font sizes with
% applications that need bitmap fonts: You may end up \danger with
% lots of possibly huge \file{.pk} files.  Also, \MF{} chokes
% sometimes on extremely small or large sizes, because of arithmetic
% problems.
%   
% \Lpack{fix-cm} supersedes the experimental packages \Lpack{cmsd} and
% \Lpack{fix-ec}, which are no longer distributed.
%
% The packages \Lpack{type1cm} and \Lpack{type1ec} must not be loaded
% additionally; they enable only continuous scaling.  
%
%
%
% \section{Fixes added for 2005/12/01}
%
% \subsection{\texttt{\textbackslash textsubscript} not defined in  
%    latex.ltx (pr/3492)}
%
%\begin{verbatim}
% >Number:         3492
% >Category:       latex
% >Synopsis:       \textsubscript not defined in latex.ltx
% >Arrival-Date:   Tue Jan 14 23:01:00 CET 2003
% >Originator:     tgakic@chem.tue.nl  (Ionel Mugurel Ciobica)
%
% I use \textsubscript much more often than \textsuperscript, and
% \textsubscript it is not defined in latex.ltx. Could you please
% consider including the definition of \textsubscript in the latex.ltx
% for the next versions of LaTeX.    Thank you.
%\end{verbatim}
%
% \subsection{\texttt{\textbackslash DeclareMathSizes} only take pts.
%     (pr/3693)}
%
%\begin{verbatim}
% >Number:         3693
% >Category:       latex
% >Synopsis:       \DeclareMathSizes only take pts.
% >Arrival-Date:   Fri Jun 11 16:21:00 CEST 2004
% >Originator:     moho01ab@student.cbs.dk  (Morten Hoegholm)
%
% The last three arguments of \@DeclareMathSizes cannot take a dimension 
% as argument, making it inconsistent with the rest of the font changing 
% commands and itself, as the second argument can take a dimension 
% specification. 
%\end{verbatim}
%
% \subsection{\texttt{\textbackslash addpenalty} ruins flush-bottom (pr/3073)}
%
%\begin{verbatim}
% >Number:         3073
% >Category:       latex
% >Synopsis:       \addpenalty ruins flush-bottom
% >Arrival-Date:   20 Oct 2005 14:46:35 -0700
% >Originator:     asnd@triumf.ca (Donald Arseneau)
% >Description:
%  The (revised) definition of \addpenalty has been 
%  incorporated into fixltx2e, but now Plamen Tanovski has found a
%  problem:  since the \vskip is increased by the previous depth,
%  consecutive \addpenalty and \addvspace commands keep enlarging
%  the \vskip.
%\end{verbatim}
%
% \subsection{\texttt{\textbackslash footnotemark[x]} crashes with fixltx2e.sty 
%    (pr/3752)}
%
%\begin{verbatim}
% >Number:         3752
% >Category:       tools
% >Synopsis:       feature \footnotemark[x] crashes with fixltx2e.sty
% >Arrival-Date:   Fri Dec 17 10:11:00 +0100 2004
% >Originator:     stefan.pofahl@zsw-bw.de (Stefan Pofahl)
%
%  If I use /fnsymbol together with fixltx2e.sty I can not use
%  optinal parameter [num]
%  \footnotemark[1] is not showing the mark number 1 but
%  the mark \value{footnote}.
%\end{verbatim}
% This bug was related to pr/3400, where |\@fnsymbol| was made robust.
%
% \subsubsection{Notes on the implementation strategy}
%
% Pr/3400 made |\@fnsymbol| decide between text-mode and math-mode,
% which requires a certain level of robustness somewhere as the
% decision between text and math must be made at typesetting time and
% not when inside |\protected@edef| or similar commands. One way of
% dealing with this is to make sure the value seen by |\@fnsymbol| is
% a fully expanded number, which could be handled by code such as
% \begin{verbatim}
% \def\fnsymbol#1{\expandafter\@fnsymbol
%   \expandafter{\the\csname c@#1\endcsname}}
% \end{verbatim}
% This would be a good solution if everybody used the high level
% commands only by writing code like |\fnsymbol{footnote}|. Unfortunately
% many classes (including the standard classes) and packages use the
% internal forms directly as in |\@fnsymbol\c@footnote| so the easy
% solution of changing |\fnsymbol| would break code that had worked for
% the past 20~years.
%
% Therefore the implementation here makes |\@fnsymbol| itself a
% non-robust command again and instead uses a new robust command
% \DescribeMacro{\TextOrMath}|\TextOrMath|, which will take care of
% typesetting either the math or the text symbol. In order to do so,
% we face an age old problem and unsolvable problem in \TeX: A
% reliable test for math mode that doesn't destroy
% kerning. Fortunately this problem can be solved when using e\TeX\ so
% if you use this as engine for your \LaTeX\ format, as recommended by
% the \LaTeX3 Project, you will get a fully functioning |\TextOrMath|
% command with no side effects. If you use regular \TeX\ as engine for
% your \LaTeX\ format then we have to choose between the lesser of two
% evils: 1)~breaking ligatures and preventing kerning or 2)~face the
% risk of choosing text-mode at the beginning of an alignment cell,
% which was suppodes to be math-mode. We have decided upon 1) as is
% costumary for regular robust commands in \LaTeX.
%
%
% \subsection{Fewer fragile commands}
%
%\begin{verbatim}
% >Number:         3816
% >Category:       latex
% >Synopsis:       Argument of \@sect has an extra }.
% >Arrival-Date:   Sat Oct 22 23:11:01 +0200 2005
% >Originator:     susi@uriah.heep.sax.de (Susanne Wunsch)
%
% Use of a \raisebox in \section{} produces the error message
% mentioned in the subject.
% 
% PR latex/1738 descriped a similar problem, which has been solved
% 10 years ago. Protecting the \raisebox with \protect solved my
% problem as well, but wouldn't it make sense to have a similar fix
% as in the PR?
% 
% It is particulary confusing, that an unprotected \raisebox in a
% \section*-environment works fine, while in a \section-environment
% produces error.
%\end{verbatim}
%
% While not technically a bug, in this day and age there are few
% reasons why commands taking optional arguments should not be robust.
%
% \subsubsection{Notes on the implementation strategy}
%
% Rather than changing the kernel macros to be robust, we have decided
% to add the macro \DescribeMacro{\MakeRobust}|\MakeRobust| in
% \Lpack{fixltx2e} so that users can easily turn fragile macros into
% robust ones. A macro |\foo| is made robust by doing the simple
% |\MakeRobust{\foo}|. \Lpack{fixltx2e} makes the following kernel
% macros robust: |\(|, |\)|, |\[|, |\]|, |\makebox|, |\savebox|,
% |\framebox|, |\parbox|, |\rule| and |\raisebox|.
%
%
% \StopEventually{}
%
% \section{Implementation}
%
% We require at least a somewhat sane version of \LaTeXe{}. Earlier
% ones where really quite different from one another.
%    \begin{macrocode}
%<*fixltx2e>
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
%    \end{macrocode}
%
%
%
% \subsection{2-col: 1-col fig can come before earlier 2-col fig 
%              (pr/2346) \\
%             Wrong headline for twocolumn (pr/2613)}
%
% Originally fixed in package \Lpack{fix2col} which was merged into
% this package. Code and documentation are straight copies from that
% package.
%
% \subsubsection{Preserving Marks}
%
% This is just a change to the single command |\@outputdblcol|
% so that it saves mark information for the first column and restores
% it in the second column.
%    \begin{macrocode}
\def\@outputdblcol{%
  \if@firstcolumn
    \global\@firstcolumnfalse
%    \end{macrocode}
% Save the left column
%    \begin{macrocode}
    \global\setbox\@leftcolumn\copy\@outputbox
%    \end{macrocode}
%
% Remember the marks from the first column
%    \begin{macrocode}
    \splitmaxdepth\maxdimen
    \vbadness\maxdimen
    \setbox\@outputbox\vsplit\@outputbox to\maxdimen
%    \end{macrocode}
%
% One minor difference from the current \package{fixmarks}, pass the 
% marks through a token register to stop any |#| tokens causing an
% error in a |\def|.
%    \begin{macrocode}
    \toks@\expandafter{\topmark}%
    \xdef\@firstcoltopmark{\the\toks@}%
    \toks@\expandafter{\splitfirstmark}%
    \xdef\@firstcolfirstmark{\the\toks@}%
%    \end{macrocode}
%
% This test does not work if truly empty marks have been inserted, but
% \LaTeX\ marks should always have (at least) two brace groups.
% (Except before the first mark is used, when the marks are empty,
% but that is OK here.)
%    \begin{macrocode}
    \ifx\@firstcolfirstmark\@empty
      \global\let\@setmarks\relax
    \else
      \gdef\@setmarks{%
        \let\firstmark\@firstcolfirstmark
        \let\topmark\@firstcoltopmark}%
    \fi
%    \end{macrocode}
%
% End of change
%    \begin{macrocode}
  \else
    \global\@firstcolumntrue
    \setbox\@outputbox\vbox{%
     \hb@xt@\textwidth{%
        \hb@xt@\columnwidth{\box\@leftcolumn \hss}%
        \hfil
%    \end{macrocode}
% \changes{v1.1m}{2006/09/13}{Ensure that rule is in \cs{normalcolor}}
% The color of the \cs{vrule} should be \cs{normalcolor} as to not
% inherit the color from the column.
%    \begin{macrocode}
        {\normalcolor\vrule \@width\columnseprule}%
        \hfil
       \hb@xt@\columnwidth{\box\@outputbox \hss}}}%
  \@combinedblfloats
%    \end{macrocode}
% Override current first and top with those of first column if necessary
%    \begin{macrocode}
    \@setmarks
%    \end{macrocode}
% End of change
%    \begin{macrocode}
    \@outputpage
    \begingroup
      \@dblfloatplacement
      \@startdblcolumn
      \@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}%
    \endgroup
  \fi}
%    \end{macrocode}
%
% \subsubsection{Preserving Float Order}
%
% Changes |\@dbldeferlist| to |\@deferlist| are not explicitly noted
% but are flagged by blank comment lines around the changed line.
%
%
%    \begin{macrocode}
\def\end@dblfloat{%
\if@twocolumn
  \@endfloatbox
  \ifnum\@floatpenalty <\z@
    \@largefloatcheck
%    \end{macrocode}
%
%  Force the depth of two column float boxes.
%    \begin{macrocode}
    \global\dp\@currbox1sp %
%    \end{macrocode}
%
% \changes{v1.1d}{2000/09/24}{FMi: use output routine to
%    defer float}
%    Next line assumes that first token of |\end@float| is
%    |\@endfloatbox| so we gobble that.
%    \begin{macrocode}
%    \@cons\@deferlist\@currbox
     \expandafter\@gobble\end@float
%    \end{macrocode}
%    |\@Esphack| is then added by |\@endfloat| above.
%    \begin{macrocode}
  \fi
%    \ifnum \@floatpenalty =-\@Mii \@Esphack\fi
\else
  \end@float
\fi
}
%    \end{macrocode}
%
% Test if the float box has the wrong width. (Actually as noted above
% the test is for a conventional depth setting rather than for the
% width of the float).
%    \begin{macrocode}
\def\@testwrongwidth #1{%
  \ifdim\dp#1=\f@depth 
  \else
    \global\@testtrue
  \fi}
%    \end{macrocode}
%
% Normally looking for single column floats, which have zero depth.
%    \begin{macrocode}
\let\f@depth\z@
%    \end{macrocode}
%
% but when making two column float area, look for floats with 1sp
% depth.
%    \begin{macrocode}
\def\@dblfloatplacement{\global\@dbltopnum\c@dbltopnumber
   \global\@dbltoproom \dbltopfraction\@colht
   \@textmin \@colht
   \advance \@textmin -\@dbltoproom
   \@fpmin \dblfloatpagefraction\textheight
   \@fptop \@dblfptop
   \@fpsep \@dblfpsep
   \@fpbot \@dblfpbot
%    \end{macrocode}
%
%    \begin{macrocode}
   \def\f@depth{1sp}}
%    \end{macrocode}
%
% All the remaining changes are replacing the double column defer list
% or insering the extra test |\@testwrongwidth|\marg{box} at suitable
% places. That is at plces where a box is taken off the deferlist.
%    \begin{macrocode}
\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
%    \end{macrocode}
%
%    \begin{macrocode}
           \xdef\@deferlist{\@dbltoplist\@deferlist}%
%    \end{macrocode}
%
%    \begin{macrocode}
           \global \let \@dbltoplist \@empty
           \global \@colht \textheight
           \begingroup
              \@dblfloatplacement
%    \end{macrocode}
%
%    \begin{macrocode}
              \@makefcolumn\@deferlist
              \@whilesw\if@fcolmade \fi{\@outputpage
                                        \@makefcolumn\@deferlist}%
%    \end{macrocode}
%
%    \begin{macrocode}
           \endgroup
         \else
           \vbox{}\clearpage
         \fi
       \fi
%    \end{macrocode}
%    the next line is needed to avoid loosing floats in certain 
%    circumstances a single call to the original |\doclearpage|
%    will now no longer output all floats.
% \changes{v1.1d}{2000/09/24}{FMi: ensure \cs{doclearpage}
%     is called again until all floats are output.}
%    \begin{macrocode}
       \ifx\@deferlist\@empty \else\clearpage \fi
     \else
       \setbox\@cclv\vbox{\box\@cclv\vfil}%
       \@makecol\@opcol
       \clearpage
     \fi
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def \@startdblcolumn {%
  \@tryfcolumn \@deferlist
  \if@fcolmade
  \else
    \begingroup
      \let \reserved@b \@deferlist
      \global \let \@deferlist \@empty
      \let \@elt \@sdblcolelt
      \reserved@b
    \endgroup
  \fi
}
%    \end{macrocode}
%
%    \begin{macrocode}
\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
}
%    \end{macrocode}
%
%    \begin{macrocode}
\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
%    \end{macrocode}
%
% not in fixfloats?
%    \begin{macrocode}
          \@testwrongwidth\@currbox
%    \end{macrocode}
%
%    \begin{macrocode}
           \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
}
%    \end{macrocode}
%
%    \begin{macrocode}
\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
%    \end{macrocode}
%    We need to defer the float also if its width
%    doesn't fit.
% \changes{v1.1d}{2000/09/24}{FMi: test for wide float was
%    in wrong place}
%    \begin{macrocode}
          \@testwrongwidth\@currbox
%    \end{macrocode}
%
%    \begin{macrocode}
           \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
}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\@xtryfc #1{%
  \@next\reserved@a\@trylist{}{}%
  \@currtype \count #1%
  \divide\@currtype\@xxxii
  \multiply\@currtype\@xxxii
  \@bitor \@currtype \@failedlist
  \@testfp #1%
%    \end{macrocode}
%
%    \begin{macrocode}
  \@testwrongwidth #1%
%    \end{macrocode}
%
%    \begin{macrocode}
  \ifdim \ht #1>\@colht
     \@testtrue
  \fi
  \if@test 
    \@cons\@failedlist #1%
  \else
    \@ytryfc #1%
  \fi}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\@ztryfc #1{%
  \@tempcnta\count #1%
  \divide\@tempcnta\@xxxii
  \multiply\@tempcnta\@xxxii 
  \@bitor \@tempcnta {\@failedlist \@flfail}%
  \@testfp #1%
%    \end{macrocode}
%
% not in fixfloats?
%    \begin{macrocode}
  \@testwrongwidth #1%
%    \end{macrocode}
%
%    \begin{macrocode}
  \@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}
%    \end{macrocode}
%
%
%
%
%
%
% \subsection{\texttt{\textbackslash @} discards spaces when moving
%             (pr3039)}
%
% \begin{macro}{\@}
% Ensure that |\@m| can't eat spaces. Alternative would be to make
% |\@| robust but that takes more space.
%    \begin{macrocode}
\def\@{\spacefactor\@m{}}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{\texttt{\textbackslash setlength} produces error if
%   used with registers like \texttt{\textbackslash dimen0} (pr/3066)}
%
% \begin{macro}{\setlength}
%    Add space after register (|#1|) but only if this is still the
%    original definition. When, for example, \Lpack{calc} was already
%    loaded this wouldn't be a good idea any more.
%  \changes{v1.0c}{2000/09/21}{Don't change if definition was
%    modified already}
%    \begin{macrocode}
\def\@tempa#1#2{#1#2\relax}
\ifx\setlength\@tempa
  \def\setlength#1#2{#1 #2\relax}
\fi
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{\texttt{\textbackslash addpenalty} ruins flush-bottom
% (pr/3073)}
%
% \begin{macro}{\addpenalty}
%   Fix provided by Donald (though the original fix was not good
%   enough).  In 2005 Plamen Tanovski discovered that this fix wasn't
%   good enough either as the \cs{vskip} kept getting bigger if
%   several \cs{addpenalty} commands followed each other. Donald
%   kindly send a new fix.
%    \begin{macrocode}
\def\addpenalty#1{%
  \ifvmode
    \if@minipage
    \else
      \if@nobreak
      \else
        \ifdim\lastskip=\z@
          \penalty#1\relax
        \else
          \@tempskipb\lastskip
%    \end{macrocode}
%    \changes{v1.1l}{2005/11/10}{Add the correct \cs{vskip}} 
%    We have to make sure the final \cs{vskip} seen by \TeX\ is the
%    correct one, namely \cs{@tempskipb}. However we may have to
%    adjust for \cs{prevdepth} when placing the penalty but that
%    should not affect the skip we pass on to \TeX.
%    \begin{macrocode}
          \begingroup
            \advance \@tempskipb
              \ifdim\prevdepth>\maxdepth\maxdepth\else
%    \end{macrocode}
%    If |\prevdepth| is -1000pt due to |\nointerlineskip| we better
%    not add it!
%  \changes{v1.0c}{2000/09/21}{Don't add \cs{prevdepth} if it is a
%    senile  value!}
%    \begin{macrocode}
                 \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}
%    \end{macrocode}
% \end{macro}
%
%
%
% \subsection{\texttt{\textbackslash fnsymbol} should use text symbols 
%    if possible (pr/3400)}
%  \begin{macro}{\@fnsymbol}
%
%    This macro is another example of an ever recurring problem in
%    \TeX: Determining if something is text-mode or math-mode. It is
%    imperative for the decision between text and math to be delayed
%    until the actual typesetting is done as the code in question may
%    go through an |\edef| or |\write| where an |\ifmmode| test would
%    be executed prematurely. Hence in the implementation below,
%    |\@fnsymbol| is not robust in itself but the parts doing the
%    actual typesetting are.
%
%    In the case of |\@fnsymbol| we make use of the robust command
%    |\TextOrMath| which takes two arguments and typesets the first if
%    in text-mode and the second if in math-mode. Note that in order
%    for this command to make the correct decision, it must insert a
%    |\relax| token if run under regular \TeX, which ruins any kerning
%    between the preceding characters and whatever awaits
%    typesetting. If you use e\TeX\ as engine for \LaTeX\ (as
%    recommended) this unfortunate side effect is not present.
%    \begin{macrocode}
\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
}
%    \end{macrocode}
%  \end{macro}
%  \begin{macro}{\TextOrMath}
%    \changes{v1.1m}{2006/01/08}{Add command to solve robustness
%      issues (pr/3752)}
%    When using regular \TeX, we make this command robust so that it
%    always selects the correct branch in an |\ifmmode| switch with
%    the usual disadvantage of ruining kerning. For the application we
%    use it for here that shouldn't matter. The alternative would be
%    to mimic |\IeC| from \textsf{inputenc} but then it wil have the
%    disadvantage of choosing the wrong branch if appearing at the
%    beginning of an alignment cell. However, users of e\TeX\ will be
%    pleasantly surprised to get the best of both worlds and no bad
%    side effects.
% 
%    First some code for checking if we are running e\TeX\ but making
%    sure not to permanently turn |\eTeXversion| into |\relax|.
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname eTeXversion\endcsname\relax 
%    \end{macrocode}
% In case of ordinary \TeX\ we define |\TextOrMath| as a robust
% command but make sure it always grabs its arguments. If we didn't do
% this it might very well gobble spaces in the input stream.
%    \begin{macrocode}
\DeclareRobustCommand\TextOrMath{%
  \ifmmode  \expandafter\@secondoftwo
  \else     \expandafter\@firstoftwo  \fi}
\protected@edef\TextOrMath#1#2{\TextOrMath{#1}{#2}}
\else
%    \end{macrocode}
% For e\TeX\ the situation is similar. The robust macro is a hidden
% one so that we again avoid problems of gobbling spaces in the input.
%    \begin{macrocode}
\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
%    \end{macrocode}
%  \end{macro}
%
% \subsection{No hyphenation in first word after float environment(pr/3498)}
%
%  \begin{macro}{\@esphack}
%  \begin{macro}{\@Esphack}
%    Fix suggested by Donald Arseneau.
% \changes{v1.1g}{2003/09/19}{Fix for \cs{@esphack} (pr/3498)}
% \changes{v1.1h}{2004/02/13}{Fix for \cs{@Esphack} (pr/3498)}
%    \begin{macrocode}
\def\@esphack{%
  \relax
  \ifhmode
    \spacefactor\@savsf
    \ifdim\@savsk>\z@
      \nobreak \hskip\z@skip  % <------
      \ignorespaces
    \fi
  \fi}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\@Esphack{%
  \relax
  \ifhmode
    \spacefactor\@savsf
    \ifdim\@savsk>\z@
      \nobreak \hskip\z@skip  % <------
      \@ignoretrue
      \ignorespaces
    \fi
   \fi}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \subsection{Allowing \texttt{\textbackslash emph} to produce small
%             caps, etc}
%  \begin{macro}{\em}
%  \begin{macro}{\eminnershape}
% \changes{v1.1g}{2003/09/19}{Allow \cs{emph} to produce small caps}
%    \begin{macrocode}
\DeclareRobustCommand\em
        {\@nomath\em \ifdim \fontdimen\@ne\font >\z@
                       \eminnershape \else \itshape \fi}
\def\eminnershape{\upshape}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \subsection{\texttt{\textbackslash textsubscript} not defined in  
%    latex.ltx (pr/3492)}
%
% \begin{macro}{\textsubscript}
% \changes{v1.1j}{2005/07/13}{Add \cs{textsubscript}}
% \changes{v1.1k}{2005/09/29}{Fixed blank lines}
% This macro is almost identical to \cs{textsuperscript} from the
% kernel.
%    \begin{macrocode}
\DeclareRobustCommand*\textsubscript[1]{%
  \@textsubscript{\selectfont#1}}
\def\@textsubscript#1{%
  {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}
%    \end{macrocode}
%  \end{macro}
%
% \subsection{\texttt{\textbackslash DeclareMathSizes} only take pts.
%     (pr/3693)}
%
% \begin{macro}{\@DeclareMathSizes} 
% \changes{v1.1k}{2005/09/29}{Fixed blank lines}
% This fix given by Michael J. Downes on comp.text.tex on 2002/10/17
%  allows the user to have settings such as
% \verb=\DeclareMathSizes{9.5dd}{9.5dd}{7.4dd}{6.6dd}=.
%    \begin{macrocode}
\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
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Fewer fragile macros}
%
% \begin{macro}{\MakeRobust} 
% \changes{v1.1n}{2006/03/24}{Added macro} 
%
% The macro firstly checks if the controls sequence in question exists
% at all.
%    \begin{macrocode}
\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
  }%
%    \end{macrocode}
% Then we check if the macro is already robust. We do this by testing
% if the internal name for a robust macro is defined, namely
% \verb*=\foo =. If it is already defined do nothing, otherwise set
% \verb*=\foo = equal to \verb*=\foo= and redefine \verb*=\foo= so
% that it acts like a macro defined with \verb=\DeclareRobustCommand=.
%    \begin{macrocode}
  {% 
    \@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}}%
   }%
}
%    \end{macrocode}
% \end{macro}
% Here we make some kernel macros robust.
%    \begin{macrocode}
\MakeRobust\(
\MakeRobust\) 
\MakeRobust\[ 
\MakeRobust\]
\MakeRobust\makebox 
\MakeRobust\savebox 
\MakeRobust\framebox 
\MakeRobust\parbox 
\MakeRobust\rule
\MakeRobust\raisebox
%    \end{macrocode}
%
%    \begin{macrocode}
%</fixltx2e>
%    \end{macrocode}
%
% \subsection{Using EC fonts (T1 encoding) makes my documents look
%             bl**dy horrible}
%
% \subsubsection{Preliminaries} 
% The \LaTeX{} kernel does not declare the font encoding TS1.
% However, we are going to set up font definitions for this encoding,
% so we have to declare it now.
%    \begin{macrocode}
%<*fix-cm>
\input{ts1enc.def}
%    \end{macrocode}
%
% In case the package is loaded in the preamble, any of the CM fonts may
% have been used already and cannot be redefined.  Yet we try to
% intercept at least the problem that is most likely to occur, i.e., 
% a hidden \cmd{\normalfont}.  Most of the standard definitions 
% are ok, but those for T1 encoding and 10.95\,pt need to be removed:
%    \begin{macrocode}
\expandafter \let \csname T1/cmr/m/n/10.95\endcsname \relax
\expandafter \let \csname T1/cmss/m/n/10.95\endcsname \relax
\expandafter \let \csname T1/cmtt/m/n/10.95\endcsname \relax
\expandafter \let \csname T1/cmvtt/m/n/10.95\endcsname \relax
%    \end{macrocode}
%
% \Lpack{fix-cm} may still fail, if the EC fonts are preloaded in the 
% \LaTeX{} format file. This situation is, however, very unlikely and could occur 
% only with a customized format.
%
% The remainder of the package is enclosed in a group, where the catcodes 
% are guaranteed to be appropriate for the processing of font definitions.
%    \begin{macrocode}
\begingroup
\nfss@catcodes
%    \end{macrocode}
%
% \subsubsection{T1 encoding}
%
% \paragraph{CM Roman}
%    \begin{macrocode}
\DeclareFontFamily{T1}{cmr}{}
\DeclareFontShape{T1}{cmr}{m}{n}{
        <-6>    ecrm0500
        <6-7>   ecrm0600
        <7-8>   ecrm0700
        <8-9>   ecrm0800
        <9-10>  ecrm0900
        <10-12> ecrm1000
        <12-17> ecrm1200
        <17->   ecrm1728
      }{}
\DeclareFontShape{T1}{cmr}{m}{sl}{
        <-6>    ecsl0500
        <6-7>   ecsl0600
        <7-8>   ecsl0700
        <8-9>   ecsl0800
        <9-10>  ecsl0900
        <10-12> ecsl1000
        <12-17> ecsl1200
        <17->   ecsl1728
      }{}
\DeclareFontShape{T1}{cmr}{m}{it}{
        <-8>    ecti0700
        <8-9>   ecti0800
        <9-10>  ecti0900
        <10-12> ecti1000
        <12-17> ecti1200
        <17->   ecti1728
      }{}
\DeclareFontShape{T1}{cmr}{m}{sc}{
        <-6>    eccc0500
        <6-7>   eccc0600
        <7-8>   eccc0700
        <8-9>   eccc0800
        <9-10>  eccc0900
        <10-12> eccc1000
        <12-17> eccc1200
        <17->   eccc1728
               }{}
\DeclareFontShape{T1}{cmr}{m}{ui}{
        <-8>    ecui0700
        <8-9>   ecui0800
        <9-10>  ecui0900
        <10-12> ecui1000
        <12-17> ecui1200
        <17->   ecui1728
      }{}
\DeclareFontShape{T1}{cmr}{b}{n}{
        <-6>    ecrb0500
        <6-7>   ecrb0600
        <7-8>   ecrb0700
        <8-9>   ecrb0800
        <9-10>  ecrb0900
        <10-12> ecrb1000
        <12-17> ecrb1200
        <17->   ecrb1728
      }{}
\DeclareFontShape{T1}{cmr}{bx}{n}{
        <-6>    ecbx0500
        <6-7>   ecbx0600
        <7-8>   ecbx0700
        <8-9>   ecbx0800
        <9-10>  ecbx0900
        <10-12> ecbx1000
        <12->   ecbx1200
      }{}
\DeclareFontShape{T1}{cmr}{bx}{sl}{
        <-6>    ecbl0500
        <6-7>   ecbl0600
        <7-8>   ecbl0700
        <8-9>   ecbl0800
        <9-10>  ecbl0900
        <10-12> ecbl1000
        <12->   ecbl1200
      }{}
\DeclareFontShape{T1}{cmr}{bx}{it}{
        <-8>    ecbi0700
        <8-9>   ecbi0800
        <9-10>  ecbi0900
        <10-12> ecbi1000
        <12->   ecbi1200
      }{}
\DeclareFontShape{T1}{cmr}{bx}{sc}{
        <-6>    ecxc0500
        <6-7>   ecxc0600
        <7-8>   ecxc0700
        <8-9>   ecxc0800
        <9-10>  ecxc0900
        <10-12> ecxc1000
        <12->   ecxc1200
      }{}
%
%    \end{macrocode}
%
% \paragraph{CM Sans}
%    \begin{macrocode}
\DeclareFontFamily{T1}{cmss}{}
\DeclareFontShape{T1}{cmss}{m}{n}{
        <-9>    ecss0800
        <9-10>  ecss0900
        <10-12> ecss1000
        <12-17> ecss1200
        <17->   ecss1728
      }{}
\DeclareFontShape{T1}{cmss}{m}{sl}{
        <-9>    ecsi0800
        <9-10>  ecsi0900
        <10-12> ecsi1000
        <12-17> ecsi1200
        <17->   ecsi1728
      }{}
\DeclareFontShape{T1}{cmss}{m}{it}
       {<->ssub*cmss/m/sl}{}
\DeclareFontShape{T1}{cmss}{m}{sc}
       {<->sub*cmr/m/sc}{}
\DeclareFontShape{T1}{cmss}{sbc}{n}{
        <->     ecssdc10
       }{}
\DeclareFontShape{T1}{cmss}{bx}{n}{
        <-10>   ecsx0900
        <10->   ecsx1000
      }{}
\DeclareFontShape{T1}{cmss}{bx}{sl}{
        <-10>   ecso0900
        <10->   ecso1000
      }{}
\DeclareFontShape{T1}{cmss}{bx}{it}
       {<->ssub*cmss/bx/sl}{}
%    \end{macrocode}
% The following substitutions are not provided in the default 
% \file{.fd} files.  I have included them, so that you can 
% easily use the EC fonts with the default bold series being
% \file{b} rather than \file{bx}.
%    \begin{macrocode}
\DeclareFontShape{T1}{cmss}{b}{n}
       {<->ssub*cmss/bx/n}{}
\DeclareFontShape{T1}{cmss}{b}{sl}
       {<->ssub*cmss/bx/sl}{}
\DeclareFontShape{T1}{cmss}{b}{it}
       {<->ssub*cmss/bx/sl}{}
%    \end{macrocode}
%
% \paragraph{CM Typewriter}
%    \begin{macrocode}
\DeclareFontFamily{T1}{cmtt}{\hyphenchar \font\m@ne}
\DeclareFontShape{T1}{cmtt}{m}{n}{
        <-9>    ectt0800
        <9-10>  ectt0900
        <10-12> ectt1000
        <12-17> ectt1200
        <17->   ectt1728
      }{}
\DeclareFontShape{T1}{cmtt}{m}{it}{
        <-9>    ecit0800
        <9-10>  ecit0900
        <10-12> ecit1000
        <12-17> ecit1200
        <17->   ecit1728
      }{}
\DeclareFontShape{T1}{cmtt}{m}{sl}{
        <-9>    ecst0800
        <9-10>  ecst0900
        <10-12> ecst1000
        <12-17> ecst1200
        <17->   ecst1728
      }{}
\DeclareFontShape{T1}{cmtt}{m}{sc}{
        <-9>    ectc0800
        <9-10>  ectc0900
        <10-12> ectc1000
        <12-17> ectc1200
        <17->   ectc1728
      }{}
\DeclareFontShape{T1}{cmtt}{bx}{n}
       {<->sub * cmtt/m/n}{}
\DeclareFontShape{T1}{cmtt}{bx}{it}
       {<->sub * cmtt/m/it}{}
\DeclareFontShape{T1}{cmtt}{bx}{sl}
       {<->sub * cmtt/m/sl}{}
%    \end{macrocode}
% Substitutions not provided in the default \file{.fd} files:
%    \begin{macrocode}
\DeclareFontShape{T1}{cmtt}{b}{n}
       {<->sub * cmtt/m/n}{}
\DeclareFontShape{T1}{cmtt}{b}{it}
       {<->sub * cmtt/m/it}{}
\DeclareFontShape{T1}{cmtt}{b}{sl}
       {<->sub * cmtt/m/sl}{}
%    \end{macrocode}
%
% \paragraph{CM Typewiter (var.)}
%    \begin{macrocode}
\DeclareFontFamily{T1}{cmvtt}{}
\DeclareFontShape{T1}{cmvtt}{m}{n}{
        <-9>    ecvt0800
        <9-10>  ecvt0900
        <10-12> ecvt1000
        <12-17> ecvt1200
        <17->   ecvt1728
      }{}
\DeclareFontShape{T1}{cmvtt}{m}{it}{
        <-9>    ecvi0800
        <9-10>  ecvi0900
        <10-12> ecvi1000
        <12-17> ecvi1200
        <17->   ecvi1728
      }{}
%    \end{macrocode}
%
% \subsubsection{TS1 encoding}
%
% \paragraph{CM Roman}
%    \begin{macrocode}
\DeclareFontFamily{TS1}{cmr}{\hyphenchar\font\m@ne}
\DeclareFontShape{TS1}{cmr}{m}{n}{
        <-6>    tcrm0500
        <6-7>   tcrm0600
        <7-8>   tcrm0700
        <8-9>   tcrm0800
        <9-10>  tcrm0900
        <10-12> tcrm1000
        <12-17> tcrm1200
        <17->   tcrm1728
      }{}
\DeclareFontShape{TS1}{cmr}{m}{sl}{
        <-6>    tcsl0500
        <6-7>   tcsl0600
        <7-8>   tcsl0700
        <8-9>   tcsl0800
        <9-10>  tcsl0900
        <10-12> tcsl1000
        <12-17> tcsl1200
        <17->   tcsl1728
      }{}
\DeclareFontShape{TS1}{cmr}{m}{it}{
        <-8>    tcti0700
        <8-9>   tcti0800
        <9-10>  tcti0900
        <10-12> tcti1000
        <12-17> tcti1200
        <17->   tcti1728
      }{}
\DeclareFontShape{TS1}{cmr}{m}{ui}{
        <-8>    tcui0700
        <8-9>   tcui0800
        <9-10>  tcui0900
        <10-12> tcui1000
        <12-17> tcui1200
        <17->   tcui1728
      }{}
\DeclareFontShape{TS1}{cmr}{b}{n}{
        <-6>    tcrb0500
        <6-7>   tcrb0600
        <7-8>   tcrb0700
        <8-9>   tcrb0800
        <9-10>  tcrb0900
        <10-12> tcrb1000
        <12-17> tcrb1200
        <17->   tcrb1728
      }{}
\DeclareFontShape{TS1}{cmr}{bx}{n}{
        <-6>    tcbx0500
        <6-7>   tcbx0600
        <7-8>   tcbx0700
        <8-9>   tcbx0800
        <9-10>  tcbx0900
        <10-12> tcbx1000
        <12->   tcbx1200
      }{}
\DeclareFontShape{TS1}{cmr}{bx}{sl}{
        <-6>    tcbl0500
        <6-7>   tcbl0600
        <7-8>   tcbl0700
        <8-9>   tcbl0800
        <9-10>  tcbl0900
        <10-12> tcbl1000
        <12->   tcbl1200
      }{}
\DeclareFontShape{TS1}{cmr}{bx}{it}{
        <-8>    tcbi0700
        <8-9>   tcbi0800
        <9-10>  tcbi0900
        <10-12> tcbi1000
        <12->   tcbi1200
      }{}
%    \end{macrocode}
%
% \paragraph{CM Sans}
%    \begin{macrocode}
\DeclareFontFamily{TS1}{cmss}{\hyphenchar\font\m@ne}
\DeclareFontShape{TS1}{cmss}{m}{n}{
        <-9>    tcss0800
        <9-10>  tcss0900
        <10-12> tcss1000
        <12-17> tcss1200
        <17->   tcss1728
      }{}
\DeclareFontShape{TS1}{cmss}{m}{it}
       {<->ssub*cmss/m/sl}{}
\DeclareFontShape{TS1}{cmss}{m}{sl}{
        <-9>    tcsi0800
        <9-10>  tcsi0900
        <10-12> tcsi1000
        <12-17> tcsi1200
        <17->   tcsi1728
      }{}
\DeclareFontShape{TS1}{cmss}{sbc}{n}{
        <->     tcssdc10
       }{}
\DeclareFontShape{TS1}{cmss}{bx}{n}{
        <-10>   tcsx0900
        <10->   tcsx1000
      }{}
\DeclareFontShape{TS1}{cmss}{bx}{sl}{
        <-10>   tcso0900
        <10->   tcso1000
      }{}
\DeclareFontShape{TS1}{cmss}{bx}{it}
       {<->ssub*cmss/bx/sl}{}
%    \end{macrocode}
% Substitutions not provided in the default \file{.fd} files:
%    \begin{macrocode}
\DeclareFontShape{TS1}{cmss}{b}{n}
       {<->ssub*cmss/bx/n}{}
\DeclareFontShape{TS1}{cmss}{b}{sl}
       {<->ssub*cmss/bx/sl}{}
\DeclareFontShape{TS1}{cmss}{b}{it}
       {<->ssub*cmss/bx/sl}{}
%    \end{macrocode}
%
% \paragraph{CM Typewriter}
%    \begin{macrocode}
\DeclareFontFamily{TS1}{cmtt}{\hyphenchar \font\m@ne}
\DeclareFontShape{TS1}{cmtt}{m}{n}{
        <-9>    tctt0800
        <9-10>  tctt0900
        <10-12> tctt1000
        <12-17> tctt1200
        <17->   tctt1728
      }{}
\DeclareFontShape{TS1}{cmtt}{m}{it}{
        <-9>    tcit0800
        <9-10>  tcit0900
        <10-12> tcit1000
        <12-17> tcit1200
        <17->   tcit1728
      }{}
\DeclareFontShape{TS1}{cmtt}{m}{sl}{
        <-9>    tcst0800
        <9-10>  tcst0900
        <10-12> tcst1000
        <12-17> tcst1200
        <17->   tcst1728
      }{}
\DeclareFontShape{TS1}{cmtt}{bx}{n}
       {<->sub * cmtt/m/n}{}
\DeclareFontShape{TS1}{cmtt}{bx}{it}
       {<->sub * cmtt/m/it}{}
\DeclareFontShape{TS1}{cmtt}{bx}{sl}
       {<->sub * cmtt/m/sl}{}
%    \end{macrocode}
% Substitutions not provided in the default \file{.fd} files:
%    \begin{macrocode}
\DeclareFontShape{TS1}{cmtt}{b}{n}
       {<->sub * cmtt/m/n}{}
\DeclareFontShape{TS1}{cmtt}{b}{it}
       {<->sub * cmtt/m/it}{}
\DeclareFontShape{TS1}{cmtt}{b}{sl}
       {<->sub * cmtt/m/sl}{}
%    \end{macrocode}
%
% \paragraph{CM Typewriter (var.)}
%    \begin{macrocode}
\DeclareFontFamily{TS1}{cmvtt}{}
\DeclareFontShape{TS1}{cmvtt}{m}{n}{
        <-9>    tcvt0800
        <9-10>  tcvt0900
        <10-12> tcvt1000
        <12-17> tcvt1200
        <17->   tcvi1728
      }{}
\DeclareFontShape{TS1}{cmvtt}{m}{it}{
        <-9>    tcvi0800
        <9-10>  tcvi0900
        <10-12> tcvi1000
        <12-17> tcvi1200
        <17->   tcvi1728
      }{}
%    \end{macrocode}
%
% \subsubsection{OT1 encoding}
%
% \paragraph{CM Roman}
%    \begin{macrocode}
\DeclareFontFamily{OT1}{cmr}{\hyphenchar\font45 }
\DeclareFontShape{OT1}{cmr}{m}{n}{
        <-6>    cmr5
        <6-7>   cmr6
        <7-8>   cmr7
        <8-9>   cmr8
        <9-10>  cmr9
        <10-12> cmr10
        <12-17> cmr12
        <17->   cmr17
      }{}
\DeclareFontShape{OT1}{cmr}{m}{sl}{
        <-9>    cmsl8
        <9-10>  cmsl9
        <10-12> cmsl10
        <12->   cmsl12
      }{}
\DeclareFontShape{OT1}{cmr}{m}{it}{
        <-8>    cmti7
        <8-9>   cmti8
        <9-10>  cmti9
        <10-12> cmti10
        <12->   cmti12
      }{}
\DeclareFontShape{OT1}{cmr}{m}{sc}{
        <->     cmcsc10
      }{}
\DeclareFontShape{OT1}{cmr}{m}{ui}{
        <->     cmu10
      }{}
\DeclareFontShape{OT1}{cmr}{b}{n}{
        <->     cmb10
      }{}
\DeclareFontShape{OT1}{cmr}{bx}{n}{
        <-6>    cmbx5
        <6-7>   cmbx6
        <7-8>   cmbx7
        <8-9>   cmbx8
        <9-10>  cmbx9
        <10-12> cmbx10
        <12->   cmbx12
      }{}
\DeclareFontShape{OT1}{cmr}{bx}{sl}{
        <->     cmbxsl10
      }{}
\DeclareFontShape{OT1}{cmr}{bx}{it}{
        <->     cmbxti10
      }{}
\DeclareFontShape{OT1}{cmr}{bx}{ui}
      {<->sub*cmr/m/ui}{}
%    \end{macrocode}
%
% \paragraph{CM Sans}
%    \begin{macrocode}
\DeclareFontFamily{OT1}{cmss}{\hyphenchar\font45 }
\DeclareFontShape{OT1}{cmss}{m}{n}{
        <-9>    cmss8
        <9-10>  cmss9
        <10-12> cmss10
        <12-17> cmss12
        <17->   cmss17
      }{}
\DeclareFontShape{OT1}{cmss}{m}{it}
      {<->sub*cmss/m/sl}{}
\DeclareFontShape{OT1}{cmss}{m}{sl}{
        <-9>    cmssi8
        <9-10>  cmssi9
        <10-12> cmssi10
        <12-17> cmssi12
        <17->   cmssi17
      }{}
\DeclareFontShape{OT1}{cmss}{m}{sc}
       {<->sub*cmr/m/sc}{}
\DeclareFontShape{OT1}{cmss}{m}{ui}
       {<->sub*cmr/m/ui}{}
\DeclareFontShape{OT1}{cmss}{sbc}{n}{
        <->     cmssdc10
      }{}
\DeclareFontShape{OT1}{cmss}{bx}{n}{
        <->     cmssbx10
      }{}
\DeclareFontShape{OT1}{cmss}{bx}{ui}
       {<->sub*cmr/bx/ui}{}
%    \end{macrocode}
%
% \paragraph{CM Typewriter}
%    \begin{macrocode}
\DeclareFontFamily{OT1}{cmtt}{\hyphenchar \font\m@ne}
\DeclareFontShape{OT1}{cmtt}{m}{n}{
        <-9>    cmtt8
        <9-10>  cmtt9
        <10-12> cmtt10
        <12->   cmtt12
      }{}
\DeclareFontShape{OT1}{cmtt}{m}{it}{
        <->     cmitt10
      }{}
\DeclareFontShape{OT1}{cmtt}{m}{sl}{
        <->     cmsltt10
      }{}
\DeclareFontShape{OT1}{cmtt}{m}{sc}{
        <->     cmtcsc10
      }{}
\DeclareFontShape{OT1}{cmtt}{m}{ui}
       {<->ssub*cmtt/m/it}{}
\DeclareFontShape{OT1}{cmtt}{bx}{n}
       {<->ssub*cmtt/m/n}{}
\DeclareFontShape{OT1}{cmtt}{bx}{it}
       {<->ssub*cmtt/m/it}{}
\DeclareFontShape{OT1}{cmtt}{bx}{ui}
       {<->ssub*cmtt/m/it}{}
%    \end{macrocode}
%
% \paragraph{CM Typewriter (var.)}
%    \begin{macrocode}
\DeclareFontFamily{OT1}{cmvtt}{\hyphenchar\font45 }
\DeclareFontShape{OT1}{cmvtt}{m}{n}{
        <->     cmvtt10
      }{}
\DeclareFontShape{OT1}{cmvtt}{m}{it}{
        <->     cmvtti10
      }{}
%    \end{macrocode}
%
% \subsubsection{OML and OMS encoded math fonts}
%    \begin{macrocode}
\DeclareFontFamily{OML}{cmm}{\skewchar\font127 }
\DeclareFontShape{OML}{cmm}{m}{it}{
        <-6>    cmmi5
        <6-7>   cmmi6
        <7-8>   cmmi7
        <8-9>   cmmi8
        <9-10>  cmmi9
        <10-12> cmmi10
        <12->   cmmi12
      }{}
\DeclareFontShape{OML}{cmm}{b}{it}{<-6>cmmib5<6-8>cmmib7<8->cmmib10}{}
\DeclareFontShape{OML}{cmm}{bx}{it}
       {<->ssub*cmm/b/it}{}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareFontFamily{OMS}{cmsy}{\skewchar\font48 }
\DeclareFontShape{OMS}{cmsy}{m}{n}{
        <-6>    cmsy5
        <6-7>   cmsy6
        <7-8>   cmsy7
        <8-9>   cmsy8
        <9-10>  cmsy9
        <10->   cmsy10
      }{}
\DeclareFontShape{OMS}{cmsy}{b}{n}{<-6>cmbsy5<6-8>cmbsy7<8->cmbsy10}{}
%    \end{macrocode}
%
% \subsubsection{\LaTeX{} symbols}
%    \begin{macrocode}
\DeclareFontFamily{U}{lasy}{}
\DeclareFontShape{U}{lasy}{m}{n}{ 
        <-6>    lasy5 
        <6-7>   lasy6
        <7-8>   lasy7
        <8-9>   lasy8
        <9-10>  lasy9 
        <10->   lasy10  
      }{}
\DeclareFontShape{U}{lasy}{b}{n}{
        <-10>   ssub * lasy/m/n
        <10->   lasyb10  
      }{}
%    \end{macrocode}
%    \begin{macrocode}
\endgroup
%</fix-cm>
%    \end{macrocode}
%
%
% \Finale
%
\endinput
