% \iffalse %%% Style file `pfnote'. %%% Style file `fnpos'. %%% Style file `dblfnote'. %% Copyright (C) 1999 Hiroshi Nakashima %% (Toyohashi Univ. of Tech.) %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License distributed from CTAN %% archives in directory macros/latex/base/lppl.txt; either %% version 1 of the License, or any later version. %% % \fi % % \CheckSum{802} %% \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 %% %<*dtx> \ProvidesFile{yafoot.dtx} % %\def\next{LaTeX2e} %\ifx\fmtname\next %\def\next{ %\NeedsTeXFormat{LaTeX2e}[1994/12/01] %\ProvidesPackage{pfnote}} %\ProvidesPackage{fnpos}} %\ProvidesPackage{dblfnote}} %\else\def\next[#1]{}\fi %\next %\ProvidesFile{yafoot-man.tex} % \fi % \ProvidesFile{yafoot.dtx} [1999/07/14 v1.0 ] % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{pfnote} \usepackage{fnpos} \usepackage{dblfnote} \DisableCrossrefs \PageIndex \CodelineNumbered \RecordChanges % %\OnlyDescription %\def\ONLYDESCRIPTION{} %<*driver> \advance\textwidth4em \DFNcolumnsep1.5\columnsep \begin{document} \DocInput{yafoot.dtx} \end{document} % % \fi % \changes{v0.1}{1991/10/29} % {The style pfnote is born.} % \changes{v0.2}{1993/05/20} % {Footnote pushing function is posted to comp.text.tex.} % \changes{v0.3}{1993/08/17} % {Exchanging footnotes and bottom floats in fnpos is posted to % fj.comp.texhax.} % \changes{v0.4}{1995/06/21} % {First version of dblfnote is posted to comp.text.tex.} % \changes{v1.0}{1999/07/14} % {Three styles are merged into yafoot.dtx and rewritten.} % % \errorcontextlines10000 % \GetFileInfo{yafoot.dtx} % \setcounter{IndexColumns}{2} % % \def\bottomfraction{.9} % \def\cs#1{\hbox{\tt\char\escapechar#1}} % \def\Item{\vskip-\itemsep\vskip-\parsep\vskip0pt\item} % % \makeatletter % \def\nosv{\catcode`\|12} % % \def\eqnarray{\stepcounter{equation}\let\@currentlabel=\theequation % \global\@eqnswtrue % \global\@eqcnt\z@\tabskip\@centering\let\\=\@eqncr % $$\halign to \displaywidth\bgroup\hskip\@centering % $\displaystyle\tabskip\z@{##}$\@eqnsel&\global\@eqcnt\@ne % \hfil$\;{##}\;$\hfil % &\global\@eqcnt\tw@ $\displaystyle\tabskip\z@{##}$\hfil % \tabskip\@centering&\llap{##}\tabskip\z@\cr} % % \def\Meta#1{\penalty\@highpenalty % \hbox{{\tt\char`\{}{\it\meta{#1}}{\tt\char`\}}}} % \def\opt#1{{\tt[}{\it\meta{#1}}{\tt]}} % \def\optn#1{{\tt[#1]}} % \def\arg#1{{\tt\char`\{#1\char`\}}} % % \let\latex@addmarginpar\@addmarginpar % \let\latex@latex@warning@no@line\@latex@warning@no@line % \def\@addmarginpar{\let\@latex@warning@no@line\@gobble % \latex@addmarginpar % \let\@latex@warning@no@line\latex@latex@warning@no@line} % \let\@font@warning\@gobble % % \long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist % \edef\saved@macroname{\string#2} % \def\makelabel##1{\llap{##1\hskip\@totalleftmargin}} % \if@inlabel % \let\@tempa\@empty \count@\macro@cnt % \loop \ifnum\count@>\z@ % \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat % \edef\makelabel##1{\llap{\vtop to\baselineskip % {\@tempa\hbox{##1}\vss} % \hskip\@totalleftmargin}} % \advance \macro@cnt \@ne % \else \macro@cnt\@ne \fi % \edef\@tempa{\noexpand\item[ % #1 % \noexpand\PrintMacroName % \else % \noexpand\PrintEnvName % \fi % {\string#2}]} % \@tempa % \global\advance\c@CodelineNo\@ne % #1 % \SpecialMainIndex{#2}\nobreak % \DoNotIndex{#2} % \else % \SpecialMainEnvIndex{#2}\nobreak % \fi % \global\advance\c@CodelineNo\m@ne % \ignorespaces} % % \def\dummymacro{\topsep\MacroTopsep \trivlist \item[]} % \let\enddummymacro\endtrivlist % % \def\DescribeOpt{\leavevmode\@bsphack\begingroup\MakePrivateLetters % \Describe@Opt} % \def\Describe@Opt#1{\endgroup \Describe@pt{#1}} % \def\Describe@pt#1#2{ % \marginpar{\raggedleft\PrintDescribeMacro{#1}} % \SpecialOptUsageIndex{#1}{#2}} % \def\SpecialOptUsageIndex#1#2{ % \index{#1\actualchar{\protect\ttfamily#1} (#2)\encapchar usage} % \index{#2s:\levelchar{\protect\ttfamily#1}\encapchar usage} % \@esphack\ignorespaces} % \def\SpecialOptMainIndex#1#2{ % \index{#1\actualchar{\protect\ttfamily#1} (#2)\encapchar main} % \index{#2s:\levelchar{\protect\ttfamily#1}\encapchar main} % \@esphack\ignorespaces} % \def\SpecialOptIndex#1#2{ % \index{#1\actualchar{\protect\ttfamily#1} (#2)} % \index{#2s:\levelchar{\protect\ttfamily#1}} % \@esphack\ignorespaces} % \def\SpecialOptIndexS#1#2{ % \index{#1\actualchar{\protect\ttfamily#1} (#2)} % \index{#2es:\levelchar{\protect\ttfamily#1}} % \@esphack\ignorespaces} % % \begingroup % \gdef\@sverbcat{\catcode`\@\active\catcode`\#\active} % \catcode`\@\active \gdef@{\char`\@\penalty\exhyphenpenalty} % \catcode`\#\active \gdef#{\penalty\exhyphenpenalty} % \endgroup % \let\latex@sverb\@sverb % \def\@sverb{\@sverbcat\latex@sverb} % % \def\theglossary{\onecolumn \glossary@prologue % \GlossaryParms \let\item\@idxitem \ignorespaces} % \def\endtheglossary{\relax} % % % % \def\bracepair{`{\tt\char`\{\char`\}'}} % % \ifx\ONLYDESCRIPTION\undefined\else % \let\SpecialUsageIndex\SpecialMainIndex % \let\SpecialOptUsageIndex\SpecialOptMainIndex % \fi % % % % \title{\textsf{pfnote}, \textsf{fnpos} and \textsf{dblfnote}\\ % Packages for Footnotes\thanks{ % This file has version number \fileversion, last revised \filedate.}} % \author{Hiroshi Nakashima\\(Toyohashi Univ. of Tech.)} % \date{\filedate} % \maketitle % % \begin{abstract} % This file provides three style files; \textsf{pfnote} to enclose footnote % numbering in a page; \textsf{fnpos} to control the vertical position of % footnotes; \textsf{dblfnote} to make footnote double-columned. % \end{abstract} % % \tableofcontents % \newpage % % % \section{Introduction} % \label{sec:intro} % % \LaTeX{} users often bother about fine points of footnote. How can I % reset |footnote| counter when a page is produced in order to keep the % counter from having too large, say 30, in a document with many footnotes? % How can I place footnotes at more appropriate position? How can I make % footnotes double-columned while main text is single-columned? % % The style files distributed with this document will solve these problems. % You will have the following three style files by processing % \textsf{yafoot.dtx}\footnote{ % % It stands for ``Yet Another FOOTnote.''} % % with \textsf{docstrip}. % % \begin{description} % \item[\textsf{pfnote}] % \DescribeOpt{pfnote}{style file} % provides a new version of |\footnote| to make footnote numbering enclosed % in a page. That is, the counter |footnote| is reset whenever a page is % produced and thus the first footnote in a page is numbered 1 no matter how % it stands in the sequence of footnotes in a document. Since this document % itself uses \textsf{pfnote}, you will see how footnotes are numbered. % % \item[\textsf{fnpos}] % \DescribeOpt{fnpos}{style file} % provides following commands to control the vertical position of footnotes. % % \begin{itemize} % \item % \DescribeMacro{\makeFNbottom} % \DescribeMacro{\makeFNmid} % |\makeFNbottom| makes footnotes always placed at the bottom of a % |\ragged#bottom| page, while |\makeFNmid| allows footnotes directly follow % the main text of a page as standard \LaTeX{} does. % % \item % \DescribeMacro{\makeFNbelow} % \DescribeMacro{\makeFNabove} % |\makeFNbelow| places footnotes below bottom floats (i.e. figures and % tables), while |\makeFNabove| is to place footnotes above bottom floats as % standard \LaTeX{} does. % \end{itemize} % % This document also uses \textsf{fnpos} to make footnotes {\em bottom} and % {\em below}\footnote{ % % But the effect will be hardly seen except in the right column of % page~\pageref{pag:shfnp-2} where we show the effect explicitly.}. % % The first version of these commands are posted by the author to news % groups |comp.text.tex| and |fj.comp.texhax| as the answers to the posts by % Martin Boyer and Nobuaki Minematsu. % % \item[\textsf{dblfnote}] % \DescribeOpt{dblfnote}{style file} % makes footnotes double-columned. It also provides a few commands to % control column breaking. The first version of the style file is created % for Tim Armstrong's post to |comp.text.tex|. Since this document uses % \textsf{fnpos}, you will find that the footnotes\footnote{ %. % This document has many footnotes, some of which are just to show how our % footnote mechanisms work.} % % in this page are double-columned. % \end{description} % % Note that these style files may be used either solely, or combined each % other as done in this document. % % % % \section{Usage} % \label{sec:usage} % \subsection{Loading Style Files} % \label{sec:usage-load} % % All the three style files are usable to both \LaTeXe{} and \LaTeX-2.09 % users with their standard package loading declaration. If you use % \LaTeXe{} and wish to load, for example, \textsf{pfnote} and % \textsf{fnpos}, simply do the following. % % \begin{quote} % \SpecialUsageIndex{\usepackage} % |\usepackage{pfnote}|\\ % |\usepackage{fnpos}| % \end{quote} % % If you still love \LaTeX-2.09, the following is what you have to do. % % \begin{quote} % \SpecialUsageIndex{\documentstyle} % |\documentstyle[..,pfnote,fnpos,...]|\Meta{main-style} % \end{quote} % % Note that any combination of three styles are allowed and they are % insensitive to their loading order. % % % % \subsection{\textsf{pfnote}: Enclose Footnote Numbers within a Page} % \label{sec:usage-pfnote} % % \DescribeOpt{pfnote}{style file} % Just loading \textsf{pfnote} is everything that you have to do to make % footnote numbering enclosed in a page\footnote{ % % Here you will find this fourth footnote is numbered one.}. % % Only one thing you have to remember is that footnote numbers will be % adjusted after you run \LaTeX{} {\em twice}, as |\ref|-erences to % |\label|-s are. % % % % \subsection{\textsf{fnpos}: Control Vertical Position of Footnotes} % \label{sec:usage-fnpos} % % \DescribeOpt{fnpos}{style file} % The following four commands are available to control the vertical position % of footnotes. % % \begin{description} % \item[\cs{makeFNbottom}] % \DescribeMacro{\makeFNbottom} % \SpecialIndex{\raggedbottom} % makes footnotes always placed at the bottom of a |\raggedbottom| page, % even if the page is too short to push the footnotes to its bottom because, % for example, the page is broken just before a tall object such as a % |tabular|. This is default. % % \item[\cs{makeFNmid}] % \DescribeMacro{\maekFNmid} % cancels the effect of |\makeFNbottom| to allow footnotes directly follow % the main text of a page as standard \LaTeX{} does. % % \item[\cs{makeFNbelow}] % \DescribeMacro{\maekFNbelow} % places footnotes {\em below} bottom floats (i.e. figures and tables). % This is default. % % \item[\cs{makeFNabove}] % \DescribeMacro{\maekFNabove} % cancels the effect of |\makeFNabove| to place footnotes {\em above} bottom % floats as standard \LaTeX{} does. % \end{description} % % Note that if you are using p\LaTeX{}, a Japanese version of \LaTeX, it % might be unnecessary to use \textsf{pfnote} because p\LaTeX{} does what % |\makeFNbottom| and |\makeFNbelow| do\footnote{ % % Very strictly speaking, the mechanism of p\LaTeX{} is slightly different % from that of \textsf{fnpos} but the difference is hardly recognizable.}. % % However, if you wish to follow the real \LaTeX's standard, |\makeFNmid| % and |\makeFNabove| will do for you. % % The following two two-columned pages show the effects of the commands. % % \newpage % \twocolumn % \def\showfnposleaders{\xleaders % \hbox to\hsize{\hss.\vrule height.3\baselineskip width0pt\hss}\vfil} % \def\showfnpos#1#2#3{\par#1#2\noindent % This column is typeset with \texttt{\string#1} and \texttt{\string#2} % \footnote{#3}.\par\nobreak % \vbox to.4\textheight{ % \showfnposleaders\smallskip % \centerline{(Main text of this column is here.)}\smallskip % \showfnposleaders} % \begin{figure}[b] % \fboxsep0pt % \hbox{\fbox{\vbox to.4\textheight{\vfil % \centerline{Here is a bottom float.}\vfil}}} % \end{figure} % \break} % % \label{pag:shfnp-1} % \showfnpos\makeFNmid\makeFNabove{ % Therefore, this footnote is {\em above} the bottom float leaving % spaces at the bottom of this column.} % % \showfnpos\makeFNmid\makeFNbelow{ % Therefore, this footnote is {\em below} the bottom float still % leaving spaces at the bottom of this column.} % % \label{pag:shfnp-2} % \showfnpos\makeFNbottom\makeFNabove{ % Therefore, this footnote is {\em above} the bottom float that is % pushed to the {\em bottom} of this column together with this footnote.} % % \showfnpos\makeFNbottom\makeFNbelow{ % Therefore, this footnote is {\em below} the bottom float, and at the % {\em bottom} of this column alone.} % % % % \newpage % \onecolumn\par % \subsection{\textsf{dblfnote}: Make Footnotes Double-Columned} % % \DescribeOpt{dblfnote}{style file} % Simply loading \textsf{dblfnote} will make footnotes double-columned. For % fine tuning of double-columning, however, you have a few style parameters % and commands as follows. % % \begin{description} % \item[\texttt{DFNsloppiness}] % \DescribeOpt{DFNsloppiness}{counter}% % defines how sloppy paragrahs in footnotes are typeset. Since lines of % footnotes are narrow, you might wish to typeset footnotes in some % |\sloppy| manner in order to avoid underfull. Setting |DFNsloppiness| to % larger value up to 9999, footnote paragraphs will be sloppier. The % default is 5000. % % \item[\cs{DFNcolumnsep}] % \begin{DFNinhibitcbreak}% % \DescribeMacro{\DFNcolumnsep}% % \SpecialIndex{\columnsep}% % is the distance of footnote columns is specified by the value of % |\DFNcolumn#sep|. If you don't set this parameter explicitly\footnote{ % % Strictly speaking, unless you set a non-negative value in the document % preamble.}, % % the value is that of |\columnsep|. For example, the author set % |\DFNcolumnsep| to $1.5\times\hbox{|\columnsep|}$ in this document. % \end{DFNinhibitcbreak} % % \item[\cs{DFNcolumnwidth}] % \DescribeMacro{\DFNcolumnwidth}% % is the width of a footnote column. If you don't set this parameter % explicitly, as expected, it is automatically set to % $(|\textwidth|-|\DFNcolumnsep|)/2$. % % \item[\cs{DFNallowcbreak}] % \DescribeMacro{\DFNallowcbreak} % \DescribeMacro{\DFNinhibitcbreak} % allows a footnote is broken into two columns, while {\bfseries % |\DFNinhibitcbreak|} inhibits it. In default, column breaking is allowed. % % \item[\cs{DFNtrysingle}] % \DescribeMacro{\DFNtrysingle} % \DescribeMacro{\DFNalwaysdouble} % places footnotes only in the left column if the page containing them has % enough space as shown in pages~1, % \pageref{sec:usage-fnpos} and this page, while {\bfseries % |\DFNalwaysdouble|} makes them double-columned (almost) always. In % default, single-columning is tried. % % \item[\cs{DFNruleleft}] % \DescribeMacro{\DFNruleleft} % \DescribeMacro{\DFNruleboth} % draws |\footnoterule| over footnotes in left column only, while {\bfseries % |\DFNrule#both|} draws in both columns. In default, the rule is drawn in % left column only. % \end{description} % % \SpecialIndex{\twocolumn} % \SpecialIndex{\onecolumn} % Note that \textsf{dblfnote} will do nothing if |\twocolumn| is in effect, % as shown in pages~\pageref{pag:shfnp-1} and~\pageref{pag:shfnp-2}. That % is, footnotes are put as in usual double-coulumned document. If you % change the page structure to |\onecolumn|, the mechanism of % \textsf{dblfnote} is enabled again as shown in this page. % % % \section{Known Problems} % \label{sec:prob} % % \begin{enumerate} % \item % \SpecialOptIndex{minipage}{environment} % The style \textsf{pfnote} does not enlose the number of footnotes in % |minipage| environment. % % \item % The style \textsf{dblfnote} may mistakingly produce a little bit too % short pages if an extremely long paragraph has footnotes. More % specifically, if a paragraph runs across three or more pages $p_1$, % \ldots, $p_n$, and its first and last footnote appears in $p_i$ ($i\leq n-2$) % and $p_j$ ($j>i$), pages $p_{i+1}$ to $p_j$ may be a little bit too short % especially for those without footnotes. % \end{enumerate} % % % % \IndexPrologue{\newpage\section*{Index} % Underlined number refers to the page where the specification of % corresponding entry is described.} % \StopEventually{ % \section*{Acknowledgments} % % The author thanks to Martin Boyer and Nobuaki Minematsu whose posts to % news groups triggered writing very first version of macros in % \textsf{fnpos}. He also thanks to Tim Armstrong whose post to % \texttt{comp.text.tex} encouraged him to make the first version of % \textsf{dblfnote} that requires considerable hack. % % For the implementation of three style files, the author refers the base % implementations of the macros for \cs{footnote} and for \cs{output} % routine. These macros are written by Leslie Lamport as a part of % \LaTeX-2.09 and \LaTeXe{} (1997/12/01) to which Johannes Braams and other % authors also contributed. % % \PrintIndex} % % % % \newpage % \section{Implementation} % \label{sec:imp} % \subsection{Tricks for Compatibility} % \label{sec:imp-compat} % % At the very beginning of each style file, we checks whether it is % loaded by \LaTeXe{} or \LaTeX-2.09, and then declares |\NeedsTeXFormat| % and |\ProvidesPackage| if \LaTeXe{}. This part is embedded at the % beginning of \textsf{yafoot.dtx} in a tricky manner to let % \textsf{docstrip} produce the following code, for example for % \textsf{pfnote}. % \SpecialIndex{\NeedsTeXFormat} % \SpecialIndex{\ProvidesPackage} % %\begin{quote} %\begin{verbatim} %\def\next{LaTeX2e} %\ifx\fmtname\next %\def\next{ %\NeedsTeXFormat{LaTeX2e}[1994/12/01] %\ProvidesPackage{pfnote}} %\else\def\next[#1]{}\fi %\next %[1999/07/14 v1.0 ] %\end{verbatim} %\end{quote} % % % % \subsection{\textsf{pfnote}} % \label{sec:imp-pfnote} % % \iffalse %<*pfnote> % \fi % To enclose |\c@footnote| within a page, we identify each footnote $f_i$ % by a global serial number $i$ and associate it with the {\em physical} % page number $p_i$ where it appears. These attributes $i$ and $p_i$ are % written to |.aux| file in the form of |\pfn@fnote|\Meta{$i$}\Meta{$p_i$}. % This macro is evaluated in \LaTeX's |\document| and |\def|-ines a macro % whose name is ``|\pfn@fn|\meta{$i$}'' and body is \meta{$p_i$}. % % Then, when we process the footnote $f_i$, we can have $p_i$ by evaluating % |\pfn@fn|\meta{$i$} and compare it with $p_{i-1}$. If $p_i=p_{i-1}$, % $f_i$ is the first footnote in page $p_i$ and thus its number should be % one. Otherwise, the number of $f_i$ should be that of $f_{i-1}$ plus one. % % \begin{macro}{\pfn@fnotectr} % \begin{macro}{\pfn@page} % \begin{macro}{\pfn@pageprev} % To implement the algorithm shown above, we use three |\count| registers; % |\pfn@fnotectr| for $i$ initialized to zero; |\pfn@page| for physical page % number initialized to one; and |\pfn@pageprev| to keep $p_{i-1}$ with % initial value zero. Note that |\pfn@page| is not |\c@page| but has % physical page number, and thus any $p_i$ cannot be zero that is the initial % value of |\pfn@pageprev|. % \end{macro}\end{macro}\end{macro} % % \begin{macrocode} \newcount\pfn@fnotectr \pfn@fnotectr\z@ \newcount\pfn@page \pfn@page\@ne \newcount\pfn@pageprev \pfn@pageprev\z@ % \end{macrocode} % % \begin{macro}{\pfn@footnote} % \begin{macro}{\footnote} % \begin{macro}{\pfn@footnotemark} % \begin{macro}{\footnotemark} % \begin{macro}{\pfn@mpfn} % We have to modify |\footnote| and |\footnotemark| so that they invoke % |\pfn@adjust| to do what we described at the beginning of this section, if % they refer and increment |\c@footnote|. In order to minimize % copy-and-modify of their original codes, we simply call their original % versions, |\pfn@footnote| and |\pfn@footnotemark|, if optional argument is % given accepting a little bit performance degradation by double checking of % the optional argument\footnote{ % % We of course know that we can call \cs{@xfootnote} and % \cs{@xfootnotemark}, but this implementation is safer.}. % % Otherwise, |\pfn@adjust| is invoked if |\@mpfn| is ``|footnote|'', the % body of |\pfn@mpfn| in the case of |\footnote|, or always in the case of % |\footnotemark|. Thus |mpfootnote| is eliminated from our mechanism as % shown in \S\ref{sec:prob}, although including it is not hard. % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macrocode} \let\pfn@footnote\footnote \def\footnote{\@ifnextchar[%] {\pfn@footnote}% {\ifx\@mpfn\pfn@mpfn \pfn@adjust \fi \pfn@footnote}} \let\pfn@footnotemark\footnotemark \def\footnotemark{\@ifnextchar[%] {\pfn@footnotemark}{\pfn@adjust \pfn@footnotemark}} \let\pfn@mpfn\@mpfn % \end{macrocode} % % \begin{macro}{\pfn@adjust} % The main procedure of enclosing is performed by |\pfn@adjust|. First, % after |\global|-ly incrementing |\pfn@fnotectr| ($i$), it |\write|-s % |\pfn@fnpage|\Meta{$i$}\Meta{$P$} by well-known technique of the % combination of delayed evaluation of physical page number $P$ and % immediate evaluation of other staffs. % % Then it obtains $p_i$ by evaluating |\pfn@fn|$i$ and compares it to % $p_{i-1}$ in |\pfn@pageprev|. If they are not equal, |\c@footnote| is % reset to make $f_i$ have number one, and |\pfn@pageprev| is set to $p_i$. % Since we also reset |\c@footnote| if |\pfn@fn|$i$ is undefined, all the % footnotes will have number one on the first run of \LaTeX{} for a % document. % \end{macro} % % \begin{macrocode} \def\pfn@adjust{\global\advance\pfn@fnotectr by\@ne \if@filesw \edef\@tempa{\write\@auxout{\string\pfn@fnpage {\number\pfn@fnotectr}% {\noexpand\number\noexpand\pfn@page}}}\@tempa \fi \expandafter\ifx\csname pfn@fn\number\pfn@fnotectr\endcsname\relax \global\c@footnote\z@ \else \expandafter\@tempcnta\csname pfn@fn\number\pfn@fnotectr\endcsname \relax \ifnum\@tempcnta=\pfn@pageprev\else \global\pfn@pageprev\@tempcnta \global\c@footnote\z@ \fi \fi} % \end{macrocode} % % \begin{macro}{\pfn@fnpage} % The macro |\pfn@fnpage|\Meta{$i$}\Meta{$p_i$} written in |.aux| and % evaluated in |\document| simply |\def|-ines |\pfn@fn|$i$ with the body % $p_i$. % \end{macro} % % \begin{macrocode} \def\pfn@fnpage#1#2{\global\@namedef{pfn@fn#1}{#2}} % \end{macrocode} % % \begin{macro}{\pfn@outputpage} % \begin{macro}{\@outputpage} % To keep track physical page number in |\pfn@page|, we modify % |\@outputpage| so that it increments |\pfn@page| when it does |\c@page|. % \end{macro}\end{macro} % % \begin{macrocode} \let\pfn@outputpage\@outputpage \def\@outputpage{\pfn@outputpage \global\advance\pfn@page\@ne} % \end{macrocode} % % \iffalse % % \fi % % % % \subsection{\textsf{fnpos}} % \label{sec:imp-fnpos} % % \iffalse %<*fnpos> % \fi % \begin{macro}{\iffnp@bottom} % \begin{macro}{\iffnp@below} % To control the position of footnotes, we introduce two switches; % |\iffnp@bottom| is true if |\makeFNbottom| is in effect; |\iffnp@below| % is true if |\makeFNbelow| is in effect. In default, they both are true. % \end{macro}\end{macro} % % \begin{macrocode} \newif\iffnp@bottom \fnp@bottomtrue \newif\iffnp@below \fnp@belowtrue % \end{macrocode} % % \newpage % \begin{macro}{\makeFNbottom} % \begin{macro}{\makeFNmid} % \begin{macro}{\makeFNbelow} % \begin{macro}{\makeFNabove} % User interface macros are trivial, i.e. they turn the switches true or false. % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macrocode} \def\makeFNbottom{\fnp@bottomtrue} \def\makeFNmid{\fnp@bottomfalse} \def\makeFNbelow{\fnp@belowtrue} \def\makeFNabove{\fnp@belowfalse} % \end{macrocode} % % \begin{macro}{\@makecol} % \begin{macro}{\fnp@textbottom} % The essential part of \textsf{fnpos} is a modified version of |\@makecol|. % If |\iffnp@below| is true, we reverse the order of |\@combinefloats| and % the insertion of |\footins|. At the insertion of |\footins|, we insert % |\@textbottom| prior to |\footins| to push it to the bottom if % |\iffnp@bottom| is true. We also temporarily nullify |\@textbottom|, % whose definition is saved into |\fnp@textbottom|, if it has been inserted % with |\footins| in order to keep the following |\@outputbox| construction % in |\@makecol| or |\@makespecialcolbox| from inserting it again. % % Here we discuss a few compatibility issues. In \LaTeXe, |\footins| % inserted in the construct of |\color@begroup| and |\color@endgroup| which % \LaTeX-2.09 does not have. Thus we call them and |\normalcolor| by % |\csname|\slash |\endcsname| construct to allow they are undefined. % % The |\insert|-ion object |\@kludgeins| and the macro |\@makespecialcolbox| % are also \LaTeXe's new comers for |\enlargethispage|. For \LaTeX-2.09, we % make |\@klugeins| |\let|-equal to |\voidb@x| that will never be a |\vbox|, % and thus |\@makespecialcolbox| will never be expanded. % % We also have to take care of p\LaTeX{} whose |\@makespecialcolbox| inserts % |\footins| and |\@texbottom| as we do for |\makeFNbottom| and % |\makeFNbelow|. However, since |\footins| is set to void by our insertion % and |\@textbottom| is nullified if |\iffnp@bottom| is true, these % insertions will have no effect as have to be. % \end{macro}\end{macro} % % \begin{macrocode} \def\@makecol{\setbox\@outputbox\box\@cclv \xdef\@freelist{\@freelist\@midlist}\global\let\@midlist\@empty \iffnp@below \@combinefloats \fi \let\fnp@textbottom\@textbottom \ifvoid\footins\else \setbox\@outputbox\vbox{\boxmaxdepth\maxdepth \unvbox\@outputbox \iffnp@bottom \@textbottom \fi \vskip\skip\footins \csname color@begingroup \endcsname \csname normalcolor \endcsname \footnoterule \unvbox\footins \csname color@endgroup \endcsname}% \iffnp@bottom \let\@textbottom\relax \fi \fi \iffnp@below\else \@combinefloats \fi \ifvbox\@kludgeins \@makespecialcolbox \else \setbox\@outputbox\vbox to\@colht{\@texttop \dimen@\dp\@outputbox \unvbox\@outputbox \vskip-\dimen@ \@textbottom}\fi \let\@textbottom\fnp@textbottom \global \maxdepth \@maxdepth} \ifx\@kludgeins\undefined \let\@kludgeins\voidb@x \fi % \end{macrocode} % % \iffalse % % \fi % % % \subsection{\textsf{dblfnote}} % \label{sec:imp-dblfnote} % % \iffalse %<*dblfnote> % \fi % % \subsubsection{Problems and Solutions} % \label{sec:imp-dfn-ovv} % % \def\DH{{\mit\Delta}H} % % \LaTeX's |\footnote| utilizes \TeX's mechanism |\insert| that is perfectly % fit to the purpose. Roughly speaking, |\footnote|\Meta{text} invokes % |\insert\footins|\Meta{text$'$} to do the following. % % \begin{enumerate} % \item % \meta{text$'$} is kept in a special place, properly contributing to % \TeX's page breaking mechanism with their height and depth. % % \item % When the |\output| routine is invoked with the contents of a page % including {\em footnoted} text, it is also given \meta{text$'$}, together % with other |\footnote| texts which should appear in the page, through the % box |\footins|. The page breaking mechanism will never, well hardly % ever\footnote{ % % See Exercise 15.13 of \TeX{}book for the possibility of placing a footnote % text in a page other than that its reference appears.}, % % miss to couple \meta{text$'$} and its reference in main text. % % \item % The |\output| routine put |\footins| at the bottom of the page. % \end{enumerate} % % This simple mechanism, however, cannot be straightforwardly applied to our % double-columned footnotes. The major difficulty lies in the fact that % when |\footnote| is processed we cannot know how \meta{text$'$} % contributes to the page in which it and its reference appear after it is % double-columned with other footnote texts. For example, \TeX{}book shows % a simple estimation method setting |\count\footnote| to 500 so that a half % (500/1000) of the height plus depth of \meta{text$'$} contributes to the % page. This method, however, will underestimate the contribution of % \meta{text$'$} having three lines, which will be broken into two and one % lines and thus finally has two line height, by assuming the contribution % is one and a half lines. Thus we have to have a better estimation method. % % Another problem is that, even if we estimate the contribution better, we % cannot directly |\insert| \meta{text$'$} because its {\em natural} height % plus depth may be different from the estimated contribution. Note that % changing the magnification factor in |\count\footins| dynamically is not % good idea because its value is referred by the page breaking mechanism not % at the time when we do |\insert| but when the paragraph including % |\footnote| is completed possibly after other |\footnote|-s change the % factor again. Also note that we cannot give up using |\insert| and adopt % a method similar to that for floats\footnote{ % % As the buggy implementation of earlier version of \textsf{dblfnote}.}, % % because a float may be decoupled from its reference and {\em float} to % another page. Thus we have to |\insert| something other than % \meta{text$'$} while keeping it in some other place. % % To solve these problems, the following algorithm is devised for % \textsf{dblfnote}. Let $f_1$, \ldots, $f_{i-1}$ be footnote texts which % have not yet been |\output|, and $f_i$ be that which we now process. Let % $H_i$ be the height plus depth of double-columned typesetting result of % $f_1$, \ldots, $f_i$, which can be obtained by tentatively doing that. We % estimate the contribution of $f_i$ to the page as $\DH_i=H_i-H_{i-1}$, % which will be exact if $f_1$, \ldots, $f_i$ is put in a page\footnote{ % % As discussed later, this condition does not always hold and thus we will % have an error.}. % % Then we |\insert| an empty box whose height is $\DH_i$ through |\footins|, % while appending $f_i$ to the tail of |\vbox| $F$, which has contained % $f_1$, \ldots, $f_{i-1}$, so that the |\output| routine and following % |\footnote|-s refer it. % % When the |\output| routine is invoked, we have $f_1$, \ldots, $f_n$ in % $F$, and \TeX{} moved $m$ ($m\leq n$) |\insert|-ed empty |\vbox|-es into % the box |\footins|. Thus we have to know $m$ and have to pick $f_1$, % \ldots, $f_m$ from $F$. Since $m$ is the number of |\vbox|-es in % |\footins|, we can count them by a well-known technique of iterative % |\unvbox| and |\lastbox|\footnote{ % % Since \cs{footins} contains only a sequence of empty \cs{vbox}-es, i.e. no % glues, penalties nor other troublesome stuffs, we can count \cs{vbox}-es % exactly.}. % % In order to pick $f_1$, \ldots, $f_m$, we maintain a list % $L=\{h_1,\ldots,h_n\}$ where $h_i$ is the height plus depth of $f_i$ and % calculate $s_m=\sum_{i=1}^m h_i$. With this $s_m$, we can |\vsplit| the % box $F$ to obtain a |\vbox| $F'$ containing $f_1$, \ldots, $f_m$ and to % leave $f_{m+1}, \ldots, f_n$ in $F$. We also remove $h_1$, \ldots, $h_m$ % from $L$. Then we |\vsplit| $F'$ into two columns to have what we finally % put at the bottom of the page. % % If $m=n$, that is, if all the |\footnote|-s that have occurred are combined % with the page, we have no problem to finish the |\output| routine and to % continue the process. If $m\z@\else \dfn@dima1sp\relax \setbox\dfn@boxa\vbox{\vbox to1sp{\unvbox\dfn@boxa\vfil}}\fi \global\setbox\dfn@ins\vbox{\boxmaxdepth\dfn@fnmaxdp \ifvoid\dfn@ins\else \unvbox\dfn@ins \allowbreak \nointerlineskip \fi \ifdfn@allowcbreak \unvbox \else \box \fi \dfn@boxa}% \setbox\dfn@boxa\copy\dfn@ins \dfn@split{.5\ht\dfn@boxa}\dfn@boxa\dfn@boxb\dfn@fnmaxdp\footnotesep \advance\@tempdima\@tempdimb \@tempdimb\@tempdima \advance\@tempdima-\dfn@fnht \global\dfn@fnht\@tempdimb \insert\footins{\floatingpenalty\@MM \vbox to\@tempdima{}}% \xdef\dfn@list{\dfn@list\@elt{\number\dfn@dima}{\number\@tempdima}}}} \let\dfn@latex@footnotetext\@footnotetext \let\@footnotetext\dfn@footnotetext \long\def\dfn@gobble#1#2{#2} \let\dfn@makefnmark\@makefnmark \def\dfn@list{} \def\dfn@split#1#2#3#4#5{\@tempdima#1\relax \vbadness\@M \vfuzz\maxdimen \splitmaxdepth#4\splittopskip#5\relax \setbox#3\vsplit#2to\@tempdima \setbox#3\vbox{\boxmaxdepth#4\unvbox#3}% \@tempdima\ht#3\advance\@tempdima\dp#3\relax \@tempdimb\ht#2\advance\@tempdimb\dp#2\relax \ifdim\@tempdimb<\@tempdima \@tempdimb\@tempdima \fi \@tempdima\ht#3\ifdim\@tempdima<\ht#2\@tempdima\ht#2\fi \advance\@tempdimb-\@tempdima} %%^L % \end{macrocode} % % % % \subsubsection{Output Footnotes} % \label{sec:imp-dfn-makecol} % % \begin{macro}{\dfn@makecol} % The other part of our algorithm described in \S\ref{sec:imp-dfn-ovv} is % implemented as our own version of |\@makecol|, named |\dfn@makecol|. % First we check if |\footins| has |\insert|-ed empty boxes for $f_1$, % \ldots, $f_m$, and do (almost) nothing if none. Then we get $H_m$ % (|\dfn@dima|) that is the height of |\footins|. % \end{macro} % % \begin{macro}{\dfn@countins} % Next we count the boxes in |\footins| to get $m$ (|\@tempcnta|) by % |\dfn@countins|. It repeatedly removes the |\lastbox| of |\footins| % counting up $m$ until no box is obtained. % \end{macro} % % \begin{macro}{\dfn@elt@getht} % \begin{macro}{\dfn@endgetht} % Then we {\em execute} $L$ (|\dfn@list|) making |\@elt| |\let|-equal to % |\dfn@elt@getht| to calculate $s_m=\sum_{i=1}^m h_i$ (|\@tempdima|). This % execution also removes $(h_1,\DH_1)$, \ldots, $(h_m,\DH_m)$ from $L$ by % |\dfn@endgetht|. % \end{macro}\end{macro} % % \begin{dummymacro} % Note that $s_m$ could be zero if |\footins| only has |\vbox|-es for error % compensation, i.e.\ $(0,\eta)$ and/or $(0,\eta')$. In this case, we don't % have any footnotes to be output. This decision is correct because we % enclosed footnotes having non-positive height by a |\vbox| of 1\,|sp| high % as described in \S\ref{sec:imp-dfn-fntext}. Thus we can safely pick $f_1$, % \ldots, $f_m$ from $F$ by |\vsplit|-ting it at $s_m$ by |\dfn@split| % \footnote{ % % Unfortunately, this is not perfectly safe because $f_i$ may have % stretchable and/or shrinkable glues together with negative penalties which % could make the break point between $f_m$ and $f_{m+1}$ not least costly. % Although we could have a perfect solution to cope with this unsafeness, we % ignore such an unusual case because of the simplicity of implementation.}, % % and store them in |\dfn@boxa|. % \end{dummymacro} % % \begin{dummymacro} % Then if |\dfn@trysingle| is true, we check whether the page has enough % space to put $f_1$, \ldots, $f_m$ in one column by examining the following % inequality; % $$ % r\geq h_p+h_d+\sigma+s_m % $$ % where $r$ is |\@colroom|, $h_p$ and $h_d$ are height and depth of the body % of the page given through |\box\@cclv|, and $\sigma$ is natural space of % |\skip\footins|\footnote{ % % Thus we ignore the shrinkability of the page body and \cs{skip}\cs{footins}, % because the former is hardly obtained. Remember \cs{pageshrink} is not the % total shrinkability at the break point but at somewhere \cs{output} routine % is invoked.}. % % Note that $h_p$ and $h_d$ are {\em not} height and depth of |\box\@cclv|, % which are |\pagegoal| and depth of the last item (or |\maxdepth|), but % those of the |\vbox| containing |\unvbox\@cclv|\footnote{ % % \TeX{} does not provide any other more convenient way to get them.}. % % If the inequality is satisfied, $f_1$, \ldots, $f_m$ are simply put into % the box |\footins| together with |\footnoterule| preceding them. % \end{dummymacro} % % \begin{dummymacro} % Otherwise, we split $f_1$, \ldots, $f_m$ at $H_m$ by |\dfn@split| to % obtain both columns to output. Then each column, preceded by % |\footnoterule| and follwed by |\vss|, is put into a |\vbox| whose height % is {\em conceptual} one calculated by |\dfn@split| so that first baselines % of both column are adjusted. This also adjusts the last baseline of taller % column with those of footnotes in other pages if |\makeFNbottom| of % \textsf{fnpos} is in effect. Note that |\footnoterule| of the right % column will not be put if |\ifdfn@ruleboth| is false, but a vertical space % to compensate the height and depth of |\footnoterule| is although it is % usually zero. For the completeness, we don't forget to set |\prevdepth| % to the depth of |\footnoterule| though it has also no effect. % \end{dummymacro} % % \begin{dummymacro} % Then two boxes are put into |\hbox|-es of |\DFNcolumnwidth| wide separated % by a space of |\DFNcolumnsep| surrounded by another |\hbox|. This outmost % |\hbox| is redundantly enclosed by a |\vbox| to which |\footins| is set, % because it will be unsealed by |\unvbox| afterward. % \end{dummymacro} % % \begin{macro}{\dfn@elt@adjust} % Now we finished the job for footnotes to be output to the current page, % and start to take care of those left in $L$ and defered to the next (or % farther) page. First, we {\em execute} $L$ (|\dfn@list|) making |\@elt| % |\let|-equal to |\dfn@elt@adjust| to calculate $\eta$ (|\dfn@dimb|) of the % equation (\ref{eq:eta}) in \S\ref{sec:imp-dfn-ovv}. It also calculate % $H'_n$ (|\@tempdima|) and $\sum_{j=m+1}^n H_i$ (|\dfn@fnht|) for $\eta'$ % of the equation (\ref{eq:eta'}) in \S\ref{sec:imp-dfn-ovv}. % \end{macro} % % \begin{dummymacro} % Then if $\eta$ is positive, we add $(0,\eta)$ to the head of $L$ and % |\insert| an empty box of $\eta$ high to compensate the underestimation. % Since \TeX{} places the vertical list constructed in |\output| routine % at the page break point, the |\insert|-ion for $\eta$ is followed by those % for $f_{m+1}$, \ldots, $f_n$. % \end{dummymacro} % % \begin{macro}{\output} % \begin{macro}{\dfn@afteroutput} % We also add $(0,\eta')$ to the tail of $L$ and |\insert| an empty box of % $\eta'$ high to compenstate the overestimation caused by $\eta$, if % $\eta'$ is negative. This |\insert|-ion, however, should follow % $f_{m+1}$, \ldots, $f_n$. To do this delayed |\insert|-ion, we modify % |\output| so that it invoke |\dfn@afteroutput| through |\aftergroup|. % Since \TeX{} closes the implicit group for |\output| {\em after} it % reconstructs main vertical list\footnote{ % % This fact is not described in \TeX{}book but \texttt{tex.web} does so.}, % % |\dfn@afteroutput| will |\insert| the box where we wish to place and % then nullify itself. % \end{macro}\end{macro} % % \begin{macro}{\dfn@footnoterule} % Now we finished everything for doulbe-columned footnotes. So, we call % \LaTeX's \hbox{|\@make|}\allowbreak\hbox{|col|}, |\dfn@latex@makecol|, to % make a page with |\footins|. Since the macro calls |\footnoterule| before % |\footins| is put and we have already done it, we temporarily nullify % |\footnoterule| and reactivate it after the macro with its original % definition saved in |\dfn@footnoterule|. % \end{macro} % % \begin{macrocode} %% Output Footnotes \def\dfn@makecol{{\ifvoid\footins\else \dfn@dima\ht\footins \@tempcnta\z@ \dfn@countins \@tempdima\z@ \let\@elt\dfn@elt@getht \dfn@list\@nil \ifdim\@tempdima=\z@\else \dfn@split\@tempdima\dfn@ins\dfn@boxa\z@\z@ \global\setbox\dfn@ins\box\dfn@ins \@tempswatrue \ifdfn@trysingle \setbox\dfn@boxb\vbox{\unvcopy\@cclv}\@tempdima\@colroom \advance\@tempdima-\ht\dfn@boxb \advance\@tempdima-\dp\dfn@boxb \advance\@tempdima-\skip\footins \advance\@tempdima-\ht\dfn@boxa \ifdim\@tempdima<\z@\else \@tempswafalse \global\setbox\footins\vbox{\boxmaxdepth\dfn@fnmaxdp \footnoterule \unvbox\dfn@boxa}\fi\fi \if@tempswa \dfn@split{\dfn@dima}\dfn@boxa\dfn@boxb\dfn@fnmaxdp\footnotesep \global\setbox\footins\vbox{\hbox{% \hbox to\DFNcolumnwidth{\vbox to\@tempdima{\footnoterule \unvbox\dfn@boxb\vss}\hss}\hskip\DFNcolumnsep \hbox to\DFNcolumnwidth{\ifvoid\dfn@boxa\else \vbox to\@tempdima{ \setbox\@tempboxa\vbox{\footnoterule} \ifdfn@ruleboth \unvbox\@tempboxa \else \@tempdima\ht\@tempboxa \advance\@tempdima\dp\@tempboxa \vskip\@tempdima \prevdepth\dp\@tempboxa \fi \unvbox\dfn@boxa\vss}\fi\hss}}}\fi\fi \global\dfn@fnht\z@ \ifx\dfn@list\@empty\else \let\@elt\dfn@elt@adjust \dfn@dima\z@ \dfn@dimb\z@ \dfn@list \global\advance\dfn@fnht\dfn@dimb \let\@elt\relax \ifdim\dfn@dimb>\z@ \xdef\dfn@list{\@elt{0}{\number\dfn@dimb}\dfn@list}% \insert\footins{\floatingpenalty\@MM \vbox to\dfn@dimb{}}\fi \ifdim\dfn@fnht>\@tempdima \@tempdimb\@tempdima \advance\@tempdimb-\dfn@fnht \global\dfn@fnht\@tempdima \xdef\dfn@list{\dfn@list\@elt{0}{\number\@tempdimb}}% \xdef\dfn@afteroutput{\insert\footins{ \floatingpenalty\@MM \vbox to\number\@tempdimb sp{}}% \global\let\noexpand\dfn@afteroutput\relax}% \fi\fi \fi}% \let\footnoterule\relax \dfn@latex@makecol \let\footnoterule\dfn@footnoterule} \let\dfn@footnoterule\footnoterule \def\dfn@countins{\setbox\footins\vbox{\unvbox\footins \global\setbox\dfn@boxa\lastbox}% \ifvoid\dfn@boxa \let\next\relax \else \advance\@tempcnta\@ne \let\next\dfn@countins \fi \next} \def\dfn@elt@getht#1#2{\advance\@tempdima#1sp\relax \advance\@tempcnta\m@ne \ifnum\@tempcnta>\z@ \let\next\relax \else\let\next\dfn@endgetht \fi \next} \def\dfn@endgetht#1\@nil{\gdef\dfn@list{#1}} \def\dfn@elt@adjust#1#2{\advance\dfn@dima#1sp\advance\dfn@fnht#2sp\relax \ifvoid\dfn@ins \@tempdima\z@ \@tempdimb\z@ \else \setbox\dfn@boxa\copy\dfn@ins \dfn@split\dfn@dima\dfn@boxa\dfn@boxb\z@\z@ \dfn@split{.5\ht\dfn@boxb}\dfn@boxb\dfn@boxa \dfn@fnmaxdp\footnotesep \advance\@tempdimb\@tempdima \@tempdima\@tempdimb \fi \advance\@tempdimb-\dfn@fnht\relax \ifdim\@tempdimb>\dfn@dimb \dfn@dimb\@tempdimb \fi} \let\dfn@afteroutput\relax \output{\the\dfn@output \aftergroup\dfn@afteroutput} %%^L % \end{macrocode} % % % % \subsubsection{Initialization, etc.} % \label{sec:imp-dfn-init} % % \begin{macro}{\dfn@document} % \begin{macro}{\document} % Since the default value of |\DFNcolumnsep| is that of |\columnsep| that % may be set in other styles and/or preamble, we have to modify |\document| % to set |\DFNcolumnsep| to the value of |\columnsep| if it is negative % after the invocation of the original version of |\document|, % |\dfn@document|. We also set |\DFNcolumnwidth| to its default value % calculated from |\DFNcolumnsep| and |\textwidth| if it is negative. % \end{macro}\end{macro} % % \begin{macro}{\dfn@latex@makecol} % \begin{macro}{\@makecol} % Another reason why we modify |\document| is the modification of % |\@makecol|. In order to allow our footnote styles (and others hopefully) % to be loaded in any order, we capture possibly-modified definition of % |\@makecol| in |\document| to save it in |\dfn@latex@makecol| as the % original version, and make |\@makecol| |\let|-equal to our own version % |\dfn@makecol|. % \end{macro}\end{macro} % % \begin{macrocode} %% Initialization, etc. \let\dfn@document\document \def\document{\dfn@document \ifdim\DFNcolumnsep<\z@ \DFNcolumnsep\columnsep \fi \ifdim\DFNcolumnwidth<\z@ \DFNcolumnwidth\textwidth \advance\DFNcolumnwidth-\DFNcolumnsep \divide\DFNcolumnwidth\tw@ \fi \dfn@fnht\z@ \let\dfn@latex@makecol\@makecol \let\@makecol\dfn@makecol} % \end{macrocode} % % \begin{macro}{\dfn@twocolumn} % \begin{macro}{\twocolumn} % \begin{macro}{\dfn@onecolumn} % \begin{macro}{\onecolumn} % We also switch |\@makecol| to original\slash own version in modified % |\twocolumn|\slash |\onecolumn| because double-columned footnotes are % available only in single column documents. In those macros, prior to % the invocation of their original versions, |\dfn@twocolumn| and % |\dfn@onecolumn|, |\@footnotetext| is also set to corresponding macros that % are original |\dfn@latex@footnotetext| or our own |\dfn@footnotetext|. % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macrocode} \let\dfn@twocolumn\twocolumn \def\twocolumn{\clearpage \let\@footnotetext\dfn@latex@footnotetext \let\@makecol\dfn@latex@makecol \dfn@twocolumn} \let\dfn@onecolumn\onecolumn \def\onecolumn{\clearpage \let\@footnotetext\dfn@footnotetext \let\@makecol\dfn@makecol \dfn@onecolumn} % \end{macrocode} % % \iffalse % % \fi % % % % \IndexPrologue{\newpage\section*{Index} % Italicized number refers to the page where the specification and usage of % corresponding entry is described, while underlined is for the % implementation of the entry.} % \Finale % \GlossaryPrologue{\newpage\section*{Revision History}} % \PrintChanges \endinput