From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/footmisx/README | 3 + macros/latex/contrib/footmisx/footmisx.dtx | 2385 ++++++++++++++++++++++++++++ macros/latex/contrib/footmisx/footmisx.ins | 45 + 3 files changed, 2433 insertions(+) create mode 100644 macros/latex/contrib/footmisx/README create mode 100644 macros/latex/contrib/footmisx/footmisx.dtx create mode 100644 macros/latex/contrib/footmisx/footmisx.ins (limited to 'macros/latex/contrib/footmisx') diff --git a/macros/latex/contrib/footmisx/README b/macros/latex/contrib/footmisx/README new file mode 100644 index 0000000000..eba584341e --- /dev/null +++ b/macros/latex/contrib/footmisx/README @@ -0,0 +1,3 @@ +This package is based on Robin Fairbairns footmisc package + +It allow to personnalize footnote on LaTeX diff --git a/macros/latex/contrib/footmisx/footmisx.dtx b/macros/latex/contrib/footmisx/footmisx.dtx new file mode 100644 index 0000000000..45e41b5f68 --- /dev/null +++ b/macros/latex/contrib/footmisx/footmisx.dtx @@ -0,0 +1,2385 @@ +%\iffalse meta-comment, etc. +%% This is footmisx.dtx, and it's -*-LaTeX-*- text +% +% We use the same body for the \cs{ProvidesFile} as for the +% \cs{ProvidesPackage} command. +% +% \begin{macrocode} +%<*!debugins> +\NeedsTeXFormat{LaTeX2e} +% +%<*dtx> +\ProvidesFile{footmisx.dtx}% +% +%\ProvidesPackage{footmisx}% +%<*!debugins> + [2016/12/01 20161201 +% +% a miscellany of footnote facilities% +%<*dtx> + footmisx package source file% +% +%<*!debugins> + ] +% +% \end{macrocode} +% +% Code to enable LaTeX processing of the file without the intervention +% of a driver file. +% \begin{macrocode} +%<*driver> +\setcounter{errorcontextlines}{999} +\documentclass{ltxdoc} +% \end{macrocode} +% +% we limit the things that we will index +% \begin{macrocode} +\DoNotIndex{\#,\@MM,\@cclv,\@gobble,\@ifnextchar,\@ifundefined} +\DoNotIndex{\|,\advance,\begingroup,\bgroup,\box,\csname} +\DoNotIndex{\dagger,\ddagger,\def,\divide,\dp} +\DoNotIndex{\edef,\egroup,\ifx,\else,\fi,\endcsname,\endgroup,\end} +\DoNotIndex{\endinput,\ensuremath,\expandafter} +\DoNotIndex{\gdef,\global,\hbox,\hskip,\hss,\ht} +\DoNotIndex{\ifcase,\or,\ifdim,\ifhbox,\ifhmode,\ifnum,\ifvbox, + \fi ,\fi ,\fi ,\fi ,\fi ,\fi } +\DoNotIndex{\ifvoid,\fi,\kern,\let,\long,\loop} +\DoNotIndex{\MessageBreak,\newbox,\newcommand,\newcounter} +\DoNotIndex{\newdimen,\newif,\newskip,\newtoks,\noexpand} +\DoNotIndex{\P,\p@,\par,\penalty,\protect,\providecommand} +\DoNotIndex{\relax,\renewcommand,\S,\setbox,\setcounter} +\DoNotIndex{\skip,\space,\the,\typeout,\vbox,\vskip} +\DoNotIndex{\wd,\xdef,\@} +\GetFileInfo{footmisx.dtx} +\EnableCrossrefs +% to get documented source of the package, comment out the next line, +% and uncomment the following one; otherwise, create yourself +% (somewhere on your LaTeX input path) a file ltxdoc.cfg that contains +% simply \AtBeginDocument{\AlsoImplementation} +%\OnlyDescription +\AlsoImplementation +\setcounter{StandardModuleDepth}{1} +\begin{document} +\DocInput{footmisx.dtx} +\end{document} +% +% \end{macrocode} +% \fi +% +% +% +% \title{\texttt{footmisx} ---\\ +% a portmanteau package\\ +% for customising footnotes in \LaTeX\thanks{This file has +% version number \fileversion, last revised \filedate}} +% \author{Bastien Roucari\`es formerly + Robin Fairbairns\thanks{University of Cambridge Computer +% Laboratory, William Gates Building, J.\,J. Thompson Avenue, +% Cambridge, CB2 0FD, UK +% (\texttt{rf10cam.ac.uk})}} +% \maketitle +% +% \section*{Copyright statement} +% +% \noindent Program: \texttt{footmisx.dtx}\par +% \noindent Copyright 1995 1996 1998 1999 2001--2003 2008 2009 Robin Fairbairns +% \noindent Copyright 2016 Bastien Roucari\`es +% +% This program is offered under the terms +% of the LaTeX Project Public License, 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 work has the LPPL maintenance status `author-maintained'. +% +% \section*{History} +% +% This package is based of Robin Fairbairns footmisc package. +% +% This package originated as support of a personal project, which Robin +% was switching to \LaTeX{} 2e over the Christmas holiday period of +% 1993, using the first \ensuremath{\beta} release. +% +% In its first form, it was known as the ``footnote'' package, but by +% the time I had released it to CTAN, that name had already been +% used by a package written by Mark Wooding. So the package is now +% known (as you can see) as ``footmisc''. +% +% In 2016 it was forked as footmisx +% +% \section{User interface~--- package options} +% +% The \textsf{footmisx} package provides several different +% customisations of the way foonotes are represented in \LaTeXe{} +% documents (the sources of the code in this package are various, but +% all of it has been massaged by the author; where the code comes from +% elsewhere, there are attributions given below, somewhere or other). +% +% The interface to the +% package's options is mostly rather simple~--- each one is presented as an +% option in the |\usepackage| command, and for most, nothing else +% needs to be done. For example, to use a useful +% and consistent set, the author invokes the package with the +% command |\usepackage[perpage,para,symbol*]{footmisx}|. +% +% For a small number of options, there are additional parameters +% available; these are described in the subsections below. +% +% \subsection{Option \texttt{perpage}} +% \label{sec:perpagedoc} +% +% This option resets footnote numbering for each page of the document. +% It needs at least two passes to do this correctly (though it comes +% as close as possible on the first pass). You generally have to make +% two passes with \LaTeX{} anyway, to get the cross-references right, +% so an additional pass for this purpose shouldn't cause any +% additional problem. The option includes code to report that +% `\emph{Label(s) may have changed}', which will help the poor user to +% realise that (yet) another run is in order. +% +% \subsection{Option \texttt{para}} +% +% This option (derived from code by Dominik Wujastyk and Chris Rowley) +% causes footnotes to be typeset as a single paragraph at the bottom +% of the page on which they occur. In the case that there is only one +% footnote on the page, no effect will be observed. However, if there +% are several footnotes on the page, they will be run together in the +% page foot, each introduced by its footnote mark. The original +% demand for the option came from the needs of those preparing +% critical editions; such documents typically have large numbers of +% small footnotes, which look ridiculous if each is typeset in a +% paragraph of its own; in most other disciplines, such multiplicities +% of footnotes represent mere self-indulgence: the author of this +% package is disgracefully guilty of this. +% +% Please note that ``old'' \LaTeX{} installations may have problems +% with the algorithm for \texttt{para} footnotes on very wide pages +% (for example, those used by the \textsf{a0poster} class). Recent +% \LaTeX{} installations use an improved technique that is believed +% not to be susceptible to this problem. +% +% \subsection{Option \texttt{side}} +% +% This option (suggested by Frank Mittelbach) causes footnotes to be +% typeset using the \cs{marginpar} command: this has the advantage +% that the note appears close to its ``call-up'', but has all the +% disadvantages associated with the \cs{marginpar} command (which +% consumes `float' slots, and doesn't always place itself correctly at +% the top of pages in two-sided documents). Since the measure in +% which the footnote is to be typeset is likely to be pretty narrow, +% users of the \texttt{side} option are recommended also to use the +% \texttt{ragged} option, to avoid ugly spacing and line breaks. +% +% There is a further problem (apart from the occasional failure to +% place the marginal note on the correct side of the page) in +% two-sided documents: one would like `raggedness' to appear +% differently in different margins (setting the left, rather than the +% right, side ragged in the left margin). (The author would welcome +% suggestions on means of addressing the problem.) +% +% \subsection{Option \texttt{ragged} and \cs{footnotelayout}} +% +% The package provides facilities for ragged right setting of +% footnotes (so long as the \texttt{para} option isn't in effect). +% The change is effected by use of the command \cs{footnotelayout}; +% the package inserts this command into the start of the argument of +% \cs{footnotetext} (in effect: \cs{footnote} works, roughly, by +% calling the guts of \cs{footnotetext} at its end). +% +% If you want to use some special effect other than ragged right, feel +% free to change \cs{footnotelayout} yourself: some intriguing (and +% completely undesirable) results are no doubt available. Change the +% setting simply by use of +% \cs{renewcommand}\cs{footnotelayout}\texttt{\dots}\@. The +% \texttt{ragged} option simply sets \cs{footnotelayout} to set +% \cs{raggedright} or \cs{RaggedRight} as appropriate. (If you intend +% to use the \textsf{ragged2e} package, load it before +% \textsf{footmisx}~--- if \textsf{footmisx} finds \cs{RaggedRight} is +% available, it automatically uses it in place of \cs{raggedright}.) +% +% \subsection{Option \texttt{symbol}} +% +% This option simply establishes that footnotes are `labelled' by +% a symbol sequence. The command used is equivalent to that +% suggested in \LaTeX{} manuals such as Lamport's (the job performed +% by the option is very simple, and doesn't really need a package). +% +% Using symbols to `number' your footnotes can be problematic: there +% is a limited number of symbols, and \LaTeX{} will report an error if +% your footnotes exceed that limit. To avoid such problems, consider +% the \texttt{symbol*} option, or the \cs{setfnsymbol} command (see +% the next two sections), or number your footnotes by the page (see +% section~\ref{sec:perpagedoc}). +% +% \subsection{Option \texttt{symbol*}} +% \label{doc-symbol*} +% +% This is the \texttt{symbol} option, but with protection against the +% tedium that arises because of the instability of the +% \texttt{perpage} option. When executing the \texttt{perpage} +% option, the package often allocates footnotes to the wrong pages, +% only to correct itself on a later run (having warned the user of the +% need for the later run with a `\emph{Label(s) may have changed}' +% message). In these circumstances the \texttt{symbol} option is +% prone to producing \LaTeX{} errors, which stop processing, and +% confound automatic generation procedures. In the same situation, +% the \texttt{symbol*} option produces information messages and a +% warning message at end document, and the user may scan the log for +% those messages \emph{after} processing has stabilised. The option +% produces numbers (17 and higher, in the case of the default symbol +% set) in place of symbols, when the footnote number is too large. +% +% \subsection{The \cs{setfnsymbol} and \cs{DefineFNsymbols} commands} +% \label{footnote-symbols} +% +% These commands permit the definition and use of alternative +% (ordered) sets of symbols for numbering footnotes. \LaTeX{} of +% course comes with such a set ready-defined, but the choice of +% symbols isn't universally loved. +% +% You may define a set of symbols with the \cs{DefineFNsymbols} +% command. \LaTeX{}'s default set would be defined by the command: +% \begin{center} +% \verb|\DefineFNsymbols*{lamport}|% +% \unskip\verb|{*\dagger\ddagger\S\P|\texttt{\char`\\\char`\|\%}\\ +% \unskip\verb| {**}{\dagger\dagger}{\ddagger\ddagger}}| +% \end{center} +% Defined this way, the symbol set produces a ``counter too large'' +% error; a robust version of the set (cf.~the \texttt{symbol*} option +% (see \ref{doc-symbol*}) using the \cs{DefineFNsymbols} command +% without the optional |*|. +% You may select a set of symbols by use of the \cs{setfnsymbol} +% command; so to restore use of the default set, you would type: +% \begin{center} +% \verb|\setfnsymbol{lamport}| +% \end{center} +% +% This package defines a small selection of alternative sets of +% symbols, using \cs{DefineFNsymbol}: +% \begin{center} +% \begin{tabular}{ll} +% \texttt{bringhurst} & $*\,\dagger\,\ddagger\,\S\,\|\,\P$ \\ +% \texttt{chicago} & $*\,\dagger\,\ddagger\,\S\,\|\,\#$ \\ +% \texttt{wiley} & $*\,\mathop{**}\,\dagger\,\ddagger\,\S\,\P\,\|$ +% \end{tabular} +% \end{center} +% together with a version of Lamport's original set that, with doubled +% versions of $\S$ and $\P$, and tripled versions of everything but +% the vertical bars, provides a symbol range to cover counters up to +% 16. +% +% This last set, known as \texttt{lamport*} is selected as the default +% symbol set by the package. +% +% \subsection{Option \texttt{bottom}} +% +% This option forces footnotes to the bottom of the page; this is only +% noticeably useful in case that \cs{raggedbottom} is in effect, when +% \LaTeX{} would normally set the footnotes a mere +% \cs{skip}\cs{footins} distant from the bottom of the text. +% +% There's a further infelicity in \LaTeX{}'s placing of footnotes of +% the bottom of pages: if a bottom float appears on a page, \LaTeX{} +% places the footnote \emph{above} it. The \texttt{bottom} option +% places the footnote at the foot of the page. +% +% \subsection{Option \texttt{marginal}} +% +% This option adjusts the position of footnote mark relative to the +% start of the line in which they appear (the the option is +% incompatible with option \texttt{para}, for obvious reasons). +% +% When this option is in effect, the footnote is set +% \cs{footnotemargin} relative to the left margin of the page; the +% default setting for \cs{footnotemargin} is -0.8em, which means that +% the footnote mark will be set jutting 0.8em into the margin. If +% \cs{footnotemargin} is a positive length, the footnote mark will be +% set with its right edge \cs{footnotemargin} from the margin. (In +% the absence of the option, \cs{footnotemargin} is set to 1.8em; you +% may change that value with a \cs{setlength} command.) +% +% \subsection{Option \texttt{flushmargin}} +% +% This option is as option marginal, but sets the footnote marker +% flush with, but just inside the margin from, the text of the +% footnote. +% +% \subsection{Option \texttt{hang}} +% +% This option sets the footnote mark flush with the margin, and makes +% the body of the footnote hang at an indentation of +% \cs{footnotemargin} (if that is a positive distance), or the width +% of the marker (if \cs{footnotemargin}$\leq0$). The option code +% itself leaves \cs{footnotemargin} at its default value of 1.8em. +% +% The footnote itself may of course be longer than one paragraph; if +% so, the paragraphs will be separated by the vertical space specified +% by \cs{hangfootparskip}, and the second and subsequent paragraphs +% are indented by \cs{hangfootparindent}. Default values are: +% \begin{center} +% \begin{tabular}{ll} +% \cs{hangfootparskip} & 0.5\cs{baselineskip} \\ +% \cs{hangfootparindent} & 0em +% \end{tabular} +% \end{center} +% The user may redefine these values (using +% \cs{renewcommand}): it is best to use the font-size-dependent +% measures (multiples of \cs{baselineskip} for the skip, multiples of +% |em| for the indent). Note that the default has only one of the two +% values non-zero; both zero may result in easily-missed paragraph +% breaks, and both non-zero is not generally thought to be a +% good-looking option. +% +% \subsection{Option \texttt{norule}} +% +% This option suppresses the `normal' footnote rule, and advances +% \cs{skip}\cs{footins} a bit to compensate +% +% \subsection{Option \texttt{splitrule}} +% +% This option makes puts a full-width rule above the split-off part of +% a split footnote. (Remember that split footnotes don't happen if +% you're doing paragraph footnotes.) +% +% The option provides three different \cs{footnoterule} commands: +% \begin{center} +% \begin{tabular}{ll} +% \cs{mpfootnoterule} & for use in minipages \\ +% \cs{pagefootnoterule} & for normal footnotes on regular pages \\ +% \cs{splitfootnoterule} & for the tail of a split footnote +% \end{tabular} +% \end{center} +% By default, \cs{mpfootnoterule} and \cs{pagefootnoterule} retain the +% original definition of \cs{footnoterule} (which nay have been +% modified by a \texttt{norule} option), while \cs{splitfootnoterule} +% becomes a full-width rule. +% +% \subsection{The \texttt{stable} option} +% +% This option deals with the problem of placing footnotes in section +% titles (and so on). While there is (sometimes, just) justification +% for putting footnotes in titles, \LaTeX's treatment of the content +% of titles militates against them. Of course, the title argument is +% ordinarily a moving one, and \cs{footnote} is a fragile command, but +% the real problem comes from the way the argument actually moves~--- +% which is to two places. The argument moves to the table of +% contents, where the footnote will (at least) look odd. But the +% argument also moves to the marks that make up page headers, etc., +% and \emph{there} it creates havoc, since page headers are executed +% in page make-up, and page make-up \emph{must not} create footnotes. +% +% If you use the \texttt{stable} option, the footnote won't move to +% the table of contents or the page headers, but it will be typeset +% correctly within the title itself. +% +% The situation with \cs{footnotemark} is less dire (it could in +% principle appear in page headers, for example); footnote marks +% appearing on pages other than where their text appears are none the +% less confusing, and the stable option treats \cs{footnotemark} in +% the same way that it treats \cs{footnote}. +% +% \subsection{The \texttt{multiple} option} +% +% This option deals with the case where the author needs to type +% things like +% \begin{verbatim} +% mumble\footnote{blah}\footnote{grumble} +% \end{verbatim} +% Without special treatment, \LaTeX{} would output something like +% \begin{quote} +% mumble\textsuperscript{1314} +% \end{quote} +% \noindent What the \texttt{multiple} option makes of the above is +% \begin{quote} +% mumble\textsuperscript{13,14} +% \end{quote} +% which is what most people would expect. The comma separator +% actually derives from the definition of \cs{multfootsep}, which +% may be changed by \cs{renewcommand} if the option is in effect. +% +% The option also treats \cs{footnotemark} in the same way. +% +% \subsection{User interface~--- miscellaneous commands} +% +% The package also defines some miscellaneous footnote-related +% commands. The present group provides alternative means of producing +% footnote marks: \cs{footref} and \cs{mpfootnotemark}. +% +% When you're in a minipage, \cs{footnote} numbers run according to the +% minipage's own footnote counter, and the marks are set in italic +% letters. However, the numbers used by \cs{footnotemark} make +% reference to the `main' +% footnote counter, and are set in whatever is the current style for +% that: this behaviour often surprises, and there's no obvious way in +% standard \LaTeX{} to ``get around'' it. The command +% \cs{mpfootnotemark} gets around this problem in a minipage, by +% generating footnote marks in the same way as those used by +% \cs{footnote}. +% +% In fact, making reference to footnotes in +% general can be problematic: it can be done by noting down the +% value of the footnote +% marker in a counter (or the like) and then using the value in a +% subsequent \cs{footnotemark} or \cs{mpfootnotemark}. This is a +% tedious way of going about things, and doesn't allow representation +% of all possible forms of footnote mark; \cs{footref} is a form of +% reference command that sets the reference as if it were a footnote. +% The label should be set \emph{within} the argument of the footnote +% command that is being labelled: +% \begin{verbatim} +% ...\footnote{Note text\label{fnlabel}} +% ... +% ... potato head\footref{fnlabel} +% \end{verbatim} +% +% \section{User interface~--- interactions with other packages} +% +% The \textsf{footmisx} package modifies several parts of the \LaTeX{} +% kernel; what gets modified depends on the options you select. This +% behaviour can cause problems with other packages, particularly those +% that also modify the kernel. +% +% Known interactions are: +% \begin{description} +% \item[\normalfont\textsf{setspace}] The \textsf{setspace} package +% modifies the way line spacing is calculated in footnotes. +% \textsf{footmisx} knows about this, and preserves the change. +% However, you \emph{must} load \textsf{setspace} \emph{before} +% \textsf{footmisx}. +% \item[\normalfont\textsf{memoir} class] The class emulates +% \textsf{setspace}, and we detect that emulation and deal with it +% in the same way as \textsf{setspace}. +% \item[\normalfont\textsf{hyperref}] The \textsf{hyperref} package +% has ambitions to make hyperlinks from footnote marks to the +% corresponding footnote body; \textsf{footmisx} knows about this, +% and preserves hyperlink. +% However, you \emph{must} load \textsf{setspace} \emph{before} +% \textsf{footmisx}. +% \item[\normalfont\textsf{manyfoot}] The \textsf{manyfoot} package +% permits several independent sequences of footnotes. Some +% preliminary work towards interworking with \textsf{footmisx} has +% been completed, but more remains to be done at the time of +% writing. +% \end{description} +% +% \StopEventually{} +% +% \section{Code: Preliminaries} +% +% Well~--- here we go: let's make the package file: +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% Now declare what environment we need: +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1994/12/01] +% \end{macrocode} +% +% We need a token register in case we have to patch \cs{@makecol}: +% \begin{macrocode} +\newtoks\FN@temptoken +% \end{macrocode} +% +% \begin{macro}{\protected@writeaux} +% This command is defined for future compatibility with Matt Swift's +% \textsf{newclude} package (still, after all this time, not out of +% beta status). +% \begin{macrocode} +\providecommand\protected@writeaux{% + \protected@write\@auxout +}% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@advance@macro} +% \begin{macro}{@@dvance@macro} +% \begin{macro}{\@advance@macro} +% We make the following (\cs{@@dvance@macro}) generalisable as follows +% (the global form isn't used in this package \dots\ yet): +% +% \begin{macrocode} +\def\l@advance@macro{\@@dvance@macro\edef} +\def\@@dvance@macro#1#2#3{\expandafter\@tempcnta#2\relax + \advance\@tempcnta#3\relax + #1#2{\the\@tempcnta}% +} +% \end{macrocode} +% +% Now we define a jolly little macro to advance a macro count (|#1|) +% by a given amount (|#2|). +% \begin{macrocode} +\let\@advance@macro\l@advance@macro +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifFN@etex} +% Check whether we're using etex +% \begin{macrocode} +\newif\ifFN@etex +\ifx\dimexpr\undefined + \FN@etexfalse +\else + \FN@etextrue +\fi +% \end{macrocode} +% \end{macro} +% \begin{macro}{\footnotemargin} +% Finally, we define the length used by the \texttt{marginal} option, +% and initialise it as if we've not had the option. +% \begin{macrocode} +\newdimen\footnotemargin +\footnotemargin1.8em\relax +% \end{macrocode} +% \end{macro} +% +% \section{Package options} +% +% Most of the code of the package is contained within the option +% processing, one way or another (that which isn't, is executed after +% \cs{ProcessOptions} as a result of flags set in the option +% processing). +% +% \subsection{The \texttt{symbol} option} +% +% This is a declaration that appears in the original \LaTeX{} book. +% Since it appeared in the old |pagefoots.sty| (presumably since it +% goes so naturally with the |perpage| option), I've added this +% trivial piece of customisation to the package. +% +% \begin{macrocode} +\DeclareOption{symbol}{\renewcommand\thefootnote{\fnsymbol{footnote}}} +% \end{macrocode} +% +% \subsection{The \texttt{symbol*} option} +% +% The robust version of the \texttt{symbol} option: if the current +% `symbol' option doesn't provide enough variants, use arabic footnote +% number. We use a robust version of the ``extended ordinary'' symbol set, +% described later (in section~\ref{footnote-symbols}). +% \begin{macrocode} +\DeclareOption{symbol*}{% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \AtEndOfPackage{\setfnsymbol{lamport*-robust}}% +} +% \end{macrocode} +% +% \subsection{The \texttt{para} option} +% +% The basis of the code for this option comes from \TeX{}book, p.398 +% ff.~(``Dirty Tricks''), though it does (of course) avoid +% redefining |\\| which has some other (somewhat significant) uses in +% \LaTeX{}! The user should be aware of +% Knuth's note on the limitations of this method of doing the job: the +% \TeX{} stack is used four times per footnote, and the stack is +% limited (see the \TeX{}book, p.300 ff.). If you have very large +% numbers of footnotes (in the hundreds), and encounter the error +% ``|! TeX capacity exceeded, sorry (... save size ...)|'', you may +% need to break your text into smaller sections and compile the +% separately. Fortunately (say the comments on the original +% |fnpara.sty|) this is very easy to do with \LaTeX{}, provided that +% you reset the footnote counter to make the joins seamless. +% +% \begin{macro}{\ifFN@para} +% Define the |para| option: now simply sets a marker for use later +% when defining the option's auxiliary code and when patching the +% output routine and so on. +% \begin{macrocode} +\newif\ifFN@para \FN@parafalse +\DeclareOption{para}{\ifFN@sidefn + \PackageError{footmisx}{Option "\CurrentOption" incompatible with + option "side"}% + {I shall ignore "\CurrentOption"}% + \else + \FN@paratrue + \fi +} +% \end{macrocode} +% \end{macro} +% +% \subsection{The \texttt{side} option} +% +% \begin{macro}{\ifFN@sidefn} +% Simply changes the behaviour of \cs{@footnotetext}; incompatible +% with paragraph footnotes. +% \begin{macrocode} +\newif\ifFN@sidefn \FN@sidefnfalse +\DeclareOption{side}{\ifFN@para + \PackageError{footmisx}{Option "\CurrentOption" incompatible with + option "para"}% + {I shall ignore "\CurrentOption"}% + \else + \FN@sidefntrue + \fi +} +% \end{macrocode} +% \end{macro} +% +% \subsection{The \texttt{ragged} option} +% +% \begin{macro}{\footnotelayout} +% A very simple option that merely changes the definition of one +% macro. Note detection of the presence of the \textsf{ragged2e} +% package. +% \begin{macrocode} +\let\footnotelayout\@empty +\DeclareOption{ragged}{% + \@ifundefined{RaggedRight}% + {\renewcommand\footnotelayout{\linepenalty50 \raggedright}}% + {\renewcommand\footnotelayout{\linepenalty50 \RaggedRight}}% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{The \texttt{perpage} option} +% +% \begin{macro}{\ifFN@perpage} +% A footnote-numbering modification: a new algorithm replacing one +% from Brian T. Schellenberger, which has proved to be flawed. We +% simply set a marker here, and define code later depending on the +% state of the marker (see section \ref{sec:perpage-code}). +% \begin{macrocode} +\newif\ifFN@perpage +\FN@perpagefalse +\DeclareOption{perpage}{% + \FN@perpagetrue +} +% \end{macrocode} +% \end{macro} +% +% \subsection{The \texttt{PPdebug} option} +% +% \begin{macro}{\ifFN@pp@debug} +% Sets a flag; the messages are generated in various places throughout +% the code. The option is not available in the package as +% distributed: modify the |.ins| file to generate a version of the +% package that includes the option, if you feel you need it. +% \begin{macrocode} +%<*PPdebug> +\newif\ifFN@pp@debug \FN@pp@debugfalse +\DeclareOption{PPdebug}{\FN@pp@debugtrue} +% +% \end{macrocode} +% \end{macro} +% +% \subsection{The \texttt{bottom} option} +% +% \begin{macro}{\ifFN@bottom} +% All this needs to do is to set a flag to say that it should happen +% \begin{macrocode} +\newif\ifFN@bottom \FN@bottomfalse +\DeclareOption{bottom}{% + \FN@bottomtrue +} +% \end{macrocode} +% \end{macro} +% +% \subsection{The \texttt{marginal} option} +% +% Again, the processing of the option is pretty trivial: +% \begin{macrocode} +\DeclareOption{marginal}{% + \footnotemargin-0.8em\relax +} +% \end{macrocode} +% +% \subsection{The \texttt{flushmargin} option} +% +% Again, the processing of the option is pretty trivial: +% \begin{macrocode} +\DeclareOption{flushmargin}{% + \footnotemargin0pt\relax +} +% \end{macrocode} +% +% \subsection{The \texttt{hang} option} +% +% \begin{macro}{\ifFN@hangfoot} +% We need a switch, since \cs{@makefntext} needs to be patched. +% \begin{macrocode} +\newif\ifFN@hangfoot \FN@hangfootfalse +\DeclareOption{hang}{% + \FN@hangfoottrue +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\hangfootparskip} +% \begin{macro}{\hangfootparindent} +% Layout parameters for hanging footnotes; \cs{hangfootparskip} and +% \cs{hangfootparindent} are (respectively) values to use for +% \cs{parskip} and \cs{parindent} when in hanging footnotes. +% \begin{macrocode} +\newcommand*\hangfootparskip{0.5\baselineskip} +\newcommand*\hangfootparindent{0em}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{The \texttt{norule} option} +% +% Pretty simple too\dots +% +% \begin{macrocode} +\DeclareOption{norule}{% + \renewcommand\footnoterule{}% + \advance\skip\footins 4\p@\@plus2\p@\relax +} +% \end{macrocode} +% +% \subsection{The \texttt{splitrule} option} +% +% \begin{macro}{\split@prev} +% This is from a posting by Donald Arseneau dated 13 November 1996. +% The code relies on the fact that \LaTeX{} only uses inserts for +% footnotes, so that if any insert is going to be split, it's going to +% be a footnote. +% \begin{macrocode} +\DeclareOption{splitrule}{% + \gdef\split@prev{0} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pagefootnoterule} +% \begin{macro}{\mpfootnoterule} +% \begin{macro}{\splitfootnoterule} +% Define defaults for the three footnote rules: note, we inherit the +% current state of \cs{footnoterule} for the two `regular' footnote +% defaults, and if we've been preceded by option \texttt{norule}, they +% will both become null\dots +% \begin{macrocode} + \let\pagefootnoterule\footnoterule + \let\mpfootnoterule\footnoterule + \def\splitfootnoterule{\kern-3\p@ \hrule \kern2.6\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Now redefine \cs{footnoterule} to distinguish the three situations. +% \begin{macrocode} + \def\footnoterule{\relax + \ifx \@listdepth\@mplistdepth +% \end{macrocode} +% +% In a minipage +% \begin{macrocode} + \mpfootnoterule + \else + \ifnum\split@prev=\z@ +% \end{macrocode} +% +% Normal footnote on a regular page +% \begin{macrocode} + \pagefootnoterule + \else +% \end{macrocode} +% +% Second part of a split footnote +% \begin{macrocode} + \splitfootnoterule + \fi +% \end{macrocode} +% +% Remember a split for next page +% \begin{macrocode} + \xdef\split@prev{\the\insertpenalties}% + \fi + }% +} +% \end{macrocode} +% +% \begin{macro}{\ifFN@stablefootnote} +% \subsection{The \texttt{stable} option} +% +% Simply set a flag: the code of this gets executed at the very end of +% the package. +% \begin{macrocode} +\newif\ifFN@stablefootnote \FN@stablefootnotefalse +\DeclareOption{stable}{\FN@stablefootnotetrue} +% \end{macrocode} +% \end{macro} +% +% \subsection{The \texttt{multiple} option} +% +% \begin{macro}{\ifFN@multiplefootnote} +% Again, simply set a flag, for code that gets executed at the very +% very very end of the package. +% \begin{macrocode} +\newif\ifFN@multiplefootnote \FN@multiplefootnotefalse +\DeclareOption{multiple}{\FN@multiplefootnotetrue} +% \end{macrocode} +% \end{macro} +% +% \subsection{The start of the endgame} +% +% Exercise the options that the user has requested\dots +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% +% \section{Hacking kernel commands} +% +% Various standard commands (some of them internal ones) need to be +% hacked to achieve our effects, and we do all of this now, according +% to flags set in option processing. +% +% \subsection{The output routine} +% +% Now; do we need to mess about with the output routine? If either +% |para| or |bottom| has been invoked, we do. +% \begin{macrocode} +\let \if@tempswa \ifFN@bottom +\ifFN@para \@tempswatrue \fi +\if@tempswa +% \end{macrocode} +% \dots{} so we've patching to do. +% +% First, we ensure that \cs{@makecol} is as expected from the time at +% which these macros were written: since we're going to patch it, we +% had better be sure that we're patching the right thing. (There was +% a minuscule change to the definition 1999, but this doesn't as far +% as I can tell make any difference to the semantics of the definition +% we base our patch on.) +% \begin{macrocode} + \@ifl@t@r\fmtversion{2005/12/01}{% + \CheckCommand*\@makecol{\ifvoid \footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox{% + \boxmaxdepth \@maxdepth + \unvbox\@cclv + \vskip \skip\footins + \color@begingroup + \normalcolor\footnoterule + \unvbox\footins + \color@endgroup + }% + \fi + \let \@elt \relax + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht{% + \@texttop \dimen@\dp\@outputbox + \unvbox\@outputbox + \vskip -\dimen@\@textbottom + }% + \fi + \global\maxdepth\@maxdepth + } + }{% + \@ifl@t@r\fmtversion{2003/12/01}{% + \CheckCommand*\@makecol{\ifvoid \footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox{% + \boxmaxdepth\@maxdepth + \@tempdima\dp\@cclv + \unvbox\@cclv + \vskip \skip\footins + \color@begingroup + \normalcolor + \footnoterule + \unvbox\footins + \color@endgroup + }% + \fi + \let \@elt \relax + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht{% + \@texttop + \dimen@\dp\@outputbox + \unvbox\@outputbox + \vskip -\dimen@ + \@textbottom + }% + \fi + \global\maxdepth\@maxdepth + }% + }{% + \@ifl@t@r\fmtversion{1999/12/01}{% + \CheckCommand*\@makecol{\ifvoid \footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox{% + \boxmaxdepth\@maxdepth + \@tempdima\dp\@cclv + \unvbox\@cclv + \vskip \skip\footins + \color@begingroup + \normalcolor\footnoterule + \unvbox\footins + \color@endgroup + }% + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht{% + \@texttop \dimen@\dp\@outputbox + \unvbox\@outputbox + \vskip -\dimen@\@textbottom + }% + \fi + \global\maxdepth\@maxdepth + }% + }% + }{% + \CheckCommand*\@makecol{\ifvoid \footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox{% + \boxmaxdepth\@maxdepth + \unvbox\@cclv + \vskip \skip\footins + \color@begingroup + \normalcolor\footnoterule + \unvbox\footins + \color@endgroup + }% + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht{% + \@texttop \dimen@\dp\@outputbox + \unvbox\@outputbox + \vskip -\dimen@\@textbottom + }% + \fi + \global\maxdepth\@maxdepth + }% + }% +} +% \end{macrocode} +% +% If we're doing paragraph footnotes, the output routine needs +% different code to place the actual text. We prepare this code here, +% since it's potentially used in two different places. +% +% We prepare the code in a token register to be used at the +% appropriate place in the patching of \cs{@makecol}; thus it becomes +% a token register containing code to place stuff in a token register +% \begin{macrocode} + \ifFN@para +% \end{macrocode} +% +% We make a box out of the paragraph of footnotes, and then stuff the +% contents of the box into that which is going to be \cs{ship}ped +% |out|. +% \begin{macrocode} + \FN@temptoken{% + \toks@\expandafter{\the\toks@ + \vskip\skip\footins + \color@begingroup + \normalcolor\footnoterule + \global\setbox\FN@tempboxc\vbox{\makefootnoteparagraph}% + \unvbox\FN@tempboxc + \color@endgroup + }% + }% +% \end{macrocode} +% +% If we're not doing paragraph footnotes, we insert the little bit of +% code that would have been replaced by the stuff above: +% \begin{macrocode} + \else + \FN@temptoken{% + \toks@\expandafter{\the\toks@ + \vskip\skip\footins + \color@begingroup + \normalcolor\footnoterule + \unvbox\footins + \color@endgroup + }% + }% + \fi +% \end{macrocode} +% +% Now we start building up the revised version of \cs{@makecol}. The +% definition starts out in \cs{toks@}; first the \textsf{bottom} version: +% \begin{macrocode} + \ifFN@bottom + \toks@{\setbox\@outputbox \box\@cclv + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + \ifvoid\footins + \else + \setbox\@outputbox \vbox\bgroup + \boxmaxdepth\@maxdepth + \unvbox\@outputbox + \vfill\relax + } + \the\FN@temptoken + \toks@\expandafter{\the\toks@\egroup\fi} +% \end{macrocode} +% +% Not putting stuff at the bottom: footnotes are placed using the +% kernel's algorithm. +% \begin{macrocode} + \else + \toks@{\ifvoid\footins + \setbox\@outputbox\box\@cclv + \else + \setbox\@outputbox \vbox\bgroup + \boxmaxdepth\@maxdepth + \unvbox\@cclv + } + \the\FN@temptoken +% \end{macrocode} +% +% Finally, close the \cs{setbox} and the \cs{ifvoid} and tag the parts +% of the definition of \cs{@makecol} up to the end of the definition +% of the \textsf{bottom} version on to \cs{toks@}. +% \begin{macrocode} + \toks@\expandafter{\the\toks@ + \egroup + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + }% + \fi +% \end{macrocode} +% +% Finally, create the new definition from the resulting object with +% the remainder of the original \cs{@makecol} tagged on at the end. +% \begin{macrocode} + \toks@\expandafter{\the\toks@ + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht{% + \@texttop \dimen@\dp\@outputbox + \unvbox\@outputbox + \vskip -\dimen@\@textbottom + }% + \fi + \global\maxdepth\@maxdepth + } + \edef\@makecol{\the\toks@} +% \end{macrocode} +% +% All of the above occurred conditionally on the `or' of +% \cs{ifFN@para} and \cs{ifFN@bottom}, so we now close the +% conditional. +% \begin{macrocode} +\fi +% \end{macrocode} +% +% +% \subsection{The requirements of \cs{@footnotetext}} +% +% \begin{macro}{\ifFN@baselinestretch} +% \begin{macro}{\FN@singlespace} +% Whatever we do, we are going to patch \cs{@footnotetext}; so first +% of all, we'll check it's not been hacked by anyone other than +% \texttt{setspace.sty} (while we're at it we also record whether +% \texttt{setspace} is loaded). +% so we do this here: +% \begin{macrocode} +\newif\ifFN@setspace +\@ifpackageloaded{setspace}{% + \FN@setspacetrue + \@ifclassloaded{memoir}{% +% \end{macrocode} +% we're seeing \textsf{memoir}'s emulation of \textsf{setspace} +% \begin{macrocode} + \let\FN@baselinestretch\m@m@singlespace + }{% +% \end{macrocode} +% we're seeing \textsf{setspace} in its own right +% \begin{macrocode} + \let\FN@baselinestretch\setspace@singlespace + }% +}{% + \FN@setspacefalse +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% There's substantial patching to be done if we're doing paragraph +% footnotes: +% \begin{macrocode} +\ifFN@para + \newcommand\@footmisxnotetext[1]{% + \insert\footins{% +% \end{macrocode} +% insert compatibility code with |setspace.sty| if necessary +% \begin{macrocode} + \ifFN@setspace + \let\baselinestretch\FN@baselinestretch + \fi + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox + \floatingpenalty\@MM + \hsize\columnwidth + \@parboxrestore + \protected@edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% + \color@begingroup +% \end{macrocode} +% +% We set the paragraph in an \cs{hbox} and apply the fudge factor +% here: +% +% \begin{macrocode} + \setbox\FN@tempboxa=\hbox{% +% \end{macrocode} +% +% This needs a parameter; the rule should be moved to the beginning of +% the footnote paragraph, but the \cs{ignorespaces} should be left +% here. +% +% \begin{macrocode} + \@makefntext{\ignorespaces#1\strut +% \end{macrocode} +% +% We insert a penalty here to help line breaking in the +% footnote paragraph; the value is taken from the \TeX{}book. +% +% \begin{macrocode} + \penalty-10\relax + \hskip\footglue + }% end of \@makefntext parameter + }% end of \hbox + \dp\FN@tempboxa=0pt + \ifFN@etex + \ht\FN@tempboxa=\dimexpr\wd\FN@tempboxa * + \footnotebaselineskip / \columnwidth\relax + \else + \ht\FN@tempboxa=\fudgefactor\wd\FN@tempboxa + \fi + \box\FN@tempboxa + \color@endgroup + }% + \FN@mf@prepare + } +% \end{macrocode} +% +% If we're not doing paragraph footnotes, we now simply tag a +% \cs{FN@mf@prepare} command on the end of the definition; of course, +% there are different definitions according as whether we're using +% |side| footnotes\dots +% \begin{macrocode} +\else + \ifFN@sidefn + \newcommand\@footmisxnotetext[1]{% + \marginpar{% +% \end{macrocode} +% insert compatibility code with |setspace.sty| if necessary +% \begin{macrocode} + \ifFN@setspace + \let\baselinestretch\FN@baselinestretch + \fi + \reset@font\footnotesize + \protected@edef\@currentlabel{% + \csname p@footnote\endcsname\@thefnmark + }% + \color@begingroup + \@makefntext{% + \ignorespaces#1% + }% + \color@endgroup + }% + \FN@mf@prepare + }% + \else + \newcommand\@footmisxnotetext[1]{% + \insert\footins{% +% \end{macrocode} +% insert compatibility code with \textsf{setspace} if necessary +% \begin{macrocode} + \ifFN@setspace + \let\baselinestretch\FN@baselinestretch + \fi + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox + \floatingpenalty\@MM + \hsize\columnwidth + \@parboxrestore + \protected@edef\@currentlabel{% + \csname p@footnote\endcsname\@thefnmark + }% + \color@begingroup + \@makefntext{% + \rule\z@\footnotesep + \ignorespaces#1\@finalstrut\strutbox + }% + \color@endgroup + }% + \FN@mf@prepare + }% + \fi +\fi +% \end{macrocode} +% Now define \cs{@footnotetext} to be \cs{@footmisxnotetext} +% \begin{macrocode} +\@ifpackageloaded{hyperref} +{ + \let\H@@footnotetext\@footmisxnotetext +}{ + \renewcommand{\@footnotetext}[1]{\@footmisxnotetext{#1}} +} +% \end{macrocode} +% +% \subsection{Support code for paragraph footnotes} +% +% This code used (most inefficiently) to be in the argument of the +% \cs{DeclareOption}; this no doubt comes of that code having been +% written over Christmas 1993\dots +% +% Now all executed under the |para| conditional set in the option +% declaration. +% \begin{macrocode} +\ifFN@para +% \end{macrocode} +% +% \begin{macro}{\FN@tempboxa} +% \begin{macro}{\FN@tempboxb} +% \begin{macro}{\FN@tempboxb} +% We need some temporary boxes, and \LaTeX{} only defines one +% \begin{macrocode} + \let\FN@tempboxa\@tempboxa + \newbox\FN@tempboxb + \newbox\FN@tempboxc +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\footglue} +% A direct crib from the \TeX{}book: +% \begin{macrocode} + \newskip\footglue \footglue=1em plus.3em minus.3em +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefntext} +% The standard classes set the footnote mark flush with the text of +% the footnote, but that's not appropriate for paragraph footnotes, we +% find. +% +% There's not much point in patching this code from the original, +% since the only things it has in common with the original are the +% footnote mark and the footnote text (which last is the argument). +% Note that the \cs{leavevmode} isn't necessary except in the case of +% footnotes in minipages, which otherwise end up with the +% \cs{@makefnmark} being executed in restricted vertical mode, which +% results in its \cs{hbox} ending up in a line of its own. +% +% \begin{macrocode} + \long\def\@makefntext#1{\leavevmode + \@makefnmark\nobreak + \hskip.5em\relax#1% + } +% \end{macrocode} +% \end{macro} +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{macro}{\footnotebaselineskip} +% We need to record a value for the baseline skip when in footnotes: +% \begin{macrocode} + \newdimen\footnotebaselineskip + {% + \footnotesize + \global + \footnotebaselineskip=\normalbaselineskip + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fudgefactor} +% Now we derive a fudge factor from the baselineskip we've just +% established (we use \cs{dimexpr} if we're in etex, so there's no need +% for the fudge factor in that case). +% \begin{macrocode} + \ifFN@etex + \else + \@tempdima=\footnotebaselineskip \multiply\@tempdima by 1024 + \divide \@tempdima by \columnwidth \multiply\@tempdima by 64 + \xdef\fudgefactor{\strip@pt\@tempdima }% + \fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makefootnoteparagraph} +% For use in the output routine +% \begin{macrocode} + \long\def\makefootnoteparagraph{\unvbox\footins \makehboxofhboxes + \setbox\FN@tempboxa=\hbox{\unhbox\FN@tempboxa \removehboxes} +% \end{macrocode} +% Now we are ready to set the paragraph: +% \begin{macrocode} + \hsize\columnwidth + \@parboxrestore + \baselineskip=\footnotebaselineskip + \noindent + \rule{\z@}{\footnotesep}% + \unhbox\FN@tempboxa\par + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makehboxofhboxes} +% \begin{macro}{\removehboxes} +% Support code for \cs{makefootnoteparagraph} +% \begin{macrocode} + \def\makehboxofhboxes{\setbox\FN@tempboxa=\hbox{}% + \loop + \setbox\FN@tempboxb=\lastbox + \ifhbox\FN@tempboxb + \setbox\FN@tempboxa=\hbox{\box\FN@tempboxb\unhbox\FN@tempboxa}% + \repeat + } + \def\removehboxes{\setbox\FN@tempboxa=\lastbox + \ifhbox + \FN@tempboxa{\removehboxes}% + \unhbox\FN@tempboxa + \fi + } +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{The other footnote commands}\label{sec:perpage-code} +% +% \begin{macro}{\ifFN@pp@footnotehint} +% A conditional needed by the perpage code: must be defined outside +% the \textsl{perpage} conditional +% \begin{macrocode} +\newif\ifFN@pp@footnotehint +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@pp@next@reset} +% Counter used to store information about the next reset of the +% footnote number, in perpage mode. +% \begin{macrocode} +\newcounter{pp@next@reset}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifFN@pp@towrite} +% A conditional that mediates the interaction between the +% \texttt{perpage} option and the \texttt{multiple} option. +% \begin{macrocode} +\newif\ifFN@pp@towrite +\FN@pp@towritefalse +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifFN@pp@lastseq} +% We prevent endless processions of diagnostics `footnote sequence +% lost' by using this conditional (again, needs to be defined outside +% the \textsl{perpage} conditional: +% \begin{macrocode} +%<*PPdebug> +\newif\ifFN@pp@lastseq +\global\FN@pp@lastseqfalse +% +% \end{macrocode} +% \end{macro} +% +% Now, do we need to patch \cs{footnote} for per-page footnotes? +% \begin{macrocode} +\ifFN@perpage + \CheckCommand*\footnote{\@ifnextchar [%] + \@xfootnote + {% + \stepcounter\@mpfn \protected@xdef\@thefnmark{\thempfn}% + \@footnotemark \@footnotetext + }% + } + \renewcommand*\footnote{\@ifnextchar [%] + \@xfootnote + {% + \stepcounter\@mpfn \protected@xdef\@thefnmark{\thempfn}% + \FN@pp@footnote\@footnotemark +% \end{macrocode} +% +% In case that we're \emph{not} running \texttt{multiple} option, +% \cs{@footnotemark} \emph{won't} have written details to the |.aux| +% file, so do it now: +% \begin{macrocode} + \ifFN@pp@towrite + \FN@pp@writetemp + \FN@pp@towritefalse + \fi + \@footnotetext + }% + } +% \end{macrocode} +% +% And the analagous change for \cs{footnotemark} +% \begin{macrocode} + \CheckCommand*\footnotemark{% + \@ifnextchar [%] + \@xfootnotemark + {% + \stepcounter{footnote}% + \protected@xdef\@thefnmark{\thefootnote}% + \@footnotemark + }% + } + \renewcommand*\footnotemark{% + \@ifnextchar [%] + \@xfootnotemark + {% + \stepcounter{footnote}% + \protected@xdef\@thefnmark{\thefootnote}% + \FN@pp@footnote\@footnotemark +% \end{macrocode} +% +% again, tidy up if we're not doing \texttt{multiple} option +% \begin{macrocode} + \ifFN@pp@towrite + \FN@pp@writetemp + \FN@pp@towritefalse + \fi + }% + } +% \end{macrocode} +% +% \begin{macro}{\FN@pp@initialstab} +% Now the supporting commands\dots +% +% if we encounter no information in the |.aux| file, we make a first +% stab resetting footnote on the page number counter +% \begin{macrocode} + \gdef\FN@pp@initial@stab{\@addtoreset{footnote}{page}} + \AtBeginDocument{\FN@pp@initial@stab} +% \end{macrocode} +% \end{macro} +% +% We use a counter to keep pace with the footnotes: this counter is +% used in the data that's written to the |.aux| file, and matched to +% create the correct footnote numbers on the second and subsequent +% passes. +% \begin{macrocode} + \newcounter{@fnserial} +% \end{macrocode} +% +% \begin{macro}{\FN@pp@cpage} +% The package requires a ``knowledge'' of the current page number. +% It's kept in \cs{FN@pp@cpage} +% \begin{macrocode} + \def\FN@pp@cpage{0} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footnotehint} +% However, the progress of page numbers isn't predictable, so we have +% a flag saying `reset footnote number'. The flag is for indirect use +% by people who diddle with the page number, via the \cs{footnotehint} +% command, as well as various places where we \emph{know} there could +% be a discontinuity. +% \begin{macrocode} + \FN@pp@footnotehinttrue + \newcommand{\footnotehint}{% + \setcounter{footnote}{0}% + \protected@writeaux\relax{\protect\FN@pp@footnotehinttrue}% + \@tempcnta\c@@fnserial + \advance\@tempcnta\@ne + \global\c@pp@next@reset\@tempcnta + } + \AtBeginDocument{\protected@writeaux\relax{% + \protect\providecommand{\protect\FN@pp@footnotehinttrue}{}% + }% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FN@pp@lastfoot} +% Dummy value for the number of the last footnote we came across. +% \begin{macrocode} +\def\FN@pp@lastfoot{-1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FN@pp@footnote@aux} +% The command \cs{FN@pp@footnote@aux} is written to the |.aux| file +% for every footnote counter allocated (other than in minipages):\\ +% |#1| is the footnote serial number\\ +% |#2| is the page the footnote was actually written on +% \begin{macrocode} + \newcommand{\FN@pp@footnote@aux}[2]{% + \ifnum\FN@pp@lastfoot<#1 + \ifFN@pp@footnotehint + \FN@pp@resetfn{#1}{#2}% + \FN@pp@footnotehintfalse + \else + \gdef\@tempa{#2}% + \ifx\@tempa\FN@pp@cpage + \else + \FN@pp@resetfn{#1}{#2}% + \fi + \fi + \def\FN@pp@lastfoot{#1}% +%<*PPdebug> + \else + \ifFN@pp@debug + \typeout{not considering footnote serial number #1 + (last valid was \FN@pp@lastfoot)}% + \fi +% + \fi +% \end{macrocode} +% +% Since we've now had at least one item of footnote information from +% a |.aux| file, we can't allow footnote resetting per page. +% \begin{macrocode} + \global\let\FN@pp@initial@stab\relax + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FN@pp@resetfn} +% Set the flag to reset the footnote number; this constructs a chain +% through the footnote serial numbers at the start of each page +% \begin{macrocode} + \newcommand{\FN@pp@resetfn}[2]{% + \gdef\FN@pp@cpage{#2}% + \expandafter\gdef + \csname FN@pp@next-\FN@pp@prev@foot\endcsname{#1}% + \def\FN@pp@prev@foot{#1}% + \expandafter\xdef + \csname FN@pp@next-\FN@pp@prev@foot\endcsname{\the\@MM}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FN@pp@prev@foot} +% The base of the footnote serial number chain (this element is never +% looked at: footnote serial 1 must always have number 1) +% \begin{macrocode} + \newcommand{\FN@pp@prev@foot}{root} +% \end{macrocode} +% \end{macro} +% +% again, avoid confusion; also establish \cs{FN@pp@footnote@aux} in the +% |.aux| file +% \begin{macrocode} + \AtBeginDocument{\protected@writeaux\relax{% + \protect\providecommand{\protect\FN@pp@footnote@aux}[2]{}}% + \c@pp@next@reset\@ne + } +% \end{macrocode} +% +% At end document, establish a new \cs{FN@pp@footnote@aux} which +% checks whether numbers have changed during the scan of the |.aux| +% files for changed labels and the like +% \begin{macrocode} + \AtEndDocument{\let\FN@pp@footnote@aux\FN@pp@footnote@endaux + \def\FN@pp@lastfoot{-1}% + \FN@pp@footnotehintfalse + \renewcommand{\FN@pp@prev@foot}{root} + } +% \end{macrocode} +% +% \begin{macro}{\FN@pp@footnote@endaux} +% The footnote analysis command for end document +% \begin{macrocode} + \newcommand{\FN@pp@footnote@endaux}[2]{% + \ifnum\FN@pp@lastfoot<#1 + \ifFN@pp@footnotehint + \FN@pp@resetfn@end{#1}{#2}% + \FN@pp@footnotehintfalse + \else + \gdef\@tempa{#2}% + \ifx\@tempa\FN@pp@cpage + \else + \FN@pp@resetfn@end{#1}{#2}% + \fi + \fi + \def\FN@pp@lastfoot{#1}% +%<*PPdebug> + \else + \ifFN@pp@debug + \typeout{not considering footnote serial number #1 + (last valid was \FN@pp@lastfoot)}% + \fi +% + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FN@pp@resetfn@end} +% Deal with the \verb'.aux' file footnote details, at end document +% \begin{macrocode} + \newcommand{\FN@pp@resetfn@end}[2]{% + \def\@tempa{#1}% + \expandafter\ifx\csname FN@pp@next-\FN@pp@prev@foot\endcsname\@tempa% + \else + \@tempswatrue +%<*PPdebug> + \ifFN@pp@debug + \expandafter\ifx\csname FN@pp@next-\FN@pp@prev@foot\endcsname\relax + \ifFN@pp@lastseq\else + \typeout{footnote sequence lost between pages + \FN@pp@cpage\space and #2}% + \global\FN@pp@lastseqtrue + \fi + \else + \typeout{footnotes changed between pages \FN@pp@cpage\space and #2: + next was \csname FN@pp@next-\FN@pp@prev@foot\endcsname, now #1}% + \global\FN@pp@lastseqfalse + \fi + \fi +% + \fi + \gdef\FN@pp@prev@foot{#1}% + \gdef\FN@pp@cpage{#2}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\clearpage} +% \begin{macro}{\FN@pp@@clearpage} +% Now, how do we cope with \cs{include}d documents? We can't insert +% anything (the |includex| package offers \cs{AtBeginIncludedDocument} +% but there's no corresponding command for files included by the +% kernel \cs{include}. So we insert a footnote hint at every +% \cs{clearpage} +% \begin{macrocode} +\let\FN@pp@@clearpage\clearpage +\renewcommand{\clearpage}{\footnotehint\FN@pp@@clearpage} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\FN@pp@footnote} +% The business end of the option: a macro to decide on footnote +% numbers, called from \cs{footnote} and \cs{footnotemark} (see +% above). +% \begin{macrocode} +\def\FN@pp@footnote{% + \if@minipage\else + \global\advance\c@@fnserial\@ne + \if@filesw +% \end{macrocode} +% +% In case we're also doing \texttt{multiple} option, we now save up +% the command to write to the |.aux| file, and mark we've done so +% \begin{macrocode} + \xdef\FN@pp@writetemp{% + \noexpand\protected@writeaux\relax{% + \string\FN@pp@footnote@aux + {\the\c@@fnserial}{\noexpand\thepage}% + }% + }% + \FN@pp@towritetrue + \fi + \ifnum\c@pp@next@reset>\c@@fnserial + \else + \global\expandafter\csname c@\@mpfn\endcsname\@ne + \protected@xdef\@thefnmark{\thempfn}% +% \end{macrocode} +% +% Now look at the next element in the chain: +% \begin{macrocode} + \expandafter\let\expandafter\@tempa + \csname FN@pp@next-\number\c@pp@next@reset\endcsname +% \end{macrocode} +% +% If the chain is broken here, set the next reset point to something +% (one hopes) infeasibly large\dots{} a weak point? +% \begin{macrocode} + \ifx\@tempa\relax + \global\c@pp@next@reset\@MM + \else + \global\c@pp@next@reset\@tempa + \fi + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% End of code loaded when \texttt{perpage} option is given +% \begin{macrocode} +\fi +% \end{macrocode} +% +% Finally, if we're not doing paragraph footnotes, we redefine +% \cs{@makefntext} to take account of the value of +% \cs{footnotemargin}, to impose \cs{footnotelayout}, and to make the +% footnote body text hang, if appropriate. +% \begin{macrocode} +\ifFN@para +\else +% \end{macrocode} +% +% hanging footnote version: +% \begin{macrocode} + \long\def\@makefntext#1{% + \ifFN@hangfoot + \bgroup +% \end{macrocode} +% +% get the marker so we can measure it: +% \begin{macrocode} + \setbox\@tempboxa\hbox{% + \ifdim\footnotemargin>0pt + \hb@xt@\footnotemargin{\@makefnmark\hss}% + \else + \@makefnmark + \fi + }% +% \end{macrocode} +% +% use the width of the box to set up hanging (potentially for more +% than one paragraph); note that the hanging \cs{parskip} and +% \cs{parindent} are set \emph{after} we've executed \cs{leavevmode}(!) +% \begin{macrocode} + \leftmargin\wd\@tempboxa + \rightmargin\z@ + \linewidth \columnwidth + \advance \linewidth -\leftmargin + \parshape \@ne \leftmargin \linewidth + \footnotesize +% \end{macrocode} +% +% stop the \cs{parshape} being overwritten: +% \begin{macrocode} + \@setpar{{\@@par}}% +% \end{macrocode} +% +% and finally put the marker in its chosen place: +% \begin{macrocode} + \leavevmode + \llap{\box\@tempboxa}% + \parskip\hangfootparskip\relax + \parindent\hangfootparindent\relax + \else +% \end{macrocode} +% +% ordinary (non-hanging) footnote version: +% \begin{macrocode} + \parindent1em + \noindent + \ifdim\footnotemargin>\z@ + \hb@xt@ \footnotemargin{\hss\@makefnmark}% + \else + \ifdim\footnotemargin=\z@ + \llap{\@makefnmark}% + \else + \llap{\hb@xt@ -\footnotemargin{\@makefnmark\hss}}% + \fi + \fi + \fi + \footnotelayout#1% +% \end{macrocode} +% +% if we're hanging, close the hang group +% \begin{macrocode} + \ifFN@hangfoot + \par\egroup + \fi + } +\fi +% \end{macrocode} +% +% \section{Remaining requirements} +% +% We have to insert the code that executes the \texttt{stable} and +% \texttt{multiple} options. Since \texttt{stable} may suppress the +% setting of a footnote altogether, we put the \texttt{multiple} +% option first, as otherwise we might get isolated superscripted +% commas that separate footnotes that have otherwise been suppressed. +% +% \subsection{The code that executes the \texttt{multiple} option} +% +% \begin{macro}{\multiplefootnotemarker} +% \begin{macro}{\multfootsep} +% \begin{macro}{\@footnotemark} +% \begin{macro}{\FN@mf@prepare} +% \begin{macro}{\FN@mf@check} +% This (revised) code derives from a suggestion by Alexander Rozhenko +% (the author of the \textit{manyfoot} package): the intention is that +% \textit{footmisx} and \textit{manyfoot} should be able to +% `interwork', in the sense that each would recognise the other's +% footnote marks and behave appropriately. The trick is that +% both \cs{footnote} and \cs{footnotemark} insert a marker (a +% cancelling pair of kerns of \cs{multiplefootnotemarker} (of opposite +% signs), which is detected in following \cs{footnote} or +% \cs{footnotemark} commands. Note we have to take special +% precautions to ensure that the kerns are the last things added to +% the horizontal list by the commands. +% \begin{macrocode} +\ifFN@multiplefootnote + \providecommand*{\multiplefootnotemarker}{3sp} + \providecommand*{\multfootsep}{,} + \@ifpackageloaded{hyperref}{ + \newcommand*{\@footmicx@makefnmark}{% + \stepcounter{Hfootnote}% + \global\let\Hy@saved@currentHref\@currentHref% + \hyper@makecurrent{Hfootnote}% + \global\let\Hy@footnote@currentHref\@currentHref% + \global\let\@currentHref\Hy@saved@currentHref% + \hyper@linkstart{link}{\Hy@footnote@currentHref}% + \@makefnmark% + \hyper@linkend% + } + }{ + \newcommand*{\@footmicx@makefnmark}{\@makefnmark} + } + \newcommand*\@footmisxnotemark{% + \leavevmode + \ifhmode + \edef\@x@sf{\the\spacefactor}% + \FN@mf@check + \nobreak + \fi + \@footmicx@makefnmark +% \end{macrocode} +% +% if we're also doing option \texttt{perpage}, write its stuff to the +% |.aux| file for it, so the \emph{wotsit} node doesn't interfere with +% our \cs{kern} detection. +% \begin{macrocode} + \ifFN@pp@towrite + \FN@pp@writetemp + \FN@pp@towritefalse + \fi + \FN@mf@prepare + \ifhmode\spacefactor\@x@sf\fi + \relax + } + \def\FN@mf@prepare{% + \kern-\multiplefootnotemarker + \kern\multiplefootnotemarker\relax + } + \def\FN@mf@check{% + \ifdim\lastkern=\multiplefootnotemarker\relax + \edef\@x@sf{\the\spacefactor}% + \unkern + \textsuperscript{\multfootsep}% + \spacefactor\@x@sf\relax + \fi + } + \CheckCommand*\@footnotemark{% + \leavevmode + \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi + \@makefnmark + \ifhmode\spacefactor\@x@sf\fi + \relax + } + \let\@footnotemark\@footmisxnotemark + +% \end{macrocode} +% +% If we're not doing multiple, just create an empty \cs{FN@mf@prepare} +% \begin{macrocode} +\else + \let\FN@mf@prepare\relax +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{The code that executes the \texttt{stable} option} +% +% \begin{macro}{\ifFN@stablefootnote} +% \begin{macro}{\FN@sf@@footnote} +% The basic idea is to use the `original' code of \cs{footnote} (which +% this package may have hacked around something chronic) only if we're +% in typesetting mode (as determined by the state of the \cs{protect} +% command. Otherwise, the command becomes an elaborate multistage +% `gobble'. +% \begin{macrocode} +\ifFN@stablefootnote +\let\FN@sf@@footnote\footnote +\def\footnote{\ifx\protect\@typeset@protect + \expandafter\FN@sf@@footnote + \else + \expandafter\FN@sf@gobble@opt + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\FN@sf@gobble@opt} +% \begin{macro}{\FN@sf@gobble@twobracket} +% Define \cs{FN@sf@gobble@opt} as a robust command that gobbles either +% an optional and a mandatory argument, or just a mandatory one. +% \begin{macrocode} +\edef\FN@sf@gobble@opt{\noexpand\protect + \expandafter\noexpand\csname FN@sf@gobble@opt \endcsname} +\expandafter\def\csname FN@sf@gobble@opt \endcsname{% + \@ifnextchar[%] + \FN@sf@gobble@twobracket + \@gobble +} +\def\FN@sf@gobble@twobracket[#1]#2{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\FN@sf@@footnotemark} +% \begin{macro}{\FN@sf@gobble@optonly} +% \begin{macro}{\FN@sf@gobble@bracket} +% Now the same for \cs{footnotemark} +% \begin{macrocode} +\let\FN@sf@@footnotemark\footnotemark +\def\footnotemark{\ifx\protect\@typeset@protect + \expandafter\FN@sf@@footnotemark + \else + \expandafter\FN@sf@gobble@optonly + \fi +} +\edef\FN@sf@gobble@optonly{\noexpand\protect + \expandafter\noexpand\csname FN@sf@gobble@optonly \endcsname} +\expandafter\def\csname FN@sf@gobble@optonly \endcsname{% + \@ifnextchar[%] + \FN@sf@gobble@bracket + {}% +} +\def\FN@sf@gobble@bracket[#1]{} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\setfnsymbol} +% \begin{macro}{\FN@fnsymbol@lamport} +% \section{Symbol option variants} +% +% Lamport's choice of symbols for \cs{fnsymbol} wasn't entirely +% ``traditional'', so we (now) provide alternatives. The +% \cs{setfnsymbol} command offers a small number of choices, and the +% user may define more still, using the \cs{DefineFNsymbols} or +% \cs{DefineFNsymbolsTM} commands, defined below. +% \begin{macrocode} +\newcommand\setfnsymbol[1]{% + \@bsphack + \@ifundefined{FN@fnsymbol@#1}% + {% + \PackageError{footmisx}{Symbol style "#1" not known}% + \@eha + }{% + \expandafter\let\expandafter\@fnsymbol\csname + FN@fnsymbol@#1\endcsname + }% + \@esphack +} +% \end{macrocode} +% +% The default selection is Lamport's original, as represented in +% current \LaTeX{}~--- we preserve it in case we need to ``get back'' +% to it. +% \begin{macrocode} +\let\FN@fnsymbol@lamport\@fnsymbol +% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@tempswb} +% \begin{macro}{\@tempswbfalse} +% \begin{macro}{\@tempswbtrue} +% We need another temp conditional +% \begin{macrocode} +\newif\if@tempswb +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\DefineFNsymbols} +% \begin{macro}{\@DefineFNsymbols} +% \begin{macro}{\@DefineFNsymbols@} +% \begin{macro}{\FN@build@symboldef} +% The macro \cs{DefineFNsymbols} allows the user to define a set of +% footnote symbols, to be used with the \cs{setfnsymbol} command. +% Syntax:\par\noindent +% \cs{DefineFNsymbols}|[*]|\marg{set name}\oarg{style}\marg{symbol list} +% +% If the optional asterisk is present, the set defined will produce an +% error if the symbol number is too large; otherwise it will quietly +% change to numbering in place of symbol use (a warning is produced at +% the end of the document). The set name is the future argument of +% \cs{setfnsymbol}). The style (default \texttt{text}) gives the style +% the symbols are typeset (this is the \emph{correct} method, but +% unfortunately not all symbols, even for Lamport's original set for +% \LaTeX{} \cs{fnsymbol} may be expressed this way in a sufficiently +% old \LaTeX{} distribution). The symbol list is a set of objects to +% be used when the set is selected. +% +% Example of use:\par\noindent define a direct replacement for +% Lamport's original \cs{fnsymbol} command --- +%\begin{verbatim} +%\DefineFNsymbols*{lamport}[math]{*\dagger\ddagger\mathsection +% \mathparagraph\|{**}{\dagger\dagger}{\ddagger\ddagger}% +%} +%\end{verbatim} +% Note that doubled-up (and worse\,---\,see below) symbols need braces +% around them. +% \begin{macrocode} +\newcommand{\DefineFNsymbols}{% + \@ifstar{\@tempswbtrue\@DefineFNsymbols}% + {\@tempswbfalse\@DefineFNsymbols}% +} +\newcommand{\@DefineFNsymbols}[1]{% + \@ifnextchar[% ] + {\@DefineFNsymbols@{#1}}{\@DefineFNsymbols@{#1}[text]}% +} +\def\@DefineFNsymbols@#1[#2]#3{% + \expandafter\ifx\csname FN@fnsymbol@#1\endcsname\relax + \PackageInfo{footmisx}{Declaring symbol style #1}% + \else + \PackageWarning{footmisx}{Redeclaring symbol style #1}% + \fi + \toks@{}% + \def\@tempb{\end}% + \FN@build@symboldef#3\end + \def\@tempc{math}% + \def\@tempd{#2}% + \expandafter\xdef\csname FN@fnsymbol@#1\endcsname##1{% + \ifx\@tempc\@tempd + \noexpand\ensuremath + \else + \noexpand\nfss@text + \fi + {% + \noexpand\ifcase##1% + \the\toks@ + \noexpand\else + \if@tempswb + \noexpand\@ctrerr + \else + \noexpand\@arabic##1\noexpand\FN@orange##1% + \fi + \noexpand\fi + }% + }% +} +\def\FN@build@symboldef#1{% + \def\@tempa{#1}% + \ifx\@tempa\@tempb + \else + \toks@\expandafter{\the\toks@\or#1}% + \expandafter\FN@build@symboldef + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\DefineFNsymbolsTM} +% \begin{macro}{\@DefineFNsymbolsTM} +% \begin{macro}{\FN@build@symboldefTM} +% +% Now do the same job for the ``modern'' way of having both text and +% maths variants of everything. +% \begin{macrocode} +\newcommand{\DefineFNsymbolsTM}{% + \@ifstar{\@tempswbtrue\@DefineFNsymbolsTM}% + {\@tempswbfalse\@DefineFNsymbolsTM}}% +\newcommand{\@DefineFNsymbolsTM}[2]{% + \expandafter\ifx\csname FN@fnsymbol@#1\endcsname\relax + \PackageInfo{footmisx}{Declaring symbol style #1}% + \else + \PackageWarning{footmisx}{Redeclaring symbol style #1}% + \fi + \toks@{}% + \def\@tempb{\end}% + \FN@build@symboldefTM#2\end\@null + \expandafter\xdef\csname FN@fnsymbol@#1\endcsname##1{% + \noexpand\ifcase##1% + \the\toks@ + \noexpand\else + \if@tempswb + \noexpand\@ctrerr + \else + \noexpand\@arabic##1\noexpand\FN@orange##1% + \fi + \noexpand\fi + }% +}% +% \end{macrocode} +% Note that this version has two variants of every definition, so +% needs two stopper codes above. +% \begin{macrocode} +\def\FN@build@symboldefTM#1#2{% + \def\@tempa{#1}% + \ifx\@tempa\@tempb + \else + \toks@\expandafter{\the\toks@\or\TextOrMath{#1}{#2}}% + \expandafter\FN@build@symboldefTM + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\TextOrMath} +% This is a stripped down (e-\TeX{} only) version of what appears in +% fixltx2e. If the command's already defined, we assume it's that +% version. +% \begin{macrocode} +\@ifundefined{TextOrMath}{% + \@ifundefined{eTeXversion}{% + \PackageError{footmisx}{Can't define commands for footnote symbol}% + {Use e-LaTeX, or load package fixltx2e before + footmisx}% + }{% + \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}% + }% + }% +}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FN@orange} +% \begin{macro}{\@fnsymbol@orange} +% \begin{macro}{\@diagnose@fnsymbol@orange} +% Macros to deal with footnote symbols going out of range (when +% they're allowed to\,--\,e.g., in the \texttt{symbol*} option). +% \begin{macrocode} +\def\FN@orange#1{% + \@bsphack + \PackageInfo{footmisx}{Footnote number \number#1 out of range}% + \protect\@fnsymbol@orange + \@esphack +} +\global\let\@diagnose@fnsymbol@orange\relax +\AtEndDocument{\@diagnose@fnsymbol@orange} +\def\@fnsymbol@orange{% + \gdef\@diagnose@fnsymbol@orange{% + \PackageWarningNoLine{footmisx}{Some footnote number(s) + were out of range + \MessageBreak + see log for details% + }% + }% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\textbardbl} +% This is defined in recent \LaTeX{} releases, but not in (for +% example) that distributed with the last release of te\TeX{}. Since +% it's needed in some symbol set definitions (including Lamport's) we +% define it here. +% \begin{macrocode} +\@ifundefined{textbardbl}{% + \DeclareTextSymbol{\textbardbl}{OMS}{107}% + \DeclareTextSymbolDefault{\textbardbl}{TS1}}{}% +% \end{macrocode} +% (This definition comes from the \LaTeX{} sources.) +% \end{macro} +% +% \begin{macro}{\FN@fnsymbol@bringhurst} +% \begin{macro}{\FN@fnsymbol@chicago} +% \begin{macro}{\FN@fnsymbol@wiley} +% \begin{macro}{\FN@fnsymbol@lamport-robust} +% \begin{macro}{\FN@fnsymbol@lamport} +% These macros provide replacement orderings (and symbol sets) for +% footnote symbols, plus a robust version of the original Lamport set, +% and an extended version of Lamport's original +% \begin{macrocode} +\DefineFNsymbolsTM*{bringhurst}{% + \textasteriskcentered * + \textdagger \dagger + \textdaggerdbl \ddagger + \textsection \mathsection + \textbardbl \|% + \textparagraph \mathparagraph +}% +\DefineFNsymbolsTM*{chicago}{% + \textasteriskcentered * + \textdagger \dagger + \textdaggerdbl \ddagger + \textsection \mathsection + \textbardbl \|% + \#\#% +}% +\DefineFNsymbolsTM*{wiley}{ + \textasteriskcentered * + {\textasteriskcentered\textasteriskcentered}{**}% + \textdagger \dagger + \textdaggerdbl \ddagger + \textsection \mathsection + \textparagraph \mathparagraph + \textbardbl \|% +}% +\DefineFNsymbolsTM{lamport-robust}{ + \textasteriskcentered * + \textdagger \dagger + \textdaggerdbl \ddagger + \textsection \mathsection + \textparagraph \mathparagraph + \textbardbl \|% + {\textasteriskcentered\textasteriskcentered}{**}% + {\textdagger\textdagger}{\dagger\dagger}% + {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}% +} +\DefineFNsymbolsTM*{lamport*}{% + \textasteriskcentered * + \textdagger \dagger + \textdaggerdbl \ddagger + \textsection \mathsection + \textparagraph \mathparagraph + \textbardbl \|% + {\textasteriskcentered\textasteriskcentered}{**}% + {\textdagger\textdagger}{\dagger\dagger}% + {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}% + {\textsection\textsection}{\mathsection\mathsection}% + {\textparagraph\textparagraph}{\mathparagraph\mathparagraph}% + {\textasteriskcentered\textasteriskcentered\textasteriskcentered}{***}% + {\textdagger\textdagger\textdagger}{\dagger\dagger\dagger}% + {\textdaggerdbl\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger\ddagger}% + {\textsection\textsection\textsection}%% + {\mathsection\mathsection\mathsection}% + {\textparagraph\textparagraph\textparagraph}%% + {\mathparagraph\mathparagraph\mathparagraph}% +} +\setfnsymbol{lamport*} +\DefineFNsymbolsTM{lamport*-robust}{% + \textasteriskcentered * + \textdagger \dagger + \textdaggerdbl \ddagger + \textsection \mathsection + \textparagraph \mathparagraph + \textbardbl \|% + {\textasteriskcentered\textasteriskcentered}{**}% + {\textdagger\textdagger}{\dagger\dagger}% + {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}% + {\textsection\textsection}{\mathsection\mathsection}% + {\textparagraph\textparagraph}{\mathparagraph\mathparagraph}% + {\textasteriskcentered\textasteriskcentered\textasteriskcentered}{***}% + {\textdagger\textdagger\textdagger}{\dagger\dagger\dagger}% + {\textdaggerdbl\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger\ddagger}% + {\textsection\textsection\textsection}%% + {\mathsection\mathsection\mathsection}% + {\textparagraph\textparagraph\textparagraph}%% + {\mathparagraph\mathparagraph\mathparagraph}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{Other miscellaneous commands} +% +% \subsection{Footnote references} +% +% \begin{macro}{\footref} +% Syntax: \cs{footref}\marg{label-name} +% +% One often wishes to refer to a footnote; in some circumstances, +% \cs{footnotemark} just isn't good enough (for example, inside a +% |minipage|, when \cs{footnotemark} creates a reference to footnotes +% outside the minipage). +% +% \cs{footref} addresses this problem by making a label reference that +% actually looks like a \cs{footnotemark}. (The command is available +% in the |memoir| class, and we therefore \cs{providecommand} it +% rather than defining it ``outright''.) +% \begin{macrocode} +\providecommand*{\footref}[1]{% + \begingroup + \unrestored@protected@xdef\@thefnmark{\ref{#1}}% + \endgroup + \@footnotemark +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Minipage \cs{footnotemark}s} +% +% \begin{macro}{\mpfootnotemark} +% Syntax: \cs{mpfootnotemark}\oarg{number} +% +% Here we define \cs{mpfootnotemark}, which has the same syntax as +% \cs{footnotemark}, and which applies the semantics of +% \cs{footnotemark} to the minipage footnote series. +% \begin{macrocode} +\newcommand\mpfootnotemark{% + \@ifnextchar[% + \@xmpfootnotemark + {% + \stepcounter\@mpfn + \protected@xdef\@thefnmark{\thempfn}% + \@footnotemark + }% +} +\def\@xmpfootnotemark[#1]{% + \begingroup + \csname c@\@mpfn\endcsname #1\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \endgroup + \@footnotemark +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\endinput +% +% \end{macrocode} +% +% \Finale +% +% +%% \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 \~} diff --git a/macros/latex/contrib/footmisx/footmisx.ins b/macros/latex/contrib/footmisx/footmisx.ins new file mode 100644 index 0000000000..c6949d7d20 --- /dev/null +++ b/macros/latex/contrib/footmisx/footmisx.ins @@ -0,0 +1,45 @@ +\input docstrip.tex + +\preamble +---------------------------------------------------------------------- +The footmisx package -- variations of footnote typesetting +Copyright (c) 2008 Robin Fairbairns + +This work 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 work has the LPPL maintenance status `author-maintained'. + +This work consists of the files footmisx.dtx, footmisx.ins, and README +and the derived files footmisx.sty and footmisx.pdf. +----------------------------------------------------------------------- + +\endpreamble + +\def\batchfile{footmisx.ins} +\keepsilent +\Msg{*** Generating the footmisx package ***} +\askforoverwritefalse +\generate{% + \file{footmisx.sty}{\from{footmisx.dtx}{package}}% +} + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the file} +\Msg{* footmisx.sty into a directory searched by TeX} +\Msg{*} +\Msg{* Usual TDS location:} +\Msg{* \space\space tex/latex/footmisx} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{*} +\Msg{***********************************************************} +} + +\endbatchfile -- cgit v1.2.3