summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/fixfoot
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-12 23:55:46 +0000
committerKarl Berry <karl@freefriends.org>2006-01-12 23:55:46 +0000
commitc47c1f33941ab8c846cf28d48cc1e3005325541d (patch)
tree73f322499c7f3d73f75a749da094e6cc39a47977 /Master/texmf-dist/tex/latex/fixfoot
parent6605179365c5b6a45c12c7a01af7709718923d3f (diff)
fixfoot
git-svn-id: svn://tug.org/texlive/trunk@916 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/fixfoot')
-rw-r--r--Master/texmf-dist/tex/latex/fixfoot/fixfoot.sty193
1 files changed, 193 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/fixfoot/fixfoot.sty b/Master/texmf-dist/tex/latex/fixfoot/fixfoot.sty
new file mode 100644
index 00000000000..fe7eaf22e5f
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/fixfoot/fixfoot.sty
@@ -0,0 +1,193 @@
+\ProvidesPackage{fixfoot}[2000/07/10 v0.1b fixed-text footnotes]
+%
+% Author: Robin Fairbairns <rf10@cam.ac.uk>
+%
+% This program may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.1
+% 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.1 or later is part of all distributions of LaTeX
+% version 1999/06/01 or later.
+%
+% This program consists of a package file fixfoot.sty and a test file
+% testfix.tex
+%
+% this is an experimental package that provides fixed footnotes
+% only one instance of a fixed footnote will appear on any one page
+%
+% the package defines a single command, \DeclareFixedFootnote, which
+% takes an optional *, and two `ordinary' arguments.
+%
+% if the optional * is present, the command declared has an \xspace
+% imbedded in it, so that spaces following it in running text tend not
+% to be lost.
+%
+% the first ordinary argument is a cs name
+% the second ordinary argument is the fixed text of the footnote
+%
+% e.g., \DeclareFixedFootnote*{\sic}{\emph{sic}}
+% \DeclareFixedFootnote{\prooflater}{This theorem will be proved
+% later}
+%
+% the package works by exchanging information with itself via the .aux
+% file. just as with labels (and per-page footnote numbers in
+% footmisc), the user ordinarily needs to run latex at least twice.
+% this package does not (yet) have the ability to warn the user that
+% another run of latex is still necessary (changing labels or footnote
+% numbers in footmisc \emph{do} thus warn).
+\newcommand\DeclareFixedFootnote{%
+ \@ifstar{\@declare@fftn\xspace}%
+ {\@declare@fftn\relax }%
+}
+%
+% relay after detecting optional `|*|':
+\newcommand\@declare@fftn[3]{%
+% #1 \cs{xspace} (if `|*|' found) or \cs{relax}
+% #2 footnote name, #3 footnote body
+%
+% extract the \csname bit of it...
+ \edef\reserved@a{\expandafter\@gobble\string#2}%
+ \@ifundefined\reserved@a
+ {\@declare@@fftn{#1}{#2}{#3}}%
+ {\@notdefinable}%
+}
+%
+% finally, relayed command to do the actual job (same parameters as
+% \cs{@declare@fftn}, which has simply checked that we're allowed to
+% do this declaration)
+\newcommand\@declare@@fftn[3]{%
+ \edef\reserved@a{\expandafter\@gobble\string#2}%
+%
+% the actual command
+ \protected@edef#2{\protect\@fixed@footnote{\reserved@a}%
+ {#1}{#3}}%
+%
+% define the fixed foot serial number and page counters
+ \@definecounter{@\reserved@a @fftn@serial}%
+ \@namedef{@\reserved@a @fftn@curpage}{moocow}%
+ \@namedef{@\reserved@a @fftn@scanpage}{baalamb}%
+ \@namedef{@\reserved@a @fftn@pagelim}{-1}%
+%
+% now the things we want executed at end document:
+ \protected@edef\@tempa{%
+ \expandafter\protect\csname @\reserved@a @fftn@aux\endcsname}%
+ \protected@edef\@tempb{%
+ \expandafter\protect\csname @\reserved@a @fftn@scanpage\endcsname}%
+%
+% Note that \cs{AtEndDocument} has global effect\dots
+ \begingroup
+ \let\protect\noexpand
+ \edef\@tempc{\noexpand\AtEndDocument{%
+ \noexpand\clearpage
+ \noexpand\def\@tempa{%
+ \noexpand\@reprocess@fftn@mark{\reserved@a}}%
+ \noexpand\def\@tempb{oinkpig}}}%
+ \@tempc
+ \endgroup}%
+%
+% Stick a dummy \cs{@process@fftn@mark} into the |.aux| file, in
+% accordance with good practice for such things...
+\AtBeginDocument{\immediate\write\@auxout{\noexpand\providecommand
+ \noexpand\@process@fftn@mark[3]{}}}
+%
+% \@reprocess@fftn@mark#1#2#3 will deal (when we've written it) with a
+% fixed footnote mark in the .aux file at end document #1 footnote tag
+% #2 serial number #3 actual page... (What should it do???)
+%
+% the fundamental fixed footnote command:
+% the command \cs{}\meta{tag} which is supposed to generate a footnote
+% containing \meta{body}, generates a call
+% \@fixed@footnote\marg{tag}\marg{end-execution}\marg{body}
+\def\@fixed@footnote#1#2#3{%
+% #1 footnote tag
+% #2 \xspace or \relax
+% #3 footnote body
+%
+% count this footnote
+ \stepcounter{@#1@fftn@serial}%
+%
+% Is this serial beyond the limit of serial numbers destined for this
+% page?
+%\message{footnote #1 serial \csname the@#1@fftn@serial\endcsname\space
+% existing limit \csname @#1@fftn@pagelim\endcsname;}%
+ \ifnum\csname @#1@fftn@pagelim\endcsname <
+ \csname c@@#1@fftn@serial\endcsname
+%
+% so here we're going to have to create a new footnote, but let's
+% first find whether the |.aux| file scan at the start gave us a
+% range of serial numbers to share it with us:
+ \expandafter\let\expandafter\@tempa
+ \csname @#1@fftn-\the\csname c@@#1@fftn@serial\endcsname\endcsname
+ \ifx\@tempa\relax
+%\message{footnote #1 no limit to inherit from .aux file;}%
+ \else
+%\message{footnote #1 limit \@tempa;}%
+%
+% record the information from the file
+ \global\expandafter\let\csname @#1@fftn@pagelim\endcsname\@tempa
+ \fi
+%
+% create the footnote and record its number (whether we're going to
+% use it or not)
+ \footnote{#3}%
+ \expandafter\xdef\csname @#1@fftn@footnote\endcsname
+ {\the\c@footnote}%
+%\message{written new #1 footnote, number \the\c@footnote.}%
+%
+% if we're still on the same page as the previous footnote, create a
+% mark only
+ \else
+ \footnotemark[\csname @#1@fftn@footnote\endcsname]%
+%\message{reusing #1 footnote \csname @#1@fftn@footnote\endcsname.}%
+ \fi
+%
+% record which page `this' footnote appeared in the |.aux|
+ \protected@writeaux\relax{\protect\@process@fftn@mark{#1}%
+ {\the\csname c@@#1@fftn@serial\endcsname}{\noexpand\thepage}}%
+%
+% and finally insert the `end-command' stuff (this can be \cs{xspace}
+% or \cs{relax} if we're being called from a conventionally-defined
+% fixed footnote command, but could be anything, really, one
+% supposes!)
+ #2%
+ }
+%
+% \@process@fftn@mark#1#2#3 deals with a fixed footnote mark in
+% the .aux file at begin document;
+% arguments #1 footnote tag
+% #2 serial number
+% #3 actual page
+\newcommand\@process@fftn@mark[3]{%
+%\message{fftn #1 #2 #3;}%
+ \def\@tempa{#3}%
+ \expandafter\ifx\csname @#1@fftn@scanpage\endcsname\@tempa
+%\message{on same page as previous;}%
+ \else
+%
+% well, we're no longer on whatever was last recorded as the page of a
+% fixed footnote of this name -- record the serial
+ \expandafter\def\csname @#1@fftn@lastserial\endcsname{#2}%
+ \expandafter\let\csname @#1@fftn@scanpage\endcsname\@tempa
+ \fi
+%
+%
+%\message{setting limit for serial \csname @#1@fftn@lastserial\endcsname.}%
+ \expandafter\gdef\csname @#1@fftn-%
+ \csname @#1@fftn@lastserial\endcsname
+ \endcsname{#2}%
+}
+%
+% \@reprocess@fftn@mark#1#2#3 deals with a fixed footnote mark in
+% the .aux file at end document; arguments #1 footnote tag
+% #2 serial number #3 actual page
+\newcommand\@reprocess@fftn@mark[3]{}% pro tem
+%
+% use that when processing the .aux file at the end of the document
+\AtEndDocument{\let\@process@fftn@mark\@reprocess@fftn@mark}
+%
+% this command originates in Matt Swift's inclusion stuff; I use it
+% all over the place...
+\providecommand\protected@writeaux{%
+ \protected@write\@auxout
+}