123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705 |
- % \begin{meta-comment}
- %
- % $Id$
- %
- % Save footnotes around boxing environments and things
- %
- % (c) 1996 Mark Wooding
- %
- %----- Revision history -----------------------------------------------------
- %
- % $Log$
- % Revision 1.1 2000-07-13 09:10:20 michael
- % + Initial import
- %
- % Revision 1.1 1998/09/21 10:19:01 michael
- % Initial implementation
- %
- % Revision 1.13 1997/01/28 19:45:16 mdw
- % Fixed stupid bug in AMS environment handling which stops the thing from
- % working properly if you haven't included amsmath. Doh.
- %
- % Revision 1.12 1997/01/18 00:45:37 mdw
- % Fix problems with duplicated footnotes in broken AMS environments which
- % typeset things multiple times. This is a nasty kludge.
- %
- % Revision 1.11 1996/11/19 20:50:05 mdw
- % Entered into RCS
- %
- %
- % \end{meta-comment}
- %
- % \begin{meta-comment} <general public licence>
- %%
- %% footnote package -- Save footnotes around boxing environments
- %% Copyright (c) 1996 Mark Wooding
- %<*package>
- %%
- %% This program is free software; you can redistribute it and/or modify
- %% it under the terms of the GNU General Public License as published by
- %% the Free Software Foundation; either version 2 of the License, or
- %% (at your option) any later version.
- %%
- %% This program is distributed in the hope that it will be useful,
- %% but WITHOUT ANY WARRANTY; without even the implied warranty of
- %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- %% GNU General Public License for more details.
- %%
- %% You should have received a copy of the GNU General Public License
- %% along with this program; if not, write to the Free Software
- %% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- %</package>
- %%
- % \end{meta-comment}
- %
- % \begin{meta-comment} <Package preamble>
- %<+package>\NeedsTeXFormat{LaTeX2e}
- %<+package>\ProvidesPackage{footnote}
- %<+package> [1997/01/28 1.13 Save footnotes around boxes]
- % \end{meta-comment}
- %
- % \CheckSum{327}
- %\iffalse
- %<*package>
- %\fi
- %% \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 \~}
- %%
- %\iffalse
- %</package>
- %\fi
- %
- % \begin{meta-comment} <driver>
- %
- %<*driver>
- \input{mdwtools}
- \describespackage{footnote}
- \mdwdoc
- %</driver>
- %
- % \end{meta-comment}
- %
- % \section{User guide}
- %
- % This package provides some commands for handling footnotes slightly
- % better than \LaTeX\ usually does; there are several commands and
- % environments (notably |\parbox|, \env{minipage} and \env{tabular}
- % \begin{footnote}
- % The \package{mdwtab} package, provided in this distribution, handles
- % footnotes correctly anyway; it uses an internal version of this package
- % to do so.
- % \end{footnote})
- % which `trap' footnotes so that they can't escape and appear at the bottom
- % of the page.
- %
- % \DescribeEnv{savenotes}
- % The \env{savenotes} environment saves up any footnotes encountered within
- % it, and performs them all at the end.
- %
- % \DescribeMacro{\savenotes}
- % \DescribeMacro{\spewnotes}
- % If you're defining a command or environment, you can use the |\savenotes|
- % command to start saving up footnotes, and the |\spewnotes| command to
- % execute them all at the end. Note that |\savenotes| and |\spewnotes|
- % enclose a group, so watch out. You can safely nest the commands and
- % environments -- they work out if they're already working and behave
- % appropriately.
- %
- % \DescribeEnv{minipage*}
- % To help things along a bit, the package provides a $*$-version of the
- % \env{minipage} environment, which doesn't trap footnotes for itself (and
- % in fact sends any footnotes it contains to the bottom of the page, where
- % they belong).
- %
- % \DescribeMacro{\makesavenoteenv}
- % The new \env{minipage$*$} environment was created with a magic command
- % called |\makesavenoteenv|. It has a fairly simple syntax:
- %
- % \begin{grammar}
- % <make-save-note-env-cmd> ::= \[[
- % "\\makesavenoteenv"
- % \begin{stack} \\ "[" <new-env-name> "]" \end{stack}
- % "{" <env-name> "}"
- % \]]
- % \end{grammar}
- %
- % Without the optional argument, it redefines the named environment so that
- % it handles footnotes correctly. With the optional argument, it makes
- % the new environment named by \<new-env-name> into a footnote-friendly
- % version of the \<env-name> environment.
- %
- % \DescribeMacro{\parbox}
- % The package also redefines the |\parbox| command so that it works properly
- % with footnotes.
- %
- % \DescribeEnv{footnote}
- % The other problem which people tend to experience with footnotes is that
- % you can't put verbatim text (with the |\verb| comamnd or the \env{verbatim}
- % environment) into the |\footnote| command's argument. This package
- % provides a \env{footnote} \emph{environment}, which \emph{does} allow
- % verbatim things. You use the environment just like you do the command.
- % It's really easy. It even has an optional argument, which works the same
- % way.
- %
- % \DescribeEnv{footnotetext}
- % To go with the \env{footnote} environment, there's a \env{footnotetext}
- % environment, which just puts the text in the bottom of the page, like
- % |\footnotetext| does.
- %
- % There's a snag with these environments, though. Some other nonstandard
- % environments, like \env{tabularx}, try to handle footnotes their own
- % way, because they won't work otherwise. The way they do this is not
- % compatible with the way that the \env{footnote} and \env{footnotetext}
- % environments work, and you will get strange results if you try (there'll
- % be odd vertical spacing, and the footnote text may well be incorrect).
- % \begin{footnote}
- % The solution to this problem is to send mail to David Carlisle persuading
- % him to use this package to handle footnotes, rather than doing it his
- % way.
- % \end{footnote}
- %
- % \implementation
- %
- % \section{Implementation}
- %
- % Most implementations of footnote-saving (in particular, that used in
- % the \package{tabularx} and \package{longtable} packages) use a token
- % list register to store the footnote text, and then expand it when whatever
- % was preventing footnotes (usually a vbox) stops. This is no good at all
- % if the footnotes contain things which might not be there by the time the
- % expansion occurs. For example, references to things in temporary boxes
- % won't work.
- %
- % This implementation therefore stores the footnotes up in a box register.
- % This must be just as valid as using tokens, because all I'm going to do
- % at the end is unbox the box).
- %
- % \begin{macrocode}
- %<*macro|package>
- \ifx\fn@notes\@@undefined%
- \newbox\fn@notes%
- \fi
- % \end{macrocode}
- %
- % I'll need a length to tell me how wide the footnotes should be at the
- % moment.
- %
- % \begin{macrocode}
- \newdimen\fn@width
- % \end{macrocode}
- %
- % Of course, I can't set this up until I actually start saving footnotes.
- % Until then I'll use |\columnwidth| (which works in \package{multicol}
- % even though it doesn't have any right to).
- %
- % \begin{macrocode}
- \let\fn@colwidth\columnwidth
- % \end{macrocode}
- %
- % And now a switch to remember if we're already handling footnotes,
- %
- % \begin{macrocode}
- \newif\if@savingnotes
- % \end{macrocode}
- %
- %
- % \subsection{Building footnote text}
- %
- % I need to emulate \LaTeX's footnote handling when I'm putting the notes
- % into my box; this is also useful in the verbatim-in-footnotes stuff.
- %
- % \begin{macro}{\fn@startnote}
- %
- % Here's how a footnote gets started. Most of the code here is stolen
- % from |\@footnotetext|.
- %
- % \begin{macrocode}
- \def\fn@startnote{%
- \hsize\fn@colwidth%
- \interlinepenalty\interfootnotelinepenalty%
- \reset@font\footnotesize%
- \floatingpenalty\@MM% Is this right???
- \@parboxrestore%
- \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}%
- \color@begingroup%
- }
- % \end{macrocode}
- %
- % \end{macro}
- %
- % \begin{macro}{\fn@endnote}
- %
- % Footnotes are finished off by this macro. This is the easy bit.
- %
- % \begin{macrocode}
- \let\fn@endnote\color@endgroup
- % \end{macrocode}
- %
- % \end{macro}
- %
- %
- % \subsection{Footnote saving}
- %
- % \begin{macro}{\fn@fntext}
- %
- % Now to define how to actually do footnotes. I'll just add the notes to
- % the bottom of the footnote box I'm building.
- %
- % There's some hacking added here to handle the case that a footnote is
- % in an |\intertext| command within a broken \package{amsmath} alignment
- % environment -- otherwise the footnotes get duplicated due to the way that
- % that package measures equations.
- % \begin{footnote}
- % The correct solution of course is to
- % implement aligning environments in a sensible way, by building the table
- % and leaving penalties describing the intended format, and then pick that
- % apart in a postprocessing phase. If I get the time, I'll start working
- % on this again. I have a design worked out and the beginnings of an
- % implementation, but it's going to be a long time coming.
- % \end{footnote}
- %
- % \begin{macrocode}
- \def\fn@fntext#1{%
- \ifx\ifmeasuring@\@@undefined%
- \expandafter\@secondoftwo\else\expandafter\@iden%
- \fi%
- {\ifmeasuring@\expandafter\@gobble\else\expandafter\@iden\fi}%
- {%
- \global\setbox\fn@notes\vbox{%
- \unvbox\fn@notes%
- \fn@startnote%
- \@makefntext{%
- \rule\z@\footnotesep%
- \ignorespaces%
- #1%
- \@finalstrut\strutbox%
- }%
- \fn@endnote%
- }%
- }%
- }
- % \end{macrocode}
- %
- % \end{macro}
- %
- % \begin{macro}{\savenotes}
- %
- % The |\savenotes| declaration starts saving footnotes, to be spewed at a
- % later date. We'll also remember which counter we're meant to use, and
- % redefine the footnotes used by minipages.
- %
- % The idea here is that we'll gather up footnotes within the environment,
- % and output them in whatever format they were being typeset outside the
- % environment.
- %
- % I'll take this a bit at a time. The start is easy: we need a group in
- % which to keep our local definitions.
- %
- % \begin{macrocode}
- \def\savenotes{%
- \begingroup%
- % \end{macrocode}
- %
- % Now, if I'm already saving footnotes away, I won't bother doing anything
- % here. Otherwise I need to start hacking, and set the switch.
- %
- % \begin{macrocode}
- \if@savingnotes\else%
- \@savingnotestrue%
- % \end{macrocode}
- %
- % I redefine the |\@footnotetext| command, which is responsible for adding
- % a footnote to the appropriate insert. I'll redefine both the current
- % version, and \env{minipage}'s specific version, in case there's a nested
- % minipage.
- %
- % \begin{macrocode}
- \let\@footnotetext\fn@fntext%
- \let\@mpfootnotetext\fn@fntext%
- % \end{macrocode}
- %
- % I'd better make sure my box is empty before I start, and I must set up
- % the column width so that later changes (e.g., in \env{minipage}) don't
- % upset things too much.
- %
- % \begin{macrocode}
- \fn@width\columnwidth%
- \let\fn@colwidth\fn@width%
- \global\setbox\fn@notes\box\voidb@x%
- % \end{macrocode}
- %
- % Now for some yuckiness. I want to ensure that \env{minipage} doesn't
- % change how footnotes are handled once I've taken charge. I'll store the
- % current values of |\thempfn| (which typesets a footnote marker) and
- % |\@mpfn| (which contains the name of the current footnote counter).
- %
- % \begin{macrocode}
- \let\fn@thempfn\thempfn%
- \let\fn@mpfn\@mpfn%
- % \end{macrocode}
- %
- % The \env{minipage} environment provides a hook, called |\@minipagerestore|.
- % Initially it's set to |\relax|, which is unfortunately unexpandable, so if
- % I want to add code to it, I must check this possibility. I'll make it
- % |\@empty| (which expands to nothing) if it's still |\relax|. Then I'll
- % add my code to the hook, to override |\thempfn| and |\@mpfn| set up by
- % \env{minipage}.
- %
- % Note that I can't just force the |mpfootnote| counter to be equal to
- % the |footnote| one, because \env{minipage} clears |\c@mpfootnote| to zero
- % when it starts. This method will ensure that even so, the current counter
- % works OK.
- %
- % \begin{macrocode}
- \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi%
- \expandafter\def\expandafter\@minipagerestore\expandafter{%
- \@minipagerestore%
- \let\thempfn\fn@thempfn%
- \let\@mpfn\fn@mpfn%
- }%
- \fi%
- }
- % \end{macrocode}
- %
- % \end{macro}
- %
- % \begin{macro}{\spewnotes}
- %
- % Now I can spew out the notes we saved. This is a bit messy, actually.
- % Since the standard |\@footnotetext| implementation tries to insert funny
- % struts and things, I must be a bit careful. I'll disable all this bits
- % which start paragraphs prematurely.
- %
- % \begin{macrocode}
- \def\spewnotes{%
- \endgroup%
- \if@savingnotes\else\ifvoid\fn@notes\else\begingroup%
- \let\@makefntext\@empty%
- \let\@finalstrut\@gobble%
- \let\rule\@gobbletwo%
- \@footnotetext{\unvbox\fn@notes}%
- \endgroup\fi\fi%
- }
- % \end{macrocode}
- %
- % \end{macro}
- %
- % Now make an environment, for users.
- %
- % \begin{macrocode}
- \let\endsavenotes\spewnotes
- % \end{macrocode}
- %
- % That's all that needs to be in the shared code section.
- %
- % \begin{macrocode}
- %</macro|package>
- %<*package>
- % \end{macrocode}
- %
- %
- % \subsection{The \env{footnote} environment}
- %
- % Since |\footnote| is a command with an argument, things like \env{verbatim}
- % are unwelcome in it. Every so often someone on |comp.text.tex| moans
- % about it and I post a nasty hack to make it work. However, as a more
- % permanent and `official' solution, here's an environment which does the
- % job rather better. Lots of this is based on code from my latest attempt
- % on the newsgroup.
- %
- % I'll work on this in a funny order, although I think it's easier to
- % understand. First, I'll do some macros for reading the optional argument
- % of footnote-related commands.
- %
- % \begin{macro}{\fn@getmark}
- %
- % Saying \syntax{"\\fn@getmark{"<default-code>"}{"<cont-code>"}"} will read
- % an optional argument giving a value for the footnote counter; if the
- % argument isn't there, the \<default-code> is executed, and it's expected
- % to set up the appropriate counter to the current value. The footnote
- % marker text is stored in the macro |\@thefnmark|, as is conventional for
- % \LaTeX's footnote handling macros. Once this is done properly, the
- % \<cont-code> is called to continue handling things.
- %
- % Since the handling of the optional argument plays with the footnote
- % counter locally, I'll start a group right now to save some code. Then I'll
- % decide what to do based on the presence of the argument.
- %
- % \begin{macrocode}
- \def\fn@getmark#1#2{%
- \begingroup%
- \@ifnextchar[%
- {\fn@getmark@i{#1}}%
- {#1\fn@getmark@ii{#2}}%
- }
- % \end{macrocode}
- %
- % There's an optional argument, so I need to read it and assign it to the
- % footnote counter.
- %
- % \begin{macrocode}
- \def\fn@getmark@i#1[#2]{%
- \csname c@\@mpfn\endcsname#2%
- \fn@getmark@ii%
- }
- % \end{macrocode}
- %
- % Finally, set up the macro properly, and end the group.
- %
- % \begin{macrocode}
- \def\fn@getmark@ii#1{%
- \unrestored@protected@xdef\@thefnmark{\thempfn}%
- \endgroup%
- #1%
- }
- % \end{macrocode}
- %
- % \end{macro}
- %
- % From argument reading, I'll move on to footnote typesetting.
- %
- % \begin{macro}{\fn@startfntext}
- %
- % The |\fn@startfntext| macro sets everything up for building the footnote
- % in a box register, ready for unboxing into the footnotes insert. The
- % |\fn@prefntext| macro is a style hook I'll set up later.
- %
- % \begin{macrocode}
- \def\fn@startfntext{%
- \setbox\z@\vbox\bgroup%
- \fn@startnote%
- \fn@prefntext%
- \rule\z@\footnotesep%
- \ignorespaces%
- }
- % \end{macrocode}
- %
- % \end{macro}
- %
- % \begin{macro}{\fn@endfntext}
- %
- % Now I'll end the vbox, and add it to the footnote insertion. Again, I
- % must be careful to prevent |\@footnotetext| from adding horizontal mode
- % things in bad places.
- %
- % \begin{macrocode}
- \def\fn@endfntext{%
- \@finalstrut\strutbox%
- \fn@postfntext%
- \egroup%
- \begingroup%
- \let\@makefntext\@empty%
- \let\@finalstrut\@gobble%
- \let\rule\@gobbletwo%
- \@footnotetext{\unvbox\z@}%
- \endgroup%
- }
- % \end{macrocode}
- %
- % \end{macro}
- %
- % \begin{environment}{footnote}
- %
- % I can now start on the environment proper. First I'll look for an
- % optional argument.
- %
- % \begin{listing}
- %\def\footnote{%
- % \end{listing}
- %
- % Oh. I've already come up against the first problem: that name's already
- % used. I'd better save the original version.
- %
- % \begin{macrocode}
- \let\fn@latex@@footnote\footnote
- % \end{macrocode}
- %
- % The best way I can think of for seeing if I'm in an environment is to
- % look at |\@currenvir|. I'll need something to compare with, then.
- %
- % \begin{macrocode}
- \def\fn@footnote{footnote}
- % \end{macrocode}
- %
- % Now to start properly. |;-)|
- %
- % \begin{macrocode}
- \def\footnote{%
- \ifx\@currenvir\fn@footnote%
- \expandafter\@firstoftwo%
- \else%
- \expandafter\@secondoftwo%
- \fi%
- {\fn@getmark{\stepcounter\@mpfn}%
- {\leavevmode\unskip\@footnotemark\fn@startfntext}}%
- {\fn@latex@@footnote}%
- }
- % \end{macrocode}
- %
- % Ending the environment is simple.
- %
- % \begin{macrocode}
- \let\endfootnote\fn@endfntext
- % \end{macrocode}
- %
- % \end{environment}
- %
- % \begin{environment}{footnotetext}
- %
- % I'll do the same magic as before for |\footnotetext|.
- %
- % \begin{macrocode}
- \def\fn@footnotetext{footnotetext}
- \let\fn@latex@@footnotetext\footnotetext
- \def\footnotetext{%
- \ifx\@currenvir\fn@footnotetext%
- \expandafter\@firstoftwo%
- \else%
- \expandafter\@secondoftwo%
- \fi%
- {\fn@getmark{}\fn@startfntext}%
- {\fn@latex@@footnotetext}%
- }
- \let\endfootnotetext\endfootnote
- % \end{macrocode}
- %
- % \end{environment}
- %
- % \begin{macro}{\fn@prefntext}
- % \begin{macro}{\fn@postfntext}
- %
- % Now for one final problem. The style hook for footnotes is the command
- % |\@makefntext|, which takes the footnote text as its argument. Clearly
- % this is utterly unsuitable, so I need to split it into two bits, where
- % the argument is. This is very tricky, and doesn't deserve to work,
- % although it appears to be a good deal more effective than it has any right
- % to be.
- %
- % \begin{macrocode}
- \long\def\@tempa#1\@@#2\@@@{\def\fn@prefntext{#1}\def\fn@postfntext{#2}}
- \expandafter\@tempa\@makefntext\@@\@@@
- % \end{macrocode}
- %
- % \end{macro}
- % \end{macro}
- %
- %
- % \subsection{Hacking existing environments}
- %
- % Some existing \LaTeX\ environments ought to have footnote handling but
- % don't. Now's our chance.
- %
- % \begin{macro}{\makesavenoteenv}
- %
- % The |\makesavenoteenv| command makes an environment save footnotes around
- % itself.
- %
- % It would also be nice to make |\parbox| work with footnotes. I'll do this
- % later.
- %
- % \begin{macrocode}
- \def\makesavenoteenv{\@ifnextchar[\fn@msne@ii\fn@msne@i}
- % \end{macrocode}
- %
- % We're meant to redefine the environment. We'll copy it (using |\let|) to
- % a magic name, and then pass it on to stage~2.
- %
- % \begin{macrocode}
- \def\fn@msne@i#1{%
- \expandafter\let\csname msne$#1\expandafter\endcsname%
- \csname #1\endcsname%
- \expandafter\let\csname endmsne$#1\expandafter\endcsname%
- \csname end#1\endcsname%
- \fn@msne@ii[#1]{msne$#1}%
- }
- % \end{macrocode}
- %
- % Now we'll define the new environment. The start is really easy, since we
- % just need to insert a |\savenotes|. The end is more complex, since we
- % need to preserve the |\if@endpe| flag so that |\end| can pick it up. I
- % reckon that proper hooks should be added to |\begin| and |\end| so that
- % environments can define things to be done outside the main group as
- % well as within it; still, we can't all have what we want, can we?
- %
- % \begin{macrocode}
- \def\fn@msne@ii[#1]#2{%
- \expandafter\edef\csname#1\endcsname{%
- \noexpand\savenotes%
- \expandafter\noexpand\csname#2\endcsname%
- }%
- \expandafter\edef\csname end#1\endcsname{%
- \expandafter\noexpand\csname end#2\endcsname%
- \noexpand\expandafter%
- \noexpand\spewnotes%
- \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi%
- }%
- }
- % \end{macrocode}
- %
- % \end{macro}
- %
- % \begin{environment}{minipage*}
- %
- % Let's define a \env{minipage$*$} environment which handles footnotes
- % nicely. Really easy:
- %
- % \begin{macrocode}
- \makesavenoteenv[minipage*]{minipage}
- % \end{macrocode}
- %
- % \end{environment}
- %
- % \begin{macro}{\parbox}
- %
- % Now to alter |\parbox| slightly, so that it handles footnotes properly.
- % I'm going to do this fairly inefficiently, because I'm going to try and
- % change it as little as possible.
- %
- % First, I'll save the old |\parbox| command. If I don't find a \lit{*},
- % I'll just call this command.
- %
- % \begin{macrocode}
- \let\fn@parbox\parbox
- % \end{macrocode}
- %
- % This is the clever bit: I don't know how many optional arguments
- % Mr~Mittelbach and his chums will add to |\parbox|, so I'll handle any
- % number. I'll store them all up in my first argument and call myself
- % every time I find a new one. If I run out of optional arguments,
- % I'll call the original |\parbox| command, surrounding it with |\savenotes|
- % and |\spewnotes|.
- %
- % \begin{macrocode}
- \def\parbox{\@ifnextchar[{\fn@parbox@i{}}{\fn@parbox@ii{}}}
- \def\fn@parbox@i#1[#2]{%
- \@ifnextchar[{\fn@parbox@i{#1[#2]}}{\fn@parbox@ii{#1[#2]}}%
- }
- \long\def\fn@parbox@ii#1#2#3{\savenotes\fn@parbox#1{#2}{#3}\spewnotes}
- % \end{macrocode}
- %
- % \end{macro}
- %
- % Done!
- %
- % \begin{macrocode}
- %</package>
- % \end{macrocode}
- %
- % \hfill Mark Wooding, \today
- %
- % \Finale
- %
- \endinput
|