\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{finstrut}[2011/02/12 v0.4 vmode final strut (DA/UL)]

%% Copyright (C) 2010 2011 Uwe Lueck, 
%% http://www.contact-ednotes.sty.de.vu 
%% -- author-maintained in the sense of LPPL below -- 
%%
%% This file can be redistributed and/or modified under 
%% the terms of the LaTeX Project Public License; either 
%% version 1.3c of the License, or any later version.
%% The latest version of this license is in
%%     http://www.latex-project.org/lppl.txt
%% We did our best to help you, but there is NO WARRANTY. 
%%
%% Please report bugs, problems, and suggestions via 
%% 
%%   http://www.contact-ednotes.sty.de.vu 
%%
%% % *** Another Introduction ***
%% % This is a variant of LaTeX's `\@finalstrut'
%% % that doesn't produce a spurious empty line 
%% % in vmode. In general, this deals with a 
%% % closing `\par' from users in footnotes, 
%% % the idea especially came from using the 
%% % 'lipsum' package.
%% % See `source2e.pdf' (`ltboxes.dtx') for the rationale 
%% % behind the original definition; it may imply 
%% % that the present suggestion is bad with 
%% % `p' columns in `tabular' etc.
%% % 
%% % With v0.4, the code essentially is Donald Arseneau's.
%% 
%% === Outline ===
%% v0.4 considers recommendations by Donald Arseneau. 
%% Some of them may break in applications that we do not 
%% know about, therefore they must be called by package 
%% options. Package Option |[full]| calls all of them.
%%
%% The choices shall not be checked at each invocation 
%% of `\@finalstrut', instead they are evaluated at the 
%% definition of `\@finalstrut', at the end of the package.
%% Choices are prepended to this definition by defining 
%% `\@tempe', `\@tempd', `\@tempc', and `\@tempb'.
%% 
%% === Options ===
%% According to `ltboxes.dtx', a `vmode' test once 
%% was introduced for \LaTeXe, but in 1994 removed again---it 
%% ``broke" in `p' columns. For this reason, v0.1 and v0.3 
%% used an `hmode' test instead. 
%% `ltboxes.dtx' does not tell exactly what code broke in 
%% exactly which situation. Bad. 
%% Brave users may dare the `vmode' test again by choosing 
%% package option |[v]|. It sets `\@tempe' for 
%% `\edef\@finalstrut'. While other conditionals are disabled 
%% right before the latter, we disable the mode test here:
\AtEndOfPackage{%
    \def\@tempe#1#2{\noexpand\ifhmode#1\else#2\fi}}
\DeclareOption{v}{%
  \AtEndOfPackage{%
    \def\@tempe#1#2{\noexpand\ifvmode#2\else#1\fi}}}
%% |[argdelim]| appends a `\relax' to `\@finalstrut''s argument 
%% in case the box number is given as a string of digits 
%% (whereas `latex.ltx' only has `\strutbox' and 
%%  `\@arstrutbox' as arguments). 
%% This does not work when somebody tries (e.g.\@)
%% `\@finalstrut11 '. I.e., a ``multi-token" argument must 
%% be enclosed in braces indeed.
\AtEndOfPackage{\let\@tempd\@empty}
\DeclareOption{argdelim}{%
    \AtEndOfPackage{\def\@tempd{\relax}}}
\AtEndOfPackage{\let\@tempc\@secondoftwo}
%% |[dptest]| caters for depth exceeeding the depth of the 
%% strut box and for negative depth. The test requires that 
%% a multi-token argument (see above) is enclosed in braces.
\DeclareOption{dptest}{%
  \AtEndOfPackage{%
    \def\@tempd{\relax}%
    \let\@tempc\@firstoftwo}}
%% |[full]| enables all of Donald Arseneau's suggestions:
\DeclareOption{full}{%
  \AtEndOfPackage{%
    \def\@tempe#1#2{\noexpand\ifvmode#2\else#1\fi}%
    \def\@tempd{\relax}%
    \let\@tempc\@firstoftwo
}}
%% |[show]| displays the definition of `\@finalstrut'
%% actually resulting: 
\AtEndOfPackage{\let\@tempb\relax}
\DeclareOption{show}{%
    \AtEndOfPackage{\def\@tempb{\show\@finalstrut}}}
%% Appending choices to the end-of-package hook:
\ProcessOptions
%% 
%% === Core Code ===
%% Now we append the `\edef' of `\@finalstrut' to the 
%% end-of-package hook 
%% (we must hurry so that nobody changes `\@tempe' etc.). 
%% |\dp@only| will be an abbreviation for invoking a strut rule; 
%% it will only be enabled after the `\edef':
\let\dp@only\relax
\AtEndOfPackage{%
  \begingroup
%% Some conditionals are disabled for the `\edef':
    \let\ifdim\relax \let\else\relax \let\fi\relax
    \xdef\@gtempa#1{%
      \unskip
      \@tempe{%                         %% \ifhmode/\ifvmode
          \noexpand\nobreak
          \vrule \dp@only #1\@tempd     %% maybe \relax
        }{%
%% Whereas v0.1 and v0.3 used `\kern' to get the bottom 
%% distance in `vmode', Donald Arseneau recommends `\hrule'
%% for the sake of bottom alignment with 'array.sty' 
%% (`b' type columns):
          \@tempc{%                     %% depth test or not 
            \ifdim\prevdepth<\dp#1\relax
                \ifdim\prevdepth>\z@
                    \kern -\prevdepth
                \fi
                \hrule \dp@only#1\relax
            \fi
          }{\hrule \dp@only #1\@tempd}% %% maybe \relax
        }%
    }
  \endgroup
  \let\@finalstrut\@gtempa
  \@tempb                               %% maybe \show
%% |\dp@only|
  \def\dp@only{\@width\z@ \@height\z@ \@depth\dp}
}
%%
%% === Leaving ===
\endinput
%%
%% === VERSION HISTORY ===

v0.1   2010/12/20   very first 
v0.2   2011/02/09   redundancies removed -- still bad
       NOT DISTRIBUTED
v0.3   2011/02/11   code much reduced again (no \expandafter at all!); 
                    wrong comments replaced; \subsection
v0.4   2011/02/12   Donald Arseneau's full suggestions as options
