summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/finstrut/finstrut.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/finstrut/finstrut.sty
Initial commit
Diffstat (limited to 'macros/latex/contrib/finstrut/finstrut.sty')
-rw-r--r--macros/latex/contrib/finstrut/finstrut.sty188
1 files changed, 188 insertions, 0 deletions
diff --git a/macros/latex/contrib/finstrut/finstrut.sty b/macros/latex/contrib/finstrut/finstrut.sty
new file mode 100644
index 0000000000..6f261c6181
--- /dev/null
+++ b/macros/latex/contrib/finstrut/finstrut.sty
@@ -0,0 +1,188 @@
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesPackage{finstrut}[2011/03/14 v0.5 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.5 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.
+%% %% 2011/03/14:
+%% Package Option |[fullpar]| calls a variant of them
+%% where instead of testing for `hmode' vs.~`vmode',
+%% `vmode' is \emph{forced} by a `\par', saving some tokens.
+%%
+%% 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'. The #1 argument of `\@tempe' is
+%% applied in `hmode', #2 in `vmode'---assuming we are not
+%% in `math' `mode' ...!? (TODO)%%%
+%% %% <- !?? don't understand 2011/02/16 ->
+%% %---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}}}
+%% Replacing the `hmode' or `vmode' test by \emph{forcing} `vmode'
+%% (and then applying Donald Arseneau's suggestions for `vmode')
+%% seems just to save a few tokens. With v0.5, option |[par]|
+%% picks this idea.
+\DeclareOption{par}{\AtEndOfPackage{\def\@tempe#1#2{\par#2}}}
+%% |[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}}}
+%% %% v0.5 move \@tempc down
+%% |[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.
+\AtEndOfPackage{\let\@tempc\@secondoftwo}
+\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
+}}
+%% |[fullpar]| enables all of Donald Arseneau's suggestions
+%% apart from replacing the `vmode' test by \emph{forcing}
+%% `vmode', as with option |[par]|:
+\DeclareOption{fullpar}{%
+ \AtEndOfPackage{%
+ \def\@tempe#1#2{\par#2}%
+ \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
+%% Actually, they will be restored by `\endgroup';
+%% and in order to get the final `\@finalstrut'
+%% outside the group, we ``emulate" its `\edef'
+%% by `\xdef'ing an alias `\@gtempa' of it etc. ...
+ \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}
+}
+%%
+%% === Example Result === %% 2011/02/17
+%% Option |[fullpar]| amounts to
+%% \begin{verbatim}
+%% \def\@finalstrut#1{%
+%% \unskip\par
+%% \ifdim\prevdepth<\dp#1\relax
+%% \ifdim\prevdepth>\z@
+%% \kern -\prevdepth
+%% \fi
+%% \hrule \@width\z@ \@height\z@ \@depth\dp#1\relax
+%% \fi
+%% }
+%% \end{verbatim}
+%%
+%% === 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
+v0.5 2011/02/12 first \@tempc line moved down
+ 2011/02/16 options [par] and [fullpar]
+ 2011/02/17 explaining \edef/\xdef
+ 2011/02/18 "emulate" \edef
+ 2011/03/14 some more text on v0.5